From 0198b8c8cfeb3e6b42ce5b4903ee1ed6083c5b78 Mon Sep 17 00:00:00 2001 From: nbd Date: Tue, 25 May 2010 17:29:50 +0000 Subject: mac80211: update to wireless-testing 2010-05-24 git-svn-id: svn://svn.openwrt.org/openwrt/trunk@21568 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../patches/522-ath9k_remove_duplicate_code.patch | 255 +++++++++++++++++++++ 1 file changed, 255 insertions(+) create mode 100644 package/mac80211/patches/522-ath9k_remove_duplicate_code.patch (limited to 'package/mac80211/patches/522-ath9k_remove_duplicate_code.patch') diff --git a/package/mac80211/patches/522-ath9k_remove_duplicate_code.patch b/package/mac80211/patches/522-ath9k_remove_duplicate_code.patch new file mode 100644 index 000000000..53d86781f --- /dev/null +++ b/package/mac80211/patches/522-ath9k_remove_duplicate_code.patch @@ -0,0 +1,255 @@ +--- a/drivers/net/wireless/ath/ath9k/main.c ++++ b/drivers/net/wireless/ath/ath9k/main.c +@@ -622,234 +622,6 @@ static u32 ath_get_extchanmode(struct at + return chanmode; + } + +-static int ath_setkey_tkip(struct ath_common *common, u16 keyix, const u8 *key, +- struct ath9k_keyval *hk, const u8 *addr, +- bool authenticator) +-{ +- struct ath_hw *ah = common->ah; +- const u8 *key_rxmic; +- const u8 *key_txmic; +- +- key_txmic = key + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY; +- key_rxmic = key + NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY; +- +- if (addr == NULL) { +- /* +- * Group key installation - only two key cache entries are used +- * regardless of splitmic capability since group key is only +- * used either for TX or RX. +- */ +- if (authenticator) { +- memcpy(hk->kv_mic, key_txmic, sizeof(hk->kv_mic)); +- memcpy(hk->kv_txmic, key_txmic, sizeof(hk->kv_mic)); +- } else { +- memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic)); +- memcpy(hk->kv_txmic, key_rxmic, sizeof(hk->kv_mic)); +- } +- return ath9k_hw_set_keycache_entry(ah, keyix, hk, addr); +- } +- if (!common->splitmic) { +- /* TX and RX keys share the same key cache entry. */ +- memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic)); +- memcpy(hk->kv_txmic, key_txmic, sizeof(hk->kv_txmic)); +- return ath9k_hw_set_keycache_entry(ah, keyix, hk, addr); +- } +- +- /* Separate key cache entries for TX and RX */ +- +- /* TX key goes at first index, RX key at +32. */ +- memcpy(hk->kv_mic, key_txmic, sizeof(hk->kv_mic)); +- if (!ath9k_hw_set_keycache_entry(ah, keyix, hk, NULL)) { +- /* TX MIC entry failed. No need to proceed further */ +- ath_print(common, ATH_DBG_FATAL, +- "Setting TX MIC Key Failed\n"); +- return 0; +- } +- +- memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic)); +- /* XXX delete tx key on failure? */ +- return ath9k_hw_set_keycache_entry(ah, keyix + 32, hk, addr); +-} +- +-static int ath_reserve_key_cache_slot_tkip(struct ath_common *common) +-{ +- int i; +- +- for (i = IEEE80211_WEP_NKID; i < common->keymax / 2; i++) { +- if (test_bit(i, common->keymap) || +- test_bit(i + 64, common->keymap)) +- continue; /* At least one part of TKIP key allocated */ +- if (common->splitmic && +- (test_bit(i + 32, common->keymap) || +- test_bit(i + 64 + 32, common->keymap))) +- continue; /* At least one part of TKIP key allocated */ +- +- /* Found a free slot for a TKIP key */ +- return i; +- } +- return -1; +-} +- +-static int ath_reserve_key_cache_slot(struct ath_common *common) +-{ +- int i; +- +- /* First, try to find slots that would not be available for TKIP. */ +- if (common->splitmic) { +- for (i = IEEE80211_WEP_NKID; i < common->keymax / 4; i++) { +- if (!test_bit(i, common->keymap) && +- (test_bit(i + 32, common->keymap) || +- test_bit(i + 64, common->keymap) || +- test_bit(i + 64 + 32, common->keymap))) +- return i; +- if (!test_bit(i + 32, common->keymap) && +- (test_bit(i, common->keymap) || +- test_bit(i + 64, common->keymap) || +- test_bit(i + 64 + 32, common->keymap))) +- return i + 32; +- if (!test_bit(i + 64, common->keymap) && +- (test_bit(i , common->keymap) || +- test_bit(i + 32, common->keymap) || +- test_bit(i + 64 + 32, common->keymap))) +- return i + 64; +- if (!test_bit(i + 64 + 32, common->keymap) && +- (test_bit(i, common->keymap) || +- test_bit(i + 32, common->keymap) || +- test_bit(i + 64, common->keymap))) +- return i + 64 + 32; +- } +- } else { +- for (i = IEEE80211_WEP_NKID; i < common->keymax / 2; i++) { +- if (!test_bit(i, common->keymap) && +- test_bit(i + 64, common->keymap)) +- return i; +- if (test_bit(i, common->keymap) && +- !test_bit(i + 64, common->keymap)) +- return i + 64; +- } +- } +- +- /* No partially used TKIP slots, pick any available slot */ +- for (i = IEEE80211_WEP_NKID; i < common->keymax; i++) { +- /* Do not allow slots that could be needed for TKIP group keys +- * to be used. This limitation could be removed if we know that +- * TKIP will not be used. */ +- if (i >= 64 && i < 64 + IEEE80211_WEP_NKID) +- continue; +- if (common->splitmic) { +- if (i >= 32 && i < 32 + IEEE80211_WEP_NKID) +- continue; +- if (i >= 64 + 32 && i < 64 + 32 + IEEE80211_WEP_NKID) +- continue; +- } +- +- if (!test_bit(i, common->keymap)) +- return i; /* Found a free slot for a key */ +- } +- +- /* No free slot found */ +- return -1; +-} +- +-static int ath_key_config(struct ath_common *common, +- struct ieee80211_vif *vif, +- struct ieee80211_sta *sta, +- struct ieee80211_key_conf *key) +-{ +- struct ath_hw *ah = common->ah; +- struct ath9k_keyval hk; +- const u8 *mac = NULL; +- int ret = 0; +- int idx; +- +- memset(&hk, 0, sizeof(hk)); +- +- switch (key->alg) { +- case ALG_WEP: +- hk.kv_type = ATH9K_CIPHER_WEP; +- break; +- case ALG_TKIP: +- hk.kv_type = ATH9K_CIPHER_TKIP; +- break; +- case ALG_CCMP: +- hk.kv_type = ATH9K_CIPHER_AES_CCM; +- break; +- default: +- return -EOPNOTSUPP; +- } +- +- hk.kv_len = key->keylen; +- memcpy(hk.kv_val, key->key, key->keylen); +- +- if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { +- /* For now, use the default keys for broadcast keys. This may +- * need to change with virtual interfaces. */ +- idx = key->keyidx; +- } else if (key->keyidx) { +- if (WARN_ON(!sta)) +- return -EOPNOTSUPP; +- mac = sta->addr; +- +- if (vif->type != NL80211_IFTYPE_AP) { +- /* Only keyidx 0 should be used with unicast key, but +- * allow this for client mode for now. */ +- idx = key->keyidx; +- } else +- return -EIO; +- } else { +- if (WARN_ON(!sta)) +- return -EOPNOTSUPP; +- mac = sta->addr; +- +- if (key->alg == ALG_TKIP) +- idx = ath_reserve_key_cache_slot_tkip(common); +- else +- idx = ath_reserve_key_cache_slot(common); +- if (idx < 0) +- return -ENOSPC; /* no free key cache entries */ +- } +- +- if (key->alg == ALG_TKIP) +- ret = ath_setkey_tkip(common, idx, key->key, &hk, mac, +- vif->type == NL80211_IFTYPE_AP); +- else +- ret = ath9k_hw_set_keycache_entry(ah, idx, &hk, mac); +- +- if (!ret) +- return -EIO; +- +- set_bit(idx, common->keymap); +- if (key->alg == ALG_TKIP) { +- set_bit(idx + 64, common->keymap); +- if (common->splitmic) { +- set_bit(idx + 32, common->keymap); +- set_bit(idx + 64 + 32, common->keymap); +- } +- } +- +- return idx; +-} +- +-static void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key) +-{ +- struct ath_hw *ah = common->ah; +- +- ath9k_hw_keyreset(ah, key->hw_key_idx); +- if (key->hw_key_idx < IEEE80211_WEP_NKID) +- return; +- +- clear_bit(key->hw_key_idx, common->keymap); +- if (key->alg != ALG_TKIP) +- return; +- +- clear_bit(key->hw_key_idx + 64, common->keymap); +- if (common->splitmic) { +- ath9k_hw_keyreset(ah, key->hw_key_idx + 32); +- clear_bit(key->hw_key_idx + 32, common->keymap); +- clear_bit(key->hw_key_idx + 64 + 32, common->keymap); +- } +-} +- + static void ath9k_bss_assoc_info(struct ath_softc *sc, + struct ieee80211_vif *vif, + struct ieee80211_bss_conf *bss_conf) +@@ -1814,7 +1586,7 @@ static int ath9k_set_key(struct ieee8021 + + switch (cmd) { + case SET_KEY: +- ret = ath_key_config(common, vif, sta, key); ++ ret = ath9k_cmn_key_config(common, vif, sta, key); + if (ret >= 0) { + key->hw_key_idx = ret; + /* push IV and Michael MIC generation to stack */ +@@ -1827,7 +1599,7 @@ static int ath9k_set_key(struct ieee8021 + } + break; + case DISABLE_KEY: +- ath_key_delete(common, key); ++ ath9k_cmn_key_delete(common, key); + break; + default: + ret = -EINVAL; -- cgit v1.2.3