Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 150680
b: refs/heads/master
c: 6bc61f4
h: refs/heads/master
v: v3
  • Loading branch information
Bing Zhao authored and John W. Linville committed Jun 3, 2009
1 parent 5fe8af7 commit 7929160
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 52 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 328d84fb3614d006254c990a6224ce437147a5ac
refs/heads/master: 6bc61f4d8e2fa3d54017c29b58603e8771158a25
2 changes: 0 additions & 2 deletions trunk/drivers/net/wireless/libertas/dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -321,8 +321,6 @@ struct lbs_private {

u32 monitormode;
u8 fw_ready;
u8 fn_init_required;
u8 fn_shutdown_required;
};

extern struct cmd_confirm_sleep confirm_sleep;
Expand Down
76 changes: 47 additions & 29 deletions trunk/drivers/net/wireless/libertas/if_sdio.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,24 @@
#include "decl.h"
#include "defs.h"
#include "dev.h"
#include "cmd.h"
#include "if_sdio.h"

/* The if_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 for SD8688 combo chip.
* If the user is removing the module, the FUNC_SHUTDOWN
* command for SD8688 is sent to the firmware.
* If the card is removed, there is no need to send this 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 char *lbs_helper_name = NULL;
module_param_named(helper_name, lbs_helper_name, charp, 0644);

Expand All @@ -61,7 +77,6 @@ struct if_sdio_model {
int model;
const char *helper;
const char *firmware;
struct if_sdio_card *card;
};

static struct if_sdio_model if_sdio_models[] = {
Expand All @@ -70,21 +85,18 @@ static struct if_sdio_model if_sdio_models[] = {
.model = IF_SDIO_MODEL_8385,
.helper = "sd8385_helper.bin",
.firmware = "sd8385.bin",
.card = NULL,
},
{
/* 8686 */
.model = IF_SDIO_MODEL_8686,
.helper = "sd8686_helper.bin",
.firmware = "sd8686.bin",
.card = NULL,
},
{
/* 8688 */
.model = IF_SDIO_MODEL_8688,
.helper = "sd8688_helper.bin",
.firmware = "sd8688.bin",
.card = NULL,
},
};

Expand Down Expand Up @@ -927,8 +939,6 @@ static int if_sdio_probe(struct sdio_func *func,
goto free;
}

if_sdio_models[i].card = card;

card->helper = if_sdio_models[i].helper;
card->firmware = if_sdio_models[i].firmware;

