Commit 4a21a8ae authored by Johannes Berg's avatar Johannes Berg

wifi: mac80211: mlme: change flags in ieee80211_determine_chantype()

For MLO we'll need to read flags not directly from the link as
it may not even exist yet if we're just setting up flags for
a secondary link before sending the association request, so
pass the incoming conn_flags separately. Also, while at it,
pass the sdata/link separately as for non-tracking now the
link may be NULL.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 61513162
...@@ -143,7 +143,9 @@ static int ecw2cw(int ecw) ...@@ -143,7 +143,9 @@ static int ecw2cw(int ecw)
} }
static ieee80211_conn_flags_t static ieee80211_conn_flags_t
ieee80211_determine_chantype(struct ieee80211_link_data *link, ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
struct ieee80211_link_data *link,
ieee80211_conn_flags_t conn_flags,
struct ieee80211_supported_band *sband, struct ieee80211_supported_band *sband,
struct ieee80211_channel *channel, struct ieee80211_channel *channel,
u32 vht_cap_info, u32 vht_cap_info,
...@@ -154,7 +156,6 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link, ...@@ -154,7 +156,6 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link,
const struct ieee80211_s1g_oper_ie *s1g_oper, const struct ieee80211_s1g_oper_ie *s1g_oper,
struct cfg80211_chan_def *chandef, bool tracking) struct cfg80211_chan_def *chandef, bool tracking)
{ {
struct ieee80211_sub_if_data *sdata = link->sdata;
struct cfg80211_chan_def vht_chandef; struct cfg80211_chan_def vht_chandef;
struct ieee80211_sta_ht_cap sta_ht_cap; struct ieee80211_sta_ht_cap sta_ht_cap;
ieee80211_conn_flags_t ret; ieee80211_conn_flags_t ret;
...@@ -249,7 +250,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link, ...@@ -249,7 +250,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link,
} }
vht_chandef = *chandef; vht_chandef = *chandef;
if (!(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_HE) && if (!(conn_flags & IEEE80211_CONN_DISABLE_HE) &&
he_oper && he_oper &&
(le32_to_cpu(he_oper->he_oper_params) & (le32_to_cpu(he_oper->he_oper_params) &
IEEE80211_HE_OPERATION_VHT_OPER_INFO)) { IEEE80211_HE_OPERATION_VHT_OPER_INFO)) {
...@@ -265,7 +266,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link, ...@@ -265,7 +266,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link,
if (!ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info, if (!ieee80211_chandef_vht_oper(&sdata->local->hw, vht_cap_info,
&he_oper_vht_cap, ht_oper, &he_oper_vht_cap, ht_oper,
&vht_chandef)) { &vht_chandef)) {
if (!(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_HE)) if (!(conn_flags & IEEE80211_CONN_DISABLE_HE))
sdata_info(sdata, sdata_info(sdata,
"HE AP VHT information is invalid, disabling HE\n"); "HE AP VHT information is invalid, disabling HE\n");
ret = IEEE80211_CONN_DISABLE_HE | IEEE80211_CONN_DISABLE_EHT; ret = IEEE80211_CONN_DISABLE_HE | IEEE80211_CONN_DISABLE_EHT;
...@@ -275,7 +276,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link, ...@@ -275,7 +276,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link,
vht_cap_info, vht_cap_info,
vht_oper, ht_oper, vht_oper, ht_oper,
&vht_chandef)) { &vht_chandef)) {
if (!(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_VHT)) if (!(conn_flags & IEEE80211_CONN_DISABLE_VHT))
sdata_info(sdata, sdata_info(sdata,
"AP VHT information is invalid, disabling VHT\n"); "AP VHT information is invalid, disabling VHT\n");
ret = IEEE80211_CONN_DISABLE_VHT; ret = IEEE80211_CONN_DISABLE_VHT;
...@@ -283,7 +284,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link, ...@@ -283,7 +284,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link,
} }
if (!cfg80211_chandef_valid(&vht_chandef)) { if (!cfg80211_chandef_valid(&vht_chandef)) {
if (!(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_VHT)) if (!(conn_flags & IEEE80211_CONN_DISABLE_VHT))
sdata_info(sdata, sdata_info(sdata,
"AP VHT information is invalid, disabling VHT\n"); "AP VHT information is invalid, disabling VHT\n");
ret = IEEE80211_CONN_DISABLE_VHT; ret = IEEE80211_CONN_DISABLE_VHT;
...@@ -296,7 +297,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link, ...@@ -296,7 +297,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link,
} }
if (!cfg80211_chandef_compatible(chandef, &vht_chandef)) { if (!cfg80211_chandef_compatible(chandef, &vht_chandef)) {
if (!(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_VHT)) if (!(conn_flags & IEEE80211_CONN_DISABLE_VHT))
sdata_info(sdata, sdata_info(sdata,
"AP VHT information doesn't match HT, disabling VHT\n"); "AP VHT information doesn't match HT, disabling VHT\n");
ret = IEEE80211_CONN_DISABLE_VHT; ret = IEEE80211_CONN_DISABLE_VHT;
...@@ -319,7 +320,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link, ...@@ -319,7 +320,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link,
false, &eht_chandef); false, &eht_chandef);
if (!cfg80211_chandef_valid(&eht_chandef)) { if (!cfg80211_chandef_valid(&eht_chandef)) {
if (!(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_EHT)) if (!(conn_flags & IEEE80211_CONN_DISABLE_EHT))
sdata_info(sdata, sdata_info(sdata,
"AP EHT information is invalid, disabling EHT\n"); "AP EHT information is invalid, disabling EHT\n");
ret = IEEE80211_CONN_DISABLE_EHT; ret = IEEE80211_CONN_DISABLE_EHT;
...@@ -327,7 +328,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link, ...@@ -327,7 +328,7 @@ ieee80211_determine_chantype(struct ieee80211_link_data *link,
} }
if (!cfg80211_chandef_compatible(chandef, &eht_chandef)) { if (!cfg80211_chandef_compatible(chandef, &eht_chandef)) {
if (!(link->u.mgd.conn_flags & IEEE80211_CONN_DISABLE_EHT)) if (!(conn_flags & IEEE80211_CONN_DISABLE_EHT))
sdata_info(sdata, sdata_info(sdata,
"AP EHT information is incompatible, disabling EHT\n"); "AP EHT information is incompatible, disabling EHT\n");
ret = IEEE80211_CONN_DISABLE_EHT; ret = IEEE80211_CONN_DISABLE_EHT;
...@@ -462,7 +463,9 @@ static int ieee80211_config_bw(struct ieee80211_link_data *link, ...@@ -462,7 +463,9 @@ static int ieee80211_config_bw(struct ieee80211_link_data *link,
vht_cap_info = le32_to_cpu(vht_cap->vht_cap_info); vht_cap_info = le32_to_cpu(vht_cap->vht_cap_info);
/* calculate new channel (type) based on HT/VHT/HE operation IEs */ /* calculate new channel (type) based on HT/VHT/HE operation IEs */
flags = ieee80211_determine_chantype(link, sband, chan, vht_cap_info, flags = ieee80211_determine_chantype(sdata, link,
link->u.mgd.conn_flags,
sband, chan, vht_cap_info,
ht_oper, vht_oper, ht_oper, vht_oper,
he_oper, eht_oper, he_oper, eht_oper,
s1g_oper, &chandef, true); s1g_oper, &chandef, true);
...@@ -4006,8 +4009,9 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata, ...@@ -4006,8 +4009,9 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
} }
link->u.mgd.conn_flags |= link->u.mgd.conn_flags |=
ieee80211_determine_chantype(link, sband, ieee80211_determine_chantype(sdata, link,
cbss->channel, link->u.mgd.conn_flags,
sband, cbss->channel,
bss->vht_cap_info, bss->vht_cap_info,
ht_oper, vht_oper, ht_oper, vht_oper,
he_oper, eht_oper, he_oper, eht_oper,
......
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