上面已经分析到中断处理的接收中断处理函数,下面分析发送中断处理函数。
在前面,我们说到系统调用dmfe_start_xmit来进行数据发送,当数据发送完成后,将产生一个数据发送中断,由interrupt函数检测到该中断后,将调用dmfe_tx_done()进行处理
static void dmfe_tx_done(unsigned long unused) { struct net_device *dev = dmfe_dev; board_info_t *db = (board_info_t *)dev->priv; int nsr; nsr = ior(db, DM9KS_NSR); if(nsr & 0x04) db->tx_pkt_cnt--; if(nsr & 0x08) db->tx_pkt_cnt--; if (db->tx_pkt_cnt < 0) { printk("[dmfe_tx_done] tx_pkt_cnt ERROR!!\n"); db->tx_pkt_cnt =0; } if (db->Speed == 10) {if(db->tx_pkt_cnt < 1 ) netif_wake_queue(dev);} else {if(db->tx_pkt_cnt < 2 ) netif_wake_queue(dev);} return; }
|
该函数主要完成两个动作:一是把tx_pkt_cnt成员的值减少1,表示已经完成一个数据包的发送了;二是判断tx_pkt_cnt的值,根据speed的值,判断是否可以调用netif_wake_queue()函数来通知内核网卡可以接受新的数据发送任务了。
阅读(293) | 评论(0) | 转发(0) |