aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/wavelan_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/wavelan_cs.c')
-rw-r--r--drivers/net/wireless/wavelan_cs.c46
1 files changed, 16 insertions, 30 deletions
diff --git a/drivers/net/wireless/wavelan_cs.c b/drivers/net/wireless/wavelan_cs.c
index daa17dc34320..baa1011e70e0 100644
--- a/drivers/net/wireless/wavelan_cs.c
+++ b/drivers/net/wireless/wavelan_cs.c
@@ -4081,7 +4081,7 @@ wv_pcmcia_config(dev_link_t * link)
4081 } 4081 }
4082 4082
4083 strcpy(((net_local *) netdev_priv(dev))->node.dev_name, dev->name); 4083 strcpy(((net_local *) netdev_priv(dev))->node.dev_name, dev->name);
4084 link->dev = &((net_local *) netdev_priv(dev))->node; 4084 link->dev_node = &((net_local *) netdev_priv(dev))->node;
4085 4085
4086#ifdef DEBUG_CONFIG_TRACE 4086#ifdef DEBUG_CONFIG_TRACE
4087 printk(KERN_DEBUG "<-wv_pcmcia_config()\n"); 4087 printk(KERN_DEBUG "<-wv_pcmcia_config()\n");
@@ -4583,7 +4583,6 @@ wavelan_close(struct net_device * dev)
4583static int 4583static int
4584wavelan_attach(struct pcmcia_device *p_dev) 4584wavelan_attach(struct pcmcia_device *p_dev)
4585{ 4585{
4586 dev_link_t * link; /* Info for cardmgr */
4587 struct net_device * dev; /* Interface generic data */ 4586 struct net_device * dev; /* Interface generic data */
4588 net_local * lp; /* Interface specific data */ 4587 net_local * lp; /* Interface specific data */
4589 4588
@@ -4591,34 +4590,26 @@ wavelan_attach(struct pcmcia_device *p_dev)
4591 printk(KERN_DEBUG "-> wavelan_attach()\n"); 4590 printk(KERN_DEBUG "-> wavelan_attach()\n");
4592#endif 4591#endif
4593 4592
4594 /* Initialize the dev_link_t structure */
4595 link = kzalloc(sizeof(struct dev_link_t), GFP_KERNEL);
4596 if (!link) return -ENOMEM;
4597
4598 /* The io structure describes IO port mapping */ 4593 /* The io structure describes IO port mapping */
4599 link->io.NumPorts1 = 8; 4594 p_dev->io.NumPorts1 = 8;
4600 link->io.Attributes1 = IO_DATA_PATH_WIDTH_8; 4595 p_dev->io.Attributes1 = IO_DATA_PATH_WIDTH_8;
4601 link->io.IOAddrLines = 3; 4596 p_dev->io.IOAddrLines = 3;
4602 4597
4603 /* Interrupt setup */ 4598 /* Interrupt setup */
4604 link->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT; 4599 p_dev->irq.Attributes = IRQ_TYPE_EXCLUSIVE | IRQ_HANDLE_PRESENT;
4605 link->irq.IRQInfo1 = IRQ_LEVEL_ID; 4600 p_dev->irq.IRQInfo1 = IRQ_LEVEL_ID;
4606 link->irq.Handler = wavelan_interrupt; 4601 p_dev->irq.Handler = wavelan_interrupt;
4607 4602
4608 /* General socket configuration */ 4603 /* General socket configuration */
4609 link->conf.Attributes = CONF_ENABLE_IRQ; 4604 p_dev->conf.Attributes = CONF_ENABLE_IRQ;
4610 link->conf.IntType = INT_MEMORY_AND_IO; 4605 p_dev->conf.IntType = INT_MEMORY_AND_IO;
4611
4612 /* Chain drivers */
4613 link->next = NULL;
4614 4606
4615 /* Allocate the generic data structure */ 4607 /* Allocate the generic data structure */
4616 dev = alloc_etherdev(sizeof(net_local)); 4608 dev = alloc_etherdev(sizeof(net_local));
4617 if (!dev) { 4609 if (!dev)
4618 kfree(link);
4619 return -ENOMEM; 4610 return -ENOMEM;
4620 } 4611
4621 link->priv = link->irq.Instance = dev; 4612 p_dev->priv = p_dev->irq.Instance = dev;
4622 4613
4623 lp = netdev_priv(dev); 4614 lp = netdev_priv(dev);
4624 4615
@@ -4635,7 +4626,6 @@ wavelan_attach(struct pcmcia_device *p_dev)
4635 spin_lock_init(&lp->spinlock); 4626 spin_lock_init(&lp->spinlock);
4636 4627
4637 /* back links */ 4628 /* back links */
4638 lp->link = link;
4639 lp->dev = dev; 4629 lp->dev = dev;
4640 4630
4641 /* wavelan NET3 callbacks */ 4631 /* wavelan NET3 callbacks */
@@ -4661,11 +4651,8 @@ wavelan_attach(struct pcmcia_device *p_dev)
4661 /* Other specific data */ 4651 /* Other specific data */
4662 dev->mtu = WAVELAN_MTU; 4652 dev->mtu = WAVELAN_MTU;
4663 4653
4664 link->handle = p_dev; 4654 p_dev->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
4665 p_dev->instance = link; 4655 if(wv_pcmcia_config(p_dev) &&
4666
4667 link->state |= DEV_PRESENT | DEV_CONFIG_PENDING;
4668 if(wv_pcmcia_config(link) &&
4669 wv_hw_config(dev)) 4656 wv_hw_config(dev))
4670 wv_init_info(dev); 4657 wv_init_info(dev);
4671 else 4658 else
@@ -4713,14 +4700,13 @@ wavelan_detach(struct pcmcia_device *p_dev)
4713 4700
4714 /* Remove ourselves from the kernel list of ethernet devices */ 4701 /* Remove ourselves from the kernel list of ethernet devices */
4715 /* Warning : can't be called from interrupt, timer or wavelan_close() */ 4702 /* Warning : can't be called from interrupt, timer or wavelan_close() */
4716 if (link->dev) 4703 if (link->dev_node)
4717 unregister_netdev(dev); 4704 unregister_netdev(dev);
4718 link->dev = NULL; 4705 link->dev_node = NULL;
4719 ((net_local *)netdev_priv(dev))->link = NULL; 4706 ((net_local *)netdev_priv(dev))->link = NULL;
4720 ((net_local *)netdev_priv(dev))->dev = NULL; 4707 ((net_local *)netdev_priv(dev))->dev = NULL;
4721 free_netdev(dev); 4708 free_netdev(dev);
4722 } 4709 }
4723 kfree(link);
4724 4710
4725#ifdef DEBUG_CALLBACK_TRACE 4711#ifdef DEBUG_CALLBACK_TRACE
4726 printk(KERN_DEBUG "<- wavelan_detach()\n"); 4712 printk(KERN_DEBUG "<- wavelan_detach()\n");