Как очистить прерывание сетевой карты E1000 - PullRequest
1 голос
/ 18 марта 2019

Я пытаюсь заставить E1000 генерировать прерывание при получении пакета,

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

К сожалению, прерывание происходит только один раз.Мое предположение, что прерывание не было очищено.В соответствии с руководством ,

Прерывание Причина Считывание Регистр ICR (000C0H; R)

Все биты регистра очищаются при чтении.В результате чтение этого регистра неявно подтверждает любые ожидающие события прерывания.

и комментарий некоторый код , чтение 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

, которые показывают, что мой обработчик прерываний карты nework действительно прочитал ICR (ICR = 82 и ICR = 0 был напечатан обработчиком) впервые.Поскольку нет никакого более позднего для "set_ics 80, ICR 0".

Кто-нибудь знает, как очистить / подтвердить прерывание?На самом деле это часть проекта 6 MIT 6.828 .

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...