irqreturn_t el_interrupt (int irq, void * dev_id, struct pt_regs * regs);
Handle the ether interface interrupts. The 3c501 needs a lot more hand holding than most cards. In particular we get a transmit interrupt with a collision error because the board firmware isnt capable of rewinding its own transmit buffer pointers. It can however count to 16 for us.
On the receive side the card is also very dumb. It has no buffering to speak of. We simply pull the packet out of its PIO buffer (which is slow) and queue it for the kernel. Then we reset the card for the next packet.
We sometimes get suprise interrupts late both because the SMP IRQ delivery is message passing and because the card sometimes seems to deliver late. I think if it is part way through a receive and the mode is changed it carries on receiving and sends us an interrupt. We have to band aid all these cases to get a sensible 150kbytes/second performance. Even then you want a small TCP window.