Hi all,
check_region() patches attached. Next patchset will be ready in monday.
Best regards,
Andrey
--
diff -urN /mnt/disk/linux/drivers/net/3c501.c /linux/drivers/net/3c501.c
--- /mnt/disk/linux/drivers/net/3c501.c Tue Sep 12 23:47:56 2000
+++ /linux/drivers/net/3c501.c Thu Sep 28 20:48:23 2000
@@ -246,13 +246,8 @@
return -ENXIO;
for (i = 0; netcard_portlist[i]; i++)
- {
- int ioaddr = netcard_portlist[i];
- if (check_region(ioaddr, EL1_IO_EXTENT))
- continue;
- if (el1_probe1(dev, ioaddr) == 0)
+ if (el1_probe1(dev, netcard_portlist[i]) == 0)
return 0;
- }
return -ENODEV;
}
diff -urN /mnt/disk/linux/drivers/net/3c503.c /linux/drivers/net/3c503.c
--- /mnt/disk/linux/drivers/net/3c503.c Tue Sep 12 23:49:16 2000
+++ /linux/drivers/net/3c503.c Thu Sep 28 21:23:06 2000
@@ -154,14 +154,18 @@
int __init
el2_probe1(struct net_device *dev, int ioaddr)
{
- int i, iobase_reg, membase_reg, saved_406, wordlength;
+ int i, iobase_reg, membase_reg, saved_406, wordlength, retval;
static unsigned version_printed = 0;
unsigned long vendor_id;
+ if (!request_region(ioaddr, EL2_IO_EXTENT, "3c503"))
+ return -ENODEV;
+
/* 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
@@ -171,7 +175,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... */
@@ -183,7 +188,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;
}
/* We should have a "dev" from Space.c or the static module table. */
@@ -191,8 +197,10 @@
printk("3c503.c: Passed a NULL device.\n");
dev = init_etherdev(0, 0);
- if (!dev)
- return -ENOMEM;
+ if (!dev) {
+ retval = -ENOMEM;
+ goto out;
+ }
}
if (ei_debug && version_printed++ == 0)
@@ -202,8 +210,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);
@@ -302,8 +311,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) {
@@ -330,6 +337,9 @@
dev->name, ei_status.name, (wordlength+1)<<3);
}
return 0;
+out:
+ release_region(ioaddr, EL2_IO_EXTENT);
+ return retval;
}
static int
diff -urN /mnt/disk/linux/drivers/net/3c507.c /linux/drivers/net/3c507.c
--- /mnt/disk/linux/drivers/net/3c507.c Tue Sep 26 19:48:54 2000
+++ /linux/drivers/net/3c507.c Thu Sep 28 22:42:41 2000
@@ -317,13 +317,9 @@
else if (base_addr != 0)
return -ENXIO; /* Don't probe at all. */
- for (i = 0; netcard_portlist[i]; i++) {
- int ioaddr = netcard_portlist[i];
- if (check_region(ioaddr, EL16_IO_EXTENT))
- continue;
- if (el16_probe1(dev, ioaddr) == 0)
+ for (i = 0; netcard_portlist[i]; i++)
+ if (el16_probe1(dev, netcard_portlist[i]) == 0)
return 0;
- }
return -ENODEV;
}
@@ -331,7 +327,7 @@
static int __init el16_probe1(struct net_device *dev, int ioaddr)
{
static unsigned char init_ID_done = 0, version_printed = 0;
- int i, irq, irqval;
+ int i, irq, irqval, retval;
struct net_local *lp;
if (init_ID_done == 0) {
@@ -348,15 +344,21 @@
init_ID_done = 1;
}
- if (inb(ioaddr) == '*' && inb(ioaddr+1) == '3'
- && inb(ioaddr+2) == 'C' && inb(ioaddr+3) == 'O')
- ;
- else
+ if (!request_region(ioaddr, EL16_IO_EXTENT, "3c507"))
return -ENODEV;
+ if ((inb(ioaddr) != '*') || (inb(ioaddr + 1) != '3') ||
+ (inb(ioaddr + 2) != 'C') || (inb(ioaddr + 3) != 'O')) {
+ retval = -ENODEV;
+ goto out;
+ }
+
/* Allocate a new 'dev' if needed. */
if (dev == NULL)
- dev = init_etherdev(0, 0);
+ if (!(dev = init_etherdev(0, 0))) {
+ retval = -ENOMEM;
+ goto out;
+ }
if (net_debug && version_printed++ == 0)
printk(version);
@@ -371,11 +373,11 @@
irqval = request_irq(irq, &el16_interrupt, 0, "3c507", dev);
if (irqval) {
printk ("unable to get IRQ %d (irqval=%d).\n", irq, irqval);
- return -EAGAIN;
+ retval = -EAGAIN;
+ goto out;
}
/* We've committed to using the board, and can start filling in *dev. */
- request_region(ioaddr, EL16_IO_EXTENT, "3c507");
dev->base_addr = ioaddr;
outb(0x01, ioaddr + MISC_CTRL);
@@ -419,8 +421,10 @@
/* Initialize the device structure. */
lp = dev->priv = kmalloc(sizeof(struct net_local), GFP_KERNEL);
- if (dev->priv == NULL)
- return -ENOMEM;
+ if (dev->priv == NULL) {
+ retval = -ENOMEM;
+ goto out;
+ }
memset(dev->priv, 0, sizeof(struct net_local));
spin_lock_init(&lp->lock);
@@ -436,6 +440,9 @@
dev->flags&=~IFF_MULTICAST; /* Multicast doesn't work */
return 0;
+out:
+ release_region(ioaddr, EL16_IO_EXTENT);
+ return retval;
}
static int el16_open(struct net_device *dev)
--- /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)