ath9k_hw: set ANI firstep as absolute values instead of relative
authorFelix Fietkau <nbd@openwrt.org>
Tue, 11 Mar 2014 15:10:34 +0000 (16:10 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Fri, 14 Mar 2014 18:49:15 +0000 (14:49 -0400)
On older chips, the INI value differ in similar ways as cycpwr_thr1, so
convert it to absolute values as well.

Since the ANI algorithm is different here compared to the old
implementation (fewer steps, controlled at a different point in time),
it makes sense to use values similar to what would be applied for newer
chips, just without relying on INI defaults.

Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ar5008_phy.c

index 504e189728cd03ebed8f3531a50d9284888e379b..3b3e91057a4cbdb6860006ce0e19a22c3b835774 100644 (file)
@@ -917,7 +917,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,
        struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_channel *chan = ah->curchan;
        struct ar5416AniState *aniState = &ah->ani;
-       s32 value, value2;
+       s32 value;
 
        switch (cmd & ah->ani_function) {
        case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{
@@ -1004,42 +1004,11 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,
        case ATH9K_ANI_FIRSTEP_LEVEL:{
                u32 level = param;
 
-               if (level >= ARRAY_SIZE(firstep_table)) {
-                       ath_dbg(common, ANI,
-                               "ATH9K_ANI_FIRSTEP_LEVEL: level out of range (%u > %zu)\n",
-                               level, ARRAY_SIZE(firstep_table));
-                       return false;
-               }
-
-               /*
-                * make register setting relative to default
-                * from INI file & cap value
-                */
-               value = firstep_table[level] -
-                       firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
-                       aniState->iniDef.firstep;
-               if (value < ATH9K_SIG_FIRSTEP_SETTING_MIN)
-                       value = ATH9K_SIG_FIRSTEP_SETTING_MIN;
-               if (value > ATH9K_SIG_FIRSTEP_SETTING_MAX)
-                       value = ATH9K_SIG_FIRSTEP_SETTING_MAX;
+               value = level * 2;
                REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,
-                             AR_PHY_FIND_SIG_FIRSTEP,
-                             value);
-               /*
-                * we need to set first step low register too
-                * make register setting relative to default
-                * from INI file & cap value
-                */
-               value2 = firstep_table[level] -
-                        firstep_table[ATH9K_ANI_FIRSTEP_LVL] +
-                        aniState->iniDef.firstepLow;
-               if (value2 < ATH9K_SIG_FIRSTEP_SETTING_MIN)
-                       value2 = ATH9K_SIG_FIRSTEP_SETTING_MIN;
-               if (value2 > ATH9K_SIG_FIRSTEP_SETTING_MAX)
-                       value2 = ATH9K_SIG_FIRSTEP_SETTING_MAX;
-
+                             AR_PHY_FIND_SIG_FIRSTEP, value);
                REG_RMW_FIELD(ah, AR_PHY_FIND_SIG_LOW,
-                             AR_PHY_FIND_SIG_FIRSTEP_LOW, value2);
+                             AR_PHY_FIND_SIG_FIRSTEP_LOW, value);
 
                if (level != aniState->firstepLevel) {
                        ath_dbg(common, ANI,
@@ -1056,7 +1025,7 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,
                                aniState->firstepLevel,
                                level,
                                ATH9K_ANI_FIRSTEP_LVL,
-                               value2,
+                               value,
                                aniState->iniDef.firstepLow);
                        if (level > aniState->firstepLevel)
                                ah->stats.ast_ani_stepup++;