if_urtwnreg.h revision 289758
1/*-
2 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 *
16 * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $
17 * $FreeBSD: head/sys/dev/usb/wlan/if_urtwnreg.h 289758 2015-10-22 15:42:53Z avos $
18 */
19
20#define URTWN_CONFIG_INDEX	0
21#define URTWN_IFACE_INDEX	0
22
23#define	URTWN_NOISE_FLOOR	-95
24
25#define R92C_MAX_CHAINS	2
26
27/* Maximum number of output pipes is 3. */
28#define R92C_MAX_EPOUT	3
29
30#define R92C_MAX_TX_PWR	0x3f
31
32#define R92C_PUBQ_NPAGES	231
33#define R92C_TXPKTBUF_COUNT	256
34#define R92C_TX_PAGE_COUNT	248
35#define R92C_TX_PAGE_BOUNDARY	(R92C_TX_PAGE_COUNT + 1)
36#define R88E_TXPKTBUF_COUNT	177
37#define R88E_TX_PAGE_COUNT	169
38#define R88E_TX_PAGE_BOUNDARY	(R88E_TX_PAGE_COUNT + 1)
39
40#define R92C_H2C_NBOX	4
41
42/* USB Requests. */
43#define R92C_REQ_REGS	0x05
44
45/*
46 * MAC registers.
47 */
48/* System Configuration. */
49#define R92C_SYS_ISO_CTRL		0x000
50#define R92C_SYS_FUNC_EN		0x002
51#define R92C_APS_FSMCO			0x004
52#define R92C_SYS_CLKR			0x008
53#define R92C_AFE_MISC			0x010
54#define R92C_SPS0_CTRL			0x011
55#define R92C_SPS_OCP_CFG		0x018
56#define R92C_RSV_CTRL			0x01c
57#define R92C_RF_CTRL			0x01f
58#define R92C_LDOA15_CTRL		0x020
59#define R92C_LDOV12D_CTRL		0x021
60#define R92C_LDOHCI12_CTRL		0x022
61#define R92C_LPLDO_CTRL			0x023
62#define R92C_AFE_XTAL_CTRL		0x024
63#define R92C_AFE_PLL_CTRL		0x028
64#define R92C_EFUSE_CTRL			0x030
65#define R92C_EFUSE_TEST			0x034
66#define R92C_PWR_DATA			0x038
67#define R92C_CAL_TIMER			0x03c
68#define R92C_ACLK_MON			0x03e
69#define R92C_GPIO_MUXCFG		0x040
70#define R92C_GPIO_IO_SEL		0x042
71#define R92C_MAC_PINMUX_CFG		0x043
72#define R92C_GPIO_PIN_CTRL		0x044
73#define R92C_GPIO_INTM			0x048
74#define R92C_LEDCFG0			0x04c
75#define R92C_LEDCFG1			0x04d
76#define R92C_LEDCFG2			0x04e
77#define R92C_LEDCFG3			0x04f
78#define R92C_FSIMR			0x050
79#define R92C_FSISR			0x054
80#define R92C_HSIMR			0x058
81#define R92C_HSISR			0x05c
82#define R92C_MCUFWDL			0x080
83#define R92C_HMEBOX_EXT(idx)		(0x088 + (idx) * 2)
84#define R88E_HIMR			0x0b0
85#define R88E_HISR			0x0b4
86#define R88E_HIMRE			0x0b8
87#define R88E_HISRE			0x0bc
88#define R92C_EFUSE_ACCESS               0x0cf
89#define R92C_BIST_SCAN			0x0d0
90#define R92C_BIST_RPT			0x0d4
91#define R92C_BIST_ROM_RPT		0x0d8
92#define R92C_USB_SIE_INTF		0x0e0
93#define R92C_PCIE_MIO_INTF		0x0e4
94#define R92C_PCIE_MIO_INTD		0x0e8
95#define R92C_HPON_FSM			0x0ec
96#define R92C_SYS_CFG			0x0f0
97/* MAC General Configuration. */
98#define R92C_CR				0x100
99#define R92C_PBP			0x104
100#define R92C_TRXDMA_CTRL		0x10c
101#define R92C_TRXFF_BNDY			0x114
102#define R92C_TRXFF_STATUS		0x118
103#define R92C_RXFF_PTR			0x11c
104#define R92C_HIMR			0x120
105#define R92C_HISR			0x124
106#define R92C_HIMRE			0x128
107#define R92C_HISRE			0x12c
108#define R92C_CPWM			0x12f
109#define R92C_FWIMR			0x130
110#define R92C_FWISR			0x134
111#define R92C_PKTBUF_DBG_CTRL		0x140
112#define R92C_PKTBUF_DBG_DATA_L		0x144
113#define R92C_PKTBUF_DBG_DATA_H		0x148
114#define R92C_TC0_CTRL(i)		(0x150 + (i) * 4)
115#define R92C_TCUNIT_BASE		0x164
116#define R92C_MBIST_START		0x174
117#define R92C_MBIST_DONE			0x178
118#define R92C_MBIST_FAIL			0x17c
119#define R92C_C2HEVT_MSG_NORMAL		0x1a0
120#define R92C_C2HEVT_MSG_TEST		0x1b8
121#define R92C_C2HEVT_CLEAR		0x1bf
122#define R92C_MCUTST_1			0x1c0
123#define R92C_FMETHR			0x1c8
124#define R92C_HMETFR			0x1cc
125#define R92C_HMEBOX(idx)		(0x1d0 + (idx) * 4)
126#define R92C_LLT_INIT			0x1e0
127#define R92C_BB_ACCESS_CTRL		0x1e8
128#define R92C_BB_ACCESS_DATA		0x1ec
129#define R88E_HMEBOX_EXT(idx)            (0x1f0 + (idx) * 4)
130/* Tx DMA Configuration. */
131#define R92C_RQPN			0x200
132#define R92C_FIFOPAGE			0x204
133#define R92C_TDECTRL			0x208
134#define R92C_TXDMA_OFFSET_CHK		0x20c
135#define R92C_TXDMA_STATUS		0x210
136#define R92C_RQPN_NPQ			0x214
137/* Rx DMA Configuration. */
138#define R92C_RXDMA_AGG_PG_TH		0x280
139#define R92C_RXPKT_NUM			0x284
140#define R92C_RXDMA_STATUS		0x288
141/* Protocol Configuration. */
142#define R92C_FWHW_TXQ_CTRL		0x420
143#define R92C_HWSEQ_CTRL			0x423
144#define R92C_TXPKTBUF_BCNQ_BDNY		0x424
145#define R92C_TXPKTBUF_MGQ_BDNY		0x425
146#define R92C_SPEC_SIFS			0x428
147#define R92C_RL				0x42a
148#define R92C_DARFRC			0x430
149#define R92C_RARFRC			0x438
150#define R92C_RRSR			0x440
151#define R92C_ARFR(i)			(0x444 + (i) * 4)
152#define R92C_AGGLEN_LMT			0x458
153#define R92C_AMPDU_MIN_SPACE		0x45c
154#define R92C_TXPKTBUF_WMAC_LBK_BF_HD	0x45d
155#define R92C_FAST_EDCA_CTRL		0x460
156#define R92C_RD_RESP_PKT_TH		0x463
157#define R92C_INIRTS_RATE_SEL		0x480
158#define R92C_INIDATA_RATE_SEL(macid)	(0x484 + (macid))
159#define R92C_MAX_AGGR_NUM		0x4ca
160/* EDCA Configuration. */
161#define R92C_EDCA_VO_PARAM		0x500
162#define R92C_EDCA_VI_PARAM		0x504
163#define R92C_EDCA_BE_PARAM		0x508
164#define R92C_EDCA_BK_PARAM		0x50c
165#define R92C_BCNTCFG			0x510
166#define R92C_PIFS			0x512
167#define R92C_RDG_PIFS			0x513
168#define R92C_SIFS_CCK			0x514
169#define R92C_SIFS_OFDM			0x516
170#define R92C_AGGR_BREAK_TIME		0x51a
171#define R92C_SLOT			0x51b
172#define R92C_TX_PTCL_CTRL		0x520
173#define R92C_TXPAUSE			0x522
174#define R92C_DIS_TXREQ_CLR		0x523
175#define R92C_RD_CTRL			0x524
176#define R92C_TBTT_PROHIBIT		0x540
177#define R92C_RD_NAV_NXT			0x544
178#define R92C_NAV_PROT_LEN		0x546
179#define R92C_BCN_CTRL			0x550
180#define R92C_MBID_NUM			0x552
181#define R92C_DUAL_TSF_RST		0x553
182#define R92C_BCN_INTERVAL		0x554
183#define R92C_DRVERLYINT			0x558
184#define R92C_BCNDMATIM			0x559
185#define R92C_ATIMWND			0x55a
186#define R92C_USTIME_TSF			0x55c
187#define R92C_BCN_MAX_ERR		0x55d
188#define R92C_RXTSF_OFFSET_CCK		0x55e
189#define R92C_RXTSF_OFFSET_OFDM		0x55f
190#define R92C_TSFTR			0x560
191#define R92C_INIT_TSFTR			0x564
192#define R92C_PSTIMER			0x580
193#define R92C_TIMER0			0x584
194#define R92C_TIMER1			0x588
195#define R92C_ACMHWCTRL			0x5c0
196#define R92C_ACMRSTCTRL			0x5c1
197#define R92C_ACMAVG			0x5c2
198#define R92C_VO_ADMTIME			0x5c4
199#define R92C_VI_ADMTIME			0x5c6
200#define R92C_BE_ADMTIME			0x5c8
201#define R92C_EDCA_RANDOM_GEN		0x5cc
202#define R92C_SCH_TXCMD			0x5d0
203/* WMAC Configuration. */
204#define R92C_APSD_CTRL			0x600
205#define R92C_BWOPMODE			0x603
206#define R92C_RCR			0x608
207#define R92C_RX_DRVINFO_SZ		0x60f
208#define R92C_MACID			0x610
209#define R92C_BSSID			0x618
210#define R92C_MAR			0x620
211#define R92C_MAC_SPEC_SIFS		0x63a
212#define R92C_R2T_SIFS			0x63c
213#define R92C_T2T_SIFS			0x63e
214#define R92C_ACKTO			0x640
215#define R92C_CAMCMD			0x670
216#define R92C_CAMWRITE			0x674
217#define R92C_CAMREAD			0x678
218#define R92C_CAMDBG			0x67c
219#define R92C_SECCFG			0x680
220#define R92C_RXFLTMAP0			0x6a0
221#define R92C_RXFLTMAP1			0x6a2
222#define R92C_RXFLTMAP2			0x6a4
223
224/* Bits for R92C_SYS_ISO_CTRL. */
225#define R92C_SYS_ISO_CTRL_MD2PP		0x0001
226#define R92C_SYS_ISO_CTRL_UA2USB	0x0002
227#define R92C_SYS_ISO_CTRL_UD2CORE	0x0004
228#define R92C_SYS_ISO_CTRL_PA2PCIE	0x0008
229#define R92C_SYS_ISO_CTRL_PD2CORE	0x0010
230#define R92C_SYS_ISO_CTRL_IP2MAC	0x0020
231#define R92C_SYS_ISO_CTRL_DIOP		0x0040
232#define R92C_SYS_ISO_CTRL_DIOE		0x0080
233#define R92C_SYS_ISO_CTRL_EB2CORE	0x0100
234#define R92C_SYS_ISO_CTRL_DIOR		0x0200
235#define R92C_SYS_ISO_CTRL_PWC_EV25V	0x4000
236#define R92C_SYS_ISO_CTRL_PWC_EV12V	0x8000
237
238/* Bits for R92C_SYS_FUNC_EN. */
239#define R92C_SYS_FUNC_EN_BBRSTB		0x0001
240#define R92C_SYS_FUNC_EN_BB_GLB_RST	0x0002
241#define R92C_SYS_FUNC_EN_USBA		0x0004
242#define R92C_SYS_FUNC_EN_UPLL		0x0008
243#define R92C_SYS_FUNC_EN_USBD		0x0010
244#define R92C_SYS_FUNC_EN_DIO_PCIE	0x0020
245#define R92C_SYS_FUNC_EN_PCIEA		0x0040
246#define R92C_SYS_FUNC_EN_PPLL		0x0080
247#define R92C_SYS_FUNC_EN_PCIED		0x0100
248#define R92C_SYS_FUNC_EN_DIOE		0x0200
249#define R92C_SYS_FUNC_EN_CPUEN		0x0400
250#define R92C_SYS_FUNC_EN_DCORE		0x0800
251#define R92C_SYS_FUNC_EN_ELDR		0x1000
252#define R92C_SYS_FUNC_EN_DIO_RF		0x2000
253#define R92C_SYS_FUNC_EN_HWPDN		0x4000
254#define R92C_SYS_FUNC_EN_MREGEN		0x8000
255
256/* Bits for R92C_APS_FSMCO. */
257#define R92C_APS_FSMCO_PFM_LDALL	0x00000001
258#define R92C_APS_FSMCO_PFM_ALDN		0x00000002
259#define R92C_APS_FSMCO_PFM_LDKP		0x00000004
260#define R92C_APS_FSMCO_PFM_WOWL		0x00000008
261#define R92C_APS_FSMCO_PDN_EN		0x00000010
262#define R92C_APS_FSMCO_PDN_PL		0x00000020
263#define R92C_APS_FSMCO_APFM_ONMAC	0x00000100
264#define R92C_APS_FSMCO_APFM_OFF		0x00000200
265#define R92C_APS_FSMCO_APFM_RSM		0x00000400
266#define R92C_APS_FSMCO_AFSM_HSUS	0x00000800
267#define R92C_APS_FSMCO_AFSM_PCIE	0x00001000
268#define R92C_APS_FSMCO_APDM_MAC		0x00002000
269#define R92C_APS_FSMCO_APDM_HOST	0x00004000
270#define R92C_APS_FSMCO_APDM_HPDN	0x00008000
271#define R92C_APS_FSMCO_RDY_MACON	0x00010000
272#define R92C_APS_FSMCO_SUS_HOST		0x00020000
273#define R92C_APS_FSMCO_ROP_ALD		0x00100000
274#define R92C_APS_FSMCO_ROP_PWR		0x00200000
275#define R92C_APS_FSMCO_ROP_SPS		0x00400000
276#define R92C_APS_FSMCO_SOP_MRST		0x02000000
277#define R92C_APS_FSMCO_SOP_FUSE		0x04000000
278#define R92C_APS_FSMCO_SOP_ABG		0x08000000
279#define R92C_APS_FSMCO_SOP_AMB		0x10000000
280#define R92C_APS_FSMCO_SOP_RCK		0x20000000
281#define R92C_APS_FSMCO_SOP_A8M		0x40000000
282#define R92C_APS_FSMCO_XOP_BTCK		0x80000000
283
284/* Bits for R92C_SYS_CLKR. */
285#define R92C_SYS_CLKR_ANAD16V_EN	0x00000001
286#define R92C_SYS_CLKR_ANA8M		0x00000002
287#define R92C_SYS_CLKR_MACSLP		0x00000010
288#define R92C_SYS_CLKR_LOADER_EN		0x00000020
289#define R92C_SYS_CLKR_80M_SSC_DIS	0x00000080
290#define R92C_SYS_CLKR_80M_SSC_EN_HO	0x00000100
291#define R92C_SYS_CLKR_PHY_SSC_RSTB	0x00000200
292#define R92C_SYS_CLKR_SEC_EN		0x00000400
293#define R92C_SYS_CLKR_MAC_EN		0x00000800
294#define R92C_SYS_CLKR_SYS_EN		0x00001000
295#define R92C_SYS_CLKR_RING_EN		0x00002000
296
297/* Bits for R92C_RF_CTRL. */
298#define R92C_RF_CTRL_EN		0x01
299#define R92C_RF_CTRL_RSTB	0x02
300#define R92C_RF_CTRL_SDMRSTB	0x04
301
302/* Bits for R92C_LDOV12D_CTRL. */
303#define R92C_LDOV12D_CTRL_LDV12_EN	0x01
304
305/* Bits for R92C_AFE_XTAL_CTRL. */
306#define R92C_AFE_XTAL_CTRL_ADDR_M	0x007ff800
307#define R92C_AFE_XTAL_CTRL_ADDR_S	11
308
309/* Bits for R92C_EFUSE_CTRL. */
310#define R92C_EFUSE_CTRL_DATA_M	0x000000ff
311#define R92C_EFUSE_CTRL_DATA_S	0
312#define R92C_EFUSE_CTRL_ADDR_M	0x0003ff00
313#define R92C_EFUSE_CTRL_ADDR_S	8
314#define R92C_EFUSE_CTRL_VALID	0x80000000
315
316/* Bits for R92C_GPIO_MUXCFG. */
317#define R92C_GPIO_MUXCFG_ENBT	0x0020
318
319/* Bits for R92C_LEDCFG0. */
320#define R92C_LEDCFG0_DIS	0x08
321
322/* Bits for R92C_MCUFWDL. */
323#define R92C_MCUFWDL_EN			0x00000001
324#define R92C_MCUFWDL_RDY		0x00000002
325#define R92C_MCUFWDL_CHKSUM_RPT		0x00000004
326#define R92C_MCUFWDL_MACINI_RDY		0x00000008
327#define R92C_MCUFWDL_BBINI_RDY		0x00000010
328#define R92C_MCUFWDL_RFINI_RDY		0x00000020
329#define R92C_MCUFWDL_WINTINI_RDY	0x00000040
330#define R92C_MCUFWDL_RAM_DL_SEL		0x00000080
331#define R92C_MCUFWDL_PAGE_M		0x00070000
332#define R92C_MCUFWDL_PAGE_S		16
333#define R92C_MCUFWDL_CPRST		0x00800000
334
335/* Bits for R88E_HIMR. */
336#define R88E_HIMR_CPWM			0x00000100
337#define R88E_HIMR_CPWM2			0x00000200
338#define R88E_HIMR_TBDER			0x04000000
339#define R88E_HIMR_PSTIMEOUT		0x20000000
340
341/* Bits for R88E_HIMRE.*/
342#define R88E_HIMRE_RXFOVW		0x00000100
343#define R88E_HIMRE_TXFOVW		0x00000200
344#define R88E_HIMRE_RXERR		0x00000400
345#define R88E_HIMRE_TXERR		0x00000800
346
347/* Bits for R92C_EFUSE_ACCESS. */
348#define R92C_EFUSE_ACCESS_OFF		0x00
349#define R92C_EFUSE_ACCESS_ON		0x69
350
351/* Bits for R92C_HPON_FSM. */
352#define R92C_HPON_FSM_CHIP_BONDING_ID_S		22
353#define R92C_HPON_FSM_CHIP_BONDING_ID_M		0x00c00000
354#define R92C_HPON_FSM_CHIP_BONDING_ID_92C_1T2R	1
355
356/* Bits for R92C_SYS_CFG. */
357#define R92C_SYS_CFG_XCLK_VLD		0x00000001
358#define R92C_SYS_CFG_ACLK_VLD		0x00000002
359#define R92C_SYS_CFG_UCLK_VLD		0x00000004
360#define R92C_SYS_CFG_PCLK_VLD		0x00000008
361#define R92C_SYS_CFG_PCIRSTB		0x00000010
362#define R92C_SYS_CFG_V15_VLD		0x00000020
363#define R92C_SYS_CFG_TRP_B15V_EN	0x00000080
364#define R92C_SYS_CFG_SIC_IDLE		0x00000100
365#define R92C_SYS_CFG_BD_MAC2		0x00000200
366#define R92C_SYS_CFG_BD_MAC1		0x00000400
367#define R92C_SYS_CFG_IC_MACPHY_MODE	0x00000800
368#define R92C_SYS_CFG_CHIP_VER_RTL_M	0x0000f000
369#define R92C_SYS_CFG_CHIP_VER_RTL_S	12
370#define R92C_SYS_CFG_BT_FUNC		0x00010000
371#define R92C_SYS_CFG_VENDOR_UMC		0x00080000
372#define R92C_SYS_CFG_PAD_HWPD_IDN	0x00400000
373#define R92C_SYS_CFG_TRP_VAUX_EN	0x00800000
374#define R92C_SYS_CFG_TRP_BT_EN		0x01000000
375#define R92C_SYS_CFG_BD_PKG_SEL		0x02000000
376#define R92C_SYS_CFG_BD_HCI_SEL		0x04000000
377#define R92C_SYS_CFG_TYPE_92C		0x08000000
378
379/* Bits for R92C_CR. */
380#define R92C_CR_HCI_TXDMA_EN	0x00000001
381#define R92C_CR_HCI_RXDMA_EN	0x00000002
382#define R92C_CR_TXDMA_EN	0x00000004
383#define R92C_CR_RXDMA_EN	0x00000008
384#define R92C_CR_PROTOCOL_EN	0x00000010
385#define R92C_CR_SCHEDULE_EN	0x00000020
386#define R92C_CR_MACTXEN		0x00000040
387#define R92C_CR_MACRXEN		0x00000080
388#define R92C_CR_ENSEC		0x00000200
389#define R92C_CR_CALTMR_EN	0x00000400
390#define R92C_CR_NETTYPE_S	16
391#define R92C_CR_NETTYPE_M	0x00030000
392#define R92C_CR_NETTYPE_NOLINK	0
393#define R92C_CR_NETTYPE_ADHOC	1
394#define R92C_CR_NETTYPE_INFRA	2
395#define R92C_CR_NETTYPE_AP	3
396
397/* Bits for R92C_PBP. */
398#define R92C_PBP_PSRX_M		0x0f
399#define R92C_PBP_PSRX_S		0
400#define R92C_PBP_PSTX_M		0xf0
401#define R92C_PBP_PSTX_S		4
402#define R92C_PBP_64		0
403#define R92C_PBP_128		1
404#define R92C_PBP_256		2
405#define R92C_PBP_512		3
406#define R92C_PBP_1024		4
407
408/* Bits for R92C_TRXDMA_CTRL. */
409#define R92C_TRXDMA_CTRL_RXDMA_AGG_EN		0x0004
410#define R92C_TRXDMA_CTRL_TXDMA_VOQ_MAP_M	0x0030
411#define R92C_TRXDMA_CTRL_TXDMA_VOQ_MAP_S	4
412#define R92C_TRXDMA_CTRL_TXDMA_VIQ_MAP_M	0x00c0
413#define R92C_TRXDMA_CTRL_TXDMA_VIQ_MAP_S	6
414#define R92C_TRXDMA_CTRL_TXDMA_BEQ_MAP_M	0x0300
415#define R92C_TRXDMA_CTRL_TXDMA_BEQ_MAP_S	8
416#define R92C_TRXDMA_CTRL_TXDMA_BKQ_MAP_M	0x0c00
417#define R92C_TRXDMA_CTRL_TXDMA_BKQ_MAP_S	10
418#define R92C_TRXDMA_CTRL_TXDMA_MGQ_MAP_M	0x3000
419#define R92C_TRXDMA_CTRL_TXDMA_MGQ_MAP_S	12
420#define R92C_TRXDMA_CTRL_TXDMA_HIQ_MAP_M	0xc000
421#define R92C_TRXDMA_CTRL_TXDMA_HIQ_MAP_S	14
422#define R92C_TRXDMA_CTRL_QUEUE_LOW		1
423#define R92C_TRXDMA_CTRL_QUEUE_NORMAL		2
424#define R92C_TRXDMA_CTRL_QUEUE_HIGH		3
425#define R92C_TRXDMA_CTRL_QMAP_M			0xfff0
426/* Shortcuts. */
427#define R92C_TRXDMA_CTRL_QMAP_3EP		0xf5b0
428#define R92C_TRXDMA_CTRL_QMAP_HQ_LQ		0xf5f0
429#define R92C_TRXDMA_CTRL_QMAP_HQ_NQ		0xfaf0
430#define R92C_TRXDMA_CTRL_QMAP_LQ		0x5550
431#define R92C_TRXDMA_CTRL_QMAP_NQ		0xaaa0
432#define R92C_TRXDMA_CTRL_QMAP_HQ		0xfff0
433
434/* Bits for R92C_LLT_INIT. */
435#define R92C_LLT_INIT_DATA_M		0x000000ff
436#define R92C_LLT_INIT_DATA_S		0
437#define R92C_LLT_INIT_ADDR_M		0x0000ff00
438#define R92C_LLT_INIT_ADDR_S		8
439#define R92C_LLT_INIT_OP_M		0xc0000000
440#define R92C_LLT_INIT_OP_S		30
441#define R92C_LLT_INIT_OP_NO_ACTIVE	0
442#define R92C_LLT_INIT_OP_WRITE		1
443
444/* Bits for R92C_RQPN. */
445#define R92C_RQPN_HPQ_M		0x000000ff
446#define R92C_RQPN_HPQ_S		0
447#define R92C_RQPN_LPQ_M		0x0000ff00
448#define R92C_RQPN_LPQ_S		8
449#define R92C_RQPN_PUBQ_M	0x00ff0000
450#define R92C_RQPN_PUBQ_S	16
451#define R92C_RQPN_LD		0x80000000
452
453/* Bits for R92C_TDECTRL. */
454#define R92C_TDECTRL_BLK_DESC_NUM_M	0x000000f0
455#define R92C_TDECTRL_BLK_DESC_NUM_S	4
456
457/* Bits for R92C_FWHW_TXQ_CTRL. */
458#define R92C_FWHW_TXQ_CTRL_AMPDU_RTY_NEW	0x80
459
460/* Bits for R92C_SPEC_SIFS. */
461#define R92C_SPEC_SIFS_CCK_M	0x00ff
462#define R92C_SPEC_SIFS_CCK_S	0
463#define R92C_SPEC_SIFS_OFDM_M	0xff00
464#define R92C_SPEC_SIFS_OFDM_S	8
465
466/* Bits for R92C_RL. */
467#define R92C_RL_LRL_M		0x003f
468#define R92C_RL_LRL_S		0
469#define R92C_RL_SRL_M		0x3f00
470#define R92C_RL_SRL_S		8
471
472/* Bits for R92C_RRSR. */
473#define R92C_RRSR_RATE_BITMAP_M		0x000fffff
474#define R92C_RRSR_RATE_BITMAP_S		0
475#define R92C_RRSR_RATE_CCK_ONLY_1M	0xffff1
476#define R92C_RRSR_RSC_LOWSUBCHNL	0x00200000
477#define R92C_RRSR_RSC_UPSUBCHNL		0x00400000
478#define R92C_RRSR_SHORT			0x00800000
479
480/* Bits for R92C_EDCA_XX_PARAM. */
481#define R92C_EDCA_PARAM_AIFS_M		0x000000ff
482#define R92C_EDCA_PARAM_AIFS_S		0
483#define R92C_EDCA_PARAM_ECWMIN_M	0x00000f00
484#define R92C_EDCA_PARAM_ECWMIN_S	8
485#define R92C_EDCA_PARAM_ECWMAX_M	0x0000f000
486#define R92C_EDCA_PARAM_ECWMAX_S	12
487#define R92C_EDCA_PARAM_TXOP_M		0xffff0000
488#define R92C_EDCA_PARAM_TXOP_S		16
489
490/* Bits for R92C_BCN_CTRL. */
491#define R92C_BCN_CTRL_EN_MBSSID		0x02
492#define R92C_BCN_CTRL_TXBCN_RPT		0x04
493#define R92C_BCN_CTRL_EN_BCN		0x08
494#define R92C_BCN_CTRL_DIS_TSF_UDT0	0x10
495
496/* Bits for R92C_APSD_CTRL. */
497#define R92C_APSD_CTRL_OFF		0x40
498#define R92C_APSD_CTRL_OFF_STATUS	0x80
499
500/* Bits for R92C_BWOPMODE. */
501#define R92C_BWOPMODE_11J	0x01
502#define R92C_BWOPMODE_5G	0x02
503#define R92C_BWOPMODE_20MHZ	0x04
504
505/* Bits for R92C_RCR. */
506#define R92C_RCR_AAP		0x00000001
507#define R92C_RCR_APM		0x00000002
508#define R92C_RCR_AM		0x00000004
509#define R92C_RCR_AB		0x00000008
510#define R92C_RCR_ADD3		0x00000010
511#define R92C_RCR_APWRMGT	0x00000020
512#define R92C_RCR_CBSSID_DATA	0x00000040
513#define R92C_RCR_CBSSID_BCN	0x00000080
514#define R92C_RCR_ACRC32		0x00000100
515#define R92C_RCR_AICV		0x00000200
516#define R92C_RCR_ADF		0x00000800
517#define R92C_RCR_ACF		0x00001000
518#define R92C_RCR_AMF		0x00002000
519#define R92C_RCR_HTC_LOC_CTRL	0x00004000
520#define R92C_RCR_MFBEN		0x00400000
521#define R92C_RCR_LSIGEN		0x00800000
522#define R92C_RCR_ENMBID		0x01000000
523#define R92C_RCR_APP_BA_SSN	0x08000000
524#define R92C_RCR_APP_PHYSTS	0x10000000
525#define R92C_RCR_APP_ICV	0x20000000
526#define R92C_RCR_APP_MIC	0x40000000
527#define R92C_RCR_APPFCS		0x80000000
528
529/* Bits for R92C_CAMCMD. */
530#define R92C_CAMCMD_ADDR_M	0x0000ffff
531#define R92C_CAMCMD_ADDR_S	0
532#define R92C_CAMCMD_WRITE	0x00010000
533#define R92C_CAMCMD_CLR		0x40000000
534#define R92C_CAMCMD_POLLING	0x80000000
535
536
537/*
538 * Baseband registers.
539 */
540#define R92C_FPGA0_RFMOD		0x800
541#define R92C_FPGA0_TXINFO		0x804
542#define R92C_HSSI_PARAM1(chain)		(0x820 + (chain) * 8)
543#define R92C_HSSI_PARAM2(chain)		(0x824 + (chain) * 8)
544#define R92C_TXAGC_RATE18_06(i)		(((i) == 0) ? 0xe00 : 0x830)
545#define R92C_TXAGC_RATE54_24(i)		(((i) == 0) ? 0xe04 : 0x834)
546#define R92C_TXAGC_A_CCK1_MCS32		0xe08
547#define R92C_TXAGC_B_CCK1_55_MCS32	0x838
548#define R92C_TXAGC_B_CCK11_A_CCK2_11	0x86c
549#define R92C_TXAGC_MCS03_MCS00(i)	(((i) == 0) ? 0xe10 : 0x83c)
550#define R92C_TXAGC_MCS07_MCS04(i)	(((i) == 0) ? 0xe14 : 0x848)
551#define R92C_TXAGC_MCS11_MCS08(i)	(((i) == 0) ? 0xe18 : 0x84c)
552#define R92C_TXAGC_MCS15_MCS12(i)	(((i) == 0) ? 0xe1c : 0x868)
553#define R92C_LSSI_PARAM(chain)		(0x840 + (chain) * 4)
554#define R92C_FPGA0_RFIFACEOE(chain)	(0x860 + (chain) * 4)
555#define R92C_FPGA0_RFIFACESW(idx)	(0x870 + (idx) * 4)
556#define R92C_FPGA0_RFPARAM(idx)		(0x878 + (idx) * 4)
557#define R92C_FPGA0_ANAPARAM2		0x884
558#define R92C_LSSI_READBACK(chain)	(0x8a0 + (chain) * 4)
559#define R92C_HSPI_READBACK(chain)	(0x8b8 + (chain) * 4)
560#define R92C_FPGA1_RFMOD		0x900
561#define R92C_FPGA1_TXINFO		0x90c
562#define R92C_CCK0_SYSTEM		0xa00
563#define R92C_CCK0_AFESETTING		0xa04
564#define R92C_OFDM0_TRXPATHENA		0xc04
565#define R92C_OFDM0_TRMUXPAR		0xc08
566#define R92C_OFDM0_AGCCORE1(chain)	(0xc50 + (chain) * 8)
567#define R92C_OFDM0_AGCPARAM1		0xc70
568#define R92C_OFDM0_AGCRSSITABLE		0xc78
569#define R92C_OFDM1_LSTF			0xd00
570
571/* Bits for R92C_FPGA[01]_RFMOD. */
572#define R92C_RFMOD_40MHZ	0x00000001
573#define R92C_RFMOD_JAPAN	0x00000002
574#define R92C_RFMOD_CCK_TXSC	0x00000030
575#define R92C_RFMOD_CCK_EN	0x01000000
576#define R92C_RFMOD_OFDM_EN	0x02000000
577
578/* Bits for R92C_HSSI_PARAM1(i). */
579#define R92C_HSSI_PARAM1_PI	0x00000100
580
581/* Bits for R92C_HSSI_PARAM2(i). */
582#define R92C_HSSI_PARAM2_CCK_HIPWR	0x00000200
583#define R92C_HSSI_PARAM2_ADDR_LENGTH	0x00000400
584#define R92C_HSSI_PARAM2_DATA_LENGTH	0x00000800
585#define R92C_HSSI_PARAM2_READ_ADDR_M	0x7f800000
586#define R92C_HSSI_PARAM2_READ_ADDR_S	23
587#define R92C_HSSI_PARAM2_READ_EDGE	0x80000000
588
589/* Bits for R92C_TXAGC_A_CCK1_MCS32. */
590#define R92C_TXAGC_A_CCK1_M	0x0000ff00
591#define R92C_TXAGC_A_CCK1_S	8
592
593/* Bits for R92C_TXAGC_B_CCK11_A_CCK2_11. */
594#define R92C_TXAGC_B_CCK11_M	0x000000ff
595#define R92C_TXAGC_B_CCK11_S	0
596#define R92C_TXAGC_A_CCK2_M	0x0000ff00
597#define R92C_TXAGC_A_CCK2_S	8
598#define R92C_TXAGC_A_CCK55_M	0x00ff0000
599#define R92C_TXAGC_A_CCK55_S	16
600#define R92C_TXAGC_A_CCK11_M	0xff000000
601#define R92C_TXAGC_A_CCK11_S	24
602
603/* Bits for R92C_TXAGC_B_CCK1_55_MCS32. */
604#define R92C_TXAGC_B_CCK1_M	0x0000ff00
605#define R92C_TXAGC_B_CCK1_S	8
606#define R92C_TXAGC_B_CCK2_M	0x00ff0000
607#define R92C_TXAGC_B_CCK2_S	16
608#define R92C_TXAGC_B_CCK55_M	0xff000000
609#define R92C_TXAGC_B_CCK55_S	24
610
611/* Bits for R92C_TXAGC_RATE18_06(x). */
612#define R92C_TXAGC_RATE06_M	0x000000ff
613#define R92C_TXAGC_RATE06_S	0
614#define R92C_TXAGC_RATE09_M	0x0000ff00
615#define R92C_TXAGC_RATE09_S	8
616#define R92C_TXAGC_RATE12_M	0x00ff0000
617#define R92C_TXAGC_RATE12_S	16
618#define R92C_TXAGC_RATE18_M	0xff000000
619#define R92C_TXAGC_RATE18_S	24
620
621/* Bits for R92C_TXAGC_RATE54_24(x). */
622#define R92C_TXAGC_RATE24_M	0x000000ff
623#define R92C_TXAGC_RATE24_S	0
624#define R92C_TXAGC_RATE36_M	0x0000ff00
625#define R92C_TXAGC_RATE36_S	8
626#define R92C_TXAGC_RATE48_M	0x00ff0000
627#define R92C_TXAGC_RATE48_S	16
628#define R92C_TXAGC_RATE54_M	0xff000000
629#define R92C_TXAGC_RATE54_S	24
630
631/* Bits for R92C_TXAGC_MCS03_MCS00(x). */
632#define R92C_TXAGC_MCS00_M	0x000000ff
633#define R92C_TXAGC_MCS00_S	0
634#define R92C_TXAGC_MCS01_M	0x0000ff00
635#define R92C_TXAGC_MCS01_S	8
636#define R92C_TXAGC_MCS02_M	0x00ff0000
637#define R92C_TXAGC_MCS02_S	16
638#define R92C_TXAGC_MCS03_M	0xff000000
639#define R92C_TXAGC_MCS03_S	24
640
641/* Bits for R92C_TXAGC_MCS07_MCS04(x). */
642#define R92C_TXAGC_MCS04_M	0x000000ff
643#define R92C_TXAGC_MCS04_S	0
644#define R92C_TXAGC_MCS05_M	0x0000ff00
645#define R92C_TXAGC_MCS05_S	8
646#define R92C_TXAGC_MCS06_M	0x00ff0000
647#define R92C_TXAGC_MCS06_S	16
648#define R92C_TXAGC_MCS07_M	0xff000000
649#define R92C_TXAGC_MCS07_S	24
650
651/* Bits for R92C_TXAGC_MCS11_MCS08(x). */
652#define R92C_TXAGC_MCS08_M	0x000000ff
653#define R92C_TXAGC_MCS08_S	0
654#define R92C_TXAGC_MCS09_M	0x0000ff00
655#define R92C_TXAGC_MCS09_S	8
656#define R92C_TXAGC_MCS10_M	0x00ff0000
657#define R92C_TXAGC_MCS10_S	16
658#define R92C_TXAGC_MCS11_M	0xff000000
659#define R92C_TXAGC_MCS11_S	24
660
661/* Bits for R92C_TXAGC_MCS15_MCS12(x). */
662#define R92C_TXAGC_MCS12_M	0x000000ff
663#define R92C_TXAGC_MCS12_S	0
664#define R92C_TXAGC_MCS13_M	0x0000ff00
665#define R92C_TXAGC_MCS13_S	8
666#define R92C_TXAGC_MCS14_M	0x00ff0000
667#define R92C_TXAGC_MCS14_S	16
668#define R92C_TXAGC_MCS15_M	0xff000000
669#define R92C_TXAGC_MCS15_S	24
670
671/* Bits for R92C_LSSI_PARAM(i). */
672#define R92C_LSSI_PARAM_DATA_M	0x000fffff
673#define R92C_LSSI_PARAM_DATA_S	0
674#define R92C_LSSI_PARAM_ADDR_M	0x03f00000
675#define R92C_LSSI_PARAM_ADDR_S	20
676#define R88E_LSSI_PARAM_ADDR_M	0x0ff00000
677#define R88E_LSSI_PARAM_ADDR_S	20
678
679/* Bits for R92C_FPGA0_ANAPARAM2. */
680#define R92C_FPGA0_ANAPARAM2_CBW20	0x00000400
681
682/* Bits for R92C_LSSI_READBACK(i). */
683#define R92C_LSSI_READBACK_DATA_M	0x000fffff
684#define R92C_LSSI_READBACK_DATA_S	0
685
686/* Bits for R92C_OFDM0_AGCCORE1(i). */
687#define R92C_OFDM0_AGCCORE1_GAIN_M	0x0000007f
688#define R92C_OFDM0_AGCCORE1_GAIN_S	0
689
690
691/*
692 * USB registers.
693 */
694#define R92C_USB_INFO			0xfe17
695#define R92C_USB_SPECIAL_OPTION		0xfe55
696#define R92C_USB_HCPWM			0xfe57
697#define R92C_USB_HRPWM			0xfe58
698#define R92C_USB_DMA_AGG_TO		0xfe5b
699#define R92C_USB_AGG_TO			0xfe5c
700#define R92C_USB_AGG_TH			0xfe5d
701#define R92C_USB_VID			0xfe60
702#define R92C_USB_PID			0xfe62
703#define R92C_USB_OPTIONAL		0xfe64
704#define R92C_USB_EP			0xfe65
705#define R92C_USB_PHY			0xfe68
706#define R92C_USB_MAC_ADDR		0xfe70
707#define R92C_USB_STRING			0xfe80
708
709/* Bits for R92C_USB_SPECIAL_OPTION. */
710#define R92C_USB_SPECIAL_OPTION_AGG_EN		0x08
711#define R92C_USB_SPECIAL_OPTION_INT_BULK_SEL	0x10
712
713/* Bits for R92C_USB_EP. */
714#define R92C_USB_EP_HQ_M	0x000f
715#define R92C_USB_EP_HQ_S	0
716#define R92C_USB_EP_NQ_M	0x00f0
717#define R92C_USB_EP_NQ_S	4
718#define R92C_USB_EP_LQ_M	0x0f00
719#define R92C_USB_EP_LQ_S	8
720
721
722/*
723 * Firmware base address.
724 */
725#define R92C_FW_START_ADDR	0x1000
726#define R92C_FW_PAGE_SIZE	4096
727
728
729/*
730 * RF (6052) registers.
731 */
732#define R92C_RF_AC		0x00
733#define R92C_RF_IQADJ_G(i)	(0x01 + (i))
734#define R92C_RF_POW_TRSW	0x05
735#define R92C_RF_GAIN_RX		0x06
736#define R92C_RF_GAIN_TX		0x07
737#define R92C_RF_TXM_IDAC	0x08
738#define R92C_RF_BS_IQGEN	0x0f
739#define R92C_RF_MODE1		0x10
740#define R92C_RF_MODE2		0x11
741#define R92C_RF_RX_AGC_HP	0x12
742#define R92C_RF_TX_AGC		0x13
743#define R92C_RF_BIAS		0x14
744#define R92C_RF_IPA		0x15
745#define R92C_RF_POW_ABILITY	0x17
746#define R92C_RF_CHNLBW		0x18
747#define R92C_RF_RX_G1		0x1a
748#define R92C_RF_RX_G2		0x1b
749#define R92C_RF_RX_BB2		0x1c
750#define R92C_RF_RX_BB1		0x1d
751#define R92C_RF_RCK1		0x1e
752#define R92C_RF_RCK2		0x1f
753#define R92C_RF_TX_G(i)		(0x20 + (i))
754#define R92C_RF_TX_BB1		0x23
755#define R92C_RF_T_METER		0x24
756#define R92C_RF_SYN_G(i)	(0x25 + (i))
757#define R92C_RF_RCK_OS		0x30
758#define R92C_RF_TXPA_G(i)	(0x31 + (i))
759
760/* Bits for R92C_RF_AC. */
761#define R92C_RF_AC_MODE_M	0x70000
762#define R92C_RF_AC_MODE_S	16
763#define R92C_RF_AC_MODE_STANDBY	1
764
765/* Bits for R92C_RF_CHNLBW. */
766#define R92C_RF_CHNLBW_CHNL_M	0x003ff
767#define R92C_RF_CHNLBW_CHNL_S	0
768#define R92C_RF_CHNLBW_BW20	0x00400
769#define R88E_RF_CHNLBW_BW20	0x00c00
770#define R92C_RF_CHNLBW_LCSTART	0x08000
771
772
773/*
774 * CAM entries.
775 */
776#define R92C_CAM_ENTRY_COUNT	32
777
778#define R92C_CAM_CTL0(entry)	((entry) * 8 + 0)
779#define R92C_CAM_CTL1(entry)	((entry) * 8 + 1)
780#define R92C_CAM_KEY(entry, i)	((entry) * 8 + 2 + (i))
781
782/* Bits for R92C_CAM_CTL0(i). */
783#define R92C_CAM_KEYID_M	0x00000003
784#define R92C_CAM_KEYID_S	0
785#define R92C_CAM_ALGO_M		0x0000001c
786#define R92C_CAM_ALGO_S		2
787#define R92C_CAM_ALGO_NONE	0
788#define R92C_CAM_ALGO_WEP40	1
789#define R92C_CAM_ALGO_TKIP	2
790#define R92C_CAM_ALGO_AES	4
791#define R92C_CAM_ALGO_WEP104	5
792#define R92C_CAM_VALID		0x00008000
793#define R92C_CAM_MACLO_M	0xffff0000
794#define R92C_CAM_MACLO_S	16
795
796/* Rate adaptation modes. */
797#define R92C_RAID_11GN	1
798#define R92C_RAID_11N	3
799#define R92C_RAID_11BG	4
800#define R92C_RAID_11G	5	/* "pure" 11g */
801#define R92C_RAID_11B	6
802
803
804/*
805 * Macros to access subfields in registers.
806 */
807/* Mask and Shift (getter). */
808#define MS(val, field)							\
809	(((val) & field##_M) >> field##_S)
810
811/* Shift and Mask (setter). */
812#define SM(field, val)							\
813	(((val) << field##_S) & field##_M)
814
815/* Rewrite. */
816#define RW(var, field, val)						\
817	(((var) & ~field##_M) | SM(field, val))
818
819/*
820 * Firmware image header.
821 */
822struct r92c_fw_hdr {
823	/* QWORD0 */
824	uint16_t	signature;
825	uint8_t		category;
826	uint8_t		function;
827	uint16_t	version;
828	uint16_t	subversion;
829	/* QWORD1 */
830	uint8_t		month;
831	uint8_t		date;
832	uint8_t		hour;
833	uint8_t		minute;
834	uint16_t	ramcodesize;
835	uint16_t	reserved2;
836	/* QWORD2 */
837	uint32_t	svnidx;
838	uint32_t	reserved3;
839	/* QWORD3 */
840	uint32_t	reserved4;
841	uint32_t	reserved5;
842} __packed;
843
844/*
845 * Host to firmware commands.
846 */
847struct r92c_fw_cmd {
848	uint8_t	id;
849#define R92C_CMD_AP_OFFLOAD		0
850#define R92C_CMD_SET_PWRMODE		1
851#define R92C_CMD_JOINBSS_RPT		2
852#define R92C_CMD_RSVD_PAGE		3
853#define R92C_CMD_RSSI			4
854#define R92C_CMD_RSSI_SETTING		5
855#define R92C_CMD_MACID_CONFIG		6
856#define R92C_CMD_MACID_PS_MODE		7
857#define R92C_CMD_P2P_PS_OFFLOAD		8
858#define R92C_CMD_SELECTIVE_SUSPEND	9
859#define R92C_CMD_FLAG_EXT		0x80
860
861	uint8_t	msg[5];
862} __packed;
863
864/* Structure for R92C_CMD_RSSI_SETTING. */
865struct r92c_fw_cmd_rssi {
866	uint8_t	macid;
867	uint8_t	reserved;
868	uint8_t	pwdb;
869} __packed;
870
871/* Structure for R92C_CMD_MACID_CONFIG. */
872struct r92c_fw_cmd_macid_cfg {
873	uint32_t	mask;
874	uint8_t		macid;
875#define URTWN_MACID_BSS		0
876#define URTWN_MACID_BC		4	/* Broadcast. */
877#define URTWN_MACID_VALID	0x80
878} __packed;
879
880/*
881 * RTL8192CU ROM image.
882 */
883struct r92c_rom {
884	uint16_t	id;		/* 0x8192 */
885	uint8_t		reserved1[5];
886	uint8_t		dbg_sel;
887	uint16_t	reserved2;
888	uint16_t	vid;
889	uint16_t	pid;
890	uint8_t		usb_opt;
891	uint8_t		ep_setting;
892	uint16_t	reserved3;
893	uint8_t		usb_phy;
894	uint8_t		reserved4[3];
895	uint8_t		macaddr[6];
896	uint8_t		string[61];	/* "Realtek" */
897	uint8_t		subcustomer_id;
898	uint8_t		cck_tx_pwr[R92C_MAX_CHAINS][3];
899	uint8_t		ht40_1s_tx_pwr[R92C_MAX_CHAINS][3];
900	uint8_t		ht40_2s_tx_pwr_diff[3];
901	uint8_t		ht20_tx_pwr_diff[3];
902	uint8_t		ofdm_tx_pwr_diff[3];
903	uint8_t		ht40_max_pwr[3];
904	uint8_t		ht20_max_pwr[3];
905	uint8_t		xtal_calib;
906	uint8_t		tssi[R92C_MAX_CHAINS];
907	uint8_t		thermal_meter;
908	uint8_t		rf_opt1;
909#define R92C_ROM_RF1_REGULATORY_M	0x07
910#define R92C_ROM_RF1_REGULATORY_S	0
911#define R92C_ROM_RF1_BOARD_TYPE_M	0xe0
912#define R92C_ROM_RF1_BOARD_TYPE_S	5
913#define R92C_BOARD_TYPE_DONGLE		0
914#define R92C_BOARD_TYPE_HIGHPA		1
915#define R92C_BOARD_TYPE_MINICARD	2
916#define R92C_BOARD_TYPE_SOLO		3
917#define R92C_BOARD_TYPE_COMBO		4
918
919	uint8_t		rf_opt2;
920	uint8_t		rf_opt3;
921	uint8_t		rf_opt4;
922	uint8_t		channel_plan;
923	uint8_t		version;
924	uint8_t		curstomer_id;
925} __packed;
926
927/* Rx MAC descriptor. */
928struct r92c_rx_stat {
929	uint32_t	rxdw0;
930#define R92C_RXDW0_PKTLEN_M	0x00003fff
931#define R92C_RXDW0_PKTLEN_S	0
932#define R92C_RXDW0_CRCERR	0x00004000
933#define R92C_RXDW0_ICVERR	0x00008000
934#define R92C_RXDW0_INFOSZ_M	0x000f0000
935#define R92C_RXDW0_INFOSZ_S	16
936#define R92C_RXDW0_QOS		0x00800000
937#define R92C_RXDW0_SHIFT_M	0x03000000
938#define R92C_RXDW0_SHIFT_S	24
939#define R92C_RXDW0_PHYST	0x04000000
940#define R92C_RXDW0_DECRYPTED	0x08000000
941
942	uint32_t	rxdw1;
943	uint32_t	rxdw2;
944#define R92C_RXDW2_PKTCNT_M	0x00ff0000
945#define R92C_RXDW2_PKTCNT_S	16
946
947	uint32_t	rxdw3;
948#define R92C_RXDW3_RATE_M	0x0000003f
949#define R92C_RXDW3_RATE_S	0
950#define R92C_RXDW3_HT		0x00000040
951#define R92C_RXDW3_HTC		0x00000400
952
953	uint32_t	rxdw4;
954	uint32_t	rxdw5;
955} __packed __attribute__((aligned(4)));
956
957/* Rx PHY descriptor. */
958struct r92c_rx_phystat {
959	uint32_t	phydw0;
960	uint32_t	phydw1;
961	uint32_t	phydw2;
962	uint32_t	phydw3;
963	uint32_t	phydw4;
964	uint32_t	phydw5;
965	uint32_t	phydw6;
966	uint32_t	phydw7;
967} __packed __attribute__((aligned(4)));
968
969/* Rx PHY CCK descriptor. */
970struct r92c_rx_cck {
971	uint8_t		adc_pwdb[4];
972	uint8_t		sq_rpt;
973	uint8_t		agc_rpt;
974} __packed;
975
976struct r88e_rx_cck {
977	uint8_t		path_agc[2];
978	uint8_t		sig_qual;
979	uint8_t		agc_rpt;
980	uint8_t		rpt_b;
981	uint8_t 	reserved1;
982	uint8_t		noise_power;
983	uint8_t		path_cfotail[2];
984	uint8_t		pcts_mask[2];
985	uint8_t		stream_rxevm[2];
986	uint8_t		path_rxsnr[2];
987	uint8_t		noise_power_db_lsb;
988	uint8_t		reserved2[3];
989	uint8_t		stream_csi[2];
990	uint8_t		stream_target_csi[2];
991	uint8_t		sig_evm;
992	uint8_t		reserved3;
993	uint8_t		reserved4;
994} __packed;
995
996/* Tx MAC descriptor. */
997struct r92c_tx_desc {
998	uint32_t	txdw0;
999#define R92C_TXDW0_PKTLEN_M	0x0000ffff
1000#define R92C_TXDW0_PKTLEN_S	0
1001#define R92C_TXDW0_OFFSET_M	0x00ff0000
1002#define R92C_TXDW0_OFFSET_S	16
1003#define R92C_TXDW0_BMCAST	0x01000000
1004#define R92C_TXDW0_LSG		0x04000000
1005#define R92C_TXDW0_FSG		0x08000000
1006#define R92C_TXDW0_OWN		0x80000000
1007
1008	uint32_t	txdw1;
1009#define R92C_TXDW1_MACID_M	0x0000001f
1010#define R92C_TXDW1_MACID_S	0
1011#define R88E_TXDW1_MACID_M	0x0000003f
1012#define R88E_TXDW1_MACID_S	0
1013#define R92C_TXDW1_AGGEN	0x00000020
1014#define R92C_TXDW1_AGGBK	0x00000040
1015#define R92C_TXDW1_QSEL_M	0x00001f00
1016#define R92C_TXDW1_QSEL_S	8
1017#define R92C_TXDW1_QSEL_BE	0x00
1018#define R92C_TXDW1_QSEL_MGNT	0x12
1019#define R92C_TXDW1_RAID_M	0x000f0000
1020#define R92C_TXDW1_RAID_S	16
1021#define R92C_TXDW1_CIPHER_M	0x00c00000
1022#define R92C_TXDW1_CIPHER_S	22
1023#define R92C_TXDW1_CIPHER_NONE	0
1024#define R92C_TXDW1_CIPHER_RC4	1
1025#define R92C_TXDW1_CIPHER_AES	3
1026#define R92C_TXDW1_PKTOFF_M	0x7c000000
1027#define R92C_TXDW1_PKTOFF_S	26
1028
1029	uint32_t	txdw2;
1030#define R88E_TXDW2_AGGBK	0x00010000
1031
1032	uint16_t	txdw3;
1033	uint16_t	txdseq;
1034
1035	uint32_t	txdw4;
1036#define R92C_TXDW4_RTSRATE_M	0x0000003f
1037#define R92C_TXDW4_RTSRATE_S	0
1038#define R92C_TXDW4_QOS		0x00000040
1039#define R92C_TXDW4_HWSEQ	0x00000080
1040#define R92C_TXDW4_DRVRATE	0x00000100
1041#define R92C_TXDW4_CTS2SELF	0x00000800
1042#define R92C_TXDW4_RTSEN	0x00001000
1043#define R92C_TXDW4_HWRTSEN	0x00002000
1044#define R92C_TXDW4_SCO_M	0x003f0000
1045#define R92C_TXDW4_SCO_S	20
1046#define R92C_TXDW4_SCO_SCA	1
1047#define R92C_TXDW4_SCO_SCB	2
1048#define R92C_TXDW4_40MHZ	0x02000000
1049
1050	uint32_t	txdw5;
1051#define R92C_TXDW5_DATARATE_M	0x0000003f
1052#define R92C_TXDW5_DATARATE_S	0
1053#define R92C_TXDW5_SGI		0x00000040
1054#define R92C_TXDW5_AGGNUM_M	0xff000000
1055#define R92C_TXDW5_AGGNUM_S	24
1056
1057	uint32_t	txdw6;
1058	uint16_t	txdsum;
1059	uint16_t	pad;
1060} __packed __attribute__((aligned(4)));
1061
1062
1063static const uint8_t ridx2rate[] =
1064	{ 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 };
1065
1066/* HW rate indices. */
1067#define URTWN_RIDX_CCK1		0
1068#define URTWN_RIDX_CCK11	3
1069#define URTWN_RIDX_OFDM6	4
1070#define URTWN_RIDX_OFDM24	8
1071#define URTWN_RIDX_OFDM54	11
1072
1073#define URTWN_RIDX_COUNT	28
1074
1075
1076/*
1077 * MAC initialization values.
1078 */
1079static const struct {
1080	uint16_t	reg;
1081	uint8_t		val;
1082} rtl8188eu_mac[] = {
1083	{ 0x026, 0x41 }, { 0x027, 0x35 }, { 0x040, 0x00 }, { 0x428, 0x0a },
1084	{ 0x429, 0x10 }, { 0x430, 0x00 }, { 0x431, 0x01 }, { 0x432, 0x02 },
1085	{ 0x433, 0x04 }, { 0x434, 0x05 }, { 0x435, 0x06 }, { 0x436, 0x07 },
1086	{ 0x437, 0x08 }, { 0x438, 0x00 }, { 0x439, 0x00 }, { 0x43a, 0x01 },
1087	{ 0x43b, 0x02 }, { 0x43c, 0x04 }, { 0x43d, 0x05 }, { 0x43e, 0x06 },
1088	{ 0x43f, 0x07 }, { 0x440, 0x5d }, { 0x441, 0x01 }, { 0x442, 0x00 },
1089	{ 0x444, 0x15 }, { 0x445, 0xf0 }, { 0x446, 0x0f }, { 0x447, 0x00 },
1090	{ 0x458, 0x41 }, { 0x459, 0xa8 }, { 0x45a, 0x72 }, { 0x45b, 0xb9 },
1091	{ 0x460, 0x66 }, { 0x461, 0x66 }, { 0x480, 0x08 }, { 0x4c8, 0xff },
1092	{ 0x4c9, 0x08 }, { 0x4cc, 0xff }, { 0x4cd, 0xff }, { 0x4ce, 0x01 },
1093	{ 0x4d3, 0x01 }, { 0x500, 0x26 }, { 0x501, 0xa2 }, { 0x502, 0x2f },
1094	{ 0x503, 0x00 }, { 0x504, 0x28 }, { 0x505, 0xa3 }, { 0x506, 0x5e },
1095	{ 0x507, 0x00 }, { 0x508, 0x2b }, { 0x509, 0xa4 }, { 0x50a, 0x5e },
1096	{ 0x50b, 0x00 }, { 0x50c, 0x4f }, { 0x50d, 0xa4 }, { 0x50e, 0x00 },
1097	{ 0x50f, 0x00 }, { 0x512, 0x1c }, { 0x514, 0x0a }, { 0x516, 0x0a },
1098	{ 0x525, 0x4f }, { 0x550, 0x10 }, { 0x551, 0x10 }, { 0x559, 0x02 },
1099	{ 0x55d, 0xff }, { 0x605, 0x30 }, { 0x608, 0x0e }, { 0x609, 0x2a },
1100	{ 0x620, 0xff }, { 0x621, 0xff }, { 0x622, 0xff }, { 0x623, 0xff },
1101	{ 0x624, 0xff }, { 0x625, 0xff }, { 0x626, 0xff }, { 0x627, 0xff },
1102	{ 0x652, 0x20 }, { 0x63c, 0x0a }, { 0x63d, 0x0a }, { 0x63e, 0x0e },
1103	{ 0x63f, 0x0e }, { 0x640, 0x40 }, { 0x66e, 0x05 }, { 0x700, 0x21 },
1104	{ 0x701, 0x43 }, { 0x702, 0x65 }, { 0x703, 0x87 }, { 0x708, 0x21 },
1105	{ 0x709, 0x43 }, { 0x70a, 0x65 }, { 0x70b, 0x87 }
1106}, rtl8192cu_mac[] = {
1107	{ 0x420, 0x80 }, { 0x423, 0x00 }, { 0x430, 0x00 }, { 0x431, 0x00 },
1108	{ 0x432, 0x00 }, { 0x433, 0x01 }, { 0x434, 0x04 }, { 0x435, 0x05 },
1109	{ 0x436, 0x06 }, { 0x437, 0x07 }, { 0x438, 0x00 }, { 0x439, 0x00 },
1110	{ 0x43a, 0x00 }, { 0x43b, 0x01 }, { 0x43c, 0x04 }, { 0x43d, 0x05 },
1111	{ 0x43e, 0x06 }, { 0x43f, 0x07 }, { 0x440, 0x5d }, { 0x441, 0x01 },
1112	{ 0x442, 0x00 }, { 0x444, 0x15 }, { 0x445, 0xf0 }, { 0x446, 0x0f },
1113	{ 0x447, 0x00 }, { 0x458, 0x41 }, { 0x459, 0xa8 }, { 0x45a, 0x72 },
1114	{ 0x45b, 0xb9 }, { 0x460, 0x66 }, { 0x461, 0x66 }, { 0x462, 0x08 },
1115	{ 0x463, 0x03 }, { 0x4c8, 0xff }, { 0x4c9, 0x08 }, { 0x4cc, 0xff },
1116	{ 0x4cd, 0xff }, { 0x4ce, 0x01 }, { 0x500, 0x26 }, { 0x501, 0xa2 },
1117	{ 0x502, 0x2f }, { 0x503, 0x00 }, { 0x504, 0x28 }, { 0x505, 0xa3 },
1118	{ 0x506, 0x5e }, { 0x507, 0x00 }, { 0x508, 0x2b }, { 0x509, 0xa4 },
1119	{ 0x50a, 0x5e }, { 0x50b, 0x00 }, { 0x50c, 0x4f }, { 0x50d, 0xa4 },
1120	{ 0x50e, 0x00 }, { 0x50f, 0x00 }, { 0x512, 0x1c }, { 0x514, 0x0a },
1121	{ 0x515, 0x10 }, { 0x516, 0x0a }, { 0x517, 0x10 }, { 0x51a, 0x16 },
1122	{ 0x524, 0x0f }, { 0x525, 0x4f }, { 0x546, 0x40 }, { 0x547, 0x00 },
1123	{ 0x550, 0x10 }, { 0x551, 0x10 }, { 0x559, 0x02 }, { 0x55a, 0x02 },
1124	{ 0x55d, 0xff }, { 0x605, 0x30 }, { 0x608, 0x0e }, { 0x609, 0x2a },
1125	{ 0x652, 0x20 }, { 0x63c, 0x0a }, { 0x63d, 0x0e }, { 0x63e, 0x0a },
1126	{ 0x63f, 0x0e }, { 0x66e, 0x05 }, { 0x700, 0x21 }, { 0x701, 0x43 },
1127	{ 0x702, 0x65 }, { 0x703, 0x87 }, { 0x708, 0x21 }, { 0x709, 0x43 },
1128	{ 0x70a, 0x65 }, { 0x70b, 0x87 }
1129};
1130
1131/*
1132 * Baseband initialization values.
1133 */
1134struct urtwn_bb_prog {
1135	int		count;
1136	const uint16_t	*regs;
1137	const uint32_t	*vals;
1138	int		agccount;
1139	const uint32_t	*agcvals;
1140};
1141
1142/*
1143 * RTL8192CU and RTL8192CE-VAU.
1144 */
1145static const uint16_t rtl8192ce_bb_regs[] = {
1146	0x024, 0x028, 0x800, 0x804, 0x808, 0x80c, 0x810, 0x814, 0x818,
1147	0x81c, 0x820, 0x824, 0x828, 0x82c, 0x830, 0x834, 0x838, 0x83c,
1148	0x840, 0x844, 0x848, 0x84c, 0x850, 0x854, 0x858, 0x85c, 0x860,
1149	0x864, 0x868, 0x86c, 0x870, 0x874, 0x878, 0x87c, 0x880, 0x884,
1150	0x888, 0x88c, 0x890, 0x894, 0x898, 0x89c, 0x900, 0x904, 0x908,
1151	0x90c, 0xa00, 0xa04, 0xa08, 0xa0c, 0xa10, 0xa14, 0xa18, 0xa1c,
1152	0xa20, 0xa24, 0xa28, 0xa2c, 0xa70, 0xa74, 0xc00, 0xc04, 0xc08,
1153	0xc0c, 0xc10, 0xc14, 0xc18, 0xc1c, 0xc20, 0xc24, 0xc28, 0xc2c,
1154	0xc30, 0xc34, 0xc38, 0xc3c, 0xc40, 0xc44, 0xc48, 0xc4c, 0xc50,
1155	0xc54, 0xc58, 0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74,
1156	0xc78, 0xc7c, 0xc80, 0xc84, 0xc88, 0xc8c, 0xc90, 0xc94, 0xc98,
1157	0xc9c, 0xca0, 0xca4, 0xca8, 0xcac, 0xcb0, 0xcb4, 0xcb8, 0xcbc,
1158	0xcc0, 0xcc4, 0xcc8, 0xccc, 0xcd0, 0xcd4, 0xcd8, 0xcdc, 0xce0,
1159	0xce4, 0xce8, 0xcec, 0xd00, 0xd04, 0xd08, 0xd0c, 0xd10, 0xd14,
1160	0xd18, 0xd2c, 0xd30, 0xd34, 0xd38, 0xd3c, 0xd40, 0xd44, 0xd48,
1161	0xd4c, 0xd50, 0xd54, 0xd58, 0xd5c, 0xd60, 0xd64, 0xd68, 0xd6c,
1162	0xd70, 0xd74, 0xd78, 0xe00, 0xe04, 0xe08, 0xe10, 0xe14, 0xe18,
1163	0xe1c, 0xe28, 0xe30, 0xe34, 0xe38, 0xe3c, 0xe40, 0xe44, 0xe48,
1164	0xe4c, 0xe50, 0xe54, 0xe58, 0xe5c, 0xe60, 0xe68, 0xe6c, 0xe70,
1165	0xe74, 0xe78, 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, 0xed0, 0xed4,
1166	0xed8, 0xedc, 0xee0, 0xeec, 0xf14, 0xf4c, 0xf00
1167};
1168
1169static const uint32_t rtl8192ce_bb_vals[] = {
1170	0x0011800d, 0x00ffdb83, 0x80040002, 0x00000003, 0x0000fc00,
1171	0x0000000a, 0x10005388, 0x020c3d10, 0x02200385, 0x00000000,
1172	0x01000100, 0x00390004, 0x01000100, 0x00390004, 0x27272727,
1173	0x27272727, 0x27272727, 0x27272727, 0x00010000, 0x00010000,
1174	0x27272727, 0x27272727, 0x00000000, 0x00000000, 0x569a569a,
1175	0x0c1b25a4, 0x66e60230, 0x061f0130, 0x27272727, 0x2b2b2b27,
1176	0x07000700, 0x22184000, 0x08080808, 0x00000000, 0xc0083070,
1177	0x000004d5, 0x00000000, 0xcc0000c0, 0x00000800, 0xfffffffe,
1178	0x40302010, 0x00706050, 0x00000000, 0x00000023, 0x00000000,
1179	0x81121313, 0x00d047c8, 0x80ff000c, 0x8c838300, 0x2e68120f,
1180	0x9500bb78, 0x11144028, 0x00881117, 0x89140f00, 0x1a1b0000,
1181	0x090e1317, 0x00000204, 0x00d30000, 0x101fbf00, 0x00000007,
1182	0x48071d40, 0x03a05633, 0x000000e4, 0x6c6c6c6c, 0x08800000,
1183	0x40000100, 0x08800000, 0x40000100, 0x00000000, 0x00000000,
1184	0x00000000, 0x00000000, 0x69e9ac44, 0x469652cf, 0x49795994,
1185	0x0a97971c, 0x1f7c403f, 0x000100b7, 0xec020107, 0x007f037f,
1186	0x6954341e, 0x43bc0094, 0x6954341e, 0x433c0094, 0x00000000,
1187	0x5116848b, 0x47c00bff, 0x00000036, 0x2c7f000d, 0x018610db,
1188	0x0000001f, 0x00b91612, 0x40000100, 0x20f60000, 0x40000100,
1189	0x20200000, 0x00121820, 0x00000000, 0x00121820, 0x00007f7f,
1190	0x00000000, 0x00000080, 0x00000000, 0x00000000, 0x00000000,
1191	0x00000000, 0x00000000, 0x28000000, 0x00000000, 0x00000000,
1192	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x64b22427,
1193	0x00766932, 0x00222222, 0x00000000, 0x37644302, 0x2f97d40c,
1194	0x00080740, 0x00020403, 0x0000907f, 0x20010201, 0xa0633333,
1195	0x3333bc43, 0x7a8f5b6b, 0xcc979975, 0x00000000, 0x80608000,
1196	0x00000000, 0x00027293, 0x00000000, 0x00000000, 0x00000000,
1197	0x00000000, 0x6437140a, 0x00000000, 0x00000000, 0x30032064,
1198	0x4653de68, 0x04518a3c, 0x00002101, 0x2a201c16, 0x1812362e,
1199	0x322c2220, 0x000e3c24, 0x2a2a2a2a, 0x2a2a2a2a, 0x03902a2a,
1200	0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x00000000,
1201	0x1000dc1f, 0x10008c1f, 0x02140102, 0x681604c2, 0x01007c00,
1202	0x01004800, 0xfb000000, 0x000028d1, 0x1000dc1f, 0x10008c1f,
1203	0x02140102, 0x28160d05, 0x00000010, 0x001b25a4, 0x63db25a4,
1204	0x63db25a4, 0x0c1b25a4, 0x0c1b25a4, 0x0c1b25a4, 0x0c1b25a4,
1205	0x63db25a4, 0x0c1b25a4, 0x63db25a4, 0x63db25a4, 0x63db25a4,
1206	0x63db25a4, 0x001b25a4, 0x001b25a4, 0x6fdb25a4, 0x00000003,
1207	0x00000000, 0x00000300
1208};
1209
1210static const uint32_t rtl8192ce_agc_vals[] = {
1211	0x7b000001, 0x7b010001, 0x7b020001, 0x7b030001, 0x7b040001,
1212	0x7b050001, 0x7a060001, 0x79070001, 0x78080001, 0x77090001,
1213	0x760a0001, 0x750b0001, 0x740c0001, 0x730d0001, 0x720e0001,
1214	0x710f0001, 0x70100001, 0x6f110001, 0x6e120001, 0x6d130001,
1215	0x6c140001, 0x6b150001, 0x6a160001, 0x69170001, 0x68180001,
1216	0x67190001, 0x661a0001, 0x651b0001, 0x641c0001, 0x631d0001,
1217	0x621e0001, 0x611f0001, 0x60200001, 0x49210001, 0x48220001,
1218	0x47230001, 0x46240001, 0x45250001, 0x44260001, 0x43270001,
1219	0x42280001, 0x41290001, 0x402a0001, 0x262b0001, 0x252c0001,
1220	0x242d0001, 0x232e0001, 0x222f0001, 0x21300001, 0x20310001,
1221	0x06320001, 0x05330001, 0x04340001, 0x03350001, 0x02360001,
1222	0x01370001, 0x00380001, 0x00390001, 0x003a0001, 0x003b0001,
1223	0x003c0001, 0x003d0001, 0x003e0001, 0x003f0001, 0x7b400001,
1224	0x7b410001, 0x7b420001, 0x7b430001, 0x7b440001, 0x7b450001,
1225	0x7a460001, 0x79470001, 0x78480001, 0x77490001, 0x764a0001,
1226	0x754b0001, 0x744c0001, 0x734d0001, 0x724e0001, 0x714f0001,
1227	0x70500001, 0x6f510001, 0x6e520001, 0x6d530001, 0x6c540001,
1228	0x6b550001, 0x6a560001, 0x69570001, 0x68580001, 0x67590001,
1229	0x665a0001, 0x655b0001, 0x645c0001, 0x635d0001, 0x625e0001,
1230	0x615f0001, 0x60600001, 0x49610001, 0x48620001, 0x47630001,
1231	0x46640001, 0x45650001, 0x44660001, 0x43670001, 0x42680001,
1232	0x41690001, 0x406a0001, 0x266b0001, 0x256c0001, 0x246d0001,
1233	0x236e0001, 0x226f0001, 0x21700001, 0x20710001, 0x06720001,
1234	0x05730001, 0x04740001, 0x03750001, 0x02760001, 0x01770001,
1235	0x00780001, 0x00790001, 0x007a0001, 0x007b0001, 0x007c0001,
1236	0x007d0001, 0x007e0001, 0x007f0001, 0x3800001e, 0x3801001e,
1237	0x3802001e, 0x3803001e, 0x3804001e, 0x3805001e, 0x3806001e,
1238	0x3807001e, 0x3808001e, 0x3c09001e, 0x3e0a001e, 0x400b001e,
1239	0x440c001e, 0x480d001e, 0x4c0e001e, 0x500f001e, 0x5210001e,
1240	0x5611001e, 0x5a12001e, 0x5e13001e, 0x6014001e, 0x6015001e,
1241	0x6016001e, 0x6217001e, 0x6218001e, 0x6219001e, 0x621a001e,
1242	0x621b001e, 0x621c001e, 0x621d001e, 0x621e001e, 0x621f001e
1243};
1244
1245static const struct urtwn_bb_prog rtl8192ce_bb_prog = {
1246	nitems(rtl8192ce_bb_regs),
1247	rtl8192ce_bb_regs,
1248	rtl8192ce_bb_vals,
1249	nitems(rtl8192ce_agc_vals),
1250	rtl8192ce_agc_vals
1251};
1252
1253/*
1254 * RTL8188CU.
1255 */
1256static const uint32_t rtl8192cu_bb_vals[] = {
1257	0x0011800d, 0x00ffdb83, 0x80040002, 0x00000003, 0x0000fc00,
1258	0x0000000a, 0x10005388, 0x020c3d10, 0x02200385, 0x00000000,
1259	0x01000100, 0x00390004, 0x01000100, 0x00390004, 0x27272727,
1260	0x27272727, 0x27272727, 0x27272727, 0x00010000, 0x00010000,
1261	0x27272727, 0x27272727, 0x00000000, 0x00000000, 0x569a569a,
1262	0x0c1b25a4, 0x66e60230, 0x061f0130, 0x27272727, 0x2b2b2b27,
1263	0x07000700, 0x22184000, 0x08080808, 0x00000000, 0xc0083070,
1264	0x000004d5, 0x00000000, 0xcc0000c0, 0x00000800, 0xfffffffe,
1265	0x40302010, 0x00706050, 0x00000000, 0x00000023, 0x00000000,
1266	0x81121313, 0x00d047c8, 0x80ff000c, 0x8c838300, 0x2e68120f,
1267	0x9500bb78, 0x11144028, 0x00881117, 0x89140f00, 0x1a1b0000,
1268	0x090e1317, 0x00000204, 0x00d30000, 0x101fbf00, 0x00000007,
1269	0x48071d40, 0x03a05633, 0x000000e4, 0x6c6c6c6c, 0x08800000,
1270	0x40000100, 0x08800000, 0x40000100, 0x00000000, 0x00000000,
1271	0x00000000, 0x00000000, 0x69e9ac44, 0x469652cf, 0x49795994,
1272	0x0a97971c, 0x1f7c403f, 0x000100b7, 0xec020107, 0x007f037f,
1273	0x6954341e, 0x43bc0094, 0x6954341e, 0x433c0094, 0x00000000,
1274	0x5116848b, 0x47c00bff, 0x00000036, 0x2c7f000d, 0x0186115b,
1275	0x0000001f, 0x00b99612, 0x40000100, 0x20f60000, 0x40000100,
1276	0x20200000, 0x00121820, 0x00000000, 0x00121820, 0x00007f7f,
1277	0x00000000, 0x00000080, 0x00000000, 0x00000000, 0x00000000,
1278	0x00000000, 0x00000000, 0x28000000, 0x00000000, 0x00000000,
1279	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x64b22427,
1280	0x00766932, 0x00222222, 0x00000000, 0x37644302, 0x2f97d40c,
1281	0x00080740, 0x00020403, 0x0000907f, 0x20010201, 0xa0633333,
1282	0x3333bc43, 0x7a8f5b6b, 0xcc979975, 0x00000000, 0x80608000,
1283	0x00000000, 0x00027293, 0x00000000, 0x00000000, 0x00000000,
1284	0x00000000, 0x6437140a, 0x00000000, 0x00000000, 0x30032064,
1285	0x4653de68, 0x04518a3c, 0x00002101, 0x2a201c16, 0x1812362e,
1286	0x322c2220, 0x000e3c24, 0x2a2a2a2a, 0x2a2a2a2a, 0x03902a2a,
1287	0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x00000000,
1288	0x1000dc1f, 0x10008c1f, 0x02140102, 0x681604c2, 0x01007c00,
1289	0x01004800, 0xfb000000, 0x000028d1, 0x1000dc1f, 0x10008c1f,
1290	0x02140102, 0x28160d05, 0x00000010, 0x001b25a4, 0x63db25a4,
1291	0x63db25a4, 0x0c1b25a4, 0x0c1b25a4, 0x0c1b25a4, 0x0c1b25a4,
1292	0x63db25a4, 0x0c1b25a4, 0x63db25a4, 0x63db25a4, 0x63db25a4,
1293	0x63db25a4, 0x001b25a4, 0x001b25a4, 0x6fdb25a4, 0x00000003,
1294	0x00000000, 0x00000300
1295};
1296
1297static const struct urtwn_bb_prog rtl8192cu_bb_prog = {
1298	nitems(rtl8192ce_bb_regs),
1299	rtl8192ce_bb_regs,
1300	rtl8192cu_bb_vals,
1301	nitems(rtl8192ce_agc_vals),
1302	rtl8192ce_agc_vals
1303};
1304
1305/*
1306 * RTL8188CE-VAU.
1307 */
1308static const uint32_t rtl8188ce_bb_vals[] = {
1309	0x0011800d, 0x00ffdb83, 0x80040000, 0x00000001, 0x0000fc00,
1310	0x0000000a, 0x10005388, 0x020c3d10, 0x02200385, 0x00000000,
1311	0x01000100, 0x00390004, 0x00000000, 0x00000000, 0x00000000,
1312	0x00000000, 0x00000000, 0x00000000, 0x00010000, 0x00000000,
1313	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x569a569a,
1314	0x001b25a4, 0x66e60230, 0x061f0130, 0x00000000, 0x32323200,
1315	0x07000700, 0x22004000, 0x00000808, 0x00000000, 0xc0083070,
1316	0x000004d5, 0x00000000, 0xccc000c0, 0x00000800, 0xfffffffe,
1317	0x40302010, 0x00706050, 0x00000000, 0x00000023, 0x00000000,
1318	0x81121111, 0x00d047c8, 0x80ff000c, 0x8c838300, 0x2e68120f,
1319	0x9500bb78, 0x11144028, 0x00881117, 0x89140f00, 0x1a1b0000,
1320	0x090e1317, 0x00000204, 0x00d30000, 0x101fbf00, 0x00000007,
1321	0x48071d40, 0x03a05611, 0x000000e4, 0x6c6c6c6c, 0x08800000,
1322	0x40000100, 0x08800000, 0x40000100, 0x00000000, 0x00000000,
1323	0x00000000, 0x00000000, 0x69e9ac44, 0x469652cf, 0x49795994,
1324	0x0a97971c, 0x1f7c403f, 0x000100b7, 0xec020107, 0x007f037f,
1325	0x6954341e, 0x43bc0094, 0x6954341e, 0x433c0094, 0x00000000,
1326	0x5116848b, 0x47c00bff, 0x00000036, 0x2c7f000d, 0x018610db,
1327	0x0000001f, 0x00b91612, 0x40000100, 0x20f60000, 0x40000100,
1328	0x20200000, 0x00121820, 0x00000000, 0x00121820, 0x00007f7f,
1329	0x00000000, 0x00000080, 0x00000000, 0x00000000, 0x00000000,
1330	0x00000000, 0x00000000, 0x28000000, 0x00000000, 0x00000000,
1331	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x64b22427,
1332	0x00766932, 0x00222222, 0x00000000, 0x37644302, 0x2f97d40c,
1333	0x00080740, 0x00020401, 0x0000907f, 0x20010201, 0xa0633333,
1334	0x3333bc43, 0x7a8f5b6b, 0xcc979975, 0x00000000, 0x80608000,
1335	0x00000000, 0x00027293, 0x00000000, 0x00000000, 0x00000000,
1336	0x00000000, 0x6437140a, 0x00000000, 0x00000000, 0x30032064,
1337	0x4653de68, 0x04518a3c, 0x00002101, 0x2a201c16, 0x1812362e,
1338	0x322c2220, 0x000e3c24, 0x2a2a2a2a, 0x2a2a2a2a, 0x03902a2a,
1339	0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x00000000,
1340	0x1000dc1f, 0x10008c1f, 0x02140102, 0x681604c2, 0x01007c00,
1341	0x01004800, 0xfb000000, 0x000028d1, 0x1000dc1f, 0x10008c1f,
1342	0x02140102, 0x28160d05, 0x00000008, 0x001b25a4, 0x631b25a0,
1343	0x631b25a0, 0x081b25a0, 0x081b25a0, 0x081b25a0, 0x081b25a0,
1344	0x631b25a0, 0x081b25a0, 0x631b25a0, 0x631b25a0, 0x631b25a0,
1345	0x631b25a0, 0x001b25a0, 0x001b25a0, 0x6b1b25a0, 0x00000003,
1346	0x00000000, 0x00000300
1347};
1348
1349static const uint32_t rtl8188ce_agc_vals[] = {
1350	0x7b000001, 0x7b010001, 0x7b020001, 0x7b030001, 0x7b040001,
1351	0x7b050001, 0x7a060001, 0x79070001, 0x78080001, 0x77090001,
1352	0x760a0001, 0x750b0001, 0x740c0001, 0x730d0001, 0x720e0001,
1353	0x710f0001, 0x70100001, 0x6f110001, 0x6e120001, 0x6d130001,
1354	0x6c140001, 0x6b150001, 0x6a160001, 0x69170001, 0x68180001,
1355	0x67190001, 0x661a0001, 0x651b0001, 0x641c0001, 0x631d0001,
1356	0x621e0001, 0x611f0001, 0x60200001, 0x49210001, 0x48220001,
1357	0x47230001, 0x46240001, 0x45250001, 0x44260001, 0x43270001,
1358	0x42280001, 0x41290001, 0x402a0001, 0x262b0001, 0x252c0001,
1359	0x242d0001, 0x232e0001, 0x222f0001, 0x21300001, 0x20310001,
1360	0x06320001, 0x05330001, 0x04340001, 0x03350001, 0x02360001,
1361	0x01370001, 0x00380001, 0x00390001, 0x003a0001, 0x003b0001,
1362	0x003c0001, 0x003d0001, 0x003e0001, 0x003f0001, 0x7b400001,
1363	0x7b410001, 0x7b420001, 0x7b430001, 0x7b440001, 0x7b450001,
1364	0x7a460001, 0x79470001, 0x78480001, 0x77490001, 0x764a0001,
1365	0x754b0001, 0x744c0001, 0x734d0001, 0x724e0001, 0x714f0001,
1366	0x70500001, 0x6f510001, 0x6e520001, 0x6d530001, 0x6c540001,
1367	0x6b550001, 0x6a560001, 0x69570001, 0x68580001, 0x67590001,
1368	0x665a0001, 0x655b0001, 0x645c0001, 0x635d0001, 0x625e0001,
1369	0x615f0001, 0x60600001, 0x49610001, 0x48620001, 0x47630001,
1370	0x46640001, 0x45650001, 0x44660001, 0x43670001, 0x42680001,
1371	0x41690001, 0x406a0001, 0x266b0001, 0x256c0001, 0x246d0001,
1372	0x236e0001, 0x226f0001, 0x21700001, 0x20710001, 0x06720001,
1373	0x05730001, 0x04740001, 0x03750001, 0x02760001, 0x01770001,
1374	0x00780001, 0x00790001, 0x007a0001, 0x007b0001, 0x007c0001,
1375	0x007d0001, 0x007e0001, 0x007f0001, 0x3800001e, 0x3801001e,
1376	0x3802001e, 0x3803001e, 0x3804001e, 0x3805001e, 0x3806001e,
1377	0x3807001e, 0x3808001e, 0x3c09001e, 0x3e0a001e, 0x400b001e,
1378	0x440c001e, 0x480d001e, 0x4c0e001e, 0x500f001e, 0x5210001e,
1379	0x5611001e, 0x5a12001e, 0x5e13001e, 0x6014001e, 0x6015001e,
1380	0x6016001e, 0x6217001e, 0x6218001e, 0x6219001e, 0x621a001e,
1381	0x621b001e, 0x621c001e, 0x621d001e, 0x621e001e, 0x621f001e
1382};
1383
1384static const struct urtwn_bb_prog rtl8188ce_bb_prog = {
1385	nitems(rtl8192ce_bb_regs),
1386	rtl8192ce_bb_regs,
1387	rtl8188ce_bb_vals,
1388	nitems(rtl8188ce_agc_vals),
1389	rtl8188ce_agc_vals
1390};
1391
1392static const uint32_t rtl8188cu_bb_vals[] = {
1393	0x0011800d, 0x00ffdb83, 0x80040000, 0x00000001, 0x0000fc00,
1394	0x0000000a, 0x10005388, 0x020c3d10, 0x02200385, 0x00000000,
1395	0x01000100, 0x00390004, 0x00000000, 0x00000000, 0x00000000,
1396	0x00000000, 0x00000000, 0x00000000, 0x00010000, 0x00000000,
1397	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x569a569a,
1398	0x001b25a4, 0x66e60230, 0x061f0130, 0x00000000, 0x32323200,
1399	0x07000700, 0x22004000, 0x00000808, 0x00000000, 0xc0083070,
1400	0x000004d5, 0x00000000, 0xccc000c0, 0x00000800, 0xfffffffe,
1401	0x40302010, 0x00706050, 0x00000000, 0x00000023, 0x00000000,
1402	0x81121111, 0x00d047c8, 0x80ff000c, 0x8c838300, 0x2e68120f,
1403	0x9500bb78, 0x11144028, 0x00881117, 0x89140f00, 0x1a1b0000,
1404	0x090e1317, 0x00000204, 0x00d30000, 0x101fbf00, 0x00000007,
1405	0x48071d40, 0x03a05611, 0x000000e4, 0x6c6c6c6c, 0x08800000,
1406	0x40000100, 0x08800000, 0x40000100, 0x00000000, 0x00000000,
1407	0x00000000, 0x00000000, 0x69e9ac44, 0x469652cf, 0x49795994,
1408	0x0a97971c, 0x1f7c403f, 0x000100b7, 0xec020107, 0x007f037f,
1409	0x6954341e, 0x43bc0094, 0x6954341e, 0x433c0094, 0x00000000,
1410	0x5116848b, 0x47c00bff, 0x00000036, 0x2c7f000d, 0x018610db,
1411	0x0000001f, 0x00b91612, 0x40000100, 0x20f60000, 0x40000100,
1412	0x20200000, 0x00121820, 0x00000000, 0x00121820, 0x00007f7f,
1413	0x00000000, 0x00000080, 0x00000000, 0x00000000, 0x00000000,
1414	0x00000000, 0x00000000, 0x28000000, 0x00000000, 0x00000000,
1415	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x64b22427,
1416	0x00766932, 0x00222222, 0x00000000, 0x37644302, 0x2f97d40c,
1417	0x00080740, 0x00020401, 0x0000907f, 0x20010201, 0xa0633333,
1418	0x3333bc43, 0x7a8f5b6b, 0xcc979975, 0x00000000, 0x80608000,
1419	0x00000000, 0x00027293, 0x00000000, 0x00000000, 0x00000000,
1420	0x00000000, 0x6437140a, 0x00000000, 0x00000000, 0x30032064,
1421	0x4653de68, 0x04518a3c, 0x00002101, 0x2a201c16, 0x1812362e,
1422	0x322c2220, 0x000e3c24, 0x2a2a2a2a, 0x2a2a2a2a, 0x03902a2a,
1423	0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x00000000,
1424	0x1000dc1f, 0x10008c1f, 0x02140102, 0x681604c2, 0x01007c00,
1425	0x01004800, 0xfb000000, 0x000028d1, 0x1000dc1f, 0x10008c1f,
1426	0x02140102, 0x28160d05, 0x00000008, 0x001b25a4, 0x631b25a0,
1427	0x631b25a0, 0x081b25a0, 0x081b25a0, 0x081b25a0, 0x081b25a0,
1428	0x631b25a0, 0x081b25a0, 0x631b25a0, 0x631b25a0, 0x631b25a0,
1429	0x631b25a0, 0x001b25a0, 0x001b25a0, 0x6b1b25a0, 0x00000003,
1430	0x00000000, 0x00000300
1431};
1432
1433static const struct urtwn_bb_prog rtl8188cu_bb_prog = {
1434	nitems(rtl8192ce_bb_regs),
1435	rtl8192ce_bb_regs,
1436	rtl8188cu_bb_vals,
1437	nitems(rtl8188ce_agc_vals),
1438	rtl8188ce_agc_vals
1439};
1440
1441/*
1442 * RTL8188EU.
1443 */
1444static const uint16_t rtl8188eu_bb_regs[] = {
1445	0x800, 0x804, 0x808, 0x80c, 0x810, 0x814, 0x818, 0x81c,
1446	0x820, 0x824, 0x828, 0x82c, 0x830, 0x834, 0x838, 0x83c,
1447	0x840, 0x844, 0x848, 0x84c, 0x850, 0x854, 0x858, 0x85c,
1448	0x860, 0x864, 0x868, 0x86c, 0x870, 0x874, 0x878, 0x87c,
1449	0x880, 0x884, 0x888, 0x88c, 0x890, 0x894, 0x898, 0x89c,
1450	0x900, 0x904, 0x908, 0x90c, 0x910, 0x914, 0xa00, 0xa04,
1451	0xa08, 0xa0c, 0xa10, 0xa14, 0xa18, 0xa1c, 0xa20, 0xa24,
1452	0xa28, 0xa2c, 0xa70, 0xa74, 0xa78, 0xa7c, 0xa80, 0xb2c,
1453	0xc00, 0xc04, 0xc08, 0xc0c, 0xc10, 0xc14, 0xc18, 0xc1c,
1454	0xc20, 0xc24, 0xc28, 0xc2c, 0xc30, 0xc34, 0xc38, 0xc3c,
1455	0xc40, 0xc44, 0xc48, 0xc4c, 0xc50, 0xc54, 0xc58, 0xc5c,
1456	0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74, 0xc78, 0xc7c,
1457	0xc80, 0xc84, 0xc88, 0xc8c, 0xc90, 0xc94, 0xc98, 0xc9c,
1458	0xca0, 0xca4, 0xca8, 0xcac, 0xcb0, 0xcb4, 0xcb8, 0xcbc,
1459	0xcc0, 0xcc4, 0xcc8, 0xccc, 0xcd0, 0xcd4, 0xcd8, 0xcdc,
1460	0xce0, 0xce4, 0xce8, 0xcec, 0xd00, 0xd04, 0xd08, 0xd0c,
1461	0xd10, 0xd14, 0xd18, 0xd2c, 0xd30, 0xd34, 0xd38, 0xd3c,
1462	0xd40, 0xd44, 0xd48, 0xd4c, 0xd50, 0xd54, 0xd58, 0xd5c,
1463	0xd60, 0xd64, 0xd68, 0xd6c, 0xd70, 0xd74, 0xd78, 0xe00,
1464	0xe04, 0xe08, 0xe10, 0xe14, 0xe18, 0xe1c, 0xe28, 0xe30,
1465	0xe34, 0xe38, 0xe3c, 0xe40, 0xe44, 0xe48, 0xe4c, 0xe50,
1466	0xe54, 0xe58, 0xe5c, 0xe60, 0xe68, 0xe6c, 0xe70, 0xe74,
1467	0xe78, 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, 0xed0, 0xed4,
1468	0xed8, 0xedc, 0xee0, 0xee8, 0xeec, 0xf14, 0xf4c, 0xf00
1469};
1470
1471static const uint32_t rtl8188eu_bb_vals[] = {
1472	0x80040000, 0x00000003, 0x0000fc00, 0x0000000a, 0x10001331,
1473	0x020c3d10, 0x02200385, 0x00000000, 0x01000100, 0x00390204,
1474	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
1475	0x00000000, 0x00010000, 0x00000000, 0x00000000, 0x00000000,
1476	0x00000000, 0x00000000, 0x569a11a9, 0x01000014, 0x66f60110,
1477	0x061f0649, 0x00000000, 0x27272700, 0x07000760, 0x25004000,
1478	0x00000808, 0x00000000, 0xb0000c1c, 0x00000001, 0x00000000,
1479	0xccc000c0, 0x00000800, 0xfffffffe, 0x40302010, 0x00706050,
1480	0x00000000, 0x00000023, 0x00000000, 0x81121111, 0x00000002,
1481	0x00000201, 0x00d047c8, 0x80ff000c, 0x8c838300, 0x2e7f120f,
1482	0x9500bb78, 0x1114d028, 0x00881117, 0x89140f00, 0x1a1b0000,
1483	0x090e1317, 0x00000204, 0x00d30000, 0x101fbf00, 0x00000007,
1484	0x00000900, 0x225b0606, 0x218075b1, 0x80000000, 0x48071d40,
1485	0x03a05611, 0x000000e4, 0x6c6c6c6c, 0x08800000, 0x40000100,
1486	0x08800000, 0x40000100, 0x00000000, 0x00000000, 0x00000000,
1487	0x00000000, 0x69e9ac47, 0x469652af, 0x49795994, 0x0a97971c,
1488	0x1f7c403f, 0x000100b7, 0xec020107, 0x007f037f, 0x69553420,
1489	0x43bc0094, 0x00013169, 0x00250492, 0x00000000, 0x7112848b,
1490	0x47c00bff, 0x00000036, 0x2c7f000d, 0x020610db, 0x0000001f,
1491	0x00b91612, 0x390000e4, 0x20f60000, 0x40000100, 0x20200000,
1492	0x00091521, 0x00000000, 0x00121820, 0x00007f7f, 0x00000000,
1493	0x000300a0, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
1494	0x00000000, 0x28000000, 0x00000000, 0x00000000, 0x00000000,
1495	0x00000000, 0x00000000, 0x00000000, 0x64b22427, 0x00766932,
1496	0x00222222, 0x00000000, 0x37644302, 0x2f97d40c, 0x00000740,
1497	0x00020401, 0x0000907f, 0x20010201, 0xa0633333, 0x3333bc43,
1498	0x7a8f5b6f, 0xcc979975, 0x00000000, 0x80608000, 0x00000000,
1499	0x00127353, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
1500	0x6437140a, 0x00000000, 0x00000282, 0x30032064, 0x4653de68,
1501	0x04518a3c, 0x00002101, 0x2a201c16, 0x1812362e, 0x322c2220,
1502	0x000e3c24, 0x2d2d2d2d, 0x2d2d2d2d, 0x0390272d, 0x2d2d2d2d,
1503	0x2d2d2d2d, 0x2d2d2d2d, 0x2d2d2d2d, 0x00000000, 0x1000dc1f,
1504	0x10008c1f, 0x02140102, 0x681604c2, 0x01007c00, 0x01004800,
1505	0xfb000000, 0x000028d1, 0x1000dc1f, 0x10008c1f, 0x02140102,
1506	0x28160d05, 0x00000008, 0x001b25a4, 0x00c00014, 0x00c00014,
1507	0x01000014, 0x01000014, 0x01000014, 0x01000014, 0x00c00014,
1508	0x01000014, 0x00c00014, 0x00c00014, 0x00c00014, 0x00c00014,
1509	0x00000014, 0x00000014, 0x21555448, 0x01c00014, 0x00000003,
1510	0x00000000, 0x00000300
1511};
1512
1513static const uint32_t rtl8188eu_agc_vals[] = {
1514	0xfb000001, 0xfb010001, 0xfb020001, 0xfb030001, 0xfb040001,
1515	0xfb050001, 0xfa060001, 0xf9070001, 0xf8080001, 0xf7090001,
1516	0xf60a0001, 0xf50b0001, 0xf40c0001, 0xf30d0001, 0xf20e0001,
1517	0xf10f0001, 0xf0100001, 0xef110001, 0xee120001, 0xed130001,
1518	0xec140001, 0xeb150001, 0xea160001, 0xe9170001, 0xe8180001,
1519	0xe7190001, 0xe61a0001, 0xe51b0001, 0xe41c0001, 0xe31d0001,
1520	0xe21e0001, 0xe11f0001, 0x8a200001, 0x89210001, 0x88220001,
1521	0x87230001, 0x86240001, 0x85250001, 0x84260001, 0x83270001,
1522	0x82280001, 0x6b290001, 0x6a2a0001, 0x692b0001, 0x682c0001,
1523	0x672d0001, 0x662e0001, 0x652f0001, 0x64300001, 0x63310001,
1524	0x62320001, 0x61330001, 0x46340001, 0x45350001, 0x44360001,
1525	0x43370001, 0x42380001, 0x41390001, 0x403a0001, 0x403b0001,
1526	0x403c0001, 0x403d0001, 0x403e0001, 0x403f0001, 0xfb400001,
1527	0xfb410001, 0xfb420001, 0xfb430001, 0xfb440001, 0xfb450001,
1528	0xfb460001, 0xfb470001, 0xfb480001, 0xfa490001, 0xf94a0001,
1529	0xf84B0001, 0xf74c0001, 0xf64d0001, 0xf54e0001, 0xf44f0001,
1530	0xf3500001, 0xf2510001, 0xf1520001, 0xf0530001, 0xef540001,
1531	0xee550001, 0xed560001, 0xec570001, 0xeb580001, 0xea590001,
1532	0xe95a0001, 0xe85b0001, 0xe75c0001, 0xe65d0001, 0xe55e0001,
1533	0xe45f0001, 0xe3600001, 0xe2610001, 0xc3620001, 0xc2630001,
1534	0xc1640001, 0x8b650001, 0x8a660001, 0x89670001, 0x88680001,
1535	0x87690001, 0x866a0001, 0x856b0001, 0x846c0001, 0x676d0001,
1536	0x666e0001, 0x656f0001, 0x64700001, 0x63710001, 0x62720001,
1537	0x61730001, 0x60740001, 0x46750001, 0x45760001, 0x44770001,
1538	0x43780001, 0x42790001, 0x417a0001, 0x407b0001, 0x407c0001,
1539	0x407d0001, 0x407e0001, 0x407f0001
1540};
1541
1542static const struct urtwn_bb_prog rtl8188eu_bb_prog = {
1543	nitems(rtl8188eu_bb_regs),
1544	rtl8188eu_bb_regs,
1545	rtl8188eu_bb_vals,
1546	nitems(rtl8188eu_agc_vals),
1547	rtl8188eu_agc_vals
1548};
1549
1550/*
1551 * RTL8188RU.
1552 */
1553static const uint16_t rtl8188ru_bb_regs[] = {
1554	0x024, 0x028, 0x040, 0x800, 0x804, 0x808, 0x80c, 0x810, 0x814,
1555	0x818, 0x81c, 0x820, 0x824, 0x828, 0x82c, 0x830, 0x834, 0x838,
1556	0x83c, 0x840, 0x844, 0x848, 0x84c, 0x850, 0x854, 0x858, 0x85c,
1557	0x860, 0x864, 0x868, 0x86c, 0x870, 0x874, 0x878, 0x87c, 0x880,
1558	0x884, 0x888, 0x88c, 0x890, 0x894, 0x898, 0x89c, 0x900, 0x904,
1559	0x908, 0x90c, 0xa00, 0xa04, 0xa08, 0xa0c, 0xa10, 0xa14, 0xa18,
1560	0xa1c, 0xa20, 0xa24, 0xa28, 0xa2c, 0xa70, 0xa74, 0xc00, 0xc04,
1561	0xc08, 0xc0c, 0xc10, 0xc14, 0xc18, 0xc1c, 0xc20, 0xc24, 0xc28,
1562	0xc2c, 0xc30, 0xc34, 0xc38, 0xc3c, 0xc40, 0xc44, 0xc48, 0xc4c,
1563	0xc50, 0xc54, 0xc58, 0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70,
1564	0xc74, 0xc78, 0xc7c, 0xc80, 0xc84, 0xc88, 0xc8c, 0xc90, 0xc94,
1565	0xc98, 0xc9c, 0xca0, 0xca4, 0xca8, 0xcac, 0xcb0, 0xcb4, 0xcb8,
1566	0xcbc, 0xcc0, 0xcc4, 0xcc8, 0xccc, 0xcd0, 0xcd4, 0xcd8, 0xcdc,
1567	0xce0, 0xce4, 0xce8, 0xcec, 0xd00, 0xd04, 0xd08, 0xd0c, 0xd10,
1568	0xd14, 0xd18, 0xd2c, 0xd30, 0xd34, 0xd38, 0xd3c, 0xd40, 0xd44,
1569	0xd48, 0xd4c, 0xd50, 0xd54, 0xd58, 0xd5c, 0xd60, 0xd64, 0xd68,
1570	0xd6c, 0xd70, 0xd74, 0xd78, 0xe00, 0xe04, 0xe08, 0xe10, 0xe14,
1571	0xe18, 0xe1c, 0xe28, 0xe30, 0xe34, 0xe38, 0xe3c, 0xe40, 0xe44,
1572	0xe48, 0xe4c, 0xe50, 0xe54, 0xe58, 0xe5c, 0xe60, 0xe68, 0xe6c,
1573	0xe70, 0xe74, 0xe78, 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c, 0xed0,
1574	0xed4, 0xed8, 0xedc, 0xee0, 0xeec, 0xee8, 0xf14, 0xf4c, 0xf00
1575};
1576
1577static const uint32_t rtl8188ru_bb_vals[] = {
1578	0x0011800d, 0x00ffdb83, 0x000c0004, 0x80040000, 0x00000001,
1579	0x0000fc00, 0x0000000a, 0x10005388, 0x020c3d10, 0x02200385,
1580	0x00000000, 0x01000100, 0x00390204, 0x00000000, 0x00000000,
1581	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00010000,
1582	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
1583	0x569a569a, 0x001b25a4, 0x66e60230, 0x061f0130, 0x00000000,
1584	0x32323200, 0x03000300, 0x22004000, 0x00000808, 0x00ffc3f1,
1585	0xc0083070, 0x000004d5, 0x00000000, 0xccc000c0, 0x00000800,
1586	0xfffffffe, 0x40302010, 0x00706050, 0x00000000, 0x00000023,
1587	0x00000000, 0x81121111, 0x00d047c8, 0x80ff000c, 0x8c838300,
1588	0x2e68120f, 0x9500bb78, 0x11144028, 0x00881117, 0x89140f00,
1589	0x15160000, 0x070b0f12, 0x00000104, 0x00d30000, 0x101fbf00,
1590	0x00000007, 0x48071d40, 0x03a05611, 0x000000e4, 0x6c6c6c6c,
1591	0x08800000, 0x40000100, 0x08800000, 0x40000100, 0x00000000,
1592	0x00000000, 0x00000000, 0x00000000, 0x69e9ac44, 0x469652cf,
1593	0x49795994, 0x0a97971c, 0x1f7c403f, 0x000100b7, 0xec020107,
1594	0x007f037f, 0x6954342e, 0x43bc0094, 0x6954342f, 0x433c0094,
1595	0x00000000, 0x5116848b, 0x47c00bff, 0x00000036, 0x2c56000d,
1596	0x018610db, 0x0000001f, 0x00b91612, 0x24000090, 0x20f60000,
1597	0x24000090, 0x20200000, 0x00121820, 0x00000000, 0x00121820,
1598	0x00007f7f, 0x00000000, 0x00000080, 0x00000000, 0x00000000,
1599	0x00000000, 0x00000000, 0x00000000, 0x28000000, 0x00000000,
1600	0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
1601	0x64b22427, 0x00766932, 0x00222222, 0x00000000, 0x37644302,
1602	0x2f97d40c, 0x00080740, 0x00020401, 0x0000907f, 0x20010201,
1603	0xa0633333, 0x3333bc43, 0x7a8f5b6b, 0xcc979975, 0x00000000,
1604	0x80608000, 0x00000000, 0x00027293, 0x00000000, 0x00000000,
1605	0x00000000, 0x00000000, 0x6437140a, 0x00000000, 0x00000000,
1606	0x30032064, 0x4653de68, 0x04518a3c, 0x00002101, 0x2a201c16,
1607	0x1812362e, 0x322c2220, 0x000e3c24, 0x2a2a2a2a, 0x2a2a2a2a,
1608	0x03902a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a, 0x2a2a2a2a,
1609	0x00000000, 0x1000dc1f, 0x10008c1f, 0x02140102, 0x681604c2,
1610	0x01007c00, 0x01004800, 0xfb000000, 0x000028d1, 0x1000dc1f,
1611	0x10008c1f, 0x02140102, 0x28160d05, 0x00000010, 0x001b25a4,
1612	0x631b25a0, 0x631b25a0, 0x081b25a0, 0x081b25a0, 0x081b25a0,
1613	0x081b25a0, 0x631b25a0, 0x081b25a0, 0x631b25a0, 0x631b25a0,
1614	0x631b25a0, 0x631b25a0, 0x001b25a0, 0x001b25a0, 0x6b1b25a0,
1615	0x31555448, 0x00000003, 0x00000000, 0x00000300
1616};
1617
1618static const uint32_t rtl8188ru_agc_vals[] = {
1619	0x7b000001, 0x7b010001, 0x7b020001, 0x7b030001, 0x7b040001,
1620	0x7b050001, 0x7b060001, 0x7b070001, 0x7b080001, 0x7a090001,
1621	0x790a0001, 0x780b0001, 0x770c0001, 0x760d0001, 0x750e0001,
1622	0x740f0001, 0x73100001, 0x72110001, 0x71120001, 0x70130001,
1623	0x6f140001, 0x6e150001, 0x6d160001, 0x6c170001, 0x6b180001,
1624	0x6a190001, 0x691a0001, 0x681b0001, 0x671c0001, 0x661d0001,
1625	0x651e0001, 0x641f0001, 0x63200001, 0x62210001, 0x61220001,
1626	0x60230001, 0x46240001, 0x45250001, 0x44260001, 0x43270001,
1627	0x42280001, 0x41290001, 0x402a0001, 0x262b0001, 0x252c0001,
1628	0x242d0001, 0x232e0001, 0x222f0001, 0x21300001, 0x20310001,
1629	0x06320001, 0x05330001, 0x04340001, 0x03350001, 0x02360001,
1630	0x01370001, 0x00380001, 0x00390001, 0x003a0001, 0x003b0001,
1631	0x003c0001, 0x003d0001, 0x003e0001, 0x003f0001, 0x7b400001,
1632	0x7b410001, 0x7b420001, 0x7b430001, 0x7b440001, 0x7b450001,
1633	0x7b460001, 0x7b470001, 0x7b480001, 0x7a490001, 0x794a0001,
1634	0x784b0001, 0x774c0001, 0x764d0001, 0x754e0001, 0x744f0001,
1635	0x73500001, 0x72510001, 0x71520001, 0x70530001, 0x6f540001,
1636	0x6e550001, 0x6d560001, 0x6c570001, 0x6b580001, 0x6a590001,
1637	0x695a0001, 0x685b0001, 0x675c0001, 0x665d0001, 0x655e0001,
1638	0x645f0001, 0x63600001, 0x62610001, 0x61620001, 0x60630001,
1639	0x46640001, 0x45650001, 0x44660001, 0x43670001, 0x42680001,
1640	0x41690001, 0x406a0001, 0x266b0001, 0x256c0001, 0x246d0001,
1641	0x236e0001, 0x226f0001, 0x21700001, 0x20710001, 0x06720001,
1642	0x05730001, 0x04740001, 0x03750001, 0x02760001, 0x01770001,
1643	0x00780001, 0x00790001, 0x007a0001, 0x007b0001, 0x007c0001,
1644	0x007d0001, 0x007e0001, 0x007f0001, 0x3800001e, 0x3801001e,
1645	0x3802001e, 0x3803001e, 0x3804001e, 0x3805001e, 0x3806001e,
1646	0x3807001e, 0x3808001e, 0x3c09001e, 0x3e0a001e, 0x400b001e,
1647	0x440c001e, 0x480d001e, 0x4c0e001e, 0x500f001e, 0x5210001e,
1648	0x5611001e, 0x5a12001e, 0x5e13001e, 0x6014001e, 0x6015001e,
1649	0x6016001e, 0x6217001e, 0x6218001e, 0x6219001e, 0x621a001e,
1650	0x621b001e, 0x621c001e, 0x621d001e, 0x621e001e, 0x621f001e
1651};
1652
1653static const struct urtwn_bb_prog rtl8188ru_bb_prog = {
1654	nitems(rtl8188ru_bb_regs),
1655	rtl8188ru_bb_regs,
1656	rtl8188ru_bb_vals,
1657	nitems(rtl8188ru_agc_vals),
1658	rtl8188ru_agc_vals
1659};
1660
1661/*
1662 * RF initialization values.
1663 */
1664struct urtwn_rf_prog {
1665	int		count;
1666	const uint8_t	*regs;
1667	const uint32_t	*vals;
1668};
1669
1670/*
1671 * RTL8192CU and RTL8192CE-VAU.
1672 */
1673static const uint8_t rtl8192ce_rf1_regs[] = {
1674	0x00, 0x01, 0x02, 0x03, 0x04, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
1675	0x0f, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22,
1676	0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2a, 0x2b,
1677	0x2a, 0x2b, 0x2b, 0x2c, 0x2a, 0x2b, 0x2b, 0x2c, 0x2a, 0x2b, 0x2b,
1678	0x2c, 0x2a, 0x2b, 0x2b, 0x2c, 0x2a, 0x2b, 0x2b, 0x2c, 0x2a, 0x2b,
1679	0x2b, 0x2c, 0x2a, 0x2b, 0x2b, 0x2c, 0x2a, 0x2b, 0x2b, 0x2c, 0x2a,
1680	0x2b, 0x2b, 0x2c, 0x2a, 0x2b, 0x2b, 0x2c, 0x2a, 0x2b, 0x2b, 0x2c,
1681	0x2a, 0x2b, 0x2b, 0x2c, 0x2a, 0x2b, 0x2b, 0x2c, 0x2a, 0x2b, 0x2b,
1682	0x2c, 0x2a, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x10, 0x11, 0x10,
1683	0x11, 0x10, 0x11, 0x10, 0x11, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13,
1684	0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14,
1685	0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x00,
1686	0x18, 0xfe, 0xfe, 0x1f, 0xfe, 0xfe, 0x1e, 0x1f, 0x00
1687};
1688
1689static const uint32_t rtl8192ce_rf1_vals[] = {
1690	0x30159, 0x31284, 0x98000, 0x18c63, 0x210e7, 0x2044f, 0x1adb1,
1691	0x54867, 0x8992e, 0x0e52c, 0x39ce7, 0x00451, 0x00000, 0x10255,
1692	0x60a00, 0xfc378, 0xa1250, 0x4445f, 0x80001, 0x0b614, 0x6c000,
1693	0x00000, 0x01558, 0x00060, 0x00483, 0x4f000, 0xec7d9, 0x577c0,
1694	0x04783, 0x00001, 0x21334, 0x00000, 0x00054, 0x00001, 0x00808,
1695	0x53333, 0x0000c, 0x00002, 0x00808, 0x5b333, 0x0000d, 0x00003,
1696	0x00808, 0x63333, 0x0000d, 0x00004, 0x00808, 0x6b333, 0x0000d,
1697	0x00005, 0x00808, 0x73333, 0x0000d, 0x00006, 0x00709, 0x5b333,
1698	0x0000d, 0x00007, 0x00709, 0x63333, 0x0000d, 0x00008, 0x0060a,
1699	0x4b333, 0x0000d, 0x00009, 0x0060a, 0x53333, 0x0000d, 0x0000a,
1700	0x0060a, 0x5b333, 0x0000d, 0x0000b, 0x0060a, 0x63333, 0x0000d,
1701	0x0000c, 0x0060a, 0x6b333, 0x0000d, 0x0000d, 0x0060a, 0x73333,
1702	0x0000d, 0x0000e, 0x0050b, 0x66666, 0x0001a, 0xe0000, 0x4000f,
1703	0xe31fc, 0x6000f, 0xff9f8, 0x2000f, 0x203f9, 0x3000f, 0xff500,
1704	0x00000, 0x00000, 0x8000f, 0x3f100, 0x9000f, 0x23100, 0x32000,
1705	0x71000, 0xb0000, 0xfc000, 0x287af, 0x244b7, 0x204ab, 0x1c49f,
1706	0x18493, 0x14297, 0x10295, 0x0c298, 0x0819c, 0x040a8, 0x0001c,
1707	0x1944c, 0x59444, 0x9944c, 0xd9444, 0x0f424, 0x4f424, 0x8f424,
1708	0xcf424, 0xe0330, 0xa0330, 0x60330, 0x20330, 0x10159, 0x0f401,
1709	0x00000, 0x00000, 0x80003, 0x00000, 0x00000, 0x44457, 0x80000,
1710	0x30159
1711};
1712
1713static const uint8_t rtl8192ce_rf2_regs[] = {
1714	0x00, 0x01, 0x02, 0x03, 0x04, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,
1715	0x0f, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13,
1716	0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15,
1717	0x15, 0x15, 0x16, 0x16, 0x16, 0x16
1718};
1719
1720static const uint32_t rtl8192ce_rf2_vals[] = {
1721	0x30159, 0x31284, 0x98000, 0x18c63, 0x210e7, 0x2044f, 0x1adb1,
1722	0x54867, 0x8992e, 0x0e52c, 0x39ce7, 0x00451, 0x32000, 0x71000,
1723	0xb0000, 0xfc000, 0x287af, 0x244b7, 0x204ab, 0x1c49f, 0x18493,
1724	0x14297, 0x10295, 0x0c298, 0x0819c, 0x040a8, 0x0001c, 0x1944c,
1725	0x59444, 0x9944c, 0xd9444, 0x0f424, 0x4f424, 0x8f424, 0xcf424,
1726	0xe0330, 0xa0330, 0x60330, 0x20330
1727};
1728
1729static const struct urtwn_rf_prog rtl8192ce_rf_prog[] = {
1730	{
1731		nitems(rtl8192ce_rf1_regs),
1732		rtl8192ce_rf1_regs,
1733		rtl8192ce_rf1_vals
1734	},
1735	{
1736		nitems(rtl8192ce_rf2_regs),
1737		rtl8192ce_rf2_regs,
1738		rtl8192ce_rf2_vals
1739	}
1740};
1741
1742/*
1743 * RTL8188CE-VAU.
1744 */
1745static const uint32_t rtl8188ce_rf_vals[] = {
1746	0x30159, 0x31284, 0x98000, 0x18c63, 0x210e7, 0x2044f, 0x1adb1,
1747	0x54867, 0x8992e, 0x0e52c, 0x39ce7, 0x00451, 0x00000, 0x10255,
1748	0x60a00, 0xfc378, 0xa1250, 0x4445f, 0x80001, 0x0b614, 0x6c000,
1749	0x00000, 0x01558, 0x00060, 0x00483, 0x4f200, 0xec7d9, 0x577c0,
1750	0x04783, 0x00001, 0x21334, 0x00000, 0x00054, 0x00001, 0x00808,
1751	0x53333, 0x0000c, 0x00002, 0x00808, 0x5b333, 0x0000d, 0x00003,
1752	0x00808, 0x63333, 0x0000d, 0x00004, 0x00808, 0x6b333, 0x0000d,
1753	0x00005, 0x00808, 0x73333, 0x0000d, 0x00006, 0x00709, 0x5b333,
1754	0x0000d, 0x00007, 0x00709, 0x63333, 0x0000d, 0x00008, 0x0060a,
1755	0x4b333, 0x0000d, 0x00009, 0x0060a, 0x53333, 0x0000d, 0x0000a,
1756	0x0060a, 0x5b333, 0x0000d, 0x0000b, 0x0060a, 0x63333, 0x0000d,
1757	0x0000c, 0x0060a, 0x6b333, 0x0000d, 0x0000d, 0x0060a, 0x73333,
1758	0x0000d, 0x0000e, 0x0050b, 0x66666, 0x0001a, 0xe0000, 0x4000f,
1759	0xe31fc, 0x6000f, 0xff9f8, 0x2000f, 0x203f9, 0x3000f, 0xff500,
1760	0x00000, 0x00000, 0x8000f, 0x3f100, 0x9000f, 0x23100, 0x32000,
1761	0x71000, 0xb0000, 0xfc000, 0x287b3, 0x244b7, 0x204ab, 0x1c49f,
1762	0x18493, 0x1429b, 0x10299, 0x0c29c, 0x081a0, 0x040ac, 0x00020,
1763	0x1944c, 0x59444, 0x9944c, 0xd9444, 0x0f424, 0x4f424, 0x8f424,
1764	0xcf424, 0xe0330, 0xa0330, 0x60330, 0x20330, 0x10159, 0x0f401,
1765	0x00000, 0x00000, 0x80003, 0x00000, 0x00000, 0x44457, 0x80000,
1766	0x30159
1767};
1768
1769static const struct urtwn_rf_prog rtl8188ce_rf_prog[] = {
1770	{
1771		nitems(rtl8192ce_rf1_regs),
1772		rtl8192ce_rf1_regs,
1773		rtl8188ce_rf_vals
1774	}
1775};
1776
1777
1778/*
1779 * RTL8188CU.
1780 */
1781static const uint32_t rtl8188cu_rf_vals[] = {
1782	0x30159, 0x31284, 0x98000, 0x18c63, 0x210e7, 0x2044f, 0x1adb1,
1783	0x54867, 0x8992e, 0x0e52c, 0x39ce7, 0x00451, 0x00000, 0x10255,
1784	0x60a00, 0xfc378, 0xa1250, 0x4445f, 0x80001, 0x0b614, 0x6c000,
1785	0x00000, 0x01558, 0x00060, 0x00483, 0x4f000, 0xec7d9, 0x577c0,
1786	0x04783, 0x00001, 0x21334, 0x00000, 0x00054, 0x00001, 0x00808,
1787	0x53333, 0x0000c, 0x00002, 0x00808, 0x5b333, 0x0000d, 0x00003,
1788	0x00808, 0x63333, 0x0000d, 0x00004, 0x00808, 0x6b333, 0x0000d,
1789	0x00005, 0x00808, 0x73333, 0x0000d, 0x00006, 0x00709, 0x5b333,
1790	0x0000d, 0x00007, 0x00709, 0x63333, 0x0000d, 0x00008, 0x0060a,
1791	0x4b333, 0x0000d, 0x00009, 0x0060a, 0x53333, 0x0000d, 0x0000a,
1792	0x0060a, 0x5b333, 0x0000d, 0x0000b, 0x0060a, 0x63333, 0x0000d,
1793	0x0000c, 0x0060a, 0x6b333, 0x0000d, 0x0000d, 0x0060a, 0x73333,
1794	0x0000d, 0x0000e, 0x0050b, 0x66666, 0x0001a, 0xe0000, 0x4000f,
1795	0xe31fc, 0x6000f, 0xff9f8, 0x2000f, 0x203f9, 0x3000f, 0xff500,
1796	0x00000, 0x00000, 0x8000f, 0x3f100, 0x9000f, 0x23100, 0x32000,
1797	0x71000, 0xb0000, 0xfc000, 0x287b3, 0x244b7, 0x204ab, 0x1c49f,
1798	0x18493, 0x1429b, 0x10299, 0x0c29c, 0x081a0, 0x040ac, 0x00020,
1799	0x1944c, 0x59444, 0x9944c, 0xd9444, 0x0f405, 0x4f405, 0x8f405,
1800	0xcf405, 0xe0330, 0xa0330, 0x60330, 0x20330, 0x10159, 0x0f401,
1801	0x00000, 0x00000, 0x80003, 0x00000, 0x00000, 0x44457, 0x80000,
1802	0x30159
1803};
1804
1805static const struct urtwn_rf_prog rtl8188cu_rf_prog[] = {
1806	{
1807		nitems(rtl8192ce_rf1_regs),
1808		rtl8192ce_rf1_regs,
1809		rtl8188cu_rf_vals
1810	}
1811};
1812
1813/*
1814 * RTL8188EU.
1815 */
1816static const uint8_t rtl8188eu_rf_regs[] = {
1817	0x00, 0x08, 0x18, 0x19, 0x1e, 0x1f, 0x2f, 0x3f, 0x42, 0x57,
1818	0x58, 0x67, 0x83, 0xb0, 0xb1, 0xb2, 0xb4, 0xb6, 0xb7, 0xb8,
1819	0xb9, 0xba, 0xbb, 0xbf, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
1820	0xc8, 0xc9, 0xca, 0xdf, 0xef, 0x51, 0x52, 0x53, 0x56,
1821	0x35, 0x35, 0x35, 0x36, 0x36, 0x36, 0x36, 0xb6, 0x18, 0x5a,
1822	0x19, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34, 0x34,
1823	0x34, 0x34, 0x00, 0x84, 0x86, 0x87, 0x8e, 0x8f, 0xef, 0x3b,
1824	0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0x3b,
1825	0x3b, 0x3b, 0x3b, 0x3b, 0x3b, 0xef, 0x00, 0x18, 0xfe, 0xfe,
1826	0x1f, 0xfe, 0xfe, 0x1e, 0x1f, 0x00
1827};
1828
1829static const uint32_t rtl8188eu_rf_vals[] = {
1830	0x30000, 0x84000, 0x00407, 0x00012, 0x80009, 0x00880, 0x1a060,
1831	0x00000, 0x060c0, 0xd0000, 0xbe180, 0x01552, 0x00000, 0xff8fc,
1832	0x54400, 0xccc19, 0x43003, 0x4953e, 0x1c718, 0x060ff, 0x80001,
1833	0x40000, 0x00400, 0xc0000, 0x02400, 0x00009, 0x40c91, 0x99999,
1834	0x000a3, 0x88820, 0x76c06, 0x00000, 0x80000, 0x00180, 0x001a0,
1835	0x6b27d, 0x7e49d, 0x00073, 0x51ff3, 0x00086, 0x00186,
1836	0x00286, 0x01c25, 0x09c25, 0x11c25, 0x19c25, 0x48538, 0x00c07,
1837	0x4bd00, 0x739d0, 0x0adf3, 0x09df0, 0x08ded, 0x07dea, 0x06de7,
1838	0x054ee, 0x044eb, 0x034e8, 0x0246b, 0x01468, 0x0006d, 0x30159,
1839	0x68200, 0x000ce, 0x48a00, 0x65540, 0x88000, 0x020a0, 0xf02b0,
1840	0xef7b0, 0xd4fb0, 0xcf060, 0xb0090, 0xa0080, 0x90080, 0x8f780,
1841	0x722b0, 0x6f7b0, 0x54fb0, 0x4f060, 0x30090, 0x20080, 0x10080,
1842	0x0f780, 0x000a0, 0x10159, 0x0f407, 0x00000, 0x00000, 0x80003,
1843	0x00000, 0x00000, 0x00001, 0x80000, 0x33e60
1844};
1845
1846static const struct urtwn_rf_prog rtl8188eu_rf_prog[] = {
1847	{
1848		nitems(rtl8188eu_rf_regs),
1849		rtl8188eu_rf_regs,
1850		rtl8188eu_rf_vals
1851	}
1852};
1853
1854/*
1855 * RTL8188RU.
1856 */
1857static const uint32_t rtl8188ru_rf_vals[] = {
1858	0x30159, 0x31284, 0x98000, 0x18c63, 0x210e7, 0x2044f, 0x1adb0,
1859	0x54867, 0x8992e, 0x0e529, 0x39ce7, 0x00451, 0x00000, 0x00255,
1860	0x60a00, 0xfc378, 0xa1250, 0x4445f, 0x80001, 0x0b614, 0x6c000,
1861	0x0083c, 0x01558, 0x00060, 0x00483, 0x4f000, 0xec7d9, 0x977c0,
1862	0x04783, 0x00001, 0x21334, 0x00000, 0x00054, 0x00001, 0x00808,
1863	0x53333, 0x0000c, 0x00002, 0x00808, 0x5b333, 0x0000d, 0x00003,
1864	0x00808, 0x63333, 0x0000d, 0x00004, 0x00808, 0x6b333, 0x0000d,
1865	0x00005, 0x00808, 0x73333, 0x0000d, 0x00006, 0x00709, 0x5b333,
1866	0x0000d, 0x00007, 0x00709, 0x63333, 0x0000d, 0x00008, 0x0060a,
1867	0x4b333, 0x0000d, 0x00009, 0x0060a, 0x53333, 0x0000d, 0x0000a,
1868	0x0060a, 0x5b333, 0x0000d, 0x0000b, 0x0060a, 0x63333, 0x0000d,
1869	0x0000c, 0x0060a, 0x6b333, 0x0000d, 0x0000d, 0x0060a, 0x73333,
1870	0x0000d, 0x0000e, 0x0050b, 0x66666, 0x0001a, 0xe0000, 0x4000f,
1871	0xe31fc, 0x6000f, 0xff9f8, 0x2000f, 0x203f9, 0x3000f, 0xff500,
1872	0x00000, 0x00000, 0x8000f, 0x3f100, 0x9000f, 0x23100, 0xd8000,
1873	0x90000, 0x51000, 0x12000, 0x28fb4, 0x24fa8, 0x207a4, 0x1c798,
1874	0x183a4, 0x14398, 0x101a4, 0x0c198, 0x080a4, 0x04098, 0x00014,
1875	0x1944c, 0x59444, 0x9944c, 0xd9444, 0x0f405, 0x4f405, 0x8f405,
1876	0xcf405, 0xe0330, 0xa0330, 0x60330, 0x20330, 0x10159, 0x0f401,
1877	0x00000, 0x00000, 0x80003, 0x00000, 0x00000, 0x44457, 0x80000,
1878	0x30159
1879};
1880
1881static const struct urtwn_rf_prog rtl8188ru_rf_prog[] = {
1882	{
1883		nitems(rtl8192ce_rf1_regs),
1884		rtl8192ce_rf1_regs,
1885		rtl8188ru_rf_vals
1886	}
1887};
1888
1889struct urtwn_txpwr {
1890	uint8_t	pwr[3][28];
1891};
1892
1893struct urtwn_r88e_txpwr {
1894	uint8_t	pwr[6][28];
1895};
1896
1897/*
1898 * Per RF chain/group/rate Tx gain values.
1899 */
1900static const struct urtwn_txpwr rtl8192cu_txagc[] = {
1901	{ {	/* Chain 0. */
1902	{	/* Group 0. */
1903	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1904	0x0c, 0x0c, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x02,	/* OFDM6~54. */
1905	0x0e, 0x0d, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x02,	/* MCS0~7. */
1906	0x0e, 0x0d, 0x0c, 0x0a, 0x08, 0x06, 0x04, 0x02	/* MCS8~15. */
1907	},
1908	{	/* Group 1. */
1909	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1910	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1911	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1912	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1913	},
1914	{	/* Group 2. */
1915	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1916	0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x00,	/* OFDM6~54. */
1917	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1918	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1919	}
1920	} },
1921	{ {	/* Chain 1. */
1922	{	/* Group 0. */
1923	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1924	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1925	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1926	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1927	},
1928	{	/* Group 1. */
1929	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1930	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1931	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1932	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1933	},
1934	{	/* Group 2. */
1935	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1936	0x04, 0x04, 0x04, 0x04, 0x04, 0x02, 0x02, 0x00,	/* OFDM6~54. */
1937	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1938	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1939	}
1940	} }
1941};
1942
1943static const struct urtwn_txpwr rtl8188ru_txagc[] = {
1944	{ {	/* Chain 0. */
1945	{	/* Group 0. */
1946	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1947	0x08, 0x08, 0x08, 0x06, 0x06, 0x04, 0x04, 0x00,	/* OFDM6~54. */
1948	0x08, 0x06, 0x06, 0x04, 0x04, 0x02, 0x02, 0x00,	/* MCS0~7. */
1949	0x08, 0x06, 0x06, 0x04, 0x04, 0x02, 0x02, 0x00	/* MCS8~15. */
1950	},
1951	{	/* Group 1. */
1952	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1953	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1954	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1955	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1956	},
1957	{	/* Group 2. */
1958	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1959	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1960	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1961	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1962	}
1963	} }
1964};
1965
1966static const struct urtwn_r88e_txpwr rtl8188eu_txagc[] = {
1967	{ {	/* Chain 0. */
1968	{	/* Group 0. */
1969	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1970	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1971	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1972	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1973	},
1974	{	/* Group 1. */
1975	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1976	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1977	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1978	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1979	},
1980	{	/* Group 2. */
1981	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1982	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1983	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1984	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1985	},
1986	{	/* Group 3. */
1987	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1988	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1989	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1990	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1991	},
1992	{	/* Group 4. */
1993	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
1994	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
1995	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
1996	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
1997	},
1998	{	/* Group 5. */
1999	0x00, 0x00, 0x00, 0x00,				/* CCK1~11. */
2000	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* OFDM6~54. */
2001	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,	/* MCS0~7. */
2002	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00	/* MCS8~15. */
2003	}
2004	} }
2005};
2006