All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrey Panin <pazke@orbita.don.sitek.net>
To: linux-kernel@vger.kernel.org
Subject: [PATCH] NIC drivers check_region() removal continues
Date: Fri, 10 Nov 2000 14:29:57 +0300	[thread overview]
Message-ID: <20001110142957.A8245@debian> (raw)


[-- Attachment #1.1: Type: text/plain, Size: 519 bytes --]


Hi all,

new net drivers patchset (against 2.4.0-test11-pre1) attached.

Modifications: check_region() removal, passing dev->name to 
request_region() & request_irq() etc.

Drivers affected: 3c501.c, 3c503.c, 3c505.c, 82596.c, eth16i.c, hp.c,
hp-plus.c, ibmlana.c, ne2.c, seeq8005.c, smc-mca.c, smc-ultra.c, 
smc-ultra32.c

Best regard,
            Andrey

-- 
Andrey Panin            | Embedded systems software engineer
pazke@orbita1.ru        | PGP key: http://www.orbita1.ru/~pazke/AndreyPanin.asc

[-- Attachment #1.2: patch-3c501 --]
[-- Type: text/plain, Size: 743 bytes --]

diff -urN /mnt/disk/linux/drivers/net/3c501.c /linux/drivers/net/3c501.c
--- /mnt/disk/linux/drivers/net/3c501.c	Thu Nov  2 22:00:58 2000
+++ /linux/drivers/net/3c501.c	Sat Nov  4 21:22:59 2000
@@ -398,6 +398,7 @@
 
 static int el_open(struct net_device *dev)
 {
+	int retval;
 	int ioaddr = dev->base_addr;
 	struct net_local *lp = (struct net_local *)dev->priv;
 	unsigned long flags;
@@ -407,9 +408,9 @@
 	if (el_debug > 2)
 		printk("%s: Doing el_open()...", dev->name);
 
-	if (request_irq(dev->irq, &el_interrupt, 0, "3c501", dev)) {
+	if ((retval = request_irq(dev->irq, &el_interrupt, 0, dev->name, dev))) {
 		MOD_DEC_USE_COUNT;
-		return -EAGAIN;
+		return retval;
 	}
 
 	spin_lock_irqsave(&lp->lock, flags);

[-- Attachment #1.3: patch-3c503 --]
[-- Type: text/plain, Size: 2965 bytes --]

diff -urN /mnt/disk/linux/drivers/net/3c503.c /linux/drivers/net/3c503.c
--- /mnt/disk/linux/drivers/net/3c503.c	Thu Nov  2 22:00:58 2000
+++ /linux/drivers/net/3c503.c	Sat Nov  4 18:58:39 2000
@@ -101,8 +101,6 @@
 		break;
 	if (base_bits != 1)
 	    continue;
-	if (check_region(netcard_portlist[i], EL2_IO_EXTENT))
-	    continue;
 	if (el2_probe1(dev, netcard_portlist[i]) == 0)
 	    return 0;
     }
@@ -126,13 +124,9 @@
     else if (base_addr != 0)	/* Don't probe at all. */
 	return -ENXIO;
 
-    for (i = 0; netcard_portlist[i]; i++) {
-	int ioaddr = netcard_portlist[i];
-	if (check_region(ioaddr, EL2_IO_EXTENT))
-	    continue;
-	if (el2_probe1(dev, ioaddr) == 0)
+    for (i = 0; netcard_portlist[i]; i++)
+	if (el2_probe1(dev, netcard_portlist[i]) == 0)
 	    return 0;
-    }
 
     return -ENODEV;
 }
@@ -143,14 +137,18 @@
 int __init 
 el2_probe1(struct net_device *dev, int ioaddr)
 {
-    int i, iobase_reg, membase_reg, saved_406, wordlength;
-    static unsigned version_printed = 0;
+    int i, iobase_reg, membase_reg, saved_406, wordlength, retval;
+    static unsigned version_printed;
     unsigned long vendor_id;
 
+    if (!request_region(ioaddr, EL2_IO_EXTENT, dev->name))
+	return -EBUSY;
+
     /* Reset and/or avoid any lurking NE2000 */
     if (inb(ioaddr + 0x408) == 0xff) {
     	mdelay(1);
-	return -ENODEV;
+	retval = -ENODEV;
+	goto out;
     }
 
     /* We verify that it's a 3C503 board by checking the first three octets
@@ -160,7 +158,8 @@
     /* ASIC location registers should be 0 or have only a single bit set. */
     if (   (iobase_reg  & (iobase_reg - 1))
 	|| (membase_reg & (membase_reg - 1))) {
-	return -ENODEV;
+	retval = -ENODEV;
+	goto out;
     }
     saved_406 = inb_p(ioaddr + 0x406);
     outb_p(ECNTRL_RESET|ECNTRL_THIN, ioaddr + 0x406); /* Reset it... */
@@ -172,7 +171,8 @@
     if ((vendor_id != OLD_3COM_ID) && (vendor_id != NEW_3COM_ID)) {
 	/* Restore the register we frobbed. */
 	outb(saved_406, ioaddr + 0x406);
-	return -ENODEV;
+	retval = -ENODEV;
+	goto out;
     }
 
     if (ei_debug  &&  version_printed++ == 0)
@@ -182,8 +182,9 @@
     /* Allocate dev->priv and fill in 8390 specific dev fields. */
     if (ethdev_init(dev)) {
 	printk ("3c503: unable to allocate memory for dev->priv.\n");
-	return -ENOMEM;
-     }
+	retval = -ENOMEM;
+	goto out;
+    }
 
     printk("%s: 3c503 at i/o base %#3x, node ", dev->name, ioaddr);
 
@@ -282,8 +283,6 @@
     ei_status.block_input = &el2_block_input;
     ei_status.block_output = &el2_block_output;
 
-    request_region(ioaddr, EL2_IO_EXTENT, ei_status.name);
-
     if (dev->irq == 2)
 	dev->irq = 9;
     else if (dev->irq > 5 && dev->irq != 9) {
@@ -310,6 +309,9 @@
 	       dev->name, ei_status.name, (wordlength+1)<<3);
     }
     return 0;
+out:
+    release_region(ioaddr, EL2_IO_EXTENT);
+    return retval;
 }
 \f
 static int

[-- Attachment #1.4: patch-3c505 --]
[-- Type: text/plain, Size: 1186 bytes --]

diff -urN /mnt/disk/linux/drivers/net/3c505.c /linux/drivers/net/3c505.c
--- /mnt/disk/linux/drivers/net/3c505.c	Thu Nov  9 21:28:06 2000
+++ /linux/drivers/net/3c505.c	Thu Nov  9 22:58:51 2000
@@ -854,6 +854,7 @@
 static int elp_open(struct net_device *dev)
 {
 	elp_device *adapter;
+	int retval;
 
 	adapter = dev->priv;
 
@@ -893,16 +894,17 @@
 	/*
 	 * install our interrupt service routine
 	 */
-	if (request_irq(dev->irq, &elp_interrupt, 0, "3c505", dev)) {
-		return -EAGAIN;
+	if ((retval = request_irq(dev->irq, &elp_interrupt, 0, dev->name, dev))) {
+		printk("%s: could not allocate IRQ%d\n", dev->name, dev->irq);
+		return retval;
 	}
-	if (request_dma(dev->dma, "3c505")) {
-		printk("%s: could not allocate DMA channel\n", dev->name);
-		return -EAGAIN;
+	if ((retval = request_dma(dev->dma, dev->name))) {
+		printk("%s: could not allocate DMA%d channel\n", dev->name, dev->dma);
+		return retval;
 	}
 	adapter->dma_buffer = (void *) dma_mem_alloc(DMA_BUFFER_SIZE);
 	if (!adapter->dma_buffer) {
-		printk("Could not allocate DMA buffer\n");
+		printk("%s: could not allocate DMA buffer\n", dev->name);
 	}
 	adapter->dmaing = 0;
 

[-- Attachment #1.5: patch-82596 --]
[-- Type: text/plain, Size: 1402 bytes --]

diff -urN /mnt/disk/linux/drivers/net/82596.c /linux/drivers/net/82596.c
--- /mnt/disk/linux/drivers/net/82596.c	Thu Nov  2 22:01:06 2000
+++ /linux/drivers/net/82596.c	Wed Nov  8 23:42:42 2000
@@ -1093,7 +1093,7 @@
 	int i;
 	struct i596_private *lp;
 	char eth_addr[6];
-	static int probed = 0;
+	static int probed;
 
 	if (probed)
 		return -ENODEV;
@@ -1131,9 +1131,9 @@
 		/* this is easy the ethernet interface can only be at 0x300 */
 		/* first check nothing is already registered here */
 
-		if (check_region(ioaddr, I596_TOTAL_SIZE)) {
+		if (!request_region(ioaddr, I596_TOTAL_SIZE, dev->name)) {
 			printk("82596: IO address 0x%04x in use\n", ioaddr);
-			return -ENODEV;
+			return -EBUSY;
 		}
 
 		for (i = 0; i < 8; i++) {
@@ -1145,17 +1145,14 @@
 		   some machines have 0x100, some 0x200. The DOS driver doesn't
 		   even bother with the checksum */
 
-		if (checksum % 0x100)
-			return -ENODEV;
-
 		/* Some other boards trip the checksum.. but then appear as
 		 * ether address 0. Trap these - AC */
 
-		if (memcmp(eth_addr, "\x00\x00\x49", 3) != 0)
-			return -ENODEV;
-
-		if (!request_region(ioaddr, I596_TOTAL_SIZE, "i596"))
+		if ((checksum % 0x100) || 
+		    (memcmp(eth_addr, "\x00\x00\x49", 3) != 0)) {
+			release_region(ioaddr, I596_TOTAL_SIZE);
 			return -ENODEV;
+		}
 
 		dev->base_addr = ioaddr;
 		dev->irq = 10;

[-- Attachment #1.6: patch-eth16i --]
[-- Type: text/plain, Size: 3014 bytes --]

--- eth16i.c.orig	Fri Nov 10 13:02:38 2000
+++ eth16i.c	Fri Nov 10 13:04:34 2000
@@ -451,20 +451,14 @@
 		return ENXIO;
 
 	/* Seek card from the ISA io address space */
-	for(i = 0; (ioaddr = eth16i_portlist[i]) ; i++) {
-		if(check_region(ioaddr, ETH16I_IO_EXTENT))
-			continue;
+	for(i = 0; (ioaddr = eth16i_portlist[i]) ; i++)
 		if(eth16i_probe1(dev, ioaddr) == 0)
 			return 0;
-	}
 
 	/* Seek card from the EISA io address space */
-	for(i = 0; (ioaddr = eth32i_portlist[i]) ; i++) {
-		if(check_region(ioaddr, ETH16I_IO_EXTENT))
-			continue;
+	for(i = 0; (ioaddr = eth32i_portlist[i]) ; i++)
 		if(eth16i_probe1(dev, ioaddr) == 0)
 			return 0;
-	}
 
 	return ENODEV;
 }
@@ -472,10 +466,15 @@
 static int __init eth16i_probe1(struct net_device *dev, int ioaddr)
 {
 	struct eth16i_local *lp;
-	
-	static unsigned version_printed = 0;
+	static unsigned version_printed;
+	int retval;
+
 	boot = 1;  /* To inform initilization that we are in boot probe */
 
+	/* Let's grab the region */
+	if (!request_region(ioaddr, ETH16I_IO_EXTENT, dev->name))
+		return -EBUSY;
+
 	/*
 	  The MB86985 chip has on register which holds information in which 
 	  io address the chip lies. First read this register and compare
@@ -486,14 +485,18 @@
 	if(ioaddr < 0x1000) {
 	
 		if(eth16i_portlist[(inb(ioaddr + JUMPERLESS_CONFIG) & 0x07)] 
-		   != ioaddr)
-			return -ENODEV;
+		   != ioaddr) {
+			retval = -ENODEV;
+			goto out;
+		}
 	}
 
 	/* Now we will go a bit deeper and try to find the chip's signature */
 
-	if(eth16i_check_signature(ioaddr) != 0) 
-		return -ENODEV;
+	if(eth16i_check_signature(ioaddr) != 0) {
+		retval = -ENODEV;
+		goto out;
+	}
 
 	/* 
 	   Now it seems that we have found a ethernet chip in this particular
@@ -520,17 +523,15 @@
 
 	/* Try to obtain interrupt vector */
 
-	if (request_irq(dev->irq, (void *)&eth16i_interrupt, 0, "eth16i", dev)) {	
+	if ((retval = request_irq(dev->irq, (void *)&eth16i_interrupt, 0, dev->name, dev))) {
 		printk(KERN_WARNING "%s: %s at %#3x, but is unusable due conflicting IRQ %d.\n", 
 		       dev->name, cardname, ioaddr, dev->irq);
-		return -EAGAIN;
+		goto out;
 	}
 
 	printk(KERN_INFO "%s: %s at %#3x, IRQ %d, ",
 	       dev->name, cardname, ioaddr, dev->irq);
 
-	/* Let's grab the region */
-	request_region(ioaddr, ETH16I_IO_EXTENT, "eth16i");
 
 	/* Now we will have to lock the chip's io address */
 	eth16i_select_regbank(TRANSCEIVER_MODE_RB, ioaddr);
@@ -544,8 +545,11 @@
 	/* Initialize the device structure */
 	if(dev->priv == NULL) {
 		dev->priv = kmalloc(sizeof(struct eth16i_local), GFP_KERNEL);
-		if(dev->priv == NULL)
-			return -ENOMEM;
+		if(dev->priv == NULL) {
+			free_irq(dev->irq, dev);
+			retval = -ENOMEM;
+			goto out;
+		}
 	}
 
 	memset(dev->priv, 0, sizeof(struct eth16i_local));
@@ -566,6 +570,9 @@
 	boot = 0;
 
 	return 0;
+out:
+	release_region(ioaddr, ETH16I_IO_EXTENT);
+	return retval;
 }
 
 

[-- Attachment #1.7: patch-hp --]
[-- Type: text/plain, Size: 1275 bytes --]

diff -urN /mnt/disk/linux/drivers/net/hp.c /linux/drivers/net/hp.c
--- /mnt/disk/linux/drivers/net/hp.c	Thu Nov  9 21:28:04 2000
+++ /linux/drivers/net/hp.c	Thu Nov  9 22:44:27 2000
@@ -101,9 +101,9 @@
 {
 	int i, retval, board_id, wordmode;
 	const char *name;
-	static unsigned version_printed = 0;
+	static unsigned version_printed;
 
-	if (!request_region(ioaddr, HP_IO_EXTENT, "hp"))
+	if (!request_region(ioaddr, HP_IO_EXTENT, dev->name))
 		return -ENODEV;
 
 	/* Check for the HP physical address, 08 00 09 xx xx xx. */
@@ -155,7 +155,7 @@
 				outb_p(irqmap[irq] | HP_RUN, ioaddr + HP_CONFIGURE);
 				outb_p( 0x00 | HP_RUN, ioaddr + HP_CONFIGURE);
 				if (irq == probe_irq_off(cookie)		 /* It's a good IRQ line! */
-					&& request_irq (irq, ei_interrupt, 0, "hp", dev) == 0) {
+					&& request_irq (irq, ei_interrupt, 0, dev->name, dev) == 0) {
 					printk(" selecting IRQ %d.\n", irq);
 					dev->irq = *irqp;
 					break;
@@ -170,9 +170,8 @@
 	} else {
 		if (dev->irq == 2)
 			dev->irq = 9;
-		if (request_irq(dev->irq, ei_interrupt, 0, "hp", dev)) {
+		if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
 			printk (" unable to get IRQ %d.\n", dev->irq);
-			retval = -EBUSY;
 			goto out1;
 		}
 	}

[-- Attachment #1.8: patch-hp-plus --]
[-- Type: text/plain, Size: 975 bytes --]

diff -urN /mnt/disk/linux/drivers/net/hp-plus.c /linux/drivers/net/hp-plus.c
--- /mnt/disk/linux/drivers/net/hp-plus.c	Thu Nov  2 22:01:00 2000
+++ /linux/drivers/net/hp-plus.c	Mon Nov  6 00:51:11 2000
@@ -141,10 +141,10 @@
 	unsigned char checksum = 0;
 	const char *name = "HP-PC-LAN+";
 	int mem_start;
-	static unsigned version_printed = 0;
+	static unsigned version_printed;
 
-	if (!request_region(ioaddr, HP_IO_EXTENT, "hp-plus"))
-		return -ENODEV;
+	if (!request_region(ioaddr, HP_IO_EXTENT, dev->name))
+		return -EBUSY;
 
 	/* Check for the HP+ signature, 50 48 0x 53. */
 	if (inw(ioaddr + HP_ID) != 0x4850
@@ -249,9 +249,10 @@
 {
 	int ioaddr = dev->base_addr - NIC_OFFSET;
 	int option_reg;
+	int retval;
 
-	if (request_irq(dev->irq, ei_interrupt, 0, "hp-plus", dev)) {
-	    return -EAGAIN;
+	if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev))) {
+	    return retval;
 	}
 
 	/* Reset the 8390 and HP chip. */

[-- Attachment #1.9: patch-ibmlana --]
[-- Type: text/plain, Size: 2811 bytes --]

diff -urN /mnt/disk/linux/drivers/net/ibmlana.c /linux/drivers/net/ibmlana.c
--- /mnt/disk/linux/drivers/net/ibmlana.c	Thu Nov  2 22:01:04 2000
+++ /linux/drivers/net/ibmlana.c	Mon Nov  6 16:03:22 2000
@@ -857,7 +857,7 @@
 
 	result =
 	    request_irq(priv->realirq, irq_handler,
-			SA_SHIRQ | SA_SAMPLE_RANDOM, "ibm_lana", dev);
+			SA_SHIRQ | SA_SAMPLE_RANDOM, dev->name, dev);
 	if (result != 0) {
 		printk("%s: failed to register irq %d\n", dev->name,
 		       dev->irq);
@@ -1046,7 +1046,7 @@
 	/* can't work without an MCA bus ;-) */
 
 	if (MCA_bus == 0)
-		return ENODEV;
+		return -ENODEV;
 
 	/* start address of 1 --> forced detection */
 
@@ -1101,19 +1101,18 @@
 	/* nothing found ? */
 
 	if (slot == -1)
-		return ((base != 0) || (irq != 0)) ? ENXIO : ENODEV;
+		return ((base != 0) || (irq != 0)) ? -ENXIO : -ENODEV;
 
 	/* announce success */
 	printk("%s: IBM LAN Adapter/A found in slot %d\n", dev->name,
 	       slot + 1);
 
 	/* try to obtain I/O range */
-	if (check_region(iobase, IBM_LANA_IORANGE) < 0) {
-		printk("cannot allocate I/O range at %#x!\n", iobase);
+	if (!request_region(iobase, IBM_LANA_IORANGE, dev->name)) {
+		printk("%s: cannot allocate I/O range at %#x!\n", dev->name, iobase);
 		startslot = slot + 1;
-		return 0;
+		return -EBUSY;
 	}
-	request_region(iobase, IBM_LANA_IORANGE, "ibm_lana");
 
 	/* make procfs entries */
 
@@ -1128,6 +1127,10 @@
 
 	priv = dev->priv =
 	    (ibmlana_priv *) kmalloc(sizeof(ibmlana_priv), GFP_KERNEL);
+	if (!priv) {
+		release_region(iobase, IBM_LANA_IORANGE);
+		return -ENOMEM;
+	}
 	priv->slot = slot;
 	priv->realirq = irq;
 	priv->medium = medium;
@@ -1189,24 +1192,11 @@
 
 #define DEVMAX 5
 
-#if (LINUX_VERSION_CODE >= 0x020363)
-static struct IBMLANA_NETDEV moddevs[DEVMAX] =
-    { {"    ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe},
-{"    ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe},
-{"    ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe},
-{"    ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe},
-{"    ", 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe}
-};
-#else
-static char NameSpace[8 * DEVMAX];
-static struct IBMLANA_NETDEV moddevs[DEVMAX] =
-    { {NameSpace + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe},
-{NameSpace + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe},
-{NameSpace + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe},
-{NameSpace + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe},
-{NameSpace + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, ibmlana_probe}
+static struct IBMLANA_NETDEV moddevs[DEVMAX] = {
+	{ init: ibmlana_probe }, { init: ibmlana_probe }, 
+	{ init: ibmlana_probe }, { init: ibmlana_probe },
+	{ init: ibmlana_probe }
 };
-#endif
 
 int irq = 0;
 int io = 0;

[-- Attachment #1.10: patch-ne2 --]
[-- Type: text/plain, Size: 2616 bytes --]

diff -urN /mnt/disk/linux/drivers/net/ne2.c /linux/drivers/net/ne2.c
--- /mnt/disk/linux/drivers/net/ne2.c	Thu Nov  2 22:01:06 2000
+++ /linux/drivers/net/ne2.c	Tue Nov  7 19:55:59 2000
@@ -200,12 +200,12 @@
 
 static int __init ne2_probe1(struct net_device *dev, int slot)
 {
-	int i, base_addr, irq;
+	int i, base_addr, irq, retval;
 	unsigned char POS;
 	unsigned char SA_prom[32];
 	const char *name = "NE/2";
 	int start_page, stop_page;
-	static unsigned version_printed = 0;
+	static unsigned version_printed;
 
 	if (ei_debug && version_printed++ == 0)
 		printk(version);
@@ -226,6 +226,9 @@
 	base_addr = addresses[i - 1];
 	irq = irqs[(POS & 0x60)>>5];
 
+	if (!request_region(base_addr, NE_IO_EXTENT, dev->name))
+		return -EBUSY;
+
 #ifdef DEBUG
 	printk("POS info : pos 2 = %#x ; base = %#x ; irq = %ld\n", POS,
 			base_addr, irq);
@@ -239,7 +242,8 @@
 	outb(0x21, base_addr + NE_CMD);
 	if (inb(base_addr + NE_CMD) != 0x21) {
 		printk("NE/2 adapter not responding\n");
-		return -ENODEV;
+		retval = -ENODEV;
+		goto out;
 	}
 
 	/* In the crynwr sources they do a RAM-test here. I skip it. I suppose
@@ -260,7 +264,8 @@
 		while ((inb_p(base_addr + EN0_ISR) & ENISR_RESET) == 0)
 			if (jiffies - reset_start_time > 2*HZ/100) {
 				printk(" not found (no reset ack).\n");
-				return -ENODEV;
+				retval = -ENODEV;
+				goto out;
 			}
 
 		outb_p(0xff, base_addr + EN0_ISR);         /* Ack all intr. */
@@ -309,14 +314,11 @@
 
 	/* Snarf the interrupt now.  There's no point in waiting since we cannot
 	   share and the board will usually be enabled. */
-	{
-		int irqval = request_irq(dev->irq, ei_interrupt, 
-				0, name, dev);
-		if (irqval) {
-			printk (" unable to get IRQ %d (irqval=%d).\n", 
-					dev->irq, +irqval);
-			return -EAGAIN;
-		}
+	retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev);
+	if (retval) {
+		printk (" unable to get IRQ %d (irqval=%d).\n", 
+				dev->irq, retval);
+		goto out;
 	}
 
 	dev->base_addr = base_addr;
@@ -325,11 +327,10 @@
 	if (ethdev_init(dev)) {
 		printk (" unable to get memory for dev->priv.\n");
 		free_irq(dev->irq, dev);
-		return -ENOMEM;
+		retval = -ENOMEM;
+		goto out;
 	}
 
-	request_region(base_addr, NE_IO_EXTENT, name);
-
 	for(i = 0; i < ETHER_ADDR_LEN; i++) {
 		printk(" %2.2x", SA_prom[i]);
 		dev->dev_addr[i] = SA_prom[i];
@@ -362,6 +363,9 @@
 	dev->stop = &ne_close;
 	NS8390_init(dev, 0);
 	return 0;
+out:
+	release_region(base_addr, NE_IO_EXTENT);
+	return retval;
 }
 
 static int ne_open(struct net_device *dev)

[-- Attachment #1.11: patch-seeq8005 --]
[-- Type: text/plain, Size: 3437 bytes --]

diff -urN /mnt/disk/linux/drivers/net/seeq8005.c /linux/drivers/net/seeq8005.c
--- /mnt/disk/linux/drivers/net/seeq8005.c	Thu Nov  2 22:01:00 2000
+++ /linux/drivers/net/seeq8005.c	Fri Nov  3 22:34:13 2000
@@ -116,13 +116,9 @@
 	else if (base_addr != 0)	/* Don't probe at all. */
 		return -ENXIO;
 
-	for (i = 0; seeq8005_portlist[i]; i++) {
-		int ioaddr = seeq8005_portlist[i];
-		if (check_region(ioaddr, SEEQ8005_IO_EXTENT))
-			continue;
-		if (seeq8005_probe1(dev, ioaddr) == 0)
+	for (i = 0; seeq8005_portlist[i]; i++)
+		if (seeq8005_probe1(dev, seeq8005_portlist[i]) == 0)
 			return 0;
-	}
 
 	return -ENODEV;
 }
@@ -133,7 +129,7 @@
 
 static int __init seeq8005_probe1(struct net_device *dev, int ioaddr)
 {
-	static unsigned version_printed = 0;
+	static unsigned version_printed;
 	int i,j;
 	unsigned char SA_prom[32];
 	int old_cfg1;
@@ -141,33 +137,42 @@
 	int old_stat;
 	int old_dmaar;
 	int old_rear;
+	int retval;
+
+	if (!request_region(ioaddr, SEEQ8005_IO_EXTENT, "seeq8005"))
+		return -ENODEV;
 
 	if (net_debug>1)
 		printk("seeq8005: probing at 0x%x\n",ioaddr);
 
 	old_stat = inw(SEEQ_STATUS);					/* read status register */
-	if (old_stat == 0xffff)
-		return -ENODEV;						/* assume that 0xffff == no device */
+	if (old_stat == 0xffff) {
+		retval = -ENODEV;
+		goto out;						/* assume that 0xffff == no device */
+	}
 	if ( (old_stat & 0x1800) != 0x1800 ) {				/* assume that unused bits are 1, as my manual says */
 		if (net_debug>1) {
 			printk("seeq8005: reserved stat bits != 0x1800\n");
 			printk("          == 0x%04x\n",old_stat);
 		}
-	 	return -ENODEV;
+	 	retval = -ENODEV;
+		goto out;
 	}
 
 	old_rear = inw(SEEQ_REA);
 	if (old_rear == 0xffff) {
 		outw(0,SEEQ_REA);
 		if (inw(SEEQ_REA) == 0xffff) {				/* assume that 0xffff == no device */
-			return -ENODEV;
+			retval = -ENODEV;
+			goto out;
 		}
 	} else if ((old_rear & 0xff00) != 0xff00) {			/* assume that unused bits are 1 */
 		if (net_debug>1) {
 			printk("seeq8005: unused rear bits != 0xff00\n");
 			printk("          == 0x%04x\n",old_rear);
 		}
-		return -ENODEV;
+		retval = -ENODEV;
+		goto out;
 	}
 	
 	old_cfg2 = inw(SEEQ_CFG2);					/* read CFG2 register */
@@ -185,8 +190,8 @@
 	outw( SEEQCMD_FIFO_WRITE | SEEQCMD_SET_ALL_OFF, SEEQ_CMD);	/* setup for reading PROM */
 	outw( 0, SEEQ_DMAAR);						/* set starting PROM address */
 	outw( SEEQCFG1_BUFFER_PROM, SEEQ_CFG1);				/* set buffer to look at PROM */
-	
-	
+
+
 	j=0;
 	for(i=0; i <32; i++) {
 		j+= SA_prom[i] = inw(SEEQ_BUFFER) & 0xff;
@@ -201,7 +206,8 @@
 		outw( old_stat, SEEQ_STATUS);
 		outw( old_dmaar, SEEQ_DMAAR);
 		outw( old_cfg1, SEEQ_CFG1);
-		return -ENODEV;
+		retval = -ENODEV;
+		goto out;
 	}
 #endif
 
@@ -299,14 +305,12 @@
 		 if (irqval) {
 			 printk ("%s: unable to get IRQ %d (irqval=%d).\n", dev->name,
 					 dev->irq, irqval);
-			 return -EAGAIN;
+			 retval = -EAGAIN;
+			 goto out;
 		 }
 	}
 #endif
 
-	/* Grab the region so we can find another board if autoIRQ fails. */
-	request_region(ioaddr, SEEQ8005_IO_EXTENT,"seeq8005");
-
 	/* Initialize the device structure. */
 	dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
 	if (dev->priv == NULL)
@@ -327,6 +331,9 @@
 	dev->flags &= ~IFF_MULTICAST;
 
 	return 0;
+out:
+	release_region(ioaddr, SEEQ8005_IO_EXTENT);
+	return retval;
 }
 
 \f

[-- Attachment #1.12: patch-smc-mca --]
[-- Type: text/plain, Size: 1479 bytes --]

diff -urN /mnt/disk/linux/drivers/net/smc-mca.c /linux/drivers/net/smc-mca.c
--- /mnt/disk/linux/drivers/net/smc-mca.c	Thu Nov  2 22:01:04 2000
+++ /linux/drivers/net/smc-mca.c	Thu Nov  9 00:04:15 2000
@@ -194,7 +194,7 @@
 	}
 
 	if(!adapter_found) {
-		return ((base_addr || irq) ? ENXIO : ENODEV);
+		return ((base_addr || irq) ? -ENXIO : -ENODEV);
 	}
 
         /* Adapter found. */
@@ -249,6 +249,9 @@
 	if (dev->mem_start == 0) /* sanity check, shouldn't happen */
 		return -ENODEV;
 
+	if (!request_region(ioaddr, ULTRA_IO_EXTENT, dev->name))
+		return -EBUSY;
+
 	reg4 = inb(ioaddr + 4) & 0x7f;
 	outb(reg4, ioaddr + 4);
 
@@ -279,14 +282,10 @@
 
 	if (ethdev_init(dev)) {
 		printk (KERN_INFO ", no memory for dev->priv.\n");
+		release_region(ioaddr, ULTRA_IO_EXTENT);
 		return -ENOMEM;
 	}
 
-	/* OK, we are certain this is going to work.  Setup the device.
-	 */
-
-	request_region(ioaddr, ULTRA_IO_EXTENT, "smc-mca");
-
 	/* The 8390 isn't at the base address, so fake the offset
 	 */
 
@@ -322,9 +321,10 @@
 static int ultramca_open(struct net_device *dev)
 {
 	int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */
+	int retval;
 
-	if (request_irq(dev->irq, ei_interrupt, 0, ei_status.name, dev))
-		return -EAGAIN;
+	if ((retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev)))
+		return retval;
 
 	outb(ULTRA_MEMENB, ioaddr); /* Enable memory */
 	outb(0x80, ioaddr + 5);     /* ??? */

[-- Attachment #1.13: patch-smc-ultra --]
[-- Type: text/plain, Size: 3170 bytes --]

diff -urN /mnt/disk/linux/drivers/net/smc-ultra.c /linux/drivers/net/smc-ultra.c
--- /mnt/disk/linux/drivers/net/smc-ultra.c	Thu Nov  2 22:00:58 2000
+++ /linux/drivers/net/smc-ultra.c	Thu Nov  9 00:15:36 2000
@@ -112,41 +112,44 @@
 	else if (base_addr != 0)	/* Don't probe at all. */
 		return -ENXIO;
 
-	for (i = 0; ultra_portlist[i]; i++) {
-		int ioaddr = ultra_portlist[i];
-		if (check_region(ioaddr, ULTRA_IO_EXTENT))
-			continue;
-		if (ultra_probe1(dev, ioaddr) == 0)
+	for (i = 0; ultra_portlist[i]; i++)
+		if (ultra_probe1(dev, ultra_portlist[i]) == 0)
 			return 0;
-	}
 
 	return -ENODEV;
 }
 
 static int __init ultra_probe1(struct net_device *dev, int ioaddr)
 {
-	int i;
+	int i, retval;
 	int checksum = 0;
 	const char *model_name;
 	unsigned char eeprom_irq = 0;
-	static unsigned version_printed = 0;
+	static unsigned version_printed;
 	/* Values from various config regs. */
 	unsigned char num_pages, irqreg, addr, piomode;
 	unsigned char idreg = inb(ioaddr + 7);
 	unsigned char reg4 = inb(ioaddr + 4) & 0x7f;
 
+	if (!request_region(ioaddr, ULTRA_IO_EXTENT, dev->name))
+		return -EBUSY;
+
 	/* Check the ID nibble. */
 	if ((idreg & 0xF0) != 0x20 			/* SMC Ultra */
-		&& (idreg & 0xF0) != 0x40) 		/* SMC EtherEZ */
-		return -ENODEV;
+		&& (idreg & 0xF0) != 0x40) {		/* SMC EtherEZ */
+		retval = -ENODEV;
+		goto out;
+	}
 
 	/* Select the station address register set. */
 	outb(reg4, ioaddr + 4);
 
 	for (i = 0; i < 8; i++)
 		checksum += inb(ioaddr + 8 + i);
-	if ((checksum & 0xff) != 0xFF)
-		return -ENODEV;
+	if ((checksum & 0xff) != 0xFF) {
+		retval = -ENODEV;
+		goto out;
+	}
 
 	if (ei_debug  &&  version_printed++ == 0)
 		printk(version);
@@ -181,7 +184,8 @@
 
 		if (irq == 0) {
 			printk(", failed to detect IRQ line.\n");
-			return -EAGAIN;
+			retval =  -EAGAIN;
+			goto out;
 		}
 		dev->irq = irq;
 		eeprom_irq = 1;
@@ -190,12 +194,10 @@
 	/* Allocate dev->priv and fill in 8390 specific dev fields. */
 	if (ethdev_init(dev)) {
 		printk (", no memory for dev->priv.\n");
-                return -ENOMEM;
+                retval = -ENOMEM;
+		goto out;
         }
 
-	/* OK, we are certain this is going to work.  Setup the device. */
-	request_region(ioaddr, ULTRA_IO_EXTENT, model_name);
-
 	/* The 8390 isn't at the base address, so fake the offset */
 	dev->base_addr = ioaddr+ULTRA_NIC_OFFSET;
 
@@ -236,17 +238,22 @@
 	NS8390_init(dev, 0);
 
 	return 0;
+out:
+	release_region(ioaddr, ULTRA_IO_EXTENT);
+	return retval;
 }
 
 static int
 ultra_open(struct net_device *dev)
 {
+	int retval;
 	int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* ASIC addr */
 	unsigned char irq2reg[] = {0, 0, 0x04, 0x08, 0, 0x0C, 0, 0x40,
-							   0, 0x04, 0x44, 0x48, 0, 0, 0, 0x4C, };
+				   0, 0x04, 0x44, 0x48, 0, 0, 0, 0x4C, };
 
-	if (request_irq(dev->irq, ei_interrupt, 0, ei_status.name, dev))
-		return -EAGAIN;
+	retval = request_irq(dev->irq, ei_interrupt, 0, dev->name, dev);
+	if (retval)
+		return retval;
 
 	outb(0x00, ioaddr);	/* Disable shared memory for safety. */
 	outb(0x80, ioaddr + 5);

[-- Attachment #1.14: patch-smc-ultra32 --]
[-- Type: text/plain, Size: 4433 bytes --]

diff -urN /mnt/disk/linux/drivers/net/smc-ultra32.c /linux/drivers/net/smc-ultra32.c
--- /mnt/disk/linux/drivers/net/smc-ultra32.c	Thu Nov  2 22:01:06 2000
+++ /linux/drivers/net/smc-ultra32.c	Thu Nov  9 00:40:32 2000
@@ -105,48 +105,62 @@
 
 int __init ultra32_probe(struct net_device *dev)
 {
-	const char *ifmap[] = {"UTP No Link", "", "UTP/AUI", "UTP/BNC"};
-	int ioaddr, edge, media;
+	int ioaddr;
 
 	if (!EISA_bus) return -ENODEV;
 
 	/* EISA spec allows for up to 16 slots, but 8 is typical. */
 	for (ioaddr = 0x1000 + ULTRA32_BASE; ioaddr < 0x9000; ioaddr += 0x1000)
-	if (check_region(ioaddr, ULTRA32_IO_EXTENT) == 0 &&
-	    inb(ioaddr + ULTRA32_IDPORT) != 0xff &&
-	    inl(ioaddr + ULTRA32_IDPORT) == ULTRA32_ID) {
-		media = inb(ioaddr + ULTRA32_CFG7) & 0x03;
-		edge = inb(ioaddr + ULTRA32_CFG5) & 0x08;
-		printk("SMC Ultra32 in EISA Slot %d, Media: %s, %s IRQs.\n",
-		       ioaddr >> 12, ifmap[media],
-		       (edge ? "Edge Triggered" : "Level Sensitive"));
 		if (ultra32_probe1(dev, ioaddr) == 0)
-		  return 0;
-	}
+			return 0;
+
 	return -ENODEV;
 }
 
 int __init ultra32_probe1(struct net_device *dev, int ioaddr)
 {
-	int i;
+	int i, edge, media, retval;
 	int checksum = 0;
 	const char *model_name;
-	static unsigned version_printed = 0;
+	static unsigned version_printed;
 	/* Values from various config regs. */
-	unsigned char idreg = inb(ioaddr + 7);
-	unsigned char reg4 = inb(ioaddr + 4) & 0x7f;
+	unsigned char idreg;
+	unsigned char reg4;
+	const char *ifmap[] = {"UTP No Link", "", "UTP/AUI", "UTP/BNC"};
+
+	if (!request_region(ioaddr, ULTRA32_IO_EXTENT, dev->name))
+		return -EBUSY;
+
+	if (inb(ioaddr + ULTRA32_IDPORT) == 0xff ||
+	    inl(ioaddr + ULTRA32_IDPORT) != ULTRA32_ID) {
+		retval = -ENODEV;
+		goto out;
+	}
+
+	media = inb(ioaddr + ULTRA32_CFG7) & 0x03;
+	edge = inb(ioaddr + ULTRA32_CFG5) & 0x08;
+	printk("SMC Ultra32 in EISA Slot %d, Media: %s, %s IRQs.\n",
+		ioaddr >> 12, ifmap[media],
+		(edge ? "Edge Triggered" : "Level Sensitive"));
+
+	idreg = inb(ioaddr + 7);
+	reg4 = inb(ioaddr + 4) & 0x7f;
 
 	/* Check the ID nibble. */
-	if ((idreg & 0xf0) != 0x20) 			/* SMC Ultra */
-		return -ENODEV;
+	if ((idreg & 0xf0) != 0x20) {			/* SMC Ultra */
+		retval = -ENODEV;
+		goto out;
+	}
 
 	/* Select the station address register set. */
 	outb(reg4, ioaddr + 4);
 
 	for (i = 0; i < 8; i++)
 		checksum += inb(ioaddr + 8 + i);
-	if ((checksum & 0xff) != 0xff)
-		return -ENODEV;
+	if ((checksum & 0xff) != 0xff) {
+		retval = -ENODEV;
+		goto out;
+	}
 
 	if (ei_debug  &&  version_printed++ == 0)
 		printk(version);
@@ -175,7 +189,8 @@
 	if ((inb(ioaddr + ULTRA32_CFG5) & 0x40) == 0) {
 		printk("\nsmc-ultra32: Card RAM is disabled!  "
 		       "Run EISA config utility.\n");
-		return -ENODEV;
+		retval = -ENODEV;
+		goto out;
 	}
 	if ((inb(ioaddr + ULTRA32_CFG2) & 0x04) == 0)
 		printk("\nsmc-ultra32: Ignoring Bus-Master enable bit.  "
@@ -186,7 +201,8 @@
 		int irq = irqmap[inb(ioaddr + ULTRA32_CFG5) & 0x07];
 		if (irq == 0) {
 			printk(", failed to detect IRQ line.\n");
-			return -EAGAIN;
+			retval = -EAGAIN;
+			goto out;
 		}
 		dev->irq = irq;
 	}
@@ -194,12 +210,10 @@
 	/* Allocate dev->priv and fill in 8390 specific dev fields. */
 	if (ethdev_init(dev)) {
 		printk (", no memory for dev->priv.\n");
-                return -ENOMEM;
+                retval = -ENOMEM;
+		goto out;
         }
 
-	/* OK, we are certain this is going to work.  Setup the device. */
-	request_region(ioaddr, ULTRA32_IO_EXTENT, model_name);
-
 	/* The 8390 isn't at the base address, so fake the offset */
 	dev->base_addr = ioaddr + ULTRA32_NIC_OFFSET;
 
@@ -229,15 +243,20 @@
 	NS8390_init(dev, 0);
 
 	return 0;
+out:
+	release_region(ioaddr, ULTRA32_IO_EXTENT);
+	return retval;
 }
 
 static int ultra32_open(struct net_device *dev)
 {
 	int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET; /* ASIC addr */
 	int irq_flags = (inb(ioaddr + ULTRA32_CFG5) & 0x08) ? 0 : SA_SHIRQ;
+	int retval;
 
-	if (request_irq(dev->irq, ei_interrupt, irq_flags, ei_status.name, dev))
-		return -EAGAIN;
+	retval = request_irq(dev->irq, ei_interrupt, irq_flags, dev->name, dev);
+	if (retval)
+		return retval;
 
 	outb(ULTRA32_MEMENB, ioaddr); /* Enable Shared Memory. */
 	outb(0x80, ioaddr + ULTRA32_CFG6); /* Enable Interrupts. */

[-- Attachment #2: Type: application/pgp-signature, Size: 232 bytes --]

             reply	other threads:[~2000-11-10 11:30 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2000-11-10 11:29 Andrey Panin [this message]
2000-11-10 14:30 ` [PATCH] NIC drivers check_region() removal continues Jeff Garzik

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20001110142957.A8245@debian \
    --to=pazke@orbita.don.sitek.net \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.