source: trunk/package/mac80211/patches/530-ath9k_nf_sanitize.patch @ 22036

Last change on this file since 22036 was 22036, checked in by nbd, 6 years ago

ath9k: add a missing null pointer check and some further cleanup

File size: 12.9 KB
  • drivers/net/wireless/ath/ath9k/ar5008_phy.c

    a b static void ar5008_hw_ani_cache_ini_regs 
    16781678        aniState->cycleCount = 0; 
    16791679} 
    16801680 
     1681static void ar5008_hw_set_nf_limits(struct ath_hw *ah) 
     1682{ 
     1683        ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_5416_2GHZ; 
     1684        ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_5416_2GHZ; 
     1685        ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_5416_2GHZ; 
     1686        ah->nf_5g.max = AR_PHY_CCA_MAX_GOOD_VAL_5416_5GHZ; 
     1687        ah->nf_5g.min = AR_PHY_CCA_MIN_GOOD_VAL_5416_5GHZ; 
     1688        ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_5416_5GHZ; 
     1689} 
    16811690 
    16821691void ar5008_hw_attach_phy_ops(struct ath_hw *ah) 
    16831692{ 
    void ar5008_hw_attach_phy_ops(struct ath 
    17151724                priv_ops->compute_pll_control = ar9160_hw_compute_pll_control; 
    17161725        else 
    17171726                priv_ops->compute_pll_control = ar5008_hw_compute_pll_control; 
     1727 
     1728        ar5008_hw_set_nf_limits(ah); 
    17181729} 
  • drivers/net/wireless/ath/ath9k/ar9002_phy.c

    a b static void ar9002_hw_do_getnf(struct at 
    481481        ath_print(common, ATH_DBG_CALIBRATE, 
    482482                  "NF calibrated [ctl] [chain 0] is %d\n", nf); 
    483483 
    484         if (AR_SREV_9271(ah) && (nf >= -114)) 
    485                 nf = -116; 
    486  
    487484        nfarray[0] = nf; 
    488485 
    489486        if (!AR_SREV_9285(ah) && !AR_SREV_9271(ah)) { 
    static void ar9002_hw_do_getnf(struct at 
    503500        ath_print(common, ATH_DBG_CALIBRATE, 
    504501                  "NF calibrated [ext] [chain 0] is %d\n", nf); 
    505502 
    506         if (AR_SREV_9271(ah) && (nf >= -114)) 
    507                 nf = -116; 
    508  
    509503        nfarray[3] = nf; 
    510504 
    511505        if (!AR_SREV_9285(ah) && !AR_SREV_9271(ah)) { 
    static void ar9002_hw_do_getnf(struct at 
    520514        } 
    521515} 
    522516 
     517static void ar9002_hw_set_nf_limits(struct ath_hw *ah) 
     518{ 
     519        if (AR_SREV_9285(ah)) { 
     520                ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9285_2GHZ; 
     521                ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_9285_2GHZ; 
     522                ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9285_2GHZ; 
     523        } else if (AR_SREV_9287(ah)) { 
     524                ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9287_2GHZ; 
     525                ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_9287_2GHZ; 
     526                ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9287_2GHZ; 
     527        } else if (AR_SREV_9271(ah)) { 
     528                ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9271_2GHZ; 
     529                ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_9271_2GHZ; 
     530                ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9271_2GHZ; 
     531        } else { 
     532                ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9280_2GHZ; 
     533                ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_9280_2GHZ; 
     534                ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9280_2GHZ; 
     535                ah->nf_5g.max = AR_PHY_CCA_MAX_GOOD_VAL_9280_5GHZ; 
     536                ah->nf_5g.min = AR_PHY_CCA_MIN_GOOD_VAL_9280_5GHZ; 
     537                ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_9280_5GHZ; 
     538        } 
     539} 
     540 
    523541void ar9002_hw_attach_phy_ops(struct ath_hw *ah) 
    524542{ 
    525543        struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); 
    void ar9002_hw_attach_phy_ops(struct ath 
    532550        priv_ops->olc_init = ar9002_olc_init; 
    533551        priv_ops->compute_pll_control = ar9002_hw_compute_pll_control; 
    534552        priv_ops->do_getnf = ar9002_hw_do_getnf; 
     553 
     554        ar9002_hw_set_nf_limits(ah); 
    535555} 
  • drivers/net/wireless/ath/ath9k/ar9002_phy.h

    a b  
    576576#define AR_PHY_CH2_EXT_MINCCA_PWR   0xFF800000 
    577577#define AR_PHY_CH2_EXT_MINCCA_PWR_S 23 
    578578 
     579#define AR_PHY_CCA_NOM_VAL_5416_2GHZ            -90 
     580#define AR_PHY_CCA_NOM_VAL_5416_5GHZ            -100 
     581#define AR_PHY_CCA_MIN_GOOD_VAL_5416_2GHZ     -100 
     582#define AR_PHY_CCA_MIN_GOOD_VAL_5416_5GHZ     -110 
     583#define AR_PHY_CCA_MAX_GOOD_VAL_5416_2GHZ     -80 
     584#define AR_PHY_CCA_MAX_GOOD_VAL_5416_5GHZ     -90 
     585 
     586#define AR_PHY_CCA_NOM_VAL_9280_2GHZ         -112 
     587#define AR_PHY_CCA_NOM_VAL_9280_5GHZ         -112 
     588#define AR_PHY_CCA_MIN_GOOD_VAL_9280_2GHZ  -127 
     589#define AR_PHY_CCA_MIN_GOOD_VAL_9280_5GHZ  -122 
     590#define AR_PHY_CCA_MAX_GOOD_VAL_9280_2GHZ  -97 
     591#define AR_PHY_CCA_MAX_GOOD_VAL_9280_5GHZ  -102 
     592 
     593#define AR_PHY_CCA_NOM_VAL_9285_2GHZ           -118 
     594#define AR_PHY_CCA_MIN_GOOD_VAL_9285_2GHZ    -127 
     595#define AR_PHY_CCA_MAX_GOOD_VAL_9285_2GHZ    -108 
     596 
     597#define AR_PHY_CCA_NOM_VAL_9271_2GHZ             -118 
     598#define AR_PHY_CCA_MIN_GOOD_VAL_9271_2GHZ      -127 
     599#define AR_PHY_CCA_MAX_GOOD_VAL_9271_2GHZ      -116 
     600 
     601#define AR_PHY_CCA_NOM_VAL_9287_2GHZ           -120 
     602#define AR_PHY_CCA_MIN_GOOD_VAL_9287_2GHZ    -127 
     603#define AR_PHY_CCA_MAX_GOOD_VAL_9287_2GHZ    -110 
     604 
    579605#endif 
  • drivers/net/wireless/ath/ath9k/ar9003_phy.c

    a b static bool ar9003_hw_ani_control(struct 
    10151015        return true; 
    10161016} 
    10171017 
    1018 static void ar9003_hw_nf_sanitize_2g(struct ath_hw *ah, s16 *nf) 
    1019 { 
    1020         struct ath_common *common = ath9k_hw_common(ah); 
    1021  
    1022         if (*nf > ah->nf_2g_max) { 
    1023                 ath_print(common, ATH_DBG_CALIBRATE, 
    1024                           "2 GHz NF (%d) > MAX (%d), " 
    1025                           "correcting to MAX", 
    1026                           *nf, ah->nf_2g_max); 
    1027                 *nf = ah->nf_2g_max; 
    1028         } else if (*nf < ah->nf_2g_min) { 
    1029                 ath_print(common, ATH_DBG_CALIBRATE, 
    1030                           "2 GHz NF (%d) < MIN (%d), " 
    1031                           "correcting to MIN", 
    1032                           *nf, ah->nf_2g_min); 
    1033                 *nf = ah->nf_2g_min; 
    1034         } 
    1035 } 
    1036  
    1037 static void ar9003_hw_nf_sanitize_5g(struct ath_hw *ah, s16 *nf) 
    1038 { 
    1039         struct ath_common *common = ath9k_hw_common(ah); 
    1040  
    1041         if (*nf > ah->nf_5g_max) { 
    1042                 ath_print(common, ATH_DBG_CALIBRATE, 
    1043                           "5 GHz NF (%d) > MAX (%d), " 
    1044                           "correcting to MAX", 
    1045                           *nf, ah->nf_5g_max); 
    1046                 *nf = ah->nf_5g_max; 
    1047         } else if (*nf < ah->nf_5g_min) { 
    1048                 ath_print(common, ATH_DBG_CALIBRATE, 
    1049                           "5 GHz NF (%d) < MIN (%d), " 
    1050                           "correcting to MIN", 
    1051                           *nf, ah->nf_5g_min); 
    1052                 *nf = ah->nf_5g_min; 
    1053         } 
    1054 } 
    1055  
    1056 static void ar9003_hw_nf_sanitize(struct ath_hw *ah, s16 *nf) 
    1057 { 
    1058         if (IS_CHAN_2GHZ(ah->curchan)) 
    1059                 ar9003_hw_nf_sanitize_2g(ah, nf); 
    1060         else 
    1061                 ar9003_hw_nf_sanitize_5g(ah, nf); 
    1062 } 
    1063  
    10641018static void ar9003_hw_do_getnf(struct ath_hw *ah, 
    10651019                              int16_t nfarray[NUM_NF_READINGS]) 
    10661020{ 
    static void ar9003_hw_do_getnf(struct at 
    10701024        nf = MS(REG_READ(ah, AR_PHY_CCA_0), AR_PHY_MINCCA_PWR); 
    10711025        if (nf & 0x100) 
    10721026                nf = 0 - ((nf ^ 0x1ff) + 1); 
    1073         ar9003_hw_nf_sanitize(ah, &nf); 
    10741027        ath_print(common, ATH_DBG_CALIBRATE, 
    10751028                  "NF calibrated [ctl] [chain 0] is %d\n", nf); 
    10761029        nfarray[0] = nf; 
    static void ar9003_hw_do_getnf(struct at 
    10781031        nf = MS(REG_READ(ah, AR_PHY_CCA_1), AR_PHY_CH1_MINCCA_PWR); 
    10791032        if (nf & 0x100) 
    10801033                nf = 0 - ((nf ^ 0x1ff) + 1); 
    1081         ar9003_hw_nf_sanitize(ah, &nf); 
    10821034        ath_print(common, ATH_DBG_CALIBRATE, 
    10831035                  "NF calibrated [ctl] [chain 1] is %d\n", nf); 
    10841036        nfarray[1] = nf; 
    static void ar9003_hw_do_getnf(struct at 
    10861038        nf = MS(REG_READ(ah, AR_PHY_CCA_2), AR_PHY_CH2_MINCCA_PWR); 
    10871039        if (nf & 0x100) 
    10881040                nf = 0 - ((nf ^ 0x1ff) + 1); 
    1089         ar9003_hw_nf_sanitize(ah, &nf); 
    10901041        ath_print(common, ATH_DBG_CALIBRATE, 
    10911042                  "NF calibrated [ctl] [chain 2] is %d\n", nf); 
    10921043        nfarray[2] = nf; 
    static void ar9003_hw_do_getnf(struct at 
    10941045        nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR); 
    10951046        if (nf & 0x100) 
    10961047                nf = 0 - ((nf ^ 0x1ff) + 1); 
    1097         ar9003_hw_nf_sanitize(ah, &nf); 
    10981048        ath_print(common, ATH_DBG_CALIBRATE, 
    10991049                  "NF calibrated [ext] [chain 0] is %d\n", nf); 
    11001050        nfarray[3] = nf; 
    static void ar9003_hw_do_getnf(struct at 
    11021052        nf = MS(REG_READ(ah, AR_PHY_EXT_CCA_1), AR_PHY_CH1_EXT_MINCCA_PWR); 
    11031053        if (nf & 0x100) 
    11041054                nf = 0 - ((nf ^ 0x1ff) + 1); 
    1105         ar9003_hw_nf_sanitize(ah, &nf); 
    11061055        ath_print(common, ATH_DBG_CALIBRATE, 
    11071056                  "NF calibrated [ext] [chain 1] is %d\n", nf); 
    11081057        nfarray[4] = nf; 
    static void ar9003_hw_do_getnf(struct at 
    11101059        nf = MS(REG_READ(ah, AR_PHY_EXT_CCA_2), AR_PHY_CH2_EXT_MINCCA_PWR); 
    11111060        if (nf & 0x100) 
    11121061                nf = 0 - ((nf ^ 0x1ff) + 1); 
    1113         ar9003_hw_nf_sanitize(ah, &nf); 
    11141062        ath_print(common, ATH_DBG_CALIBRATE, 
    11151063                  "NF calibrated [ext] [chain 2] is %d\n", nf); 
    11161064        nfarray[5] = nf; 
    11171065} 
    11181066 
    1119 void ar9003_hw_set_nf_limits(struct ath_hw *ah) 
     1067static void ar9003_hw_set_nf_limits(struct ath_hw *ah) 
    11201068{ 
    1121         ah->nf_2g_max = AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ; 
    1122         ah->nf_2g_min = AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ; 
    1123         ah->nf_5g_max = AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ; 
    1124         ah->nf_5g_min = AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ; 
     1069        ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ; 
     1070        ah->nf_2g.min = AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ; 
     1071        ah->nf_2g.nominal = AR_PHY_CCA_NOM_VAL_9300_2GHZ; 
     1072        ah->nf_5g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ; 
     1073        ah->nf_5g.min = AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ; 
     1074        ah->nf_5g.nominal = AR_PHY_CCA_NOM_VAL_9300_5GHZ; 
    11251075} 
    11261076 
    11271077/* 
    void ar9003_hw_attach_phy_ops(struct ath 
    13091259        priv_ops->do_getnf = ar9003_hw_do_getnf; 
    13101260        priv_ops->loadnf = ar9003_hw_loadnf; 
    13111261        priv_ops->ani_cache_ini_regs = ar9003_hw_ani_cache_ini_regs; 
     1262 
     1263        ar9003_hw_set_nf_limits(ah); 
    13121264} 
    13131265 
    13141266void ar9003_hw_bb_watchdog_config(struct ath_hw *ah) 
  • drivers/net/wireless/ath/ath9k/calib.c

    a b static void ath9k_hw_update_nfcal_hist_b 
    7474                        h[i].currIndex = 0; 
    7575 
    7676                if (h[i].invalidNFcount > 0) { 
    77                         if (nfarray[i] < AR_PHY_CCA_MIN_BAD_VALUE || 
    78                             nfarray[i] > AR_PHY_CCA_MAX_HIGH_VALUE) { 
    79                                 h[i].invalidNFcount = ATH9K_NF_CAL_HIST_MAX; 
    80                         } else { 
    81                                 h[i].invalidNFcount--; 
    82                                 h[i].privNF = nfarray[i]; 
    83                         } 
     77                        h[i].invalidNFcount--; 
     78                        h[i].privNF = nfarray[i]; 
    8479                } else { 
    8580                        h[i].privNF = 
    8681                                ath9k_hw_get_nf_hist_mid(h[i].nfCalBuffer); 
    void ath9k_hw_start_nfcal(struct ath_hw  
    172167        REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); 
    173168} 
    174169 
     170static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf) 
     171{ 
     172        struct ath_common *common = ath9k_hw_common(ah); 
     173        struct ath_nf_limits *limit; 
     174        int i; 
     175 
     176        if (IS_CHAN_2GHZ(ah->curchan)) 
     177                limit = &ah->nf_2g; 
     178        else 
     179                limit = &ah->nf_5g; 
     180 
     181        for (i = 0; i < NUM_NF_READINGS; i++) { 
     182                if (!nf[i]) 
     183                        continue; 
     184 
     185                if (nf[i] > limit->max) { 
     186                        ath_print(common, ATH_DBG_CALIBRATE, 
     187                                  "NF[%d] (%d) > MAX (%d), correcting to MAX", 
     188                                  i, nf[i], limit->max); 
     189                        nf[i] = limit->max; 
     190                } else if (nf[i] < limit->min) { 
     191                        ath_print(common, ATH_DBG_CALIBRATE, 
     192                                  "NF[%d] (%d) < MIN (%d), correcting to NOM", 
     193                                  i, nf[i], limit->min); 
     194                        nf[i] = limit->nominal; 
     195                } 
     196        } 
     197} 
     198 
    175199int16_t ath9k_hw_getnf(struct ath_hw *ah, 
    176200                       struct ath9k_channel *chan) 
    177201{ 
    int16_t ath9k_hw_getnf(struct ath_hw *ah 
    190214                return chan->rawNoiseFloor; 
    191215        } else { 
    192216                ath9k_hw_do_getnf(ah, nfarray); 
     217                ath9k_hw_nf_sanitize(ah, nfarray); 
    193218                nf = nfarray[0]; 
    194219                if (ath9k_hw_get_nf_thresh(ah, c->band, &nfThresh) 
    195220                    && nf > nfThresh) { 
    int16_t ath9k_hw_getnf(struct ath_hw *ah 
    211236 
    212237void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah) 
    213238{ 
     239        struct ath_nf_limits *limit; 
    214240        int i, j; 
    215         s16 noise_floor; 
    216241 
    217         if (AR_SREV_9280(ah)) 
    218                 noise_floor = AR_PHY_CCA_MAX_AR9280_GOOD_VALUE; 
    219         else if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) 
    220                 noise_floor = AR_PHY_CCA_MAX_AR9285_GOOD_VALUE; 
    221         else if (AR_SREV_9287(ah)) 
    222                 noise_floor = AR_PHY_CCA_MAX_AR9287_GOOD_VALUE; 
     242        if (!ah->curchan || IS_CHAN_2GHZ(ah->curchan)) 
     243                limit = &ah->nf_2g; 
    223244        else 
    224                 noise_floor = AR_PHY_CCA_MAX_AR5416_GOOD_VALUE; 
     245                limit = &ah->nf_5g; 
    225246 
    226247        for (i = 0; i < NUM_NF_READINGS; i++) { 
    227248                ah->nfCalHist[i].currIndex = 0; 
    228                 ah->nfCalHist[i].privNF = noise_floor; 
     249                ah->nfCalHist[i].privNF = limit->nominal; 
    229250                ah->nfCalHist[i].invalidNFcount = 
    230251                        AR_PHY_CCA_FILTERWINDOW_LENGTH; 
    231252                for (j = 0; j < ATH9K_NF_CAL_HIST_MAX; j++) { 
    232                         ah->nfCalHist[i].nfCalBuffer[j] = noise_floor; 
     253                        ah->nfCalHist[i].nfCalBuffer[j] = limit->nominal; 
    233254                } 
    234255        } 
    235256} 
  • drivers/net/wireless/ath/ath9k/calib.h

    a b  
    1919 
    2020#include "hw.h" 
    2121 
    22 #define AR_PHY_CCA_MAX_AR5416_GOOD_VALUE        -85 
    23 #define AR_PHY_CCA_MAX_AR9280_GOOD_VALUE        -112 
    24 #define AR_PHY_CCA_MAX_AR9285_GOOD_VALUE        -118 
    25 #define AR_PHY_CCA_MAX_AR9287_GOOD_VALUE        -118 
    26 #define AR_PHY_CCA_MAX_HIGH_VALUE               -62 
    27 #define AR_PHY_CCA_MIN_BAD_VALUE                -140 
    2822#define AR_PHY_CCA_FILTERWINDOW_LENGTH_INIT     3 
    2923#define AR_PHY_CCA_FILTERWINDOW_LENGTH          5 
    3024 
  • drivers/net/wireless/ath/ath9k/hw.c

    a b static int __ath9k_hw_init(struct ath_hw 
    621621        else 
    622622                ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S); 
    623623 
    624         if (AR_SREV_9300_20_OR_LATER(ah)) 
    625                 ar9003_hw_set_nf_limits(ah); 
    626  
    627624        ath9k_init_nfcal_hist_buffer(ah); 
    628625        ah->bb_watchdog_timeout_ms = 25; 
    629626 
  • drivers/net/wireless/ath/ath9k/hw.h

    a b struct ath_hw_ops { 
    630630        void (*ani_monitor)(struct ath_hw *ah, struct ath9k_channel *chan); 
    631631}; 
    632632 
     633struct ath_nf_limits { 
     634        s16 max; 
     635        s16 min; 
     636        s16 nominal; 
     637}; 
     638 
    633639struct ath_hw { 
    634640        struct ieee80211_hw *hw; 
    635641        struct ath_common common; 
    struct ath_hw { 
    651657        bool is_pciexpress; 
    652658        bool need_an_top2_fixup; 
    653659        u16 tx_trig_level; 
    654         s16 nf_2g_max; 
    655         s16 nf_2g_min; 
    656         s16 nf_5g_max; 
    657         s16 nf_5g_min; 
     660 
     661        struct ath_nf_limits nf_2g; 
     662        struct ath_nf_limits nf_5g; 
    658663        u16 rfsilent; 
    659664        u32 rfkill_gpio; 
    660665        u32 rfkill_polarity; 
    void ar9002_hw_enable_wep_aggregation(st 
    945950 * Code specific to AR9003, we stuff these here to avoid callbacks 
    946951 * for older families 
    947952 */ 
    948 void ar9003_hw_set_nf_limits(struct ath_hw *ah); 
    949953void ar9003_hw_bb_watchdog_config(struct ath_hw *ah); 
    950954void ar9003_hw_bb_watchdog_read(struct ath_hw *ah); 
    951955void ar9003_hw_bb_watchdog_dbg_info(struct ath_hw *ah); 
Note: See TracBrowser for help on using the repository browser.