1 #ifndef AR9003_EEPROM_H
2 #define AR9003_EEPROM_H
4 #include <linux/types.h>
6 #define AR9300_EEP_VER 0xD000
7 #define AR9300_EEP_VER_MINOR_MASK 0xFFF
8 #define AR9300_EEP_MINOR_VER_1 0x1
9 #define AR9300_EEP_MINOR_VER AR9300_EEP_MINOR_VER_1
11 /* 16-bit offset location start of calibration struct */
12 #define AR9300_EEP_START_LOC 256
13 #define AR9300_NUM_5G_CAL_PIERS 8
14 #define AR9300_NUM_2G_CAL_PIERS 3
15 #define AR9300_NUM_5G_20_TARGET_POWERS 8
16 #define AR9300_NUM_5G_40_TARGET_POWERS 8
17 #define AR9300_NUM_2G_CCK_TARGET_POWERS 2
18 #define AR9300_NUM_2G_20_TARGET_POWERS 3
19 #define AR9300_NUM_2G_40_TARGET_POWERS 3
20 /* #define AR9300_NUM_CTLS 21 */
21 #define AR9300_NUM_CTLS_5G 9
22 #define AR9300_NUM_CTLS_2G 12
23 #define AR9300_NUM_BAND_EDGES_5G 8
24 #define AR9300_NUM_BAND_EDGES_2G 4
25 #define AR9300_EEPMISC_BIG_ENDIAN 0x01
26 #define AR9300_EEPMISC_WOW 0x02
27 #define AR9300_CUSTOMER_DATA_SIZE 20
29 #define FBIN2FREQ(x, y) ((y) ? (2300 + x) : (4800 + 5 * x))
30 #define AR9300_MAX_CHAINS 3
31 #define AR9300_ANT_16S 25
32 #define AR9300_FUTURE_MODAL_SZ 6
34 /* Delta from which to start power to pdadc table */
35 /* This offset is used in both open loop and closed loop power control
36 * schemes. In open loop power control, it is not really needed, but for
37 * the "sake of consistency" it was kept. For certain AP designs, this
38 * value is overwritten by the value in the flag "pwrTableOffset" just
39 * before writing the pdadc vs pwr into the chip registers.
41 #define AR9300_PWR_TABLE_OFFSET 0
43 /* byte addressable */
44 #define AR9300_EEPROM_SIZE (16*1024)
46 #define AR9300_BASE_ADDR_4K 0xfff
47 #define AR9300_BASE_ADDR 0x3ff
48 #define AR9300_BASE_ADDR_512 0x1ff
50 #define AR9300_OTP_BASE 0x14000
51 #define AR9300_OTP_STATUS 0x15f18
52 #define AR9300_OTP_STATUS_TYPE 0x7
53 #define AR9300_OTP_STATUS_VALID 0x4
54 #define AR9300_OTP_STATUS_ACCESS_BUSY 0x2
55 #define AR9300_OTP_STATUS_SM_BUSY 0x1
56 #define AR9300_OTP_READ_DATA 0x15f1c
58 enum targetPowerHTRates {
59 HT_TARGET_RATE_0_8_16,
60 HT_TARGET_RATE_1_3_9_11_17_19,
75 enum targetPowerLegacyRates {
76 LEGACY_TARGET_RATE_6_24,
77 LEGACY_TARGET_RATE_36,
78 LEGACY_TARGET_RATE_48,
82 enum targetPowerCckRates {
83 LEGACY_TARGET_RATE_1L_5L,
84 LEGACY_TARGET_RATE_5S,
85 LEGACY_TARGET_RATE_11L,
86 LEGACY_TARGET_RATE_11S
90 ALL_TARGET_LEGACY_6_24,
94 ALL_TARGET_LEGACY_1L_5L,
96 ALL_TARGET_LEGACY_11L,
97 ALL_TARGET_LEGACY_11S,
98 ALL_TARGET_HT20_0_8_16,
99 ALL_TARGET_HT20_1_3_9_11_17_19,
112 ALL_TARGET_HT40_0_8_16,
113 ALL_TARGET_HT40_1_3_9_11_17_19,
135 enum CompressAlgorithm {
146 struct ar9300_base_eep_hdr {
148 /* 4 bits tx and 4 bits rx */
150 struct eepFlags opCapFlags;
154 /* takes lower byte in eeprom location */
156 /* offset in dB to be added to beginning
157 * of pdadc table in calibration
159 int8_t pwrTableOffset;
160 u8 params_for_tuning_caps[2];
162 * bit0 - enable tx temp comp
163 * bit1 - enable tx volt comp
164 * bit2 - enable fastClock - default to 1
165 * bit3 - enable doubling - default to 1
166 * bit4 - enable internal regulator - default to 1
169 /* misc flags: bit0 - turn down drivestrength */
170 u8 miscConfiguration;
171 u8 eepromWriteEnableGpio;
176 /* SW controlled internal regulator fields */
180 struct ar9300_modal_eep_header {
181 /* 4 idle, t1, t2, b (4 bits per setting) */
182 __le32 antCtrlCommon;
183 /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
184 __le32 antCtrlCommon2;
185 /* 6 idle, t, r, rx1, rx12, b (2 bits each) */
186 __le16 antCtrlChain[AR9300_MAX_CHAINS];
187 /* 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
188 u8 xatten1DB[AR9300_MAX_CHAINS];
189 /* 3 xatten1_margin for merlin (0xa20c/b20c 16:12 */
190 u8 xatten1Margin[AR9300_MAX_CHAINS];
193 /* spur channels in usual fbin coding format */
194 u8 spurChans[AR_EEPROM_MODAL_SPURS];
195 /* 3 Check if the register is per chain */
196 int8_t noiseFloorThreshCh[AR9300_MAX_CHAINS];
197 u8 ob[AR9300_MAX_CHAINS];
198 u8 db_stage2[AR9300_MAX_CHAINS];
199 u8 db_stage3[AR9300_MAX_CHAINS];
200 u8 db_stage4[AR9300_MAX_CHAINS];
202 u8 txFrameToDataStart;
207 int8_t adcDesiredSize;
212 __le32 papdRateMaskHt20;
213 __le32 papdRateMaskHt40;
217 struct ar9300_cal_data_per_freq_op_loop {
219 /* pdadc voltage at power measurement */
221 /* pcdac used for power measurement */
223 /* range is -60 to -127 create a mapping equation 1db resolution */
224 int8_t rxNoisefloorCal;
225 /*range is same as noisefloor */
226 int8_t rxNoisefloorPower;
227 /* temp measured when noisefloor cal was performed */
231 struct cal_tgt_pow_legacy {
235 struct cal_tgt_pow_ht {
239 struct cal_ctl_data_2g {
240 u8 ctlEdges[AR9300_NUM_BAND_EDGES_2G];
243 struct cal_ctl_data_5g {
244 u8 ctlEdges[AR9300_NUM_BAND_EDGES_5G];
247 struct ar9300_BaseExtension_1 {
252 struct ar9300_BaseExtension_2 {
254 int8_t tempSlopeHigh;
255 u8 xatten1DBLow[AR9300_MAX_CHAINS];
256 u8 xatten1MarginLow[AR9300_MAX_CHAINS];
257 u8 xatten1DBHigh[AR9300_MAX_CHAINS];
258 u8 xatten1MarginHigh[AR9300_MAX_CHAINS];
261 struct ar9300_eeprom {
265 u8 custData[AR9300_CUSTOMER_DATA_SIZE];
267 struct ar9300_base_eep_hdr baseEepHeader;
269 struct ar9300_modal_eep_header modalHeader2G;
270 struct ar9300_BaseExtension_1 base_ext1;
271 u8 calFreqPier2G[AR9300_NUM_2G_CAL_PIERS];
272 struct ar9300_cal_data_per_freq_op_loop
273 calPierData2G[AR9300_MAX_CHAINS][AR9300_NUM_2G_CAL_PIERS];
274 u8 calTarget_freqbin_Cck[AR9300_NUM_2G_CCK_TARGET_POWERS];
275 u8 calTarget_freqbin_2G[AR9300_NUM_2G_20_TARGET_POWERS];
276 u8 calTarget_freqbin_2GHT20[AR9300_NUM_2G_20_TARGET_POWERS];
277 u8 calTarget_freqbin_2GHT40[AR9300_NUM_2G_40_TARGET_POWERS];
278 struct cal_tgt_pow_legacy
279 calTargetPowerCck[AR9300_NUM_2G_CCK_TARGET_POWERS];
280 struct cal_tgt_pow_legacy
281 calTargetPower2G[AR9300_NUM_2G_20_TARGET_POWERS];
282 struct cal_tgt_pow_ht
283 calTargetPower2GHT20[AR9300_NUM_2G_20_TARGET_POWERS];
284 struct cal_tgt_pow_ht
285 calTargetPower2GHT40[AR9300_NUM_2G_40_TARGET_POWERS];
286 u8 ctlIndex_2G[AR9300_NUM_CTLS_2G];
287 u8 ctl_freqbin_2G[AR9300_NUM_CTLS_2G][AR9300_NUM_BAND_EDGES_2G];
288 struct cal_ctl_data_2g ctlPowerData_2G[AR9300_NUM_CTLS_2G];
289 struct ar9300_modal_eep_header modalHeader5G;
290 struct ar9300_BaseExtension_2 base_ext2;
291 u8 calFreqPier5G[AR9300_NUM_5G_CAL_PIERS];
292 struct ar9300_cal_data_per_freq_op_loop
293 calPierData5G[AR9300_MAX_CHAINS][AR9300_NUM_5G_CAL_PIERS];
294 u8 calTarget_freqbin_5G[AR9300_NUM_5G_20_TARGET_POWERS];
295 u8 calTarget_freqbin_5GHT20[AR9300_NUM_5G_20_TARGET_POWERS];
296 u8 calTarget_freqbin_5GHT40[AR9300_NUM_5G_40_TARGET_POWERS];
297 struct cal_tgt_pow_legacy
298 calTargetPower5G[AR9300_NUM_5G_20_TARGET_POWERS];
299 struct cal_tgt_pow_ht
300 calTargetPower5GHT20[AR9300_NUM_5G_20_TARGET_POWERS];
301 struct cal_tgt_pow_ht
302 calTargetPower5GHT40[AR9300_NUM_5G_40_TARGET_POWERS];
303 u8 ctlIndex_5G[AR9300_NUM_CTLS_5G];
304 u8 ctl_freqbin_5G[AR9300_NUM_CTLS_5G][AR9300_NUM_BAND_EDGES_5G];
305 struct cal_ctl_data_5g ctlPowerData_5G[AR9300_NUM_CTLS_5G];
308 s32 ar9003_hw_get_tx_gain_idx(struct ath_hw *ah);
309 s32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah);
311 u8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is_2ghz);