Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=d21b31fd53626f9c1d14fc676793dbe86b44d1c6
Commit:     d21b31fd53626f9c1d14fc676793dbe86b44d1c6
Parent:     b37e5842f5ab66f8d0533ee62ffe35c26ae800a3
Author:     Luis Carlos Cobo <[EMAIL PROTECTED]>
AuthorDate: Thu Aug 2 13:16:02 2007 -0400
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Oct 10 16:50:11 2007 -0700

    [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 <[EMAIL PROTECTED]>
    Signed-off-by: John W. Linville <[EMAIL PROTECTED]>
---
 drivers/net/wireless/libertas/dev.h    |    1 +
 drivers/net/wireless/libertas/if_usb.c |   26 ++++++++++++++++++++++++++
 drivers/net/wireless/libertas/main.c   |   23 ++++++++++++++++++++++-
 3 files changed, 49 insertions(+), 1 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..670e1d2 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);
 
@@ -1017,6 +1030,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..a3a17ca 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,
 {
        struct cmd_ds_mesh_access mesh_access;
        uint32_t datum;
+       wlan_private * priv = (to_net_dev(dev))->priv;
+       int ret;
 
        memset(&mesh_access, 0, sizeof(mesh_access));
        sscanf(buf, "%d", &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_ACT_MESH_SET_AUTOSTART_ENABLED,
                        CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
+       if (ret == 0)
+               priv->mesh_autostart_enabled = datum ? 1 : 0;
+
        return strlen(buf);
 }
 
@@ -853,6 +858,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 +895,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);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to