Commit b1fc5505e0dbcc3fd7c75bfe6bee39ec50080963

Authored by
Committed by Jeff Garzik
1 parent 88d7bd8cb9

[netdrvr] Fix register_netdev() races in older ISA net drivers

Showing 21 changed files with 156 additions and 228 deletions Side-by-side Diff

... ... @@ -171,12 +171,7 @@
171 171 err = do_el2_probe(dev);
172 172 if (err)
173 173 goto out;
174   - err = register_netdev(dev);
175   - if (err)
176   - goto out1;
177 174 return dev;
178   -out1:
179   - cleanup_card(dev);
180 175 out:
181 176 free_netdev(dev);
182 177 return ERR_PTR(err);
... ... @@ -356,6 +351,10 @@
356 351 dev->poll_controller = ei_poll;
357 352 #endif
358 353  
  354 + retval = register_netdev(dev);
  355 + if (retval)
  356 + goto out1;
  357 +
359 358 if (dev->mem_start)
360 359 printk("%s: %s - %dkB RAM, 8kB shared mem window at %#6lx-%#6lx.\n",
361 360 dev->name, ei_status.name, (wordlength+1)<<3,
... ... @@ -715,11 +714,8 @@
715 714 dev->base_addr = io[this_dev];
716 715 dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */
717 716 if (do_el2_probe(dev) == 0) {
718   - if (register_netdev(dev) == 0) {
719   - dev_el2[found++] = dev;
720   - continue;
721   - }
722   - cleanup_card(dev);
  717 + dev_el2[found++] = dev;
  718 + continue;
723 719 }
724 720 free_netdev(dev);
725 721 printk(KERN_WARNING "3c503.c: No 3c503 card found (i/o = 0x%x).\n", io[this_dev]);
... ... @@ -365,7 +365,7 @@
365 365 #endif /* __ISAPNP__ */
366 366  
367 367 static struct net_device *corkscrew_scan(int unit);
368   -static void corkscrew_setup(struct net_device *dev, int ioaddr,
  368 +static int corkscrew_setup(struct net_device *dev, int ioaddr,
369 369 struct pnp_dev *idev, int card_number);
370 370 static int corkscrew_open(struct net_device *dev);
371 371 static void corkscrew_timer(unsigned long arg);
372 372  
... ... @@ -539,10 +539,9 @@
539 539 printk(KERN_INFO "3c515 Resource configuration register %#4.4x, DCR %4.4x.\n",
540 540 inl(ioaddr + 0x2002), inw(ioaddr + 0x2000));
541 541 /* irq = inw(ioaddr + 0x2002) & 15; */ /* Use the irq from isapnp */
542   - corkscrew_setup(dev, ioaddr, idev, cards_found++);
543 542 SET_NETDEV_DEV(dev, &idev->dev);
544 543 pnp_cards++;
545   - err = register_netdev(dev);
  544 + err = corkscrew_setup(dev, ioaddr, idev, cards_found++);
546 545 if (!err)
547 546 return dev;
548 547 cleanup_card(dev);
... ... @@ -558,8 +557,7 @@
558 557  
559 558 printk(KERN_INFO "3c515 Resource configuration register %#4.4x, DCR %4.4x.\n",
560 559 inl(ioaddr + 0x2002), inw(ioaddr + 0x2000));
561   - corkscrew_setup(dev, ioaddr, NULL, cards_found++);
562   - err = register_netdev(dev);
  560 + err = corkscrew_setup(dev, ioaddr, NULL, cards_found++);
563 561 if (!err)
564 562 return dev;
565 563 cleanup_card(dev);
... ... @@ -568,7 +566,7 @@
568 566 return NULL;
569 567 }
570 568  
571   -static void corkscrew_setup(struct net_device *dev, int ioaddr,
  569 +static int corkscrew_setup(struct net_device *dev, int ioaddr,
572 570 struct pnp_dev *idev, int card_number)
573 571 {
574 572 struct corkscrew_private *vp = netdev_priv(dev);
... ... @@ -691,6 +689,8 @@
691 689 dev->get_stats = &corkscrew_get_stats;
692 690 dev->set_multicast_list = &set_rx_mode;
693 691 dev->ethtool_ops = &netdev_ethtool_ops;
  692 +
  693 + return register_netdev(dev);
694 694 }
695 695  
696 696  
... ... @@ -572,6 +572,10 @@
572 572 dev->flags&=~IFF_MULTICAST; /* Multicast doesn't work */
573 573 #endif
574 574  
  575 + retval = register_netdev(dev);
  576 + if (retval)
  577 + goto err_out;
  578 +
575 579 return 0;
576 580 err_out:
577 581 mca_set_adapter_procfn(slot, NULL, NULL);
578 582  
... ... @@ -600,12 +604,7 @@
600 604 err = do_elmc_probe(dev);
601 605 if (err)
602 606 goto out;
603   - err = register_netdev(dev);
604   - if (err)
605   - goto out1;
606 607 return dev;
607   -out1:
608   - cleanup_card(dev);
609 608 out:
610 609 free_netdev(dev);
611 610 return ERR_PTR(err);
... ... @@ -1288,12 +1287,9 @@
1288 1287 dev->irq=irq[this_dev];
1289 1288 dev->base_addr=io[this_dev];
1290 1289 if (do_elmc_probe(dev) == 0) {
1291   - if (register_netdev(dev) == 0) {
1292   - dev_elmc[this_dev] = dev;
1293   - found++;
1294   - continue;
1295   - }
1296   - cleanup_card(dev);
  1290 + dev_elmc[this_dev] = dev;
  1291 + found++;
  1292 + continue;
1297 1293 }
1298 1294 free_netdev(dev);
1299 1295 if (io[this_dev]==0)
drivers/net/ac3200.c
... ... @@ -146,12 +146,7 @@
146 146 err = do_ac3200_probe(dev);
147 147 if (err)
148 148 goto out;
149   - err = register_netdev(dev);
150   - if (err)
151   - goto out1;
152 149 return dev;
153   -out1:
154   - cleanup_card(dev);
155 150 out:
156 151 free_netdev(dev);
157 152 return ERR_PTR(err);
158 153  
... ... @@ -273,7 +268,14 @@
273 268 dev->poll_controller = ei_poll;
274 269 #endif
275 270 NS8390_init(dev, 0);
  271 +
  272 + retval = register_netdev(dev);
  273 + if (retval)
  274 + goto out2;
276 275 return 0;
  276 +out2:
  277 + if (ei_status.reg0)
  278 + iounmap((void *)dev->mem_start);
277 279 out1:
278 280 free_irq(dev->irq, dev);
279 281 out:
... ... @@ -392,11 +394,8 @@
392 394 dev->base_addr = io[this_dev];
393 395 dev->mem_start = mem[this_dev]; /* Currently ignored by driver */
394 396 if (do_ac3200_probe(dev) == 0) {
395   - if (register_netdev(dev) == 0) {
396   - dev_ac32[found++] = dev;
397   - continue;
398   - }
399   - cleanup_card(dev);
  397 + dev_ac32[found++] = dev;
  398 + continue;
400 399 }
401 400 free_netdev(dev);
402 401 printk(KERN_WARNING "ac3200.c: No ac3200 card found (i/o = 0x%x).\n", io[this_dev]);
drivers/net/cs89x0.c
... ... @@ -319,13 +319,7 @@
319 319 }
320 320 if (err)
321 321 goto out;
322   - err = register_netdev(dev);
323   - if (err)
324   - goto out1;
325 322 return dev;
326   -out1:
327   - outw(PP_ChipID, dev->base_addr + ADD_PORT);
328   - release_region(dev->base_addr, NETCARD_IO_EXTENT);
329 323 out:
330 324 free_netdev(dev);
331 325 printk(KERN_WARNING "cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP\n");
332 326  
... ... @@ -735,7 +729,13 @@
735 729 printk("\n");
736 730 if (net_debug)
737 731 printk("cs89x0_probe1() successful\n");
  732 +
  733 + retval = register_netdev(dev);
  734 + if (retval)
  735 + goto out3;
738 736 return 0;
  737 +out3:
  738 + outw(PP_ChipID, dev->base_addr + ADD_PORT);
739 739 out2:
740 740 release_region(ioaddr & ~3, NETCARD_IO_EXTENT);
741 741 out1:
... ... @@ -1831,13 +1831,6 @@
1831 1831 if (ret)
1832 1832 goto out;
1833 1833  
1834   - if (register_netdev(dev) != 0) {
1835   - printk(KERN_ERR "cs89x0.c: No card found at 0x%x\n", io);
1836   - ret = -ENXIO;
1837   - outw(PP_ChipID, dev->base_addr + ADD_PORT);
1838   - release_region(dev->base_addr, NETCARD_IO_EXTENT);
1839   - goto out;
1840   - }
1841 1834 dev_cs89x0 = dev;
1842 1835 return 0;
1843 1836 out:
... ... @@ -162,12 +162,7 @@
162 162 err = do_e2100_probe(dev);
163 163 if (err)
164 164 goto out;
165   - err = register_netdev(dev);
166   - if (err)
167   - goto out1;
168 165 return dev;
169   -out1:
170   - cleanup_card(dev);
171 166 out:
172 167 free_netdev(dev);
173 168 return ERR_PTR(err);
... ... @@ -286,6 +281,9 @@
286 281 #endif
287 282 NS8390_init(dev, 0);
288 283  
  284 + retval = register_netdev(dev);
  285 + if (retval)
  286 + goto out;
289 287 return 0;
290 288 out:
291 289 release_region(ioaddr, E21_IO_EXTENT);
... ... @@ -453,11 +451,8 @@
453 451 dev->mem_start = mem[this_dev];
454 452 dev->mem_end = xcvr[this_dev]; /* low 4bits = xcvr sel. */
455 453 if (do_e2100_probe(dev) == 0) {
456   - if (register_netdev(dev) == 0) {
457   - dev_e21[found++] = dev;
458   - continue;
459   - }
460   - cleanup_card(dev);
  454 + dev_e21[found++] = dev;
  455 + continue;
461 456 }
462 457 free_netdev(dev);
463 458 printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]);
... ... @@ -600,12 +600,7 @@
600 600 err = do_eepro_probe(dev);
601 601 if (err)
602 602 goto out;
603   - err = register_netdev(dev);
604   - if (err)
605   - goto out1;
606 603 return dev;
607   -out1:
608   - release_region(dev->base_addr, EEPRO_IO_EXTENT);
609 604 out:
610 605 free_netdev(dev);
611 606 return ERR_PTR(err);
... ... @@ -758,6 +753,7 @@
758 753 int i;
759 754 struct eepro_local *lp;
760 755 int ioaddr = dev->base_addr;
  756 + int err;
761 757  
762 758 /* Grab the region so we can find another board if autoIRQ fails. */
763 759 if (!request_region(ioaddr, EEPRO_IO_EXTENT, DRV_NAME)) {
764 760  
765 761  
... ... @@ -873,10 +869,16 @@
873 869  
874 870 /* reset 82595 */
875 871 eepro_reset(ioaddr);
  872 +
  873 + err = register_netdev(dev);
  874 + if (err)
  875 + goto err;
876 876 return 0;
877 877 exit:
  878 + err = -ENODEV;
  879 +err:
878 880 release_region(dev->base_addr, EEPRO_IO_EXTENT);
879   - return -ENODEV;
  881 + return err;
880 882 }
881 883  
882 884 /* Open/initialize the board. This is called (in the current kernel)
... ... @@ -1834,11 +1836,8 @@
1834 1836 dev->irq = irq[i];
1835 1837  
1836 1838 if (do_eepro_probe(dev) == 0) {
1837   - if (register_netdev(dev) == 0) {
1838   - dev_eepro[n_eepro++] = dev;
1839   - continue;
1840   - }
1841   - release_region(dev->base_addr, EEPRO_IO_EXTENT);
  1839 + dev_eepro[n_eepro++] = dev;
  1840 + continue;
1842 1841 }
1843 1842 free_netdev(dev);
1844 1843 break;
drivers/net/eexpress.c
... ... @@ -436,11 +436,8 @@
436 436 netdev_boot_setup_check(dev);
437 437  
438 438 err = do_express_probe(dev);
439   - if (!err) {
440   - err = register_netdev(dev);
441   - if (!err)
442   - return dev;
443   - }
  439 + if (!err)
  440 + return dev;
444 441 free_netdev(dev);
445 442 return ERR_PTR(err);
446 443 }
... ... @@ -1205,7 +1202,8 @@
1205 1202 dev->set_multicast_list = &eexp_set_multicast;
1206 1203 dev->tx_timeout = eexp_timeout;
1207 1204 dev->watchdog_timeo = 2*HZ;
1208   - return 0;
  1205 +
  1206 + return register_netdev(dev);
1209 1207 }
1210 1208  
1211 1209 /*
... ... @@ -1716,7 +1714,7 @@
1716 1714 break;
1717 1715 printk(KERN_NOTICE "eexpress.c: Module autoprobe not recommended, give io=xx.\n");
1718 1716 }
1719   - if (do_express_probe(dev) == 0 && register_netdev(dev) == 0) {
  1717 + if (do_express_probe(dev) == 0) {
1720 1718 dev_eexp[this_dev] = dev;
1721 1719 found++;
1722 1720 continue;
drivers/net/es3210.c
... ... @@ -177,12 +177,7 @@
177 177 err = do_es_probe(dev);
178 178 if (err)
179 179 goto out;
180   - err = register_netdev(dev);
181   - if (err)
182   - goto out1;
183 180 return dev;
184   -out1:
185   - cleanup_card(dev);
186 181 out:
187 182 free_netdev(dev);
188 183 return ERR_PTR(err);
... ... @@ -310,6 +305,10 @@
310 305 dev->poll_controller = ei_poll;
311 306 #endif
312 307 NS8390_init(dev, 0);
  308 +
  309 + retval = register_netdev(dev);
  310 + if (retval)
  311 + goto out1;
313 312 return 0;
314 313 out1:
315 314 free_irq(dev->irq, dev);
... ... @@ -445,11 +444,8 @@
445 444 dev->base_addr = io[this_dev];
446 445 dev->mem_start = mem[this_dev];
447 446 if (do_es_probe(dev) == 0) {
448   - if (register_netdev(dev) == 0) {
449   - dev_es3210[found++] = dev;
450   - continue;
451   - }
452   - cleanup_card(dev);
  447 + dev_es3210[found++] = dev;
  448 + continue;
453 449 }
454 450 free_netdev(dev);
455 451 printk(KERN_WARNING "es3210.c: No es3210 card found (i/o = 0x%x).\n", io[this_dev]);
drivers/net/eth16i.c
... ... @@ -473,13 +473,7 @@
473 473 err = do_eth16i_probe(dev);
474 474 if (err)
475 475 goto out;
476   - err = register_netdev(dev);
477   - if (err)
478   - goto out1;
479 476 return dev;
480   -out1:
481   - free_irq(dev->irq, dev);
482   - release_region(dev->base_addr, ETH16I_IO_EXTENT);
483 477 out:
484 478 free_netdev(dev);
485 479 return ERR_PTR(err);
486 480  
... ... @@ -569,7 +563,13 @@
569 563 dev->tx_timeout = eth16i_timeout;
570 564 dev->watchdog_timeo = TX_TIMEOUT;
571 565 spin_lock_init(&lp->lock);
  566 +
  567 + retval = register_netdev(dev);
  568 + if (retval)
  569 + goto out1;
572 570 return 0;
  571 +out1:
  572 + free_irq(dev->irq, dev);
573 573 out:
574 574 release_region(ioaddr, ETH16I_IO_EXTENT);
575 575 return retval;
... ... @@ -1462,12 +1462,8 @@
1462 1462 }
1463 1463  
1464 1464 if (do_eth16i_probe(dev) == 0) {
1465   - if (register_netdev(dev) == 0) {
1466   - dev_eth16i[found++] = dev;
1467   - continue;
1468   - }
1469   - free_irq(dev->irq, dev);
1470   - release_region(dev->base_addr, ETH16I_IO_EXTENT);
  1465 + dev_eth16i[found++] = dev;
  1466 + continue;
1471 1467 }
1472 1468 printk(KERN_WARNING "eth16i.c No Eth16i card found (i/o = 0x%x).\n",
1473 1469 io[this_dev]);
drivers/net/hp-plus.c
... ... @@ -159,12 +159,7 @@
159 159 err = do_hpp_probe(dev);
160 160 if (err)
161 161 goto out;
162   - err = register_netdev(dev);
163   - if (err)
164   - goto out1;
165 162 return dev;
166   -out1:
167   - cleanup_card(dev);
168 163 out:
169 164 free_netdev(dev);
170 165 return ERR_PTR(err);
... ... @@ -271,6 +266,9 @@
271 266 /* Leave the 8390 and HP chip reset. */
272 267 outw(inw(ioaddr + HPP_OPTION) & ~EnableIRQ, ioaddr + HPP_OPTION);
273 268  
  269 + retval = register_netdev(dev);
  270 + if (retval)
  271 + goto out;