Expand Down Expand Up @@ -1014,8 +1024,16 @@ static int if_sdio_probe(struct sdio_func *func,
/*
* FUNC_INIT is required for SD8688 WLAN/BT multiple functions
*/
priv->fn_init_required =
(card->model == IF_SDIO_MODEL_8688) ? 1 : 0;
if (card->model == IF_SDIO_MODEL_8688) {
struct cmd_header cmd;

memset(&cmd, 0, sizeof(cmd));

lbs_deb_sdio("send function INIT command\n");
if (__lbs_cmd(priv, CMD_FUNC_INIT, &cmd, sizeof(cmd),
lbs_cmd_copyback, (unsigned long) &cmd))
lbs_pr_alert("CMD_FUNC_INIT cmd failed\n");
}

ret = lbs_start_card(priv);
if (ret)
Expand Down Expand Up @@ -1057,30 +1075,39 @@ static void if_sdio_remove(struct sdio_func *func)
{
struct if_sdio_card *card;
struct if_sdio_packet *packet;
int ret;

lbs_deb_enter(LBS_DEB_SDIO);

card = sdio_get_drvdata(func);

lbs_stop_card(card->priv);
if (user_rmmod && (card->model == IF_SDIO_MODEL_8688)) {
/*
* FUNC_SHUTDOWN is required for SD8688 WLAN/BT
* multiple functions
*/
struct cmd_header cmd;

memset(&cmd, 0, sizeof(cmd));

lbs_deb_sdio("send function SHUTDOWN command\n");
if (__lbs_cmd(card->priv, CMD_FUNC_SHUTDOWN,
&cmd, sizeof(cmd), lbs_cmd_copyback,
(unsigned long) &cmd))
lbs_pr_alert("CMD_FUNC_SHUTDOWN cmd failed\n");
}

card->priv->surpriseremoved = 1;

lbs_deb_sdio("call remove card\n");
lbs_stop_card(card->priv);
lbs_remove_card(card->priv);

flush_workqueue(card->workqueue);
destroy_workqueue(card->workqueue);

sdio_claim_host(func);

/* Disable interrupts */
sdio_writeb(func, 0x00, IF_SDIO_H_INT_MASK, &ret);

sdio_release_irq(func);
sdio_disable_func(func);

sdio_release_host(func);

while (card->packets) {
Expand Down Expand Up @@ -1116,29 +1143,20 @@ static int __init if_sdio_init_module(void)

ret = sdio_register_driver(&if_sdio_driver);

/* Clear the flag in case user removes the card. */
user_rmmod = 0;

lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);

return ret;
}

static void __exit if_sdio_exit_module(void)
{
int i;
struct if_sdio_card *card;

lbs_deb_enter(LBS_DEB_SDIO);

for (i = 0; i < ARRAY_SIZE(if_sdio_models); i++) {
card = if_sdio_models[i].card;

/*
* FUNC_SHUTDOWN is required for SD8688 WLAN/BT
* multiple functions
*/
if (card && card->priv)
card->priv->fn_shutdown_required =
(card->model == IF_SDIO_MODEL_8688) ? 1 : 0;
}
/* Set the flag as user is removing this module. */
user_rmmod = 1;

sdio_unregister_driver(&if_sdio_driver);

Expand Down
20 changes: 0 additions & 20 deletions trunk/drivers/net/wireless/libertas/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1002,17 +1002,9 @@ static int lbs_setup_firmware(struct lbs_private *priv)
{
int ret = -1;
s16 curlevel = 0, minlevel = 0, maxlevel = 0;
struct cmd_header cmd;

lbs_deb_enter(LBS_DEB_FW);

if (priv->fn_init_required) {
memset(&cmd, 0, sizeof(cmd));
if (__lbs_cmd(priv, CMD_FUNC_INIT, &cmd, sizeof(cmd),
lbs_cmd_copyback, (unsigned long) &cmd))
lbs_pr_alert("CMD_FUNC_INIT command failed\n");
}

/* Read MAC address from firmware */
memset(priv->current_addr, 0xff, ETH_ALEN);
ret = lbs_update_hw_spec(priv);
Expand Down Expand Up @@ -1200,9 +1192,6 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
priv->mesh_open = 0;
priv->infra_open = 0;

priv->fn_init_required = 0;
priv->fn_shutdown_required = 0;

/* Setup the OS Interface to our functions */
dev->netdev_ops = &lbs_netdev_ops;
dev->watchdog_timeo = 5 * HZ;
Expand Down Expand Up @@ -1384,20 +1373,11 @@ void lbs_stop_card(struct lbs_private *priv)
struct net_device *dev;
struct cmd_ctrl_node *cmdnode;
unsigned long flags;
struct cmd_header cmd;

lbs_deb_enter(LBS_DEB_MAIN);

if (!priv)
goto out;

if (priv->fn_shutdown_required) {
memset(&cmd, 0, sizeof(cmd));
if (__lbs_cmd(priv, CMD_FUNC_SHUTDOWN, &cmd, sizeof(cmd),
lbs_cmd_copyback, (unsigned long) &cmd))
lbs_pr_alert("CMD_FUNC_SHUTDOWN command failed\n");
}

dev = priv->dev;

netif_stop_queue(dev);
Expand Down

0 comments on commit 7929160

Please sign in to comment.