linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Andrew Morton <andrewm@uow.edu.au>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: vmabraham@hotmail.com, Steve.Ralston@lsil.com,
	Auvo.Hakkinen@cs.Helsinki.FI, Juha.Sievanen@cs.Helsinki.FI,
	Taneli.Vahakangas@cs.Helsinki.FI, deepak@plexity.net,
	lkml <linux-kernel@vger.kernel.org>,
	netdev@oss.sgi.com
Subject: [patch] remove init_fcdev
Date: Sat, 23 Dec 2000 23:56:52 +1100	[thread overview]
Message-ID: <3A44A114.2A277D95@uow.edu.au> (raw)

Alan,

the patch removes use of the unsafe init_fcdev() and replaces it with
the new prepare_fcdev()/publish_netdev() API as described at

	http://www.uow.edu.au/~andrewm/linux/netdevice2.txt

I changed drivers/i2o/i2o_lan.c:i2o_lan_register_device() to use prepare_fddidev().  Not sure why it wasn't using init_fddidev()
initially?

I also migrated a couple of these drivers over to use
SET_MODULE_OWNER.

Files affected:

drivers/net/fc/iph5526.c
drivers/block/fusion/mptlan.c
drivers/i2o/i2o_lan.c

This all went in pretty cleanly.

A patch for rrunner.c has been sent to Jes so init_hippi_dev() is
done too.



--- linux-2.4.0-test13pre4-ac2/drivers/net/fc/iph5526.c	Sat Dec 23 17:24:20 2000
+++ linux-akpm/drivers/net/fc/iph5526.c	Sat Dec 23 22:02:21 2000
@@ -25,6 +25,7 @@
 07.07.99 Can be loaded as part of the Kernel. Changed semaphores. Added
          more checks before invalidating SEST entries.
 07.08.99 Added Broadcast IP stuff and fixed an unicast timeout bug.
+23Dec00  Use new publish_netdev interface.  Use SET_MODULE_OWNER. (andrewm@uow.edu.au)
 ***********************************************************************/
 /* TODO:
 	R_T_TOV set to 15msec in Loop topology. Need to be 100 msec.
@@ -33,7 +34,7 @@
 */	
 
 static const char *version =
-    "iph5526.c:v1.0 07.08.99 Vineet Abraham (vmabraham@hotmail.com)\n";
+    "iph5526.c:v1.0 23Dec00 Vineet Abraham (vmabraham@hotmail.com)\n";
 
 #include <linux/module.h>
 #include <linux/kernel.h>
@@ -245,7 +246,7 @@
  
 	if(fc[count] != NULL) {
 		if (dev == NULL) {
-			dev = init_fcdev(NULL, 0);
+			dev = prepare_fcdev(NULL, 0);
 			if (dev == NULL)
 				return -ENOMEM;
 		}
@@ -266,6 +267,7 @@
 		dev->dev_addr[4] = (fi->g.my_port_name_low & 0x0000FF00) >> 8;
 		dev->dev_addr[5] = fi->g.my_port_name_low;
 #ifndef MODULE
+		publish_netdev(dev);
 		count++;
 	}
 	else
@@ -2916,14 +2918,12 @@
 static int iph5526_open(struct net_device *dev)
 {
 	netif_start_queue(dev);
-	MOD_INC_USE_COUNT;
 	return 0;
 }
 
 static int iph5526_close(struct net_device *dev)
 {
 	netif_stop_queue(dev);
-	MOD_DEC_USE_COUNT;
 	return 0;
 }
 
