diff options
Diffstat (limited to 'drivers/net/wireless/libertas/cmd.c')
-rw-r--r-- | drivers/net/wireless/libertas/cmd.c | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 6c8a9d952a01..749fbde4fd54 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c | |||
@@ -181,7 +181,7 @@ static int lbs_ret_host_sleep_cfg(struct lbs_private *priv, unsigned long dummy, | |||
181 | struct cmd_header *resp) | 181 | struct cmd_header *resp) |
182 | { | 182 | { |
183 | lbs_deb_enter(LBS_DEB_CMD); | 183 | lbs_deb_enter(LBS_DEB_CMD); |
184 | if (priv->wol_criteria == EHS_REMOVE_WAKEUP) { | 184 | if (priv->is_host_sleep_activated) { |
185 | priv->is_host_sleep_configured = 0; | 185 | priv->is_host_sleep_configured = 0; |
186 | if (priv->psstate == PS_STATE_FULL_POWER) { | 186 | if (priv->psstate == PS_STATE_FULL_POWER) { |
187 | priv->is_host_sleep_activated = 0; | 187 | priv->is_host_sleep_activated = 0; |
@@ -361,6 +361,65 @@ int lbs_set_deep_sleep(struct lbs_private *priv, int deep_sleep) | |||
361 | return ret; | 361 | return ret; |
362 | } | 362 | } |
363 | 363 | ||
364 | static int lbs_ret_host_sleep_activate(struct lbs_private *priv, | ||
365 | unsigned long dummy, | ||
366 | struct cmd_header *cmd) | ||
367 | { | ||
368 | lbs_deb_enter(LBS_DEB_FW); | ||
369 | priv->is_host_sleep_activated = 1; | ||
370 | wake_up_interruptible(&priv->host_sleep_q); | ||
371 | lbs_deb_leave(LBS_DEB_FW); | ||
372 | return 0; | ||
373 | } | ||
374 | |||
375 | int lbs_set_host_sleep(struct lbs_private *priv, int host_sleep) | ||
376 | { | ||
377 | struct cmd_header cmd; | ||
378 | int ret = 0; | ||
379 | uint32_t criteria = EHS_REMOVE_WAKEUP; | ||
380 | |||
381 | lbs_deb_enter(LBS_DEB_CMD); | ||
382 | |||
383 | if (host_sleep) { | ||
384 | if (priv->is_host_sleep_activated != 1) { | ||
385 | memset(&cmd, 0, sizeof(cmd)); | ||
386 | ret = lbs_host_sleep_cfg(priv, priv->wol_criteria, | ||
387 | (struct wol_config *)NULL); | ||
388 | if (ret) { | ||
389 | lbs_pr_info("Host sleep configuration failed: " | ||
390 | "%d\n", ret); | ||
391 | return ret; | ||
392 | } | ||
393 | if (priv->psstate == PS_STATE_FULL_POWER) { | ||
394 | ret = __lbs_cmd(priv, | ||
395 | CMD_802_11_HOST_SLEEP_ACTIVATE, | ||
396 | &cmd, | ||
397 | sizeof(cmd), | ||
398 | lbs_ret_host_sleep_activate, 0); | ||
399 | if (ret) | ||
400 | lbs_pr_info("HOST_SLEEP_ACTIVATE " | ||
401 | "failed: %d\n", ret); | ||
402 | } | ||
403 | |||
404 | if (!wait_event_interruptible_timeout( | ||
405 | priv->host_sleep_q, | ||
406 | priv->is_host_sleep_activated, | ||
407 | (10 * HZ))) { | ||
408 | lbs_pr_err("host_sleep_q: timer expired\n"); | ||
409 | ret = -1; | ||
410 | } | ||
411 | } else { | ||
412 | lbs_pr_err("host sleep: already enabled\n"); | ||
413 | } | ||
414 | } else { | ||
415 | if (priv->is_host_sleep_activated) | ||
416 | ret = lbs_host_sleep_cfg(priv, criteria, | ||
417 | (struct wol_config *)NULL); | ||
418 | } | ||
419 | |||
420 | return ret; | ||
421 | } | ||
422 | |||
364 | /** | 423 | /** |
365 | * @brief Set an SNMP MIB value | 424 | * @brief Set an SNMP MIB value |
366 | * | 425 | * |