Update ath_hal from FreeBSD.
[dragonfly.git] / sys / dev / netif / ath / hal / ath_hal / ar5416 / ar5416_cal.h
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: head/sys/dev/ath/ath_hal/ar5416/ar5416_cal.h 203882 2010-02-14 16:26:32Z rpaulo $
18  * $DragonFly$
19  */
20 #ifndef _ATH_AR5416_CAL_H_
21 #define _ATH_AR5416_CAL_H_
22  
23 typedef enum {
24         ADC_DC_INIT_CAL = 0x1,
25         ADC_GAIN_CAL    = 0x2,
26         ADC_DC_CAL      = 0x4,
27         IQ_MISMATCH_CAL = 0x8
28 } HAL_CAL_TYPE;
29
30 /* Calibrate state */
31 typedef enum {
32         CAL_INACTIVE,
33         CAL_WAITING,
34         CAL_RUNNING,
35         CAL_DONE
36 } HAL_CAL_STATE;
37
38 typedef union {
39         uint32_t        u;
40         int32_t         s;
41 } HAL_CAL_SAMPLE;
42
43 #define MIN_CAL_SAMPLES     1
44 #define MAX_CAL_SAMPLES    64
45 #define INIT_LOG_COUNT      5
46 #define PER_MIN_LOG_COUNT   2
47 #define PER_MAX_LOG_COUNT  10
48
49 /* Per Calibration data structure */
50 typedef struct per_cal_data {
51         const char      *calName;               /* for diagnostics */
52         HAL_CAL_TYPE    calType;                /* Type of calibration */
53         uint32_t        calNumSamples;          /* # SW samples to collect */
54         uint32_t        calCountMax;            /* # HW samples to collect */
55         void (*calCollect)(struct ath_hal *);   /* Accumulator function */
56                                                 /* Post-processing function */
57         void (*calPostProc)(struct ath_hal *, uint8_t);
58 } HAL_PERCAL_DATA;
59
60 /* List structure for calibration data */
61 typedef struct cal_list {
62         struct cal_list         *calNext;
63         HAL_CAL_STATE           calState;
64         const HAL_PERCAL_DATA   *calData;
65 } HAL_CAL_LIST;
66
67 struct ar5416PerCal {
68         /*
69          * Periodic calibration state.
70          */
71         HAL_CAL_TYPE    suppCals;
72         HAL_CAL_LIST    iqCalData;
73         HAL_CAL_LIST    adcGainCalData;
74         HAL_CAL_LIST    adcDcCalInitData;
75         HAL_CAL_LIST    adcDcCalData;
76         HAL_CAL_LIST    *cal_list;
77         HAL_CAL_LIST    *cal_last;
78         HAL_CAL_LIST    *cal_curr;
79 #define AR5416_MAX_CHAINS               3       /* XXX dup's eeprom def */
80         HAL_CAL_SAMPLE  caldata[4][AR5416_MAX_CHAINS];
81         int             calSamples;
82         /*
83          * Noise floor cal histogram support.
84          * XXX be nice to re-use space in ar5212
85          */
86 #define AR5416_NUM_NF_READINGS          6       /* (3 chains * (ctl + ext) */
87         struct ar5212NfCalHist nfCalHist[AR5416_NUM_NF_READINGS];
88 };
89
90 #define INIT_CAL(_perCal) do {                                          \
91         (_perCal)->calState = CAL_WAITING;                              \
92         (_perCal)->calNext = AH_NULL;                                   \
93 } while (0)
94
95 #define INSERT_CAL(_cal, _perCal) do {                                  \
96         if ((_cal)->cal_last == AH_NULL) {                              \
97                 (_cal)->cal_list = (_cal)->cal_last = (_perCal);        \
98                 ((_cal)->cal_last)->calNext = (_perCal);                \
99         } else {                                                        \
100                 ((_cal)->cal_last)->calNext = (_perCal);                \
101                 (_cal)->cal_last = (_perCal);                           \
102                 (_perCal)->calNext = (_cal)->cal_list;                  \
103         }                                                               \
104 } while (0)
105
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_ */