diff options
author | Wang Chen <wangchen@cn.fujitsu.com> | 2008-07-22 01:13:12 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-08-07 02:23:19 -0400 |
commit | c16d118537cadb21d186e35aebad90a13cd78846 (patch) | |
tree | 8fc1ab697f2476ecd2b39522efcf6234be3dc5c0 /drivers/net | |
parent | fe414248551e2880fe8913577699003ff145ab9d (diff) |
[netdrvr] Drivers should not set IFF_* flag themselves
Some hardware set promisc when they are requested to set IFF_ALLMULTI flag.
It's ok, but if drivers set IFF_PROMISC flag when they set promisc,
it will broken upper layer handle for promisc and allmulti.
In addition, drivers can use their own hardware programming to make it.
So do not allow drivers to set IFF_* flags.
This is a general driver fix, so I didn't split it to pieces and send
to specific driver maintainers.
Signed-off-by: Wang Chen <wangchen@cn.fujitsu.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/3c523.c | 4 | ||||
-rw-r--r-- | drivers/net/3c527.c | 9 | ||||
-rw-r--r-- | drivers/net/atp.c | 9 | ||||
-rw-r--r-- | drivers/net/de620.c | 7 | ||||
-rw-r--r-- | drivers/net/eepro.c | 8 | ||||
-rw-r--r-- | drivers/net/eth16i.c | 1 | ||||
-rw-r--r-- | drivers/net/lp486e.c | 2 | ||||
-rw-r--r-- | drivers/net/ni5010.c | 1 | ||||
-rw-r--r-- | drivers/net/ni52.c | 2 | ||||
-rw-r--r-- | drivers/net/sun3_82586.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/orinoco.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/wavelan.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/wavelan_cs.c | 6 |
13 files changed, 9 insertions, 57 deletions
diff --git a/drivers/net/3c523.c b/drivers/net/3c523.c index dc6e474229b1..e2ce41d3828e 100644 --- a/drivers/net/3c523.c +++ b/drivers/net/3c523.c | |||
@@ -640,10 +640,8 @@ static int init586(struct net_device *dev) | |||
640 | cfg_cmd->time_low = 0x00; | 640 | cfg_cmd->time_low = 0x00; |
641 | cfg_cmd->time_high = 0xf2; | 641 | cfg_cmd->time_high = 0xf2; |
642 | cfg_cmd->promisc = 0; | 642 | cfg_cmd->promisc = 0; |
643 | if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC)) { | 643 | if (dev->flags & (IFF_ALLMULTI | IFF_PROMISC)) |
644 | cfg_cmd->promisc = 1; | 644 | cfg_cmd->promisc = 1; |
645 | dev->flags |= IFF_PROMISC; | ||
646 | } | ||
647 | cfg_cmd->carr_coll = 0x00; | 645 | cfg_cmd->carr_coll = 0x00; |
648 | 646 | ||
649 | p->scb->cbl_offset = make16(cfg_cmd); | 647 | p->scb->cbl_offset = make16(cfg_cmd); |
diff --git a/drivers/net/3c527.c b/drivers/net/3c527.c index 6aca0c640f13..abc84f765973 100644 --- a/drivers/net/3c527.c +++ b/drivers/net/3c527.c | |||
@@ -1521,14 +1521,11 @@ static void do_mc32_set_multicast_list(struct net_device *dev, int retry) | |||
1521 | struct mc32_local *lp = netdev_priv(dev); | 1521 | struct mc32_local *lp = netdev_priv(dev); |
1522 | u16 filt = (1<<2); /* Save Bad Packets, for stats purposes */ | 1522 | u16 filt = (1<<2); /* Save Bad Packets, for stats purposes */ |
1523 | 1523 | ||
1524 | if (dev->flags&IFF_PROMISC) | 1524 | if ((dev->flags&IFF_PROMISC) || |
1525 | (dev->flags&IFF_ALLMULTI) || | ||
1526 | dev->mc_count > 10) | ||
1525 | /* Enable promiscuous mode */ | 1527 | /* Enable promiscuous mode */ |
1526 | filt |= 1; | 1528 | filt |= 1; |
1527 | else if((dev->flags&IFF_ALLMULTI) || dev->mc_count > 10) | ||
1528 | { | ||
1529 | dev->flags|=IFF_PROMISC; | ||
1530 | filt |= 1; | ||
1531 | } | ||
1532 | else if(dev->mc_count) | 1529 | else if(dev->mc_count) |
1533 | { | 1530 | { |
1534 | unsigned char block[62]; | 1531 | unsigned char block[62]; |
diff --git a/drivers/net/atp.c b/drivers/net/atp.c index 3d4433358a36..c10cd8058e23 100644 --- a/drivers/net/atp.c +++ b/drivers/net/atp.c | |||
@@ -854,14 +854,9 @@ static void set_rx_mode_8002(struct net_device *dev) | |||
854 | struct net_local *lp = netdev_priv(dev); | 854 | struct net_local *lp = netdev_priv(dev); |
855 | long ioaddr = dev->base_addr; | 855 | long ioaddr = dev->base_addr; |
856 | 856 | ||
857 | if ( dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) { | 857 | if (dev->mc_count > 0 || (dev->flags & (IFF_ALLMULTI|IFF_PROMISC))) |
858 | /* We must make the kernel realise we had to move | ||
859 | * into promisc mode or we start all out war on | ||
860 | * the cable. - AC | ||
861 | */ | ||
862 | dev->flags|=IFF_PROMISC; | ||
863 | lp->addr_mode = CMR2h_PROMISC; | 858 | lp->addr_mode = CMR2h_PROMISC; |
864 | } else | 859 | else |
865 | lp->addr_mode = CMR2h_Normal; | 860 | lp->addr_mode = CMR2h_Normal; |
866 | write_reg_high(ioaddr, CMR2, lp->addr_mode); | 861 | write_reg_high(ioaddr, CMR2, lp->addr_mode); |
867 | } | 862 | } |
diff --git a/drivers/net/de620.c b/drivers/net/de620.c index 3f5190c654cf..d454e143483e 100644 --- a/drivers/net/de620.c +++ b/drivers/net/de620.c | |||
@@ -488,13 +488,6 @@ static void de620_set_multicast_list(struct net_device *dev) | |||
488 | { | 488 | { |
489 | if (dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC)) | 489 | if (dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC)) |
490 | { /* Enable promiscuous mode */ | 490 | { /* Enable promiscuous mode */ |
491 | /* | ||
492 | * We must make the kernel realise we had to move | ||
493 | * into promisc mode or we start all out war on | ||
494 | * the cable. - AC | ||
495 | */ | ||
496 | dev->flags|=IFF_PROMISC; | ||
497 | |||
498 | de620_set_register(dev, W_TCR, (TCR_DEF & ~RXPBM) | RXALL); | 491 | de620_set_register(dev, W_TCR, (TCR_DEF & ~RXPBM) | RXALL); |
499 | } | 492 | } |
500 | else | 493 | else |
diff --git a/drivers/net/eepro.c b/drivers/net/eepro.c index 56f50491a453..1f11350e16cf 100644 --- a/drivers/net/eepro.c +++ b/drivers/net/eepro.c | |||
@@ -1283,14 +1283,6 @@ set_multicast_list(struct net_device *dev) | |||
1283 | 1283 | ||
1284 | if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || dev->mc_count > 63) | 1284 | if (dev->flags&(IFF_ALLMULTI|IFF_PROMISC) || dev->mc_count > 63) |
1285 | { | 1285 | { |
1286 | /* | ||
1287 | * We must make the kernel realise we had to move | ||
1288 | * into promisc mode or we start all out war on | ||
1289 | * the cable. If it was a promisc request the | ||
1290 | * flag is already set. If not we assert it. | ||
1291 | */ | ||
1292 | dev->flags|=IFF_PROMISC; | ||
1293 | |||
1294 | eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */ | 1286 | eepro_sw2bank2(ioaddr); /* be CAREFUL, BANK 2 now */ |
1295 | mode = inb(ioaddr + REG2); | 1287 | mode = inb(ioaddr + REG2); |
1296 | outb(mode | PRMSC_Mode, ioaddr + REG2); | 1288 | outb(mode | PRMSC_Mode, ioaddr + REG2); |
diff --git a/drivers/net/eth16i.c b/drivers/net/eth16i.c index e3dd8b136908..bee8b3fbc565 100644 --- a/drivers/net/eth16i.c +++ b/drivers/net/eth16i.c | |||
@@ -1356,7 +1356,6 @@ static void eth16i_multicast(struct net_device *dev) | |||
1356 | 1356 | ||
1357 | if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC)) | 1357 | if(dev->mc_count || dev->flags&(IFF_ALLMULTI|IFF_PROMISC)) |
1358 | { | 1358 | { |
1359 | dev->flags|=IFF_PROMISC; /* Must do this */ | ||
1360 | outb(3, ioaddr + RECEIVE_MODE_REG); | 1359 | outb(3, ioaddr + RECEIVE_MODE_REG); |
1361 | } else { | 1360 | } else { |
1362 | outb(2, ioaddr + RECEIVE_MODE_REG); | 1361 | outb(2, ioaddr + RECEIVE_MODE_REG); |
diff --git a/drivers/net/lp486e.c b/drivers/net/lp486e.c index 591a7e4220c7..83fa9d82a004 100644 --- a/drivers/net/lp486e.c +++ b/drivers/net/lp486e.c | |||
@@ -1272,8 +1272,6 @@ static void set_multicast_list(struct net_device *dev) { | |||
1272 | return; | 1272 | return; |
1273 | } | 1273 | } |
1274 | if (dev->mc_count == 0 && !(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) { | 1274 | if (dev->mc_count == 0 && !(dev->flags & (IFF_PROMISC | IFF_ALLMULTI))) { |
1275 | if (dev->flags & IFF_ALLMULTI) | ||
1276 | dev->flags |= IFF_PROMISC; | ||
1277 | lp->i596_config[8] &= ~0x01; | 1275 | lp->i596_config[8] &= ~0x01; |
1278 | } else { | 1276 | } else { |
1279 | lp->i596_config[8] |= 0x01; | 1277 | lp->i596_config[8] |= 0x01; |
diff --git a/drivers/net/ni5010.c b/drivers/net/ni5010.c index a20005c09e07..8e0ca9f4e404 100644 --- a/drivers/net/ni5010.c +++ b/drivers/net/ni5010.c | |||
@@ -648,7 +648,6 @@ static void ni5010_set_multicast_list(struct net_device *dev) | |||
648 | PRINTK2((KERN_DEBUG "%s: entering set_multicast_list\n", dev->name)); | 648 | PRINTK2((KERN_DEBUG "%s: entering set_multicast_list\n", dev->name)); |
649 | 649 | ||
650 | if (dev->flags&IFF_PROMISC || dev->flags&IFF_ALLMULTI || dev->mc_list) { | 650 | if (dev->flags&IFF_PROMISC || dev->flags&IFF_ALLMULTI || dev->mc_list) { |
651 | dev->flags |= IFF_PROMISC; | ||
652 | outb(RMD_PROMISC, EDLC_RMODE); /* Enable promiscuous mode */ | 651 | outb(RMD_PROMISC, EDLC_RMODE); /* Enable promiscuous mode */ |
653 | PRINTK((KERN_DEBUG "%s: Entering promiscuous mode\n", dev->name)); | 652 | PRINTK((KERN_DEBUG "%s: Entering promiscuous mode\n", dev->name)); |
654 | } else { | 653 | } else { |
diff --git a/drivers/net/ni52.c b/drivers/net/ni52.c index a316dcc8a06d..b9a882d362da 100644 --- a/drivers/net/ni52.c +++ b/drivers/net/ni52.c | |||
@@ -621,7 +621,7 @@ static int init586(struct net_device *dev) | |||
621 | if (num_addrs > len) { | 621 | if (num_addrs > len) { |
622 | printk(KERN_ERR "%s: switching to promisc. mode\n", | 622 | printk(KERN_ERR "%s: switching to promisc. mode\n", |
623 | dev->name); | 623 | dev->name); |
624 | dev->flags |= IFF_PROMISC; | 624 | writeb(0x01, &cfg_cmd->promisc); |
625 | } | 625 | } |
626 | } | 626 | } |
627 | if (dev->flags & IFF_PROMISC) | 627 | if (dev->flags & IFF_PROMISC) |
diff --git a/drivers/net/sun3_82586.c b/drivers/net/sun3_82586.c index 9b2a7f7bb258..e531302d95f5 100644 --- a/drivers/net/sun3_82586.c +++ b/drivers/net/sun3_82586.c | |||
@@ -425,14 +425,11 @@ static int init586(struct net_device *dev) | |||
425 | int len = ((char *) p->iscp - (char *) ptr - 8) / 6; | 425 | int len = ((char *) p->iscp - (char *) ptr - 8) / 6; |
426 | if(num_addrs > len) { | 426 | if(num_addrs > len) { |
427 | printk("%s: switching to promisc. mode\n",dev->name); | 427 | printk("%s: switching to promisc. mode\n",dev->name); |
428 | dev->flags|=IFF_PROMISC; | 428 | cfg_cmd->promisc = 1; |
429 | } | 429 | } |
430 | } | 430 | } |
431 | if(dev->flags&IFF_PROMISC) | 431 | if(dev->flags&IFF_PROMISC) |
432 | { | 432 | cfg_cmd->promisc = 1; |
433 | cfg_cmd->promisc=1; | ||
434 | dev->flags|=IFF_PROMISC; | ||
435 | } | ||
436 | cfg_cmd->carr_coll = 0x00; | 433 | cfg_cmd->carr_coll = 0x00; |
437 | 434 | ||
438 | p->scb->cbl_offset = make16(cfg_cmd); | 435 | p->scb->cbl_offset = make16(cfg_cmd); |
diff --git a/drivers/net/wireless/orinoco.c b/drivers/net/wireless/orinoco.c index b047306bf386..1ebcafe7ca5f 100644 --- a/drivers/net/wireless/orinoco.c +++ b/drivers/net/wireless/orinoco.c | |||
@@ -1998,13 +1998,6 @@ __orinoco_set_multicast_list(struct net_device *dev) | |||
1998 | else | 1998 | else |
1999 | priv->mc_count = mc_count; | 1999 | priv->mc_count = mc_count; |
2000 | } | 2000 | } |
2001 | |||
2002 | /* Since we can set the promiscuous flag when it wasn't asked | ||
2003 | for, make sure the net_device knows about it. */ | ||
2004 | if (priv->promiscuous) | ||
2005 | dev->flags |= IFF_PROMISC; | ||
2006 | else | ||
2007 | dev->flags &= ~IFF_PROMISC; | ||
2008 | } | 2001 | } |
2009 | 2002 | ||
2010 | /* This must be called from user context, without locks held - use | 2003 | /* This must be called from user context, without locks held - use |
diff --git a/drivers/net/wireless/wavelan.c b/drivers/net/wireless/wavelan.c index 49ae97003952..136220b5ca81 100644 --- a/drivers/net/wireless/wavelan.c +++ b/drivers/net/wireless/wavelan.c | |||
@@ -1409,9 +1409,6 @@ static void wavelan_set_multicast_list(struct net_device * dev) | |||
1409 | lp->mc_count = 0; | 1409 | lp->mc_count = 0; |
1410 | 1410 | ||
1411 | wv_82586_reconfig(dev); | 1411 | wv_82586_reconfig(dev); |
1412 | |||
1413 | /* Tell the kernel that we are doing a really bad job. */ | ||
1414 | dev->flags |= IFF_PROMISC; | ||
1415 | } | 1412 | } |
1416 | } else | 1413 | } else |
1417 | /* Are there multicast addresses to send? */ | 1414 | /* Are there multicast addresses to send? */ |
diff --git a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c index b584c0ecc62d..00a3559e5aa4 100644 --- a/drivers/net/wireless/wavelan_cs.c +++ b/drivers/net/wireless/wavelan_cs.c | |||
@@ -1412,9 +1412,6 @@ wavelan_set_multicast_list(struct net_device * dev) | |||
1412 | lp->mc_count = 0; | 1412 | lp->mc_count = 0; |
1413 | 1413 | ||
1414 | wv_82593_reconfig(dev); | 1414 | wv_82593_reconfig(dev); |
1415 | |||
1416 | /* Tell the kernel that we are doing a really bad job... */ | ||
1417 | dev->flags |= IFF_PROMISC; | ||
1418 | } | 1415 | } |
1419 | } | 1416 | } |
1420 | else | 1417 | else |
@@ -1433,9 +1430,6 @@ wavelan_set_multicast_list(struct net_device * dev) | |||
1433 | lp->mc_count = 0; | 1430 | lp->mc_count = 0; |
1434 | 1431 | ||
1435 | wv_82593_reconfig(dev); | 1432 | wv_82593_reconfig(dev); |
1436 | |||
1437 | /* Tell the kernel that we are doing a really bad job... */ | ||
1438 | dev->flags |= IFF_ALLMULTI; | ||
1439 | } | 1433 | } |
1440 | } | 1434 | } |
1441 | else | 1435 | else |