[PATCH] libertas: keep mesh autostart disabled while awake and enabled while asleep
Dan Williams
dcbw at redhat.com
Sun Jul 15 12:45:03 EDT 2007
On Fri, 2007-07-13 at 12:15 -0700, Luis Carlos Cobo wrote:
> 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.
Looks good and appears to do the right thing, but I _still_ cannot get
two machines to talk to each other when autostart_enabled == 0, but
keeping autostart == 1 works just fine. We really need to figure out
what this issue is.
Dan
> Signed-off-by: Luis Carlos Cobo <luisca at cozybit.com>
> ---
> drivers/net/wireless/libertas/dev.h | 1 +
> drivers/net/wireless/libertas/if_usb.c | 26 ++++++++++++++++++++++++++
> drivers/net/wireless/libertas/main.c | 16 ++++++++++++++++
> 3 files changed, 43 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h
> index f6b1402..397c5fc 100644
> --- a/drivers/net/wireless/libertas/dev.h
> +++ b/drivers/net/wireless/libertas/dev.h
> @@ -103,6 +103,7 @@ struct _wlan_private {
> int open;
> int mesh_open;
> int infra_open;
> + int mesh_autostart_enabled;
>
> char name[DEV_NAME_LEN];
>
> diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
> index 5efdeac..d20b7cc 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)
> if (priv->adapter->psstate != PS_STATE_FULL_POWER)
> 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(priv->mesh_dev);
>
> @@ -1016,6 +1029,19 @@ static int if_usb_resume(struct usb_interface *intf)
>
> netif_device_attach(cardp->eth_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);
> return 0;
> diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
> index 9ccc952..d5a929a 100644
> --- a/drivers/net/wireless/libertas/main.c
> +++ b/drivers/net/wireless/libertas/main.c
> @@ -853,6 +853,7 @@ static int wlan_setup_station_hw(wlan_private * priv)
> {
> int ret = -1;
> wlan_adapter *adapter = priv->adapter;
> + struct cmd_ds_mesh_access mesh_access;
>
> lbs_deb_enter(LBS_DEB_FW);
>
> @@ -889,6 +890,21 @@ static int wlan_setup_station_hw(wlan_private * priv)
> 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;
> done:
> lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
More information about the libertas-dev
mailing list