274 272 return 0;
275 273 out:
276 274 release_region(ioaddr, HP_IO_EXTENT);
... ... @@ -463,11 +461,8 @@
463 461 dev->irq = irq[this_dev];
464 462 dev->base_addr = io[this_dev];
465 463 if (do_hpp_probe(dev) == 0) {
466   - if (register_netdev(dev) == 0) {
467   - dev_hpp[found++] = dev;
468   - continue;
469   - }
470   - cleanup_card(dev);
  464 + dev_hpp[found++] = dev;
  465 + continue;
471 466 }
472 467 free_netdev(dev);
473 468 printk(KERN_WARNING "hp-plus.c: No HP-Plus card found (i/o = 0x%x).\n", io[this_dev]);
... ... @@ -123,12 +123,7 @@
123 123 err = do_hp_probe(dev);
124 124 if (err)
125 125 goto out;
126   - err = register_netdev(dev);
127   - if (err)
128   - goto out1;
129 126 return dev;
130   -out1:
131   - cleanup_card(dev);
132 127 out:
133 128 free_netdev(dev);
134 129 return ERR_PTR(err);
135 130  
... ... @@ -227,7 +222,12 @@
227 222 ei_status.block_output = &hp_block_output;
228 223 hp_init_card(dev);
229 224  
  225 + retval = register_netdev(dev);
  226 + if (retval)
  227 + goto out1;
