Commit 1510718d authored by Luis R. Rodriguez's avatar Luis R. Rodriguez Committed by John W. Linville

atheros/ath9k: move macaddr, curaid, curbssid and bssidmask to common

These are common amongst ath9k and ath5k, so put them into the
common structure and make ath9k to use it. ar9170 can use macaddr,
and curbssid. We'll change ath5k and ar9170 separately.
Signed-off-by: default avatarLuis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 3453ad88
...@@ -41,6 +41,10 @@ struct ath_regulatory { ...@@ -41,6 +41,10 @@ struct ath_regulatory {
struct ath_common { struct ath_common {
u16 cachelsz; u16 cachelsz;
u16 curaid;
u8 macaddr[ETH_ALEN];
u8 curbssid[ETH_ALEN];
u8 bssidmask[ETH_ALEN];
struct ath_regulatory regulatory; struct ath_regulatory regulatory;
}; };
......
...@@ -581,12 +581,9 @@ struct ath_softc { ...@@ -581,12 +581,9 @@ struct ath_softc {
spinlock_t sc_pm_lock; spinlock_t sc_pm_lock;
struct mutex mutex; struct mutex mutex;
u8 curbssid[ETH_ALEN];
u8 bssidmask[ETH_ALEN];
u32 intrstatus; u32 intrstatus;
u32 sc_flags; /* SC_OP_* */ u32 sc_flags; /* SC_OP_* */
u16 curtxpow; u16 curtxpow;
u16 curaid;
u8 nbcnvifs; u8 nbcnvifs;
u16 nvifs; u16 nvifs;
u8 tx_chainmask; u8 tx_chainmask;
......
...@@ -511,6 +511,7 @@ static int ath9k_hw_rf_claim(struct ath_hw *ah) ...@@ -511,6 +511,7 @@ static int ath9k_hw_rf_claim(struct ath_hw *ah)
static int ath9k_hw_init_macaddr(struct ath_hw *ah) static int ath9k_hw_init_macaddr(struct ath_hw *ah)
{ {
struct ath_common *common = ath9k_hw_common(ah);
u32 sum; u32 sum;
int i; int i;
u16 eeval; u16 eeval;
...@@ -519,8 +520,8 @@ static int ath9k_hw_init_macaddr(struct ath_hw *ah) ...@@ -519,8 +520,8 @@ static int ath9k_hw_init_macaddr(struct ath_hw *ah)
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
eeval = ah->eep_ops->get_eeprom(ah, AR_EEPROM_MAC(i)); eeval = ah->eep_ops->get_eeprom(ah, AR_EEPROM_MAC(i));
sum += eeval; sum += eeval;
ah->macaddr[2 * i] = eeval >> 8; common->macaddr[2 * i] = eeval >> 8;
ah->macaddr[2 * i + 1] = eeval & 0xff; common->macaddr[2 * i + 1] = eeval & 0xff;
} }
if (sum == 0 || sum == 0xffff * 3) if (sum == 0 || sum == 0xffff * 3)
return -EADDRNOTAVAIL; return -EADDRNOTAVAIL;
...@@ -2343,6 +2344,7 @@ static void ath9k_enable_rfkill(struct ath_hw *ah) ...@@ -2343,6 +2344,7 @@ static void ath9k_enable_rfkill(struct ath_hw *ah)
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
bool bChannelChange) bool bChannelChange)
{ {
struct ath_common *common = ath9k_hw_common(ah);
u32 saveLedState; u32 saveLedState;
struct ath_softc *sc = ah->ah_sc; struct ath_softc *sc = ah->ah_sc;
struct ath9k_channel *curchan = ah->curchan; struct ath9k_channel *curchan = ah->curchan;
...@@ -2463,8 +2465,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, ...@@ -2463,8 +2465,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
ath9k_hw_decrease_chain_power(ah, chan); ath9k_hw_decrease_chain_power(ah, chan);
REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(ah->macaddr)); REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(ah->macaddr + 4) REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4)
| macStaId1 | macStaId1
| AR_STA_ID1_RTS_USE_DEF | AR_STA_ID1_RTS_USE_DEF
| (ah->config. | (ah->config.
...@@ -4007,7 +4009,7 @@ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit) ...@@ -4007,7 +4009,7 @@ void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit)
void ath9k_hw_setmac(struct ath_hw *ah, const u8 *mac) void ath9k_hw_setmac(struct ath_hw *ah, const u8 *mac)
{ {
memcpy(ah->macaddr, mac, ETH_ALEN); memcpy(ath9k_hw_common(ah)->macaddr, mac, ETH_ALEN);
} }
void ath9k_hw_setopmode(struct ath_hw *ah) void ath9k_hw_setopmode(struct ath_hw *ah)
...@@ -4023,15 +4025,19 @@ void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1) ...@@ -4023,15 +4025,19 @@ void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1)
void ath9k_hw_setbssidmask(struct ath_hw *ah) void ath9k_hw_setbssidmask(struct ath_hw *ah)
{ {
REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(ah->ah_sc->bssidmask)); struct ath_common *common = ath9k_hw_common(ah);
REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(ah->ah_sc->bssidmask + 4));
REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(common->bssidmask));
REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(common->bssidmask + 4));
} }
void ath9k_hw_write_associd(struct ath_hw *ah) void ath9k_hw_write_associd(struct ath_hw *ah)
{ {
REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(ah->ah_sc->curbssid)); struct ath_common *common = ath9k_hw_common(ah);
REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(ah->ah_sc->curbssid + 4) |
((ah->ah_sc->curaid & 0x3fff) << AR_BSS_ID1_AID_S)); REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(common->curbssid));
REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(common->curbssid + 4) |
((common->curaid & 0x3fff) << AR_BSS_ID1_AID_S));
} }
u64 ath9k_hw_gettsf64(struct ath_hw *ah) u64 ath9k_hw_gettsf64(struct ath_hw *ah)
......
...@@ -451,7 +451,6 @@ struct ath_hw { ...@@ -451,7 +451,6 @@ struct ath_hw {
bool sw_mgmt_crypto; bool sw_mgmt_crypto;
bool is_pciexpress; bool is_pciexpress;
u8 macaddr[ETH_ALEN];
u16 tx_trig_level; u16 tx_trig_level;
u16 rfsilent; u16 rfsilent;
u32 rfkill_gpio; u32 rfkill_gpio;
......
...@@ -976,13 +976,14 @@ static void ath9k_bss_assoc_info(struct ath_softc *sc, ...@@ -976,13 +976,14 @@ static void ath9k_bss_assoc_info(struct ath_softc *sc,
struct ieee80211_bss_conf *bss_conf) struct ieee80211_bss_conf *bss_conf)
{ {
struct ath_hw *ah = sc->sc_ah; struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
if (bss_conf->assoc) { if (bss_conf->assoc) {
DPRINTF(ah, ATH_DBG_CONFIG, "Bss Info ASSOC %d, bssid: %pM\n", DPRINTF(ah, ATH_DBG_CONFIG, "Bss Info ASSOC %d, bssid: %pM\n",
bss_conf->aid, sc->curbssid); bss_conf->aid, common->curbssid);
/* New association, store aid */ /* New association, store aid */
sc->curaid = bss_conf->aid; common->curaid = bss_conf->aid;
ath9k_hw_write_associd(ah); ath9k_hw_write_associd(ah);
/* /*
...@@ -1001,7 +1002,7 @@ static void ath9k_bss_assoc_info(struct ath_softc *sc, ...@@ -1001,7 +1002,7 @@ static void ath9k_bss_assoc_info(struct ath_softc *sc,
ath_start_ani(sc); ath_start_ani(sc);
} else { } else {
DPRINTF(ah, ATH_DBG_CONFIG, "Bss Info DISASSOC\n"); DPRINTF(ah, ATH_DBG_CONFIG, "Bss Info DISASSOC\n");
sc->curaid = 0; common->curaid = 0;
/* Stop ANI */ /* Stop ANI */
del_timer_sync(&sc->ani.timer); del_timer_sync(&sc->ani.timer);
} }
...@@ -1497,6 +1498,7 @@ static int ath_init_btcoex_timer(struct ath_softc *sc) ...@@ -1497,6 +1498,7 @@ static int ath_init_btcoex_timer(struct ath_softc *sc)
static int ath_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid) static int ath_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid)
{ {
struct ath_hw *ah = NULL; struct ath_hw *ah = NULL;
struct ath_common *common;
int r = 0, i; int r = 0, i;
int csz = 0; int csz = 0;
int qnum; int qnum;
...@@ -1675,8 +1677,10 @@ static int ath_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid) ...@@ -1675,8 +1677,10 @@ static int ath_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid)
ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, true, NULL); ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, true, NULL);
sc->rx.defant = ath9k_hw_getdefantenna(ah); sc->rx.defant = ath9k_hw_getdefantenna(ah);
common = ath9k_hw_common(ah);
if (ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) if (ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK)
memcpy(sc->bssidmask, ath_bcast_mac, ETH_ALEN); memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
sc->beacon.slottime = ATH9K_SLOT_TIME_9; /* default to short slot time */ sc->beacon.slottime = ATH9K_SLOT_TIME_9; /* default to short slot time */
...@@ -1780,6 +1784,7 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw) ...@@ -1780,6 +1784,7 @@ void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
int ath_init_device(u16 devid, struct ath_softc *sc, u16 subsysid) int ath_init_device(u16 devid, struct ath_softc *sc, u16 subsysid)
{ {
struct ieee80211_hw *hw = sc->hw; struct ieee80211_hw *hw = sc->hw;
struct ath_common *common;
struct ath_hw *ah; struct ath_hw *ah;
int error = 0, i; int error = 0, i;
struct ath_regulatory *reg; struct ath_regulatory *reg;
...@@ -1791,19 +1796,20 @@ int ath_init_device(u16 devid, struct ath_softc *sc, u16 subsysid) ...@@ -1791,19 +1796,20 @@ int ath_init_device(u16 devid, struct ath_softc *sc, u16 subsysid)
return error; return error;
ah = sc->sc_ah; ah = sc->sc_ah;
common = ath9k_hw_common(ah);
/* get mac address from hardware and set in mac80211 */ /* get mac address from hardware and set in mac80211 */
SET_IEEE80211_PERM_ADDR(hw, ah->macaddr); SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
ath_set_hw_capab(sc, hw); ath_set_hw_capab(sc, hw);
error = ath_regd_init(&sc->common.regulatory, sc->hw->wiphy, error = ath_regd_init(&common->regulatory, sc->hw->wiphy,
ath9k_reg_notifier); ath9k_reg_notifier);
if (error) if (error)
return error; return error;
reg = &sc->common.regulatory; reg = &common->regulatory;
if (ah->caps.hw_caps & ATH9K_HW_CAP_HT) { if (ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap); setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap);
...@@ -2785,6 +2791,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2785,6 +2791,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
struct ath_wiphy *aphy = hw->priv; struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc; struct ath_softc *sc = aphy->sc;
struct ath_hw *ah = sc->sc_ah; struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
struct ath_vif *avp = (void *)vif->drv_priv; struct ath_vif *avp = (void *)vif->drv_priv;
u32 rfilt = 0; u32 rfilt = 0;
int error, i; int error, i;
...@@ -2800,8 +2807,8 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2800,8 +2807,8 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
ah->opmode != NL80211_IFTYPE_AP) { ah->opmode != NL80211_IFTYPE_AP) {
ah->opmode = NL80211_IFTYPE_STATION; ah->opmode = NL80211_IFTYPE_STATION;
ath9k_hw_setopmode(ah); ath9k_hw_setopmode(ah);
memcpy(sc->curbssid, sc->sc_ah->macaddr, ETH_ALEN); memcpy(common->curbssid, common->macaddr, ETH_ALEN);
sc->curaid = 0; common->curaid = 0;
ath9k_hw_write_associd(ah); ath9k_hw_write_associd(ah);
/* Request full reset to get hw opmode changed properly */ /* Request full reset to get hw opmode changed properly */
sc->sc_flags |= SC_OP_FULL_RESET; sc->sc_flags |= SC_OP_FULL_RESET;
...@@ -2814,9 +2821,9 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2814,9 +2821,9 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
case NL80211_IFTYPE_ADHOC: case NL80211_IFTYPE_ADHOC:
case NL80211_IFTYPE_MESH_POINT: case NL80211_IFTYPE_MESH_POINT:
/* Set BSSID */ /* Set BSSID */
memcpy(sc->curbssid, bss_conf->bssid, ETH_ALEN); memcpy(common->curbssid, bss_conf->bssid, ETH_ALEN);
memcpy(avp->bssid, bss_conf->bssid, ETH_ALEN); memcpy(avp->bssid, bss_conf->bssid, ETH_ALEN);
sc->curaid = 0; common->curaid = 0;
ath9k_hw_write_associd(ah); ath9k_hw_write_associd(ah);
/* Set aggregation protection mode parameters */ /* Set aggregation protection mode parameters */
...@@ -2824,7 +2831,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2824,7 +2831,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
DPRINTF(sc->sc_ah, ATH_DBG_CONFIG, DPRINTF(sc->sc_ah, ATH_DBG_CONFIG,
"RX filter 0x%x bssid %pM aid 0x%x\n", "RX filter 0x%x bssid %pM aid 0x%x\n",
rfilt, sc->curbssid, sc->curaid); rfilt, common->curbssid, common->curaid);
/* need to reconfigure the beacon */ /* need to reconfigure the beacon */
sc->sc_flags &= ~SC_OP_BEACONS ; sc->sc_flags &= ~SC_OP_BEACONS ;
...@@ -2863,7 +2870,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw, ...@@ -2863,7 +2870,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
if (ath9k_hw_keyisvalid(sc->sc_ah, (u16)i)) if (ath9k_hw_keyisvalid(sc->sc_ah, (u16)i))
ath9k_hw_keysetmac(sc->sc_ah, ath9k_hw_keysetmac(sc->sc_ah,
(u16)i, (u16)i,
sc->curbssid); common->curbssid);
} }
/* Only legacy IBSS for now */ /* Only legacy IBSS for now */
......
...@@ -272,6 +272,8 @@ static int ath_rx_prepare(struct sk_buff *skb, struct ath_desc *ds, ...@@ -272,6 +272,8 @@ static int ath_rx_prepare(struct sk_buff *skb, struct ath_desc *ds,
static void ath_opmode_init(struct ath_softc *sc) static void ath_opmode_init(struct ath_softc *sc)
{ {
struct ath_hw *ah = sc->sc_ah; struct ath_hw *ah = sc->sc_ah;
struct ath_common *common = ath9k_hw_common(ah);
u32 rfilt, mfilt[2]; u32 rfilt, mfilt[2];
/* configure rx filter */ /* configure rx filter */
...@@ -286,7 +288,7 @@ static void ath_opmode_init(struct ath_softc *sc) ...@@ -286,7 +288,7 @@ static void ath_opmode_init(struct ath_softc *sc)
ath9k_hw_setopmode(ah); ath9k_hw_setopmode(ah);
/* Handle any link-level address change. */ /* Handle any link-level address change. */
ath9k_hw_setmac(ah, sc->sc_ah->macaddr); ath9k_hw_setmac(ah, common->macaddr);
/* calculate and install multicast filter */ /* calculate and install multicast filter */
mfilt[0] = mfilt[1] = ~0; mfilt[0] = mfilt[1] = ~0;
...@@ -527,12 +529,13 @@ static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb) ...@@ -527,12 +529,13 @@ static bool ath_beacon_dtim_pending_cab(struct sk_buff *skb)
static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb) static void ath_rx_ps_beacon(struct ath_softc *sc, struct sk_buff *skb)
{ {
struct ieee80211_mgmt *mgmt; struct ieee80211_mgmt *mgmt;
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
if (skb->len < 24 + 8 + 2 + 2) if (skb->len < 24 + 8 + 2 + 2)
return; return;
mgmt = (struct ieee80211_mgmt *)skb->data; mgmt = (struct ieee80211_mgmt *)skb->data;
if (memcmp(sc->curbssid, mgmt->bssid, ETH_ALEN) != 0) if (memcmp(common->curbssid, mgmt->bssid, ETH_ALEN) != 0)
return; /* not from our current AP */ return; /* not from our current AP */
sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON; sc->sc_flags &= ~SC_OP_WAIT_FOR_BEACON;
......
...@@ -40,6 +40,7 @@ void ath9k_set_bssid_mask(struct ieee80211_hw *hw) ...@@ -40,6 +40,7 @@ void ath9k_set_bssid_mask(struct ieee80211_hw *hw)
{ {
struct ath_wiphy *aphy = hw->priv; struct ath_wiphy *aphy = hw->priv;
struct ath_softc *sc = aphy->sc; struct ath_softc *sc = aphy->sc;
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ath9k_vif_iter_data iter_data; struct ath9k_vif_iter_data iter_data;
int i, j; int i, j;
u8 mask[ETH_ALEN]; u8 mask[ETH_ALEN];
...@@ -51,7 +52,7 @@ void ath9k_set_bssid_mask(struct ieee80211_hw *hw) ...@@ -51,7 +52,7 @@ void ath9k_set_bssid_mask(struct ieee80211_hw *hw)
*/ */
iter_data.addr = kmalloc(ETH_ALEN, GFP_ATOMIC); iter_data.addr = kmalloc(ETH_ALEN, GFP_ATOMIC);
if (iter_data.addr) { if (iter_data.addr) {
memcpy(iter_data.addr, sc->sc_ah->macaddr, ETH_ALEN); memcpy(iter_data.addr, common->macaddr, ETH_ALEN);
iter_data.count = 1; iter_data.count = 1;
} else } else
iter_data.count = 0; iter_data.count = 0;
...@@ -86,12 +87,12 @@ void ath9k_set_bssid_mask(struct ieee80211_hw *hw) ...@@ -86,12 +87,12 @@ void ath9k_set_bssid_mask(struct ieee80211_hw *hw)
kfree(iter_data.addr); kfree(iter_data.addr);
/* Invert the mask and configure hardware */ /* Invert the mask and configure hardware */
sc->bssidmask[0] = ~mask[0]; common->bssidmask[0] = ~mask[0];
sc->bssidmask[1] = ~mask[1]; common->bssidmask[1] = ~mask[1];
sc->bssidmask[2] = ~mask[2]; common->bssidmask[2] = ~mask[2];
sc->bssidmask[3] = ~mask[3]; common->bssidmask[3] = ~mask[3];
sc->bssidmask[4] = ~mask[4]; common->bssidmask[4] = ~mask[4];
sc->bssidmask[5] = ~mask[5]; common->bssidmask[5] = ~mask[5];
ath9k_hw_setbssidmask(sc->sc_ah); ath9k_hw_setbssidmask(sc->sc_ah);
} }
...@@ -100,6 +101,7 @@ int ath9k_wiphy_add(struct ath_softc *sc) ...@@ -100,6 +101,7 @@ int ath9k_wiphy_add(struct ath_softc *sc)
{ {
int i, error; int i, error;
struct ath_wiphy *aphy; struct ath_wiphy *aphy;
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
struct ieee80211_hw *hw; struct ieee80211_hw *hw;
u8 addr[ETH_ALEN]; u8 addr[ETH_ALEN];
...@@ -138,7 +140,7 @@ int ath9k_wiphy_add(struct ath_softc *sc) ...@@ -138,7 +140,7 @@ int ath9k_wiphy_add(struct ath_softc *sc)
sc->sec_wiphy[i] = aphy; sc->sec_wiphy[i] = aphy;
spin_unlock_bh(&sc->wiphy_lock); spin_unlock_bh(&sc->wiphy_lock);
memcpy(addr, sc->sc_ah->macaddr, ETH_ALEN); memcpy(addr, common->macaddr, ETH_ALEN);
addr[0] |= 0x02; /* Locally managed address */ addr[0] |= 0x02; /* Locally managed address */
/* /*
* XOR virtual wiphy index into the least significant bits to generate * XOR virtual wiphy index into the least significant bits to generate
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment