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: releng/12.0/sys/dev/ath/ath_hal/ar5416/ar5416_cal.h 326695 2017-12-08 15:57:29Z pfg $ 20 */ 21#ifndef _ATH_AR5416_CAL_H_ 22#define _ATH_AR5416_CAL_H_ 23 24typedef 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 */ 32typedef enum { 33 CAL_INACTIVE, 34 CAL_WAITING, 35 CAL_RUNNING, 36 CAL_DONE 37} HAL_CAL_STATE; 38 39typedef 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 */ 51typedef 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 */ 62typedef struct cal_list { 63 struct cal_list *calNext; 64 HAL_CAL_STATE calState; 65 const HAL_PERCAL_DATA *calData; 66} HAL_CAL_LIST; 67 68struct 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 107HAL_BOOL ar5416InitCalHardware(struct ath_hal *ah, const struct ieee80211_channel *chan); 108HAL_BOOL ar5416InitCal(struct ath_hal *, const struct ieee80211_channel *); 109HAL_BOOL ar5416PerCalibration(struct ath_hal *, struct ieee80211_channel *, 110 HAL_BOOL *isIQdone); 111HAL_BOOL ar5416PerCalibrationN(struct ath_hal *, struct ieee80211_channel *, 112 u_int chainMask, HAL_BOOL longCal, HAL_BOOL *isCalDone); 113HAL_BOOL ar5416ResetCalValid(struct ath_hal *, 114 const struct ieee80211_channel *); 115 116void ar5416IQCalCollect(struct ath_hal *ah); 117void ar5416IQCalibration(struct ath_hal *ah, uint8_t numChains); 118void ar5416AdcGainCalCollect(struct ath_hal *ah); 119void ar5416AdcGainCalibration(struct ath_hal *ah, uint8_t numChains); 120void ar5416AdcDcCalCollect(struct ath_hal *ah); 121void ar5416AdcDcCalibration(struct ath_hal *ah, uint8_t numChains); 122void ar5416InitNfHistBuff(struct ar5212NfCalHist *h); 123#endif /* _ATH_AR5416_CAL_H_ */ 124