patch-2.4.0-test10 linux/drivers/net/ni52.c
Next file: linux/drivers/net/pcmcia/3c574_cs.c
Previous file: linux/drivers/net/ni5010.c
Back to the patch index
Back to the overall index
- Lines: 157
- Date:
Mon Oct 30 12:24:22 2000
- Orig file:
v2.4.0-test9/linux/drivers/net/ni52.c
- Orig date:
Mon Jun 19 13:30:56 2000
diff -u --recursive --new-file v2.4.0-test9/linux/drivers/net/ni52.c linux/drivers/net/ni52.c
@@ -362,11 +362,9 @@
#endif
int base_addr = dev->base_addr;
- if (base_addr > 0x1ff) { /* Check a single specified location. */
- if( (inb(base_addr+NI52_MAGIC1) == NI52_MAGICVAL1) &&
- (inb(base_addr+NI52_MAGIC2) == NI52_MAGICVAL2))
- return ni52_probe1(dev, base_addr);
- } else if (base_addr > 0) /* Don't probe at all. */
+ if (base_addr > 0x1ff) /* Check a single specified location. */
+ return ni52_probe1(dev, base_addr);
+ else if (base_addr > 0) /* Don't probe at all. */
return -ENXIO;
#ifdef MODULE
@@ -374,29 +372,15 @@
#else
for (port = ports; *port; port++) {
int ioaddr = *port;
- if (check_region(ioaddr, NI52_TOTAL_SIZE))
- continue;
- if( !(inb(ioaddr+NI52_MAGIC1) == NI52_MAGICVAL1) ||
- !(inb(ioaddr+NI52_MAGIC2) == NI52_MAGICVAL2))
- continue;
-
dev->base_addr = ioaddr;
if (ni52_probe1(dev, ioaddr) == 0)
return 0;
}
#ifdef FULL_IO_PROBE
- for(dev->base_addr=0x200;dev->base_addr<0x400;dev->base_addr+=8)
- {
- int ioaddr = dev->base_addr;
- if (check_region(ioaddr, NI52_TOTAL_SIZE))
- continue;
- if( !(inb(ioaddr+NI52_MAGIC1) == NI52_MAGICVAL1) ||
- !(inb(ioaddr+NI52_MAGIC2) == NI52_MAGICVAL2))
- continue;
- if (ni52_probe1(dev, ioaddr) == 0)
+ for(dev->base_addr=0x200; dev->base_addr<0x400; dev->base_addr+=8)
+ if (ni52_probe1(dev, dev->base_addr) == 0)
return 0;
- }
#endif
#endif
@@ -407,33 +391,42 @@
static int __init ni52_probe1(struct net_device *dev,int ioaddr)
{
- int i,size;
+ int i, size, retval;
+
+ if (!request_region(ioaddr, NI52_TOTAL_SIZE, "ni5210"))
+ return -ENODEV;
+
+ if( !(inb(ioaddr+NI52_MAGIC1) == NI52_MAGICVAL1) ||
+ !(inb(ioaddr+NI52_MAGIC2) == NI52_MAGICVAL2)) {
+ retval = -ENODEV;
+ goto out;
+ }
for(i=0;i<ETH_ALEN;i++)
dev->dev_addr[i] = inb(dev->base_addr+i);
if(dev->dev_addr[0] != NI52_ADDR0 || dev->dev_addr[1] != NI52_ADDR1
- || dev->dev_addr[2] != NI52_ADDR2)
- return -ENODEV;
+ || dev->dev_addr[2] != NI52_ADDR2) {
+ retval = -ENODEV;
+ goto out;
+ }
printk("%s: NI5210 found at %#3lx, ",dev->name,dev->base_addr);
- request_region(ioaddr,NI52_TOTAL_SIZE,"ni5210");
-
/*
* check (or search) IO-Memory, 8K and 16K
*/
#ifdef MODULE
size = dev->mem_end - dev->mem_start;
- if(size != 0x2000 && size != 0x4000)
- {
+ if(size != 0x2000 && size != 0x4000) {
printk("\n%s: Illegal memory size %d. Allowed is 0x2000 or 0x4000 bytes.\n",dev->name,size);
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
- if(!check586(dev,(char *) dev->mem_start,size))
- {
+ if(!check586(dev,(char *) dev->mem_start,size)) {
printk("?memcheck, Can't find memory at 0x%lx with size %d!\n",dev->mem_start,size);
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
#else
if(dev->mem_start != 0) /* no auto-mem-probe */
@@ -443,7 +436,8 @@
size = 0x2000; /* check for 8K mem */
if(!check586(dev,(char *) dev->mem_start,size)) {
printk("?memprobe, Can't find memory at 0x%lx!\n",dev->mem_start);
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
}
}
@@ -455,7 +449,8 @@
{
if(!memaddrs[i]) {
printk("?memprobe, Can't find io-memory!\n");
- return -ENODEV;
+ retval = -ENODEV;
+ goto out;
}
dev->mem_start = memaddrs[i];
size = 0x2000; /* check for 8K mem */
@@ -470,10 +465,10 @@
#endif
dev->priv = (void *) kmalloc(sizeof(struct priv),GFP_KERNEL);
- if(dev->priv == NULL)
- {
+ if(dev->priv == NULL) {
printk("%s: Ooops .. can't allocate private driver memory.\n",dev->name);
- return -ENOMEM;
+ retval = -ENOMEM;
+ goto out;
}
/* warning: we don't free it on errors */
memset((char *) dev->priv,0,sizeof(struct priv));
@@ -498,7 +493,10 @@
if(!(dev->irq = autoirq_report(2)))
{
printk("?autoirq, Failed to detect IRQ line!\n");
- return 1;
+ kfree(dev->priv);
+ dev->priv = NULL;
+ retval = -EAGAIN;
+ goto out;
}
printk("IRQ %d (autodetected).\n",dev->irq);
}
@@ -521,6 +519,9 @@
ether_setup(dev);
return 0;
+out:
+ release_region(ioaddr, NI52_TOTAL_SIZE);
+ return retval;
}
/**********************************************
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)