diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /drivers/net/wireless/libertas/if_sdio.c | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'drivers/net/wireless/libertas/if_sdio.c')
-rw-r--r-- | drivers/net/wireless/libertas/if_sdio.c | 65 |
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 | }; |
103 | MODULE_FIRMWARE("sd8385_helper.bin"); | ||
104 | MODULE_FIRMWARE("sd8385.bin"); | ||
105 | MODULE_FIRMWARE("sd8686_helper.bin"); | ||
106 | MODULE_FIRMWARE("sd8686.bin"); | ||
107 | MODULE_FIRMWARE("sd8688_helper.bin"); | ||
108 | MODULE_FIRMWARE("sd8688.bin"); | ||
102 | 109 | ||
103 | struct if_sdio_packet { | 110 | struct 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 | ||
841 | static 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 | |||
858 | static 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 | |||
875 | static 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 | ||