aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/libertas/if_sdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/libertas/if_sdio.c')
-rw-r--r--drivers/net/wireless/libertas/if_sdio.c65
1 files changed, 64 insertions, 1 deletions
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c
index 485a8d406525..7d1a3c6b6ce0 100644
--- a/drivers/net/wireless/libertas/if_sdio.c
+++ b/drivers/net/wireless/libertas/if_sdio.c
@@ -28,6 +28,7 @@
28 28
29#include <linux/kernel.h> 29#include <linux/kernel.h>
30#include <linux/moduleparam.h> 30#include <linux/moduleparam.h>
31#include <linux/slab.h>
31#include <linux/firmware.h> 32#include <linux/firmware.h>
32#include <linux/netdevice.h> 33#include <linux/netdevice.h>
33#include <linux/delay.h> 34#include <linux/delay.h>
@@ -99,6 +100,12 @@ static struct if_sdio_model if_sdio_models[] = {
99 .firmware = "sd8688.bin", 100 .firmware = "sd8688.bin",
100 }, 101 },
101}; 102};
103MODULE_FIRMWARE("sd8385_helper.bin");
104MODULE_FIRMWARE("sd8385.bin");
105MODULE_FIRMWARE("sd8686_helper.bin");
106MODULE_FIRMWARE("sd8686.bin");
107MODULE_FIRMWARE("sd8688_helper.bin");
108MODULE_FIRMWARE("sd8688.bin");
102 109
103struct if_sdio_packet { 110struct if_sdio_packet {
104 struct if_sdio_packet *next; 111 struct if_sdio_packet *next;
@@ -831,6 +838,58 @@ out:
831 return ret; 838 return ret;
832} 839}
833 840
841static int if_sdio_enter_deep_sleep(struct lbs_private *priv)
842{
843 int ret = -1;
844 struct cmd_header cmd;
845
846 memset(&cmd, 0, sizeof(cmd));
847
848 lbs_deb_sdio("send DEEP_SLEEP command\n");
849 ret = __lbs_cmd(priv, CMD_802_11_DEEP_SLEEP, &cmd, sizeof(cmd),
850 lbs_cmd_copyback, (unsigned long) &cmd);
851 if (ret)
852 lbs_pr_err("DEEP_SLEEP cmd failed\n");
853
854 mdelay(200);
855 return ret;
856}
857
858static int if_sdio_exit_deep_sleep(struct lbs_private *priv)
859{
860 struct if_sdio_card *card = priv->card;
861 int ret = -1;
862
863 lbs_deb_enter(LBS_DEB_SDIO);
864 sdio_claim_host(card->func);
865
866 sdio_writeb(card->func, HOST_POWER_UP, CONFIGURATION_REG, &ret);
867 if (ret)
868 lbs_pr_err("sdio_writeb failed!\n");
869
870 sdio_release_host(card->func);
871 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
872 return ret;
873}
874
875static int if_sdio_reset_deep_sleep_wakeup(struct lbs_private *priv)
876{
877 struct if_sdio_card *card = priv->card;
878 int ret = -1;
879
880 lbs_deb_enter(LBS_DEB_SDIO);
881 sdio_claim_host(card->func);
882
883 sdio_writeb(card->func, 0, CONFIGURATION_REG, &ret);
884 if (ret)
885 lbs_pr_err("sdio_writeb failed!\n");
886
887 sdio_release_host(card->func);
888 lbs_deb_leave_args(LBS_DEB_SDIO, "ret %d", ret);
889 return ret;
890
891}
892
834/*******************************************************************/ 893/*******************************************************************/
835/* SDIO callbacks */ 894/* SDIO callbacks */
836/*******************************************************************/ 895/*******************************************************************/
@@ -859,6 +918,7 @@ static void if_sdio_interrupt(struct sdio_func *func)
859 * Ignore the define name, this really means the card has 918 * Ignore the define name, this really means the card has
860 * successfully received the command. 919 * successfully received the command.
861 */ 920 */
921 card->priv->is_activity_detected = 1;
862 if (cause & IF_SDIO_H_INT_DNLD) 922 if (cause & IF_SDIO_H_INT_DNLD)
863 lbs_host_to_card_done(card->priv); 923 lbs_host_to_card_done(card->priv);
864 924
@@ -934,7 +994,7 @@ static int if_sdio_probe(struct sdio_func *func,
934 } 994 }
935 995
936 if (i == ARRAY_SIZE(if_sdio_models)) { 996 if (i == ARRAY_SIZE(if_sdio_models)) {
937 lbs_pr_err("unkown card model 0x%x\n", card->model); 997 lbs_pr_err("unknown card model 0x%x\n", card->model);
938 ret = -ENODEV; 998 ret = -ENODEV;
939 goto free; 999 goto free;
940 } 1000 }
@@ -998,6 +1058,9 @@ static int if_sdio_probe(struct sdio_func *func,
998 1058
999 priv->card = card; 1059 priv->card = card;
1000 priv->hw_host_to_card = if_sdio_host_to_card; 1060 priv->hw_host_to_card = if_sdio_host_to_card;
1061 priv->enter_deep_sleep = if_sdio_enter_deep_sleep;
1062 priv->exit_deep_sleep = if_sdio_exit_deep_sleep;
1063 priv->reset_deep_sleep_wakeup = if_sdio_reset_deep_sleep_wakeup;
1001 1064
1002 priv->fw_ready = 1; 1065 priv->fw_ready = 1;
1003 1066