ath9k_hw: fix spectral scan on AR9285 and newer
authorFelix Fietkau <nbd@nbd.name>
Mon, 11 Jul 2016 08:35:39 +0000 (10:35 +0200)
committerKalle Valo <kvalo@qca.qualcomm.com>
Tue, 19 Jul 2016 17:58:07 +0000 (20:58 +0300)
The register layout of AR_PHY_SPECTRAL_SCAN has changed, only AR9280
uses the old layout

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath9k/ar9002_phy.c
drivers/net/wireless/ath/ath9k/ar9002_phy.h

index 53d7445a5d12c1edaaf012e4e853560ec1f75e39..61a9b85045d2ea1c7cb38e7972faf0e6520c58a3 100644 (file)
@@ -476,6 +476,7 @@ static void ar9002_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
 static void ar9002_hw_spectral_scan_config(struct ath_hw *ah,
                                    struct ath_spec_scan *param)
 {
+       u32 repeat_bit;
        u8 count;
 
        if (!param->enabled) {
@@ -486,12 +487,15 @@ static void ar9002_hw_spectral_scan_config(struct ath_hw *ah,
        REG_SET_BIT(ah, AR_PHY_RADAR_0, AR_PHY_RADAR_0_FFT_ENA);
        REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN, AR_PHY_SPECTRAL_SCAN_ENABLE);
 
+       if (AR_SREV_9280(ah))
+               repeat_bit = AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT;
+       else
+               repeat_bit = AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI;
+
        if (param->short_repeat)
-               REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN,
-                           AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT);
+               REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN, repeat_bit);
        else
-               REG_CLR_BIT(ah, AR_PHY_SPECTRAL_SCAN,
-                           AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT);
+               REG_CLR_BIT(ah, AR_PHY_SPECTRAL_SCAN, repeat_bit);
 
        /* on AR92xx, the highest bit of count will make the the chip send
         * spectral samples endlessly. Check if this really was intended,
@@ -499,15 +503,25 @@ static void ar9002_hw_spectral_scan_config(struct ath_hw *ah,
         */
        count = param->count;
        if (param->endless) {
-               if (AR_SREV_9271(ah))
-                       count = 0;
-               else
+               if (AR_SREV_9280(ah))
                        count = 0x80;
+               else
+                       count = 0;
        } else if (count & 0x80)
                count = 0x7f;
+       else if (!count)
+               count = 1;
+
+       if (AR_SREV_9280(ah)) {
+               REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN,
+                             AR_PHY_SPECTRAL_SCAN_COUNT, count);
+       } else {
+               REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN,
+                             AR_PHY_SPECTRAL_SCAN_COUNT_KIWI, count);
+               REG_SET_BIT(ah, AR_PHY_SPECTRAL_SCAN,
+                           AR_PHY_SPECTRAL_SCAN_PHYERR_MASK_SELECT);
+       }
 
-       REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN,
-                     AR_PHY_SPECTRAL_SCAN_COUNT, count);
        REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN,
                      AR_PHY_SPECTRAL_SCAN_PERIOD, param->period);
        REG_RMW_FIELD(ah, AR_PHY_SPECTRAL_SCAN,
index 9d17a5375f6497c6e02ed368e332e7cd4fc27fe6..2b58245f774a64cb13396a5a661195cc9bc0af61 100644 (file)
 #define AR_PHY_SPECTRAL_SCAN_PERIOD_S          8
 #define AR_PHY_SPECTRAL_SCAN_COUNT             0x00FF0000  /* Number of reports, reg 68, bits 16-23*/
 #define AR_PHY_SPECTRAL_SCAN_COUNT_S           16
+#define AR_PHY_SPECTRAL_SCAN_COUNT_KIWI                0x0FFF0000  /* Number of reports, reg 68, bits 16-27*/
+#define AR_PHY_SPECTRAL_SCAN_COUNT_KIWI_S      16
 #define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT      0x01000000  /* Short repeat, reg 68, bit 24*/
-#define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_S    24  /* Short repeat, reg 68, bit 24*/
+#define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_KIWI 0x10000000  /* Short repeat, reg 68, bit 28*/
+#define AR_PHY_SPECTRAL_SCAN_PHYERR_MASK_SELECT        0x40000000
 
 #define AR_PHY_RX_DELAY           0x9914
 #define AR_PHY_SEARCH_START_DELAY 0x9918