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
22typedef 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 */
30typedef enum {
31 CAL_INACTIVE,
32 CAL_WAITING,
33 CAL_RUNNING,
34 CAL_DONE
35} HAL_CAL_STATE;
36
37typedef 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 */
49typedef 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 */
60typedef struct cal_list {
61 struct cal_list *calNext;
62 HAL_CAL_STATE calState;
63 const HAL_PERCAL_DATA *calData;
64} HAL_CAL_LIST;
65
66struct 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
105HAL_BOOL ar5416InitCal(struct ath_hal *ah, HAL_CHANNEL *chan);
106HAL_BOOL ar5416PerCalibration(struct ath_hal *, HAL_CHANNEL *,
107 HAL_BOOL *isIQdone);
108HAL_BOOL ar5416PerCalibrationN(struct ath_hal *ah, HAL_CHANNEL *chan,
109 u_int chainMask, HAL_BOOL longCal, HAL_BOOL *isCalDone);
110HAL_BOOL ar5416ResetCalValid(struct ath_hal *ah, HAL_CHANNEL *chan);
111
112void ar5416IQCalCollect(struct ath_hal *ah);
113void ar5416IQCalibration(struct ath_hal *ah, uint8_t numChains);
114void ar5416AdcGainCalCollect(struct ath_hal *ah);
115void ar5416AdcGainCalibration(struct ath_hal *ah, uint8_t numChains);
116void ar5416AdcDcCalCollect(struct ath_hal *ah);
117void ar5416AdcDcCalibration(struct ath_hal *ah, uint8_t numChains);
118void ar5416InitNfHistBuff(struct ar5212NfCalHist *h);
119#endif /* _ATH_AR5416_CAL_H_ */
120