上面已经分析到中断处理的接收中断处理函数,下面分析发送中断处理函数。
在前面,我们说到系统调用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()函数来通知内核网卡可以接受新的数据发送任务了。
阅读(500) | 评论(0) | 转发(0) |