[PATCH] (2/4) convert irlan to use alloc_netdev

STALE8420d

4 messages, 3 authors, 2003-08-20 · open the first message on its own page

[PATCH] (2/4) convert irlan to use alloc_netdev

From: Stephen Hemminger <hidden>
Date: 2003-08-18 18:49:30

This patch to 2.6.0-test3 converts irlan to use alloc_netdev.

Setup auto free via destructor.

diff -Nru a/include/net/irda/irlan_common.h b/include/net/irda/irlan_common.h
--- a/include/net/irda/irlan_common.h	Mon Aug 18 11:09:33 2003
+++ b/include/net/irda/irlan_common.h	Mon Aug 18 11:09:33 2003
@@ -162,7 +162,7 @@
 struct irlan_cb {
 	int    magic;
 	struct list_head  dev_list;
-	struct net_device dev;        /* Ethernet device structure*/
+	struct net_device *dev;        /* Ethernet device structure*/
 	struct net_device_stats stats;
 
 	__u32 saddr;               /* Source device address */
diff -Nru a/include/net/irda/irlan_eth.h b/include/net/irda/irlan_eth.h
--- a/include/net/irda/irlan_eth.h	Mon Aug 18 11:09:33 2003
+++ b/include/net/irda/irlan_eth.h	Mon Aug 18 11:09:33 2003
@@ -25,7 +25,7 @@
 #ifndef IRLAN_ETH_H
 #define IRLAN_ETH_H
 
-int  irlan_eth_init(struct net_device *dev);
+void  irlan_eth_setup(struct net_device *dev);
 int  irlan_eth_open(struct net_device *dev);
 int  irlan_eth_close(struct net_device *dev);
 int  irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb);
diff -Nru a/net/irda/irlan/irlan_client.c b/net/irda/irlan/irlan_client.c
--- a/net/irda/irlan/irlan_client.c	Mon Aug 18 11:09:33 2003
+++ b/net/irda/irlan/irlan_client.c	Mon Aug 18 11:09:33 2003
@@ -512,7 +512,7 @@
 		      bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], 
 		      bytes[5]);
 		for (i = 0; i < 6; i++) 
-			self->dev.dev_addr[i] = bytes[i];
+			self->dev->dev_addr[i] = bytes[i];
 	}
 }
 
diff -Nru a/net/irda/irlan/irlan_common.c b/net/irda/irlan/irlan_common.c
--- a/net/irda/irlan/irlan_common.c	Mon Aug 18 11:09:33 2003
+++ b/net/irda/irlan/irlan_common.c	Mon Aug 18 11:09:33 2003
@@ -174,33 +174,6 @@
 }
 
 /*
- * Function irlan_register_netdev (self)
- *
- *    Registers the network device to be used. We should don't register until
- *    we have been binded to a particular provider or client.
- */
-int irlan_register_netdev(struct irlan_cb *self)
-{
-	int i=0;
-
-	IRDA_DEBUG(0, "%s()\n", __FUNCTION__ );
-
-	/* Check if we should call the device eth<x> or irlan<x> */
-	if (!eth) {
-		/* Get the first free irlan<x> name */
-		do {
-			sprintf(self->dev.name, "%s%d", "irlan", i++);
-		} while (dev_get(self->dev.name));
-	}
-	
-	if (register_netdev(&self->dev) != 0) {
-		IRDA_DEBUG(2, "%s(), register_netdev() failed!\n", __FUNCTION__ );
-		return -1;
-	}
-	return 0;
-}
-
-/*
  * Function irlan_open (void)
  *
  *    Open new instance of a client/provider, we should only register the 
@@ -208,30 +181,25 @@
  */
 struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr)
 {
+	struct net_device *dev;
 	struct irlan_cb *self;
 
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
-	/* 
-	 *  Initialize the irlan structure. 
-	 */
-	self = kmalloc(sizeof(struct irlan_cb), GFP_ATOMIC);
-	if (self == NULL)
+	/* Create network device with irlan */
+	dev = alloc_netdev(sizeof(*self), 
+			   eth ? "eth%d" : "irlan%d", 
+			   irlan_eth_setup);
+	if (!dev)
 		return NULL;
-	
-	memset(self, 0, sizeof(struct irlan_cb));
+
+	self = dev->priv;
+	self->dev = dev;
 
 	/*
 	 *  Initialize local device structure
 	 */
 	self->magic = IRLAN_MAGIC;
-
-	sprintf(self->dev.name, "%s", "unknown");
-
-	self->dev.priv = (void *) self;
-	self->dev.next = NULL;
-	self->dev.init = irlan_eth_init;
-	
 	self->saddr = saddr;
 	self->daddr = daddr;
 
@@ -242,15 +210,22 @@
 	init_timer(&self->watchdog_timer);
 	init_timer(&self->client.kick_timer);
 	init_waitqueue_head(&self->open_wait);	
-
-	list_add_rcu(&self->dev_list, &irlans);
 	
 	skb_queue_head_init(&self->client.txq);
 	
 	irlan_next_client_state(self, IRLAN_IDLE);
 	irlan_next_provider_state(self, IRLAN_IDLE);
 
-	irlan_register_netdev(self);
+	if (register_netdev(dev)) {
+		IRDA_DEBUG(2, "%s(), register_netdev() failed!\n", 
+			   __FUNCTION__ );
+		self = NULL;
+		kfree(dev);
+	} else {
+		rtnl_lock();
+		list_add_rcu(&self->dev_list, &irlans);
+		rtnl_unlock();
+	}
 
 	return self;
 }
