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: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
14a085e770
commit
a293911d4f
@ -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 {
|
|||||||
|
|
||||||
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 {
|
|||||||
*
|
*
|
||||||
* @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 {
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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,
|
|||||||
|
|
||||||
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,
|
|||||||
* 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)
|
||||||
|
Loading…
Reference in New Issue
Block a user