xref: /dragonfly/sys/dev/netif/ath/ath_hal/ar5416/ar5416_cal.h (revision 572ff6f6e8b95055988f178b6ba12ce77bb5b3c2)
1 /*
2  * Copyright (c) 2002-2009 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  * $FreeBSD$
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  ar5416InitCalHardware(struct ath_hal *ah, const struct ieee80211_channel *chan);
106 HAL_BOOL ar5416InitCal(struct ath_hal *, const struct ieee80211_channel *);
107 HAL_BOOL ar5416PerCalibration(struct ath_hal *,  struct ieee80211_channel *,
108               HAL_BOOL *isIQdone);
109 HAL_BOOL ar5416PerCalibrationN(struct ath_hal *, struct ieee80211_channel *,
110               u_int chainMask, HAL_BOOL longCal, HAL_BOOL *isCalDone);
111 HAL_BOOL ar5416ResetCalValid(struct ath_hal *,
112               const struct ieee80211_channel *);
113 
114 void      ar5416IQCalCollect(struct ath_hal *ah);
115 void      ar5416IQCalibration(struct ath_hal *ah, uint8_t numChains);
116 void      ar5416AdcGainCalCollect(struct ath_hal *ah);
117 void      ar5416AdcGainCalibration(struct ath_hal *ah, uint8_t numChains);
118 void      ar5416AdcDcCalCollect(struct ath_hal *ah);
119 void      ar5416AdcDcCalibration(struct ath_hal *ah, uint8_t numChains);
120 void      ar5416InitNfHistBuff(struct ar5212NfCalHist *h);
121 #endif /* _ATH_AR5416_CAL_H_ */
122