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