Commit d21b31fd authored by Luis Carlos Cobo's avatar Luis Carlos Cobo Committed by David S. Miller

[PATCH] libertas: keep mesh autostart enabled while asleep

After loading the firmware, mesh autostart will be disabled. After that, the
user will still be able to enable or disable it at will. On suspend, it will be
always activated and later on resume it will go back to the state it had before
going to sleep.
Signed-off-by: default avatarLuis Carlos Cobo <luisca@cozybit.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent b37e5842
...@@ -103,6 +103,7 @@ struct _wlan_private { ...@@ -103,6 +103,7 @@ struct _wlan_private {
int open; int open;
int mesh_open; int mesh_open;
int infra_open; int infra_open;
int mesh_autostart_enabled;
char name[DEV_NAME_LEN]; char name[DEV_NAME_LEN];
......
...@@ -990,6 +990,19 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message) ...@@ -990,6 +990,19 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
if (priv->adapter->psstate != PS_STATE_FULL_POWER) if (priv->adapter->psstate != PS_STATE_FULL_POWER)
return -1; return -1;
if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
/* Mesh autostart must be activated while sleeping
* On resume it will go back to the current state
*/
struct cmd_ds_mesh_access mesh_access;
memset(&mesh_access, 0, sizeof(mesh_access));
mesh_access.data[0] = cpu_to_le32(1);
libertas_prepare_and_send_command(priv,
CMD_MESH_ACCESS,
CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
}
netif_device_detach(cardp->eth_dev); netif_device_detach(cardp->eth_dev);
netif_device_detach(priv->mesh_dev); netif_device_detach(priv->mesh_dev);
...@@ -1017,6 +1030,19 @@ static int if_usb_resume(struct usb_interface *intf) ...@@ -1017,6 +1030,19 @@ static int if_usb_resume(struct usb_interface *intf)
netif_device_attach(cardp->eth_dev); netif_device_attach(cardp->eth_dev);
netif_device_attach(priv->mesh_dev); netif_device_attach(priv->mesh_dev);
if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
/* Mesh autostart was activated while sleeping
* Disable it if appropriate
*/
struct cmd_ds_mesh_access mesh_access;
memset(&mesh_access, 0, sizeof(mesh_access));
mesh_access.data[0] = cpu_to_le32(0);
libertas_prepare_and_send_command(priv,
CMD_MESH_ACCESS,
CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
}
lbs_deb_leave(LBS_DEB_USB); lbs_deb_leave(LBS_DEB_USB);
return 0; return 0;
} }
......
...@@ -271,15 +271,20 @@ static ssize_t libertas_autostart_enabled_set(struct device * dev, ...@@ -271,15 +271,20 @@ static ssize_t libertas_autostart_enabled_set(struct device * dev,
{ {
struct cmd_ds_mesh_access mesh_access; struct cmd_ds_mesh_access mesh_access;
uint32_t datum; uint32_t datum;
wlan_private * priv = (to_net_dev(dev))->priv;
int ret;
memset(&mesh_access, 0, sizeof(mesh_access)); memset(&mesh_access, 0, sizeof(mesh_access));
sscanf(buf, "%d", &datum); sscanf(buf, "%d", &datum);
mesh_access.data[0] = cpu_to_le32(datum); mesh_access.data[0] = cpu_to_le32(datum);
libertas_prepare_and_send_command((to_net_dev(dev))->priv, ret = libertas_prepare_and_send_command(priv,
CMD_MESH_ACCESS, CMD_MESH_ACCESS,
CMD_ACT_MESH_SET_AUTOSTART_ENABLED, CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access); CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
if (ret == 0)
priv->mesh_autostart_enabled = datum ? 1 : 0;
return strlen(buf); return strlen(buf);
} }
...@@ -853,6 +858,7 @@ static int wlan_setup_station_hw(wlan_private * priv) ...@@ -853,6 +858,7 @@ static int wlan_setup_station_hw(wlan_private * priv)
{ {
int ret = -1; int ret = -1;
wlan_adapter *adapter = priv->adapter; wlan_adapter *adapter = priv->adapter;
struct cmd_ds_mesh_access mesh_access;
lbs_deb_enter(LBS_DEB_FW); lbs_deb_enter(LBS_DEB_FW);
...@@ -889,6 +895,21 @@ static int wlan_setup_station_hw(wlan_private * priv) ...@@ -889,6 +895,21 @@ static int wlan_setup_station_hw(wlan_private * priv)
goto done; goto done;
} }
/* Disable mesh autostart */
if (priv->mesh_dev) {
memset(&mesh_access, 0, sizeof(mesh_access));
mesh_access.data[0] = cpu_to_le32(0);
ret = libertas_prepare_and_send_command(priv,
CMD_MESH_ACCESS,
CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
if (ret) {
ret = -1;
goto done;
}
priv->mesh_autostart_enabled = 0;
}
ret = 0; ret = 0;
done: done:
lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret); lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
......
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