230 228 return 0;
  229 +out1:
  230 + free_irq(dev->irq, dev);
231 231 out:
232 232 release_region(ioaddr, HP_IO_EXTENT);
233 233 return retval;
... ... @@ -432,11 +432,8 @@
432 432 dev->irq = irq[this_dev];
433 433 dev->base_addr = io[this_dev];
434 434 if (do_hp_probe(dev) == 0) {
435   - if (register_netdev(dev) == 0) {
436   - dev_hp[found++] = dev;
437   - continue;
438   - }
439   - cleanup_card(dev);
  435 + dev_hp[found++] = dev;
  436 + continue;
440 437 }
441 438 free_netdev(dev);
442 439 printk(KERN_WARNING "hp.c: No HP card found (i/o = 0x%x).\n", io[this_dev]);
... ... @@ -417,12 +417,7 @@
417 417 if (err)
418 418 goto out;
419 419  
420   - err = register_netdev(dev);
421   - if (err)
422   - goto out1;
423 420 return dev;
424   - out1:
425   - release_region(dev->base_addr, HP100_REGION_SIZE);
426 421 out:
427 422 free_netdev(dev);
428 423 return ERR_PTR(err);
429 424  
430 425  
... ... @@ -776,11 +771,22 @@
776 771 printk("Warning! Link down.\n");
777 772 }
778 773  
  774 + err = register_netdev(dev);
  775 + if (err)
  776 + goto out3;
  777 +
