+--- a/drivers/net/wireless/ath/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath/ath9k/ath9k.h
+@@ -657,11 +657,10 @@ enum sc_op_flags {
+ struct ath_rate_table;
+
+ struct ath9k_vif_iter_data {
+- const u8 *hw_macaddr; /* phy's hardware address, set
+- * before starting iteration for
+- * valid bssid mask.
+- */
++ u8 hw_macaddr[ETH_ALEN]; /* address of the first vif */
+ u8 mask[ETH_ALEN]; /* bssid mask */
++ bool has_hw_macaddr;
++
+ int naps; /* number of AP vifs */
+ int nmeshes; /* number of mesh vifs */
+ int nstations; /* number of station vifs */
+--- a/drivers/net/wireless/ath/ath9k/main.c
++++ b/drivers/net/wireless/ath/ath9k/main.c
+@@ -835,10 +835,14 @@ static void ath9k_vif_iter(void *data, u
+ struct ath9k_vif_iter_data *iter_data = data;
+ int i;
+
+- if (iter_data->hw_macaddr)
++ if (iter_data->has_hw_macaddr) {
+ for (i = 0; i < ETH_ALEN; i++)
+ iter_data->mask[i] &=
+ ~(iter_data->hw_macaddr[i] ^ mac[i]);
++ } else {
++ memcpy(iter_data->hw_macaddr, mac, ETH_ALEN);
++ iter_data->has_hw_macaddr = true;
++ }
+
+ switch (vif->type) {
+ case NL80211_IFTYPE_AP:
+@@ -887,7 +891,6 @@ void ath9k_calculate_iter_data(struct ie
+ * together with the BSSID mask when matching addresses.
+ */
+ memset(iter_data, 0, sizeof(*iter_data));
+- iter_data->hw_macaddr = common->macaddr;
+ memset(&iter_data->mask, 0xff, ETH_ALEN);
+
+ if (vif)
+@@ -897,6 +900,8 @@ void ath9k_calculate_iter_data(struct ie
+ ieee80211_iterate_active_interfaces_atomic(
+ sc->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
+ ath9k_vif_iter, iter_data);
++
++ memcpy(common->macaddr, iter_data->hw_macaddr, ETH_ALEN);
+ }
+
+ /* Called with sc->mutex held. */
+--- a/drivers/net/wireless/ath/ath9k/reg.h
++++ b/drivers/net/wireless/ath/ath9k/reg.h
+@@ -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
+--- a/drivers/net/wireless/ath/hw.c
++++ b/drivers/net/wireless/ath/hw.c
+@@ -118,6 +118,12 @@
+ 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));
+--- a/drivers/net/wireless/ath/reg.h
++++ b/drivers/net/wireless/ath/reg.h
+@@ -23,6 +23,10 @@
+ #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.