|
@@ -1011,6 +1011,21 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
|
|
mutex_lock(&mvm->mutex);
|
|
|
if (old_state == IEEE80211_STA_NOTEXIST &&
|
|
|
new_state == IEEE80211_STA_NONE) {
|
|
|
+ /*
|
|
|
+ * Firmware bug - it'll crash if the beacon interval is less
|
|
|
+ * than 16. We can't avoid connecting at all, so refuse the
|
|
|
+ * station state change, this will cause mac80211 to abandon
|
|
|
+ * attempts to connect to this AP, and eventually wpa_s will
|
|
|
+ * blacklist the AP...
|
|
|
+ */
|
|
|
+ if (vif->type == NL80211_IFTYPE_STATION &&
|
|
|
+ vif->bss_conf.beacon_int < 16) {
|
|
|
+ IWL_ERR(mvm,
|
|
|
+ "AP %pM beacon interval is %d, refusing due to firmware bug!\n",
|
|
|
+ sta->addr, vif->bss_conf.beacon_int);
|
|
|
+ ret = -EINVAL;
|
|
|
+ goto out_unlock;
|
|
|
+ }
|
|
|
ret = iwl_mvm_add_sta(mvm, vif, sta);
|
|
|
} else if (old_state == IEEE80211_STA_NONE &&
|
|
|
new_state == IEEE80211_STA_AUTH) {
|
|
@@ -1043,6 +1058,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
|
|
} else {
|
|
|
ret = -EIO;
|
|
|
}
|
|
|
+ out_unlock:
|
|
|
mutex_unlock(&mvm->mutex);
|
|
|
|
|
|
return ret;
|