Commit 2f18cf7c authored by Arik Nemtsov's avatar Arik Nemtsov Committed by Luciano Coelho

wlcore: reconfigure sleep_auth when removing interfaces

The sleep_auth value of the last interface to be set up prevailed when
an interface was removed. Take care of this by correctly configuring the
value according to the remaining STA/AP interfaces.

Take this opportunity to refactor the sleep_auth setting code for better
readability.

[Small style fix. -- Luca]
Signed-off-by: default avatarArik Nemtsov <arik@wizery.com>
Signed-off-by: default avatarLuciano Coelho <coelho@ti.com>
parent 66340e5b
...@@ -81,8 +81,11 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth) ...@@ -81,8 +81,11 @@ int wl1271_acx_sleep_auth(struct wl1271 *wl, u8 sleep_auth)
auth->sleep_auth = sleep_auth; auth->sleep_auth = sleep_auth;
ret = wl1271_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth)); ret = wl1271_cmd_configure(wl, ACX_SLEEP_AUTH, auth, sizeof(*auth));
if (ret < 0) if (ret < 0) {
wl1271_error("could not configure sleep_auth to %d: %d",
sleep_auth, ret);
goto out; goto out;
}
wl->sleep_auth = sleep_auth; wl->sleep_auth = sleep_auth;
out: out:
......
...@@ -554,35 +554,28 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif) ...@@ -554,35 +554,28 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif)
bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS); bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
int ret, i; int ret, i;
/* /* consider all existing roles before configuring psm. */
* consider all existing roles before configuring psm.
* TODO: reconfigure on interface removal. if (wl->ap_count == 0 && is_ap) { /* first AP */
*/ /* Configure for power always on */
if (!wl->ap_count) { ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
if (is_ap) { if (ret < 0)
/* Configure for power always on */ return ret;
/* first STA, no APs */
} else if (wl->sta_count == 0 && wl->ap_count == 0 && !is_ap) {
u8 sta_auth = wl->conf.conn.sta_sleep_auth;
/* Configure for power according to debugfs */
if (sta_auth != WL1271_PSM_ILLEGAL)
ret = wl1271_acx_sleep_auth(wl, sta_auth);
/* Configure for power always on */
else if (wl->quirks & WLCORE_QUIRK_NO_ELP)
ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM); ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
if (ret < 0) /* Configure for ELP power saving */
return ret; else
} else if (!wl->sta_count) { ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
u8 sta_auth = wl->conf.conn.sta_sleep_auth;
if (sta_auth != WL1271_PSM_ILLEGAL) { if (ret < 0)
/* Configure for power according to debugfs */ return ret;
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)
return ret;
} else {
/* Configure for ELP power saving */
ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
if (ret < 0)
return ret;
}
}
} }
/* Mode specific init */ /* Mode specific init */
......
...@@ -1082,7 +1082,7 @@ int wl1271_plt_stop(struct wl1271 *wl) ...@@ -1082,7 +1082,7 @@ int wl1271_plt_stop(struct wl1271 *wl)
mutex_lock(&wl->mutex); mutex_lock(&wl->mutex);
wl1271_power_off(wl); wl1271_power_off(wl);
wl->flags = 0; wl->flags = 0;
wl->sleep_auth = WL1271_PSM_CAM; wl->sleep_auth = WL1271_PSM_ILLEGAL;
wl->state = WL1271_STATE_OFF; wl->state = WL1271_STATE_OFF;
wl->plt = false; wl->plt = false;
wl->rx_counter = 0; wl->rx_counter = 0;
...@@ -1741,7 +1741,7 @@ static void wl1271_op_stop(struct ieee80211_hw *hw) ...@@ -1741,7 +1741,7 @@ static void wl1271_op_stop(struct ieee80211_hw *hw)
wl->ap_fw_ps_map = 0; wl->ap_fw_ps_map = 0;
wl->ap_ps_map = 0; wl->ap_ps_map = 0;
wl->sched_scanning = false; wl->sched_scanning = false;
wl->sleep_auth = WL1271_PSM_CAM; wl->sleep_auth = WL1271_PSM_ILLEGAL;
memset(wl->roles_map, 0, sizeof(wl->roles_map)); memset(wl->roles_map, 0, sizeof(wl->roles_map));
memset(wl->links_map, 0, sizeof(wl->links_map)); memset(wl->links_map, 0, sizeof(wl->links_map));
memset(wl->roc_map, 0, sizeof(wl->roc_map)); memset(wl->roc_map, 0, sizeof(wl->roc_map));
...@@ -2148,6 +2148,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl, ...@@ -2148,6 +2148,7 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
{ {
struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
int i, ret; int i, ret;
bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface"); wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
...@@ -2228,11 +2229,25 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl, ...@@ -2228,11 +2229,25 @@ static void __wl1271_op_remove_interface(struct wl1271 *wl,
wlvif->role_id = WL12XX_INVALID_ROLE_ID; wlvif->role_id = WL12XX_INVALID_ROLE_ID;
wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID; wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
if (wlvif->bss_type == BSS_TYPE_AP_BSS) if (is_ap)
wl->ap_count--; wl->ap_count--;
else else
wl->sta_count--; wl->sta_count--;
/* Last AP, have more stations. Configure according to STA. */
if (wl->ap_count == 0 && is_ap && wl->sta_count) {
u8 sta_auth = wl->conf.conn.sta_sleep_auth;
/* Configure for power according to debugfs */
if (sta_auth != WL1271_PSM_ILLEGAL)
wl1271_acx_sleep_auth(wl, sta_auth);
/* Configure for power always on */
else if (wl->quirks & WLCORE_QUIRK_NO_ELP)
wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
/* Configure for ELP power saving */
else
wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
}
mutex_unlock(&wl->mutex); mutex_unlock(&wl->mutex);
del_timer_sync(&wlvif->rx_streaming_timer); del_timer_sync(&wlvif->rx_streaming_timer);
......
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