diff options
author | Amitkumar Karwar <akarwar@marvell.com> | 2010-07-07 21:13:48 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-07-12 16:05:31 -0400 |
commit | 1311843c58ca606bab8bfe4cf6c0fe50deb9986d (patch) | |
tree | f716fbf88c163e33ef622ecb5e9c1d37df006bc7 /drivers/net/wireless/libertas/main.c | |
parent | 643f82e32f14faf0d0944c804203a6681b6b0a1e (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.c | 34 |
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 | ||
547 | static 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 | |||
558 | int lbs_suspend(struct lbs_private *priv) | 547 | int 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); | |||
602 | int lbs_resume(struct lbs_private *priv) | 573 | int 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) |