1 /*- 2 * SPDX-License-Identifier: ISC 3 * 4 * Copyright (c) 2002-2009 Sam Leffler, Errno Consulting 5 * Copyright (c) 2002-2008 Atheros Communications, Inc. 6 * 7 * Permission to use, copy, modify, and/or distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 * 19 * $FreeBSD$ 20 */ 21 #ifndef _ATH_AR5416_CAL_H_ 22 #define _ATH_AR5416_CAL_H_ 23 24 typedef enum { 25 ADC_DC_INIT_CAL = 0x1, 26 ADC_GAIN_CAL = 0x2, 27 ADC_DC_CAL = 0x4, 28 IQ_MISMATCH_CAL = 0x8 29 } HAL_CAL_TYPE; 30 31 /* Calibrate state */ 32 typedef enum { 33 CAL_INACTIVE, 34 CAL_WAITING, 35 CAL_RUNNING, 36 CAL_DONE 37 } HAL_CAL_STATE; 38 39 typedef union { 40 uint32_t u; 41 int32_t s; 42 } HAL_CAL_SAMPLE; 43 44 #define MIN_CAL_SAMPLES 1 45 #define MAX_CAL_SAMPLES 64 46 #define INIT_LOG_COUNT 5 47 #define PER_MIN_LOG_COUNT 2 48 #define PER_MAX_LOG_COUNT 10 49 50 /* Per Calibration data structure */ 51 typedef struct per_cal_data { 52 const char *calName; /* for diagnostics */ 53 HAL_CAL_TYPE calType; /* Type of calibration */ 54 uint32_t calNumSamples; /* # SW samples to collect */ 55 uint32_t calCountMax; /* # HW samples to collect */ 56 void (*calCollect)(struct ath_hal *); /* Accumulator function */ 57 /* Post-processing function */ 58 void (*calPostProc)(struct ath_hal *, uint8_t); 59 } HAL_PERCAL_DATA; 60 61 /* List structure for calibration data */ 62 typedef struct cal_list { 63 struct cal_list *calNext; 64 HAL_CAL_STATE calState; 65 const HAL_PERCAL_DATA *calData; 66 } HAL_CAL_LIST; 67 68 struct ar5416PerCal { 69 /* 70 * Periodic calibration state. 71 */ 72 HAL_CAL_TYPE suppCals; 73 HAL_CAL_LIST iqCalData; 74 HAL_CAL_LIST adcGainCalData; 75 HAL_CAL_LIST adcDcCalInitData; 76 HAL_CAL_LIST adcDcCalData; 77 HAL_CAL_LIST *cal_list; 78 HAL_CAL_LIST *cal_last; 79 HAL_CAL_LIST *cal_curr; 80 #define AR5416_MAX_CHAINS 3 /* XXX dup's eeprom def */ 81 HAL_CAL_SAMPLE caldata[4][AR5416_MAX_CHAINS]; 82 int calSamples; 83 /* 84 * Noise floor cal histogram support. 85 * XXX be nice to re-use space in ar5212 86 */ 87 #define AR5416_NUM_NF_READINGS 6 /* (3 chains * (ctl + ext) */ 88 struct ar5212NfCalHist nfCalHist[AR5416_NUM_NF_READINGS]; 89 }; 90 91 #define INIT_CAL(_perCal) do { \ 92 (_perCal)->calState = CAL_WAITING; \ 93 (_perCal)->calNext = AH_NULL; \ 94 } while (0) 95 96 #define INSERT_CAL(_cal, _perCal) do { \ 97 if ((_cal)->cal_last == AH_NULL) { \ 98 (_cal)->cal_list = (_cal)->cal_last = (_perCal); \ 99 ((_cal)->cal_last)->calNext = (_perCal); \ 100 } else { \ 101 ((_cal)->cal_last)->calNext = (_perCal); \ 102 (_cal)->cal_last = (_perCal); \ 103 (_perCal)->calNext = (_cal)->cal_list; \ 104 } \ 105 } while (0) 106 107 HAL_BOOL ar5416InitCalHardware(struct ath_hal *ah, const struct ieee80211_channel *chan); 108 HAL_BOOL ar5416InitCal(struct ath_hal *, const struct ieee80211_channel *); 109 HAL_BOOL ar5416PerCalibration(struct ath_hal *, struct ieee80211_channel *, 110 HAL_BOOL *isIQdone); 111 HAL_BOOL ar5416PerCalibrationN(struct ath_hal *, struct ieee80211_channel *, 112 u_int chainMask, HAL_BOOL longCal, HAL_BOOL *isCalDone); 113 HAL_BOOL ar5416ResetCalValid(struct ath_hal *, 114 const struct ieee80211_channel *); 115 116 void ar5416IQCalCollect(struct ath_hal *ah); 117 void ar5416IQCalibration(struct ath_hal *ah, uint8_t numChains); 118 void ar5416AdcGainCalCollect(struct ath_hal *ah); 119 void ar5416AdcGainCalibration(struct ath_hal *ah, uint8_t numChains); 120 void ar5416AdcDcCalCollect(struct ath_hal *ah); 121 void ar5416AdcDcCalibration(struct ath_hal *ah, uint8_t numChains); 122 void ar5416InitNfHistBuff(struct ar5212NfCalHist *h); 123 #endif /* _ATH_AR5416_CAL_H_ */ 124