mwifiex: get rid of global adapter pointer
authorAmitkumar Karwar <akarwar@marvell.com>
Wed, 8 Jun 2011 15:09:20 +0000 (20:39 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 10 Jun 2011 18:57:52 +0000 (14:57 -0400)
1) Avoid global adapter pointer usage
   a) in sdio.c by moving some code from mwifiex_cleanup_module() to
      mwifiex_sdio_remove().
   b) in main.c by passing an extra parameter to few functions.
2) Add new variable "user_rmmod" to identify if mwifiex_sdio_remove()
   callback function is called in card removal or rmmod context. These
   code changes are adapted from Libertas driver.
3) Remove unnecessary NULL pointer check for "func" pointer in
   mwifiex_sdio_remove().

Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Yogesh Ashok Powar <yogeshp@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/mwifiex/main.c
drivers/net/wireless/mwifiex/main.h
drivers/net/wireless/mwifiex/sdio.c

index 4f43443036f46a3608cba97adf7ebb7d623c2844..054a5c348a243ad89091406203f101e21b18fcf4 100644 (file)
@@ -26,9 +26,6 @@
 
 const char driver_version[] = "mwifiex " VERSION " (%s) ";
 
-struct mwifiex_adapter *g_adapter;
-EXPORT_SYMBOL_GPL(g_adapter);
-
 static struct mwifiex_bss_attr mwifiex_bss_sta[] = {
        {MWIFIEX_BSS_TYPE_STA, MWIFIEX_DATA_FRAME_TYPE_ETH_II, true, 0, 0},
 };
@@ -60,7 +57,8 @@ static struct mwifiex_drv_mode mwifiex_drv_mode_tbl[] = {
  * proper cleanup before exiting.
  */
 static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
-                           struct mwifiex_drv_mode *drv_mode_ptr)
+                           struct mwifiex_drv_mode *drv_mode_ptr,
+                           void **padapter)
 {
        struct mwifiex_adapter *adapter;
        int i;
@@ -69,7 +67,7 @@ static int mwifiex_register(void *card, struct mwifiex_if_ops *if_ops,
        if (!adapter)
                return -ENOMEM;
 
-       g_adapter = adapter;
+       *padapter = adapter;
        adapter->card = card;
 
        /* Save interface specific operations in adapter */
@@ -324,7 +322,7 @@ exit_main_proc:
  * and initializing the private structures.
  */
 static int
-mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops)
+mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops, void **padapter)
 {
        int i;
        struct mwifiex_drv_mode *drv_mode_ptr;
@@ -343,7 +341,7 @@ mwifiex_init_sw(void *card, struct mwifiex_if_ops *if_ops)
                return -1;
        }
 
-       if (mwifiex_register(card, if_ops, drv_mode_ptr))
+       if (mwifiex_register(card, if_ops, drv_mode_ptr, padapter))
                return -1;
 
        return 0;
