mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-29 23:53:32 +00:00
staging: wfx: ignore PS when STA/AP share same channel
When multiple interface are in use. One is always AP while the other is always station. When the two interface use the same channel, it makes no sense to enabled Power Saving (PS) on the station. Indeed, because of the AP, the device will be kept awake on this channel anyway. In add, when multiple interface are in use, mac80211 does not update the PS information and delegate to the driver responsibility to do the right thing. Thus, in the current code, when the user enable PS in this configuration, the driver finally enable PS-Poll which is probably not what the user expected. This patch detect this case and applies a sane configuration in all cases. Signed-off-by: Jérôme Pouiller <jerome.pouiller@silabs.com> Link: https://lore.kernel.org/r/20210913130203.1903622-4-Jerome.Pouiller@silabs.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
0ccb2c9d05
commit
a5a8eb1fe7
1 changed files with 20 additions and 12 deletions
|
@ -154,18 +154,26 @@ static int wfx_get_ps_timeout(struct wfx_vif *wvif, bool *enable_ps)
|
|||
chan0 = wdev_to_wvif(wvif->wdev, 0)->vif->bss_conf.chandef.chan;
|
||||
if (wdev_to_wvif(wvif->wdev, 1))
|
||||
chan1 = wdev_to_wvif(wvif->wdev, 1)->vif->bss_conf.chandef.chan;
|
||||
if (chan0 && chan1 && chan0->hw_value != chan1->hw_value &&
|
||||
wvif->vif->type != NL80211_IFTYPE_AP) {
|
||||
// It is necessary to enable powersave if channels
|
||||
// are different.
|
||||
if (enable_ps)
|
||||
*enable_ps = true;
|
||||
if (wvif->wdev->force_ps_timeout > -1)
|
||||
return wvif->wdev->force_ps_timeout;
|
||||
else if (wfx_api_older_than(wvif->wdev, 3, 2))
|
||||
return 0;
|
||||
else
|
||||
return 30;
|
||||
if (chan0 && chan1 && wvif->vif->type != NL80211_IFTYPE_AP) {
|
||||
if (chan0->hw_value == chan1->hw_value) {
|
||||
// It is useless to enable PS if channels are the same.
|
||||
if (enable_ps)
|
||||
*enable_ps = false;
|
||||
if (wvif->vif->bss_conf.assoc && wvif->vif->bss_conf.ps)
|
||||
dev_info(wvif->wdev->dev, "ignoring requested PS mode");
|
||||
return -1;
|
||||
} else {
|
||||
// It is necessary to enable PS if channels
|
||||
// are different.
|
||||
if (enable_ps)
|
||||
*enable_ps = true;
|
||||
if (wvif->wdev->force_ps_timeout > -1)
|
||||
return wvif->wdev->force_ps_timeout;
|
||||
else if (wfx_api_older_than(wvif->wdev, 3, 2))
|
||||
return 0;
|
||||
else
|
||||
return 30;
|
||||
}
|
||||
}
|
||||
if (enable_ps)
|
||||
*enable_ps = wvif->vif->bss_conf.ps;
|
||||
|
|
Loading…
Reference in a new issue