Skip to content
Snippets Groups Projects
Commit bf6a0579 authored by Juuso Oikarinen's avatar Juuso Oikarinen Committed by John W. Linville
Browse files

cfg80211: Fix power save state after interface type change


Currently cfg80211 only configures the PSM state to the driver upon creation
of a new virtual interface, but not after interface type change. The mac80211
on the other hand reinitializes its sdata structure every time the interface
type is changed, losing the PSM configuration.

Hence, if the interface type is changed to, say, ad-hoc and then back to
managed, "iw wlan0 get power_save" will claim that PSM is enabled, when in
fact on mac80211 level it is not.

Fix this in cfg80211 by configuring the PSM state to the driver each time
the interface is brought up instead of just when the interface is created.

Signed-off-by: default avatarJuuso Oikarinen <juuso.oikarinen@nokia.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 73b30dfe
No related branches found
No related tags found
No related merge requests found
...@@ -718,13 +718,6 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb, ...@@ -718,13 +718,6 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
wdev->ps = false; wdev->ps = false;
/* allow mac80211 to determine the timeout */ /* allow mac80211 to determine the timeout */
wdev->ps_timeout = -1; wdev->ps_timeout = -1;
if (rdev->ops->set_power_mgmt)
if (rdev->ops->set_power_mgmt(wdev->wiphy, dev,
wdev->ps,
wdev->ps_timeout)) {
/* assume this means it's off */
wdev->ps = false;
}
if (!dev->ethtool_ops) if (!dev->ethtool_ops)
dev->ethtool_ops = &cfg80211_ethtool_ops; dev->ethtool_ops = &cfg80211_ethtool_ops;
...@@ -813,6 +806,19 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb, ...@@ -813,6 +806,19 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
rdev->opencount++; rdev->opencount++;
mutex_unlock(&rdev->devlist_mtx); mutex_unlock(&rdev->devlist_mtx);
cfg80211_unlock_rdev(rdev); cfg80211_unlock_rdev(rdev);
/*
* Configure power management to the driver here so that its
* correctly set also after interface type changes etc.
*/
if (wdev->iftype == NL80211_IFTYPE_STATION &&
rdev->ops->set_power_mgmt)
if (rdev->ops->set_power_mgmt(wdev->wiphy, dev,
wdev->ps,
wdev->ps_timeout)) {
/* assume this means it's off */
wdev->ps = false;
}
break; break;
case NETDEV_UNREGISTER: case NETDEV_UNREGISTER:
/* /*
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment