wl12xx: configure sleep_policy according to active roles
If there is an active AP role, stay always on. Otherwise, allow chip to enter elp. (Note that this is a global configuration, so if the device is already configured according to our policy, we don't have to configure it again) Signed-off-by: Eliad Peller <eliad@wizery.com> Signed-off-by: Luciano Coelho <coelho@ti.com>
This commit is contained in:
committed by
Luciano Coelho
parent
a32d0cdfcb
commit
a4e4130dce
@@ -343,11 +343,6 @@ static int wl1271_sta_hw_init(struct wl1271 *wl, struct wl12xx_vif *wlvif)
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* Configure for ELP power saving */
|
|
||||||
ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = wl1271_acx_sta_rate_policies(wl, wlvif);
|
ret = wl1271_acx_sta_rate_policies(wl, wlvif);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -382,11 +377,6 @@ static int wl1271_ap_hw_init(struct wl1271 *wl, struct wl12xx_vif *wlvif)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Configure for power always on */
|
|
||||||
ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ret = wl1271_init_ap_rates(wl, wlvif);
|
ret = wl1271_init_ap_rates(wl, wlvif);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -577,9 +567,26 @@ int wl1271_init_vif_specific(struct wl1271 *wl, struct ieee80211_vif *vif)
|
|||||||
struct conf_tx_ac_category *conf_ac;
|
struct conf_tx_ac_category *conf_ac;
|
||||||
struct conf_tx_tid *conf_tid;
|
struct conf_tx_tid *conf_tid;
|
||||||
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.
|
||||||
|
* TODO: reconfigure on interface removal.
|
||||||
|
*/
|
||||||
|
if (!wl->ap_count) {
|
||||||
|
if (is_ap) {
|
||||||
|
/* Configure for power always on */
|
||||||
|
ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
} else if (!wl->sta_count) {
|
||||||
|
/* 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 */
|
||||||
if (is_ap) {
|
if (is_ap) {
|
||||||
ret = wl1271_ap_hw_init(wl, wlvif);
|
ret = wl1271_ap_hw_init(wl, wlvif);
|
||||||
|
@@ -2117,6 +2117,11 @@ static int wl1271_op_add_interface(struct ieee80211_hw *hw,
|
|||||||
wl->vif = vif;
|
wl->vif = vif;
|
||||||
list_add(&wlvif->list, &wl->wlvif_list);
|
list_add(&wlvif->list, &wl->wlvif_list);
|
||||||
set_bit(WL1271_FLAG_IF_INITIALIZED, &wl->flags);
|
set_bit(WL1271_FLAG_IF_INITIALIZED, &wl->flags);
|
||||||
|
|
||||||
|
if (wlvif->bss_type == BSS_TYPE_AP_BSS)
|
||||||
|
wl->ap_count++;
|
||||||
|
else
|
||||||
|
wl->sta_count++;
|
||||||
out:
|
out:
|
||||||
mutex_unlock(&wl->mutex);
|
mutex_unlock(&wl->mutex);
|
||||||
|
|
||||||
@@ -2188,6 +2193,11 @@ 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)
|
||||||
|
wl->ap_count--;
|
||||||
|
else
|
||||||
|
wl->sta_count--;
|
||||||
|
|
||||||
mutex_unlock(&wl->mutex);
|
mutex_unlock(&wl->mutex);
|
||||||
cancel_delayed_work_sync(&wlvif->pspoll_work);
|
cancel_delayed_work_sync(&wlvif->pspoll_work);
|
||||||
|
|
||||||
|
@@ -395,6 +395,8 @@ struct wl1271 {
|
|||||||
unsigned long roc_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
|
unsigned long roc_map[BITS_TO_LONGS(WL12XX_MAX_ROLES)];
|
||||||
|
|
||||||
struct list_head wlvif_list;
|
struct list_head wlvif_list;
|
||||||
|
u8 sta_count;
|
||||||
|
u8 ap_count;
|
||||||
|
|
||||||
struct wl1271_acx_mem_map *target_mem_map;
|
struct wl1271_acx_mem_map *target_mem_map;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user