diff options
author | Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com> | 2011-07-13 23:03:17 +0200 |
---|---|---|
committer | Philippe LANGLAIS <philippe.langlais@stericsson.com> | 2011-10-13 09:44:11 +0200 |
commit | 8777e41f161c3a785d04d439ceec2657492802ba (patch) | |
tree | da92b69529522b14ca0561e272a7dd5066690111 /drivers/staging/cw1200/main.c | |
parent | 7ae20d2e8db0776aa8b0855d11c637e3476e46c5 (diff) |
cw1200: Wakeup on wireless (WoW) is implemented.
+ Core and SDIO power management is implemented as defined in
wireless-next v3.0-rc4.
+ SDD is cached to avoid disk access at suspend/resume time.
TODO:
- WoW conditions and filtering are not yet implemented.
- BUG: Late interrupts (coming after suspend() callback but
before the actual suspend) are not detected as wakeup sources.
Universal (Android/GLK) way of waking up halfly-suspended system
to be found.
Signed-off-by: Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>
Change-Id: Ib4931a261e592f2927455e988055cd673250ec81
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/27297
Tested-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Reviewed-by: Bartosz MARKOWSKI <bartosz.markowski@tieto.com>
Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/33484
Reviewed-by: Philippe LANGLAIS <philippe.langlais@stericsson.com>
Diffstat (limited to 'drivers/staging/cw1200/main.c')
-rw-r--r-- | drivers/staging/cw1200/main.c | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/drivers/staging/cw1200/main.c b/drivers/staging/cw1200/main.c index 15dd4fd5a1b..8a621ff2b06 100644 --- a/drivers/staging/cw1200/main.c +++ b/drivers/staging/cw1200/main.c @@ -26,7 +26,6 @@ #include <linux/vmalloc.h> #include <linux/random.h> #include <linux/sched.h> - #include <net/mac80211.h> #include "cw1200.h" @@ -39,6 +38,7 @@ #include "ap.h" #include "scan.h" #include "debug.h" +#include "pm.h" MODULE_AUTHOR("Dmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>"); MODULE_DESCRIPTION("Softmac ST-Ericsson CW1200 common code"); @@ -220,6 +220,10 @@ static const struct ieee80211_ops cw1200_ops = { .get_stats = cw1200_get_stats, .ampdu_action = cw1200_ampdu_action, .flush = cw1200_flush, +#ifdef CONFIG_PM + .suspend = cw1200_wow_suspend, + .resume = cw1200_wow_resume, +#endif /* CONFIG_PM */ /* Intentionally not offloaded: */ /*.channel_switch = cw1200_channel_switch, */ /*.remain_on_channel = cw1200_remain_on_channel, */ @@ -412,16 +416,21 @@ void cw1200_unregister_common(struct ieee80211_hw *dev) priv->skb_cache = NULL; } + if (priv->sdd) { + release_firmware(priv->sdd); + priv->sdd = NULL; + } + for (i = 0; i < 4; ++i) cw1200_queue_deinit(&priv->tx_queue[i]); cw1200_queue_stats_deinit(&priv->tx_queue_stats); } EXPORT_SYMBOL_GPL(cw1200_unregister_common); -int cw1200_probe(const struct sbus_ops *sbus_ops, - struct sbus_priv *sbus, - struct device *pdev, - struct cw1200_common **pself) +int cw1200_core_probe(const struct sbus_ops *sbus_ops, + struct sbus_priv *sbus, + struct device *pdev, + struct cw1200_common **pself) { int err = -ENOMEM; struct ieee80211_hw *dev; @@ -489,12 +498,12 @@ err1: err: return err; } -EXPORT_SYMBOL_GPL(cw1200_probe); +EXPORT_SYMBOL_GPL(cw1200_core_probe); -void cw1200_release(struct cw1200_common *self) +void cw1200_core_release(struct cw1200_common *self) { cw1200_unregister_common(self->hw); cw1200_free_common(self->hw); return; } -EXPORT_SYMBOL_GPL(cw1200_release); +EXPORT_SYMBOL_GPL(cw1200_core_release); |