diff options
author | <herbert@gondor.apana.org.au> | 2005-05-12 20:11:55 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-05-12 20:11:55 -0400 |
commit | b1fc5505e0dbcc3fd7c75bfe6bee39ec50080963 (patch) | |
tree | f8c0bb679dc8e72816e16820c3dbcccf924097eb /drivers/net/eepro.c | |
parent | 88d7bd8cb9eb8d64bf7997600b0d64f7834047c5 (diff) |
[netdrvr] Fix register_netdev() races in older ISA net drivers
Diffstat (limited to 'drivers/net/eepro.c')
-rw-r--r-- | drivers/net/eepro.c | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/drivers/net/eepro.c b/drivers/net/eepro.c index cd2475683027..dcb3028bb60f 100644 --- a/drivers/net/eepro.c +++ b/drivers/net/eepro.c | |||
@@ -600,12 +600,7 @@ struct net_device * __init eepro_probe(int unit) | |||
600 | err = do_eepro_probe(dev); | 600 | err = do_eepro_probe(dev); |
601 | if (err) | 601 | if (err) |
602 | goto out; | 602 | goto out; |
603 | err = register_netdev(dev); | ||
604 | if (err) | ||
605 | goto out1; | ||
606 | return dev; | 603 | return dev; |
607 | out1: | ||
608 | release_region(dev->base_addr, EEPRO_IO_EXTENT); | ||
609 | out: | 604 | out: |
610 | free_netdev(dev); | 605 | free_netdev(dev); |
611 | return ERR_PTR(err); | 606 | return ERR_PTR(err); |
@@ -758,6 +753,7 @@ static int __init eepro_probe1(struct net_device *dev, int autoprobe) | |||
758 | int i; | 753 | int i; |
759 | struct eepro_local *lp; | 754 | struct eepro_local *lp; |
760 | int ioaddr = dev->base_addr; | 755 | int ioaddr = dev->base_addr; |
756 | int err; | ||
761 | 757 | ||
762 | /* Grab the region so we can find another board if autoIRQ fails. */ | 758 | /* Grab the region so we can find another board if autoIRQ fails. */ |
763 | if (!request_region(ioaddr, EEPRO_IO_EXTENT, DRV_NAME)) { | 759 | if (!request_region(ioaddr, EEPRO_IO_EXTENT, DRV_NAME)) { |
@@ -873,10 +869,16 @@ static int __init eepro_probe1(struct net_device *dev, int autoprobe) | |||
873 | 869 | ||
874 | /* reset 82595 */ | 870 | /* reset 82595 */ |
875 | eepro_reset(ioaddr); | 871 | eepro_reset(ioaddr); |
872 | |||
873 | err = register_netdev(dev); | ||
874 | if (err) | ||
875 | goto err; | ||
876 | return 0; | 876 | return 0; |
877 | exit: | 877 | exit: |
878 | err = -ENODEV; | ||
879 | err: | ||
878 | release_region(dev->base_addr, EEPRO_IO_EXTENT); | 880 | release_region(dev->base_addr, EEPRO_IO_EXTENT); |
879 | return -ENODEV; | 881 | return err; |
880 | } | 882 | } |
881 | 883 | ||
882 | /* Open/initialize the board. This is called (in the current kernel) | 884 | /* Open/initialize the board. This is called (in the current kernel) |
@@ -1834,11 +1836,8 @@ init_module(void) | |||
1834 | dev->irq = irq[i]; | 1836 | dev->irq = irq[i]; |
1835 | 1837 | ||
1836 | if (do_eepro_probe(dev) == 0) { | 1838 | if (do_eepro_probe(dev) == 0) { |
1837 | if (register_netdev(dev) == 0) { | 1839 | dev_eepro[n_eepro++] = dev; |
1838 | dev_eepro[n_eepro++] = dev; | 1840 | continue; |
1839 | continue; | ||
1840 | } | ||
1841 | release_region(dev->base_addr, EEPRO_IO_EXTENT); | ||
1842 | } | 1841 | } |
1843 | free_netdev(dev); | 1842 | free_netdev(dev); |
1844 | break; | 1843 | break; |