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/wd.c | |
parent | 88d7bd8cb9eb8d64bf7997600b0d64f7834047c5 (diff) |
[netdrvr] Fix register_netdev() races in older ISA net drivers
Diffstat (limited to 'drivers/net/wd.c')
-rw-r--r-- | drivers/net/wd.c | 18 |
1 files changed, 7 insertions, 11 deletions
diff --git a/drivers/net/wd.c b/drivers/net/wd.c index 1f05d9bd05e4..b03feae459fc 100644 --- a/drivers/net/wd.c +++ b/drivers/net/wd.c | |||
@@ -149,12 +149,7 @@ struct net_device * __init wd_probe(int unit) | |||
149 | err = do_wd_probe(dev); | 149 | err = do_wd_probe(dev); |
150 | if (err) | 150 | if (err) |
151 | goto out; | 151 | goto out; |
152 | err = register_netdev(dev); | ||
153 | if (err) | ||
154 | goto out1; | ||
155 | return dev; | 152 | return dev; |
156 | out1: | ||
157 | cleanup_card(dev); | ||
158 | out: | 153 | out: |
159 | free_netdev(dev); | 154 | free_netdev(dev); |
160 | return ERR_PTR(err); | 155 | return ERR_PTR(err); |
@@ -164,6 +159,7 @@ out: | |||
164 | static int __init wd_probe1(struct net_device *dev, int ioaddr) | 159 | static int __init wd_probe1(struct net_device *dev, int ioaddr) |
165 | { | 160 | { |
166 | int i; | 161 | int i; |
162 | int err; | ||
167 | int checksum = 0; | 163 | int checksum = 0; |
168 | int ancient = 0; /* An old card without config registers. */ | 164 | int ancient = 0; /* An old card without config registers. */ |
169 | int word16 = 0; /* 0 = 8 bit, 1 = 16 bit */ | 165 | int word16 = 0; /* 0 = 8 bit, 1 = 16 bit */ |
@@ -356,7 +352,10 @@ static int __init wd_probe1(struct net_device *dev, int ioaddr) | |||
356 | outb(inb(ioaddr+4)|0x80, ioaddr+4); | 352 | outb(inb(ioaddr+4)|0x80, ioaddr+4); |
357 | #endif | 353 | #endif |
358 | 354 | ||
359 | return 0; | 355 | err = register_netdev(dev); |
356 | if (err) | ||
357 | free_irq(dev->irq, dev); | ||
358 | return err; | ||
360 | } | 359 | } |
361 | 360 | ||
362 | static int | 361 | static int |
@@ -527,11 +526,8 @@ init_module(void) | |||
527 | dev->mem_start = mem[this_dev]; | 526 | dev->mem_start = mem[this_dev]; |
528 | dev->mem_end = mem_end[this_dev]; | 527 | dev->mem_end = mem_end[this_dev]; |
529 | if (do_wd_probe(dev) == 0) { | 528 | if (do_wd_probe(dev) == 0) { |
530 | if (register_netdev(dev) == 0) { | 529 | dev_wd[found++] = dev; |
531 | dev_wd[found++] = dev; | 530 | continue; |
532 | continue; | ||
533 | } | ||
534 | cleanup_card(dev); | ||
535 | } | 531 | } |
536 | free_netdev(dev); | 532 | free_netdev(dev); |
537 | printk(KERN_WARNING "wd.c: No wd80x3 card found (i/o = 0x%x).\n", io[this_dev]); | 533 | printk(KERN_WARNING "wd.c: No wd80x3 card found (i/o = 0x%x).\n", io[this_dev]); |