summaryrefslogtreecommitdiff
path: root/drivers/staging/cw1200/main.c
diff options
context:
space:
mode:
authorDmitry Tarnyagin <dmitry.tarnyagin@stericsson.com>2011-07-13 23:03:17 +0200
committerPhilippe LANGLAIS <philippe.langlais@stericsson.com>2011-10-13 09:44:11 +0200
commit8777e41f161c3a785d04d439ceec2657492802ba (patch)
treeda92b69529522b14ca0561e272a7dd5066690111 /drivers/staging/cw1200/main.c
parent7ae20d2e8db0776aa8b0855d11c637e3476e46c5 (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.c25
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);