Skip to content

Commit

Permalink
mwifiex: get rid of global adapter pointer
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Amitkumar Karwar authored and John W. Linville committed Jun 10, 2011
1 parent 7f1f974 commit 287546d
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 42 deletions.
16 changes: 6 additions & 10 deletions drivers/net/wireless/mwifiex/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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},
};
Expand Down Expand Up @@ -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;
Expand All @@ -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 */
Expand Down Expand Up @@ -324,7 +322,7 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
* 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;
Expand All @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
1 change: 0 additions & 1 deletion drivers/net/wireless/mwifiex/main.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
#include "fw.h"

extern const char driver_version[];
extern struct mwifiex_adapter *g_adapter;

enum {
MWIFIEX_ASYNC_CMD,
Expand Down
81 changes: 50 additions & 31 deletions drivers/net/wireless/mwifiex/sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
Expand Down Expand Up @@ -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);
}

/*
Expand Down Expand Up @@ -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);
}

Expand All @@ -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);
}

Expand Down

0 comments on commit 287546d

Please sign in to comment.