779 778 return 0;
  779 +out3:
  780 + if (local_mode == 1)
  781 + pci_free_consistent(lp->pci_dev, MAX_RINGSIZE + 0x0f,
  782 + lp->page_vaddr_algn,
  783 + virt_to_whatever(dev, lp->page_vaddr_algn));
  784 + if (mem_ptr_virt)
  785 + iounmap(mem_ptr_virt);
780 786 out2:
781 787 release_region(ioaddr, HP100_REGION_SIZE);
782 788 out1:
783   - return -ENODEV;
  789 + return err;
784 790 }
785 791  
786 792 /* This procedure puts the card into a stable init state */
787 793  
... ... @@ -2875,18 +2881,12 @@
2875 2881 if (err)
2876 2882 goto out1;
2877 2883  
2878   - err = register_netdev(dev);
2879   - if (err)
2880   - goto out2;
2881   -
2882 2884 #ifdef HP100_DEBUG
2883 2885 printk("hp100: %s: EISA adapter found at 0x%x\n", dev->name,
2884 2886 dev->base_addr);
2885 2887 #endif
2886 2888 gendev->driver_data = dev;
2887 2889 return 0;
2888   - out2:
2889   - release_region(dev->base_addr, HP100_REGION_SIZE);
2890 2890 out1:
2891 2891 free_netdev(dev);
2892 2892 return err;
2893 2893  
... ... @@ -2951,17 +2951,12 @@
2951 2951 err = hp100_probe1(dev, ioaddr, HP100_BUS_PCI, pdev);
2952 2952 if (err)
2953 2953 goto out1;
2954   - err = register_netdev(dev);
2955   - if (err)
2956   - goto out2;
2957 2954  
2958 2955 #ifdef HP100_DEBUG
2959 2956 printk("hp100: %s: PCI adapter found at 0x%x\n", dev->name, ioaddr);
2960 2957 #endif
2961 2958 pci_set_drvdata(pdev, dev);
2962 2959 return 0;
2963   - out2:
2964   - release_region(dev->base_addr, HP100_REGION_SIZE);
2965 2960 out1:
2966 2961 free_netdev(dev);
2967 2962 out0:
... ... @@ -3032,15 +3027,9 @@
3032 3027 SET_MODULE_OWNER(dev);
3033 3028  
3034 3029 err = hp100_isa_probe(dev, hp100_port[i]);
3035   - if (!err) {
3036   - err = register_netdev(dev);
3037   - if (!err)
3038   - hp100_devlist[cards++] = dev;
3039   - else
3040   - release_region(dev->base_addr, HP100_REGION_SIZE);
3041   - }
3042   -
3043   - if (err)
  3030 + if (!err)
  3031 + hp100_devlist[cards++] = dev;
  3032 + else
