Commit 4a513ec1 authored by Stephen Hemminger's avatar Stephen Hemminger

[IRDA]: Convert irlan to use alloc_netdev().

parent 8eff18f1
...@@ -162,7 +162,7 @@ struct irlan_provider_cb { ...@@ -162,7 +162,7 @@ struct irlan_provider_cb {
struct irlan_cb { struct irlan_cb {
int magic; int magic;
struct list_head dev_list; struct list_head dev_list;
struct net_device dev; /* Ethernet device structure*/ struct net_device *dev; /* Ethernet device structure*/
struct net_device_stats stats; struct net_device_stats stats;
__u32 saddr; /* Source device address */ __u32 saddr; /* Source device address */
......
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
#ifndef IRLAN_ETH_H #ifndef IRLAN_ETH_H
#define 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_open(struct net_device *dev);
int irlan_eth_close(struct net_device *dev); int irlan_eth_close(struct net_device *dev);
int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb); int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb);
......
...@@ -512,7 +512,7 @@ static void irlan_check_response_param(struct irlan_cb *self, char *param, ...@@ -512,7 +512,7 @@ static void irlan_check_response_param(struct irlan_cb *self, char *param,
bytes[0], bytes[1], bytes[2], bytes[3], bytes[4], bytes[0], bytes[1], bytes[2], bytes[3], bytes[4],
bytes[5]); bytes[5]);
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
self->dev.dev_addr[i] = bytes[i]; self->dev->dev_addr[i] = bytes[i];
} }
} }
......
...@@ -173,33 +173,6 @@ void __exit irlan_cleanup(void) ...@@ -173,33 +173,6 @@ void __exit irlan_cleanup(void)
rtnl_unlock(); rtnl_unlock();
} }
/*
* 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) * Function irlan_open (void)
* *
...@@ -208,30 +181,25 @@ int irlan_register_netdev(struct irlan_cb *self) ...@@ -208,30 +181,25 @@ int irlan_register_netdev(struct irlan_cb *self)
*/ */
struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr) struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr)
{ {
struct net_device *dev;
struct irlan_cb *self; struct irlan_cb *self;
IRDA_DEBUG(2, "%s()\n", __FUNCTION__ ); IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
/* /* Create network device with irlan */
* Initialize the irlan structure. dev = alloc_netdev(sizeof(*self),
*/ eth ? "eth%d" : "irlan%d",
self = kmalloc(sizeof(struct irlan_cb), GFP_ATOMIC); irlan_eth_setup);
if (self == NULL) if (!dev)
return NULL; return NULL;
memset(self, 0, sizeof(struct irlan_cb)); self = dev->priv;
self->dev = dev;
/* /*
* Initialize local device structure * Initialize local device structure
*/ */
self->magic = IRLAN_MAGIC; 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->saddr = saddr;
self->daddr = daddr; self->daddr = daddr;
...@@ -242,15 +210,22 @@ struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr) ...@@ -242,15 +210,22 @@ struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr)
init_timer(&self->watchdog_timer); init_timer(&self->watchdog_timer);
init_timer(&self->client.kick_timer); init_timer(&self->client.kick_timer);
init_waitqueue_head(&self->open_wait); init_waitqueue_head(&self->open_wait);
list_add_rcu(&self->dev_list, &irlans);
skb_queue_head_init(&self->client.txq); skb_queue_head_init(&self->client.txq);
irlan_next_client_state(self, IRLAN_IDLE); irlan_next_client_state(self, IRLAN_IDLE);
irlan_next_provider_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; return self;
} }
...@@ -258,7 +233,8 @@ struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr) ...@@ -258,7 +233,8 @@ struct irlan_cb *irlan_open(__u32 saddr, __u32 daddr)
* Function __irlan_close (self) * Function __irlan_close (self)
* *
* This function closes and deallocates the IrLAN client instances. Be * 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) static void __irlan_close(struct irlan_cb *self)
{ {
...@@ -283,10 +259,8 @@ static void __irlan_close(struct irlan_cb *self) ...@@ -283,10 +259,8 @@ static void __irlan_close(struct irlan_cb *self)
while ((skb = skb_dequeue(&self->client.txq))) while ((skb = skb_dequeue(&self->client.txq)))
dev_kfree_skb(skb); dev_kfree_skb(skb);
unregister_netdevice(&self->dev); /* Unregister and free self via destructor */
unregister_netdevice(self->dev);
self->magic = 0;
kfree(self);
} }
/* Find any instance of irlan, used for client discovery wakeup */ /* Find any instance of irlan, used for client discovery wakeup */
...@@ -348,7 +322,7 @@ void irlan_connect_indication(void *instance, void *sap, struct qos_info *qos, ...@@ -348,7 +322,7 @@ void irlan_connect_indication(void *instance, void *sap, struct qos_info *qos,
irlan_open_unicast_addr(self); irlan_open_unicast_addr(self);
} }
/* Ready to transfer Ethernet frames (at last) */ /* 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, void irlan_connect_confirm(void *instance, void *sap, struct qos_info *qos,
...@@ -382,7 +356,7 @@ void irlan_connect_confirm(void *instance, void *sap, struct qos_info *qos, ...@@ -382,7 +356,7 @@ void irlan_connect_confirm(void *instance, void *sap, struct qos_info *qos,
irlan_set_multicast_filter(self, TRUE); irlan_set_multicast_filter(self, TRUE);
/* Ready to transfer Ethernet frames */ /* Ready to transfer Ethernet frames */
netif_start_queue(&self->dev); netif_start_queue(self->dev);
self->disconnect_reason = 0; /* Clear reason */ self->disconnect_reason = 0; /* Clear reason */
#ifdef CONFIG_IRLAN_SEND_GRATUITOUS_ARP #ifdef CONFIG_IRLAN_SEND_GRATUITOUS_ARP
irlan_eth_send_gratuitous_arp(&self->dev); irlan_eth_send_gratuitous_arp(&self->dev);
...@@ -1110,7 +1084,7 @@ static int irlan_proc_read(char *buf, char **start, off_t offset, int len) ...@@ -1110,7 +1084,7 @@ static int irlan_proc_read(char *buf, char **start, off_t offset, int len)
ASSERT(self->magic == IRLAN_MAGIC, break;); ASSERT(self->magic == IRLAN_MAGIC, break;);
len += sprintf(buf+len, "ifname: %s,\n", len += sprintf(buf+len, "ifname: %s,\n",
self->dev.name); self->dev->name);
len += sprintf(buf+len, "client state: %s, ", len += sprintf(buf+len, "client state: %s, ",
irlan_state[ self->client.state]); irlan_state[ self->client.state]);
len += sprintf(buf+len, "provider state: %s,\n", len += sprintf(buf+len, "provider state: %s,\n",
...@@ -1132,7 +1106,7 @@ static int irlan_proc_read(char *buf, char **start, off_t offset, int len) ...@@ -1132,7 +1106,7 @@ static int irlan_proc_read(char *buf, char **start, off_t offset, int len)
buf+len); buf+len);
len += sprintf(buf+len, "tx busy: %s\n", 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"); len += sprintf(buf+len, "\n");
} }
......
...@@ -47,14 +47,12 @@ ...@@ -47,14 +47,12 @@
* The network device initialization function. * 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; struct irlan_cb *self;
IRDA_DEBUG(2, "%s()\n", __FUNCTION__ ); IRDA_DEBUG(2, "%s()\n", __FUNCTION__ );
ASSERT(dev != NULL, return -1;);
self = (struct irlan_cb *) dev->priv; self = (struct irlan_cb *) dev->priv;
dev->open = irlan_eth_open; dev->open = irlan_eth_open;
...@@ -62,6 +60,8 @@ int irlan_eth_init(struct net_device *dev) ...@@ -62,6 +60,8 @@ int irlan_eth_init(struct net_device *dev)
dev->hard_start_xmit = irlan_eth_xmit; dev->hard_start_xmit = irlan_eth_xmit;
dev->get_stats = irlan_eth_get_stats; dev->get_stats = irlan_eth_get_stats;
dev->set_multicast_list = irlan_eth_set_multicast_list; dev->set_multicast_list = irlan_eth_set_multicast_list;
dev->destructor = (void (*)(struct net_device *)) kfree;
SET_MODULE_OWNER(dev); SET_MODULE_OWNER(dev);
ether_setup(dev); ether_setup(dev);
...@@ -85,8 +85,6 @@ int irlan_eth_init(struct net_device *dev) ...@@ -85,8 +85,6 @@ int irlan_eth_init(struct net_device *dev)
get_random_bytes(dev->dev_addr+4, 1); get_random_bytes(dev->dev_addr+4, 1);
get_random_bytes(dev->dev_addr+5, 1); get_random_bytes(dev->dev_addr+5, 1);
} }
return 0;
} }
/* /*
...@@ -237,7 +235,7 @@ int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb) ...@@ -237,7 +235,7 @@ int irlan_eth_receive(void *instance, void *sap, struct sk_buff *skb)
* might have been previously set by the low level IrDA network * might have been previously set by the low level IrDA network
* device driver * device driver
*/ */
skb->dev = &self->dev; skb->dev = self->dev;
skb->protocol=eth_type_trans(skb, skb->dev); /* Remove eth header */ skb->protocol=eth_type_trans(skb, skb->dev); /* Remove eth header */
self->stats.rx_packets++; self->stats.rx_packets++;
...@@ -264,7 +262,7 @@ void irlan_eth_flow_indication(void *instance, void *sap, LOCAL_FLOW flow) ...@@ -264,7 +262,7 @@ void irlan_eth_flow_indication(void *instance, void *sap, LOCAL_FLOW flow)
ASSERT(self != NULL, return;); ASSERT(self != NULL, return;);
ASSERT(self->magic == IRLAN_MAGIC, return;); ASSERT(self->magic == IRLAN_MAGIC, return;);
dev = &self->dev; dev = self->dev;
ASSERT(dev != NULL, return;); ASSERT(dev != NULL, return;);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment