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: Arik Nemtsov <arik@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:
committed by
Luciano Coelho
parent
66340e5b25
commit
2f18cf7c3b
@@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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 @@ deinit:
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user