diff options
Diffstat (limited to 'package/mac80211/patches/520-ath0k_hw_mcast_search.patch')
-rw-r--r-- | package/mac80211/patches/520-ath0k_hw_mcast_search.patch | 36 |
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; + } |