From 31052a4d271ef4d989c77c84da4a6bd08f12d163 Mon Sep 17 00:00:00 2001 From: Stephen Hemminger <shemminger@osdl.org> Date: Sat, 10 Jan 2004 05:09:12 -0500 Subject: [PATCH] [PATCH] (34/42) mac_mace NE59-mace * switched mace to dynamic allocation * mace: fixed resource leaks on failure exits --- drivers/net/Space.c | 8 ++++---- drivers/net/macmace.c | 28 ++++++++++++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/drivers/net/Space.c b/drivers/net/Space.c index 3596b8722208..6e54e5eaca3a 100644 --- a/drivers/net/Space.c +++ b/drivers/net/Space.c @@ -86,7 +86,7 @@ extern struct net_device *bagetlance_probe(int unit); extern int mvme147lance_probe(struct net_device *dev); extern struct net_device *tc515_probe(int unit); extern struct net_device *lance_probe(int unit); -extern int mace_probe(struct net_device *dev); +extern struct net_device *mace_probe(struct net_device *dev); extern struct net_device *macsonic_probe(int unit); extern struct net_device *mac8390_probe(int unit); extern struct net_device *mac89x0_probe(int unit); @@ -319,14 +319,14 @@ static struct devprobe m68k_probes[] __initdata = { #endif #ifdef CONFIG_MVME147_NET /* MVME147 internal Ethernet */ {mvme147lance_probe, 0}, -#endif -#ifdef CONFIG_MACMACE /* Mac 68k Quadra AV builtin Ethernet */ - {mace_probe, 0}, #endif {NULL, 0}, }; static struct devprobe2 m68k_probes2[] __initdata = { +#ifdef CONFIG_MACMACE /* Mac 68k Quadra AV builtin Ethernet */ + {mace_probe, 0}, +#endif #ifdef CONFIG_MACSONIC /* Mac SONIC-based Ethernet of all sorts */ {macsonic_probe, 0}, #endif diff --git a/drivers/net/macmace.c b/drivers/net/macmace.c index e06740d11531..b8efd1fc5269 100644 --- a/drivers/net/macmace.c +++ b/drivers/net/macmace.c @@ -180,7 +180,7 @@ static void mace_dma_off(struct net_device *dev) * model of Macintrash has a MACE (AV macintoshes) */ -int mace_probe(struct net_device *unused) +struct net_device *mace_probe(int unit) { int j; struct mace_data *mp; @@ -188,13 +188,19 @@ int mace_probe(struct net_device *unused) struct net_device *dev; unsigned char checksum = 0; static int found = 0; + int err; - if (found || macintosh_config->ether_type != MAC_ETHER_MACE) return -ENODEV; + if (found || macintosh_config->ether_type != MAC_ETHER_MACE) + return ERR_PTR(-ENODEV); found = 1; /* prevent 'finding' one on every device probe */ - dev = init_etherdev(0, PRIV_BYTES); - if (!dev) return -ENOMEM; + dev = alloc_etherdev(PRIV_BYTES); + if (!dev) + return ERR_PTR(-ENOMEM); + + if (unit >= 0) + sprintf(dev->name, "eth%d", unit); mp = (struct mace_data *) dev->priv; dev->base_addr = (u32)MACE_BASE; @@ -221,7 +227,10 @@ int mace_probe(struct net_device *unused) checksum ^= bitrev(addr[j<<4]); } - if (checksum != 0xFF) return -ENODEV; + if (checksum != 0xFF) { + free_netdev(dev); + return -ENODEV; + } memset(&mp->stats, 0, sizeof(mp->stats)); @@ -234,13 +243,16 @@ int mace_probe(struct net_device *unused) dev->set_multicast_list = mace_set_multicast; dev->set_mac_address = mace_set_address; - ether_setup(dev); - printk(KERN_INFO "%s: 68K MACE, hardware address %.2X", dev->name, dev->dev_addr[0]); for (j = 1 ; j < 6 ; j++) printk(":%.2X", dev->dev_addr[j]); printk("\n"); - return 0; + err = register_netdev(dev); + if (!err) + return dev; + + free_netdev(dev); + return ERR_PTR(err); } /* -- 2.30.9