int mc32_command (struct net_device * dev, u16 cmd, void * data, int len);
Sends exec commands in a user context. This permits us to wait around for the replies and also to wait for the command buffer to complete from a previous command before we execute our command. After our command completes we will complete any pending multicast reload we blocked off by hogging the exec buffer.
You feed the card a command, you wait, it interrupts you get a reply. All well and good. The complication arises because you use commands for filter list changes which come in at bh level from things like IPV6 group stuff.
We have a simple state machine
0 - nothing issued
1 - command issued, wait reply
2 - reply waiting - reader then goes to state 0
3 - command issued, trash reply. In which case the irq takes it back to state 0