1 /* $OpenBSD: if_otusreg.h,v 1.9 2013/11/26 20:33:18 deraadt Exp $ */
4 * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
5 * Copyright (c) 2007-2008 Atheros Communications, Inc.
6 * Copyright (c) 2015 Adrian Chadd <adrian@FreeBSD.org>
8 * Permission to use, copy, modify, and 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.
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.
22 #ifndef __IF_OTUSREG_H__
23 #define __IF_OTUSREG_H__
25 /* USB Endpoints addresses. */
26 #define AR_EPT_BULK_TX_NO (UE_DIR_OUT | 1)
27 #define AR_EPT_BULK_RX_NO (UE_DIR_IN | 2)
28 #define AR_EPT_INTR_RX_NO (UE_DIR_IN | 3)
29 #define AR_EPT_INTR_TX_NO (UE_DIR_OUT | 4)
32 #define AR_FW_DOWNLOAD 0x30
33 #define AR_FW_DOWNLOAD_COMPLETE 0x31
35 /* Maximum number of writes that can fit in a single FW command is 7. */
36 #define AR_MAX_WRITE_IDX 6 /* 56 bytes */
38 #define AR_FW_INIT_ADDR 0x102800
39 #define AR_FW_MAIN_ADDR 0x200000
40 #define AR_USB_MODE_CTRL 0x1e1108
43 * AR9170 MAC registers.
45 #define AR_MAC_REG_BASE 0x1c3000
46 #define AR_MAC_REG_DMA_TRIGGER (AR_MAC_REG_BASE + 0xd30)
47 #define AR_MAC_REG_MAC_ADDR_L (AR_MAC_REG_BASE + 0x610)
48 #define AR_MAC_REG_MAC_ADDR_H (AR_MAC_REG_BASE + 0x614)
49 #define AR_MAC_REG_BSSID_L (AR_MAC_REG_BASE + 0x618)
50 #define AR_MAC_REG_BSSID_H (AR_MAC_REG_BASE + 0x61c)
51 #define AR_MAC_REG_GROUP_HASH_TBL_L (AR_MAC_REG_BASE + 0x624)
52 #define AR_MAC_REG_GROUP_HASH_TBL_H (AR_MAC_REG_BASE + 0x628)
53 #define AR_MAC_REG_RX_TIMEOUT (AR_MAC_REG_BASE + 0x62c)
54 #define AR_MAC_REG_BASIC_RATE (AR_MAC_REG_BASE + 0x630)
55 #define AR_MAC_REG_MANDATORY_RATE (AR_MAC_REG_BASE + 0x634)
56 #define AR_MAC_REG_RTS_CTS_RATE (AR_MAC_REG_BASE + 0x638)
57 #define AR_MAC_REG_BACKOFF_PROTECT (AR_MAC_REG_BASE + 0x63c)
58 #define AR_MAC_REG_RX_THRESHOLD (AR_MAC_REG_BASE + 0x640)
59 #define AR_MAC_REG_RX_PE_DELAY (AR_MAC_REG_BASE + 0x64c)
60 #define AR_MAC_REG_DYNAMIC_SIFS_ACK (AR_MAC_REG_BASE + 0x658)
61 #define AR_MAC_REG_SNIFFER (AR_MAC_REG_BASE + 0x674)
62 #define AR_MAC_SNIFFER_DEFAULTS 0x02000000
63 #define AR_MAC_SNIFFER_ENABLE_PROMISC 0x1
64 #define AR_MAC_REG_ENCRYPTION (AR_MAC_REG_BASE + 0x678)
65 #define AR_MAC_REG_MISC_680 (AR_MAC_REG_BASE + 0x680)
66 #define AR_MAC_REG_FRAMETYPE_FILTER (AR_MAC_REG_BASE + 0x68c)
67 #define AR_MAC_REG_ACK_EXTENSION (AR_MAC_REG_BASE + 0x690)
68 #define AR_MAC_REG_ACK_TPC (AR_MAC_REG_BASE + 0x694)
69 #define AR_MAC_REG_EIFS_AND_SIFS (AR_MAC_REG_BASE + 0x698)
70 #define AR_MAC_REG_BUSY (AR_MAC_REG_BASE + 0x6e8)
71 #define AR_MAC_REG_BUSY_EXT (AR_MAC_REG_BASE + 0x6ec)
72 #define AR_MAC_REG_SLOT_TIME (AR_MAC_REG_BASE + 0x6f0)
73 #define AR_MAC_REG_CAM_MODE (AR_MAC_REG_BASE + 0x700)
74 #define AR_MAC_CAM_DEFAULTS (0xf << 24)
75 #define AR_MAC_CAM_IBSS 0xe0
76 #define AR_MAC_CAM_AP 0xa1
77 #define AR_MAC_CAM_STA 0x2
78 #define AR_MAC_CAM_AP_WDS 0x3
79 #define AR_MAC_REG_AC0_CW (AR_MAC_REG_BASE + 0xb00)
80 #define AR_MAC_REG_AC1_CW (AR_MAC_REG_BASE + 0xb04)
81 #define AR_MAC_REG_AC2_CW (AR_MAC_REG_BASE + 0xb08)
82 #define AR_MAC_REG_AC3_CW (AR_MAC_REG_BASE + 0xb0c)
83 #define AR_MAC_REG_AC4_CW (AR_MAC_REG_BASE + 0xb10)
84 #define AR_MAC_REG_AC1_AC0_AIFS (AR_MAC_REG_BASE + 0xb14)
85 #define AR_MAC_REG_AC3_AC2_AIFS (AR_MAC_REG_BASE + 0xb18)
86 #define AR_MAC_REG_RETRY_MAX (AR_MAC_REG_BASE + 0xb28)
87 #define AR_MAC_REG_TID_CFACK_CFEND_RATE (AR_MAC_REG_BASE + 0xb2c)
88 #define AR_MAC_REG_TXOP_NOT_ENOUGH_INDICATION \
89 (AR_MAC_REG_BASE + 0xb30)
90 #define AR_MAC_REG_TXOP_DURATION (AR_MAC_REG_BASE + 0xb38)
91 #define AR_MAC_REG_AC1_AC0_TXOP (AR_MAC_REG_BASE + 0xb44)
92 #define AR_MAC_REG_AC3_AC2_TXOP (AR_MAC_REG_BASE + 0xb48)
93 #define AR_MAC_REG_AMPDU_FACTOR (AR_MAC_REG_BASE + 0xb9c)
94 #define AR_MAC_REG_FCS_SELECT (AR_MAC_REG_BASE + 0xbb0)
95 #define AR_MAC_REG_RX_CONTROL (AR_MAC_REG_BASE + 0xc40)
96 #define AR_MAC_RX_CTRL_DEAGG 0x1
97 #define AR_MAC_RX_CTRL_SHORT_FILTER 0x2
98 #define AR_MAC_RX_CTRL_SA_DA_SEARCH 0x20
99 #define AR_MAC_RX_CTRL_PASS_TO_HOST (1 << 28)
100 #define AR_MAC_RX_CTRL_ACK_IN_SNIFFER (1 << 30)
102 #define AR_MAC_REG_AMPDU_RX_THRESH (AR_MAC_REG_BASE + 0xc50)
103 #define AR_MAC_REG_OFDM_PHY_ERRORS (AR_MAC_REG_BASE + 0xcb4)
104 #define AR_MAC_REG_CCK_PHY_ERRORS (AR_MAC_REG_BASE + 0xcb8)
105 #define AR_MAC_REG_TXRX_MPI (AR_MAC_REG_BASE + 0xd7c)
106 #define AR_MAC_REG_BCN_HT1 (AR_MAC_REG_BASE + 0xda0)
108 /* Possible values for register AR_USB_MODE_CTRL. */
109 #define AR_USB_DS_ENA (1 << 0)
110 #define AR_USB_US_ENA (1 << 1)
111 #define AR_USB_US_PACKET_MODE (1 << 3)
112 #define AR_USB_RX_STREAM_4K (0 << 4)
113 #define AR_USB_RX_STREAM_8K (1 << 4)
114 #define AR_USB_RX_STREAM_16K (2 << 4)
115 #define AR_USB_RX_STREAM_32K (3 << 4)
116 #define AR_USB_TX_STREAM_MODE (1 << 6)
118 #define AR_LED0_ON (1 << 0)
119 #define AR_LED1_ON (1 << 1)
124 #define AR_PHY_BASE 0x1c5800
125 #define AR_PHY(reg) (AR_PHY_BASE + (reg) * 4)
126 #define AR_PHY_TURBO (AR_PHY_BASE + 0x0004)
127 #define AR_PHY_RF_CTL3 (AR_PHY_BASE + 0x0028)
128 #define AR_PHY_RF_CTL4 (AR_PHY_BASE + 0x0034)
129 #define AR_PHY_SETTLING (AR_PHY_BASE + 0x0044)
130 #define AR_PHY_RXGAIN (AR_PHY_BASE + 0x0048)
131 #define AR_PHY_DESIRED_SZ (AR_PHY_BASE + 0x0050)
132 #define AR_PHY_FIND_SIG (AR_PHY_BASE + 0x0058)
133 #define AR_PHY_AGC_CTL1 (AR_PHY_BASE + 0x005c)
134 #define AR_PHY_SFCORR (AR_PHY_BASE + 0x0068)
135 #define AR_PHY_SFCORR_LOW (AR_PHY_BASE + 0x006c)
136 #define AR_PHY_TIMING_CTRL4 (AR_PHY_BASE + 0x0120)
137 #define AR_PHY_TIMING5 (AR_PHY_BASE + 0x0124)
138 #define AR_PHY_POWER_TX_RATE1 (AR_PHY_BASE + 0x0134)
139 #define AR_PHY_POWER_TX_RATE2 (AR_PHY_BASE + 0x0138)
140 #define AR_PHY_POWER_TX_RATE_MAX (AR_PHY_BASE + 0x013c)
141 #define AR_PHY_SWITCH_CHAIN_0 (AR_PHY_BASE + 0x0160)
142 #define AR_PHY_SWITCH_COM (AR_PHY_BASE + 0x0164)
143 #define AR_PHY_HEAVY_CLIP_ENABLE (AR_PHY_BASE + 0x01e0)
144 #define AR_PHY_CCK_DETECT (AR_PHY_BASE + 0x0a08)
145 #define AR_PHY_GAIN_2GHZ (AR_PHY_BASE + 0x0a0c)
146 #define AR_PHY_POWER_TX_RATE3 (AR_PHY_BASE + 0x0a34)
147 #define AR_PHY_POWER_TX_RATE4 (AR_PHY_BASE + 0x0a38)
148 #define AR_PHY_TPCRG1 (AR_PHY_BASE + 0x0a58)
149 #define AR_PHY_POWER_TX_RATE5 (AR_PHY_BASE + 0x0b8c)
150 #define AR_PHY_POWER_TX_RATE6 (AR_PHY_BASE + 0x0b90)
151 #define AR_PHY_POWER_TX_RATE7 (AR_PHY_BASE + 0x0bcc)
152 #define AR_PHY_POWER_TX_RATE8 (AR_PHY_BASE + 0x0bd0)
153 #define AR_PHY_POWER_TX_RATE9 (AR_PHY_BASE + 0x0bd4)
154 #define AR_PHY_CCA (AR_PHY_BASE + 0x3064)
156 #define AR_SEEPROM_HW_TYPE_OFFSET 0x1374
157 #define AR_EEPROM_OFFSET 0x1600
159 #define AR_BANK4_CHUP (1 << 0)
160 #define AR_BANK4_BMODE_LF_SYNTH_FREQ (1 << 1)
161 #define AR_BANK4_AMODE_REFSEL(x) ((x) << 2)
162 #define AR_BANK4_ADDR(x) ((x) << 5)
165 * Random number generator.
167 #define AR_RAND_REG_BASE 0x1d0000
172 #define AR_GPIO_REG_BASE 0x1d0100
174 #define AR_GPIO_REG_PORT_TYPE (AR_GPIO_REG_BASE + 0x000)
175 #define AR_GPIO_REG_PORT_DATA (AR_GPIO_REG_BASE + 0x004)
176 #define AR_GPIO_PORT_LED_0 1
177 #define AR_GPIO_PORT_LED_1 2
178 /* WPS Button GPIO for TP-Link TL-WN821N */
179 #define AR_GPIO_PORT_WPS_BUTTON_PRESSED 4
184 #define AR_PWR_REG_BASE 0x1d4000
186 #define AR_PWR_REG_RESET (AR_PWR_REG_BASE + 0x004)
187 #define AR_PWR_REG_CLOCK_SEL (AR_PWR_REG_BASE + 0x008)
188 #define AR_PWR_REG_PLL_ADDAC (AR_PWR_REG_BASE + 0x014)
194 #define AR_TX_MAC_RTS (1 << 0)
195 #define AR_TX_MAC_CTS (1 << 1)
196 #define AR_TX_MAC_BACKOFF (1 << 3)
197 #define AR_TX_MAC_NOACK (1 << 2)
198 #define AR_TX_MAC_HW_DUR (1 << 9)
199 #define AR_TX_MAC_QID(qid) ((qid) << 10)
200 #define AR_TX_MAC_RATE_PROBING (1 << 15)
203 /* Modulation type. */
204 #define AR_TX_PHY_MT_SHIFT 0 /* 0:1 - PHY mode */
205 #define AR_TX_PHY_MT_CCK 0
206 #define AR_TX_PHY_MT_OFDM 1
207 #define AR_TX_PHY_MT_HT 2
208 #define AR_TX_PHY_GF (1 << 2) /* 2 - greenfield */
209 #define AR_TX_PHY_BW_SHIFT 3 /* 4:3 - bandwidth */
210 #define AR_TX_PHY_BW_20MHZ 0
211 #define AR_TX_PHY_BW_40MHZ 2
212 #define AR_TX_PHY_BW_40MHZ_DUP 3
213 #define AR_TX_PHY_TX_HEAVY_CLIP_SHIFT 6 /* 9:6 - heavy clip */
214 #define AR_TX_PHY_TPC_SHIFT 9 /* 14:9 - TX power */
215 #define AR_TX_PHY_ANTMSK(msk) ((msk) << 15)
216 #define AR_TX_PHY_MCS(mcs) ((mcs) << 18)
217 #define AR_TX_PHY_SHGI (1U << 31)
220 /* USB Rx stream mode header. */
224 #define AR_RX_HEAD_TAG 0x4e00
229 struct ar_rx_macstatus {
233 #define AR_RX_ERROR_TIMEOUT (1 << 0)
234 #define AR_RX_ERROR_OVERRUN (1 << 1)
235 #define AR_RX_ERROR_DECRYPT (1 << 2)
236 #define AR_RX_ERROR_FCS (1 << 3)
237 #define AR_RX_ERROR_BAD_RA (1 << 4)
238 #define AR_RX_ERROR_PLCP (1 << 5)
239 #define AR_RX_ERROR_MMIC (1 << 6)
241 /* Modulation type (same as AR_TX_PHY_MT). */
242 #define AR_RX_STATUS_MT_MASK 0x3
243 #define AR_RX_STATUS_MT_CCK 0
244 #define AR_RX_STATUS_MT_OFDM 1
245 #define AR_RX_STATUS_MT_HT 2
246 #define AR_RX_STATUS_SHPREAMBLE (1 << 3)
247 #define AR_RX_STATUS_MPDU_MASK 0x30
248 #define AR_RX_STATUS_MPDU_SINGLE 0x00
249 #define AR_RX_STATUS_MPDU_LAST 0x10
250 #define AR_RX_STATUS_MPDU_FIRST 0x20
251 #define AR_RX_STATUS_MPDU_MIDDLE 0x30
254 struct ar_rx_phystatus {
256 uint8_t rssi_ant_ext[3];
257 uint8_t rssi; /* Combined RSSI. */
258 uint8_t evm[2][6]; /* Error Vector Magnitude. */
262 #define AR_PLCP_HDR_LEN 12
263 /* Magic PLCP header for firmware notifications through Rx bulk pipe. */
264 static uint8_t AR_PLCP_HDR_INTR[] = {
265 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
266 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
269 /* Firmware command/reply header. */
273 #define AR_CMD_RREG 0x00
274 #define AR_CMD_WREG 0x01
275 #define AR_CMD_RMEM 0x02
276 #define AR_CMD_WMEM 0x03
277 #define AR_CMD_BITAND 0x04
278 #define AR_CMD_BITOR 0x05
279 #define AR_CMD_EKEY 0x28
280 #define AR_CMD_DKEY 0x29
281 #define AR_CMD_FREQUENCY 0x30
282 #define AR_CMD_RF_INIT 0x31
283 #define AR_CMD_SYNTH 0x32
284 #define AR_CMD_FREQ_STRAT 0x33
285 #define AR_CMD_ECHO 0x80
286 #define AR_CMD_TALLY 0x81
287 #define AR_CMD_TALLY_APD 0x82
288 #define AR_CMD_CONFIG 0x83
289 #define AR_CMD_RESET 0x90
290 #define AR_CMD_DKRESET 0x91
291 #define AR_CMD_DKTX_STATUS 0x92
292 #define AR_CMD_FDC 0xa0
293 #define AR_CMD_WREEPROM 0xb0
294 #define AR_CMD_WFLASH AR_CMD_WREEPROM
295 #define AR_CMD_FLASH_ERASE 0xb1
296 #define AR_CMD_FLASH_PROG 0xb2
297 #define AR_CMD_FLASH_CHKSUM 0xb3
298 #define AR_CMD_FLASH_READ 0xb4
299 #define AR_CMD_FW_DL_INIT 0xb5
300 #define AR_CMD_MEM_WREEPROM 0xbb
301 /* Those have the 2 MSB set to 1. */
302 #define AR_EVT_BEACON 0x00
303 #define AR_EVT_TX_COMP 0x01
304 #define AR_EVT_TBTT 0x02
305 #define AR_EVT_ATIM 0x03
306 #define AR_EVT_DO_BB_RESET 0x09
308 uint16_t token; /* Driver private data. */
311 /* Structure for command AR_CMD_RF_INIT/AR_CMD_FREQUENCY. */
312 struct ar_cmd_frequency {
318 uint32_t dsc_shgi_exp;
319 uint32_t dsc_shgi_man;
320 uint32_t check_loop_count;
323 /* Firmware reply for command AR_CMD_FREQUENCY. */
324 struct ar_rsp_frequency {
326 #define AR_CAL_ERR_AGC (1 << 0) /* AGC cal unfinished. */
327 #define AR_CAL_ERR_NF (1 << 1) /* Noise cal unfinished. */
328 #define AR_CAL_ERR_NF_VAL (1 << 2) /* NF value unexpected. */
330 uint32_t nf[3]; /* Noisefloor. */
331 uint32_t nf_ext[3]; /* Noisefloor ext. */
334 /* Structure for command AR_CMD_EKEY. */
336 uint16_t uid; /* user ID */
339 #define AR_CIPHER_NONE 0
340 #define AR_CIPHER_WEP64 1
341 #define AR_CIPHER_TKIP 2
342 #define AR_CIPHER_AES 4
343 #define AR_CIPHER_WEP128 5
344 #define AR_CIPHER_WEP256 6
345 #define AR_CIPHER_CENC 7
347 uint8_t macaddr[IEEE80211_ADDR_LEN];
351 /* Structure for event AR_EVT_TX_COMP. */
352 struct ar_evt_tx_comp {
353 uint8_t macaddr[IEEE80211_ADDR_LEN];
356 #define AR_TX_STATUS_COMP 0
357 #define AR_TX_STATUS_RETRY_COMP 1
358 #define AR_TX_STATUS_FAILED 2
361 /* List of supported channels. */
362 static const uint8_t ar_chans[] = {
363 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
364 34, 36, 38, 40, 42, 44, 46, 48, 52, 56, 60, 64, 100, 104, 108,
365 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165
369 * This data is automatically generated from the "otus.ini" file.
370 * It is stored in a different way though, to reduce kernel's .rodata
371 * section overhead (5.1KB instead of 8.5KB).
374 /* NB: apply AR_PHY(). */
375 static const uint16_t ar5416_phy_regs[] = {
376 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008,
377 0x009, 0x00a, 0x00b, 0x00c, 0x00d, 0x00e, 0x00f, 0x010, 0x011,
378 0x012, 0x013, 0x014, 0x015, 0x016, 0x017, 0x018, 0x01a, 0x01b,
379 0x040, 0x041, 0x042, 0x043, 0x045, 0x046, 0x047, 0x048, 0x049,
380 0x04a, 0x04b, 0x04d, 0x04e, 0x04f, 0x051, 0x052, 0x053, 0x055,
381 0x056, 0x058, 0x059, 0x05c, 0x05d, 0x05e, 0x05f, 0x060, 0x061,
382 0x062, 0x063, 0x064, 0x065, 0x066, 0x067, 0x068, 0x069, 0x06a,
383 0x06b, 0x06c, 0x06d, 0x070, 0x071, 0x072, 0x073, 0x074, 0x075,
384 0x076, 0x077, 0x078, 0x079, 0x07a, 0x07b, 0x07c, 0x07f, 0x080,
385 0x081, 0x082, 0x083, 0x084, 0x085, 0x086, 0x087, 0x088, 0x089,
386 0x08a, 0x08b, 0x08c, 0x08d, 0x08e, 0x08f, 0x090, 0x091, 0x092,
387 0x093, 0x094, 0x095, 0x096, 0x097, 0x098, 0x099, 0x09a, 0x09b,
388 0x09c, 0x09d, 0x09e, 0x09f, 0x0a0, 0x0a1, 0x0a2, 0x0a3, 0x0a4,
389 0x0a5, 0x0a6, 0x0a7, 0x0a8, 0x0a9, 0x0aa, 0x0ab, 0x0ac, 0x0ad,
390 0x0ae, 0x0af, 0x0b0, 0x0b1, 0x0b2, 0x0b3, 0x0b4, 0x0b5, 0x0b6,
391 0x0b7, 0x0b8, 0x0b9, 0x0ba, 0x0bb, 0x0bc, 0x0bd, 0x0be, 0x0bf,
392 0x0c0, 0x0c1, 0x0c2, 0x0c3, 0x0c4, 0x0c5, 0x0c6, 0x0c7, 0x0c8,
393 0x0c9, 0x0ca, 0x0cb, 0x0cc, 0x0cd, 0x0ce, 0x0cf, 0x0d0, 0x0d1,
394 0x0d2, 0x0d3, 0x0d4, 0x0d5, 0x0d6, 0x0d7, 0x0d8, 0x0d9, 0x0da,
395 0x0db, 0x0dc, 0x0dd, 0x0de, 0x0df, 0x0e0, 0x0e1, 0x0e2, 0x0e3,
396 0x0e4, 0x0e5, 0x0e6, 0x0e7, 0x0e8, 0x0e9, 0x0ea, 0x0eb, 0x0ec,
397 0x0ed, 0x0ee, 0x0ef, 0x0f0, 0x0f1, 0x0f2, 0x0f3, 0x0f4, 0x0f5,
398 0x0f6, 0x0f7, 0x0f8, 0x0f9, 0x0fa, 0x0fb, 0x0fc, 0x0fd, 0x0fe,
399 0x0ff, 0x100, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108, 0x109,
400 0x10a, 0x10b, 0x10c, 0x10d, 0x10e, 0x10f, 0x13c, 0x13d, 0x13e,
401 0x13f, 0x280, 0x281, 0x282, 0x283, 0x284, 0x285, 0x286, 0x287,
402 0x288, 0x289, 0x28a, 0x28b, 0x28c, 0x28d, 0x28e, 0x28f, 0x290,
403 0x291, 0x292, 0x293, 0x294, 0x295, 0x296, 0x297, 0x298, 0x299,
404 0x29a, 0x29b, 0x29d, 0x29e, 0x29f, 0x2c0, 0x2c1, 0x2c2, 0x2c3,
405 0x2c4, 0x2c5, 0x2c6, 0x2c7, 0x2c8, 0x2c9, 0x2ca, 0x2cb, 0x2cc,
406 0x2cd, 0x2ce, 0x2cf, 0x2d0, 0x2d1, 0x2d2, 0x2d3, 0x2d4, 0x2d5,
407 0x2d6, 0x2e2, 0x2e3, 0x2e4, 0x2e5, 0x2e6, 0x2e7, 0x2e8, 0x2e9,
408 0x2ea, 0x2eb, 0x2ec, 0x2ed, 0x2ee, 0x2ef, 0x2f0, 0x2f1, 0x2f2,
409 0x2f3, 0x2f4, 0x2f5, 0x2f6, 0x2f7, 0x2f8, 0x412, 0x448, 0x458,
410 0x683, 0x69b, 0x812, 0x848, 0x858, 0xa83, 0xa9b, 0xc19, 0xc57,
411 0xc5a, 0xc6f, 0xe9c, 0xed7, 0xed8, 0xed9, 0xeda, 0xedb, 0xedc,
412 0xedd, 0xede, 0xedf, 0xee0, 0xee1
415 static const uint32_t ar5416_phy_vals_5ghz_20mhz[] = {
416 0x00000007, 0x00000300, 0x00000000, 0xad848e19, 0x7d14e000,
417 0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
418 0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
419 0x00200400, 0x206a002e, 0x1372161e, 0x001a6a65, 0x1284233c,
420 0x6c48b4e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd10,
421 0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
422 0x00000000, 0x000007d0, 0x00000118, 0x10000fff, 0x0510081c,
423 0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
424 0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
425 0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
426 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
427 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
428 0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
429 0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
430 0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
431 0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
432 0x00000000, 0x00000040, 0x00000080, 0x000001a1, 0x000001e1,
433 0x00000021, 0x00000061, 0x00000168, 0x000001a8, 0x000001e8,
434 0x00000028, 0x00000068, 0x00000189, 0x000001c9, 0x00000009,
435 0x00000049, 0x00000089, 0x00000170, 0x000001b0, 0x000001f0,
436 0x00000030, 0x00000070, 0x00000191, 0x000001d1, 0x00000011,
437 0x00000051, 0x00000091, 0x000001b8, 0x000001f8, 0x00000038,
438 0x00000078, 0x00000199, 0x000001d9, 0x00000019, 0x00000059,
439 0x00000099, 0x000000d9, 0x000000f9, 0x000000f9, 0x000000f9,
440 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
441 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
442 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
443 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
444 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
445 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
446 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
447 0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
448 0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
449 0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
450 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
451 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
452 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
453 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
454 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
455 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
456 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
457 0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
458 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
459 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
460 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
461 0x00000000, 0x00000008, 0x00000440, 0xd6be4788, 0x012e8160,
462 0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
463 0x00000400, 0x000009b5, 0x00000000, 0x00000108, 0x3f3f3f3f,
464 0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
465 0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
466 0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a9caa,
467 0x1ce739ce, 0x051701ce, 0x18010000, 0x30032602, 0x48073e06,
468 0x560b4c0a, 0x641a600f, 0x7a4f6e1b, 0x8c5b7e5a, 0x9d0f96cf,
469 0xb51fa69f, 0xcb3fbd07, 0x0000d7bf, 0x00000000, 0x00000000,
470 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
471 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
472 0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
473 0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
474 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
475 0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
476 0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a65, 0x0510001c,
477 0x00009b40, 0x012e8160, 0x09249126, 0x00180a65, 0x0510001c,
478 0x00009b40, 0x012e8160, 0x09249126, 0x0001c600, 0x004b6a8e,
479 0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
480 0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
481 0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
484 static const uint32_t ar5416_phy_vals_5ghz_40mhz[] = {
485 0x00000007, 0x000003c4, 0x00000000, 0xad848e19, 0x7d14e000,
486 0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
487 0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
488 0x00200400, 0x206a002e, 0x13721c1e, 0x001a6a65, 0x1284233c,
489 0x6c48b4e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd10,
490 0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
491 0x00000000, 0x000007d0, 0x00000230, 0x10000fff, 0x0510081c,
492 0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
493 0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
494 0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
495 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
496 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
497 0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
498 0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
499 0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
500 0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
501 0x00000000, 0x00000040, 0x00000080, 0x000001a1, 0x000001e1,
502 0x00000021, 0x00000061, 0x00000168, 0x000001a8, 0x000001e8,
503 0x00000028, 0x00000068, 0x00000189, 0x000001c9, 0x00000009,
504 0x00000049, 0x00000089, 0x00000170, 0x000001b0, 0x000001f0,
505 0x00000030, 0x00000070, 0x00000191, 0x000001d1, 0x00000011,
506 0x00000051, 0x00000091, 0x000001b8, 0x000001f8, 0x00000038,
507 0x00000078, 0x00000199, 0x000001d9, 0x00000019, 0x00000059,
508 0x00000099, 0x000000d9, 0x000000f9, 0x000000f9, 0x000000f9,
509 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
510 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
511 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
512 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
513 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
514 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
515 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
516 0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
517 0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
518 0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
519 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
520 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
521 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
522 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
523 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
524 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
525 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
526 0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
527 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
528 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
529 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
530 0x00000000, 0x00000008, 0x00000440, 0xd6be4788, 0x012e8160,
531 0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
532 0x00000400, 0x000009b5, 0x00000000, 0x00000210, 0x3f3f3f3f,
533 0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
534 0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
535 0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a9caa,
536 0x1ce739ce, 0x051701ce, 0x18010000, 0x30032602, 0x48073e06,
537 0x560b4c0a, 0x641a600f, 0x7a4f6e1b, 0x8c5b7e5a, 0x9d0f96cf,
538 0xb51fa69f, 0xcb3fbcbf, 0x0000d7bf, 0x00000000, 0x00000000,
539 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
540 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
541 0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
542 0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
543 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
544 0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
545 0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a65, 0x0510001c,
546 0x00009b40, 0x012e8160, 0x09249126, 0x00180a65, 0x0510001c,
547 0x00009b40, 0x012e8160, 0x09249126, 0x0001c600, 0x004b6a8e,
548 0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
549 0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
550 0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
553 static const uint32_t ar5416_phy_vals_2ghz_40mhz[] = {
554 0x00000007, 0x000003c4, 0x00000000, 0xad848e19, 0x7d14e000,
555 0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
556 0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
557 0x00200400, 0x206a002e, 0x13721c24, 0x00197a68, 0x1284233c,
558 0x6c48b0e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd20,
559 0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
560 0x00000000, 0x00000898, 0x00000268, 0x10000fff, 0x0510001c,
561 0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
562 0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
563 0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
564 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
565 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
566 0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
567 0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
568 0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
569 0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
570 0x00000000, 0x00000040, 0x00000080, 0x00000141, 0x00000181,
571 0x000001c1, 0x00000001, 0x00000041, 0x000001a8, 0x000001e8,
572 0x00000028, 0x00000068, 0x000000a8, 0x00000169, 0x000001a9,
573 0x000001e9, 0x00000029, 0x00000069, 0x00000190, 0x000001d0,
574 0x00000010, 0x00000050, 0x00000090, 0x00000151, 0x00000191,
575 0x000001d1, 0x00000011, 0x00000051, 0x00000198, 0x000001d8,
576 0x00000018, 0x00000058, 0x00000098, 0x00000159, 0x00000199,
577 0x000001d9, 0x00000019, 0x00000059, 0x00000099, 0x000000d9,
578 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
579 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
580 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
581 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
582 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
583 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
584 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
585 0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
586 0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
587 0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
588 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
589 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
590 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
591 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
592 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
593 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
594 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
595 0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
596 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
597 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
598 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
599 0x00000000, 0x0000000e, 0x00000440, 0xd03e4788, 0x012a8160,
600 0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
601 0x00000400, 0x000009b5, 0x00000000, 0x00000210, 0x3f3f3f3f,
602 0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
603 0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
604 0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a7caa,
605 0x1ce739ce, 0x051701ce, 0x18010000, 0x2e032402, 0x4a0a3c06,
606 0x621a540b, 0x764f6c1b, 0x845b7a5a, 0x950f8ccf, 0xa5cf9b4f,
607 0xbddfaf1f, 0xd1ffc93f, 0x00000000, 0x00000000, 0x00000000,
608 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
609 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
610 0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
611 0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
612 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
613 0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
614 0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a68, 0x0510001c,
615 0x00009b40, 0x012a8160, 0x09249126, 0x00180a68, 0x0510001c,
616 0x00009b40, 0x012a8160, 0x09249126, 0x0001c600, 0x004b6a8e,
617 0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
618 0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
619 0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
622 static const uint32_t ar5416_phy_vals_2ghz_20mhz[] = {
623 0x00000007, 0x00000300, 0x00000000, 0xad848e19, 0x7d14e000,
624 0x9c0a9f6b, 0x00000090, 0x00000000, 0x02020200, 0x00000e0e,
625 0x0a020001, 0x0000a000, 0x00000000, 0x00000e0e, 0x00000007,
626 0x00200400, 0x206a002e, 0x137216a4, 0x00197a68, 0x1284233c,
627 0x6c48b0e4, 0x00000859, 0x7ec80d2e, 0x31395c5e, 0x0004dd20,
628 0x409a4190, 0x050cb081, 0x00000000, 0x00000000, 0x00000000,
629 0x00000000, 0x00000898, 0x00000134, 0x10000fff, 0x0510001c,
630 0xd0058a15, 0x00000001, 0x00000004, 0x3f3f3f3f, 0x3f3f3f3f,
631 0x0000007f, 0xdfb81020, 0x9280b212, 0x00020028, 0x5d50e188,
632 0x00081fff, 0x00009b40, 0x00001120, 0x190fb515, 0x00000000,
633 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
634 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
635 0x00000000, 0x00000007, 0x001fff00, 0x006f00c4, 0x03051000,
636 0x00000820, 0x038919be, 0x06336f77, 0x60f6532c, 0x08f186c8,
637 0x00046384, 0x00000000, 0x00000000, 0x00000000, 0x00000200,
638 0x64646464, 0x3c787878, 0x000000aa, 0x00000000, 0x00001042,
639 0x00000000, 0x00000040, 0x00000080, 0x00000141, 0x00000181,
640 0x000001c1, 0x00000001, 0x00000041, 0x000001a8, 0x000001e8,
641 0x00000028, 0x00000068, 0x000000a8, 0x00000169, 0x000001a9,
642 0x000001e9, 0x00000029, 0x00000069, 0x00000190, 0x000001d0,
643 0x00000010, 0x00000050, 0x00000090, 0x00000151, 0x00000191,
644 0x000001d1, 0x00000011, 0x00000051, 0x00000198, 0x000001d8,
645 0x00000018, 0x00000058, 0x00000098, 0x00000159, 0x00000199,
646 0x000001d9, 0x00000019, 0x00000059, 0x00000099, 0x000000d9,
647 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
648 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
649 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
650 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9,
651 0x000000f9, 0x000000f9, 0x000000f9, 0x000000f9, 0x00000000,
652 0x00000001, 0x00000002, 0x00000003, 0x00000004, 0x00000005,
653 0x00000008, 0x00000009, 0x0000000a, 0x0000000b, 0x0000000c,
654 0x0000000d, 0x00000010, 0x00000011, 0x00000012, 0x00000013,
655 0x00000014, 0x00000015, 0x00000018, 0x00000019, 0x0000001a,
656 0x0000001b, 0x0000001c, 0x0000001d, 0x00000020, 0x00000021,
657 0x00000022, 0x00000023, 0x00000024, 0x00000025, 0x00000028,
658 0x00000029, 0x0000002a, 0x0000002b, 0x0000002c, 0x0000002d,
659 0x00000030, 0x00000031, 0x00000032, 0x00000033, 0x00000034,
660 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
661 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
662 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
663 0x00000035, 0x00000035, 0x00000035, 0x00000035, 0x00000035,
664 0x00000035, 0x00000010, 0x0000001a, 0x00000000, 0x00000000,
665 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
666 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
667 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
668 0x00000000, 0x0000000e, 0x00000440, 0xd03e4788, 0x012a8160,
669 0x40806333, 0x00106c10, 0x009c4060, 0x1883800a, 0x018830c6,
670 0x00000400, 0x000009b5, 0x00000000, 0x00000108, 0x3f3f3f3f,
671 0x3f3f3f3f, 0x13c889af, 0x38490a20, 0x00007bb6, 0x0fff3ffc,
672 0x00000001, 0x0000a000, 0x00000000, 0x0cc75380, 0x0f0f0f01,
673 0xdfa91f01, 0x00418a11, 0x00000000, 0x09249126, 0x0a1a7caa,
674 0x1ce739ce, 0x051701ce, 0x18010000, 0x2e032402, 0x4a0a3c06,
675 0x621a540b, 0x764f6c1b, 0x845b7a5a, 0x950f8ccf, 0xa5cf9b4f,
676 0xbddfaf1f, 0xd1ffc93f, 0x00000000, 0x00000000, 0x00000000,
677 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
678 0x3fffffff, 0x3fffffff, 0x3fffffff, 0x0003ffff, 0x79a8aa1f,
679 0x08000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x1ce739ce, 0x000001ce,
680 0x00000007, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
681 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
682 0x00000000, 0x00000000, 0x3f3f3f3f, 0x3f3f3f3f, 0x3f3f3f3f,
683 0x00000000, 0x1ce739ce, 0x000000c0, 0x00180a68, 0x0510001c,
684 0x00009b40, 0x012a8160, 0x09249126, 0x00180a68, 0x0510001c,
685 0x00009b40, 0x012a8160, 0x09249126, 0x0001c600, 0x004b6a8e,
686 0x000003ce, 0x00181400, 0x00820820, 0x066c420f, 0x0f282207,
687 0x17601685, 0x1f801104, 0x37a00c03, 0x3fc40883, 0x57c00803,
688 0x5fd80682, 0x7fe00482, 0x7f3c7bba, 0xf3307ff0
691 /* NB: apply AR_PHY(). */
692 static const uint8_t ar5416_banks_regs[] = {
693 0x2c, 0x38, 0x2c, 0x3b, 0x2c, 0x38, 0x3c, 0x2c, 0x3a, 0x2c, 0x39,
694 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
695 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
696 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
697 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c,
698 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x38, 0x2c, 0x2c,
702 static const uint32_t ar5416_banks_vals_5ghz[] = {
703 0x1e5795e5, 0x02008020, 0x02108421, 0x00000008, 0x0e73ff17,
704 0x00000420, 0x01400018, 0x000001a1, 0x00000001, 0x00000013,
705 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
706 0x00000000, 0x00004000, 0x00006c00, 0x00002c00, 0x00004800,
707 0x00004000, 0x00006000, 0x00001000, 0x00004000, 0x00007c00,
708 0x00007c00, 0x00007c00, 0x00007c00, 0x00007c00, 0x00087c00,
709 0x00007c00, 0x00005400, 0x00000c00, 0x00001800, 0x00007c00,
710 0x00006c00, 0x00006c00, 0x00007c00, 0x00002c00, 0x00003c00,
711 0x00003800, 0x00001c00, 0x00000800, 0x00000408, 0x00004c15,
712 0x00004188, 0x0000201e, 0x00010408, 0x00000801, 0x00000c08,
713 0x0000181e, 0x00001016, 0x00002800, 0x00004010, 0x0000081c,
714 0x00000115, 0x00000015, 0x00000066, 0x0000001c, 0x00000000,
715 0x00000004, 0x00000015, 0x0000001f, 0x00000000, 0x000000a0,
716 0x00000000, 0x00000040, 0x0000001c
719 static const uint32_t ar5416_banks_vals_2ghz[] = {
720 0x1e5795e5, 0x02008020, 0x02108421, 0x00000008, 0x0e73ff17,
721 0x00000420, 0x01c00018, 0x000001a1, 0x00000001, 0x00000013,
722 0x00000002, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
723 0x00000000, 0x00004000, 0x00006c00, 0x00002c00, 0x00004800,
724 0x00004000, 0x00006000, 0x00001000, 0x00004000, 0x00007c00,
725 0x00007c00, 0x00007c00, 0x00007c00, 0x00007c00, 0x00087c00,
726 0x00007c00, 0x00005400, 0x00000c00, 0x00001800, 0x00007c00,
727 0x00006c00, 0x00006c00, 0x00007c00, 0x00002c00, 0x00003c00,
728 0x00003800, 0x00001c00, 0x00000800, 0x00000408, 0x00004c15,
729 0x00004188, 0x0000201e, 0x00010408, 0x00000801, 0x00000c08,
730 0x0000181e, 0x00001016, 0x00002800, 0x00004010, 0x0000081c,
731 0x00000115, 0x00000015, 0x00000066, 0x0000001c, 0x00000000,
732 0x00000004, 0x00000015, 0x0000001f, 0x00000400, 0x000000a0,
733 0x00000000, 0x00000040, 0x0000001c
739 /* Possible flags for opCapFlags. */
740 #define AR5416_OPFLAGS_11A 0x01
741 #define AR5416_OPFLAGS_11G 0x02
742 #define AR5416_OPFLAGS_5G_HT40 0x04
743 #define AR5416_OPFLAGS_2G_HT40 0x08
744 #define AR5416_OPFLAGS_5G_HT20 0x10
745 #define AR5416_OPFLAGS_2G_HT20 0x20
747 #define AR5416_NUM_5G_CAL_PIERS 8
748 #define AR5416_NUM_2G_CAL_PIERS 4
749 #define AR5416_NUM_5G_20_TARGET_POWERS 8
750 #define AR5416_NUM_5G_40_TARGET_POWERS 8
751 #define AR5416_NUM_2G_CCK_TARGET_POWERS 3
752 #define AR5416_NUM_2G_20_TARGET_POWERS 4
753 #define AR5416_NUM_2G_40_TARGET_POWERS 4
754 #define AR5416_NUM_CTLS 24
755 #define AR5416_NUM_BAND_EDGES 8
756 #define AR5416_NUM_PD_GAINS 4
757 #define AR5416_PD_GAIN_ICEPTS 5
758 #define AR5416_EEPROM_MODAL_SPURS 5
759 #define AR5416_MAX_CHAINS 2
761 struct BaseEepHeader {
772 uint16_t blueToothOptions;
774 uint32_t binBuildNumber;
776 uint8_t futureBase[33];
779 struct spurChanStruct {
781 uint8_t spurRangeLow;
782 uint8_t spurRangeHigh;
785 struct ModalEepHeader {
786 uint32_t antCtrlChain[AR5416_MAX_CHAINS];
787 uint32_t antCtrlCommon;
788 int8_t antennaGainCh[AR5416_MAX_CHAINS];
789 uint8_t switchSettling;
790 uint8_t txRxAttenCh[AR5416_MAX_CHAINS];
791 uint8_t rxTxMarginCh[AR5416_MAX_CHAINS];
792 uint8_t adcDesiredSize;
793 int8_t pgaDesiredSize;
794 uint8_t xlnaGainCh[AR5416_MAX_CHAINS];
795 uint8_t txEndToXpaOff;
797 uint8_t txFrameToXpaOn;
799 uint8_t noiseFloorThreshCh[AR5416_MAX_CHAINS];
802 int8_t iqCalICh[AR5416_MAX_CHAINS];
803 int8_t iqCalQCh[AR5416_MAX_CHAINS];
804 uint8_t pdGainOverlap;
808 uint8_t pwrDecreaseFor2Chain;
809 uint8_t pwrDecreaseFor3Chain;
810 uint8_t txFrameToDataStart;
811 uint8_t txFrameToPaOn;
812 uint8_t ht40PowerIncForPdadc;
813 uint8_t bswAtten[AR5416_MAX_CHAINS];
814 uint8_t bswMargin[AR5416_MAX_CHAINS];
815 uint8_t swSettleHt40;
816 uint8_t futureModal[22];
817 struct spurChanStruct spurChans[AR5416_EEPROM_MODAL_SPURS];
820 struct calDataPerFreq {
821 uint8_t pwrPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
822 uint8_t vpdPdg[AR5416_NUM_PD_GAINS][AR5416_PD_GAIN_ICEPTS];
825 struct CalTargetPowerLegacy {
830 struct CalTargetPowerHt {
841 struct CalCtlEdges ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES];
844 struct ar5416eeprom {
845 struct BaseEepHeader baseEepHeader;
846 uint8_t custData[64];
847 struct ModalEepHeader modalHeader[2];
848 uint8_t calFreqPier5G[AR5416_NUM_5G_CAL_PIERS];
849 uint8_t calFreqPier2G[AR5416_NUM_2G_CAL_PIERS];
850 struct calDataPerFreq calPierData5G[AR5416_MAX_CHAINS]
851 [AR5416_NUM_5G_CAL_PIERS];
852 struct calDataPerFreq calPierData2G[AR5416_MAX_CHAINS]
853 [AR5416_NUM_2G_CAL_PIERS];
854 struct CalTargetPowerLegacy calTPow5G[AR5416_NUM_5G_20_TARGET_POWERS];
855 struct CalTargetPowerHt calTPow5GHT20[AR5416_NUM_5G_20_TARGET_POWERS];
856 struct CalTargetPowerHt calTPow5GHT40[AR5416_NUM_5G_40_TARGET_POWERS];
857 struct CalTargetPowerLegacy calTPowCck[AR5416_NUM_2G_CCK_TARGET_POWERS];
858 struct CalTargetPowerLegacy calTPow2G[AR5416_NUM_2G_20_TARGET_POWERS];
859 struct CalTargetPowerHt calTPow2GHT20[AR5416_NUM_2G_20_TARGET_POWERS];
860 struct CalTargetPowerHt calTPow2GHT40[AR5416_NUM_2G_40_TARGET_POWERS];
861 uint8_t ctlIndex[AR5416_NUM_CTLS];
862 struct CalCtlData ctlData[AR5416_NUM_CTLS];
866 #define OTUS_NUM_CHAINS 2
868 #define OTUS_UID(aid) (IEEE80211_AID(aid) + 4)
870 #define OTUS_MAX_TXCMDSZ 64
871 #define OTUS_RXBUFSZ (8 * 1024)
872 /* Bumped for later A-MSDU and legacy fast-frames TX support */
873 #define OTUS_TXBUFSZ (8 * 1024)
875 /* Default EDCA parameters for when QoS is disabled. */
876 static const struct wmeParams otus_edca_def[WME_NUM_AC] = {
883 #define OTUS_RIDX_CCK1 0
884 #define OTUS_RIDX_OFDM6 4
885 #define OTUS_RIDX_OFDM24 8
886 #define OTUS_RIDX_MAX 11
887 static const struct otus_rate {
905 struct otus_rx_radiotap_header {
906 struct ieee80211_radiotap_header wr_ihdr;
909 uint16_t wr_chan_freq;
910 uint16_t wr_chan_flags;
911 uint8_t wr_antsignal;
912 } __packed __aligned(8);
914 #define OTUS_RX_RADIOTAP_PRESENT \
915 (1 << IEEE80211_RADIOTAP_FLAGS | \
916 1 << IEEE80211_RADIOTAP_RATE | \
917 1 << IEEE80211_RADIOTAP_CHANNEL | \
918 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
920 struct otus_tx_radiotap_header {
921 struct ieee80211_radiotap_header wt_ihdr;
924 uint16_t wt_chan_freq;
925 uint16_t wt_chan_flags;
928 #define OTUS_TX_RADIOTAP_PRESENT \
929 (1 << IEEE80211_RADIOTAP_FLAGS | \
930 1 << IEEE80211_RADIOTAP_RATE | \
931 1 << IEEE80211_RADIOTAP_CHANNEL)
935 /* Firmware commands */
942 STAILQ_ENTRY(otus_tx_cmd) next_cmd;
947 struct otus_softc *sc;
951 struct ieee80211_node *ni;
952 STAILQ_ENTRY(otus_data) next;
956 struct ieee80211_node ni;
962 #define OTUS_CONFIG_INDEX 0
963 #define OTUS_IFACE_INDEX 0
966 * The carl9170 firmware has the following specification:
985 struct ieee80211vap vap;
986 int (*newstate)(struct ieee80211vap *,
987 enum ieee80211_state, int);
989 #define OTUS_VAP(vap) ((struct otus_vap *)(vap))
990 #define OTUS_NODE(ni) ((struct otus_node *)(ni))
992 #define OTUS_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
993 #define OTUS_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
994 #define OTUS_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
995 #define OTUS_UNLOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_NOTOWNED)
997 /* XXX the TX/RX endpoint dump says it's 0x200, (512)? */
998 #define OTUS_MAX_TXSZ 512
999 #define OTUS_MAX_RXSZ 512
1000 /* intr/cmd endpoint dump says 0x40 */
1001 #define OTUS_MAX_CTRLSZ 64
1003 #define OTUS_CMD_LIST_COUNT 32
1004 #define OTUS_RX_LIST_COUNT 128
1005 #define OTUS_TX_LIST_COUNT 32
1008 struct ieee80211com sc_ic;
1009 struct ieee80211_ratectl_tx_stats sc_txs;
1010 struct mbufq sc_snd;
1012 struct usb_device *sc_udev;
1013 int (*sc_newstate)(struct ieee80211com *,
1014 enum ieee80211_state, int);
1015 void (*sc_led_newstate)(struct otus_softc *);
1016 struct usbd_interface *sc_iface;
1019 struct ar5416eeprom eeprom;
1032 struct ieee80211_channel *sc_curchan;
1034 struct task tx_task;
1035 struct timeout_task scan_to;
1036 struct timeout_task calib_to;
1038 /* register batch writes */
1043 /* current firmware message serial / token number */
1046 /* current noisefloor, from SET_FREQUENCY */
1047 int sc_nf[OTUS_NUM_CHAINS];
1049 /* How many pending, active transmit frames */
1050 int sc_tx_n_pending;
1053 const uint32_t *phy_vals;
1058 } __packed write_buf[AR_MAX_WRITE_IDX + 1];
1060 struct otus_data sc_rx[OTUS_RX_LIST_COUNT];
1061 struct otus_data sc_tx[OTUS_TX_LIST_COUNT];
1062 struct otus_tx_cmd sc_cmd[OTUS_CMD_LIST_COUNT];
1064 struct usb_xfer *sc_xfer[OTUS_N_XFER];
1066 /* Last seen PLCP header; for A-MPDU decap */
1067 uint8_t ar_last_rx_plcp[AR_PLCP_HDR_LEN];
1069 STAILQ_HEAD(, otus_data) sc_rx_active;
1070 STAILQ_HEAD(, otus_data) sc_rx_inactive;
1071 STAILQ_HEAD(, otus_data) sc_tx_active[OTUS_N_XFER];
1072 STAILQ_HEAD(, otus_data) sc_tx_inactive;
1073 STAILQ_HEAD(, otus_data) sc_tx_pending[OTUS_N_XFER];
1075 STAILQ_HEAD(, otus_tx_cmd) sc_cmd_active;
1076 STAILQ_HEAD(, otus_tx_cmd) sc_cmd_inactive;
1077 STAILQ_HEAD(, otus_tx_cmd) sc_cmd_pending;
1078 STAILQ_HEAD(, otus_tx_cmd) sc_cmd_waiting;
1081 struct otus_rx_radiotap_header th;
1084 #define sc_rxtap sc_rxtapu.th
1087 struct otus_tx_radiotap_header th;
1090 #define sc_txtap sc_txtapu.th
1093 #endif /* __IF_OTUSREG_H__ */