aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2010-05-25 13:42:44 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-03 14:10:44 -0400
commit1d0bb42d5eee20bd70f237d0a32cfe3b079849e2 (patch)
treebee2e245d0267c95c9b44cc422479e78f462351b /drivers/net/wireless/ath
parentfd515941cfaf949b55086a36943afe085d7268e6 (diff)
ath9k_hw: add multicast key search support
If a MAC address for a key table entry is flagged with the multicast bit (0x01), indicate to the hardware that multicast lookup instead of unicast lookup should be used. The multicast bit itself never makes it to the actual keytable entry register, as it is shifted out. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath')
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index d902878faeed..df277e467b87 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -1485,6 +1485,7 @@ EXPORT_SYMBOL(ath9k_hw_keyreset);
1485bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac) 1485bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
1486{ 1486{
1487 u32 macHi, macLo; 1487 u32 macHi, macLo;
1488 u32 unicast_flag = AR_KEYTABLE_VALID;
1488 1489
1489 if (entry >= ah->caps.keycache_size) { 1490 if (entry >= ah->caps.keycache_size) {
1490 ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, 1491 ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
@@ -1493,6 +1494,16 @@ bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
1493 } 1494 }
1494 1495
1495 if (mac != NULL) { 1496 if (mac != NULL) {
1497 /*
1498 * AR_KEYTABLE_VALID indicates that the address is a unicast
1499 * address, which must match the transmitter address for
1500 * decrypting frames.
1501 * Not setting this bit allows the hardware to use the key
1502 * for multicast frame decryption.
1503 */
1504 if (mac[0] & 0x01)
1505 unicast_flag = 0;
1506
1496 macHi = (mac[5] << 8) | mac[4]; 1507 macHi = (mac[5] << 8) | mac[4];
1497 macLo = (mac[3] << 24) | 1508 macLo = (mac[3] << 24) |
1498 (mac[2] << 16) | 1509 (mac[2] << 16) |
@@ -1505,7 +1516,7 @@ bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
1505 macLo = macHi = 0; 1516 macLo = macHi = 0;
1506 } 1517 }
1507 REG_WRITE(ah, AR_KEYTABLE_MAC0(entry), macLo); 1518 REG_WRITE(ah, AR_KEYTABLE_MAC0(entry), macLo);
1508 REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | AR_KEYTABLE_VALID); 1519 REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | unicast_flag);
1509 1520
1510 return true; 1521 return true;
1511} 1522}