@@ -4543,7 +4543,7 @@
 
 	while(fc[i] != NULL) {
 		dev_fc[i] = NULL;
-		dev_fc[i] = init_fcdev(dev_fc[i], 0);	
+		dev_fc[i] = prepare_fcdev(dev_fc[i], 0);	
 		if (dev_fc[i] == NULL) {
 			printk("iph5526.c: init_fcdev failed for card #%d\n", i+1);
 			break;
@@ -4551,16 +4551,20 @@
 		dev_fc[i]->irq = irq;
 		dev_fc[i]->mem_end = bad;
 		dev_fc[i]->base_addr = io;
-		dev_fc[i]->init = iph5526_probe;
+//		dev_fc[i]->init = iph5526_probe;
 		dev_fc[i]->priv = fc[i];
 		fc[i]->dev = dev_fc[i];
-		if (register_fcdev(dev_fc[i]) != 0) {
+		if (iph5526_probe(dev_fc[i]) != 0) {
+			withdraw_netdev(dev_fc[i]);
 			kfree(dev_fc[i]);
 			dev_fc[i] = NULL;
 			if (i == 0) {
 				printk("iph5526.c: IP registeration failed!!!\n");
 				return -ENODEV;
 			}
+		} else {
+			SET_MODULE_OWNER(dev_fc[i]);
+			publish_netdev(dev_fc[i]);
 		}
 		i++;
 	}
@@ -4578,7 +4582,7 @@
 	void *priv = dev->priv;
 		fc[i]->g.dont_init = TRUE;
 		take_tachyon_offline(fc[i]);
-		unregister_fcdev(dev);
+		unregister_netdev(dev);
 		clean_up_memory(fc[i]);
 		if (dev->priv)
 			kfree(priv);
--- linux-2.4.0-test13pre4-ac2/drivers/block/fusion/mptlan.c	Sat Dec 23 17:24:19 2000
+++ linux-akpm/drivers/block/fusion/mptlan.c	Sat Dec 23 22:02:21 2000
@@ -1306,7 +1306,7 @@
 	struct mpt_lan_priv *priv = NULL;
 	u8 HWaddr[FC_ALEN], *a;
 
-	dev = init_fcdev(NULL, sizeof(struct mpt_lan_priv));
+	dev = prepare_fcdev(NULL, sizeof(struct mpt_lan_priv));
 	if (!dev)
 		return (NULL);
 	dev->mtu = MPT_LAN_MTU;
@@ -1378,7 +1378,8 @@
 		"and setting initial values\n"));
 
 	SET_MODULE_OWNER(dev);
-	
+	publish_netdev(dev);
+
 	return dev;
 }
 
@@ -1460,7 +1461,7 @@
 
 		printk (KERN_INFO MYNAM ": %s/%s: Fusion MPT LAN device unregistered.\n",
 			       IOC_AND_NETDEV_NAMES_s_s(dev));
-		unregister_fcdev(dev);
+		unregister_netdev(dev);
 		mpt_landev[i] = (struct net_device *) 0xdeadbeef; /* Debug */
 	}
 
--- linux-2.4.0-test13pre4-ac2/drivers/i2o/i2o_lan.c	Sat Dec 23 17:24:20 2000
+++ linux-akpm/drivers/i2o/i2o_lan.c	Sat Dec 23 22:28:37 2000
@@ -744,11 +744,8 @@
 	struct i2o_controller *iop = i2o_dev->controller;
 	u32 mc_addr_group[64];
 
-	MOD_INC_USE_COUNT;
-
 	if (i2o_claim_device(i2o_dev, &i2o_lan_handler)) {
 		printk(KERN_WARNING "%s: Unable to claim the I2O LAN device.\n", dev->name);
-		MOD_DEC_USE_COUNT;
 		return -EAGAIN;
 	}
 	dprintk(KERN_INFO "%s: I2O LAN device (tid=%d) claimed by LAN OSM.\n",
@@ -765,7 +762,6 @@
 	if (i2o_query_scalar(iop, i2o_dev->lct_data.tid, 0x0001, -1,
 			     &mc_addr_group, sizeof(mc_addr_group)) < 0 ) {
 		printk(KERN_WARNING "%s: Unable to query LAN_MAC_ADDRESS group.\n", dev->name);
-		MOD_DEC_USE_COUNT;
 		return -EAGAIN;
 	}
 	priv->max_size_mc_table = mc_addr_group[8];
@@ -775,7 +771,6 @@
 	priv->i2o_fbl = kmalloc(priv->max_buckets_out * sizeof(struct sk_buff *),
 				GFP_KERNEL);
 	if (priv->i2o_fbl == NULL) {
-		MOD_DEC_USE_COUNT;
 		return -ENOMEM;
 	}
 	priv->i2o_fbl_tail = -1;
@@ -818,8 +813,6 @@
 		ret = -EBUSY;
 	}
 
-	MOD_DEC_USE_COUNT;
-
 	return ret;
 }
 
@@ -1281,15 +1274,13 @@
 	u8 hw_addr[8];
 	u32 tx_max_out = 0;
 	unsigned short (*type_trans)(struct sk_buff *, struct net_device *);
