aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorLuis Carlos Cobo <luisca@cozybit.com>2007-08-02 13:16:02 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:50:11 -0400
commitd21b31fd53626f9c1d14fc676793dbe86b44d1c6 (patch)
tree3c5179f383c89bdffecd48565d7b38ed7db9e12c /drivers/net/wireless
parentb37e5842f5ab66f8d0533ee62ffe35c26ae800a3 (diff)
[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: Luis Carlos Cobo <luisca@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/libertas/dev.h1
-rw-r--r--drivers/net/wireless/libertas/if_usb.c26
-rw-r--r--drivers/net/wireless/libertas/main.c23
3 files changed, 49 insertions, 1 deletions
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
index f6b1402509f5..397c5fca0ff5 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -103,6 +103,7 @@ struct _wlan_private {
103 int open; 103 int open;
104 int mesh_open; 104 int mesh_open;
105 int infra_open; 105 int infra_open;
106 int mesh_autostart_enabled;
106 107
107 char name[DEV_NAME_LEN]; 108 char name[DEV_NAME_LEN];
108 109
diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
index 5efdeac6e208..670e1d23c043 100644
--- a/drivers/net/wireless/libertas/if_usb.c
+++ b/drivers/net/wireless/libertas/if_usb.c
@@ -990,6 +990,19 @@ static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
990 if (priv->adapter->psstate != PS_STATE_FULL_POWER) 990 if (priv->adapter->psstate != PS_STATE_FULL_POWER)
991 return -1; 991 return -1;
992 992
993 if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
994 /* Mesh autostart must be activated while sleeping
995 * On resume it will go back to the current state
996 */
997 struct cmd_ds_mesh_access mesh_access;
998 memset(&mesh_access, 0, sizeof(mesh_access));
999 mesh_access.data[0] = cpu_to_le32(1);
1000 libertas_prepare_and_send_command(priv,
1001 CMD_MESH_ACCESS,
1002 CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
1003 CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
1004 }
1005
993 netif_device_detach(cardp->eth_dev); 1006 netif_device_detach(cardp->eth_dev);
994 netif_device_detach(priv->mesh_dev); 1007 netif_device_detach(priv->mesh_dev);
995 1008
@@ -1017,6 +1030,19 @@ static int if_usb_resume(struct usb_interface *intf)
1017 netif_device_attach(cardp->eth_dev); 1030 netif_device_attach(cardp->eth_dev);
1018 netif_device_attach(priv->mesh_dev); 1031 netif_device_attach(priv->mesh_dev);
1019 1032
1033 if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
1034 /* Mesh autostart was activated while sleeping
1035 * Disable it if appropriate
1036 */
1037 struct cmd_ds_mesh_access mesh_access;
1038 memset(&mesh_access, 0, sizeof(mesh_access));
1039 mesh_access.data[0] = cpu_to_le32(0);
1040 libertas_prepare_and_send_command(priv,
1041 CMD_MESH_ACCESS,
1042 CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
1043 CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
1044 }
1045
1020 lbs_deb_leave(LBS_DEB_USB); 1046 lbs_deb_leave(LBS_DEB_USB);
1021 return 0; 1047 return 0;
1022} 1048}
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 9ccc9524153b..a3a17caae439 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -271,15 +271,20 @@ static ssize_t libertas_autostart_enabled_set(struct device * dev,
271{ 271{
272 struct cmd_ds_mesh_access mesh_access; 272 struct cmd_ds_mesh_access mesh_access;
273 uint32_t datum; 273 uint32_t datum;
274 wlan_private * priv = (to_net_dev(dev))->priv;
275 int ret;
274 276
275 memset(&mesh_access, 0, sizeof(mesh_access)); 277 memset(&mesh_access, 0, sizeof(mesh_access));
276 sscanf(buf, "%d", &datum); 278 sscanf(buf, "%d", &datum);
277 mesh_access.data[0] = cpu_to_le32(datum); 279 mesh_access.data[0] = cpu_to_le32(datum);
278 280
279 libertas_prepare_and_send_command((to_net_dev(dev))->priv, 281 ret = libertas_prepare_and_send_command(priv,
280 CMD_MESH_ACCESS, 282 CMD_MESH_ACCESS,
281 CMD_ACT_MESH_SET_AUTOSTART_ENABLED, 283 CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
282 CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access); 284 CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
285 if (ret == 0)
286 priv->mesh_autostart_enabled = datum ? 1 : 0;
287
283 return strlen(buf); 288 return strlen(buf);
284} 289}
285 290
@@ -853,6 +858,7 @@ static int wlan_setup_station_hw(wlan_private * priv)
853{ 858{
854 int ret = -1; 859 int ret = -1;
855 wlan_adapter *adapter = priv->adapter; 860 wlan_adapter *adapter = priv->adapter;
861 struct cmd_ds_mesh_access mesh_access;
856 862
857 lbs_deb_enter(LBS_DEB_FW); 863 lbs_deb_enter(LBS_DEB_FW);
858 864
@@ -889,6 +895,21 @@ static int wlan_setup_station_hw(wlan_private * priv)
889 goto done; 895 goto done;
890 } 896 }
891 897
898 /* Disable mesh autostart */
899 if (priv->mesh_dev) {
900 memset(&mesh_access, 0, sizeof(mesh_access));
901 mesh_access.data[0] = cpu_to_le32(0);
902 ret = libertas_prepare_and_send_command(priv,
903 CMD_MESH_ACCESS,
904 CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
905 CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
906 if (ret) {
907 ret = -1;
908 goto done;
909 }
910 priv->mesh_autostart_enabled = 0;
911 }
912
892 ret = 0; 913 ret = 0;
893done: 914done:
894 lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret); 915 lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);