|
|
|
@ -896,3 +896,35 @@ |
|
|
|
|
|
|
|
|
|
if (needreset) {
|
|
|
|
|
ath_dbg(ath9k_hw_common(sc->sc_ah), RESET,
|
|
|
|
|
--- a/net/mac80211/sta_info.c
|
|
|
|
|
+++ b/net/mac80211/sta_info.c
|
|
|
|
|
@@ -766,6 +766,7 @@ int __must_check __sta_info_destroy(stru
|
|
|
|
|
struct ieee80211_local *local;
|
|
|
|
|
struct ieee80211_sub_if_data *sdata;
|
|
|
|
|
int ret, i;
|
|
|
|
|
+ bool have_key = false;
|
|
|
|
|
|
|
|
|
|
might_sleep();
|
|
|
|
|
|
|
|
|
|
@@ -793,12 +794,19 @@ int __must_check __sta_info_destroy(stru
|
|
|
|
|
list_del_rcu(&sta->list);
|
|
|
|
|
|
|
|
|
|
mutex_lock(&local->key_mtx);
|
|
|
|
|
- for (i = 0; i < NUM_DEFAULT_KEYS; i++)
|
|
|
|
|
+ for (i = 0; i < NUM_DEFAULT_KEYS; i++) {
|
|
|
|
|
__ieee80211_key_free(key_mtx_dereference(local, sta->gtk[i]));
|
|
|
|
|
- if (sta->ptk)
|
|
|
|
|
+ have_key = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (sta->ptk) {
|
|
|
|
|
__ieee80211_key_free(key_mtx_dereference(local, sta->ptk));
|
|
|
|
|
+ have_key = true;
|
|
|
|
|
+ }
|
|
|
|
|
mutex_unlock(&local->key_mtx);
|
|
|
|
|
|
|
|
|
|
+ if (!have_key)
|
|
|
|
|
+ synchronize_net();
|
|
|
|
|
+
|
|
|
|
|
sta->dead = true;
|
|
|
|
|
|
|
|
|
|
local->num_sta--;
|
|
|
|
|