mwifiex: get rid of global adapter pointer

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>
This commit is contained in:
Amitkumar Karwar 2011-06-08 20:39:20 +05:30 committed by John W. Linville
parent 7f1f974251
commit 287546df34
3 changed files with 56 additions and 42 deletions

View 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);

View File

@ -39,7 +39,6 @@
#include "fw.h"
extern const char driver_version[];
extern struct mwifiex_adapter *g_adapter;
enum {
MWIFIEX_ASYNC_CMD,

View File

@ -31,10 +31,27 @@
#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))
up(&add_remove_card_sem);
if (down_interruptible(&add_remove_card_sem))
goto exit_sem_err;
/* Set the flag as user is removing this module. */
user_rmmod = 1;
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);
exit:
up(&add_remove_card_sem);
exit_sem_err:
sdio_unregister_driver(&mwifiex_sdio);
}