@@ -258,7 +233,8 @@
  * Function __irlan_close (self)
  *
  *    This function closes and deallocates the IrLAN client instances. Be 
- *    aware that other functions which calles client_close()
+ *    aware that other functions which calls client_close() must
+ *    remove self from irlans list first.
  */
 static void __irlan_close(struct irlan_cb *self)
 {
@@ -283,10 +259,8 @@
 	while ((skb = skb_dequeue(&self->client.txq)))
 		dev_kfree_skb(skb);
 
-	unregister_netdevice(&self->dev);
-	
-	self->magic = 0;
-	kfree(self);
+	/* Unregister and free self via destructor */
+	unregister_netdevice(self->dev);
 }
 
 /* Find any instance of irlan, used for client discovery wakeup */
@@ -348,7 +322,7 @@
 		irlan_open_unicast_addr(self);
 	}
 	/* Ready to transfer Ethernet frames (at last) */
-	netif_start_queue(&self->dev); /* Clear reason */
+	netif_start_queue(self->dev); /* Clear reason */
 }
 
 void irlan_connect_confirm(void *instance, void *sap, struct qos_info *qos, 
@@ -382,7 +356,7 @@
  	irlan_set_multicast_filter(self, TRUE);
 
 	/* Ready to transfer Ethernet frames */
-	netif_start_queue(&self->dev);
+	netif_start_queue(self->dev);
 	self->disconnect_reason = 0; /* Clear reason */
 #ifdef CONFIG_IRLAN_SEND_GRATUITOUS_ARP
 	irlan_eth_send_gratuitous_arp(&self->dev);
@@ -1110,7 +1084,7 @@
 		ASSERT(self->magic == IRLAN_MAGIC, break;);
 		
 		len += sprintf(buf+len, "ifname: %s,\n",
-			       self->dev.name);
+			       self->dev->name);
 		len += sprintf(buf+len, "client state: %s, ",
 			       irlan_state[ self->client.state]);
 		len += sprintf(buf+len, "provider state: %s,\n",
@@ -1132,7 +1106,7 @@
 					  buf+len);
 			
 		len += sprintf(buf+len, "tx busy: %s\n", 
-			       netif_queue_stopped(&self->dev) ? "TRUE" : "FALSE");
+			       netif_queue_stopped(self->dev) ? "TRUE" : "FALSE");
 			
 		len += sprintf(buf+len, "\n");
  	} 
diff -Nru a/net/irda/irlan/irlan_eth.c b/net/irda/irlan/irlan_eth.c
--- a/net/irda/irlan/irlan_eth.c	Mon Aug 18 11:09:33 2003
+++ b/net/irda/irlan/irlan_eth.c	Mon Aug 18 11:09:33 2003
@@ -47,14 +47,12 @@
  *    The network device initialization function.
  *
  */
-int irlan_eth_init(struct net_device *dev)
+void irlan_eth_setup(struct net_device *dev)
 {
 	struct irlan_cb *self;
 
 	IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
 
-	ASSERT(dev != NULL, return -1;);
-       
 	self = (struct irlan_cb *) dev->priv;
 
 	dev->open               = irlan_eth_open;
@@ -62,6 +60,8 @@
 	dev->hard_start_xmit    = irlan_eth_xmit; 
 	dev->get_stats	        = irlan_eth_get_stats;
 	dev->set_multicast_list = irlan_eth_set_multicast_list;
+	dev->destructor		= (void (*)(struct net_device *)) kfree;
+
 	SET_MODULE_OWNER(dev);
 
 	ether_setup(dev);
@@ -85,8 +85,6 @@
 		get_random_bytes(dev->dev_addr+4, 1);
 		get_random_bytes(dev->dev_addr+5, 1);
 	}
-
-	return 0;
 }
 
 /*
@@ -237,7 +235,7 @@
 	 * might have been previously set by the low level IrDA network
 	 * device driver 
 	 */
-	skb->dev = &self->dev;
+	skb->dev = self->dev;
 	skb->protocol=eth_type_trans(skb, skb->dev); /* Remove eth header */
 	
 	self->stats.rx_packets++;
@@ -264,7 +262,7 @@
 	ASSERT(self != NULL, return;);
 	ASSERT(self->magic == IRLAN_MAGIC, return;);
 	
-	dev = &self->dev;
+	dev = self->dev;
 
 	ASSERT(dev != NULL, return;);
 	
	

Re: [PATCH] (2/4) convert irlan to use alloc_netdev

From: David S. Miller <hidden>
Date: 2003-08-18 18:53:33

Jean, I'd like to merge Stephen's work as I review
it unless you have some hard reason why I shouldn't.

Re: [PATCH] (2/4) convert irlan to use alloc_netdev

From: Jean Tourrilhes <hidden>
Date: 2003-08-18 19:58:36

On Mon, Aug 18, 2003 at 11:53:33AM -0700, David S. Miller wrote:
Jean, I'd like to merge Stephen's work as I review
it unless you have some hard reason why I shouldn't.
	Well, I already told you that I don't maintain IrLAN, so you
are free to do as you wish with IrLAN. It's up to Stephen to see if he
likes my suggestion or not.
	By the way, that's why I try to read Stephen patches as fast
as they come, even though I've got a pile of other work to do.

	Thanks...

	Jean

Re: [PATCH] (2/4) convert irlan to use alloc_netdev

From: David S. Miller <hidden>
Date: 2003-08-20 04:14:52

On Mon, 18 Aug 2003 11:49:30 -0700
Stephen Hemminger [off-list ref] wrote:
This patch to 2.6.0-test3 converts irlan to use alloc_netdev.

Setup auto free via destructor.
Applied, thanks.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help