1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
|
/*
* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
* Copyright (c) 2002-2008 Atheros Communications, Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
* $FreeBSD$
*/
#ifndef _ATH_AH_EEPROM_V3_H_
#define _ATH_AH_EEPROM_V3_H_
#include "ah_eeprom.h"
/* EEPROM defines for Version 2 & 3 AR5211 chips */
#define AR_EEPROM_RFSILENT 0x0f /* RF Silent/Clock Run Enable */
#define AR_EEPROM_MAC(i) (0x1d+(i)) /* MAC address word */
#define AR_EEPROM_MAGIC 0x3d /* magic number */
#define AR_EEPROM_PROTECT 0x3f /* EEPROM protect bits */
#define AR_EEPROM_PROTECT_PCIE 0x01 /* EEPROM protect bits for Condor/Swan*/
#define AR_EEPROM_REG_DOMAIN 0xbf /* current regulatory domain */
#define AR_EEPROM_ATHEROS_BASE 0xc0 /* Base of Atheros-specific data */
#define AR_EEPROM_ATHEROS(i) (AR_EEPROM_ATHEROS_BASE+(i))
#define AR_EEPROM_ATHEROS_MAX (0x400-AR_EEPROM_ATHEROS_BASE)
#define AR_EEPROM_VERSION AR_EEPROM_ATHEROS(1)
/* FLASH(EEPROM) Defines for AR531X chips */
#define AR_EEPROM_SIZE_LOWER 0x1b /* size info -- lower */
#define AR_EEPROM_SIZE_UPPER 0x1c /* size info -- upper */
#define AR_EEPROM_SIZE_UPPER_MASK 0xfff0
#define AR_EEPROM_SIZE_UPPER_SHIFT 4
#define AR_EEPROM_SIZE_ENDLOC_SHIFT 12
#define AR_EEPROM_ATHEROS_MAX_LOC 0x400
#define AR_EEPROM_ATHEROS_MAX_OFF (AR_EEPROM_ATHEROS_MAX_LOC-AR_EEPROM_ATHEROS_BASE)
/* regulatory capabilities offsets */
#define AR_EEPROM_REG_CAPABILITIES_OFFSET 0xCA
#define AR_EEPROM_REG_CAPABILITIES_OFFSET_PRE4_0 0xCF /* prior to 4.0 */
/* regulatory capabilities */
#define AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND 0x0040
#define AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN 0x0080
#define AR_EEPROM_EEREGCAP_EN_KK_U2 0x0100
#define AR_EEPROM_EEREGCAP_EN_KK_MIDBAND 0x0200
#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD 0x0400
#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A 0x0800
/* regulatory capabilities prior to eeprom version 4.0 */
#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD_PRE4_0 0x4000
#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A_PRE4_0 0x8000
/*
* AR2413 (includes AR5413)
*/
#define AR_EEPROM_SERIAL_NUM_OFFSET 0xB0 /* EEPROM serial number */
#define AR_EEPROM_SERIAL_NUM_SIZE 12 /* EEPROM serial number size */
#define AR_EEPROM_CAPABILITIES_OFFSET 0xC9 /* EEPROM Location of capabilities */
#define AR_EEPROM_EEPCAP_COMPRESS_DIS 0x0001
#define AR_EEPROM_EEPCAP_AES_DIS 0x0002
#define AR_EEPROM_EEPCAP_FASTFRAME_DIS 0x0004
#define AR_EEPROM_EEPCAP_BURST_DIS 0x0008
#define AR_EEPROM_EEPCAP_MAXQCU 0x01F0
#define AR_EEPROM_EEPCAP_MAXQCU_S 4
#define AR_EEPROM_EEPCAP_HEAVY_CLIP_EN 0x0200
#define AR_EEPROM_EEPCAP_KC_ENTRIES 0xF000
#define AR_EEPROM_EEPCAP_KC_ENTRIES_S 12
/* XXX used to index various EEPROM-derived data structures */
enum {
headerInfo11A = 0,
headerInfo11B = 1,
headerInfo11G = 2,
};
#define GROUPS_OFFSET3_2 0x100 /* groups offset for ver3.2 and earlier */
#define GROUPS_OFFSET3_3 0x150 /* groups offset for ver3.3 */
/* relative offset of GROUPi to GROUPS_OFFSET */
#define GROUP1_OFFSET 0x0
#define GROUP2_OFFSET 0x5
#define GROUP3_OFFSET 0x37
#define GROUP4_OFFSET 0x46
#define GROUP5_OFFSET 0x55
#define GROUP6_OFFSET 0x65
#define GROUP7_OFFSET 0x69
#define GROUP8_OFFSET 0x6f
/* RF silent fields in EEPROM */
#define AR_EEPROM_RFSILENT_GPIO_SEL 0x001c
#define AR_EEPROM_RFSILENT_GPIO_SEL_S 2
#define AR_EEPROM_RFSILENT_POLARITY 0x0002
#define AR_EEPROM_RFSILENT_POLARITY_S 1
/* Protect Bits RP is read protect, WP is write protect */
#define AR_EEPROM_PROTECT_RP_0_31 0x0001
#define AR_EEPROM_PROTECT_WP_0_31 0x0002
#define AR_EEPROM_PROTECT_RP_32_63 0x0004
#define AR_EEPROM_PROTECT_WP_32_63 0x0008
#define AR_EEPROM_PROTECT_RP_64_127 0x0010
#define AR_EEPROM_PROTECT_WP_64_127 0x0020
#define AR_EEPROM_PROTECT_RP_128_191 0x0040
#define AR_EEPROM_PROTECT_WP_128_191 0x0080
#define AR_EEPROM_PROTECT_RP_192_207 0x0100
#define AR_EEPROM_PROTECT_WP_192_207 0x0200
#define AR_EEPROM_PROTECT_RP_208_223 0x0400
#define AR_EEPROM_PROTECT_WP_208_223 0x0800
#define AR_EEPROM_PROTECT_RP_224_239 0x1000
#define AR_EEPROM_PROTECT_WP_224_239 0x2000
#define AR_EEPROM_PROTECT_RP_240_255 0x4000
#define AR_EEPROM_PROTECT_WP_240_255 0x8000
#define AR_EEPROM_MODAL_SPURS 5
#define AR_SPUR_5413_1 1640 /* Freq 2464 */
#define AR_SPUR_5413_2 1200 /* Freq 2420 */
/*
* EEPROM fixed point conversion scale factors.
* NB: if you change one be sure to keep the other in sync.
*/
#define EEP_SCALE 100 /* conversion scale to avoid fp arith */
#define EEP_DELTA 10 /* SCALE/10, to avoid arith divide */
#define PWR_MIN 0
#define PWR_MAX 3150 /* 31.5 * SCALE */
#define PWR_STEP 50 /* 0.5 * SCALE */
/* Keep 2 above defines together */
#define NUM_11A_EEPROM_CHANNELS 10
#define NUM_2_4_EEPROM_CHANNELS 3
#define NUM_PCDAC_VALUES 11
#define NUM_TEST_FREQUENCIES 8
#define NUM_EDGES 8
#define NUM_INTERCEPTS 11
#define FREQ_MASK 0x7f
#define FREQ_MASK_3_3 0xff /* expanded in version 3.3 */
#define PCDAC_MASK 0x3f
#define POWER_MASK 0x3f
#define NON_EDGE_FLAG_MASK 0x40
#define CHANNEL_POWER_INFO 8
#define OBDB_UNSET 0xffff
#define CHANNEL_UNUSED 0xff
#define SCALE_OC_DELTA(_x) (((_x) * 2) / 10)
/* Used during pcdac table construction */
#define PCDAC_START 1
#define PCDAC_STOP 63
#define PCDAC_STEP 1
#define PWR_TABLE_SIZE 64
#define MAX_RATE_POWER 63
/* Used during power/rate table construction */
#define NUM_CTLS 16
#define NUM_CTLS_3_3 32 /* expanded in version 3.3 */
#define NUM_CTLS_MAX NUM_CTLS_3_3
typedef struct fullPcdacStruct {
uint16_t channelValue;
uint16_t pcdacMin;
uint16_t pcdacMax;
uint16_t numPcdacValues;
uint16_t PcdacValues[64];
/* power is 32bit since in dest it is scaled */
int16_t PwrValues[64];
} FULL_PCDAC_STRUCT;
typedef struct dataPerChannel {
uint16_t channelValue;
uint16_t pcdacMin;
uint16_t pcdacMax;
uint16_t numPcdacValues;
uint16_t PcdacValues[NUM_PCDAC_VALUES];
/* NB: power is 32bit since in dest it is scaled */
int16_t PwrValues[NUM_PCDAC_VALUES];
} DATA_PER_CHANNEL;
/* points to the appropriate pcdac structs in the above struct based on mode */
typedef struct pcdacsEeprom {
const uint16_t *pChannelList;
uint16_t numChannels;
const DATA_PER_CHANNEL *pDataPerChannel;
} PCDACS_EEPROM;
typedef struct trgtPowerInfo {
uint16_t twicePwr54;
uint16_t twicePwr48;
uint16_t twicePwr36;
uint16_t twicePwr6_24;
uint16_t testChannel;
} TRGT_POWER_INFO;
typedef struct trgtPowerAllModes {
uint16_t numTargetPwr_11a;
TRGT_POWER_INFO trgtPwr_11a[NUM_TEST_FREQUENCIES];
uint16_t numTargetPwr_11g;
TRGT_POWER_INFO trgtPwr_11g[3];
uint16_t numTargetPwr_11b;
TRGT_POWER_INFO trgtPwr_11b[2];
} TRGT_POWER_ALL_MODES;
typedef struct cornerCalInfo {
uint16_t gSel;
uint16_t pd84;
uint16_t pd90;
uint16_t clip;
} CORNER_CAL_INFO;
/*
* EEPROM version 4 definitions
*/
#define NUM_XPD_PER_CHANNEL 4
#define NUM_POINTS_XPD0 4
#define NUM_POINTS_XPD3 3
#define IDEAL_10dB_INTERCEPT_2G 35
#define IDEAL_10dB_INTERCEPT_5G 55
#define TENX_OFDM_CCK_DELTA_INIT 15 /* power 1.5 dbm */
#define TENX_CH14_FILTER_CCK_DELTA_INIT 15 /* power 1.5 dbm */
#define CCK_OFDM_GAIN_DELTA 15
#define NUM_TARGET_POWER_LOCATIONS_11B 4
#define NUM_TARGET_POWER_LOCATIONS_11G 6
typedef struct {
uint16_t xpd_gain;
uint16_t numPcdacs;
uint16_t pcdac[NUM_POINTS_XPD0];
int16_t pwr_t4[NUM_POINTS_XPD0]; /* or gainF */
} EXPN_DATA_PER_XPD_5112;
typedef struct {
uint16_t channelValue;
int16_t maxPower_t4;
EXPN_DATA_PER_XPD_5112 pDataPerXPD[NUM_XPD_PER_CHANNEL];
} EXPN_DATA_PER_CHANNEL_5112;
typedef struct {
uint16_t *pChannels;
uint16_t numChannels;
uint16_t xpdMask; /* mask of permitted xpd_gains */
EXPN_DATA_PER_CHANNEL_5112 *pDataPerChannel;
} EEPROM_POWER_EXPN_5112;
typedef struct {
uint16_t channelValue;
uint16_t pcd1_xg0;
int16_t pwr1_xg0;
uint16_t pcd2_delta_xg0;
int16_t pwr2_xg0;
uint16_t pcd3_delta_xg0;
int16_t pwr3_xg0;
uint16_t pcd4_delta_xg0;
int16_t pwr4_xg0;
int16_t maxPower_t4;
int16_t pwr1_xg3; /* pcdac = 20 */
int16_t pwr2_xg3; /* pcdac = 35 */
int16_t pwr3_xg3; /* pcdac = 63 */
/* XXX - Should be pwr1_xg2, etc to agree with documentation */
} EEPROM_DATA_PER_CHANNEL_5112;
typedef struct {
uint16_t pChannels[NUM_11A_EEPROM_CHANNELS];
uint16_t numChannels;
uint16_t xpdMask; /* mask of permitted xpd_gains */
EEPROM_DATA_PER_CHANNEL_5112 pDataPerChannel[NUM_11A_EEPROM_CHANNELS];
} EEPROM_POWER_5112;
/*
* EEPROM version 5 definitions (Griffin, et. al.).
*/
#define NUM_2_4_EEPROM_CHANNELS_2413 4
#define NUM_11A_EEPROM_CHANNELS_2413 10
#define PWR_TABLE_SIZE_2413 128
/* Used during pdadc construction */
#define MAX_NUM_PDGAINS_PER_CHANNEL 4
#define NUM_PDGAINS_PER_CHANNEL 2
#define NUM_POINTS_LAST_PDGAIN 5
#define NUM_POINTS_OTHER_PDGAINS 4
#define XPD_GAIN1_GEN5 3
#define XPD_GAIN2_GEN5 1
#define MAX_PWR_RANGE_IN_HALF_DB 64
#define PD_GAIN_BOUNDARY_STRETCH_IN_HALF_DB 4
typedef struct {
uint16_t pd_gain;
uint16_t numVpd;
uint16_t Vpd[NUM_POINTS_LAST_PDGAIN];
int16_t pwr_t4[NUM_POINTS_LAST_PDGAIN]; /* or gainF */
} RAW_DATA_PER_PDGAIN_2413;
typedef struct {
uint16_t channelValue;
int16_t maxPower_t4;
uint16_t numPdGains; /* # Pd Gains per channel */
RAW_DATA_PER_PDGAIN_2413 pDataPerPDGain[MAX_NUM_PDGAINS_PER_CHANNEL];
} RAW_DATA_PER_CHANNEL_2413;
/* XXX: assumes NUM_11A_EEPROM_CHANNELS_2413 >= NUM_2_4_EEPROM_CHANNELS_2413 ??? */
typedef struct {
uint16_t pChannels[NUM_11A_EEPROM_CHANNELS_2413];
uint16_t numChannels;
uint16_t xpd_mask; /* mask of permitted xpd_gains */
RAW_DATA_PER_CHANNEL_2413 pDataPerChannel[NUM_11A_EEPROM_CHANNELS_2413];
} RAW_DATA_STRUCT_2413;
typedef struct {
uint16_t channelValue;
uint16_t numPdGains;
uint16_t Vpd_I[MAX_NUM_PDGAINS_PER_CHANNEL];
int16_t pwr_I[MAX_NUM_PDGAINS_PER_CHANNEL];
uint16_t Vpd_delta[NUM_POINTS_LAST_PDGAIN]
[MAX_NUM_PDGAINS_PER_CHANNEL];
int16_t pwr_delta_t2[NUM_POINTS_LAST_PDGAIN]
[MAX_NUM_PDGAINS_PER_CHANNEL];
int16_t maxPower_t4;
} EEPROM_DATA_PER_CHANNEL_2413;
typedef struct {
uint16_t pChannels[NUM_11A_EEPROM_CHANNELS_2413];
uint16_t numChannels;
uint16_t xpd_mask; /* mask of permitted xpd_gains */
EEPROM_DATA_PER_CHANNEL_2413 pDataPerChannel[NUM_11A_EEPROM_CHANNELS_2413];
} EEPROM_DATA_STRUCT_2413;
/*
* Information retrieved from EEPROM.
*/
typedef struct {
uint16_t ee_version; /* Version field */
uint16_t ee_protect; /* EEPROM protect field */
uint16_t ee_regdomain; /* Regulatory domain */
/* General Device Parameters */
uint16_t ee_turbo5Disable;
uint16_t ee_turbo2Disable;
uint16_t ee_rfKill;
uint16_t ee_deviceType;
uint16_t ee_turbo2WMaxPower5;
uint16_t ee_turbo2WMaxPower2;
uint16_t ee_xrTargetPower5;
uint16_t ee_xrTargetPower2;
uint16_t ee_Amode;
uint16_t ee_regCap;
uint16_t ee_Bmode;
uint16_t ee_Gmode;
int8_t ee_antennaGainMax[2];
uint16_t ee_xtnd5GSupport;
uint8_t ee_cckOfdmPwrDelta;
uint8_t ee_exist32kHzCrystal;
uint16_t ee_targetPowersStart;
uint16_t ee_fixedBias5;
uint16_t ee_fixedBias2;
uint16_t ee_cckOfdmGainDelta;
uint16_t ee_scaledCh14FilterCckDelta;
uint16_t ee_eepMap;
uint16_t ee_earStart;
/* 5 GHz / 2.4 GHz CKK / 2.4 GHz OFDM common parameters */
uint16_t ee_switchSettling[3];
uint16_t ee_txrxAtten[3];
uint16_t ee_txEndToXLNAOn[3];
uint16_t ee_thresh62[3];
uint16_t ee_txEndToXPAOff[3];
uint16_t ee_txFrameToXPAOn[3];
int8_t ee_adcDesiredSize[3]; /* 8-bit signed value */
int8_t ee_pgaDesiredSize[3]; /* 8-bit signed value */
int16_t ee_noiseFloorThresh[3];
uint16_t ee_xlnaGain[3];
uint16_t ee_xgain[3];
uint16_t ee_xpd[3];
uint16_t ee_antennaControl[11][3];
uint16_t ee_falseDetectBackoff[3];
uint16_t ee_gainI[3];
uint16_t ee_rxtxMargin[3];
/* new parameters added for the AR2413 */
HAL_BOOL ee_disableXr5;
HAL_BOOL ee_disableXr2;
uint16_t ee_eepMap2PowerCalStart;
uint16_t ee_capField;
uint16_t ee_switchSettlingTurbo[2];
uint16_t ee_txrxAttenTurbo[2];
int8_t ee_adcDesiredSizeTurbo[2];
int8_t ee_pgaDesiredSizeTurbo[2];
uint16_t ee_rxtxMarginTurbo[2];
/* 5 GHz parameters */
uint16_t ee_ob1;
uint16_t ee_db1;
uint16_t ee_ob2;
uint16_t ee_db2;
uint16_t ee_ob3;
uint16_t ee_db3;
uint16_t ee_ob4;
uint16_t ee_db4;
/* 2.4 GHz parameters */
uint16_t ee_obFor24;
uint16_t ee_dbFor24;
uint16_t ee_obFor24g;
uint16_t ee_dbFor24g;
uint16_t ee_ob2GHz[2];
uint16_t ee_db2GHz[2];
uint16_t ee_numCtls;
uint16_t ee_ctl[NUM_CTLS_MAX];
uint16_t ee_iqCalI[2];
uint16_t ee_iqCalQ[2];
uint16_t ee_calPier11g[NUM_2_4_EEPROM_CHANNELS];
uint16_t ee_calPier11b[NUM_2_4_EEPROM_CHANNELS];
/* corner calibration information */
CORNER_CAL_INFO ee_cornerCal;
uint16_t ee_opCap;
/* 11a info */
uint16_t ee_channels11a[NUM_11A_EEPROM_CHANNELS];
uint16_t ee_numChannels11a;
DATA_PER_CHANNEL ee_dataPerChannel11a[NUM_11A_EEPROM_CHANNELS];
uint16_t ee_numChannels2_4;
uint16_t ee_channels11g[NUM_2_4_EEPROM_CHANNELS];
uint16_t ee_channels11b[NUM_2_4_EEPROM_CHANNELS];
uint16_t ee_spurChans[AR_EEPROM_MODAL_SPURS][2];
/* 11g info */
DATA_PER_CHANNEL ee_dataPerChannel11g[NUM_2_4_EEPROM_CHANNELS];
/* 11b info */
DATA_PER_CHANNEL ee_dataPerChannel11b[NUM_2_4_EEPROM_CHANNELS];
TRGT_POWER_ALL_MODES ee_tpow;
RD_EDGES_POWER ee_rdEdgesPower[NUM_EDGES*NUM_CTLS_MAX];
union {
EEPROM_POWER_EXPN_5112 eu_modePowerArray5112[3];
RAW_DATA_STRUCT_2413 eu_rawDataset2413[3];
} ee_u;
} HAL_EEPROM;
/* write-around defines */
#define ee_numTargetPwr_11a ee_tpow.numTargetPwr_11a
#define ee_trgtPwr_11a ee_tpow.trgtPwr_11a
#define ee_numTargetPwr_11g ee_tpow.numTargetPwr_11g
#define ee_trgtPwr_11g ee_tpow.trgtPwr_11g
#define ee_numTargetPwr_11b ee_tpow.numTargetPwr_11b
#define ee_trgtPwr_11b ee_tpow.trgtPwr_11b
#define ee_modePowerArray5112 ee_u.eu_modePowerArray5112
#define ee_rawDataset2413 ee_u.eu_rawDataset2413
#endif /* _ATH_AH_EEPROM_V3_H_ */
|