diff options
Diffstat (limited to 'drivers/net/wireless/libertas/if_sdio.c')
| -rw-r--r-- | drivers/net/wireless/libertas/if_sdio.c | 62 | 
1 files changed, 62 insertions, 0 deletions
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c index 485a8d40652..09fcfad742e 100644 --- a/drivers/net/wireless/libertas/if_sdio.c +++ b/drivers/net/wireless/libertas/if_sdio.c @@ -99,6 +99,12 @@ static struct if_sdio_model if_sdio_models[] = {  		.firmware = "sd8688.bin",  	},  }; +MODULE_FIRMWARE("sd8385_helper.bin"); +MODULE_FIRMWARE("sd8385.bin"); +MODULE_FIRMWARE("sd8686_helper.bin"); +MODULE_FIRMWARE("sd8686.bin"); +MODULE_FIRMWARE("sd8688_helper.bin"); +MODULE_FIRMWARE("sd8688.bin");  struct if_sdio_packet {  	struct if_sdio_packet	*next; @@ -831,6 +837,58 @@ out:  	return ret;  } +static int if_sdio_enter_deep_sleep(struct lbs_private *priv) +{ +	int ret = -1; +	struct cmd_header cmd; + +	memset(&cmd, 0, sizeof(cmd)); + +	lbs_deb_sdio("send DEEP_SLEEP command\n"); +	ret = __lbs_cmd(priv, CMD_802_11_DEEP_SLEEP, &cmd, sizeof(cmd), +			lbs_cmd_copyback, (unsigned long) &cmd); +	if (ret) +		lbs_pr_err("DEEP_SLEEP cmd failed\n"); + +	mdelay(200); +	return ret; +} + +static int if_sdio_exit_deep_sleep(struct lbs_private *priv) +{ +	struct if_sdio_card *card = priv->card; +	int ret = -1; + +	lbs_deb_enter(LBS_DEB_SDIO); +	sdio_claim_host(card->func); + +	sdio_writeb(card->func, HOST_POWER_UP, CONFIGURATION_REG, &ret); +	if (ret) +		lbs_pr_err("sdio_writeb failed!\n"); + +	sdio_release_host(card->func); +	lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret); +	return ret; +} + +static int if_sdio_reset_deep_sleep_wakeup(struct lbs_private *priv) +{ +	struct if_sdio_card *card = priv->card; +	int ret = -1; + +	lbs_deb_enter(LBS_DEB_SDIO); +	sdio_claim_host(card->func); + +	sdio_writeb(card->func, 0, CONFIGURATION_REG, &ret); +	if (ret) +		lbs_pr_err("sdio_writeb failed!\n"); + +	sdio_release_host(card->func); +	lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret); +	return ret; + +} +  /*******************************************************************/  /* SDIO callbacks                                                  */  /*******************************************************************/ @@ -859,6 +917,7 @@ static void if_sdio_interrupt(struct sdio_func *func)  	 * Ignore the define name, this really means the card has  	 * successfully received the command.  	 */ +	card->priv->is_activity_detected = 1;  	if (cause & IF_SDIO_H_INT_DNLD)  		lbs_host_to_card_done(card->priv); @@ -998,6 +1057,9 @@ static int if_sdio_probe(struct sdio_func *func,  	priv->card = card;  	priv->hw_host_to_card = if_sdio_host_to_card; +	priv->enter_deep_sleep = if_sdio_enter_deep_sleep; +	priv->exit_deep_sleep = if_sdio_exit_deep_sleep; +	priv->reset_deep_sleep_wakeup = if_sdio_reset_deep_sleep_wakeup;  	priv->fw_ready = 1;  |