diff -urN /mnt/disk/linux/drivers/net/wd.c /linux/drivers/net/wd.c --- /mnt/disk/linux/drivers/net/wd.c Thu Nov 2 22:00:58 2000 +++ /linux/drivers/net/wd.c Sat Nov 4 19:18:03 2000 @@ -91,32 +91,33 @@ else if (base_addr != 0) /* Don't probe at all. */ return -ENXIO; - for (i = 0; wd_portlist[i]; i++) { - int ioaddr = wd_portlist[i]; - if (check_region(ioaddr, WD_IO_EXTENT)) - continue; - if (wd_probe1(dev, ioaddr) == 0) + for (i = 0; wd_portlist[i]; i++) + if (wd_probe1(dev, wd_portlist[i]) == 0) return 0; - } return -ENODEV; } static int __init wd_probe1(struct net_device *dev, int ioaddr) { - int i; + int i, retval; int checksum = 0; int ancient = 0; /* An old card without config registers. */ int word16 = 0; /* 0 = 8 bit, 1 = 16 bit */ const char *model_name; - static unsigned version_printed = 0; + static unsigned version_printed; + + if (!request_region(ioaddr, WD_IO_EXTENT, dev->name)) + return -EBUSY; for (i = 0; i < 8; i++) checksum += inb(ioaddr + 8 + i); if (inb(ioaddr + 8) == 0xff /* Extra check to avoid soundcard. */ || inb(ioaddr + 9) == 0xff - || (checksum & 0xff) != 0xFF) - return -ENODEV; + || (checksum & 0xff) != 0xFF) { + retval = -ENODEV; + goto out; + } /* Check for semi-valid mem_start/end values if supplied. */ if ((dev->mem_start % 0x2000) || (dev->mem_end % 0x2000)) { @@ -243,21 +244,20 @@ /* 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 share and the board will usually be enabled. */ - if (request_irq(dev->irq, ei_interrupt, 0, model_name, dev)) { + if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) { printk (" unable to get IRQ %d.\n", dev->irq); kfree(dev->priv); dev->priv = NULL; - return -EAGAIN; + goto out; } /* OK, were are certain this is going to work. Setup the device. */ - request_region(ioaddr, WD_IO_EXTENT, model_name); - ei_status.name = model_name; ei_status.word16 = word16; ei_status.tx_start_page = WD_START_PG; @@ -294,6 +294,9 @@ #endif return 0; +out: + release_region(ioaddr, WD_IO_EXTENT); + return retval; } static int