|
@@ -257,7 +257,11 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
|
|
if (ret)
|
|
|
return ret;
|
|
|
|
|
|
- return ieee80211_register_hw(mvm->hw);
|
|
|
+ ret = ieee80211_register_hw(mvm->hw);
|
|
|
+ if (ret)
|
|
|
+ iwl_mvm_leds_exit(mvm);
|
|
|
+
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
|
|
@@ -385,6 +389,7 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
|
|
|
ieee80211_wake_queues(mvm->hw);
|
|
|
|
|
|
mvm->vif_count = 0;
|
|
|
+ mvm->rx_ba_sessions = 0;
|
|
|
}
|
|
|
|
|
|
static int iwl_mvm_mac_start(struct ieee80211_hw *hw)
|
|
@@ -1006,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) {
|
|
@@ -1038,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;
|