1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (c) 2008-2011 Atheros Communications Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission to use, copy, modify, and/or distribute this software for any 5*4882a593Smuzhiyun * purpose with or without fee is hereby granted, provided that the above 6*4882a593Smuzhiyun * copyright notice and this permission notice appear in all copies. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9*4882a593Smuzhiyun * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10*4882a593Smuzhiyun * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11*4882a593Smuzhiyun * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12*4882a593Smuzhiyun * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13*4882a593Smuzhiyun * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14*4882a593Smuzhiyun * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15*4882a593Smuzhiyun */ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #ifndef CALIB_H 18*4882a593Smuzhiyun #define CALIB_H 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include "hw.h" 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #define AR_PHY_CCA_FILTERWINDOW_LENGTH 5 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /* Internal noise floor can vary by about 6db depending on the frequency */ 25*4882a593Smuzhiyun #define ATH9K_NF_CAL_NOISE_THRESH 6 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define NUM_NF_READINGS 6 28*4882a593Smuzhiyun #define ATH9K_NF_CAL_HIST_MAX 5 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun struct ar5416IniArray { 31*4882a593Smuzhiyun u32 *ia_array; 32*4882a593Smuzhiyun u32 ia_rows; 33*4882a593Smuzhiyun u32 ia_columns; 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun #define STATIC_INI_ARRAY(array) { \ 37*4882a593Smuzhiyun .ia_array = (u32 *)(array), \ 38*4882a593Smuzhiyun .ia_rows = ARRAY_SIZE(array), \ 39*4882a593Smuzhiyun .ia_columns = ARRAY_SIZE(array[0]), \ 40*4882a593Smuzhiyun } 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define INIT_INI_ARRAY(iniarray, array) do { \ 43*4882a593Smuzhiyun (iniarray)->ia_array = (u32 *)(array); \ 44*4882a593Smuzhiyun (iniarray)->ia_rows = ARRAY_SIZE(array); \ 45*4882a593Smuzhiyun (iniarray)->ia_columns = ARRAY_SIZE(array[0]); \ 46*4882a593Smuzhiyun } while (0) 47*4882a593Smuzhiyun 48*4882a593Smuzhiyun #define INI_RA(iniarray, row, column) \ 49*4882a593Smuzhiyun (((iniarray)->ia_array)[(row) * ((iniarray)->ia_columns) + (column)]) 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun #define INIT_CAL(_perCal) do { \ 52*4882a593Smuzhiyun (_perCal)->calState = CAL_WAITING; \ 53*4882a593Smuzhiyun (_perCal)->calNext = NULL; \ 54*4882a593Smuzhiyun } while (0) 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun #define INSERT_CAL(_ahp, _perCal) \ 57*4882a593Smuzhiyun do { \ 58*4882a593Smuzhiyun if ((_ahp)->cal_list_last == NULL) { \ 59*4882a593Smuzhiyun (_ahp)->cal_list = \ 60*4882a593Smuzhiyun (_ahp)->cal_list_last = (_perCal); \ 61*4882a593Smuzhiyun ((_ahp)->cal_list_last)->calNext = (_perCal); \ 62*4882a593Smuzhiyun } else { \ 63*4882a593Smuzhiyun ((_ahp)->cal_list_last)->calNext = (_perCal); \ 64*4882a593Smuzhiyun (_ahp)->cal_list_last = (_perCal); \ 65*4882a593Smuzhiyun (_perCal)->calNext = (_ahp)->cal_list; \ 66*4882a593Smuzhiyun } \ 67*4882a593Smuzhiyun } while (0) 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun enum ath9k_cal_state { 70*4882a593Smuzhiyun CAL_INACTIVE, 71*4882a593Smuzhiyun CAL_WAITING, 72*4882a593Smuzhiyun CAL_RUNNING, 73*4882a593Smuzhiyun CAL_DONE 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #define MIN_CAL_SAMPLES 1 77*4882a593Smuzhiyun #define MAX_CAL_SAMPLES 64 78*4882a593Smuzhiyun #define INIT_LOG_COUNT 5 79*4882a593Smuzhiyun #define PER_MIN_LOG_COUNT 2 80*4882a593Smuzhiyun #define PER_MAX_LOG_COUNT 10 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun struct ath9k_percal_data { 83*4882a593Smuzhiyun u32 calType; 84*4882a593Smuzhiyun u32 calNumSamples; 85*4882a593Smuzhiyun u32 calCountMax; 86*4882a593Smuzhiyun void (*calCollect) (struct ath_hw *); 87*4882a593Smuzhiyun void (*calPostProc) (struct ath_hw *, u8); 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun struct ath9k_cal_list { 91*4882a593Smuzhiyun const struct ath9k_percal_data *calData; 92*4882a593Smuzhiyun enum ath9k_cal_state calState; 93*4882a593Smuzhiyun struct ath9k_cal_list *calNext; 94*4882a593Smuzhiyun }; 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun struct ath9k_nfcal_hist { 97*4882a593Smuzhiyun int16_t nfCalBuffer[ATH9K_NF_CAL_HIST_MAX]; 98*4882a593Smuzhiyun u8 currIndex; 99*4882a593Smuzhiyun int16_t privNF; 100*4882a593Smuzhiyun u8 invalidNFcount; 101*4882a593Smuzhiyun }; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #define MAX_PACAL_SKIPCOUNT 8 104*4882a593Smuzhiyun struct ath9k_pacal_info{ 105*4882a593Smuzhiyun int32_t prev_offset; /* Previous value of PA offset value */ 106*4882a593Smuzhiyun int8_t max_skipcount; /* Max No. of times PACAL can be skipped */ 107*4882a593Smuzhiyun int8_t skipcount; /* No. of times the PACAL to be skipped */ 108*4882a593Smuzhiyun }; 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun bool ath9k_hw_reset_calvalid(struct ath_hw *ah); 111*4882a593Smuzhiyun void ath9k_hw_start_nfcal(struct ath_hw *ah, bool update); 112*4882a593Smuzhiyun int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan); 113*4882a593Smuzhiyun bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan); 114*4882a593Smuzhiyun void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah, 115*4882a593Smuzhiyun struct ath9k_channel *chan); 116*4882a593Smuzhiyun void ath9k_hw_bstuck_nfcal(struct ath_hw *ah); 117*4882a593Smuzhiyun void ath9k_hw_reset_calibration(struct ath_hw *ah, 118*4882a593Smuzhiyun struct ath9k_cal_list *currCal); 119*4882a593Smuzhiyun s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan, 120*4882a593Smuzhiyun s16 nf); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #endif /* CALIB_H */ 124