Commit c6522a50 authored by Loic Poulain's avatar Loic Poulain Committed by Kalle Valo

wcn36xx: Disable bmps when encryption is disabled

For whatever reason, when connected to an open/no-security BSS,
the wcn36xx controller in bmps mode does not forward 'wake-up'
beacons despite AP sends DTIM with station AID.

Meaning that AP is not able to wakeup the station and needs to wait
for the station to wakeup by its own (TX data, keep alive pkt...),
causing serious latency issues and unexpected deauth.

When connected to AP with encryption enabled, this issue does not occur.
So a simple workaround is to only enable bmps support in that case.

Ideally, it should be propertly fixed to allow bmps support with open
BSS, whatever the issue is at driver or firmware level.

Tested on wcn3620 and wcn3680.
Signed-off-by: default avatarLoic Poulain <loic.poulain@linaro.org>
Tested-by: default avatarBryan O'Donoghue <bryan.odonoghue@linaro.org>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/1598363127-26066-1-git-send-email-loic.poulain@linaro.org
parent 1fcdb567
...@@ -610,6 +610,15 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, ...@@ -610,6 +610,15 @@ static int wcn36xx_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
} }
} }
} }
/* FIXME: Only enable bmps support when encryption is enabled.
* For any reasons, when connected to open/no-security BSS,
* the wcn36xx controller in bmps mode does not forward
* 'wake-up' beacons despite AP sends DTIM with station AID.
* It could be due to a firmware issue or to the way driver
* configure the station.
*/
if (vif->type == NL80211_IFTYPE_STATION)
vif_priv->allow_bmps = true;
break; break;
case DISABLE_KEY: case DISABLE_KEY:
if (!(IEEE80211_KEY_FLAG_PAIRWISE & key_conf->flags)) { if (!(IEEE80211_KEY_FLAG_PAIRWISE & key_conf->flags)) {
...@@ -891,6 +900,7 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw, ...@@ -891,6 +900,7 @@ static void wcn36xx_bss_info_changed(struct ieee80211_hw *hw,
vif->addr, vif->addr,
bss_conf->aid); bss_conf->aid);
vif_priv->sta_assoc = false; vif_priv->sta_assoc = false;
vif_priv->allow_bmps = false;
wcn36xx_smd_set_link_st(wcn, wcn36xx_smd_set_link_st(wcn,
bss_conf->bssid, bss_conf->bssid,
vif->addr, vif->addr,
......
...@@ -23,7 +23,10 @@ int wcn36xx_pmc_enter_bmps_state(struct wcn36xx *wcn, ...@@ -23,7 +23,10 @@ int wcn36xx_pmc_enter_bmps_state(struct wcn36xx *wcn,
{ {
int ret = 0; int ret = 0;
struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif); struct wcn36xx_vif *vif_priv = wcn36xx_vif_to_priv(vif);
/* TODO: Make sure the TX chain clean */
if (!vif_priv->allow_bmps)
return -ENOTSUPP;
ret = wcn36xx_smd_enter_bmps(wcn, vif); ret = wcn36xx_smd_enter_bmps(wcn, vif);
if (!ret) { if (!ret) {
wcn36xx_dbg(WCN36XX_DBG_PMC, "Entered BMPS\n"); wcn36xx_dbg(WCN36XX_DBG_PMC, "Entered BMPS\n");
......
...@@ -122,6 +122,7 @@ struct wcn36xx_vif { ...@@ -122,6 +122,7 @@ struct wcn36xx_vif {
enum wcn36xx_hal_bss_type bss_type; enum wcn36xx_hal_bss_type bss_type;
/* Power management */ /* Power management */
bool allow_bmps;
enum wcn36xx_power_state pw_state; enum wcn36xx_power_state pw_state;
u8 bss_index; u8 bss_index;
......
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