The receive function em_process_receive_interrupts() unlock the adapter while ether_input() process the packet, and then lock it back. In the meantime, em_init() may be called (either from em_watchdog() from softclock interrupt or from the ifconfig program). em_init() reset the card, in particular it set adapter->next_rx_desc_to_check to 0 and reset hardware RX Head and Tail descriptor pointers. The loop in em_process_receive_interrupts() does not expect these things to change, and a mess may result. Fix: The following patch tries to make em_process_receive_interrupts() fully reenterant (1.73 was incomplete) and fix the described problem. (I removed a code for FreeBSD 4: I don't want to deal with it and BTW Intel themselves ships different drivers for RELENG_4, RELENG_5 and RELENG_6.)
State Changed From-To: open->patched Committed, thanks!
Responsible Changed From-To: freebsd-bugs->glebius I am handling this.
State Changed From-To: patched->closed Merged to RELENG_5.