diff -urN /mnt/disk/linux/drivers/net/ni5010.c /linux/drivers/net/ni5010.c --- /mnt/disk/linux/drivers/net/ni5010.c Thu Nov 16 22:57:26 2000 +++ /linux/drivers/net/ni5010.c Sun Nov 19 18:56:51 2000 @@ -134,20 +134,13 @@ return -ENXIO; #ifdef FULL_IODETECT - for (int ioaddr=0x200; ioaddr<0x400; ioaddr+=0x20) { - if (check_region(ioaddr, NI5010_IO_EXTENT)) - continue; + for (int ioaddr=0x200; ioaddr<0x400; ioaddr+=0x20) if (ni5010_probe1(dev, ioaddr) == 0) return 0; - } #else - for (port = ni5010_portlist; *port; port++) { - int ioaddr = *port; - if (check_region(ioaddr, NI5010_IO_EXTENT)) - continue; - if (ni5010_probe1(dev, ioaddr) == 0) + for (port = ni5010_portlist; *port; port++) + if (ni5010_probe1(dev, *port) == 0) return 0; - } #endif /* FULL_IODETECT */ return -ENODEV; } @@ -185,8 +178,8 @@ static int __init ni5010_probe1(struct net_device *dev, int ioaddr) { - static unsigned version_printed = 0; - int i; + static unsigned version_printed; + int i, retval; unsigned int data = 0; int boguscount = 40; @@ -207,19 +200,31 @@ PRINTK2((KERN_DEBUG "%s: entering ni5010_probe1(%#3x)\n", dev->name, ioaddr)); - if (inb(ioaddr+0) == 0xff) return -ENODEV; + if (!request_region(ioaddr, NI5010_IO_EXTENT, dev->name)) + return -EBUSY; + + if (inb(ioaddr+0) == 0xff) { + retval = -ENODEV; + goto err_out; + } while ( (rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr) & rd_port(ioaddr)) != 0xff) { - if (boguscount-- == 0) return -ENODEV; + if (boguscount-- == 0) { + retval = -ENODEV; + goto err_out; + } } PRINTK2((KERN_DEBUG "%s: I/O #1 passed!\n", dev->name)); for (i=0; i<32; i++) if ( (data = rd_port(ioaddr)) != 0xff) break; - if (data==0xff) return -ENODEV; + if (data == 0xff) { + retval = -ENODEV; + goto err_out; + } PRINTK2((KERN_DEBUG "%s: I/O #2 passed!\n", dev->name)); @@ -229,16 +234,20 @@ for (i=0; i<4; i++) rd_port(ioaddr); if ( (rd_port(ioaddr) != NI5010_MAGICVAL1) || (rd_port(ioaddr) != NI5010_MAGICVAL2) ) { - return -ENODEV; + retval = -ENODEV; + goto err_out; } - } else return -ENODEV; + } else { + retval = -ENODEV; + goto err_out; + } PRINTK2((KERN_DEBUG "%s: I/O #3 passed!\n", dev->name)); if (NI5010_DEBUG && version_printed++ == 0) printk(KERN_INFO "%s", version); - printk("NI5010 ethercard probe at 0x%x: ", ioaddr); + printk(KERN_INFO "NI5010 ethercard probe at %#x: ", ioaddr); dev->base_addr = ioaddr; @@ -263,7 +272,8 @@ if (dev->irq == 0) { printk(KERN_WARNING "%s: no IRQ found!\n", dev->name); - return -EAGAIN; + retval = -EAGAIN; + goto err_out; } PRINTK2((KERN_DEBUG "%s: I/O #7 passed!\n", dev->name)); } else if (dev->irq == 2) { @@ -278,7 +288,8 @@ dev->priv = kmalloc(sizeof(struct ni5010_local), GFP_KERNEL|GFP_DMA); if (dev->priv == NULL) { printk(KERN_WARNING "%s: Failed to allocate private memory\n", dev->name); - return -ENOMEM; + retval = -ENOMEM; + goto err_out; } } @@ -306,9 +317,6 @@ printk("// bufsize rcv/xmt=%d/%d\n", bufsize_rcv, NI5010_BUFSIZE); memset(dev->priv, 0, sizeof(struct ni5010_local)); - /* Grab the region so we can find another board if autoIRQ fails. */ - request_region(ioaddr, NI5010_IO_EXTENT, boardname); - dev->open = ni5010_open; dev->stop = ni5010_close; dev->hard_start_xmit = ni5010_send_packet; @@ -335,6 +343,10 @@ printk(KERN_INFO "Join the NI5010 driver development team!\n"); printk(KERN_INFO "Mail to a.mohr@mailto.de or jvbest@wi.leidenuniv.nl\n"); return 0; + +err_out: + release_region(ioaddr, NI5010_IO_EXTENT); + return retval; } /* @@ -353,9 +365,9 @@ PRINTK2((KERN_DEBUG "%s: entering ni5010_open()\n", dev->name)); - if (request_irq(dev->irq, &ni5010_interrupt, 0, boardname, dev)) { + if ((i = request_irq(dev->irq, &ni5010_interrupt, 0, dev->name, dev))) { printk(KERN_WARNING "%s: Cannot get irq %#2x\n", dev->name, dev->irq); - return -EAGAIN; + return i; } PRINTK3((KERN_DEBUG "%s: passed open() #1\n", dev->name)); /* @@ -363,10 +375,10 @@ * and clean up on failure. */ #ifdef jumpered_dma - if (request_dma(dev->dma, cardname)) { + if ((i = request_dma(dev->dma, dev->name))) { printk(KERN_WARNING "%s: Cannot get dma %#2x\n", dev->name, dev->dma); free_irq(dev->irq, NULL); - return -EAGAIN; + return i; } #endif /* jumpered_dma */