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