1、网卡中断收发包上半部注册
1.1、网卡驱动调用request_irq(dev->irq, i596_interrupt, 0, "i82596", dev)函数申请中断号并传入中断上半部处理函数;
1.2、request_irq将网卡驱动注册的中断号和中断上半部处理函数添加到ino_buket中断链表;
2、中断上半部的执行
2.1、cpu在收到硬件发出的中断时,通过在ino_buket中断链表查找对应中断号的中断上半部处理函数并执行;
2.2、中断上半部处理函数读取网卡寄存器状态:
a、若为发包中断:
1、读取发包状态,发包成功调dev_kfree_skb_irq置位发包中断下半部标志,发包失败进行统计计数后调dev_kfree_skb_irq置位发包中断下半部标志;
2、清除硬件中断标记;
b、若为收包中断:
1、读取收包状态:若网卡硬件收包成功,申请skb_buffer,将网卡硬件中的包拷贝到skb并在skb中记录网卡设备和以太协议类型后调netif_rx;
2、netif_rx函数
a、若为轮询收包调轮询收包接口进行收包后释放skb;
b、若为中断收包,中断收包队列有空闲空间将skb入队到中断收包队列后退出;若中断收包队列无空