3044 3033 free_netdev(dev);
3045 3034 }
3046 3035  
drivers/net/isa-skeleton.c
... ... @@ -176,12 +176,7 @@
176 176 err = do_netcard_probe(dev);
177 177 if (err)
178 178 goto out;
179   - err = register_netdev(dev);
180   - if (err)
181   - goto out1;
182 179 return dev;
183   -out1:
184   - cleanup_card(dev);
185 180 out:
186 181 free_netdev(dev);
187 182 return ERR_PTR(err);
188 183  
... ... @@ -316,7 +311,15 @@
316 311  
317 312 dev->tx_timeout = &net_tx_timeout;
318 313 dev->watchdog_timeo = MY_TX_TIMEOUT;
  314 +
  315 + err = register_netdev(dev);
  316 + if (err)
  317 + goto out2;
319 318 return 0;
  319 +out2:
  320 +#ifdef jumpered_dma
  321 + free_dma(dev->dma);
  322 +#endif
320 323 out1:
321 324 #ifdef jumpered_interrupts
322 325 free_irq(dev->irq, dev);
... ... @@ -691,11 +694,8 @@
691 694 dev->dma = dma;
692 695 dev->mem_start = mem;
693 696 if (do_netcard_probe(dev) == 0) {
694   - if (register_netdev(dev) == 0)
695   - this_device = dev;
696   - return 0;
697   - }
698   - cleanup_card(dev);
  697 + this_device = dev;
  698 + return 0;
699 699 }
700 700 free_netdev(dev);
701 701 return -ENXIO;
... ... @@ -356,11 +356,8 @@
356 356 dev->base_addr = io[this_dev];
357 357 dev->dma = dma[this_dev];
358 358 if (do_lance_probe(dev) == 0) {
359   - if (register_netdev(dev) == 0) {
360   - dev_lance[found++] = dev;
361   - continue;
362   - }
363   - cleanup_card(dev);
  359 + dev_lance[found++] = dev;
  360 + continue;
364 361 }
365 362 free_netdev(dev);
366 363 break;
367 364  
... ... @@ -448,12 +445,7 @@
448 445 err = do_lance_probe(dev);
449 446 if (err)
450 447 goto out;
451   - err = register_netdev(dev);
452   - if (err)
453   - goto out1;
454 448 return dev;
455   -out1:
456   - cleanup_card(dev);
457 449 out:
458 450 free_netdev(dev);
459 451 return ERR_PTR(err);
... ... @@ -724,6 +716,9 @@
724 716 dev->tx_timeout = lance_tx_timeout;
725 717 dev->watchdog_timeo = TX_TIMEOUT;
726 718  
  719 + err = register_netdev(dev);
  720 + if (err)
  721 + goto out_dma;
