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 | |