diff options
Diffstat (limited to 'net/mac80211/key.c')
| -rw-r--r-- | net/mac80211/key.c | 21 | 
1 files changed, 19 insertions, 2 deletions
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index af3c56482c8..b510721e3b3 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c @@ -101,6 +101,11 @@ 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->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))) +			key->local->crypto_tx_tailroom_needed_cnt--; +  		return 0;  	} @@ -156,6 +161,10 @@ 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->conf.flags & IEEE80211_KEY_FLAG_GENERATE_IV))) +		key->local->crypto_tx_tailroom_needed_cnt++;  }  void ieee80211_key_removed(struct ieee80211_key_conf *key_conf) @@ -388,8 +397,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 +462,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 +505,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);  }  |