--- /mnt/disk/linux/drivers/net/ne.c Wed Sep 27 22:46:30 2000 +++ /linux/drivers/net/ne.c Thu Sep 28 20:45:32 2000 @@ -210,10 +210,7 @@ #ifndef MODULE /* Last resort. The semi-risky ISA auto-probe. */ for (base_addr = 0; netcard_portlist[base_addr] != 0; base_addr++) { - int ioaddr = netcard_portlist[base_addr]; - if (check_region(ioaddr, NE_IO_EXTENT)) - continue; - if (ne_probe1(dev, ioaddr) == 0) + if (ne_probe1(dev, netcard_portlist[base_addr]) == 0) return 0; } #endif @@ -235,9 +232,6 @@ if (pci_enable_device(pdev)) continue; pci_ioaddr = pci_resource_start (pdev, 0); - /* Avoid already found cards from previous calls */ - if (check_region(pci_ioaddr, NE_IO_EXTENT)) - continue; pci_irq_line = pdev->irq; if (pci_irq_line) break; /* Found it */ } @@ -307,12 +301,17 @@ const char *name = NULL; int start_page, stop_page; int neX000, ctron, copam, bad_card; - int reg0 = inb_p(ioaddr); + int reg0, retval; static unsigned version_printed = 0; - if (reg0 == 0xFF) + if (!request_region(ioaddr, NE_IO_EXTENT, "ne")) return -ENODEV; + if ((reg0 = inb_p(ioaddr)) == 0xFF) { + retval = -ENODEV; + goto out; + } + /* Do a preliminary verification that we have a 8390. */ { int regd; @@ -324,7 +323,8 @@ if (inb_p(ioaddr + EN0_COUNTER0) != 0) { outb_p(reg0, ioaddr); outb_p(regd, ioaddr + 0x0d); /* Restore the old values. */ - return -ENODEV; + retval = -ENODEV; + goto out; } } @@ -363,7 +363,8 @@ break; } else { printk(" not found (no reset ack).\n"); - return -ENODEV; + retval = -ENODEV; + goto out; } } @@ -465,11 +466,13 @@ { printk(" not found (invalid signature %2.2x %2.2x).\n", SA_prom[14], SA_prom[15]); - return -ENXIO; + retval = -ENXIO; + goto out; } #else printk(" not found.\n"); - return -ENXIO; + retval = -ENXIO; + goto out; #endif } @@ -495,14 +498,16 @@ if (! dev->irq) { printk(" failed to detect IRQ line.\n"); - return -EAGAIN; + retval = -EAGAIN; + goto out; } /* Allocate dev->priv and fill in 8390 specific dev fields. */ if (ethdev_init(dev)) { printk (" unable to get memory for dev->priv.\n"); - return -ENOMEM; + retval = -ENOMEM; + goto out; } /* Snarf the interrupt now. There's no point in waiting since we cannot @@ -515,11 +520,11 @@ printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval); kfree(dev->priv); dev->priv = NULL; - return -EAGAIN; + retval = -EAGAIN; + goto out; } } dev->base_addr = ioaddr; - request_region(ioaddr, NE_IO_EXTENT, name); for(i = 0; i < ETHER_ADDR_LEN; i++) { printk(" %2.2x", SA_prom[i]); @@ -549,6 +554,9 @@ dev->stop = &ne_close; NS8390_init(dev, 0); return 0; +out: + release_region(ioaddr, NE_IO_EXTENT); + return retval; } static int ne_open(struct net_device *dev)