|
@@ -101,6 +101,10 @@ static int ieee80211_key_enable_hw_accel(struct ieee80211_key *key)
|
|
|
|
|
|
if (!ret) {
|
|
|
key->flags |= KEY_FLAG_UPLOADED_TO_HARDWARE;
|
|
|
+
|
|
|
+ if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC))
|
|
|
+ key->local->crypto_tx_tailroom_needed_cnt--;
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -156,6 +160,9 @@ static void ieee80211_key_disable_hw_accel(struct ieee80211_key *key)
|
|
|
key->conf.keyidx, sta ? sta->addr : bcast_addr, ret);
|
|
|
|
|
|
key->flags &= ~KEY_FLAG_UPLOADED_TO_HARDWARE;
|
|
|
+
|
|
|
+ if (!(key->conf.flags & IEEE80211_KEY_FLAG_GENERATE_MMIC))
|
|
|
+ key->local->crypto_tx_tailroom_needed_cnt++;
|
|
|
}
|
|
|
|
|
|
void ieee80211_key_removed(struct ieee80211_key_conf *key_conf)
|
|
@@ -388,8 +395,10 @@ static void __ieee80211_key_destroy(struct ieee80211_key *key)
|
|
|
ieee80211_aes_key_free(key->u.ccmp.tfm);
|
|
|
if (key->conf.cipher == WLAN_CIPHER_SUITE_AES_CMAC)
|
|
|
ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
|
|
|
- if (key->local)
|
|
|
+ if (key->local) {
|
|
|
ieee80211_debugfs_key_remove(key);
|
|
|
+ key->local->crypto_tx_tailroom_needed_cnt--;
|
|
|
+ }
|
|
|
|
|
|
kfree(key);
|
|
|
}
|
|
@@ -451,6 +460,8 @@ int ieee80211_key_link(struct ieee80211_key *key,
|
|
|
|
|
|
ieee80211_debugfs_key_add(key);
|
|
|
|
|
|
+ key->local->crypto_tx_tailroom_needed_cnt++;
|
|
|
+
|
|
|
ret = ieee80211_key_enable_hw_accel(key);
|
|
|
|
|
|
mutex_unlock(&sdata->local->key_mtx);
|
|
@@ -492,8 +503,12 @@ void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata)
|
|
|
|
|
|
mutex_lock(&sdata->local->key_mtx);
|
|
|
|
|
|
- list_for_each_entry(key, &sdata->key_list, list)
|
|
|
+ sdata->local->crypto_tx_tailroom_needed_cnt = 0;
|
|
|
+
|
|
|
+ list_for_each_entry(key, &sdata->key_list, list) {
|
|
|
+ sdata->local->crypto_tx_tailroom_needed_cnt++;
|
|
|
ieee80211_key_enable_hw_accel(key);
|
|
|
+ }
|
|
|
|
|
|
mutex_unlock(&sdata->local->key_mtx);
|
|
|
}
|