patch-2.4.0-test11 linux/drivers/net/smc-ultra.c
Next file: linux/drivers/net/smc-ultra32.c
Previous file: linux/drivers/net/smc-mca.c
Back to the patch index
Back to the overall index
- Lines: 134
- Date:
Sat Nov 11 18:56:58 2000
- Orig file:
v2.4.0-test10/linux/drivers/net/smc-ultra.c
- Orig date:
Tue Oct 31 12:42:26 2000
diff -u --recursive --new-file v2.4.0-test10/linux/drivers/net/smc-ultra.c linux/drivers/net/smc-ultra.c
@@ -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);
@@ -429,9 +436,6 @@
{
int this_dev, found = 0;
- if (load_8390_module("smc-ultra.c"))
- return -ENOSYS;
-
for (this_dev = 0; this_dev < MAX_ULTRA_CARDS; this_dev++) {
struct net_device *dev = &dev_ultra[this_dev];
dev->irq = irq[this_dev];
@@ -444,7 +448,6 @@
if (register_netdev(dev) != 0) {
printk(KERN_WARNING "smc-ultra.c: No SMC Ultra card found (i/o = 0x%x).\n", io[this_dev]);
if (found != 0) return 0; /* Got at least one. */
- unload_8390_module();
return -ENXIO;
}
found++;
@@ -468,7 +471,6 @@
kfree(dev->priv);
}
}
- unload_8390_module();
}
#endif /* MODULE */
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)