This patch updates pcmcia wireless drivers so that their class devices are linked to the correct physical device. Based on an patch by Adam Belay, but adapted to a different pcmcia driver model implementation. Signed-off-by: Dominik Brodowski Index: 2.6.10-rc3/drivers/net/wireless/airo.c =================================================================== --- 2.6.10-rc3.orig/drivers/net/wireless/airo.c 2004-12-05 10:24:14.307671880 +0100 +++ 2.6.10-rc3/drivers/net/wireless/airo.c 2004-12-05 10:26:04.633899744 +0100 @@ -2697,7 +2697,8 @@ } struct net_device *_init_airo_card( unsigned short irq, int port, - int is_pcmcia, struct pci_dev *pci ) + int is_pcmcia, struct pci_dev *pci, + struct device *dmdev ) { struct net_device *dev; struct airo_info *ai; @@ -2759,10 +2760,8 @@ dev->irq = irq; dev->base_addr = port; - /* what is with PCMCIA ??? */ - if (pci) { - SET_NETDEV_DEV(dev, &pci->dev); - } + SET_NETDEV_DEV(dev, dmdev); + if (test_bit(FLAG_MPI,&ai->flags)) reset_card (dev, 1); @@ -2844,9 +2843,10 @@ return NULL; } -struct net_device *init_airo_card( unsigned short irq, int port, int is_pcmcia ) +struct net_device *init_airo_card( unsigned short irq, int port, int is_pcmcia, + struct device *dmdev) { - return _init_airo_card ( irq, port, is_pcmcia, NULL); + return _init_airo_card ( irq, port, is_pcmcia, NULL, dmdev); } EXPORT_SYMBOL(init_airo_card); @@ -5455,9 +5455,9 @@ pci_set_master(pdev); if (pdev->device == 0x5000 || pdev->device == 0xa504) - dev = _init_airo_card(pdev->irq, pdev->resource[0].start, 0, pdev); + dev = _init_airo_card(pdev->irq, pdev->resource[0].start, 0, pdev, &pdev->dev); else - dev = _init_airo_card(pdev->irq, pdev->resource[2].start, 0, pdev); + dev = _init_airo_card(pdev->irq, pdev->resource[2].start, 0, pdev, &pdev->dev); if (!dev) return -ENODEV; @@ -5559,7 +5559,7 @@ printk( KERN_INFO "airo: Trying to configure ISA adapter at irq=%d io=0x%x\n", irq[i], io[i] ); - if (init_airo_card( irq[i], io[i], 0 )) + if (init_airo_card( irq[i], io[i], 0, NULL )) have_isa_dev = 1; } Index: 2.6.10-rc3/drivers/net/wireless/airo_cs.c =================================================================== --- 2.6.10-rc3.orig/drivers/net/wireless/airo_cs.c 2004-12-05 10:26:02.940157232 +0100 +++ 2.6.10-rc3/drivers/net/wireless/airo_cs.c 2004-12-05 10:26:04.634899592 +0100 @@ -89,7 +89,7 @@ event handler. */ -struct net_device *init_airo_card( int, int, int ); +struct net_device *init_airo_card( int, int, int, struct device * ); void stop_airo_card( struct net_device *, int ); int reset_airo_card( struct net_device * ); @@ -450,7 +450,7 @@ CS_CHECK(RequestConfiguration, pcmcia_request_configuration(link->handle, &link->conf)); ((local_info_t*)link->priv)->eth_dev = init_airo_card( link->irq.AssignedIRQ, - link->io.BasePort1, 1 ); + link->io.BasePort1, 1, &handle_to_dev(handle) ); if (!((local_info_t*)link->priv)->eth_dev) goto cs_failed; /* Index: 2.6.10-rc3/drivers/net/wireless/atmel_cs.c =================================================================== --- 2.6.10-rc3.orig/drivers/net/wireless/atmel_cs.c 2004-12-05 10:26:02.941157080 +0100 +++ 2.6.10-rc3/drivers/net/wireless/atmel_cs.c 2004-12-05 10:26:04.635899440 +0100 @@ -347,18 +347,6 @@ { 0, 0, "11WAVE/11WP611AL-E", "atmel_at76c502e%s.bin", "11WAVE WaveBuddy" } }; -/* This is strictly temporary, until PCMCIA devices get integrated into the device model. */ -static struct device *atmel_device(void) -{ - static struct device dev = { - .bus_id = "pcmcia", - }; - kobject_set_name(&dev.kobj, "atmel_cs"); - kobject_init(&dev.kobj); - - return &dev; -} - static void atmel_config(dev_link_t *link) { client_handle_t handle; @@ -549,7 +537,7 @@ init_atmel_card(link->irq.AssignedIRQ, link->io.BasePort1, card_index == -1 ? NULL : card_table[card_index].firmware, - atmel_device(), + &handle_to_dev(handle), card_present, link); if (!((local_info_t*)link->priv)->eth_dev) Index: 2.6.10-rc3/drivers/net/wireless/netwave_cs.c =================================================================== --- 2.6.10-rc3.orig/drivers/net/wireless/netwave_cs.c 2004-12-05 10:26:02.943156776 +0100 +++ 2.6.10-rc3/drivers/net/wireless/netwave_cs.c 2004-12-05 10:26:04.636899288 +0100 @@ -1073,6 +1073,8 @@ dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); + if (register_netdev(dev) != 0) { printk(KERN_DEBUG "netwave_cs: register_netdev() failed\n"); goto failed; Index: 2.6.10-rc3/drivers/net/wireless/orinoco_cs.c =================================================================== --- 2.6.10-rc3.orig/drivers/net/wireless/orinoco_cs.c 2004-12-05 10:26:02.944156624 +0100 +++ 2.6.10-rc3/drivers/net/wireless/orinoco_cs.c 2004-12-05 10:26:04.637899136 +0100 @@ -454,6 +454,7 @@ /* register_netdev will give us an ethX name */ dev->name[0] = '\0'; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); /* Tell the stack we exist */ if (register_netdev(dev) != 0) { printk(KERN_ERR PFX "register_netdev() failed\n"); Index: 2.6.10-rc3/drivers/net/wireless/ray_cs.c =================================================================== --- 2.6.10-rc3.orig/drivers/net/wireless/ray_cs.c 2004-12-05 10:26:02.946156320 +0100 +++ 2.6.10-rc3/drivers/net/wireless/ray_cs.c 2004-12-05 10:26:04.640898680 +0100 @@ -568,6 +568,7 @@ return; } + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); i = register_netdev(dev); if (i != 0) { printk("ray_config register_netdev() failed\n"); Index: 2.6.10-rc3/drivers/net/wireless/wavelan_cs.c =================================================================== --- 2.6.10-rc3.orig/drivers/net/wireless/wavelan_cs.c 2004-12-05 10:24:14.336667472 +0100 +++ 2.6.10-rc3/drivers/net/wireless/wavelan_cs.c 2004-12-05 10:26:04.644898072 +0100 @@ -4066,6 +4066,7 @@ (u_int) dev->mem_start, dev->irq, (u_int) dev->base_addr); #endif + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); i = register_netdev(dev); if(i != 0) { Index: 2.6.10-rc3/drivers/net/wireless/wl3501_cs.c =================================================================== --- 2.6.10-rc3.orig/drivers/net/wireless/wl3501_cs.c 2004-12-05 10:26:02.948156016 +0100 +++ 2.6.10-rc3/drivers/net/wireless/wl3501_cs.c 2004-12-05 10:26:04.646897768 +0100 @@ -2105,6 +2105,7 @@ dev->irq = link->irq.AssignedIRQ; dev->base_addr = link->io.BasePort1; + SET_NETDEV_DEV(dev, &handle_to_dev(handle)); if (register_netdev(dev)) { printk(KERN_NOTICE "wl3501_cs: register_netdev() failed\n"); goto failed;