summaryrefslogtreecommitdiffstats
path: root/package/mac80211/patches/520-ath0k_hw_mcast_search.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/mac80211/patches/520-ath0k_hw_mcast_search.patch')
-rw-r--r--package/mac80211/patches/520-ath0k_hw_mcast_search.patch36
1 files changed, 36 insertions, 0 deletions
diff --git a/package/mac80211/patches/520-ath0k_hw_mcast_search.patch b/package/mac80211/patches/520-ath0k_hw_mcast_search.patch
new file mode 100644
index 000000000..eb09da5f4
--- /dev/null
+++ b/package/mac80211/patches/520-ath0k_hw_mcast_search.patch
@@ -0,0 +1,36 @@
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -1497,6 +1497,7 @@ EXPORT_SYMBOL(ath9k_hw_keyreset);
+ bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
+ {
+ u32 macHi, macLo;
++ u32 unicast_flag = AR_KEYTABLE_VALID;
+
+ if (entry >= ah->caps.keycache_size) {
+ ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
+@@ -1505,6 +1506,16 @@ bool ath9k_hw_keysetmac(struct ath_hw *a
+ }
+
+ if (mac != NULL) {
++ /*
++ * AR_KEYTABLE_VALID indicates that the address is a unicast
++ * address, which must match the transmitter address for
++ * decrypting frames.
++ * Not setting this bit allows the hardware to use the key
++ * for multicast frame decryption.
++ */
++ if (mac[0] & 0x01)
++ unicast_flag = 0;
++
+ macHi = (mac[5] << 8) | mac[4];
+ macLo = (mac[3] << 24) |
+ (mac[2] << 16) |
+@@ -1517,7 +1528,7 @@ bool ath9k_hw_keysetmac(struct ath_hw *a
+ macLo = macHi = 0;
+ }
+ REG_WRITE(ah, AR_KEYTABLE_MAC0(entry), macLo);
+- REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | AR_KEYTABLE_VALID);
++ REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | unicast_flag);
+
+ return true;
+ }