summaryrefslogtreecommitdiffstats
path: root/drivers/net/e2100.c
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1998-08-25 09:12:35 +0000
committerRalf Baechle <ralf@linux-mips.org>1998-08-25 09:12:35 +0000
commitc7fc24dc4420057f103afe8fc64524ebc25c5d37 (patch)
tree3682407a599b8f9f03fc096298134cafba1c9b2f /drivers/net/e2100.c
parent1d793fade8b063fde3cf275bf1a5c2d381292cd9 (diff)
o Merge with Linux 2.1.116.
o New Newport console code. o New G364 console code.
Diffstat (limited to 'drivers/net/e2100.c')
-rw-r--r--drivers/net/e2100.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/drivers/net/e2100.c b/drivers/net/e2100.c
index e4f0393d0..d95d34a4a 100644
--- a/drivers/net/e2100.c
+++ b/drivers/net/e2100.c
@@ -163,6 +163,9 @@ __initfunc(int e21_probe1(struct device *dev, int ioaddr))
inb(ioaddr + E21_MEDIA); /* Point to media selection. */
outb(0, ioaddr + E21_ASIC); /* and disable the secondary interface. */
+ if (load_8390_module("e2100.c"))
+ return -ENOSYS;
+
if (ei_debug && version_printed++ == 0)
printk(version);
@@ -176,6 +179,12 @@ __initfunc(int e21_probe1(struct device *dev, int ioaddr))
for (i = 0; i < 6; i++)
printk(" %02X", station_addr[i]);
+ /* 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;
+ }
+
if (dev->irq < 2) {
int irqlist[] = {15,11,10,12,5,9,3,4}, i;
for (i = 0; i < 8; i++)
@@ -190,12 +199,6 @@ __initfunc(int e21_probe1(struct device *dev, int ioaddr))
} else if (dev->irq == 2) /* Fixup luser bogosity: IRQ2 is really IRQ9 */
dev->irq = 9;
- /* 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;
- }
-
/* Grab the region so we can find a different board if IRQ select fails. */
request_region(ioaddr, E21_IO_EXTENT, "e2100");
@@ -423,12 +426,15 @@ init_module(void)
}
if (register_netdev(dev) != 0) {
printk(KERN_WARNING "e2100.c: No E2100 card found (i/o = 0x%x).\n", io[this_dev]);
- if (found != 0) return 0; /* Got at least one. */
+ if (found != 0) { /* Got at least one. */
+ lock_8390_module();
+ return 0;
+ }
return -ENXIO;
}
found++;
}
-
+ lock_8390_module();
return 0;
}
@@ -440,13 +446,15 @@ cleanup_module(void)
for (this_dev = 0; this_dev < MAX_E21_CARDS; this_dev++) {
struct device *dev = &dev_e21[this_dev];
if (dev->priv != NULL) {
+ void *priv = dev->priv;
/* NB: e21_close() handles free_irq */
- unregister_netdev(dev);
- kfree(dev->priv);
- dev->priv = NULL;
release_region(dev->base_addr, E21_IO_EXTENT);
+ dev->priv = NULL;
+ unregister_netdev(dev);
+ kfree(priv);
}
}
+ unlock_8390_module();
}
#endif /* MODULE */