diff options
Diffstat (limited to 'sys/dev/ath/ath_hal/ar5416/ar5416_cal.h')
-rw-r--r-- | sys/dev/ath/ath_hal/ar5416/ar5416_cal.h | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/sys/dev/ath/ath_hal/ar5416/ar5416_cal.h b/sys/dev/ath/ath_hal/ar5416/ar5416_cal.h new file mode 100644 index 000000000000..124002985bf6 --- /dev/null +++ b/sys/dev/ath/ath_hal/ar5416/ar5416_cal.h @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting + * Copyright (c) 2002-2008 Atheros Communications, Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * $Id: ar5416_cal.h,v 1.3 2008/11/11 17:43:23 sam Exp $ + */ +#ifndef _ATH_AR5416_CAL_H_ +#define _ATH_AR5416_CAL_H_ + +typedef enum { + ADC_DC_INIT_CAL = 0x1, + ADC_GAIN_CAL = 0x2, + ADC_DC_CAL = 0x4, + IQ_MISMATCH_CAL = 0x8 +} HAL_CAL_TYPE; + +/* Calibrate state */ +typedef enum { + CAL_INACTIVE, + CAL_WAITING, + CAL_RUNNING, + CAL_DONE +} HAL_CAL_STATE; + +typedef union { + uint32_t u; + int32_t s; +} HAL_CAL_SAMPLE; + +#define MIN_CAL_SAMPLES 1 +#define MAX_CAL_SAMPLES 64 +#define INIT_LOG_COUNT 5 +#define PER_MIN_LOG_COUNT 2 +#define PER_MAX_LOG_COUNT 10 + +/* Per Calibration data structure */ +typedef struct per_cal_data { + const char *calName; /* for diagnostics */ + HAL_CAL_TYPE calType; /* Type of calibration */ + uint32_t calNumSamples; /* # SW samples to collect */ + uint32_t calCountMax; /* # HW samples to collect */ + void (*calCollect)(struct ath_hal *); /* Accumulator function */ + /* Post-processing function */ + void (*calPostProc)(struct ath_hal *, uint8_t); +} HAL_PERCAL_DATA; + +/* List structure for calibration data */ +typedef struct cal_list { + struct cal_list *calNext; + HAL_CAL_STATE calState; + const HAL_PERCAL_DATA *calData; +} HAL_CAL_LIST; + +struct ar5416PerCal { + /* + * Periodic calibration state. + */ + HAL_CAL_TYPE suppCals; + HAL_CAL_LIST iqCalData; + HAL_CAL_LIST adcGainCalData; + HAL_CAL_LIST adcDcCalInitData; + HAL_CAL_LIST adcDcCalData; + HAL_CAL_LIST *cal_list; + HAL_CAL_LIST *cal_last; + HAL_CAL_LIST *cal_curr; +#define AR5416_MAX_CHAINS 3 /* XXX dup's eeprom def */ + HAL_CAL_SAMPLE caldata[4][AR5416_MAX_CHAINS]; + int calSamples; + /* + * Noise floor cal histogram support. + * XXX be nice to re-use space in ar5212 + */ +#define AR5416_NUM_NF_READINGS 6 /* (3 chains * (ctl + ext) */ + struct ar5212NfCalHist nfCalHist[AR5416_NUM_NF_READINGS]; +}; + +#define INIT_CAL(_perCal) do { \ + (_perCal)->calState = CAL_WAITING; \ + (_perCal)->calNext = AH_NULL; \ +} while (0) + +#define INSERT_CAL(_cal, _perCal) do { \ + if ((_cal)->cal_last == AH_NULL) { \ + (_cal)->cal_list = (_cal)->cal_last = (_perCal); \ + ((_cal)->cal_last)->calNext = (_perCal); \ + } else { \ + ((_cal)->cal_last)->calNext = (_perCal); \ + (_cal)->cal_last = (_perCal); \ + (_perCal)->calNext = (_cal)->cal_list; \ + } \ +} while (0) + +HAL_BOOL ar5416InitCal(struct ath_hal *ah, HAL_CHANNEL *chan); +HAL_BOOL ar5416PerCalibration(struct ath_hal *, HAL_CHANNEL *, + HAL_BOOL *isIQdone); +HAL_BOOL ar5416PerCalibrationN(struct ath_hal *ah, HAL_CHANNEL *chan, + u_int chainMask, HAL_BOOL longCal, HAL_BOOL *isCalDone); +HAL_BOOL ar5416ResetCalValid(struct ath_hal *ah, HAL_CHANNEL *chan); + +void ar5416IQCalCollect(struct ath_hal *ah); +void ar5416IQCalibration(struct ath_hal *ah, uint8_t numChains); +void ar5416AdcGainCalCollect(struct ath_hal *ah); +void ar5416AdcGainCalibration(struct ath_hal *ah, uint8_t numChains); +void ar5416AdcDcCalCollect(struct ath_hal *ah); +void ar5416AdcDcCalibration(struct ath_hal *ah, uint8_t numChains); +void ar5416InitNfHistBuff(struct ar5212NfCalHist *h); +#endif /* _ATH_AR5416_CAL_H_ */ |