smc-mca.c: - use ei_alloc_dev() - register device when up, not before - fix some mem leaks - kill ethdev_init() --- 1.9/drivers/net/smc-mca.c Wed May 21 05:02:20 2003 +++ edited/smc-mca.c Sun Jun 29 23:37:54 2003 @@ -51,6 +51,8 @@ #include "8390.h" #include "smc-mca.h" +#define DRVNAME "smc-mca" + static int ultramca_open(struct net_device *dev); static void ultramca_reset_8390(struct net_device *dev); static void ultramca_get_8390_hdr(struct net_device *dev, @@ -132,7 +134,7 @@ struct mca_device *mca_dev = to_mca_device(gen_dev); char slot = mca_dev->slot; unsigned char pos2 = 0xff, pos3 = 0xff, pos4 = 0xff, pos5 = 0xff; - int i; + int i, err; int adapter = mca_dev->index; int tbase = 0; int tirq = 0; @@ -202,18 +204,16 @@ return -ENXIO; /* Adapter found. */ - dev = alloc_etherdev(0); - if(!dev) + dev = ei_alloc_dev(); + if (!dev) return -ENODEV; SET_MODULE_OWNER(dev); SET_NETDEV_DEV(dev, gen_dev); - if((i = register_netdev(dev)) != 0) - return i; printk(KERN_INFO "%s: %s found in slot %d\n", - dev->name, smc_mca_adapter_names[adapter], slot + 1); + DRVNAME, smc_mca_adapter_names[adapter], slot + 1); strncpy(gen_dev->name, smc_mca_adapter_names[adapter], sizeof(gen_dev->name)); mca_device_set_claim(mca_dev, 1); @@ -262,16 +262,20 @@ } } - if (dev->mem_start == 0) /* sanity check, shouldn't happen */ - return -ENODEV; + if (dev->mem_start == 0) { /* sanity check, shouldn't happen */ + err = -ENODEV; + goto out_err; + } - if (!request_region(ioaddr, ULTRA_IO_EXTENT, dev->name)) - return -EBUSY; + if (!request_region(ioaddr, ULTRA_IO_EXTENT, dev->name)) { + err = -EBUSY; + goto out_err; + } reg4 = inb(ioaddr + 4) & 0x7f; outb(reg4, ioaddr + 4); - printk(KERN_INFO "%s: Parameters: %#3x,", dev->name, ioaddr); + printk(KERN_INFO "%s: Parameters: %#3x,", DRVNAME, ioaddr); for (i = 0; i < 6; i++) printk(" %2.2X", dev->dev_addr[i] = inb(ioaddr + 8 + i)); @@ -293,14 +297,6 @@ outb(reg4, ioaddr + 4); - /* Allocate dev->priv and fill in 8390 specific dev fields. - */ - - if (ethdev_init(dev)) { - printk (", no memory for dev->priv.\n"); - release_region(ioaddr, ULTRA_IO_EXTENT); - return -ENOMEM; - } gen_dev->driver_data = dev; /* The 8390 isn't at the base address, so fake the offset @@ -333,7 +329,15 @@ NS8390_init(dev, 0); + err = register_netdev(dev); + if (err) + goto out_err; + return 0; + +out_err: + kfree(dev); + return err; } static int ultramca_open(struct net_device *dev) @@ -357,8 +361,7 @@ * outb(0xff, dev->base_addr + EN0_ERWCNT); */ - ei_open(dev); - return 0; + return ei_open(dev); } static void ultramca_reset_8390(struct net_device *dev) @@ -449,14 +452,14 @@ struct mca_device *mca_dev = to_mca_device(gen_dev); struct net_device *dev = (struct net_device *)gen_dev->driver_data; - if(dev && dev->priv) { + if (dev) { /* NB: ultra_close_card() does free_irq */ int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; mca_device_set_claim(mca_dev, 0); release_region(ioaddr, ULTRA_IO_EXTENT); unregister_netdev(dev); - kfree(dev->priv); + kfree(dev); } return 0; } - : send the line "unsubscribe linux-net" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html