Commit 66340e5b authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho

wlcore: allow setting sleep_auth before interface init

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: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 26b5858a
...@@ -246,6 +246,7 @@ static struct wlcore_conf wl12xx_conf = { ...@@ -246,6 +246,7 @@ static struct wlcore_conf wl12xx_conf = {
.forced_ps = false, .forced_ps = false,
.keep_alive_interval = 55000, .keep_alive_interval = 55000,
.max_listen_interval = 20, .max_listen_interval = 20,
.sta_sleep_auth = WL1271_PSM_ILLEGAL,
}, },
.itrim = { .itrim = {
.enable = false, .enable = false,
......
...@@ -372,6 +372,7 @@ static struct wlcore_conf wl18xx_conf = { ...@@ -372,6 +372,7 @@ static struct wlcore_conf wl18xx_conf = {
.forced_ps = false, .forced_ps = false,
.keep_alive_interval = 55000, .keep_alive_interval = 55000,
.max_listen_interval = 20, .max_listen_interval = 20,
.sta_sleep_auth = WL1271_PSM_ILLEGAL,
}, },
.itrim = { .itrim = {
.enable = false, .enable = false,
......
...@@ -70,7 +70,7 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth) ...@@ -70,7 +70,7 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
struct acx_sleep_auth *auth; struct acx_sleep_auth *auth;
int ret; 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); auth = kzalloc(sizeof(*auth), GFP_KERNEL);
if (!auth) { if (!auth) {
......
...@@ -120,6 +120,9 @@ enum wl1271_psm_mode { ...@@ -120,6 +120,9 @@ enum wl1271_psm_mode {
WL1271_PSM_ELP = 2, WL1271_PSM_ELP = 2,
WL1271_PSM_MAX = WL1271_PSM_ELP, WL1271_PSM_MAX = WL1271_PSM_ELP,
/* illegal out of band value of PSM mode */
WL1271_PSM_ILLEGAL = 0xff
}; };
struct acx_sleep_auth { struct acx_sleep_auth {
......
...@@ -951,6 +951,12 @@ struct conf_conn_settings { ...@@ -951,6 +951,12 @@ struct conf_conn_settings {
* Range: u16 * Range: u16
*/ */
u8 max_listen_interval; 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; } __packed;
enum { enum {
...@@ -1276,7 +1282,7 @@ struct conf_hangover_settings { ...@@ -1276,7 +1282,7 @@ struct conf_hangover_settings {
* version, the two LSB are the lower driver's private conf * version, the two LSB are the lower driver's private conf
* version. * version.
*/ */
#define WLCORE_CONF_VERSION (0x0001 << 16) #define WLCORE_CONF_VERSION (0x0002 << 16)
#define WLCORE_CONF_MASK 0xffff0000 #define WLCORE_CONF_MASK 0xffff0000
#define WLCORE_CONF_SIZE (sizeof(struct wlcore_conf_header) + \ #define WLCORE_CONF_SIZE (sizeof(struct wlcore_conf_header) + \
sizeof(struct wlcore_conf)) sizeof(struct wlcore_conf))
......
...@@ -995,8 +995,13 @@ static ssize_t sleep_auth_write(struct file *file, ...@@ -995,8 +995,13 @@ static ssize_t sleep_auth_write(struct file *file,
mutex_lock(&wl->mutex); 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; goto out;
}
ret = wl1271_ps_elp_wakeup(wl); ret = wl1271_ps_elp_wakeup(wl);
if (ret < 0) if (ret < 0)
......
...@@ -565,7 +565,13 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif) ...@@ -565,7 +565,13 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif)
if (ret < 0) if (ret < 0)
return ret; return ret;
} else if (!wl->sta_count) { } 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 */ /* Configure for power always on */
ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM); ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
if (ret < 0) if (ret < 0)
......
...@@ -5176,7 +5176,7 @@ struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size) ...@@ -5176,7 +5176,7 @@ struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size)
wl->channel_type = NL80211_CHAN_NO_HT; wl->channel_type = NL80211_CHAN_NO_HT;
wl->flags = 0; wl->flags = 0;
wl->sg_enabled = true; wl->sg_enabled = true;
wl->sleep_auth = WL1271_PSM_CAM; wl->sleep_auth = WL1271_PSM_ILLEGAL;
wl->hw_pg_ver = -1; wl->hw_pg_ver = -1;
wl->ap_ps_map = 0; wl->ap_ps_map = 0;
wl->ap_fw_ps_map = 0; wl->ap_fw_ps_map = 0;
......
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