cfg80211: allow driver to override PS default
authorJohannes Berg <johannes@sipsolutions.net>
Wed, 12 Aug 2009 21:33:20 +0000 (23:33 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 14 Aug 2009 13:14:08 +0000 (09:14 -0400)
Sometimes drivers might have a good reason to override
the PS default, like iwlwifi right now where it affects
RX performance significantly at this point. This will
allow them to override the default, if desired, in a
way that users can still change it according to their
trade-off choices, not the driver's, like would happen
if the driver just disabled PS completely then.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/net/cfg80211.h
net/wireless/core.c

index 223913434e51a25d870ed7311e7d18dbbee9e79a..0b146bb2dd14d53d34b0b7a0677d679bf227583a 100644 (file)
@@ -1108,6 +1108,9 @@ struct cfg80211_ops {
  * @net: the network namespace this wiphy currently lives in
  * @netnsok: if set to false, do not allow changing the netns of this
  *     wiphy at all
+ * @ps_default: default for powersave, will be set depending on the
+ *     kernel's default on wiphy_new(), but can be changed by the
+ *     driver if it has a good reason to override the default
  */
 struct wiphy {
        /* assign these fields before you register the wiphy */
@@ -1123,6 +1126,7 @@ struct wiphy {
        bool disable_beacon_hints;
 
        bool netnsok;
+       bool ps_default;
 
        enum cfg80211_signal_type signal_type;
 
index 35d83bedfe5b16792466f436ae112640437b994c..bc99e4ec7463147814880b4e3cd741e64aaf40a1 100644 (file)
@@ -412,6 +412,8 @@ struct wiphy *wiphy_new(const struct cfg80211_ops *ops, int sizeof_priv)
        rdev->wiphy.dev.class = &ieee80211_class;
        rdev->wiphy.dev.platform_data = rdev;
 
+       rdev->wiphy.ps_default = CONFIG_CFG80211_DEFAULT_PS_VALUE;
+
        wiphy_net_set(&rdev->wiphy, &init_net);
 
        rdev->rfkill_ops.set_block = cfg80211_rfkill_set_block;
@@ -674,7 +676,7 @@ static int cfg80211_netdev_notifier_call(struct notifier_block * nb,
                wdev->wext.default_key = -1;
                wdev->wext.default_mgmt_key = -1;
                wdev->wext.connect.auth_type = NL80211_AUTHTYPE_AUTOMATIC;
-               wdev->wext.ps = CONFIG_CFG80211_DEFAULT_PS_VALUE;
+               wdev->wext.ps = wdev->wiphy->ps_default;
                wdev->wext.ps_timeout = 100;
                if (rdev->ops->set_power_mgmt)
                        if (rdev->ops->set_power_mgmt(wdev->wiphy, dev,