aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwmc3200wifi/sdio.c
diff options
context:
space:
mode:
authorZhu Yi <yi.zhu@intel.com>2009-06-15 21:36:14 +0200
committerJohn W. Linville <linville@tuxdriver.com>2009-06-19 11:50:16 -0400
commitd7e057dca3f1b76ff44dd16fefcd493a52614aad (patch)
treeedc3d4ff1a2ba516b3619a7d5fcdfd22820eb43d /drivers/net/wireless/iwmc3200wifi/sdio.c
parent8d96e7960b6b520eb52be6e1eb7c794da5db9555 (diff)
downloadkernel_samsung_smdk4412-d7e057dca3f1b76ff44dd16fefcd493a52614aad.zip
kernel_samsung_smdk4412-d7e057dca3f1b76ff44dd16fefcd493a52614aad.tar.gz
kernel_samsung_smdk4412-d7e057dca3f1b76ff44dd16fefcd493a52614aad.tar.bz2
iwmc3200wifi: add iwm_if_add and iwm_if_remove
We used to do alloc_netdev and register_netdev at the same time in iwm_if_alloc. But some bus related structures will only be initialized after iwm_priv is allocated. This caused a race condition that the netdev might be registered earlier. The patch adds iwm_if_add and iwm_if_remove so that the bus layer could register the device after all initialization is done. Signed-off-by: Zhu Yi <yi.zhu@intel.com> Signed-off-by: Samuel Ortiz <samuel.ortiz@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/iwmc3200wifi/sdio.c')
-rw-r--r--drivers/net/wireless/iwmc3200wifi/sdio.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/net/wireless/iwmc3200wifi/sdio.c b/drivers/net/wireless/iwmc3200wifi/sdio.c
index b54da67..c040571 100644
--- a/drivers/net/wireless/iwmc3200wifi/sdio.c
+++ b/drivers/net/wireless/iwmc3200wifi/sdio.c
@@ -454,10 +454,18 @@ static int iwm_sdio_probe(struct sdio_func *func,
INIT_WORK(&hw->isr_worker, iwm_sdio_isr_worker);
+ ret = iwm_if_add(iwm);
+ if (ret) {
+ dev_err(dev, "add SDIO interface failed\n");
+ goto destroy_wq;
+ }
+
dev_info(dev, "IWM SDIO probe\n");
return 0;
+ destroy_wq:
+ destroy_workqueue(hw->isr_wq);
debugfs_exit:
iwm_debugfs_exit(iwm);
if_free:
@@ -472,6 +480,7 @@ static void iwm_sdio_remove(struct sdio_func *func)
struct device *dev = &func->dev;
iwm_debugfs_exit(iwm);
+ iwm_if_remove(iwm);
iwm_if_free(iwm);
destroy_workqueue(hw->isr_wq);