37 lines
1.1 KiB
Diff
37 lines
1.1 KiB
Diff
--- 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;
|
|
}
|