diff options
Diffstat (limited to 'drivers/net/eexpress.c')
| -rw-r--r-- | drivers/net/eexpress.c | 11 | 
1 files changed, 6 insertions, 5 deletions
diff --git a/drivers/net/eexpress.c b/drivers/net/eexpress.c index 2eb82aba4a8..795c594a4b7 100644 --- a/drivers/net/eexpress.c +++ b/drivers/net/eexpress.c @@ -202,7 +202,7 @@ static unsigned short start_code[] = {  	0x0000,Cmd_MCast,  	0x0076,                 /* link to next command */  #define CONF_NR_MULTICAST 0x44 -	0x0000,                 /* number of multicast addresses */ +	0x0000,                 /* number of bytes in multicast address(es) */  #define CONF_MULTICAST 0x46  	0x0000, 0x0000, 0x0000, /* some addresses */  	0x0000, 0x0000, 0x0000, @@ -1569,7 +1569,7 @@ static void eexp_hw_init586(struct net_device *dev)  static void eexp_setup_filter(struct net_device *dev)  { -	struct dev_mc_list *dmi = dev->mc_list; +	struct dev_mc_list *dmi;  	unsigned short ioaddr = dev->base_addr;  	int count = dev->mc_count;  	int i; @@ -1580,9 +1580,9 @@ static void eexp_setup_filter(struct net_device *dev)  	}  	outw(CONF_NR_MULTICAST & ~31, ioaddr+SM_PTR); -	outw(count, ioaddr+SHADOW(CONF_NR_MULTICAST)); -	for (i = 0; i < count; i++) { -		unsigned short *data = (unsigned short *)dmi->dmi_addr; +	outw(6*count, ioaddr+SHADOW(CONF_NR_MULTICAST)); +	for (i = 0, dmi = dev->mc_list; i < count; i++, dmi = dmi->next) { +		unsigned short *data;  		if (!dmi) {  			printk(KERN_INFO "%s: too few multicast addresses\n", dev->name);  			break; @@ -1591,6 +1591,7 @@ static void eexp_setup_filter(struct net_device *dev)  			printk(KERN_INFO "%s: invalid multicast address length given.\n", dev->name);  			continue;  		} +		data = (unsigned short *)dmi->dmi_addr;  		outw((CONF_MULTICAST+(6*i)) & ~31, ioaddr+SM_PTR);  		outw(data[0], ioaddr+SHADOW(CONF_MULTICAST+(6*i)));  		outw((CONF_MULTICAST+(6*i)+2) & ~31, ioaddr+SM_PTR);  |