1203c4805SLuis R. Rodriguez /* 25b68138eSSujith Manoharan * Copyright (c) 2008-2011 Atheros Communications Inc. 3203c4805SLuis R. Rodriguez * 4203c4805SLuis R. Rodriguez * Permission to use, copy, modify, and/or distribute this software for any 5203c4805SLuis R. Rodriguez * purpose with or without fee is hereby granted, provided that the above 6203c4805SLuis R. Rodriguez * copyright notice and this permission notice appear in all copies. 7203c4805SLuis R. Rodriguez * 8203c4805SLuis R. Rodriguez * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9203c4805SLuis R. Rodriguez * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10203c4805SLuis R. Rodriguez * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11203c4805SLuis R. Rodriguez * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12203c4805SLuis R. Rodriguez * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13203c4805SLuis R. Rodriguez * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14203c4805SLuis R. Rodriguez * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15203c4805SLuis R. Rodriguez */ 16203c4805SLuis R. Rodriguez 17203c4805SLuis R. Rodriguez #ifndef CALIB_H 18203c4805SLuis R. Rodriguez #define CALIB_H 19203c4805SLuis R. Rodriguez 20c46917bbSLuis R. Rodriguez #include "hw.h" 21c46917bbSLuis R. Rodriguez 22203c4805SLuis R. Rodriguez #define AR_PHY_CCA_FILTERWINDOW_LENGTH 5 23203c4805SLuis R. Rodriguez 24b7c0c238SFelix Fietkau /* Internal noise floor can vary by about 6db depending on the frequency */ 25b7c0c238SFelix Fietkau #define ATH9K_NF_CAL_NOISE_THRESH 6 26b7c0c238SFelix Fietkau 27203c4805SLuis R. Rodriguez #define NUM_NF_READINGS 6 28203c4805SLuis R. Rodriguez #define ATH9K_NF_CAL_HIST_MAX 5 29203c4805SLuis R. Rodriguez 30203c4805SLuis R. Rodriguez struct ar5416IniArray { 31203c4805SLuis R. Rodriguez u32 *ia_array; 32203c4805SLuis R. Rodriguez u32 ia_rows; 33203c4805SLuis R. Rodriguez u32 ia_columns; 34203c4805SLuis R. Rodriguez }; 35203c4805SLuis R. Rodriguez 36a043dfb9SFelix Fietkau #define STATIC_INI_ARRAY(array) { \ 37a043dfb9SFelix Fietkau .ia_array = (u32 *)(array), \ 38a043dfb9SFelix Fietkau .ia_rows = ARRAY_SIZE(array), \ 39a043dfb9SFelix Fietkau .ia_columns = ARRAY_SIZE(array[0]), \ 40a043dfb9SFelix Fietkau } 41a043dfb9SFelix Fietkau 42a364517bSFelix Fietkau #define INIT_INI_ARRAY(iniarray, array) do { \ 43203c4805SLuis R. Rodriguez (iniarray)->ia_array = (u32 *)(array); \ 44a364517bSFelix Fietkau (iniarray)->ia_rows = ARRAY_SIZE(array); \ 45a364517bSFelix Fietkau (iniarray)->ia_columns = ARRAY_SIZE(array[0]); \ 46203c4805SLuis R. Rodriguez } while (0) 47203c4805SLuis R. Rodriguez 48203c4805SLuis R. Rodriguez #define INI_RA(iniarray, row, column) \ 49203c4805SLuis R. Rodriguez (((iniarray)->ia_array)[(row) * ((iniarray)->ia_columns) + (column)]) 50203c4805SLuis R. Rodriguez 51203c4805SLuis R. Rodriguez #define INIT_CAL(_perCal) do { \ 52203c4805SLuis R. Rodriguez (_perCal)->calState = CAL_WAITING; \ 53203c4805SLuis R. Rodriguez (_perCal)->calNext = NULL; \ 54203c4805SLuis R. Rodriguez } while (0) 55203c4805SLuis R. Rodriguez 56203c4805SLuis R. Rodriguez #define INSERT_CAL(_ahp, _perCal) \ 57203c4805SLuis R. Rodriguez do { \ 58203c4805SLuis R. Rodriguez if ((_ahp)->cal_list_last == NULL) { \ 59203c4805SLuis R. Rodriguez (_ahp)->cal_list = \ 60203c4805SLuis R. Rodriguez (_ahp)->cal_list_last = (_perCal); \ 61203c4805SLuis R. Rodriguez ((_ahp)->cal_list_last)->calNext = (_perCal); \ 62203c4805SLuis R. Rodriguez } else { \ 63203c4805SLuis R. Rodriguez ((_ahp)->cal_list_last)->calNext = (_perCal); \ 64203c4805SLuis R. Rodriguez (_ahp)->cal_list_last = (_perCal); \ 65203c4805SLuis R. Rodriguez (_perCal)->calNext = (_ahp)->cal_list; \ 66203c4805SLuis R. Rodriguez } \ 67203c4805SLuis R. Rodriguez } while (0) 68203c4805SLuis R. Rodriguez 69cbfe9468SSujith enum ath9k_cal_state { 70203c4805SLuis R. Rodriguez CAL_INACTIVE, 71203c4805SLuis R. Rodriguez CAL_WAITING, 72203c4805SLuis R. Rodriguez CAL_RUNNING, 73203c4805SLuis R. Rodriguez CAL_DONE 74203c4805SLuis R. Rodriguez }; 75203c4805SLuis R. Rodriguez 76203c4805SLuis R. Rodriguez #define MIN_CAL_SAMPLES 1 77203c4805SLuis R. Rodriguez #define MAX_CAL_SAMPLES 64 78203c4805SLuis R. Rodriguez #define INIT_LOG_COUNT 5 79203c4805SLuis R. Rodriguez #define PER_MIN_LOG_COUNT 2 80203c4805SLuis R. Rodriguez #define PER_MAX_LOG_COUNT 10 81203c4805SLuis R. Rodriguez 82cbfe9468SSujith struct ath9k_percal_data { 836497827fSFelix Fietkau u32 calType; 84203c4805SLuis R. Rodriguez u32 calNumSamples; 85203c4805SLuis R. Rodriguez u32 calCountMax; 86203c4805SLuis R. Rodriguez void (*calCollect) (struct ath_hw *); 87203c4805SLuis R. Rodriguez void (*calPostProc) (struct ath_hw *, u8); 88203c4805SLuis R. Rodriguez }; 89203c4805SLuis R. Rodriguez 90cbfe9468SSujith struct ath9k_cal_list { 91cbfe9468SSujith const struct ath9k_percal_data *calData; 92cbfe9468SSujith enum ath9k_cal_state calState; 93cbfe9468SSujith struct ath9k_cal_list *calNext; 94203c4805SLuis R. Rodriguez }; 95203c4805SLuis R. Rodriguez 96203c4805SLuis R. Rodriguez struct ath9k_nfcal_hist { 97203c4805SLuis R. Rodriguez int16_t nfCalBuffer[ATH9K_NF_CAL_HIST_MAX]; 98203c4805SLuis R. Rodriguez u8 currIndex; 99203c4805SLuis R. Rodriguez int16_t privNF; 100203c4805SLuis R. Rodriguez u8 invalidNFcount; 101203c4805SLuis R. Rodriguez }; 102203c4805SLuis R. Rodriguez 103a13883b0SSujith #define MAX_PACAL_SKIPCOUNT 8 104a13883b0SSujith struct ath9k_pacal_info{ 105a13883b0SSujith int32_t prev_offset; /* Previous value of PA offset value */ 106a13883b0SSujith int8_t max_skipcount; /* Max No. of times PACAL can be skipped */ 107a13883b0SSujith int8_t skipcount; /* No. of times the PACAL to be skipped */ 108a13883b0SSujith }; 109a13883b0SSujith 110203c4805SLuis R. Rodriguez bool ath9k_hw_reset_calvalid(struct ath_hw *ah); 11100c86590SFelix Fietkau void ath9k_hw_start_nfcal(struct ath_hw *ah, bool update); 112*7b8aaeadSFelix Fietkau int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan); 1134254bc1cSFelix Fietkau bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan); 11420bd2a09SFelix Fietkau void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, 11520bd2a09SFelix Fietkau struct ath9k_channel *chan); 11670cf1533SFelix Fietkau void ath9k_hw_bstuck_nfcal(struct ath_hw *ah); 117795f5e2cSLuis R. Rodriguez void ath9k_hw_reset_calibration(struct ath_hw *ah, 118795f5e2cSLuis R. Rodriguez struct ath9k_cal_list *currCal); 1195bc225acSLorenzo Bianconi s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan, 1205bc225acSLorenzo Bianconi s16 nf); 121795f5e2cSLuis R. Rodriguez 122203c4805SLuis R. Rodriguez 123203c4805SLuis R. Rodriguez #endif /* CALIB_H */ 124