Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial
[safe/jmp/linux-2.6] / drivers / net / wireless / libertas / if_sdio.c
index afe6abe..7a73f62 100644 (file)
@@ -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;