Commit 22395217 authored by Johannes Berg's avatar Johannes Berg

cfg80211: add and expose HE 6 GHz band capabilities

These capabilities cover what would otherwise be transported
in HT/VHT capabilities, but only a subset thereof that is
actually needed on 6 GHz with HE already present. Expose the
capabilities to userspace, drivers are expected to set them
as using the 6 GHz band (currently) requires HE capability.

Link: https://lore.kernel.org/r/20200528213443.244cd5cb9db8.Icd8c773277a88c837e7e3af1d4d1013cc3b66543@changeidSigned-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent a6cf28e0
...@@ -354,10 +354,13 @@ struct ieee80211_sta_he_cap { ...@@ -354,10 +354,13 @@ struct ieee80211_sta_he_cap {
* *
* @types_mask: interface types mask * @types_mask: interface types mask
* @he_cap: holds the HE capabilities * @he_cap: holds the HE capabilities
* @he_6ghz_capa: HE 6 GHz capabilities, must be filled in for a
* 6 GHz band channel (and 0 may be valid value).
*/ */
struct ieee80211_sband_iftype_data { struct ieee80211_sband_iftype_data {
u16 types_mask; u16 types_mask;
struct ieee80211_sta_he_cap he_cap; struct ieee80211_sta_he_cap he_cap;
struct ieee80211_he_6ghz_capa he_6ghz_capa;
}; };
/** /**
......
...@@ -3565,6 +3565,8 @@ enum nl80211_mpath_info { ...@@ -3565,6 +3565,8 @@ enum nl80211_mpath_info {
* defined in HE capabilities IE * defined in HE capabilities IE
* @NL80211_BAND_IFTYPE_ATTR_MAX: highest band HE capability attribute currently * @NL80211_BAND_IFTYPE_ATTR_MAX: highest band HE capability attribute currently
* defined * defined
* @NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA: HE 6GHz band capabilities (__le16),
* given for all 6 GHz band channels
* @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use * @__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST: internal use
*/ */
enum nl80211_band_iftype_attr { enum nl80211_band_iftype_attr {
...@@ -3575,6 +3577,7 @@ enum nl80211_band_iftype_attr { ...@@ -3575,6 +3577,7 @@ enum nl80211_band_iftype_attr {
NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PHY,
NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET, NL80211_BAND_IFTYPE_ATTR_HE_CAP_MCS_SET,
NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE, NL80211_BAND_IFTYPE_ATTR_HE_CAP_PPE,
NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
/* keep last */ /* keep last */
__NL80211_BAND_IFTYPE_ATTR_AFTER_LAST, __NL80211_BAND_IFTYPE_ATTR_AFTER_LAST,
......
...@@ -1562,6 +1562,7 @@ static int nl80211_send_coalesce(struct sk_buff *msg, ...@@ -1562,6 +1562,7 @@ static int nl80211_send_coalesce(struct sk_buff *msg,
static int static int
nl80211_send_iftype_data(struct sk_buff *msg, nl80211_send_iftype_data(struct sk_buff *msg,
const struct ieee80211_supported_band *sband,
const struct ieee80211_sband_iftype_data *iftdata) const struct ieee80211_sband_iftype_data *iftdata)
{ {
const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap; const struct ieee80211_sta_he_cap *he_cap = &iftdata->he_cap;
...@@ -1585,6 +1586,12 @@ nl80211_send_iftype_data(struct sk_buff *msg, ...@@ -1585,6 +1586,12 @@ nl80211_send_iftype_data(struct sk_buff *msg,
return -ENOBUFS; return -ENOBUFS;
} }
if (sband->band == NL80211_BAND_6GHZ &&
nla_put(msg, NL80211_BAND_IFTYPE_ATTR_HE_6GHZ_CAPA,
sizeof(iftdata->he_6ghz_capa),
&iftdata->he_6ghz_capa))
return -ENOBUFS;
return 0; return 0;
} }
...@@ -1633,7 +1640,7 @@ static int nl80211_send_band_rateinfo(struct sk_buff *msg, ...@@ -1633,7 +1640,7 @@ static int nl80211_send_band_rateinfo(struct sk_buff *msg,
if (!iftdata) if (!iftdata)
return -ENOBUFS; return -ENOBUFS;
err = nl80211_send_iftype_data(msg, err = nl80211_send_iftype_data(msg, sband,
&sband->iftype_data[i]); &sband->iftype_data[i]);
if (err) if (err)
return err; return err;
......
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