diff -u --recursive linux-2.5.40org/drivers/net/at1700.c linux-2.5.40/drivers/net/at1700.c --- linux-2.5.40org/drivers/net/at1700.c Thu Oct 3 12:08:00 2002 +++ linux-2.5.40/drivers/net/at1700.c Wed Oct 9 09:13:06 2002 @@ -832,12 +832,11 @@ for (i = 0, mclist = dev->mc_list; mclist && i < dev->mc_count; i++, mclist = mclist->next) set_bit(ether_crc_le(ETH_ALEN, mclist->dmi_addr) >> 26, - mc_filter); + (unsigned long *)mc_filter); outb(0x02, ioaddr + RX_MODE); /* Use normal mode. */ } - save_flags(flags); - cli(); + spin_lock_irqsave(&lp->lock, flags); /* FIXME: move up before first IO? */ if (memcmp(mc_filter, lp->mc_filter, sizeof(mc_filter))) { int saved_bank = inw(ioaddr + CONFIG_0); /* Switch to bank 1 and set the multicast table. */ @@ -847,7 +846,7 @@ memcpy(lp->mc_filter, mc_filter, sizeof(mc_filter)); outw(saved_bank, ioaddr + CONFIG_0); } - restore_flags(flags); + spin_unlock_irqrestore(&lp->lock, flags); return; }