727 722 return 0;
728 723 out_dma:
729 724 if (dev->dma != 4)
drivers/net/lne390.c
... ... @@ -167,12 +167,7 @@
167 167 err = do_lne390_probe(dev);
168 168 if (err)
169 169 goto out;
170   - err = register_netdev(dev);
171   - if (err)
172   - goto out1;
173 170 return dev;
174   -out1:
175   - cleanup_card(dev);
176 171 out:
177 172 free_netdev(dev);
178 173 return ERR_PTR(err);
179 174  
... ... @@ -296,7 +291,14 @@
296 291 dev->poll_controller = ei_poll;
297 292 #endif
298 293 NS8390_init(dev, 0);
  294 +
  295 + ret = register_netdev(dev);
  296 + if (ret)
  297 + goto unmap;
299 298 return 0;
  299 +unmap:
  300 + if (ei_status.reg0)
  301 + iounmap((void *)dev->mem_start);
300 302 cleanup:
301 303 free_irq(dev->irq, dev);
302 304 return ret;
... ... @@ -426,11 +428,8 @@
426 428 dev->base_addr = io[this_dev];
427 429 dev->mem_start = mem[this_dev];
428 430 if (do_lne390_probe(dev) == 0) {
429   - if (register_netdev(dev) == 0) {
430   - dev_lne[found++] = dev;
431   - continue;
432   - }
433   - cleanup_card(dev);
  431 + dev_lne[found++] = dev;
  432 + continue;
434 433 }
435 434 free_netdev(dev);
436 435 printk(KERN_WARNING "lne390.c: No LNE390 card found (i/o = 0x%x).\n", io[this_dev]);
drivers/net/ne-h8300.c
... ... @@ -180,12 +180,7 @@
180 180 err = do_ne_probe(dev);
181 181 if (err)
182 182 goto out;
183   - err = register_netdev(dev);
184   - if (err)
185   - goto out1;
186 183 return dev;
187   -out1:
188   - cleanup_card(dev);
189 184 out:
190 185 free_netdev(dev);
191 186 return ERR_PTR(err);
192 187  
... ... @@ -325,8 +320,13 @@
325 320 dev->poll_controller = ei_poll;
326 321 #endif
327 322 NS8390_init(dev, 0);
328   - return 0;
329 323  
  324 + ret = register_netdev(dev);
  325 + if (ret)
  326 + goto out_irq;
  327 + return 0;
  328 +out_irq:
  329 + free_irq(dev->irq, dev);
330 330 err_out:
331 331 release_region(ioaddr, NE_IO_EXTENT);
332 332 return ret;
... ... @@ -633,11 +633,8 @@
633 633 err = init_reg_offset(dev, dev->base_addr);
634 634 if (!err) {
635 635 if (do_ne_probe(dev) == 0) {
636   - if (register_netdev(dev) == 0) {
637   - dev_ne[found++] = dev;
638   - continue;
639   - }
640   - cleanup_card(dev);
  636 + dev_ne[found++] = dev;
  637 + continue;
641 638 }
642 639 }
643 640 free_netdev(dev);
... ... @@ -229,12 +229,7 @@
229 229 err = do_ne_probe(dev);
230 230 if (err)
231 231 goto out;
232   - err = register_netdev(dev);
233   - if (err)
234   - goto out1;
235 232 return dev;
236   -out1:
237   - cleanup_card(dev);
238 233 out:
239 234 free_netdev(dev);
240 235 return ERR_PTR(err);
241 236  
... ... @@ -534,8 +529,14 @@
534 529 dev->poll_controller = ei_poll;
535 530 #endif
536 531 NS8390_init(dev, 0);
  532 +
  533 + ret = register_netdev(dev);
  534 + if (ret)
  535 + goto out_irq;
537 536 return 0;
538 537  
  538 +out_irq:
  539 + free_irq(dev->irq, dev);
539 540 err_out:
540 541 release_region(ioaddr, NE_IO_EXTENT);
541 542 return ret;
... ... @@ -826,11 +827,8 @@
826 827 dev->mem_end = bad[this_dev];
827 828 dev->base_addr = io[this_dev];
828 829 if (do_ne_probe(dev) == 0) {
829   - if (register_netdev(dev) == 0) {
830   - dev_ne[found++] = dev;
831   - continue;
832   - }
833   - cleanup_card(dev);
  830 + dev_ne[found++] = dev;
  831 + continue;
834 832 }
835 833 free_netdev(dev);
836 834 if (found)
... ... @@ -301,12 +301,7 @@
301 301 err = do_ne2_probe(dev);
302 302 if (err)
303 303 goto out;
304   - err = register_netdev(dev);
305   - if (err)
306   - goto out1;
307 304 return dev;
308   -out1:
309   - cleanup_card(dev);
310 305 out:
311 306 free_netdev(dev);
312 307 return ERR_PTR(err);
313 308  
... ... @@ -517,7 +512,14 @@
517 512 dev->poll_controller = ei_poll;
518 513 #endif
519 514 NS8390_init(dev, 0);
  515 +
  516 + retval = register_netdev(dev);
  517 + if (retval)
  518 + goto out1;