@@ -855,13 +853,11 @@ mwifiex_add_card(void *card, struct semaphore *sem,
        if (down_interruptible(sem))
                goto exit_sem_err;
 
-       if (mwifiex_init_sw(card, if_ops)) {
+       if (mwifiex_init_sw(card, if_ops, (void **)&adapter)) {
                pr_err("%s: software init failed\n", __func__);
                goto err_init_sw;
        }
 
-       adapter = g_adapter;
-
        adapter->hw_status = MWIFIEX_HW_STATUS_INITIALIZING;
        adapter->surprise_removed = false;
        init_waitqueue_head(&adapter->init_wait_q);
index 57b183af72d796f7f38df47cb936d414147dc5e8..db201cc1473b5594e3b2bdbaaf20d34263f5ed4a 100644 (file)
@@ -39,7 +39,6 @@
 #include "fw.h"
 
 extern const char driver_version[];
-extern struct mwifiex_adapter *g_adapter;
 
 enum {
        MWIFIEX_ASYNC_CMD,
index 4327b6d099c891b39ac4633a98a2a9f19a3febe0..711fa689a95c3575a2cc433ae711fedfe29d3b9e 100644 (file)
 
 #define SDIO_VERSION   "1.0"
 
+/* The mwifiex_sdio_remove() callback function is called when
+ * user removes this module from kernel space or ejects
+ * the card from the slot. The driver handles these 2 cases
+ * differently.
+ * If the user is removing the module, the few commands (FUNC_SHUTDOWN,
+ * HS_CANCEL etc.) are sent to the firmware.
+ * If the card is removed, there is no need to send these command.
+ *
+ * The variable 'user_rmmod' is used to distinguish these two
+ * scenarios. This flag is initialized as FALSE in case the card
+ * is removed, and will be set to TRUE for module removal when
+ * module_exit function is called.
+ */
+static u8 user_rmmod;
+
 static struct mwifiex_if_ops sdio_ops;
 
 static struct semaphore add_remove_card_sem;
 
+static int mwifiex_sdio_resume(struct device *dev);
+
 /*
  * SDIO probe.
  *
@@ -93,17 +110,36 @@ static void
 mwifiex_sdio_remove(struct sdio_func *func)
 {
        struct sdio_mmc_card *card;
+       struct mwifiex_adapter *adapter;
+       int i;
 
        pr_debug("info: SDIO func num=%d\n", func->num);
 
-       if (func) {
-               card = sdio_get_drvdata(func);
-               if (card) {
-                       mwifiex_remove_card(card->adapter,
-                                       &add_remove_card_sem);
-                       kfree(card);
-               }
+       card = sdio_get_drvdata(func);
+       if (!card)
+               return;
+
+       adapter = card->adapter;
+       if (!adapter || !adapter->priv_num)
+               return;
+
+       if (user_rmmod) {
+               if (adapter->is_suspended)
+                       mwifiex_sdio_resume(adapter->dev);
+
+               for (i = 0; i < adapter->priv_num; i++)
+                       if ((GET_BSS_ROLE(adapter->priv[i]) ==
+                                               MWIFIEX_BSS_ROLE_STA) &&
+                                       adapter->priv[i]->media_connected)
+                               mwifiex_deauthenticate(adapter->priv[i], NULL);
+
+               mwifiex_init_shutdown_fw(mwifiex_get_priv(adapter,
+                                               MWIFIEX_BSS_ROLE_ANY),
+                                        MWIFIEX_FUNC_SHUTDOWN);
        }
+
+       mwifiex_remove_card(card->adapter, &add_remove_card_sem);
+       kfree(card);
 }
 
 /*
@@ -1696,6 +1732,9 @@ mwifiex_sdio_init_module(void)
 {
        sema_init(&add_remove_card_sem, 1);
 
+       /* Clear the flag in case user removes the card. */
+       user_rmmod = 0;
+
        return sdio_register_driver(&mwifiex_sdio);
 }
 
@@ -1711,32 +1750,12 @@ mwifiex_sdio_init_module(void)
 static void
 mwifiex_sdio_cleanup_module(void)
 {
-       struct mwifiex_adapter *adapter = g_adapter;
-       int i;
-
-       if (down_interruptible(&add_remove_card_sem))
-               goto exit_sem_err;
-
-       if (!adapter || !adapter->priv_num)
-               goto exit;
-
-       if (adapter->is_suspended)
-               mwifiex_sdio_resume(adapter->dev);
-
-       for (i = 0; i < adapter->priv_num; i++)
-               if ((GET_BSS_ROLE(adapter->priv[i]) == MWIFIEX_BSS_ROLE_STA) &&
-                   adapter->priv[i]->media_connected)
-                       mwifiex_deauthenticate(adapter->priv[i], NULL);
-
-       if (!adapter->surprise_removed)
-               mwifiex_init_shutdown_fw(mwifiex_get_priv(adapter,
-                                                         MWIFIEX_BSS_ROLE_ANY),
-                                        MWIFIEX_FUNC_SHUTDOWN);
+       if (!down_interruptible(&add_remove_card_sem))
+               up(&add_remove_card_sem);
 
-exit:
-       up(&add_remove_card_sem);
+       /* Set the flag as user is removing this module. */
+       user_rmmod = 1;
 
-exit_sem_err:
        sdio_unregister_driver(&mwifiex_sdio);
 }