1 /*        $NetBSD: arn9287reg.h,v 1.1 2013/03/30 02:53:02 christos Exp $        */
2 /*        $OpenBSD: ar9287reg.h,v 1.3 2010/07/15 19:07:43 damien Exp $          */
3 
4 /*-
5  * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
6  * Copyright (c) 2008-2009 Atheros Communications Inc.
7  *
8  * Permission to use, copy, modify, and/or distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 #ifndef _ARN9287REG_H_
22 #define _ARN9287REG_H_
23 
24 #define AR9287_MAX_CHAINS     2
25 
26 #define AR9287_PHY_CCA_MAX_GOOD_VALUE   (-118)
27 
28 /*
29  * Analog registers.
30  */
31 #define AR9287_AN_RF2G3_CH0             0x7808
32 #define AR9287_AN_RF2G3_CH1             0x785c
33 #define AR9287_AN_TXPC0                           0x7898
34 #define AR9287_AN_TOP2                            0x78b4
35 
36 /* Bits for AR9287_AN_RF2G3_CH[01]. */
37 #define AR9287_AN_RF2G3_OB_PAL_OFF_M    0x0001c000
38 #define AR9287_AN_RF2G3_OB_PAL_OFF_S    14
39 #define AR9287_AN_RF2G3_OB_QAM_M        0x000e0000
40 #define AR9287_AN_RF2G3_OB_QAM_S        17
41 #define AR9287_AN_RF2G3_OB_PSK_M        0x00700000
42 #define AR9287_AN_RF2G3_OB_PSK_S        20
43 #define AR9287_AN_RF2G3_OB_CCK_M        0x03800000
44 #define AR9287_AN_RF2G3_OB_CCK_S        23
45 #define AR9287_AN_RF2G3_DB2_M           0x1c000000
46 #define AR9287_AN_RF2G3_DB2_S           26
47 #define AR9287_AN_RF2G3_DB1_M           0xe0000000
48 #define AR9287_AN_RF2G3_DB1_S           29
49 
50 /* Bits for AR9287_AN_TXPC0. */
51 #define AR9287_AN_TXPC0_TXPCMODE_M                0x0000c000
52 #define AR9287_AN_TXPC0_TXPCMODE_S                14
53 #define AR9287_AN_TXPC0_TXPCMODE_NORMAL           0
54 #define AR9287_AN_TXPC0_TXPCMODE_TEST             1
55 #define AR9287_AN_TXPC0_TXPCMODE_TEMPSENSE        2
56 #define AR9287_AN_TXPC0_TXPCMODE_ATBTEST          3
57 
58 /* Bits for AR9287_AN_TOP2. */
59 #define AR9287_AN_TOP2_XPABIAS_LVL_M    0xc0000000
60 #define AR9287_AN_TOP2_XPABIAS_LVL_S    30
61 
62 /*
63  * ROM layout used by AR9287 (2GHz only).
64  */
65 #define AR9287_EEP_START_LOC            128
66 #define AR9287_NUM_2G_CAL_PIERS                   3
67 #define AR9287_NUM_2G_CCK_TARGET_POWERS 3
68 #define AR9287_NUM_2G_20_TARGET_POWERS  3
69 #define AR9287_NUM_2G_40_TARGET_POWERS  3
70 #define AR9287_NUM_CTLS                           12
71 #define AR9287_NUM_BAND_EDGES           4
72 #define AR9287_NUM_PD_GAINS             4
73 #define AR9287_PD_GAINS_IN_MASK         4
74 #define AR9287_PD_GAIN_ICEPTS           1
75 #define AR9287_MAX_RATE_POWER           63
76 #define AR9287_NUM_RATES                16
77 
78 struct ar9287_base_eep_header {
79           uint16_t  length;
80           uint16_t  checksum;
81           uint16_t  version;
82           uint8_t             opCapFlags;
83           uint8_t             eepMisc;
84 #define AR9287_EEPMISC_BIG_ENDIAN       0x01
85 #define AR9287_EEPMISC_WOW              0x02
86 
87           uint16_t  regDmn[2];
88           uint8_t             macAddr[6];
89           uint8_t             rxMask;
90           uint8_t             txMask;
91           uint16_t  rfSilent;
92           uint16_t  blueToothOptions;
93           uint16_t  deviceCap;
94           uint32_t  binBuildNumber;
95           uint8_t             deviceType;
96           /* End of common header. */
97           uint8_t             openLoopPwrCntl;
98           int8_t              pwrTableOffset;
99           int8_t              tempSensSlope;
100           int8_t              tempSensSlopePalOn;
101           uint8_t             futureBase[29];
102 } __packed;
103 
104 struct ar9287_modal_eep_header {
105           uint32_t  antCtrlChain[AR9287_MAX_CHAINS];
106           uint32_t  antCtrlCommon;
107           int8_t              antennaGainCh[AR9287_MAX_CHAINS];
108           uint8_t             switchSettling;
109           uint8_t             txRxAttenCh[AR9287_MAX_CHAINS];
110           uint8_t             rxTxMarginCh[AR9287_MAX_CHAINS];
111           int8_t              adcDesiredSize;
112           uint8_t             txEndToXpaOff;
113           uint8_t             txEndToRxOn;
114           uint8_t             txFrameToXpaOn;
115           uint8_t             thresh62;
116           int8_t              noiseFloorThreshCh[AR9287_MAX_CHAINS];
117           uint8_t             xpdGain;
118           uint8_t             xpd;
119           int8_t              iqCalICh[AR9287_MAX_CHAINS];
120           int8_t              iqCalQCh[AR9287_MAX_CHAINS];
121           uint8_t             pdGainOverlap;
122           uint8_t             xpaBiasLvl;
123           uint8_t             txFrameToDataStart;
124           uint8_t             txFrameToPaOn;
125           uint8_t             ht40PowerIncForPdadc;
126           uint8_t             bswAtten[AR9287_MAX_CHAINS];
127           uint8_t             bswMargin[AR9287_MAX_CHAINS];
128           uint8_t             swSettleHt40;
129           uint8_t             version;
130           uint8_t             db1;
131           uint8_t             db2;
132           uint8_t             ob_cck;
133           uint8_t             ob_psk;
134           uint8_t             ob_qam;
135           uint8_t             ob_pal_off;
136           uint8_t             futureModal[30];
137           struct              ar_spur_chan spurChans[AR_EEPROM_MODAL_SPURS];
138 } __packed;
139 
140 struct ar9287_cal_data_per_freq {
141           uint8_t   pwrPdg[AR9287_NUM_PD_GAINS][AR9287_PD_GAIN_ICEPTS];
142           uint8_t   vpdPdg[AR9287_NUM_PD_GAINS][AR9287_PD_GAIN_ICEPTS];
143 } __packed;
144 
145 union ar9287_cal_data_per_freq_u {
146           struct ar_cal_data_per_freq_olpc        calDataOpen;
147           struct ar9287_cal_data_per_freq                   calDataClose;
148 } __packed;
149 
150 struct ar9287_cal_ctl_data {
151           struct ar_cal_ctl_edges
152               ctlEdges[AR9287_MAX_CHAINS][AR9287_NUM_BAND_EDGES];
153 } __packed;
154 
155 struct ar9287_eeprom {
156           struct    ar9287_base_eep_header baseEepHeader;
157           uint8_t custData[32];
158           struct    ar9287_modal_eep_header modalHeader;
159           uint8_t   calFreqPier2G[AR9287_NUM_2G_CAL_PIERS];
160           union     ar9287_cal_data_per_freq_u
161               calPierData2G[AR9287_MAX_CHAINS][AR9287_NUM_2G_CAL_PIERS];
162           struct    ar_cal_target_power_leg
163               calTargetPowerCck[AR9287_NUM_2G_CCK_TARGET_POWERS];
164           struct    ar_cal_target_power_leg
165               calTargetPower2G[AR9287_NUM_2G_20_TARGET_POWERS];
166           struct    ar_cal_target_power_ht
167               calTargetPower2GHT20[AR9287_NUM_2G_20_TARGET_POWERS];
168           struct    ar_cal_target_power_ht
169               calTargetPower2GHT40[AR9287_NUM_2G_40_TARGET_POWERS];
170           uint8_t   ctlIndex[AR9287_NUM_CTLS];
171           struct    ar9287_cal_ctl_data ctlData[AR9287_NUM_CTLS];
172           uint8_t   padding;
173 } __packed;
174 
175 /* Macro to "pack" registers to 16-bit to save some .rodata space. */
176 #define P(x)        (x)
177 
178 /*
179  * AR9287 1.1 initialization values.
180  */
181 static const uint16_t ar9287_1_1_regs[] = {
182           P(0x01030), P(0x01070), P(0x010b0), P(0x010f0), P(0x08014),
183           P(0x0801c), P(0x08120), P(0x081d0), P(0x08318), P(0x09804),
184           P(0x09820), P(0x09824), P(0x09828), P(0x09834), P(0x09838),
185           P(0x09840), P(0x09844), P(0x09850), P(0x09858), P(0x0985c),
186           P(0x09860), P(0x09864), P(0x09868), P(0x0986c), P(0x09914),
187           P(0x09918), P(0x09924), P(0x09944), P(0x09960), P(0x0a960),
188           P(0x09964), P(0x0c968), P(0x099b8), P(0x099bc), P(0x099c0),
189           P(0x0a204), P(0x0a20c), P(0x0b20c), P(0x0a21c), P(0x0a230),
190           P(0x0a250), P(0x0a358), P(0x0a3d8)
191 };
192 
193 #ifndef IEEE80211_NO_HT
194 static const uint32_t ar9287_1_1_vals_2g40[] = {
195           0x000002c0, 0x00000318, 0x00007c70, 0x00000000, 0x10801600,
196           0x12e00057, 0x08f04810, 0x0000320a, 0x00006880, 0x000003c4,
197           0x02020200, 0x01000e0e, 0x3a020001, 0x00000e0e, 0x00000007,
198           0x206a012e, 0x037216a0, 0x6d4000e2, 0x7ec84d2e, 0x3139605e,
199           0x00058d20, 0x0001ce00, 0x5ac640d0, 0x06903881, 0x00001130,
200           0x00000016, 0xd00a8a0d, 0xefbc1010, 0x00000010, 0x00000010,
201           0x00000210, 0x000003ce, 0x0000001c, 0x00000c00, 0x05eea6d4,
202           0x00000444, 0x00000000, 0x00000000, 0x1883800a, 0x00000210,
203           0x0004a000, 0x7999aa0e, 0x00000000
204 };
205 #endif
206 
207 static const uint32_t ar9287_1_1_vals_2g20[] = {
208           0x00000160, 0x0000018c, 0x00003e38, 0x00000000, 0x08400b00,
209           0x12e0002b, 0x08f04810, 0x0000320a, 0x00003440, 0x00000300,
210           0x02020200, 0x01000e0e, 0x3a020001, 0x00000e0e, 0x00000007,
211           0x206a012e, 0x037216a0, 0x6c4000e2, 0x7ec84d2e, 0x31395d5e,
212           0x00058d20, 0x0001ce00, 0x5ac640d0, 0x06903881, 0x00000898,
213           0x0000000b, 0xd00a8a0d, 0xefbc1010, 0x00000010, 0x00000010,
214           0x00000210, 0x000003ce, 0x0000001c, 0x00000c00, 0x05eea6d4,
215           0x00000444, 0x00000000, 0x00000000, 0x1883800a, 0x00000108,
216           0x0004a000, 0x7999aa0e, 0x00000000
217 };
218 
219 static const uint16_t ar9287_1_1_cm_regs[] = {
220           P(0x0000c), P(0x00030), P(0x00034), P(0x00040), P(0x00044),
221           P(0x00048), P(0x0004c), P(0x00050), P(0x00054), P(0x00800),
222           P(0x00804), P(0x00808), P(0x0080c), P(0x00810), P(0x00814),
223           P(0x00818), P(0x0081c), P(0x00820), P(0x00824), P(0x01040),
224           P(0x01044), P(0x01048), P(0x0104c), P(0x01050), P(0x01054),
225           P(0x01058), P(0x0105c), P(0x01060), P(0x01064), P(0x01230),
226           P(0x01270), P(0x01038), P(0x01078), P(0x010b8), P(0x010f8),
227           P(0x01138), P(0x01178), P(0x011b8), P(0x011f8), P(0x01238),
228           P(0x01278), P(0x012b8), P(0x012f8), P(0x01338), P(0x01378),
229           P(0x013b8), P(0x013f8), P(0x01438), P(0x01478), P(0x014b8),
230           P(0x014f8), P(0x01538), P(0x01578), P(0x015b8), P(0x015f8),
231           P(0x01638), P(0x01678), P(0x016b8), P(0x016f8), P(0x01738),
232           P(0x01778), P(0x017b8), P(0x017f8), P(0x0103c), P(0x0107c),
233           P(0x010bc), P(0x010fc), P(0x0113c), P(0x0117c), P(0x011bc),
234           P(0x011fc), P(0x0123c), P(0x0127c), P(0x012bc), P(0x012fc),
235           P(0x0133c), P(0x0137c), P(0x013bc), P(0x013fc), P(0x0143c),
236           P(0x0147c), P(0x04030), P(0x0403c), P(0x04024), P(0x04060),
237           P(0x04064), P(0x07010), P(0x07020), P(0x07034), P(0x07038),
238           P(0x08004), P(0x08008), P(0x0800c), P(0x08018), P(0x08020),
239           P(0x08038), P(0x0803c), P(0x08048), P(0x08054), P(0x08058),
240           P(0x0805c), P(0x08060), P(0x08064), P(0x08070), P(0x080c0),
241           P(0x080c4), P(0x080c8), P(0x080cc), P(0x080d0), P(0x080d4),
242           P(0x080d8), P(0x080e0), P(0x080e4), P(0x080e8), P(0x080ec),
243           P(0x080f0), P(0x080f4), P(0x080f8), P(0x080fc), P(0x08100),
244           P(0x08104), P(0x08108), P(0x0810c), P(0x08110), P(0x08118),
245           P(0x0811c), P(0x08124), P(0x08128), P(0x0812c), P(0x08130),
246           P(0x08134), P(0x08138), P(0x0813c), P(0x08144), P(0x08168),
247           P(0x0816c), P(0x08170), P(0x08174), P(0x08178), P(0x0817c),
248           P(0x081c0), P(0x081c4), P(0x081d4), P(0x081ec), P(0x081f0),
249           P(0x081f4), P(0x081f8), P(0x081fc), P(0x08200), P(0x08204),
250           P(0x08208), P(0x0820c), P(0x08210), P(0x08214), P(0x08218),
251           P(0x0821c), P(0x08220), P(0x08224), P(0x08228), P(0x0822c),
252           P(0x08230), P(0x08234), P(0x08238), P(0x0823c), P(0x08240),
253           P(0x08244), P(0x08248), P(0x0824c), P(0x08250), P(0x08254),
254           P(0x08258), P(0x0825c), P(0x08260), P(0x08264), P(0x08270),
255           P(0x08274), P(0x08278), P(0x0827c), P(0x08284), P(0x08288),
256           P(0x0828c), P(0x08294), P(0x08298), P(0x0829c), P(0x08300),
257           P(0x08314), P(0x08328), P(0x0832c), P(0x08330), P(0x08334),
258           P(0x08338), P(0x0833c), P(0x08340), P(0x08344), P(0x08360),
259           P(0x08364), P(0x08368), P(0x08370), P(0x08374), P(0x08378),
260           P(0x0837c), P(0x08380), P(0x08384), P(0x08390), P(0x08394),
261           P(0x08398), P(0x0839c), P(0x083a0), P(0x09808), P(0x0980c),
262           P(0x09810), P(0x09814), P(0x0981c), P(0x0982c), P(0x09830),
263           P(0x0983c), P(0x0984c), P(0x0a84c), P(0x09854), P(0x09900),
264           P(0x09904), P(0x09908), P(0x0990c), P(0x09910), P(0x0991c),
265           P(0x09920), P(0x0a920), P(0x09928), P(0x0992c), P(0x09930),
266           P(0x0a930), P(0x09934), P(0x09938), P(0x0993c), P(0x09948),
267           P(0x0994c), P(0x09954), P(0x09958), P(0x09940), P(0x0c95c),
268           P(0x09970), P(0x09974), P(0x09978), P(0x0997c), P(0x099a0),
269           P(0x099a4), P(0x099a8), P(0x099ac), P(0x099b0), P(0x099b4),
270           P(0x099c4), P(0x099c8), P(0x099cc), P(0x099d0), P(0x099dc),
271           P(0x099e0), P(0x099e4), P(0x099e8), P(0x099ec), P(0x099f0),
272           P(0x099fc), P(0x0a208), P(0x0a210), P(0x0a214), P(0x0a218),
273           P(0x0a220), P(0x0a224), P(0x0a228), P(0x0a22c), P(0x0a234),
274           P(0x0a238), P(0x0a23c), P(0x0a240), P(0x0a244), P(0x0a248),
275           P(0x0a24c), P(0x0a254), P(0x0a258), P(0x0a25c), P(0x0a260),
276           P(0x0a264), P(0x0b264), P(0x0a268), P(0x0a26c), P(0x0b26c),
277           P(0x0d270), P(0x0a278), P(0x0a27c), P(0x0d35c), P(0x0d360),
278           P(0x0d364), P(0x0d368), P(0x0d36c), P(0x0d370), P(0x0d374),
279           P(0x0d378), P(0x0d37c), P(0x0d380), P(0x0d384), P(0x0a388),
280           P(0x0a38c), P(0x0a390), P(0x0a394), P(0x0a398), P(0x0b398),
281           P(0x0a39c), P(0x0a3c8), P(0x0a3cc), P(0x0a3d0), P(0x0a3d4),
282           P(0x0a3dc), P(0x0a3e0), P(0x0a3e4), P(0x0a3e8), P(0x0a3ec),
283           P(0x0a3f0), P(0x0a3f4), P(0x0b3f4), P(0x0a7d8), P(0x07800),
284           P(0x07804), P(0x07808), P(0x0780c), P(0x07810), P(0x07814),
285           P(0x07818), P(0x0781c), P(0x07820), P(0x07824), P(0x07828),
286           P(0x0782c), P(0x07830), P(0x07834), P(0x07838), P(0x0783c),
287           P(0x07840), P(0x07844), P(0x07848), P(0x07850), P(0x07854),
288           P(0x07858), P(0x0785c), P(0x07860), P(0x07864), P(0x07868),
289           P(0x0786c), P(0x07870), P(0x07874), P(0x07878), P(0x0787c),
290           P(0x07880), P(0x07884), P(0x07888), P(0x0788c), P(0x07890),
291           P(0x07894), P(0x07898), P(0x0789c), P(0x078a0), P(0x078a4),
292           P(0x078a8), P(0x078ac), P(0x078b0), P(0x078b4), P(0x078b8)
293 };
294 
295 static const uint32_t ar9287_1_1_cm_vals[] = {
296           0x00000000, 0x00020015, 0x00000005, 0x00000000, 0x00000008,
297           0x00000008, 0x00000010, 0x00000000, 0x0000001f, 0x00000000,
298           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
299           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x002ffc0f,
300           0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 0x002ffc0f,
301           0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 0x002ffc0f, 0x00000000,
302           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
303           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
304           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
305           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
306           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
307           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
308           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
309           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
310           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
311           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
312           0x00000000, 0x00000002, 0x00000002, 0x0000001f, 0x00000000,
313           0x00000000, 0x00000033, 0x00000000, 0x00000002, 0x000004c2,
314           0x00000000, 0x00000000, 0x00000000, 0x00000700, 0x00000000,
315           0x00000000, 0x00000000, 0x40000000, 0x00000000, 0x00000000,
316           0x000fc78f, 0x0000000f, 0x00000000, 0x00000000, 0x2a80001a,
317           0x05dc01e0, 0x1f402710, 0x01f40000, 0x00001e00, 0x00000000,
318           0x00400000, 0xffffffff, 0x0000ffff, 0x003f3f3f, 0x00000000,
319           0x00000000, 0x00000000, 0x00000000, 0x00020000, 0x00020000,
320           0x00000001, 0x00000052, 0x00000000, 0x00000168, 0x000100aa,
321           0x00003210, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
322           0x00000000, 0x00000000, 0x00000000, 0xffffffff, 0x00000000,
323           0x00000000, 0x18487320, 0xfaa4fa50, 0x00000100, 0x00000000,
324           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
325           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
326           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
327           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
328           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00100000,
329           0x0010f400, 0x00000100, 0x0001e800, 0x00000000, 0x00000000,
330           0x00000000, 0x400000ff, 0x00080922, 0x88a00010, 0x00000000,
331           0x40000000, 0x003e4180, 0x00000000, 0x0000002c, 0x0000002c,
332           0x000000ff, 0x00000000, 0x00000000, 0x00000000, 0x00000040,
333           0x00000000, 0x00000000, 0x00000007, 0x00000302, 0x00000e00,
334           0x00ff0000, 0x00000000, 0x000107ff, 0x01c81043, 0xffffffff,
335           0xffffffff, 0x00000000, 0x00000000, 0x000000ff, 0x00000000,
336           0x00000000, 0xffffffff, 0xffffffff, 0x0fffffff, 0x0fffffff,
337           0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xafe68e30,
338           0xfd14e000, 0x9c0a9f6b, 0x00000000, 0x0000a000, 0x00000000,
339           0x00200400, 0x0040233c, 0x0040233c, 0x00000044, 0x00000000,
340           0x00000000, 0x00000000, 0x00000000, 0x10002310, 0x10000fff,
341           0x04900000, 0x04900000, 0x00000001, 0x00000004, 0x00000000,
342           0x00000000, 0x1e1f2022, 0x0a0b0c0d, 0x00000000, 0x9280c00a,
343           0x00020028, 0x5f3ca3de, 0x0108ecff, 0x14750604, 0x004b6a8e,
344           0x990bb514, 0x00000000, 0x00000001, 0x00000000, 0x00000000,
345           0x00000001, 0x201fff00, 0x0c6f0000, 0x03051000, 0x00000820,
346           0x06336f77, 0x6af6532f, 0x08f186c8, 0x00046384, 0x00000000,
347           0x00000000, 0xaaaaaaaa, 0x3c466478, 0x0cc80caa, 0x00000000,
348           0x00001042, 0x803e4788, 0x4080a333, 0x40206c10, 0x009c4060,
349           0x01834061, 0x00000400, 0x000003b5, 0x233f7180, 0x20202020,
350           0x20202020, 0x13c889af, 0x38490a20, 0x00000000, 0xfffffffc,
351           0x00000000, 0x00000000, 0x0cdbd380, 0x0f0f0f01, 0xdfa91f01,
352           0x00418a11, 0x00418a11, 0x00000000, 0x0e79e5c6, 0x0e79e5c6,
353           0x00820820, 0x1ce739ce, 0x050701ce, 0x07ffffef, 0x0fffffe7,
354           0x17ffffe5, 0x1fffffe4, 0x37ffffe3, 0x3fffffe3, 0x57ffffe3,
355           0x5fffffe2, 0x7fffffe2, 0x7f3c7bba, 0xf3307ff0, 0x0c000000,
356           0x20202020, 0x20202020, 0x1ce739ce, 0x000001ce, 0x000001ce,
357           0x00000001, 0x00000246, 0x20202020, 0x20202020, 0x20202020,
358           0x1ce739ce, 0x000001ce, 0x00000000, 0x18c43433, 0x00f70081,
359           0x01036a1e, 0x00000000, 0x00000000, 0x000003f1, 0x00000800,
360           0x6c35ffd2, 0x6db6c000, 0x6db6cb30, 0x6db6cb6c, 0x0501e200,
361           0x0094128d, 0x976ee392, 0xf75ff6fc, 0x00040000, 0xdb003012,
362           0x04924914, 0x21084210, 0x00140000, 0x0e4548d8, 0x54214514,
363           0x02025830, 0x71c0d388, 0x934934a8, 0x00000000, 0x00000800,
364           0x6c35ffd2, 0x6db6c000, 0x6db6cb30, 0x6db6cb6c, 0x0501e200,
365           0x0094128d, 0x976ee392, 0xf75ff6fc, 0x00040000, 0xdb003012,
366           0x04924914, 0x21084210, 0x001b6db0, 0x00376b63, 0x06db6db6,
367           0x006d8000, 0x48100000, 0x00000000, 0x08000000, 0x0007ffd8,
368           0x0007ffd8, 0x001c0020, 0x00060aeb, 0x40008080, 0x2a850160
369 };
370 
371 static const struct athn_ini ar9287_1_1_ini = {
372           .nregs              = __arraycount(ar9287_1_1_regs),
373           .regs               = ar9287_1_1_regs,
374           .vals_5g20          = NULL,   /* 2GHz only. */
375 #ifndef IEEE80211_NO_HT
376           .vals_5g40          = NULL,   /* 2GHz only. */
377           .vals_2g40          = ar9287_1_1_vals_2g40,
378 #endif
379           .vals_2g20          = ar9287_1_1_vals_2g20,
380           .ncmregs  = __arraycount(ar9287_1_1_cm_regs),
381           .cmregs             = ar9287_1_1_cm_regs,
382           .cmvals             = ar9287_1_1_cm_vals
383 };
384 
385 /*
386  * AR9287 1.1 Tx gains.
387  */
388 static const uint16_t ar9287_1_1_tx_gain_regs[] = {
389           P(0x0a300), P(0x0a304), P(0x0a308), P(0x0a30c), P(0x0a310),
390           P(0x0a314), P(0x0a318), P(0x0a31c), P(0x0a320), P(0x0a324),
391           P(0x0a328), P(0x0a32c), P(0x0a330), P(0x0a334), P(0x0a338),
392           P(0x0a33c), P(0x0a340), P(0x0a344), P(0x0a348), P(0x0a34c),
393           P(0x0a350), P(0x0a354), P(0x0a780), P(0x0a784), P(0x0a788),
394           P(0x0a78c), P(0x0a790), P(0x0a794), P(0x0a798), P(0x0a79c),
395           P(0x0a7a0), P(0x0a7a4), P(0x0a7a8), P(0x0a7ac), P(0x0a7b0),
396           P(0x0a7b4), P(0x0a7b8), P(0x0a7bc), P(0x0a7c0), P(0x0a7c4),
397           P(0x0a7c8), P(0x0a7cc), P(0x0a7d0), P(0x0a7d4), P(0x0a274)
398 };
399 
400 static const uint32_t ar9287_1_1_tx_gain_vals_2g[] = {
401           0x00000000, 0x00004002, 0x00008004, 0x0000c00a, 0x0001000c,
402           0x0001420b, 0x0001824a, 0x0001c44a, 0x0002064a, 0x0002484a,
403           0x00028a4a, 0x0002cc4a, 0x00030e4a, 0x00034e8a, 0x00038e8c,
404           0x0003cecc, 0x00040ed4, 0x00044edc, 0x00048ede, 0x0004cf1e,
405           0x00050f5e, 0x00054f9e, 0x00000062, 0x00004064, 0x000080a4,
406           0x0000c0aa, 0x000100ac, 0x000140b4, 0x000180f4, 0x0001c134,
407           0x00020174, 0x0002417c, 0x0002817e, 0x0002c1be, 0x000301fe,
408           0x000301fe, 0x000301fe, 0x000301fe, 0x000301fe, 0x000301fe,
409           0x000301fe, 0x000301fe, 0x000301fe, 0x000301fe, 0x0a1aa000
410 };
411 
412 static const struct athn_gain ar9287_1_1_tx_gain = {
413           __arraycount(ar9287_1_1_tx_gain_regs),
414           ar9287_1_1_tx_gain_regs,
415           NULL,     /* 2GHz only. */
416           ar9287_1_1_tx_gain_vals_2g
417 };
418 
419 /*
420  * AR9287 1.1 Rx gains.
421  */
422 static const uint16_t ar9287_1_1_rx_gain_regs[] = {
423           P(0x09a00), P(0x09a04), P(0x09a08), P(0x09a0c), P(0x09a10),
424           P(0x09a14), P(0x09a18), P(0x09a1c), P(0x09a20), P(0x09a24),
425           P(0x09a28), P(0x09a2c), P(0x09a30), P(0x09a34), P(0x09a38),
426           P(0x09a3c), P(0x09a40), P(0x09a44), P(0x09a48), P(0x09a4c),
427           P(0x09a50), P(0x09a54), P(0x09a58), P(0x09a5c), P(0x09a60),
428           P(0x09a64), P(0x09a68), P(0x09a6c), P(0x09a70), P(0x09a74),
429           P(0x09a78), P(0x09a7c), P(0x09a80), P(0x09a84), P(0x09a88),
430           P(0x09a8c), P(0x09a90), P(0x09a94), P(0x09a98), P(0x09a9c),
431           P(0x09aa0), P(0x09aa4), P(0x09aa8), P(0x09aac), P(0x09ab0),
432           P(0x09ab4), P(0x09ab8), P(0x09abc), P(0x09ac0), P(0x09ac4),
433           P(0x09ac8), P(0x09acc), P(0x09ad0), P(0x09ad4), P(0x09ad8),
434           P(0x09adc), P(0x09ae0), P(0x09ae4), P(0x09ae8), P(0x09aec),
435           P(0x09af0), P(0x09af4), P(0x09af8), P(0x09afc), P(0x09b00),
436           P(0x09b04), P(0x09b08), P(0x09b0c), P(0x09b10), P(0x09b14),
437           P(0x09b18), P(0x09b1c), P(0x09b20), P(0x09b24), P(0x09b28),
438           P(0x09b2c), P(0x09b30), P(0x09b34), P(0x09b38), P(0x09b3c),
439           P(0x09b40), P(0x09b44), P(0x09b48), P(0x09b4c), P(0x09b50),
440           P(0x09b54), P(0x09b58), P(0x09b5c), P(0x09b60), P(0x09b64),
441           P(0x09b68), P(0x09b6c), P(0x09b70), P(0x09b74), P(0x09b78),
442           P(0x09b7c), P(0x09b80), P(0x09b84), P(0x09b88), P(0x09b8c),
443           P(0x09b90), P(0x09b94), P(0x09b98), P(0x09b9c), P(0x09ba0),
444           P(0x09ba4), P(0x09ba8), P(0x09bac), P(0x09bb0), P(0x09bb4),
445           P(0x09bb8), P(0x09bbc), P(0x09bc0), P(0x09bc4), P(0x09bc8),
446           P(0x09bcc), P(0x09bd0), P(0x09bd4), P(0x09bd8), P(0x09bdc),
447           P(0x09be0), P(0x09be4), P(0x09be8), P(0x09bec), P(0x09bf0),
448           P(0x09bf4), P(0x09bf8), P(0x09bfc), P(0x0aa00), P(0x0aa04),
449           P(0x0aa08), P(0x0aa0c), P(0x0aa10), P(0x0aa14), P(0x0aa18),
450           P(0x0aa1c), P(0x0aa20), P(0x0aa24), P(0x0aa28), P(0x0aa2c),
451           P(0x0aa30), P(0x0aa34), P(0x0aa38), P(0x0aa3c), P(0x0aa40),
452           P(0x0aa44), P(0x0aa48), P(0x0aa4c), P(0x0aa50), P(0x0aa54),
453           P(0x0aa58), P(0x0aa5c), P(0x0aa60), P(0x0aa64), P(0x0aa68),
454           P(0x0aa6c), P(0x0aa70), P(0x0aa74), P(0x0aa78), P(0x0aa7c),
455           P(0x0aa80), P(0x0aa84), P(0x0aa88), P(0x0aa8c), P(0x0aa90),
456           P(0x0aa94), P(0x0aa98), P(0x0aa9c), P(0x0aaa0), P(0x0aaa4),
457           P(0x0aaa8), P(0x0aaac), P(0x0aab0), P(0x0aab4), P(0x0aab8),
458           P(0x0aabc), P(0x0aac0), P(0x0aac4), P(0x0aac8), P(0x0aacc),
459           P(0x0aad0), P(0x0aad4), P(0x0aad8), P(0x0aadc), P(0x0aae0),
460           P(0x0aae4), P(0x0aae8), P(0x0aaec), P(0x0aaf0), P(0x0aaf4),
461           P(0x0aaf8), P(0x0aafc), P(0x0ab00), P(0x0ab04), P(0x0ab08),
462           P(0x0ab0c), P(0x0ab10), P(0x0ab14), P(0x0ab18), P(0x0ab1c),
463           P(0x0ab20), P(0x0ab24), P(0x0ab28), P(0x0ab2c), P(0x0ab30),
464           P(0x0ab34), P(0x0ab38), P(0x0ab3c), P(0x0ab40), P(0x0ab44),
465           P(0x0ab48), P(0x0ab4c), P(0x0ab50), P(0x0ab54), P(0x0ab58),
466           P(0x0ab5c), P(0x0ab60), P(0x0ab64), P(0x0ab68), P(0x0ab6c),
467           P(0x0ab70), P(0x0ab74), P(0x0ab78), P(0x0ab7c), P(0x0ab80),
468           P(0x0ab84), P(0x0ab88), P(0x0ab8c), P(0x0ab90), P(0x0ab94),
469           P(0x0ab98), P(0x0ab9c), P(0x0aba0), P(0x0aba4), P(0x0aba8),
470           P(0x0abac), P(0x0abb0), P(0x0abb4), P(0x0abb8), P(0x0abbc),
471           P(0x0abc0), P(0x0abc4), P(0x0abc8), P(0x0abcc), P(0x0abd0),
472           P(0x0abd4), P(0x0abd8), P(0x0abdc), P(0x0abe0), P(0x0abe4),
473           P(0x0abe8), P(0x0abec), P(0x0abf0), P(0x0abf4), P(0x0abf8),
474           P(0x0abfc), P(0x09848), P(0x0a848)
475 };
476 
477 static const uint32_t ar9287_1_1_rx_gain_vals_2g[] = {
478           0x0000a120, 0x0000a124, 0x0000a128, 0x0000a12c, 0x0000a130,
479           0x0000a194, 0x0000a198, 0x0000a20c, 0x0000a210, 0x0000a284,
480           0x0000a288, 0x0000a28c, 0x0000a290, 0x0000a294, 0x0000a2a0,
481           0x0000a2a4, 0x0000a2a8, 0x0000a2ac, 0x0000a2b0, 0x0000a2b4,
482           0x0000a2b8, 0x0000a2c4, 0x0000a708, 0x0000a70c, 0x0000a710,
483           0x0000ab04, 0x0000ab08, 0x0000ab0c, 0x0000ab10, 0x0000ab14,
484           0x0000ab18, 0x0000ab8c, 0x0000ab90, 0x0000ab94, 0x0000ab98,
485           0x0000aba4, 0x0000aba8, 0x0000cb04, 0x0000cb08, 0x0000cb0c,
486           0x0000cb10, 0x0000cb14, 0x0000cb18, 0x0000cb8c, 0x0000cb90,
487           0x0000cf18, 0x0000cf24, 0x0000cf28, 0x0000d314, 0x0000d318,
488           0x0000d38c, 0x0000d390, 0x0000d394, 0x0000d398, 0x0000d3a4,
489           0x0000d3a8, 0x0000d3ac, 0x0000d3b0, 0x0000f380, 0x0000f384,
490           0x0000f388, 0x0000f710, 0x0000f714, 0x0000f718, 0x0000fb10,
491           0x0000fb14, 0x0000fb18, 0x0000fb8c, 0x0000fb90, 0x0000fb94,
492           0x0000ff8c, 0x0000ff90, 0x0000ff94, 0x0000ffa0, 0x0000ffa4,
493           0x0000ffa8, 0x0000ffac, 0x0000ffb0, 0x0000ffb4, 0x0000ffa1,
494           0x0000ffa5, 0x0000ffa9, 0x0000ffad, 0x0000ffb1, 0x0000ffb5,
495           0x0000ffb9, 0x0000ffc5, 0x0000ffc9, 0x0000ffcd, 0x0000ffd1,
496           0x0000ffd5, 0x0000ffc2, 0x0000ffc6, 0x0000ffca, 0x0000ffce,
497           0x0000ffd2, 0x0000ffd6, 0x0000ffda, 0x0000ffc7, 0x0000ffcb,
498           0x0000ffcf, 0x0000ffd3, 0x0000ffd7, 0x0000ffdb, 0x0000ffdb,
499           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
500           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
501           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
502           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
503           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000a120, 0x0000a124,
504           0x0000a128, 0x0000a12c, 0x0000a130, 0x0000a194, 0x0000a198,
505           0x0000a20c, 0x0000a210, 0x0000a284, 0x0000a288, 0x0000a28c,
506           0x0000a290, 0x0000a294, 0x0000a2a0, 0x0000a2a4, 0x0000a2a8,
507           0x0000a2ac, 0x0000a2b0, 0x0000a2b4, 0x0000a2b8, 0x0000a2c4,
508           0x0000a708, 0x0000a70c, 0x0000a710, 0x0000ab04, 0x0000ab08,
509           0x0000ab0c, 0x0000ab10, 0x0000ab14, 0x0000ab18, 0x0000ab8c,
510           0x0000ab90, 0x0000ab94, 0x0000ab98, 0x0000aba4, 0x0000aba8,
511           0x0000cb04, 0x0000cb08, 0x0000cb0c, 0x0000cb10, 0x0000cb14,
512           0x0000cb18, 0x0000cb8c, 0x0000cb90, 0x0000cf18, 0x0000cf24,
513           0x0000cf28, 0x0000d314, 0x0000d318, 0x0000d38c, 0x0000d390,
514           0x0000d394, 0x0000d398, 0x0000d3a4, 0x0000d3a8, 0x0000d3ac,
515           0x0000d3b0, 0x0000f380, 0x0000f384, 0x0000f388, 0x0000f710,
516           0x0000f714, 0x0000f718, 0x0000fb10, 0x0000fb14, 0x0000fb18,
517           0x0000fb8c, 0x0000fb90, 0x0000fb94, 0x0000ff8c, 0x0000ff90,
518           0x0000ff94, 0x0000ffa0, 0x0000ffa4, 0x0000ffa8, 0x0000ffac,
519           0x0000ffb0, 0x0000ffb4, 0x0000ffa1, 0x0000ffa5, 0x0000ffa9,
520           0x0000ffad, 0x0000ffb1, 0x0000ffb5, 0x0000ffb9, 0x0000ffc5,
521           0x0000ffc9, 0x0000ffcd, 0x0000ffd1, 0x0000ffd5, 0x0000ffc2,
522           0x0000ffc6, 0x0000ffca, 0x0000ffce, 0x0000ffd2, 0x0000ffd6,
523           0x0000ffda, 0x0000ffc7, 0x0000ffcb, 0x0000ffcf, 0x0000ffd3,
524           0x0000ffd7, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
525           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
526           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
527           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
528           0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb, 0x0000ffdb,
529           0x0000ffdb, 0x00001067, 0x00001067
530 };
531 
532 static const struct athn_gain ar9287_1_1_rx_gain = {
533           __arraycount(ar9287_1_1_rx_gain_regs),
534           ar9287_1_1_rx_gain_regs,
535           NULL,     /* 2GHz only. */
536           ar9287_1_1_rx_gain_vals_2g
537 };
538 
539 #endif /* _ARN9287REG_H_ */
540