aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/libertas/main.c
diff options
context:
space:
mode:
authorAmitkumar Karwar <akarwar@marvell.com>2010-07-07 21:13:48 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-07-12 16:05:31 -0400
commit1311843c58ca606bab8bfe4cf6c0fe50deb9986d (patch)
treef716fbf88c163e33ef622ecb5e9c1d37df006bc7 /drivers/net/wireless/libertas/main.c
parent643f82e32f14faf0d0944c804203a6681b6b0a1e (diff)
libertas: Added support for host sleep feature
Existing "ethtool -s ethX wol X" command configures hostsleep parameters, but those are activated only during suspend/resume, there is no way to configure host sleep without actual suspend. This patch adds debugfs command to enable/disable host sleep based on already configured host sleep parameters using wol command. Signed-off-by: Amitkumar Karwar <akarwar@marvell.com> Signed-off-by: Kiran Divekar <dkiran@marvell.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/libertas/main.c')
-rw-r--r--drivers/net/wireless/libertas/main.c34
1 files changed, 2 insertions, 32 deletions
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index b519fc70f04f..2a0b590a93f1 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -544,20 +544,8 @@ static int lbs_thread(void *data)
544 return 0; 544 return 0;
545} 545}
546 546
547static int lbs_ret_host_sleep_activate(struct lbs_private *priv,
548 unsigned long dummy,
549 struct cmd_header *cmd)
550{
551 lbs_deb_enter(LBS_DEB_FW);
552 priv->is_host_sleep_activated = 1;
553 wake_up_interruptible(&priv->host_sleep_q);
554 lbs_deb_leave(LBS_DEB_FW);
555 return 0;
556}
557
558int lbs_suspend(struct lbs_private *priv) 547int lbs_suspend(struct lbs_private *priv)
559{ 548{
560 struct cmd_header cmd;
561 int ret; 549 int ret;
562 550
563 lbs_deb_enter(LBS_DEB_FW); 551 lbs_deb_enter(LBS_DEB_FW);
@@ -571,25 +559,8 @@ int lbs_suspend(struct lbs_private *priv)
571 priv->deep_sleep_required = 1; 559 priv->deep_sleep_required = 1;
572 } 560 }
573 561
574 memset(&cmd, 0, sizeof(cmd)); 562 ret = lbs_set_host_sleep(priv, 1);
575 ret = lbs_host_sleep_cfg(priv, priv->wol_criteria,
576 (struct wol_config *)NULL);
577 if (ret) {
578 lbs_pr_info("Host sleep configuration failed: %d\n", ret);
579 return ret;
580 }
581 if (priv->psstate == PS_STATE_FULL_POWER) {
582 ret = __lbs_cmd(priv, CMD_802_11_HOST_SLEEP_ACTIVATE, &cmd,
583 sizeof(cmd), lbs_ret_host_sleep_activate, 0);
584 if (ret)
585 lbs_pr_info("HOST_SLEEP_ACTIVATE failed: %d\n", ret);
586 }
587 563
588 if (!wait_event_interruptible_timeout(priv->host_sleep_q,
589 priv->is_host_sleep_activated, (10 * HZ))) {
590 lbs_pr_err("host_sleep_q: timer expired\n");
591 ret = -1;
592 }
593 netif_device_detach(priv->dev); 564 netif_device_detach(priv->dev);
594 if (priv->mesh_dev) 565 if (priv->mesh_dev)
595 netif_device_detach(priv->mesh_dev); 566 netif_device_detach(priv->mesh_dev);
@@ -602,11 +573,10 @@ EXPORT_SYMBOL_GPL(lbs_suspend);
602int lbs_resume(struct lbs_private *priv) 573int lbs_resume(struct lbs_private *priv)
603{ 574{
604 int ret; 575 int ret;
605 uint32_t criteria = EHS_REMOVE_WAKEUP;
606 576
607 lbs_deb_enter(LBS_DEB_FW); 577 lbs_deb_enter(LBS_DEB_FW);
608 578
609 ret = lbs_host_sleep_cfg(priv, criteria, (struct wol_config *)NULL); 579 ret = lbs_set_host_sleep(priv, 0);
610 580
611 netif_device_attach(priv->dev); 581 netif_device_attach(priv->dev);
612 if (priv->mesh_dev) 582 if (priv->mesh_dev)