wlcore: allow setting sleep_auth before interface init
authorArik Nemtsov <arik@wizery.com>
Sun, 10 Jun 2012 14:09:22 +0000 (17:09 +0300)
committerLuciano Coelho <coelho@ti.com>
Thu, 21 Jun 2012 09:51:41 +0000 (12:51 +0300)
Hold a value for sta_sleep_auth that is amenable to change by debugfs.
When detecting a legal value in this variable on interface init, use it
as an override value for sleep_auth.

This makes debugging more intuitive using the debugfs value.

Increment the conf version since we added an element to the conf
structure.

Note: An AP going up will always set sleep_auth to PSM_CAM.

Signed-off-by: Arik Nemtsov <arik@wizery.com>
Signed-off-by: Luciano Coelho <coelho@ti.com>
drivers/net/wireless/ti/wl12xx/main.c
drivers/net/wireless/ti/wl18xx/main.c
drivers/net/wireless/ti/wlcore/acx.c
drivers/net/wireless/ti/wlcore/acx.h
drivers/net/wireless/ti/wlcore/conf.h
drivers/net/wireless/ti/wlcore/debugfs.c
drivers/net/wireless/ti/wlcore/init.c
drivers/net/wireless/ti/wlcore/main.c

index 85d1600ee340c20056b30ad6de91d2b799695375..7974ed55dd5b4dcf44c206f86dc8eae8b40f8fcb 100644 (file)
@@ -246,6 +246,7 @@ static struct wlcore_conf wl12xx_conf = {
                .forced_ps                   = false,
                .keep_alive_interval         = 55000,
                .max_listen_interval         = 20,
+               .sta_sleep_auth              = WL1271_PSM_ILLEGAL,
        },
        .itrim = {
                .enable = false,
index b2ccff7d61884da2404689f2ccb534ae22d7cf76..d3f171ddebaef4692784735f2ca9ea441badee9c 100644 (file)
@@ -372,6 +372,7 @@ static struct wlcore_conf wl18xx_conf = {
                .forced_ps                   = false,
                .keep_alive_interval         = 55000,
                .max_listen_interval         = 20,
+               .sta_sleep_auth              = WL1271_PSM_ILLEGAL,
        },
        .itrim = {
                .enable = false,
index b56217f9bfd44ab46f85bd9feda48f1f4356b65b..3384bc14c824151498c76917efc4431bece9fab3 100644 (file)
@@ -70,7 +70,7 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
        struct acx_sleep_auth *auth;
        int ret;
 
-       wl1271_debug(DEBUG_ACX, "acx sleep auth");
+       wl1271_debug(DEBUG_ACX, "acx sleep auth %d", sleep_auth);
 
        auth = kzalloc(sizeof(*auth), GFP_KERNEL);
        if (!auth) {
index 168e0464411d9deacb69eb4bef21e4c5c32c4667..d03215d6b3bd2bc698cb38b465e51427798d37ec 100644 (file)
@@ -120,6 +120,9 @@ enum wl1271_psm_mode {
        WL1271_PSM_ELP = 2,
 
        WL1271_PSM_MAX = WL1271_PSM_ELP,
+
+       /* illegal out of band value of PSM mode */
+       WL1271_PSM_ILLEGAL = 0xff
 };
 
 struct acx_sleep_auth {
index 03c635872335cf0a5752b738cd06dd49923dd97b..d77224f2ac6bcbccfa6377f85c49a620a8fd2234 100644 (file)
@@ -951,6 +951,12 @@ struct conf_conn_settings {
         * Range: u16
         */
        u8 max_listen_interval;
+
+       /*
+        * Default sleep authorization for a new STA interface. This determines
+        * whether we can go to ELP.
+        */
+       u8 sta_sleep_auth;
 } __packed;
 
 enum {
@@ -1276,7 +1282,7 @@ struct conf_hangover_settings {
  * version, the two LSB are the lower driver's private conf
  * version.
  */
-#define WLCORE_CONF_VERSION    (0x0001 << 16)
+#define WLCORE_CONF_VERSION    (0x0002 << 16)
 #define WLCORE_CONF_MASK       0xffff0000
 #define WLCORE_CONF_SIZE       (sizeof(struct wlcore_conf_header) +    \
                                 sizeof(struct wlcore_conf))
index 91e43def013d26c8a76119a51bbd5beb1d10f703..1768f37049bdb59cb33f56ec61a1f0e44286632d 100644 (file)
@@ -995,8 +995,13 @@ static ssize_t sleep_auth_write(struct file *file,
 
        mutex_lock(&wl->mutex);
 
-       if (wl->state == WL1271_STATE_OFF)
+       wl->conf.conn.sta_sleep_auth = value;
+
+       if (wl->state == WL1271_STATE_OFF) {
+               /* this will show up on "read" in case we are off */
+               wl->sleep_auth = value;
                goto out;
+       }
 
        ret = wl1271_ps_elp_wakeup(wl);
        if (ret < 0)
index 645abd4b660db5284b15aa23b24eda2e7673e932..3fb9352bf5042d8bae0ef8ba119e8dec186714fb 100644 (file)
@@ -565,7 +565,13 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif)
                        if (ret < 0)
                                return ret;
                } else if (!wl->sta_count) {
-                       if (wl->quirks & WLCORE_QUIRK_NO_ELP) {
+                       u8 sta_auth = wl->conf.conn.sta_sleep_auth;
+                       if (sta_auth != WL1271_PSM_ILLEGAL) {
+                               /* Configure for power according to debugfs */
+                               ret = wl1271_acx_sleep_auth(wl, sta_auth);
+                               if (ret < 0)
+                                       return ret;
+                       } else if (wl->quirks & WLCORE_QUIRK_NO_ELP) {
                                /* Configure for power always on */
                                ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
                                if (ret < 0)
index 7677cd55f83eba9c51aa975ee833ee62e0d488c0..69643d19430185f8192427c217a74531c77dc648 100644 (file)
@@ -5176,7 +5176,7 @@ struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size)
        wl->channel_type = NL80211_CHAN_NO_HT;
        wl->flags = 0;
        wl->sg_enabled = true;
-       wl->sleep_auth = WL1271_PSM_CAM;
+       wl->sleep_auth = WL1271_PSM_ILLEGAL;
        wl->hw_pg_ver = -1;
        wl->ap_ps_map = 0;
        wl->ap_fw_ps_map = 0;