]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/otus/if_otusreg.h
Merge llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp
[FreeBSD/FreeBSD.git] / sys / dev / otus / if_otusreg.h
1 /*      $OpenBSD: if_otusreg.h,v 1.9 2013/11/26 20:33:18 deraadt Exp $  */
2
3 /*-
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>
7  *
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.
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  * $FreeBSD$
21  */
22 #ifndef __IF_OTUSREG_H__
23 #define __IF_OTUSREG_H__
24
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)
30
31 /* USB Requests. */
32 #define AR_FW_DOWNLOAD                  0x30
33 #define AR_FW_DOWNLOAD_COMPLETE         0x31
34
35 /* Maximum number of writes that can fit in a single FW command is 7. */
36 #define AR_MAX_WRITE_IDX        6       /* 56 bytes */
37
38 #define AR_FW_INIT_ADDR                 0x102800
39 #define AR_FW_MAIN_ADDR                 0x200000
40 #define AR_USB_MODE_CTRL                0x1e1108
41
42 /*
43  * AR9170 MAC registers.
44  */
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)
101
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)
107
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)
117
118 #define AR_LED0_ON      (1 << 0)
119 #define AR_LED1_ON      (1 << 1)
120
121 /*
122  * PHY registers.
123  */
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)
155
156 #define AR_SEEPROM_HW_TYPE_OFFSET       0x1374
157 #define AR_EEPROM_OFFSET                0x1600
158
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)
163
164 /*
165  * Random number generator.
166  */
167 #define AR_RAND_REG_BASE                0x1d0000
168
169 /*
170  * GPIO.
171  */
172 #define AR_GPIO_REG_BASE                0x1d0100
173
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
180
181 /*
182  * Power Management.
183  */
184 #define AR_PWR_REG_BASE                 0x1d4000
185
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)
189
190 /* Tx descriptor. */
191 struct ar_tx_head {
192         uint16_t        len;
193         uint16_t        macctl;
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)
201
202         uint32_t        phyctl;
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)
218 } __packed;
219
220 /* USB Rx stream mode header. */
221 struct ar_rx_head {
222         uint16_t        len;
223         uint16_t        tag;
224 #define AR_RX_HEAD_TAG  0x4e00
225 } __packed;
226
227 /* Rx descriptor. */
228
229 struct ar_rx_macstatus {
230         uint8_t         sa_idx;
231         uint8_t         da_idx;
232         uint8_t         error;
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)
240         uint8_t         status;
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
252 } __packed;
253
254 struct ar_rx_phystatus {
255         uint8_t         rssi_ant[3];
256         uint8_t         rssi_ant_ext[3];
257         uint8_t         rssi;           /* Combined RSSI. */
258         uint8_t         evm[2][6];      /* Error Vector Magnitude. */
259         uint8_t         phy_err;
260 } __packed;
261
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
267 };
268
269 /* Firmware command/reply header. */
270 struct ar_cmd_hdr {
271         uint8_t         len;
272         uint8_t         code;
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
307
308         uint16_t        token;  /* Driver private data. */
309 } __packed;
310
311 /* Structure for command AR_CMD_RF_INIT/AR_CMD_FREQUENCY. */
312 struct ar_cmd_frequency {
313         uint32_t        freq;
314         uint32_t        dynht2040;
315         uint32_t        htena;
316         uint32_t        dsc_exp;
317         uint32_t        dsc_man;
318         uint32_t        dsc_shgi_exp;
319         uint32_t        dsc_shgi_man;
320         uint32_t        check_loop_count;
321 } __packed;
322
323 /* Firmware reply for command AR_CMD_FREQUENCY. */
324 struct ar_rsp_frequency {
325         uint32_t        status;
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. */
329
330         uint32_t        nf[3];          /* Noisefloor. */
331         uint32_t        nf_ext[3];      /* Noisefloor ext. */
332 } __packed;
333
334 /* Structure for command AR_CMD_EKEY. */
335 struct ar_cmd_ekey {
336         uint16_t        uid;    /* user ID */
337         uint16_t        kix;
338         uint16_t        cipher;
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
346
347         uint8_t         macaddr[IEEE80211_ADDR_LEN];
348         uint8_t         key[16];
349 } __packed;
350
351 /* Structure for event AR_EVT_TX_COMP. */
352 struct ar_evt_tx_comp {
353         uint8_t         macaddr[IEEE80211_ADDR_LEN];
354         uint32_t        phy;
355         uint16_t        status;
356 #define AR_TX_STATUS_COMP       0
357 #define AR_TX_STATUS_RETRY_COMP 1
358 #define AR_TX_STATUS_FAILED     2
359 } __packed;
360
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
366 };
367
368 /*
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).
372  */
373
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
413 };
414
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
482 };
483
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
551 };
552
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
620 };
621
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
689 };
690
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,
699         0x2c, 0x3c
700 };
701
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
717 };
718
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
734 };
735
736 /*
737  * EEPROM.
738  */
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
746
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
760
761 struct BaseEepHeader {
762         uint16_t        length;
763         uint16_t        checksum;
764         uint16_t        version;
765         uint8_t         opCapFlags;
766         uint8_t         eepMisc;
767         uint16_t        regDmn[2];
768         uint8_t         macAddr[6];
769         uint8_t         rxMask;
770         uint8_t         txMask;
771         uint16_t        rfSilent;
772         uint16_t        blueToothOptions;
773         uint16_t        deviceCap;
774         uint32_t        binBuildNumber;
775         uint8_t         deviceType;
776         uint8_t         futureBase[33];
777 } __packed;
778
779 struct spurChanStruct {
780         uint16_t        spurChan;
781         uint8_t         spurRangeLow;
782         uint8_t         spurRangeHigh;
783 } __packed;
784
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;
796         uint8_t         txEndToRxOn;
797         uint8_t         txFrameToXpaOn;
798         uint8_t         thresh62;
799         uint8_t         noiseFloorThreshCh[AR5416_MAX_CHAINS];
800         uint8_t         xpdGain;
801         uint8_t         xpd;
802         int8_t          iqCalICh[AR5416_MAX_CHAINS];
803         int8_t          iqCalQCh[AR5416_MAX_CHAINS];
804         uint8_t         pdGainOverlap;
805         uint8_t         ob;
806         uint8_t         db;
807         uint8_t         xpaBiasLvl;
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];
818 } __packed;
819
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];
823 } __packed;
824
825 struct CalTargetPowerLegacy {
826         uint8_t         bChannel;
827         uint8_t         tPow2x[4];
828 } __packed;
829
830 struct CalTargetPowerHt {
831         uint8_t         bChannel;
832         uint8_t         tPow2x[8];
833 } __packed;
834
835 struct CalCtlEdges {
836         uint8_t         bChannel;
837         uint8_t         tPowerFlag;
838 } __packed;
839
840 struct CalCtlData {
841         struct CalCtlEdges ctlEdges[AR5416_MAX_CHAINS][AR5416_NUM_BAND_EDGES];
842 } __packed;
843
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];
863         uint8_t                 padding;
864 } __packed;
865
866 #define OTUS_NUM_CHAINS                 2
867
868 #define OTUS_UID(aid)           (IEEE80211_AID(aid) + 4)
869
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)
874
875 /* Default EDCA parameters for when QoS is disabled. */
876 static const struct wmeParams otus_edca_def[WME_NUM_AC] = {
877         { 4, 10, 3,  0 },
878         { 4, 10, 7,  0 },
879         { 3,  4, 2, 94 },
880         { 2,  3, 2, 47 }
881 };
882
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 {
888         uint8_t rate;
889         uint8_t mcs;
890 } otus_rates[] = {
891         {   2, 0x0 },
892         {   4, 0x1 },
893         {  11, 0x2 },
894         {  22, 0x3 },
895         {  12, 0xb },
896         {  18, 0xf },
897         {  24, 0xa },
898         {  36, 0xe },
899         {  48, 0x9 },
900         {  72, 0xd },
901         {  96, 0x8 },
902         { 108, 0xc }
903 };
904
905 struct otus_rx_radiotap_header {
906         struct ieee80211_radiotap_header wr_ihdr;
907         uint8_t         wr_flags;
908         uint8_t         wr_rate;
909         uint16_t        wr_chan_freq;
910         uint16_t        wr_chan_flags;
911         uint8_t         wr_antsignal;
912 } __packed __aligned(8);
913
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)
919
920 struct otus_tx_radiotap_header {
921         struct ieee80211_radiotap_header wt_ihdr;
922         uint8_t         wt_flags;
923         uint8_t         wt_rate;
924         uint16_t        wt_chan_freq;
925         uint16_t        wt_chan_flags;
926 } __packed;
927
928 #define OTUS_TX_RADIOTAP_PRESENT                        \
929         (1 << IEEE80211_RADIOTAP_FLAGS |                \
930          1 << IEEE80211_RADIOTAP_RATE |                 \
931          1 << IEEE80211_RADIOTAP_CHANNEL)
932
933 struct otus_softc;
934
935 /* Firmware commands */
936 struct otus_tx_cmd {
937         uint8_t                 *buf;
938         uint16_t                buflen;
939         void                    *odata;
940         uint16_t                odatalen;
941         uint16_t                token;
942         STAILQ_ENTRY(otus_tx_cmd)       next_cmd;
943 };
944
945 /* TX, RX buffers */
946 struct otus_data {
947         struct otus_softc       *sc;
948         uint8_t                 *buf;
949         uint16_t                buflen;
950         struct mbuf             *m;
951         struct ieee80211_node   *ni;
952         STAILQ_ENTRY(otus_data) next;
953 };
954
955 struct otus_node {
956         struct ieee80211_node           ni;
957         uint64_t                        tx_done;
958         uint64_t                        tx_err;
959         uint64_t                        tx_retries;
960 };
961
962 #define OTUS_CONFIG_INDEX               0
963 #define OTUS_IFACE_INDEX                0
964
965 /*
966  * The carl9170 firmware has the following specification:
967  *
968  * 0 - USB control
969  * 1 - TX
970  * 2 - RX
971  * 3 - IRQ
972  * 4 - CMD
973  * ..
974  * 10 - end
975  */
976 enum {
977         OTUS_BULK_TX,
978         OTUS_BULK_RX,
979         OTUS_BULK_IRQ,
980         OTUS_BULK_CMD,
981         OTUS_N_XFER
982 };
983
984 struct otus_vap {
985         struct ieee80211vap     vap;
986         int                     (*newstate)(struct ieee80211vap *,
987                                     enum ieee80211_state, int);
988 };
989 #define OTUS_VAP(vap)           ((struct otus_vap *)(vap))
990 #define OTUS_NODE(ni)           ((struct otus_node *)(ni))
991
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)
996
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
1002
1003 #define OTUS_CMD_LIST_COUNT     32
1004 #define OTUS_RX_LIST_COUNT      128
1005 #define OTUS_TX_LIST_COUNT      32
1006
1007 struct otus_softc {
1008         struct ieee80211com             sc_ic;
1009         struct ieee80211_ratectl_tx_stats sc_txs;
1010         struct mbufq                    sc_snd;
1011         device_t                        sc_dev;
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;
1017         struct mtx                      sc_mtx;
1018
1019         struct ar5416eeprom             eeprom;
1020         uint8_t                         capflags;
1021         uint8_t                         rxmask;
1022         uint8_t                         txmask;
1023         int                             sc_running:1,
1024                                         sc_calibrating:1,
1025                                         sc_scanning:1;
1026
1027         int                             sc_if_flags;
1028         int                             sc_tx_timer;
1029         int                             fixed_ridx;
1030         int                             bb_reset;
1031
1032         struct ieee80211_channel        *sc_curchan;
1033
1034         struct task                     tx_task;
1035         struct timeout_task             scan_to;
1036         struct timeout_task             calib_to;
1037
1038         /* register batch writes */
1039         int                             write_idx;
1040
1041         uint32_t                        led_state;
1042
1043         /* current firmware message serial / token number */
1044         int                             token;
1045
1046         /* current noisefloor, from SET_FREQUENCY */
1047         int                             sc_nf[OTUS_NUM_CHAINS];
1048
1049         /* How many pending, active transmit frames */
1050         int                             sc_tx_n_pending;
1051         int                             sc_tx_n_active;
1052
1053         const uint32_t                  *phy_vals;
1054
1055         struct {
1056                 uint32_t        reg;
1057                 uint32_t        val;
1058         } __packed                      write_buf[AR_MAX_WRITE_IDX + 1];
1059
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];
1063
1064         struct usb_xfer                 *sc_xfer[OTUS_N_XFER];
1065
1066         /* Last seen PLCP header; for A-MPDU decap */
1067         uint8_t ar_last_rx_plcp[AR_PLCP_HDR_LEN];
1068
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];
1074
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;
1079
1080         union {
1081                 struct otus_rx_radiotap_header th;
1082                 uint8_t pad[64];
1083         }                               sc_rxtapu;
1084 #define sc_rxtap        sc_rxtapu.th
1085
1086         union {
1087                 struct otus_tx_radiotap_header th;
1088                 uint8_t pad[64];
1089         }                               sc_txtapu;
1090 #define sc_txtap        sc_txtapu.th
1091 };
1092
1093 #endif  /* __IF_OTUSREG_H__ */