diff options
Diffstat (limited to 'drivers/net/wireless/ath/hw.c')
| -rw-r--r-- | drivers/net/wireless/ath/hw.c | 39 | 
1 files changed, 22 insertions, 17 deletions
diff --git a/drivers/net/wireless/ath/hw.c b/drivers/net/wireless/ath/hw.c index 183c2828138..eae9abf540a 100644 --- a/drivers/net/wireless/ath/hw.c +++ b/drivers/net/wireless/ath/hw.c @@ -14,13 +14,14 @@   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.   */ +#include <linux/export.h>  #include <asm/unaligned.h>  #include "ath.h"  #include "reg.h" -#define REG_READ	(common->ops->read) -#define REG_WRITE	(common->ops->write) +#define REG_READ			(common->ops->read) +#define REG_WRITE(_ah, _reg, _val)	(common->ops->write)(_ah, _val, _reg)  /**   * ath_hw_set_bssid_mask - filter out bssids we listen @@ -43,7 +44,7 @@   * set of  ~ ( MAC XOR BSSID ) for all bssids we handle.   *   * When you do this you are essentially computing the common bits of all your - * BSSes. Later it is assumed the harware will "and" (&) the BSSID mask with + * BSSes. Later it is assumed the hardware will "and" (&) the BSSID mask with   * the MAC address to obtain the relevant bits and compare the result with   * (frame's BSSID & mask) to see if they match.   * @@ -71,8 +72,8 @@   *             On loop iteration for BSSID-02:   *             bssid_mask &= ~(0001   ^   1001)   *             bssid_mask =   (1010)  & ~(0001 ^ 1001) - *             bssid_mask =   (1010)  & ~(1001) - *             bssid_mask =   (1010)  &  (0110) + *             bssid_mask =   (1010)  & ~(1000) + *             bssid_mask =   (1010)  &  (0111)   *             bssid_mask =   0010   *   * A bssid_mask of 0010 means "only pay attention to the second least @@ -86,7 +87,7 @@   * IFRAME-01:  0110   *   * An easy eye-inspeciton of this already should tell you that this frame - * will not pass our check. This is beacuse the bssid_mask tells the + * will not pass our check. This is because the bssid_mask tells the   * hardware to only look at the second least significant bit and the   * common bit amongst the MAC and BSSIDs is 0, this frame has the 2nd LSB   * as 1, which does not match 0. @@ -102,11 +103,9 @@   *   * IFRAME-02:  0001 (we should allow)   * - *     allow = (0001 & 1010) == 1010 - *   *     allow = (IFRAME-02 & bssid_mask) == (bssid_mask & MAC) ? 1 : 0;   *  --> allow = (0001 & 0010) ==  (0010 & 0001) ? 1 :0; - *  --> allow = (0010) == (0010) + *  --> allow = (0000) == (0000)   *  --> allow = 1   *   * Other examples: @@ -119,9 +118,15 @@  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, get_unaligned_le32(common->bssidmask), AR_BSSMSKL); -	REG_WRITE(ah, get_unaligned_le16(common->bssidmask + 4), AR_BSSMSKU); +	REG_WRITE(ah, AR_BSSMSKL, get_unaligned_le32(common->bssidmask)); +	REG_WRITE(ah, AR_BSSMSKU, get_unaligned_le16(common->bssidmask + 4));  }  EXPORT_SYMBOL(ath_hw_setbssidmask); @@ -140,7 +145,7 @@ void ath_hw_cycle_counters_update(struct ath_common *common)  	void *ah = common->ah;  	/* freeze */ -	REG_WRITE(ah, AR_MIBC_FMC, AR_MIBC); +	REG_WRITE(ah, AR_MIBC, AR_MIBC_FMC);  	/* read */  	cycles = REG_READ(ah, AR_CCCNT); @@ -149,13 +154,13 @@ void ath_hw_cycle_counters_update(struct ath_common *common)  	tx = REG_READ(ah, AR_TFCNT);  	/* clear */ -	REG_WRITE(ah, 0, AR_CCCNT); -	REG_WRITE(ah, 0, AR_RFCNT); -	REG_WRITE(ah, 0, AR_RCCNT); -	REG_WRITE(ah, 0, AR_TFCNT); +	REG_WRITE(ah, AR_CCCNT, 0); +	REG_WRITE(ah, AR_RFCNT, 0); +	REG_WRITE(ah, AR_RCCNT, 0); +	REG_WRITE(ah, AR_TFCNT, 0);  	/* unfreeze */ -	REG_WRITE(ah, 0, AR_MIBC); +	REG_WRITE(ah, AR_MIBC, 0);  	/* update all cycle counters here */  	common->cc_ani.cycles += cycles;  | 