-	void (*unregister_dev)(struct net_device *dev);
 
 	switch (i2o_dev->lct_data.sub_class) {
 	case I2O_LAN_ETHERNET:
-		dev = init_etherdev(NULL, sizeof(struct i2o_lan_local));
+		dev = prepare_etherdev(NULL, sizeof(struct i2o_lan_local));
 		if (dev == NULL)
 			return NULL;
 		type_trans = eth_type_trans;
-		unregister_dev = unregister_netdev;
 		break;
 
 #ifdef CONFIG_ANYLAN
@@ -1304,40 +1295,25 @@
 		dev = prepare_trdev(NULL, sizeof(struct i2o_lan_local));
 		if (dev==NULL)
 			return NULL;
-		publish_netdev(dev);		/* AKPM: racy */
 		type_trans = tr_type_trans;
-		unregister_dev = unregister_netdev;
 		break;
 #endif
 
 #ifdef CONFIG_FDDI
 	case I2O_LAN_FDDI:
 	{
-		int size = sizeof(struct net_device) + sizeof(struct i2o_lan_local);
-
-		dev = (struct net_device *) kmalloc(size, GFP_KERNEL);
+		dev = prepare_fddidev(NULL, sizeof(struct i2o_lan_local));
 		if (dev == NULL)
 			return NULL;
-		memset((char *)dev, 0, size);
-	    	dev->priv = (void *)(dev + 1);
-
-		if (dev_alloc_name(dev, "fddi%d") < 0) {
-			printk(KERN_WARNING "i2o_lan: Too many FDDI devices.\n");
-			kfree(dev);
-			return NULL;
-		}
 		type_trans = fddi_type_trans;
-		unregister_dev = (void *)unregister_netdev;
-
 		fddi_setup(dev);
-		register_netdev(dev);
 	}
 	break;
 #endif
 
 #ifdef CONFIG_NET_FC
 	case I2O_LAN_FIBRE_CHANNEL:
-		dev = init_fcdev(NULL, sizeof(struct i2o_lan_local));
+		dev = prepare_fcdev(NULL, sizeof(struct i2o_lan_local));
 		if (dev == NULL)
 			return NULL;
 		type_trans = NULL;
@@ -1345,7 +1321,6 @@
  * and export it in include/linux/fcdevice.h
  *		type_trans = fc_type_trans;
  */
-		unregister_dev = (void *)unregister_fcdev;
 		break;
 #endif
 
@@ -1382,7 +1357,7 @@
 			     0x0001, 0, &hw_addr, sizeof(hw_addr)) < 0) {
 		printk(KERN_ERR "%s: Unable to query hardware address.\n", dev->name);
 		unit--;
-		unregister_dev(dev);
+		withdraw_netdev(dev);
 		kfree(dev);
 		return NULL;
 	}
@@ -1397,7 +1372,7 @@
 			     0x0007, 2, &tx_max_out, sizeof(tx_max_out)) < 0) {
 		printk(KERN_ERR "%s: Unable to query max TX queue.\n", dev->name);
 		unit--;
-		unregister_dev(dev);
+		withdraw_netdev(dev);
 		kfree(dev);
 		return NULL;
 	}
@@ -1428,6 +1403,8 @@
 	if (i2o_dev->lct_data.sub_class == I2O_LAN_ETHERNET)
 		dev->change_mtu	= i2o_lan_change_mtu;
 
+	SET_MODULE_OWNER(dev);
+	publish_netdev(dev);
 	return dev;
 }
 
@@ -1533,7 +1510,7 @@
 			break;
 #ifdef CONFIG_FDDI
 		case I2O_LAN_FDDI:
-			unregister_netdevice(dev);
+			unregister_netdev(dev);
 			break;
 #endif
 #ifdef CONFIG_TR
@@ -1543,7 +1520,7 @@
 #endif
 #ifdef CONFIG_NET_FC
 		case I2O_LAN_FIBRE_CHANNEL:
-			unregister_fcdev(dev);
+			unregister_netdev(dev);
 			break;
 #endif
 		default:
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

                 reply	other threads:[~2000-12-23 13:25 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3A44A114.2A277D95@uow.edu.au \
    --to=andrewm@uow.edu.au \
    --cc=Auvo.Hakkinen@cs.Helsinki.FI \
    --cc=Juha.Sievanen@cs.Helsinki.FI \
    --cc=Steve.Ralston@lsil.com \
    --cc=Taneli.Vahakangas@cs.Helsinki.FI \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=deepak@plexity.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@oss.sgi.com \
    --cc=vmabraham@hotmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).