netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] (41/42) sun3_lance
@ 2003-11-13  0:47 Stephen Hemminger
  0 siblings, 0 replies; only message in thread
From: Stephen Hemminger @ 2003-11-13  0:47 UTC (permalink / raw)
  To: jgarzik; +Cc: netdev

NE67-sun3lance
	* switched to dynamic allocation
	* fixed resource leaks on failure exits

diff -urN B9-sun3_82586/drivers/net/Space.c B9-sun3_lance/drivers/net/Space.c
--- B9-sun3_82586/drivers/net/Space.c	Tue Nov 11 20:25:10 2003
+++ B9-sun3_lance/drivers/net/Space.c	Tue Nov 11 20:49:12 2003
@@ -75,7 +75,7 @@
 extern struct net_device *seeq8005_probe(int unit);
 extern struct net_device *smc_init(int unit);
 extern int atarilance_probe(struct net_device *);
-extern int sun3lance_probe(struct net_device *);
+extern struct net_device *sun3lance_probe(int unit);
 extern struct net_device *sun3_82586_probe(int unit);
 extern struct net_device *apne_probe(int unit);
 extern struct net_device *bionet_probe(int unit);
@@ -300,13 +300,13 @@
 #ifdef CONFIG_ATARILANCE	/* Lance-based Atari ethernet boards */
 	{atarilance_probe, 0},
 #endif
-#ifdef CONFIG_SUN3LANCE         /* sun3 onboard Lance chip */
-	{sun3lance_probe, 0},
-#endif
 	{NULL, 0},
 };
 
 static struct devprobe2 m68k_probes2[] __initdata = {
+#ifdef CONFIG_SUN3LANCE         /* sun3 onboard Lance chip */
+	{sun3lance_probe, 0},
+#endif
 #ifdef CONFIG_SUN3_82586        /* sun3 onboard Intel 82586 chip */
 	{sun3_82586_probe, 0},
 #endif
diff -urN B9-sun3_82586/drivers/net/sun3lance.c B9-sun3_lance/drivers/net/sun3lance.c
--- B9-sun3_82586/drivers/net/sun3lance.c	Mon May 26 22:21:36 2003
+++ B9-sun3_lance/drivers/net/sun3lance.c	Tue Nov 11 20:49:12 2003
@@ -246,9 +246,11 @@
 
 /************************* End of Prototypes **************************/
 
-int __init sun3lance_probe( struct net_device *dev )
-{	
+struct net_device * __init sun3lance_probe(int unit)
+{
+	struct net_device *dev;
 	static int found;
+	int err = -ENODEV;
 
 	/* check that this machine has an onboard lance */
 	switch(idprom->id_machtype) {
@@ -259,18 +261,37 @@
 		break;
 
 	default:
-		return(-ENODEV);
+		return ERR_PTR(-ENODEV);
 	}
 
-	if(found)
-		return(-ENODEV);
+	if (found)
+		return ERR_PTR(-ENODEV);
 
-	if (lance_probe(dev)) {
-			found = 1;
-			return( 0 );
+	dev = alloc_etherdev(sizeof(struct lance_private));
+	if (!dev)
+		return ERR_PTR(-ENOMEM);
+	if (unit >= 0) {
+		sprintf(dev->name, "eth%d", unit);
+		netdev_boot_setup_check(dev);
 	}
+	SET_MODULE_OWNER(dev);
+
+	if (!lance_probe(dev))
+		goto out;
 
-	return( -ENODEV );
+	err = register_netdev(dev);
+	if (err)
+		goto out1;
+	found = 1;
+	return dev;
+
+out1:
+#ifdef CONFIG_SUN3
+	iounmap(dev->base_addr);
+#endif
+out:
+	free_netdev(dev);
+	return ERR_PTR(err);
 }
 
 static int __init lance_probe( struct net_device *dev)
@@ -285,6 +306,8 @@
 
 #ifdef CONFIG_SUN3
 	ioaddr = (unsigned long)ioremap(LANCE_OBIO, PAGE_SIZE);
+	if (!ioaddr)
+		return 0;
 #else
 	ioaddr = SUN3X_LANCE;
 #endif
@@ -303,17 +326,15 @@
 		ioaddr_probe[0] = tmp1;
 		ioaddr_probe[1] = tmp2;
 
+#ifdef CONFIG_SUN3
+		iounmap(ioaddr);
+#endif
 		return 0;
 	}
 
-	init_etherdev( dev, sizeof(struct lance_private) );
-	if (!dev->priv) {
-		dev->priv = kmalloc( sizeof(struct lance_private), GFP_KERNEL );
-		if (!dev->priv)
-			return 0;
-	}
 	lp = (struct lance_private *)dev->priv;
 
+	/* XXX - leak? */
 	MEM = dvma_malloc_align(sizeof(struct lance_memory), 0x10000);
 
 	lp->iobase = (volatile unsigned short *)ioaddr;
@@ -921,32 +942,24 @@
 
 
 #ifdef MODULE
-static char devicename[9];
 
-static struct net_device sun3lance_dev =
-{
-	devicename,	/* filled in by register_netdev() */
-	0, 0, 0, 0,	/* memory */
-	0, 0,		/* base, irq */
-	0, 0, 0, NULL, sun3lance_probe,
-};
+static struct net_device *sun3lance_dev;
 
 int init_module(void)
 {
-	int err;
-
-	if ((err = register_netdev( &sun3lance_dev ))) {
-		if (err == -EIO)  {
-			printk( "SUN3 Lance not detected.  Module not loaded.\n");
-		}
-		return( err );
-	}
-	return( 0 );
+	sun3lance_dev = sun3lance_probe(-1);
+	if (IS_ERR(sun3lance_dev))
+		return PTR_ERR(sun3lance_dev);
+	return 0;
 }
 
 void cleanup_module(void)
 {
-	unregister_netdev( &sun3lance_dev );
+	unregister_netdev(sun3lance_dev);
+#ifdef CONFIG_SUN3
+	iounmap(sun3lance_dev->base_addr);
+#endif
+	free_netdev(sun3lance_dev);
 }
 
 #endif /* MODULE */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2003-11-13  0:47 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-11-13  0:47 [PATCH] (41/42) sun3_lance Stephen Hemminger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).