/* 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.  */
static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len)
/* 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.  */
static int mc32_command(struct net_device *dev, u16 cmd, void *data, int len)
{
	struct mc32_local *lp = netdev_priv(dev);
	int ioaddr = dev->base_addr;
	int ret = 0;
	down(&lp->cmd_mutex);
	lp->cmd_nonblocking=0;
	lp->exec_box->mbox=0;
	lp->exec_box->mbox=cmd;
	memcpy((void *)lp->exec_box->data, data, len);
	barrier();
	mc32_ready_poll(dev);
	outb(1<<6, ioaddr+HOST_CMD);
	wait_for_completion(&lp->execution_cmd);
	if(lp->exec_box->mbox&(1<<13))
		ret = -1;
	up(&lp->cmd_mutex);
	if(lp->mc_reload_wait)
	{
		mc32_reset_multicast_list(dev);
	}
	return ret;
}