ath: update hardware mac address with bssid mask
authorFelix Fietkau <nbd@openwrt.org>
Tue, 16 Apr 2013 10:51:56 +0000 (12:51 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 22 Apr 2013 19:20:15 +0000 (15:20 -0400)
Preparation for updating common->macaddr along with virtual interface
MAC address changes.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/hw.c
drivers/net/wireless/ath/ath9k/reg.h
drivers/net/wireless/ath/hw.c
drivers/net/wireless/ath/reg.h

index 8a980a4bf4ec2aca66ac52f0444c752bfecc0435..10eb6bae12d9392084cbc9bfc453d95f752ba4bc 100644 (file)
@@ -1698,12 +1698,11 @@ static void ath9k_hw_reset_opmode(struct ath_hw *ah,
 
        ENABLE_REGWRITE_BUFFER(ah);
 
-       REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
-       REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4)
-                 | macStaId1
+       REG_RMW(ah, AR_STA_ID1, macStaId1
                  | AR_STA_ID1_RTS_USE_DEF
                  | (ah->config.ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0)
-                 | ah->sta_id1_defaults);
+                 | ah->sta_id1_defaults,
+                 ~AR_STA_ID1_SADH_MASK);
        ath_hw_setbssidmask(common);
        REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna);
        ath9k_hw_write_associd(ah);
index 5929850649f0ee45a024a8328d6c76c17b5127bb..5c4ab5026dca598ad81b5a2522e3b03fc1a1cdff 100644 (file)
@@ -1493,9 +1493,6 @@ enum {
 #define AR9271_RADIO_RF_RST                    0x20
 #define AR9271_GATE_MAC_CTL                    0x4000
 
-#define AR_STA_ID0                 0x8000
-#define AR_STA_ID1                 0x8004
-#define AR_STA_ID1_SADH_MASK       0x0000FFFF
 #define AR_STA_ID1_STA_AP          0x00010000
 #define AR_STA_ID1_ADHOC           0x00020000
 #define AR_STA_ID1_PWR_SAV         0x00040000
index 39e8a590d7fc86feb3dd70cb55a21d7a6c63e335..eae9abf540a72bddd269b0e7bb75bb8c8b2ae700 100644 (file)
 void ath_hw_setbssidmask(struct ath_common *common)
 {
        void *ah = common->ah;
+       u32 id1;
+
+       REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
+       id1 = REG_READ(ah, AR_STA_ID1) & ~AR_STA_ID1_SADH_MASK;
+       id1 |= get_unaligned_le16(common->macaddr + 4);
+       REG_WRITE(ah, AR_STA_ID1, id1);
 
        REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(common->bssidmask));
        REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(common->bssidmask + 4));
index 298e53f3fa4834939ae75fdaf6a531467d10839a..3ad4c774bd22f880ad4b5dcfc0030b03f7f50584 100644 (file)
 #define AR_MIBC_CMC            0x00000004
 #define AR_MIBC_MCS            0x00000008
 
+#define AR_STA_ID0             0x8000
+#define AR_STA_ID1             0x8004
+#define AR_STA_ID1_SADH_MASK   0x0000ffff
+
 /*
  * BSSID mask registers. See ath_hw_set_bssid_mask()
  * for detailed documentation about these registers.