Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211
This commit is contained in:
@@ -222,6 +222,7 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
|
|||||||
switch (vht_oper->chan_width) {
|
switch (vht_oper->chan_width) {
|
||||||
case IEEE80211_VHT_CHANWIDTH_USE_HT:
|
case IEEE80211_VHT_CHANWIDTH_USE_HT:
|
||||||
vht_chandef.width = chandef->width;
|
vht_chandef.width = chandef->width;
|
||||||
|
vht_chandef.center_freq1 = chandef->center_freq1;
|
||||||
break;
|
break;
|
||||||
case IEEE80211_VHT_CHANWIDTH_80MHZ:
|
case IEEE80211_VHT_CHANWIDTH_80MHZ:
|
||||||
vht_chandef.width = NL80211_CHAN_WIDTH_80;
|
vht_chandef.width = NL80211_CHAN_WIDTH_80;
|
||||||
@@ -271,6 +272,28 @@ ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
/*
|
||||||
|
* When tracking the current AP, don't do any further checks if the
|
||||||
|
* new chandef is identical to the one we're currently using for the
|
||||||
|
* connection. This keeps us from playing ping-pong with regulatory,
|
||||||
|
* without it the following can happen (for example):
|
||||||
|
* - connect to an AP with 80 MHz, world regdom allows 80 MHz
|
||||||
|
* - AP advertises regdom US
|
||||||
|
* - CRDA loads regdom US with 80 MHz prohibited (old database)
|
||||||
|
* - the code below detects an unsupported channel, downgrades, and
|
||||||
|
* we disconnect from the AP in the caller
|
||||||
|
* - disconnect causes CRDA to reload world regdomain and the game
|
||||||
|
* starts anew.
|
||||||
|
* (see https://bugzilla.kernel.org/show_bug.cgi?id=70881)
|
||||||
|
*
|
||||||
|
* It seems possible that there are still scenarios with CSA or real
|
||||||
|
* bandwidth changes where a this could happen, but those cases are
|
||||||
|
* less common and wouldn't completely prevent using the AP.
|
||||||
|
*/
|
||||||
|
if (tracking &&
|
||||||
|
cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef))
|
||||||
|
return ret;
|
||||||
|
|
||||||
/* don't print the message below for VHT mismatch if VHT is disabled */
|
/* don't print the message below for VHT mismatch if VHT is disabled */
|
||||||
if (ret & IEEE80211_STA_DISABLE_VHT)
|
if (ret & IEEE80211_STA_DISABLE_VHT)
|
||||||
vht_chandef = *chandef;
|
vht_chandef = *chandef;
|
||||||
|
@@ -2373,6 +2373,7 @@ static int reg_set_rd_country_ie(const struct ieee80211_regdomain *rd,
|
|||||||
int set_regdom(const struct ieee80211_regdomain *rd)
|
int set_regdom(const struct ieee80211_regdomain *rd)
|
||||||
{
|
{
|
||||||
struct regulatory_request *lr;
|
struct regulatory_request *lr;
|
||||||
|
bool user_reset = false;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
if (!reg_is_valid_request(rd->alpha2)) {
|
if (!reg_is_valid_request(rd->alpha2)) {
|
||||||
@@ -2389,6 +2390,7 @@ int set_regdom(const struct ieee80211_regdomain *rd)
|
|||||||
break;
|
break;
|
||||||
case NL80211_REGDOM_SET_BY_USER:
|
case NL80211_REGDOM_SET_BY_USER:
|
||||||
r = reg_set_rd_user(rd, lr);
|
r = reg_set_rd_user(rd, lr);
|
||||||
|
user_reset = true;
|
||||||
break;
|
break;
|
||||||
case NL80211_REGDOM_SET_BY_DRIVER:
|
case NL80211_REGDOM_SET_BY_DRIVER:
|
||||||
r = reg_set_rd_driver(rd, lr);
|
r = reg_set_rd_driver(rd, lr);
|
||||||
@@ -2402,8 +2404,14 @@ int set_regdom(const struct ieee80211_regdomain *rd)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (r) {
|
if (r) {
|
||||||
if (r == -EALREADY)
|
switch (r) {
|
||||||
|
case -EALREADY:
|
||||||
reg_set_request_processed();
|
reg_set_request_processed();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Back to world regulatory in case of errors */
|
||||||
|
restore_regulatory_settings(user_reset);
|
||||||
|
}
|
||||||
|
|
||||||
kfree(rd);
|
kfree(rd);
|
||||||
return r;
|
return r;
|
||||||
|
Reference in New Issue
Block a user