520 519 return 0;
  520 +out1:
  521 + mca_set_adapter_procfn( ei_status.priv, NULL, NULL);
  522 + free_irq(dev->irq, dev);
521 523 out:
522 524 release_region(base_addr, NE_IO_EXTENT);
523 525 return retval;
... ... @@ -798,11 +800,8 @@
798 800 dev->mem_end = bad[this_dev];
799 801 dev->base_addr = io[this_dev];
800 802 if (do_ne2_probe(dev) == 0) {
801   - if (register_netdev(dev) == 0) {
802   - dev_ne[found++] = dev;
803   - continue;
804   - }
805   - cleanup_card(dev);
  803 + dev_ne[found++] = dev;
  804 + continue;
806 805 }
807 806 free_netdev(dev);
808 807 break;
drivers/net/smc-ultra.c
... ... @@ -194,12 +194,7 @@
194 194 err = do_ultra_probe(dev);
195 195 if (err)
196 196 goto out;
197   - err = register_netdev(dev);
198   - if (err)
199   - goto out1;
200 197 return dev;
201   -out1:
202   - cleanup_card(dev);
203 198 out:
204 199 free_netdev(dev);
205 200 return ERR_PTR(err);
... ... @@ -325,6 +320,9 @@
325 320 #endif
326 321 NS8390_init(dev, 0);
327 322  
  323 + retval = register_netdev(dev);
  324 + if (retval)
  325 + goto out;
328 326 return 0;
329 327 out:
330 328 release_region(ioaddr, ULTRA_IO_EXTENT);
... ... @@ -583,11 +581,8 @@
583 581 dev->irq = irq[this_dev];
584 582 dev->base_addr = io[this_dev];
585 583 if (do_ultra_probe(dev) == 0) {
586   - if (register_netdev(dev) == 0) {
587   - dev_ultra[found++] = dev;
588   - continue;
589   - }
590   - cleanup_card(dev);
  584 + dev_ultra[found++] = dev;
  585 + continue;
591 586 }
592 587 free_netdev(dev);
593 588 printk(KERN_WARNING "smc-ultra.c: No SMC Ultra card found (i/o = 0x%x).\n", io[this_dev]);
... ... @@ -149,12 +149,7 @@
149 149 err = do_wd_probe(dev);
150 150 if (err)
151 151 goto out;
152   - err = register_netdev(dev);
153   - if (err)
154   - goto out1;
155 152 return dev;
156   -out1:
157   - cleanup_card(dev);
158 153 out:
159 154 free_netdev(dev);
160 155 return ERR_PTR(err);
... ... @@ -164,6 +159,7 @@
164 159 static int __init wd_probe1(struct net_device *dev, int ioaddr)
165 160 {
166 161 int i;
  162 + int err;
167 163 int checksum = 0;
168 164 int ancient = 0; /* An old card without config registers. */
169 165 int word16 = 0; /* 0 = 8 bit, 1 = 16 bit */
... ... @@ -356,7 +352,10 @@
356 352 outb(inb(ioaddr+4)|0x80, ioaddr+4);
357 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 361 static int
... ... @@ -527,11 +526,8 @@
527 526 dev->mem_start = mem[this_dev];
528 527 dev->mem_end = mem_end[this_dev];
529 528 if (do_wd_probe(dev) == 0) {
530   - if (register_netdev(dev) == 0) {
531   - dev_wd[found++] = dev;
532   - continue;
533   - }
534   - cleanup_card(dev);
  529 + dev_wd[found++] = dev;
  530 + continue;
535 531 }
536 532 free_netdev(dev);
537 533 printk(KERN_WARNING "wd.c: No wd80x3 card found (i/o = 0x%x).\n", io[this_dev]);