Commit ab25ecae authored by David Woodhouse's avatar David Woodhouse Committed by David S. Miller

libertas: implement suspend and resume core methods

We (ab)use priv->fw_ready to stop the worker thread from sending more
commands or data after the response to the HOST_SLEEP_ACTIVATE command
comes in. And we set it from the callback function _directly_ to ensure
that the worker thread sees it immediately; if we did it in
lbs_suspend() after waking up, that might be too late.
Signed-off-by: default avatarDavid Woodhouse <dwmw2@infradead.org>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent f3db2bb4
...@@ -35,5 +35,7 @@ int lbs_mesh_config(struct lbs_private *priv, int enable); ...@@ -35,5 +35,7 @@ int lbs_mesh_config(struct lbs_private *priv, int enable);
int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria, int lbs_host_sleep_cfg(struct lbs_private *priv, uint32_t criteria,
uint8_t gpio, uint8_t gap); uint8_t gpio, uint8_t gap);
int lbs_suspend(struct lbs_private *priv);
int lbs_resume(struct lbs_private *priv);
#endif /* _LBS_CMD_H */ #endif /* _LBS_CMD_H */
...@@ -820,6 +820,53 @@ static int lbs_thread(void *data) ...@@ -820,6 +820,53 @@ static int lbs_thread(void *data)
return 0; return 0;
} }
static int lbs_suspend_callback(struct lbs_private *priv, unsigned long dummy,
struct cmd_header *cmd)
{
lbs_deb_fw("HOST_SLEEP_ACTIVATE succeeded\n");
netif_device_detach(priv->dev);
if (priv->mesh_dev)
netif_device_detach(priv->mesh_dev);
priv->fw_ready = 0;
return 0;
}
int lbs_suspend(struct lbs_private *priv)
{
struct cmd_header cmd;
int ret;
memset(&cmd, 0, sizeof(cmd));
ret = __lbs_cmd(priv, CMD_802_11_HOST_SLEEP_ACTIVATE, &cmd,
sizeof(cmd), lbs_suspend_callback, 0);
if (ret)
lbs_pr_info("HOST_SLEEP_ACTIVATE failed: %d\n", ret);
return ret;
}
EXPORT_SYMBOL_GPL(lbs_suspend);
int lbs_resume(struct lbs_private *priv)
{
priv->fw_ready = 1;
/* Firmware doesn't seem to give us RX packets any more
until we send it some command. Might as well update */
lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
0, 0, NULL);
netif_device_attach(priv->dev);
if (priv->mesh_dev)
netif_device_attach(priv->mesh_dev);
return 0;
}
EXPORT_SYMBOL_GPL(lbs_resume);
/** /**
* @brief This function downloads firmware image, gets * @brief This function downloads firmware image, gets
* HW spec from firmware and set basic parameters to * HW spec from firmware and set basic parameters to
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment