환경 : Vmware, CentOS 5.5
소스위치 : /usr/src/linux/drivers/net/pcnet32.c
(vmware는 pcnet32)
<!--[endif]--> static int pcnet32_tx(struct net_device*dev) |
{
structpcnet32_private *lp= netdev_priv(dev);
unsignedint dirty_tx= lp->dirty_tx;
int delta;
int must_restart = 0;
/*여기 0으로 초기화한 전역변수 flag를 이용한 조건문. if(flag==0){ printk(KERN_DEBUG"YoungNam >_< \n"); flag=1; } 을 추가한다. */ |
while(dirty_tx != lp->cur_tx) {
intentry = dirty_tx& lp->tx_mod_mask;
intstatus = (short)le16_to_cpu(lp->tx_ring[entry].status);
if(status < 0)
break; /* It still hasn't been Txed */
lp->tx_ring[entry].base = 0;
if(status & 0x4000) {
/* There was a major error, log it. */
int err_status = le32_to_cpu(lp->tx_ring[entry].misc);
dev->stats.tx_errors++;
netif_err(lp, tx_err, dev,
"Tx error status=%04x err_status=%08x\n",
status, err_status);
if (err_status& 0x04000000)
dev->stats.tx_aborted_errors++;
if (err_status& 0x08000000)
dev->stats.tx_carrier_errors++;
if (err_status & 0x10000000)
dev->stats.tx_window_errors++;
#ifndef DO_DXSUFLO
if (err_status& 0x40000000) {
dev->stats.tx_fifo_errors++;
/* Ackk! On FIFO errors the Tx unit is turned off! */
/* Remove this verbosity later! */
netif_err(lp, tx_err, dev, "Tx FIFO error!\n");
must_restart = 1;
}
#else
if (err_status& 0x40000000) {
dev->stats.tx_fifo_errors++;
if (!lp->dxsuflo) { /* If controller doesn't recover ... */
/* Ackk! On FIFO errors the Tx unit is turned off! */
/* Remove this verbosity later! */
netif_err(lp, tx_err, dev, "Tx FIFO error!\n");
must_restart = 1;
}
}
#endif
} else{
if (status & 0x1800)
dev->stats.collisions++;
dev->stats.tx_packets++;
}
/* We must free the original skb */
if(lp->tx_skbuff[entry]) {
pci_unmap_single(lp->pci_dev,
lp->tx_dma_addr[entry],
lp->tx_skbuff[entry]->
len, PCI_DMA_TODEVICE);
dev_kfree_skb_any(lp->tx_skbuff[entry]);
lp->tx_skbuff[entry] = NULL;
lp->tx_dma_addr[entry] = 0;
}
dirty_tx++;
}
delta= (lp->cur_tx- dirty_tx) & (lp->tx_mod_mask + lp->tx_ring_size);
if (delta > lp->tx_ring_size) {
netif_err(lp, drv, dev, "out-of-sync dirty pointer, %d vs. %d, full=%d\n",
dirty_tx, lp->cur_tx, lp->tx_full);
dirty_tx+= lp->tx_ring_size;
delta-= lp->tx_ring_size;
}
if (lp->tx_full&&
netif_queue_stopped(dev) &&
delta < lp->tx_ring_size - 2) {
/* The ring is no longer full, clear tbusy. */
lp->tx_full = 0;
netif_wake_queue(dev); }
lp->dirty_tx = dirty_tx;
returnmust_restart;
}
결과 : 핑날리면 메시지랑 같이 뜸ㅋㅋㅋ
재밌땅
※printk
상수선언문 | 의미 |
#define KERN_EMERGE | “<0>” 시스템이 동작하지 않는다. |
#define KERN_ALERT | “<1>” 항상 출력된다. |
#define KERN_CRIT | “<2>” 치명적인 정보 |
#define KERN_ERR | “<3>” 오류 정보 |
#define KERN_WARNING | “<4>” 경고 정보 |
#define KERN_NOTICE | “<5>” 정상적인 정보 |
#define KERN_INFO | “<6>” 시스템 정보 |
#define KERN_DEBUG | “<7>” 디버깅 정보 |
Ex) KERN_INFO의 동일한 표현
Printk(KERN_INFO”system ok\n”);
Printk(“<6>””system ok\n”);
Printk(“<6>system ok\n”);
'콤퓨타 > Linux' 카테고리의 다른 글
CentOS에서 vi를 vim으로 (0) | 2013.02.20 |
---|---|
locate 명령어에 문제가 발생했을 경우 (0) | 2013.02.20 |
ubuntu 10.10 사용자 등록할 때 (0) | 2013.02.20 |
gdb 인자넣고시작 (0) | 2013.02.20 |
stack overflow??????? (0) | 2013.02.20 |
댓글