Staging: Merge staging-next into Linus's tree
[sfrench/cifs-2.6.git] / net / mac80211 / key.c
index d0d9001a4a6a32d34c2eba43412715d6bd3cd252..1b9d87ed143a1a3b3e46e31f5649ba67f68321b2 100644 (file)
@@ -273,7 +273,7 @@ struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,
                key->conf.iv_len = CCMP_HDR_LEN;
                key->conf.icv_len = CCMP_MIC_LEN;
                if (seq) {
-                       for (i = 0; i < NUM_RX_DATA_QUEUES; i++)
+                       for (i = 0; i < NUM_RX_DATA_QUEUES + 1; i++)
                                for (j = 0; j < CCMP_PN_LEN; j++)
                                        key->u.ccmp.rx_pn[i][j] =
                                                seq[CCMP_PN_LEN - j - 1];
@@ -323,13 +323,15 @@ static void __ieee80211_key_destroy(struct ieee80211_key *key)
        if (!key)
                return;
 
-       ieee80211_key_disable_hw_accel(key);
+       if (key->local)
+               ieee80211_key_disable_hw_accel(key);
 
        if (key->conf.alg == ALG_CCMP)
                ieee80211_aes_key_free(key->u.ccmp.tfm);
        if (key->conf.alg == ALG_AES_CMAC)
                ieee80211_aes_cmac_key_free(key->u.aes_cmac.tfm);
-       ieee80211_debugfs_key_remove(key);
+       if (key->local)
+               ieee80211_debugfs_key_remove(key);
 
        kfree(key);
 }
@@ -410,15 +412,12 @@ static void __ieee80211_key_free(struct ieee80211_key *key)
        __ieee80211_key_destroy(key);
 }
 
-void ieee80211_key_free(struct ieee80211_key *key)
+void ieee80211_key_free(struct ieee80211_local *local,
+                       struct ieee80211_key *key)
 {
-       struct ieee80211_local *local;
-
        if (!key)
                return;
 
-       local = key->sdata->local;
-
        mutex_lock(&local->key_mtx);
        __ieee80211_key_free(key);
        mutex_unlock(&local->key_mtx);