ath9k: Fix chainmask selection for AR9462
authorSujith Manoharan <c_manoha@qualcomm.com>
Wed, 26 Sep 2012 06:52:08 +0000 (12:22 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 28 Sep 2012 17:54:06 +0000 (13:54 -0400)
Force chain 1 to be used for CCK rates since the target power
table stored in EEPROM is too high to transmit with both chains.
This is needed to avoid regulatory violation.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/xmit.c

index 8e27f4fb21fe06867467ed4123827b8d43dcbbd5..dfe6a4707fd22684a5994de3b6c4d9dcadd456f2 100644 (file)
@@ -173,6 +173,8 @@ void ath_descdma_cleanup(struct ath_softc *sc, struct ath_descdma *dd,
 
 #define ATH_AN_2_TID(_an, _tidno)  (&(_an)->tid[(_tidno)])
 
+#define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e))
+
 #define ATH_TX_COMPLETE_POLL_INT       1000
 
 enum ATH_AGGR_STATUS {
index b088fa0eb022b464b80fb157a1db0ed7a68f7b0f..36618e3a5e609831184b973e30b3a9aa739522f3 100644 (file)
@@ -1820,10 +1820,14 @@ u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate)
 {
        struct ath_hw *ah = sc->sc_ah;
        struct ath9k_channel *curchan = ah->curchan;
+
        if ((ah->caps.hw_caps & ATH9K_HW_CAP_APM) &&
            (curchan->channelFlags & CHANNEL_5GHZ) &&
            (chainmask == 0x7) && (rate < 0x90))
                return 0x3;
+       else if (AR_SREV_9462(ah) && ath9k_hw_btcoex_is_enabled(ah) &&
+                IS_CCK_RATE(rate))
+               return 0x2;
        else
                return chainmask;
 }