Commit a293911d authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

nl80211: advertise maximum remain-on-channel duration

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: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 14a085e7
...@@ -773,6 +773,9 @@ enum nl80211_commands { ...@@ -773,6 +773,9 @@ enum nl80211_commands {
* cache, a wiphy attribute. * cache, a wiphy attribute.
* *
* @NL80211_ATTR_DURATION: Duration of an operation in milliseconds, u32. * @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. * @NL80211_ATTR_COOKIE: Generic 64-bit cookie to identify objects.
* *
...@@ -1035,6 +1038,8 @@ enum nl80211_attrs { ...@@ -1035,6 +1038,8 @@ enum nl80211_attrs {
NL80211_ATTR_KEY_DEFAULT_TYPES, NL80211_ATTR_KEY_DEFAULT_TYPES,
NL80211_ATTR_MAX_REMAIN_ON_CHANNEL_DURATION,
/* add attributes here, update the policy in nl80211.c */ /* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST, __NL80211_ATTR_AFTER_LAST,
......
...@@ -1474,6 +1474,9 @@ struct ieee80211_txrx_stypes { ...@@ -1474,6 +1474,9 @@ struct ieee80211_txrx_stypes {
* *
* @available_antennas: bitmap of antennas which are available to configure. * @available_antennas: bitmap of antennas which are available to configure.
* antenna configuration commands will be rejected unless this is set. * 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 { struct wiphy {
/* assign these fields before you register the wiphy */ /* assign these fields before you register the wiphy */
...@@ -1511,6 +1514,8 @@ struct wiphy { ...@@ -1511,6 +1514,8 @@ struct wiphy {
char fw_version[ETHTOOL_BUSINFO_LEN]; char fw_version[ETHTOOL_BUSINFO_LEN];
u32 hw_version; u32 hw_version;
u16 max_remain_on_channel_duration;
u8 max_num_pmkids; u8 max_num_pmkids;
u32 available_antennas; u32 available_antennas;
......
...@@ -745,6 +745,8 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -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); result = wiphy_register(local->hw.wiphy);
if (result < 0) if (result < 0)
goto fail_wiphy_register; goto fail_wiphy_register;
......
...@@ -755,6 +755,10 @@ static int nl80211_send_wiphy(struct sk_buff *msg, u32 pid, u32 seq, int flags, ...@@ -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); 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 */ /* for now at least assume all drivers have it */
if (dev->ops->mgmt_tx) if (dev->ops->mgmt_tx)
NLA_PUT_FLAG(msg, NL80211_ATTR_OFFCHANNEL_TX_OK); NLA_PUT_FLAG(msg, NL80211_ATTR_OFFCHANNEL_TX_OK);
...@@ -4228,7 +4232,8 @@ static int nl80211_remain_on_channel(struct sk_buff *skb, ...@@ -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, * We should be on that channel for at least one jiffie,
* and more than 5 seconds seems excessive. * 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; return -EINVAL;
if (!rdev->ops->remain_on_channel) if (!rdev->ops->remain_on_channel)
......
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