如何清除E1000网卡中断

时间:2019-03-18 09:59:09

标签: linux interrupt osdev

我正在尝试让E1000在收到数据包时产生中断,

 // enable Receiver Timer Interrupt
 reg_IMS = (uint32_t *) (base + E1000_IMS); 
 *reg_IMS = E1000_IMS_RXT0; 

不幸的是,中断仅发生一次。我的猜测是中断没有清除。根据{{​​3}},

  

中断原因读取寄存器ICR(000C0H; R)

     

读取时清除所有寄存器位。结果,阅读此   寄存器隐式确认任何未决的中断事件。

the manual的注释,读取ICR(中断原因读取寄存器)将清除中断,

/* Clear any pending interrupt events. */
icr = E1000_READ_REG(hw, ICR);

但这没用。这是相关的消息(E1000_DEBUG=TX,TXERR,RX,RXERR,RXFILTER,interrupt

e1000: tx disabled
e1000: set_ics 2, ICR 0, IMR 0
e1000: set_ics 0, ICR 2, IMR 80
e1000: set_ics 80, ICR 2, IMR 80
e1000: RCTL: 127, mac_reg[RCTL] = 0x84008002
e1000: set_ics 80, ICR 82, IMR 80
e1000: ICR read: 82
ICR=82
e1000: ICR read: 0
ICR=0
e1000: set_ics 0, ICR 0, IMR 80
...
e1000: set_ics 80, ICR 0, IMR 80
e1000: set_ics 3, ICR 80, IMR 80
ns: 52:54:00:12:34:56 bound to static IP 10.0.2.15
NS: TCP/IP initialized.
opened socket
trying to bind
bound

第一次显示我的网络卡中断处理程序确实读取了ICR(该处理程序打印了ICR = 82并且ICR = 0的信息)。因为以后的“ set_ics 80,ICR 0”没有中断。

有人知道如何清除/确认中断吗?实际上,这是some code的一部分。

谢谢!

0 个答案:

没有答案