nl80211: advertise maximum remain-on-channel duration
authorJohannes Berg <johannes.berg@intel.com>
Tue, 14 Dec 2010 16:54:28 +0000 (17:54 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 15 Dec 2010 22:03:56 +0000 (17:03 -0500)
With the upcoming hardware offload implementation,
some devices will have a different maximum duration
for the remain-on-channel command. Advertise the
maximum duration in mac80211, and make mac80211 set
it.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
include/linux/nl80211.h
include/net/cfg80211.h
net/mac80211/main.c
net/wireless/nl80211.c

index b8fa25d741ba7cc27670d18453d90a7ad575f584..1cee56b3a79abf50c02a50a13d982805c7e34ac3 100644 (file)
@@ -773,6 +773,9 @@ enum nl80211_commands {
  *     cache, a wiphy attribute.
  *
  * @NL80211_ATTR_DURATION: Duration of an operation in milliseconds, u32.
+ * @NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION: Device attribute that
+ *     specifies the maximum duration that can be requested with the
+ *     remain-on-channel operation, in milliseconds, u32.
  *
  * @NL80211_ATTR_COOKIE: Generic 64-bit cookie to identify objects.
  *
@@ -1035,6 +1038,8 @@ enum nl80211_attrs {
 
        NL80211_ATTR_KEY_DEFAULT_TYPES,
 
+       NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
+
        /* add attributes here, update the policy in nl80211.c */
 
        __NL80211_ATTR_AFTER_LAST,
index 22be7c625b708185549f4ec19c0926c3af2d43c9..f45e15f124461233a87fb5e1dac0014c5c11992f 100644 (file)
@@ -1474,6 +1474,9 @@ struct ieee80211_txrx_stypes {
  *
  * @available_antennas: bitmap of antennas which are available to configure.
  *     antenna configuration commands will be rejected unless this is set.
+ *
+ * @max_remain_on_channel_duration: Maximum time a remain-on-channel operation
+ *     may request, if implemented.
  */
 struct wiphy {
        /* assign these fields before you register the wiphy */
@@ -1511,6 +1514,8 @@ struct wiphy {
        char fw_version[ETHTOOL_BUSINFO_LEN];
        u32 hw_version;
 
+       u16 max_remain_on_channel_duration;
+
        u8 max_num_pmkids;
 
        u32 available_antennas;
index f7bdb7c788799bf6a277a74e018b85a6cc61194c..d87eb005690f9bcdb3a0e5913e29156869e108a5 100644 (file)
@@ -745,6 +745,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
                }
        }
 
+       local->hw.wiphy->max_remain_on_channel_duration = 5000;
+
        result = wiphy_register(local->hw.wiphy);
        if (result < 0)
                goto fail_wiphy_register;
index 53f044370cde32869c76f4d0154fb275afd79a34..594a6ac8b9d2d423119536b89c8298d5e888158b 100644 (file)
@@ -755,6 +755,10 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags,
 
        nla_nest_end(msg, nl_cmds);
 
+       if (dev->ops->remain_on_channel)
+               NLA_PUT_U32(msg, NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
+                           dev->wiphy.max_remain_on_channel_duration);
+
        /* for now at least assume all drivers have it */
        if (dev->ops->mgmt_tx)
                NLA_PUT_FLAG(msg, NL80211_ATTR_OFFCHANNEL_TX_OK);
@@ -4228,7 +4232,8 @@ static int nl80211_remain_on_channel(struct sk_buff *skb,
         * We should be on that channel for at least one jiffie,
         * and more than 5 seconds seems excessive.
         */
-       if (!duration || !msecs_to_jiffies(duration) || duration > 5000)
+       if (!duration || !msecs_to_jiffies(duration) ||
+           duration > rdev->wiphy.max_remain_on_channel_duration)
                return -EINVAL;
 
        if (!rdev->ops->remain_on_channel)