diff -urN /mnt/disk/linux/drivers/net/fmv18x.c /linux/drivers/net/fmv18x.c --- /mnt/disk/linux/drivers/net/fmv18x.c Thu Nov 2 22:01:00 2000 +++ /linux/drivers/net/fmv18x.c Thu Nov 2 23:30:26 2000 @@ -139,13 +139,9 @@ else if (base_addr != 0) /* Don't probe at all. */ return -ENXIO; - for (i = 0; fmv18x_probe_list[i]; i++) { - int ioaddr = fmv18x_probe_list[i]; - if (check_region(ioaddr, FMV18X_IO_EXTENT)) - continue; - if (fmv18x_probe1(dev, ioaddr) == 0) + for (i = 0; fmv18x_probe_list[i]; i++) + if (fmv18x_probe1(dev, fmv18x_probe_list[i]) == 0) return 0; - } return -ENODEV; } @@ -162,17 +158,22 @@ { char irqmap[4] = {3, 7, 10, 15}; char irqmap_pnp[8] = {3, 4, 5, 7, 9, 10, 11, 15}; - unsigned int i, irq; + unsigned int i, irq, retval; /* Resetting the chip doesn't reset the ISA interface, so don't bother. That means we have to be careful with the register values we probe for. */ + if (!request_region(ioaddr, FMV18X_IO_EXTENT, "fmv18x")) + return -ENODEV; + /* Check I/O address configuration and Fujitsu vendor code */ if (inb(ioaddr+FJ_MACADDR ) != 0x00 || inb(ioaddr+FJ_MACADDR+1) != 0x00 - || inb(ioaddr+FJ_MACADDR+2) != 0x0e) - return -ENODEV; + || inb(ioaddr+FJ_MACADDR+2) != 0x0e) { + retval = -ENODEV; + goto out; + } /* Check PnP mode for FMV-183/184/183A/184A. */ /* This PnP routine is very poor. IO and IRQ should be known. */ @@ -182,8 +183,10 @@ if (irq == irqmap_pnp[i]) break; } - if (i == 8) - return -ENODEV; + if (i == 8) { + retval = -ENODEV; + goto out; + } } else { if (fmv18x_probe_list[inb(ioaddr + FJ_CONFIG0) & 0x07] != ioaddr) return -ENODEV; @@ -194,13 +197,10 @@ if (request_irq(irq, &net_interrupt, 0, "fmv18x", dev)) { printk ("FMV-18x found at %#3x, but it's unusable due to a conflict on" "IRQ %d.\n", ioaddr, irq); - return -EAGAIN; + retval = -EAGAIN; + goto out; } - /* Grab the region so that we can find another board if the IRQ request - fails. */ - request_region(ioaddr, FMV18X_IO_EXTENT, "fmv18x"); - printk("%s: FMV-18x found at %#3x, IRQ %d, address ", dev->name, ioaddr, irq); @@ -261,8 +261,11 @@ /* Initialize the device structure. */ dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL); - if (dev->priv == NULL) - return -ENOMEM; + if (dev->priv == NULL) { + free_irq(irq, dev); + retval = -ENOMEM; + goto out; + } memset(dev->priv, 0, sizeof(struct net_local)); dev->open = net_open; @@ -277,6 +280,9 @@ ether_setup(dev); return 0; +out: + release_region(ioaddr, FMV18X_IO_EXTENT); + return retval; }