diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1998-08-25 09:12:35 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1998-08-25 09:12:35 +0000 |
commit | c7fc24dc4420057f103afe8fc64524ebc25c5d37 (patch) | |
tree | 3682407a599b8f9f03fc096298134cafba1c9b2f /drivers/net/e2100.c | |
parent | 1d793fade8b063fde3cf275bf1a5c2d381292cd9 (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.c | 30 |
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 */ |