xref: /openbsd-src/sys/dev/ic/rt2661reg.h (revision 61e87b287a539c46ee129ad6d615d9c8e7dcd1ae)
1*61e87b28Sderaadt /*	$OpenBSD: rt2661reg.h,v 1.13 2013/11/26 20:33:16 deraadt Exp $	*/
2189ff541Sdamien 
3189ff541Sdamien /*-
4189ff541Sdamien  * Copyright (c) 2006
5189ff541Sdamien  *	Damien Bergamini <damien.bergamini@free.fr>
6189ff541Sdamien  *
7189ff541Sdamien  * Permission to use, copy, modify, and distribute this software for any
8189ff541Sdamien  * purpose with or without fee is hereby granted, provided that the above
9189ff541Sdamien  * copyright notice and this permission notice appear in all copies.
10189ff541Sdamien  *
11189ff541Sdamien  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12189ff541Sdamien  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13189ff541Sdamien  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14189ff541Sdamien  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15189ff541Sdamien  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16189ff541Sdamien  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17189ff541Sdamien  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18189ff541Sdamien  */
19189ff541Sdamien 
20189ff541Sdamien #define RT2661_TX_RING_COUNT	32
21189ff541Sdamien #define RT2661_MGT_RING_COUNT	32
22189ff541Sdamien #define RT2661_RX_RING_COUNT	64
23189ff541Sdamien 
24189ff541Sdamien #define RT2661_TX_DESC_SIZE	(sizeof (struct rt2661_tx_desc))
25189ff541Sdamien #define RT2661_TX_DESC_WSIZE	(RT2661_TX_DESC_SIZE / 4)
26189ff541Sdamien #define RT2661_RX_DESC_SIZE	(sizeof (struct rt2661_rx_desc))
27189ff541Sdamien #define RT2661_RX_DESC_WSIZE	(RT2661_RX_DESC_SIZE / 4)
28189ff541Sdamien 
29189ff541Sdamien #define RT2661_MAX_SCATTER	5
30189ff541Sdamien 
31189ff541Sdamien /*
32189ff541Sdamien  * Control and status registers.
33189ff541Sdamien  */
34189ff541Sdamien #define RT2661_HOST_CMD_CSR		0x0008
35189ff541Sdamien #define RT2661_MCU_CNTL_CSR		0x000c
36189ff541Sdamien #define RT2661_SOFT_RESET_CSR		0x0010
37189ff541Sdamien #define RT2661_MCU_INT_SOURCE_CSR	0x0014
38189ff541Sdamien #define RT2661_MCU_INT_MASK_CSR		0x0018
39189ff541Sdamien #define RT2661_PCI_USEC_CSR		0x001c
40189ff541Sdamien #define RT2661_H2M_MAILBOX_CSR		0x2100
41189ff541Sdamien #define RT2661_M2H_CMD_DONE_CSR		0x2104
42189ff541Sdamien #define RT2661_HW_BEACON_BASE0		0x2c00
43f383cca5Sdamien #define RT2661_HW_BEACON_BASE1		0x2d00
44f383cca5Sdamien #define RT2661_HW_BEACON_BASE2		0x2e00
45f383cca5Sdamien #define RT2661_HW_BEACON_BASE3		0x2f00
46189ff541Sdamien #define RT2661_MAC_CSR0			0x3000
47189ff541Sdamien #define RT2661_MAC_CSR1			0x3004
48189ff541Sdamien #define RT2661_MAC_CSR2			0x3008
49189ff541Sdamien #define RT2661_MAC_CSR3			0x300c
50189ff541Sdamien #define RT2661_MAC_CSR4			0x3010
51189ff541Sdamien #define RT2661_MAC_CSR5			0x3014
52189ff541Sdamien #define RT2661_MAC_CSR6			0x3018
53189ff541Sdamien #define RT2661_MAC_CSR7			0x301c
54189ff541Sdamien #define RT2661_MAC_CSR8			0x3020
55189ff541Sdamien #define RT2661_MAC_CSR9			0x3024
56189ff541Sdamien #define RT2661_MAC_CSR10		0x3028
57189ff541Sdamien #define RT2661_MAC_CSR11		0x302c
58189ff541Sdamien #define RT2661_MAC_CSR12		0x3030
59189ff541Sdamien #define RT2661_MAC_CSR13		0x3034
60189ff541Sdamien #define RT2661_MAC_CSR14		0x3038
61189ff541Sdamien #define RT2661_MAC_CSR15		0x303c
62189ff541Sdamien #define RT2661_TXRX_CSR0		0x3040
63189ff541Sdamien #define RT2661_TXRX_CSR1		0x3044
64189ff541Sdamien #define RT2661_TXRX_CSR2		0x3048
65189ff541Sdamien #define RT2661_TXRX_CSR3		0x304c
66189ff541Sdamien #define RT2661_TXRX_CSR4		0x3050
67189ff541Sdamien #define RT2661_TXRX_CSR5		0x3054
68189ff541Sdamien #define RT2661_TXRX_CSR6		0x3058
69189ff541Sdamien #define RT2661_TXRX_CSR7		0x305c
70189ff541Sdamien #define RT2661_TXRX_CSR8		0x3060
71189ff541Sdamien #define RT2661_TXRX_CSR9		0x3064
72189ff541Sdamien #define RT2661_TXRX_CSR10		0x3068
73189ff541Sdamien #define RT2661_TXRX_CSR11		0x306c
74189ff541Sdamien #define RT2661_TXRX_CSR12		0x3070
75189ff541Sdamien #define RT2661_TXRX_CSR13		0x3074
76189ff541Sdamien #define RT2661_TXRX_CSR14		0x3078
77189ff541Sdamien #define RT2661_TXRX_CSR15		0x307c
78189ff541Sdamien #define RT2661_PHY_CSR0			0x3080
79189ff541Sdamien #define RT2661_PHY_CSR1			0x3084
80189ff541Sdamien #define RT2661_PHY_CSR2			0x3088
81189ff541Sdamien #define RT2661_PHY_CSR3			0x308c
82189ff541Sdamien #define RT2661_PHY_CSR4			0x3090
83189ff541Sdamien #define RT2661_PHY_CSR5			0x3094
84189ff541Sdamien #define RT2661_PHY_CSR6			0x3098
85189ff541Sdamien #define RT2661_PHY_CSR7			0x309c
86189ff541Sdamien #define RT2661_SEC_CSR0			0x30a0
87189ff541Sdamien #define RT2661_SEC_CSR1			0x30a4
88189ff541Sdamien #define RT2661_SEC_CSR2			0x30a8
89189ff541Sdamien #define RT2661_SEC_CSR3			0x30ac
90189ff541Sdamien #define RT2661_SEC_CSR4			0x30b0
91189ff541Sdamien #define RT2661_SEC_CSR5			0x30b4
92189ff541Sdamien #define RT2661_STA_CSR0			0x30c0
93189ff541Sdamien #define RT2661_STA_CSR1			0x30c4
94189ff541Sdamien #define RT2661_STA_CSR2			0x30c8
95189ff541Sdamien #define RT2661_STA_CSR3			0x30cc
96189ff541Sdamien #define RT2661_STA_CSR4			0x30d0
97189ff541Sdamien #define RT2661_AC0_BASE_CSR		0x3400
98189ff541Sdamien #define RT2661_AC1_BASE_CSR		0x3404
99189ff541Sdamien #define RT2661_AC2_BASE_CSR		0x3408
100189ff541Sdamien #define RT2661_AC3_BASE_CSR		0x340c
101189ff541Sdamien #define RT2661_MGT_BASE_CSR		0x3410
102189ff541Sdamien #define RT2661_TX_RING_CSR0		0x3418
103189ff541Sdamien #define RT2661_TX_RING_CSR1		0x341c
104189ff541Sdamien #define RT2661_AIFSN_CSR		0x3420
105189ff541Sdamien #define RT2661_CWMIN_CSR		0x3424
106189ff541Sdamien #define RT2661_CWMAX_CSR		0x3428
107189ff541Sdamien #define RT2661_TX_DMA_DST_CSR		0x342c
108189ff541Sdamien #define RT2661_TX_CNTL_CSR		0x3430
109189ff541Sdamien #define RT2661_LOAD_TX_RING_CSR		0x3434
110189ff541Sdamien #define RT2661_RX_BASE_CSR		0x3450
111189ff541Sdamien #define RT2661_RX_RING_CSR		0x3454
112189ff541Sdamien #define RT2661_RX_CNTL_CSR		0x3458
113189ff541Sdamien #define RT2661_PCI_CFG_CSR		0x3460
114189ff541Sdamien #define RT2661_INT_SOURCE_CSR		0x3468
115189ff541Sdamien #define RT2661_INT_MASK_CSR		0x346c
116189ff541Sdamien #define RT2661_E2PROM_CSR		0x3470
117189ff541Sdamien #define RT2661_AC_TXOP_CSR0		0x3474
118189ff541Sdamien #define RT2661_AC_TXOP_CSR1		0x3478
119189ff541Sdamien #define RT2661_TEST_MODE_CSR		0x3484
120189ff541Sdamien #define RT2661_IO_CNTL_CSR		0x3498
121189ff541Sdamien #define RT2661_MCU_CODE_BASE		0x4000
122189ff541Sdamien 
123189ff541Sdamien 
124189ff541Sdamien /* possible flags for register HOST_CMD_CSR */
125189ff541Sdamien #define RT2661_KICK_CMD		(1 << 7)
126189ff541Sdamien /* Host to MCU (8051) command identifiers */
127189ff541Sdamien #define RT2661_MCU_CMD_SLEEP	0x30
128189ff541Sdamien #define RT2661_MCU_CMD_WAKEUP	0x31
129189ff541Sdamien #define RT2661_MCU_SET_LED	0x50
130189ff541Sdamien #define RT2661_MCU_SET_RSSI_LED	0x52
131189ff541Sdamien 
132189ff541Sdamien /* possible flags for register MCU_CNTL_CSR */
133189ff541Sdamien #define RT2661_MCU_SEL		(1 << 0)
134189ff541Sdamien #define RT2661_MCU_RESET	(1 << 1)
135189ff541Sdamien #define RT2661_MCU_READY	(1 << 2)
136189ff541Sdamien 
137189ff541Sdamien /* possible flags for register MCU_INT_SOURCE_CSR */
138189ff541Sdamien #define RT2661_MCU_CMD_DONE		0xff
139189ff541Sdamien #define RT2661_MCU_WAKEUP		(1 << 8)
140189ff541Sdamien #define RT2661_MCU_BEACON_EXPIRE	(1 << 9)
141189ff541Sdamien 
142189ff541Sdamien /* possible flags for register H2M_MAILBOX_CSR */
143189ff541Sdamien #define RT2661_H2M_BUSY		(1 << 24)
144189ff541Sdamien #define RT2661_TOKEN_NO_INTR	0xff
145189ff541Sdamien 
146189ff541Sdamien /* possible flags for register MAC_CSR5 */
147189ff541Sdamien #define RT2661_ONE_BSSID	3
148189ff541Sdamien 
149189ff541Sdamien /* possible flags for register TXRX_CSR0 */
150189ff541Sdamien /* Tx filter flags are in the low 16 bits */
151189ff541Sdamien #define RT2661_AUTO_TX_SEQ	(1 << 15)
152189ff541Sdamien /* Rx filter flags are in the high 16 bits */
153189ff541Sdamien #define RT2661_DISABLE_RX	(1 << 16)
154189ff541Sdamien #define RT2661_DROP_CRC_ERROR	(1 << 17)
155189ff541Sdamien #define RT2661_DROP_PHY_ERROR	(1 << 18)
156189ff541Sdamien #define RT2661_DROP_CTL		(1 << 19)
157189ff541Sdamien #define RT2661_DROP_NOT_TO_ME	(1 << 20)
158189ff541Sdamien #define RT2661_DROP_TODS	(1 << 21)
159189ff541Sdamien #define RT2661_DROP_VER_ERROR	(1 << 22)
160189ff541Sdamien #define RT2661_DROP_MULTICAST	(1 << 23)
161189ff541Sdamien #define RT2661_DROP_BROADCAST	(1 << 24)
162189ff541Sdamien #define RT2661_DROP_ACKCTS	(1 << 25)
163189ff541Sdamien 
164189ff541Sdamien /* possible flags for register TXRX_CSR4 */
16582e9ffbbSdamien #define RT2661_SHORT_PREAMBLE	(1 << 18)
16682e9ffbbSdamien #define RT2661_MRR_ENABLED	(1 << 19)
16782e9ffbbSdamien #define RT2661_MRR_CCK_FALLBACK	(1 << 22)
168189ff541Sdamien 
169e48892ffSdamien /* possible flags for register TXRX_CSR9 */
170189ff541Sdamien #define RT2661_TSF_TICKING	(1 << 16)
171189ff541Sdamien #define RT2661_TSF_MODE(x)	(((x) & 0x3) << 17)
172189ff541Sdamien /* TBTT stands for Target Beacon Transmission Time */
173189ff541Sdamien #define RT2661_ENABLE_TBTT	(1 << 19)
174189ff541Sdamien #define RT2661_GENERATE_BEACON	(1 << 20)
175189ff541Sdamien 
176189ff541Sdamien /* possible flags for register PHY_CSR0 */
177189ff541Sdamien #define RT2661_PA_PE_2GHZ	(1 << 16)
178189ff541Sdamien #define RT2661_PA_PE_5GHZ	(1 << 17)
179189ff541Sdamien 
180e48892ffSdamien /* possible flags for register PHY_CSR3 */
181e48892ffSdamien #define RT2661_BBP_READ	(1 << 15)
182e48892ffSdamien #define RT2661_BBP_BUSY	(1 << 16)
183e48892ffSdamien 
184e48892ffSdamien /* possible flags for register PHY_CSR4 */
185*61e87b28Sderaadt #define RT2661_RF_21BIT	(21U << 24)
186*61e87b28Sderaadt #define RT2661_RF_BUSY	(1U << 31)
187e48892ffSdamien 
188189ff541Sdamien /* possible values for register STA_CSR4 */
189189ff541Sdamien #define RT2661_TX_STAT_VALID	(1 << 0)
190189ff541Sdamien #define RT2661_TX_RESULT(v)	(((v) >> 1) & 0x7)
191189ff541Sdamien #define RT2661_TX_RETRYCNT(v)	(((v) >> 4) & 0xf)
1921af6d579Sstsp /* Driver-private data written before TX and read back when TX completes.
1931af6d579Sstsp  * We store the driver-private ID of an AMRR node in here. */
1941af6d579Sstsp #define RT2661_TX_PRIV_DATA(v)	(((v) >> 8) & 0xff)
195189ff541Sdamien #define RT2661_TX_SUCCESS	0
196189ff541Sdamien #define RT2661_TX_RETRY_FAIL	6
197189ff541Sdamien 
198189ff541Sdamien /* possible flags for register TX_CNTL_CSR */
199189ff541Sdamien #define RT2661_KICK_MGT	(1 << 4)
200189ff541Sdamien 
201189ff541Sdamien /* possible flags for register INT_SOURCE_CSR */
202189ff541Sdamien #define RT2661_TX_DONE		(1 << 0)
203189ff541Sdamien #define RT2661_RX_DONE		(1 << 1)
204189ff541Sdamien #define RT2661_TX0_DMA_DONE	(1 << 16)
205189ff541Sdamien #define RT2661_TX1_DMA_DONE	(1 << 17)
206189ff541Sdamien #define RT2661_TX2_DMA_DONE	(1 << 18)
207189ff541Sdamien #define RT2661_TX3_DMA_DONE	(1 << 19)
208189ff541Sdamien #define RT2661_MGT_DONE		(1 << 20)
209189ff541Sdamien 
210189ff541Sdamien /* possible flags for register E2PROM_CSR */
211189ff541Sdamien #define RT2661_C	(1 << 1)
212189ff541Sdamien #define RT2661_S	(1 << 2)
213189ff541Sdamien #define RT2661_D	(1 << 3)
214189ff541Sdamien #define RT2661_Q	(1 << 4)
215189ff541Sdamien #define RT2661_93C46	(1 << 5)
216189ff541Sdamien 
217189ff541Sdamien /* Tx descriptor */
218189ff541Sdamien struct rt2661_tx_desc {
219189ff541Sdamien 	uint32_t	flags;
220189ff541Sdamien #define RT2661_TX_BUSY		(1 << 0)
221189ff541Sdamien #define RT2661_TX_VALID		(1 << 1)
222189ff541Sdamien #define RT2661_TX_MORE_FRAG	(1 << 2)
223189ff541Sdamien #define RT2661_TX_NEED_ACK	(1 << 3)
224189ff541Sdamien #define RT2661_TX_TIMESTAMP	(1 << 4)
225189ff541Sdamien #define RT2661_TX_OFDM		(1 << 5)
22636087685Sdamien #define RT2661_TX_IFS_SIFS	(1 << 6)
227189ff541Sdamien #define RT2661_TX_LONG_RETRY	(1 << 7)
228189ff541Sdamien #define RT2661_TX_BURST		(1 << 28)
229189ff541Sdamien 
230189ff541Sdamien 	uint16_t	wme;
231e48892ffSdamien #define RT2661_QID(v)		(v)
232189ff541Sdamien #define RT2661_AIFSN(v)		((v) << 4)
233189ff541Sdamien #define RT2661_LOGCWMIN(v)	((v) << 8)
234189ff541Sdamien #define RT2661_LOGCWMAX(v)	((v) << 12)
235189ff541Sdamien 
236189ff541Sdamien 	uint16_t	xflags;
237189ff541Sdamien #define RT2661_TX_HWSEQ		(1 << 12)
238189ff541Sdamien 
239189ff541Sdamien 	uint8_t		plcp_signal;
240189ff541Sdamien 	uint8_t		plcp_service;
241189ff541Sdamien #define RT2661_PLCP_LENGEXT	0x80
242189ff541Sdamien 
243189ff541Sdamien 	uint8_t		plcp_length_lo;
244189ff541Sdamien 	uint8_t		plcp_length_hi;
245189ff541Sdamien 
246189ff541Sdamien 	uint32_t	iv;
247189ff541Sdamien 	uint32_t	eiv;
248189ff541Sdamien 
249189ff541Sdamien 	uint8_t		offset;
2501af6d579Sstsp 	uint8_t		priv_data;
251e48892ffSdamien #define RT2661_QID_MGT	13
252e48892ffSdamien 
253189ff541Sdamien 	uint8_t		txpower;
254189ff541Sdamien #define RT2661_DEFAULT_TXPOWER	0
255189ff541Sdamien 
256189ff541Sdamien 	uint8_t		reserved1;
257189ff541Sdamien 
258189ff541Sdamien 	uint32_t	addr[RT2661_MAX_SCATTER];
259189ff541Sdamien 	uint16_t	len[RT2661_MAX_SCATTER];
260189ff541Sdamien 
261189ff541Sdamien 	uint16_t	reserved2;
262189ff541Sdamien } __packed;
263189ff541Sdamien 
264189ff541Sdamien /* Rx descriptor */
265189ff541Sdamien struct rt2661_rx_desc {
266189ff541Sdamien 	uint32_t	flags;
267189ff541Sdamien #define RT2661_RX_BUSY		(1 << 0)
268189ff541Sdamien #define RT2661_RX_DROP		(1 << 1)
269189ff541Sdamien #define RT2661_RX_CRC_ERROR	(1 << 6)
270189ff541Sdamien #define RT2661_RX_OFDM		(1 << 7)
271189ff541Sdamien #define RT2661_RX_PHY_ERROR	(1 << 8)
272189ff541Sdamien #define RT2661_RX_CIPHER_MASK	0x00000600
273189ff541Sdamien 
2742a5f0c51Sdamien 	uint8_t		rate;
275189ff541Sdamien 	uint8_t		rssi;
276189ff541Sdamien 	uint8_t		reserved1;
277189ff541Sdamien 	uint8_t		offset;
278189ff541Sdamien 	uint32_t	iv;
279189ff541Sdamien 	uint32_t	eiv;
280189ff541Sdamien 	uint32_t	reserved2;
281189ff541Sdamien 	uint32_t	physaddr;
282189ff541Sdamien 	uint32_t	reserved3[10];
283189ff541Sdamien } __packed;
284189ff541Sdamien 
285189ff541Sdamien #define RAL_RF1	0
286189ff541Sdamien #define RAL_RF2	2
287189ff541Sdamien #define RAL_RF3	1
288189ff541Sdamien #define RAL_RF4	3
289189ff541Sdamien 
290189ff541Sdamien /* dual-band RF */
291189ff541Sdamien #define RT2661_RF_5225	1
292189ff541Sdamien #define RT2661_RF_5325	2
293189ff541Sdamien /* single-band RF */
294189ff541Sdamien #define RT2661_RF_2527	3
295189ff541Sdamien #define RT2661_RF_2529	4
296189ff541Sdamien 
297189ff541Sdamien #define RT2661_RX_DESC_BACK	4
298189ff541Sdamien 
299189ff541Sdamien #define RT2661_SMART_MODE	(1 << 0)
300189ff541Sdamien 
301189ff541Sdamien #define RT2661_BBPR94_DEFAULT	6
302189ff541Sdamien 
303189ff541Sdamien #define RT2661_SHIFT_D	3
304189ff541Sdamien #define RT2661_SHIFT_Q	4
305189ff541Sdamien 
306189ff541Sdamien #define RT2661_EEPROM_MAC01		0x02
307189ff541Sdamien #define RT2661_EEPROM_MAC23		0x03
308189ff541Sdamien #define RT2661_EEPROM_MAC45		0x04
309189ff541Sdamien #define RT2661_EEPROM_ANTENNA		0x10
310189ff541Sdamien #define RT2661_EEPROM_CONFIG2		0x11
311e48892ffSdamien #define RT2661_EEPROM_BBP_BASE		0x13
312189ff541Sdamien #define RT2661_EEPROM_TXPOWER		0x23
313189ff541Sdamien #define RT2661_EEPROM_FREQ_OFFSET	0x2f
314189ff541Sdamien #define RT2661_EEPROM_RSSI_2GHZ_OFFSET	0x4d
315189ff541Sdamien #define RT2661_EEPROM_RSSI_5GHZ_OFFSET	0x4e
316189ff541Sdamien 
317189ff541Sdamien #define RT2661_EEPROM_DELAY	1	/* minimum hold time (microsecond) */
318189ff541Sdamien 
31951affc00Sdamien /*-
32051affc00Sdamien  * Control and status registers access functions.
32151affc00Sdamien  * The ASIC does not like PCI bursts on registers because of a silicon bug.
32251affc00Sdamien  * To prevent PCI read or write bursts, we issue a read to a non-contiguous
32351affc00Sdamien  * register before accessing a register.  This problem does not show up on
32451affc00Sdamien  * x86 architectures since the memory model makes it almost impossible to
32551affc00Sdamien  * generate PCI bursts without doing DMA.
32651affc00Sdamien  * This makes the RT2561S chip on the Gdium (loongson) work.
327189ff541Sdamien  */
32851affc00Sdamien static __inline uint32_t
RAL_READ(struct rt2661_softc * sc,bus_size_t reg)32951affc00Sdamien RAL_READ(struct rt2661_softc *sc, bus_size_t reg)
33051affc00Sdamien {
33151affc00Sdamien 	bus_space_read_4(sc->sc_st, sc->sc_sh, RT2661_MAC_CSR0);
33251affc00Sdamien 	return bus_space_read_4(sc->sc_st, sc->sc_sh, reg);
33351affc00Sdamien }
334189ff541Sdamien 
33551affc00Sdamien static __inline void
RAL_READ_REGION_4(struct rt2661_softc * sc,bus_size_t offset,uint32_t * datap,bus_size_t count)33651affc00Sdamien RAL_READ_REGION_4(struct rt2661_softc *sc, bus_size_t offset,
33751affc00Sdamien     uint32_t *datap, bus_size_t count)
33851affc00Sdamien {
33951affc00Sdamien 	/* NB: do not use bus_space_read_region_4 to prevent PCI bursts. */
34051affc00Sdamien 	for (; count > 0; count--, datap++, offset += 4)
34151affc00Sdamien 		*datap = RAL_READ(sc, offset);
34251affc00Sdamien }
343189ff541Sdamien 
34451affc00Sdamien static __inline void
RAL_WRITE(struct rt2661_softc * sc,bus_size_t reg,uint32_t val)34551affc00Sdamien RAL_WRITE(struct rt2661_softc *sc, bus_size_t reg, uint32_t val)
34651affc00Sdamien {
34751affc00Sdamien 	bus_space_read_4(sc->sc_st, sc->sc_sh, RT2661_MAC_CSR0);
34851affc00Sdamien 	bus_space_write_4(sc->sc_st, sc->sc_sh, reg, val);
34951affc00Sdamien }
350189ff541Sdamien 
35151affc00Sdamien static __inline void
RAL_WRITE_1(struct rt2661_softc * sc,bus_size_t reg,uint8_t val)35251affc00Sdamien RAL_WRITE_1(struct rt2661_softc *sc, bus_size_t reg, uint8_t val)
35351affc00Sdamien {
35451affc00Sdamien 	bus_space_read_4(sc->sc_st, sc->sc_sh, RT2661_MAC_CSR0);
35551affc00Sdamien 	bus_space_write_1(sc->sc_st, sc->sc_sh, reg, val);
35651affc00Sdamien }
35751affc00Sdamien 
35851affc00Sdamien static __inline void
RAL_WRITE_REGION_1(struct rt2661_softc * sc,bus_size_t offset,const uint8_t * datap,bus_size_t count)35951affc00Sdamien RAL_WRITE_REGION_1(struct rt2661_softc *sc, bus_size_t offset,
36051affc00Sdamien     const uint8_t *datap, bus_size_t count)
36151affc00Sdamien {
36251affc00Sdamien 	/* NB: do not use bus_space_write_region_1 to prevent PCI bursts. */
36351affc00Sdamien 	for (; count > 0; count--, datap++, offset++)
36451affc00Sdamien 		RAL_WRITE_1(sc, offset, *datap);
36551affc00Sdamien }
3661aa65ad1Sdamien 
3671aa65ad1Sdamien #define RAL_RW_BARRIER_1(sc, reg)					\
3681aa65ad1Sdamien 	bus_space_barrier((sc)->sc_st, (sc)->sc_sh, (reg), 1,		\
3691aa65ad1Sdamien 	    BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE)
3701aa65ad1Sdamien 
371189ff541Sdamien /*
372189ff541Sdamien  * EEPROM access macro
373189ff541Sdamien  */
374189ff541Sdamien #define RT2661_EEPROM_CTL(sc, val) do {					\
375189ff541Sdamien 	RAL_WRITE((sc), RT2661_E2PROM_CSR, (val));			\
376189ff541Sdamien 	DELAY(RT2661_EEPROM_DELAY);					\
377189ff541Sdamien } while (/* CONSTCOND */0)
37817fa8ea2Sdamien 
37917fa8ea2Sdamien 
38017fa8ea2Sdamien /*
38117fa8ea2Sdamien  * Default values for MAC registers; values taken from the reference driver.
38217fa8ea2Sdamien  */
38317fa8ea2Sdamien #define RT2661_DEF_MAC					\
38417fa8ea2Sdamien 	{ RT2661_TXRX_CSR0,        0x0000b032 },	\
38517fa8ea2Sdamien 	{ RT2661_TXRX_CSR1,        0x9eb39eb3 },	\
38617fa8ea2Sdamien 	{ RT2661_TXRX_CSR2,        0x8a8b8c8d },	\
38717fa8ea2Sdamien 	{ RT2661_TXRX_CSR3,        0x00858687 },	\
38817fa8ea2Sdamien 	{ RT2661_TXRX_CSR7,        0x2e31353b },	\
38917fa8ea2Sdamien 	{ RT2661_TXRX_CSR8,        0x2a2a2a2c },	\
39017fa8ea2Sdamien 	{ RT2661_TXRX_CSR15,       0x0000000f },	\
39117fa8ea2Sdamien 	{ RT2661_MAC_CSR6,         0x00000fff },	\
39217fa8ea2Sdamien 	{ RT2661_MAC_CSR8,         0x016c030a },	\
39317fa8ea2Sdamien 	{ RT2661_MAC_CSR10,        0x00000718 },	\
39417fa8ea2Sdamien 	{ RT2661_MAC_CSR12,        0x00000004 },	\
39517fa8ea2Sdamien 	{ RT2661_MAC_CSR13,        0x0000e000 },	\
39617fa8ea2Sdamien 	{ RT2661_SEC_CSR0,         0x00000000 },	\
39717fa8ea2Sdamien 	{ RT2661_SEC_CSR1,         0x00000000 },	\
39817fa8ea2Sdamien 	{ RT2661_SEC_CSR5,         0x00000000 },	\
39917fa8ea2Sdamien 	{ RT2661_PHY_CSR1,         0x000023b0 },	\
40017fa8ea2Sdamien 	{ RT2661_PHY_CSR5,         0x060a100c },	\
40117fa8ea2Sdamien 	{ RT2661_PHY_CSR6,         0x00080606 },	\
40217fa8ea2Sdamien 	{ RT2661_PHY_CSR7,         0x00000a08 },	\
40317fa8ea2Sdamien 	{ RT2661_PCI_CFG_CSR,      0x3cca4808 },	\
40417fa8ea2Sdamien 	{ RT2661_AIFSN_CSR,        0x00002273 },	\
40517fa8ea2Sdamien 	{ RT2661_CWMIN_CSR,        0x00002344 },	\
40617fa8ea2Sdamien 	{ RT2661_CWMAX_CSR,        0x000034aa },	\
40717fa8ea2Sdamien 	{ RT2661_TEST_MODE_CSR,    0x00000200 },	\
408f383cca5Sdamien 	{ RT2661_M2H_CMD_DONE_CSR, 0xffffffff },	\
409f383cca5Sdamien 	{ RT2661_HW_BEACON_BASE0,  0x00000000 },	\
410f383cca5Sdamien 	{ RT2661_HW_BEACON_BASE1,  0x00000000 },	\
411f383cca5Sdamien 	{ RT2661_HW_BEACON_BASE2,  0x00000000 },	\
412f383cca5Sdamien 	{ RT2661_HW_BEACON_BASE3,  0x00000000 }
41317fa8ea2Sdamien 
41417fa8ea2Sdamien /*
41517fa8ea2Sdamien  * Default values for BBP registers; values taken from the reference driver.
41617fa8ea2Sdamien  */
41717fa8ea2Sdamien #define RT2661_DEF_BBP	\
41817fa8ea2Sdamien 	{   3, 0x00 },	\
41917fa8ea2Sdamien 	{  15, 0x30 },	\
42017fa8ea2Sdamien 	{  17, 0x20 },	\
42117fa8ea2Sdamien 	{  21, 0xc8 },	\
42217fa8ea2Sdamien 	{  22, 0x38 },	\
42317fa8ea2Sdamien 	{  23, 0x06 },	\
42417fa8ea2Sdamien 	{  24, 0xfe },	\
42517fa8ea2Sdamien 	{  25, 0x0a },	\
42617fa8ea2Sdamien 	{  26, 0x0d },	\
42717fa8ea2Sdamien 	{  34, 0x12 },	\
42817fa8ea2Sdamien 	{  37, 0x07 },	\
42917fa8ea2Sdamien 	{  39, 0xf8 },	\
43017fa8ea2Sdamien 	{  41, 0x60 },	\
43117fa8ea2Sdamien 	{  53, 0x10 },	\
43217fa8ea2Sdamien 	{  54, 0x18 },	\
43317fa8ea2Sdamien 	{  60, 0x10 },	\
43417fa8ea2Sdamien 	{  61, 0x04 },	\
43517fa8ea2Sdamien 	{  62, 0x04 },	\
43617fa8ea2Sdamien 	{  75, 0xfe },	\
43717fa8ea2Sdamien 	{  86, 0xfe },	\
43817fa8ea2Sdamien 	{  88, 0xfe },	\
43917fa8ea2Sdamien 	{  90, 0x0f },	\
44017fa8ea2Sdamien 	{  99, 0x00 },	\
44117fa8ea2Sdamien 	{ 102, 0x16 },	\
44217fa8ea2Sdamien 	{ 107, 0x04 }
44317fa8ea2Sdamien 
44417fa8ea2Sdamien /*
44517fa8ea2Sdamien  * Default settings for RF registers; values taken from the reference driver.
44617fa8ea2Sdamien  */
44717fa8ea2Sdamien #define RT2661_RF5225_1					\
44817fa8ea2Sdamien 	{   1, 0x00b33, 0x011e1, 0x1a014, 0x30282 },	\
44917fa8ea2Sdamien 	{   2, 0x00b33, 0x011e1, 0x1a014, 0x30287 },	\
45017fa8ea2Sdamien 	{   3, 0x00b33, 0x011e2, 0x1a014, 0x30282 },	\
45117fa8ea2Sdamien 	{   4, 0x00b33, 0x011e2, 0x1a014, 0x30287 },	\
45217fa8ea2Sdamien 	{   5, 0x00b33, 0x011e3, 0x1a014, 0x30282 },	\
45317fa8ea2Sdamien 	{   6, 0x00b33, 0x011e3, 0x1a014, 0x30287 },	\
45417fa8ea2Sdamien 	{   7, 0x00b33, 0x011e4, 0x1a014, 0x30282 },	\
45517fa8ea2Sdamien 	{   8, 0x00b33, 0x011e4, 0x1a014, 0x30287 },	\
45617fa8ea2Sdamien 	{   9, 0x00b33, 0x011e5, 0x1a014, 0x30282 },	\
45717fa8ea2Sdamien 	{  10, 0x00b33, 0x011e5, 0x1a014, 0x30287 },	\
45817fa8ea2Sdamien 	{  11, 0x00b33, 0x011e6, 0x1a014, 0x30282 },	\
45917fa8ea2Sdamien 	{  12, 0x00b33, 0x011e6, 0x1a014, 0x30287 },	\
46017fa8ea2Sdamien 	{  13, 0x00b33, 0x011e7, 0x1a014, 0x30282 },	\
46117fa8ea2Sdamien 	{  14, 0x00b33, 0x011e8, 0x1a014, 0x30284 },	\
46217fa8ea2Sdamien 							\
46317fa8ea2Sdamien 	{  36, 0x00b33, 0x01266, 0x26014, 0x30288 },	\
46417fa8ea2Sdamien 	{  40, 0x00b33, 0x01268, 0x26014, 0x30280 },	\
46517fa8ea2Sdamien 	{  44, 0x00b33, 0x01269, 0x26014, 0x30282 },	\
46617fa8ea2Sdamien 	{  48, 0x00b33, 0x0126a, 0x26014, 0x30284 },	\
46717fa8ea2Sdamien 	{  52, 0x00b33, 0x0126b, 0x26014, 0x30286 },	\
46817fa8ea2Sdamien 	{  56, 0x00b33, 0x0126c, 0x26014, 0x30288 },	\
46917fa8ea2Sdamien 	{  60, 0x00b33, 0x0126e, 0x26014, 0x30280 },	\
47017fa8ea2Sdamien 	{  64, 0x00b33, 0x0126f, 0x26014, 0x30282 },	\
47117fa8ea2Sdamien 							\
47217fa8ea2Sdamien 	{ 100, 0x00b33, 0x0128a, 0x2e014, 0x30280 },	\
47317fa8ea2Sdamien 	{ 104, 0x00b33, 0x0128b, 0x2e014, 0x30282 },	\
47417fa8ea2Sdamien 	{ 108, 0x00b33, 0x0128c, 0x2e014, 0x30284 },	\
47517fa8ea2Sdamien 	{ 112, 0x00b33, 0x0128d, 0x2e014, 0x30286 },	\
47617fa8ea2Sdamien 	{ 116, 0x00b33, 0x0128e, 0x2e014, 0x30288 },	\
47717fa8ea2Sdamien 	{ 120, 0x00b33, 0x012a0, 0x2e014, 0x30280 },	\
47817fa8ea2Sdamien 	{ 124, 0x00b33, 0x012a1, 0x2e014, 0x30282 },	\
47917fa8ea2Sdamien 	{ 128, 0x00b33, 0x012a2, 0x2e014, 0x30284 },	\
48017fa8ea2Sdamien 	{ 132, 0x00b33, 0x012a3, 0x2e014, 0x30286 },	\
48117fa8ea2Sdamien 	{ 136, 0x00b33, 0x012a4, 0x2e014, 0x30288 },	\
48217fa8ea2Sdamien 	{ 140, 0x00b33, 0x012a6, 0x2e014, 0x30280 },	\
48317fa8ea2Sdamien 							\
48417fa8ea2Sdamien 	{ 149, 0x00b33, 0x012a8, 0x2e014, 0x30287 },	\
48517fa8ea2Sdamien 	{ 153, 0x00b33, 0x012a9, 0x2e014, 0x30289 },	\
48617fa8ea2Sdamien 	{ 157, 0x00b33, 0x012ab, 0x2e014, 0x30281 },	\
48717fa8ea2Sdamien 	{ 161, 0x00b33, 0x012ac, 0x2e014, 0x30283 },	\
48817fa8ea2Sdamien 	{ 165, 0x00b33, 0x012ad, 0x2e014, 0x30285 }
48917fa8ea2Sdamien 
49017fa8ea2Sdamien #define RT2661_RF5225_2					\
49117fa8ea2Sdamien 	{   1, 0x00b33, 0x011e1, 0x1a014, 0x30282 },	\
49217fa8ea2Sdamien 	{   2, 0x00b33, 0x011e1, 0x1a014, 0x30287 },	\
49317fa8ea2Sdamien 	{   3, 0x00b33, 0x011e2, 0x1a014, 0x30282 },	\
49417fa8ea2Sdamien 	{   4, 0x00b33, 0x011e2, 0x1a014, 0x30287 },	\
49517fa8ea2Sdamien 	{   5, 0x00b33, 0x011e3, 0x1a014, 0x30282 },	\
49617fa8ea2Sdamien 	{   6, 0x00b33, 0x011e3, 0x1a014, 0x30287 },	\
49717fa8ea2Sdamien 	{   7, 0x00b33, 0x011e4, 0x1a014, 0x30282 },	\
49817fa8ea2Sdamien 	{   8, 0x00b33, 0x011e4, 0x1a014, 0x30287 },	\
49917fa8ea2Sdamien 	{   9, 0x00b33, 0x011e5, 0x1a014, 0x30282 },	\
50017fa8ea2Sdamien 	{  10, 0x00b33, 0x011e5, 0x1a014, 0x30287 },	\
50117fa8ea2Sdamien 	{  11, 0x00b33, 0x011e6, 0x1a014, 0x30282 },	\
50217fa8ea2Sdamien 	{  12, 0x00b33, 0x011e6, 0x1a014, 0x30287 },	\
50317fa8ea2Sdamien 	{  13, 0x00b33, 0x011e7, 0x1a014, 0x30282 },	\
50417fa8ea2Sdamien 	{  14, 0x00b33, 0x011e8, 0x1a014, 0x30284 },	\
50517fa8ea2Sdamien 							\
50617fa8ea2Sdamien 	{  36, 0x00b35, 0x11206, 0x26014, 0x30280 },	\
50717fa8ea2Sdamien 	{  40, 0x00b34, 0x111a0, 0x26014, 0x30280 },	\
50817fa8ea2Sdamien 	{  44, 0x00b34, 0x111a1, 0x26014, 0x30286 },	\
50917fa8ea2Sdamien 	{  48, 0x00b34, 0x111a3, 0x26014, 0x30282 },	\
51017fa8ea2Sdamien 	{  52, 0x00b34, 0x111a4, 0x26014, 0x30288 },	\
51117fa8ea2Sdamien 	{  56, 0x00b34, 0x111a6, 0x26014, 0x30284 },	\
51217fa8ea2Sdamien 	{  60, 0x00b34, 0x111a8, 0x26014, 0x30280 },	\
51317fa8ea2Sdamien 	{  64, 0x00b34, 0x111a9, 0x26014, 0x30286 },	\
51417fa8ea2Sdamien 							\
51517fa8ea2Sdamien 	{ 100, 0x00b35, 0x11226, 0x2e014, 0x30280 },	\
51617fa8ea2Sdamien 	{ 104, 0x00b35, 0x11228, 0x2e014, 0x30280 },	\
51717fa8ea2Sdamien 	{ 108, 0x00b35, 0x1122a, 0x2e014, 0x30280 },	\
51817fa8ea2Sdamien 	{ 112, 0x00b35, 0x1122c, 0x2e014, 0x30280 },	\
51917fa8ea2Sdamien 	{ 116, 0x00b35, 0x1122e, 0x2e014, 0x30280 },	\
52017fa8ea2Sdamien 	{ 120, 0x00b34, 0x111c0, 0x2e014, 0x30280 },	\
52117fa8ea2Sdamien 	{ 124, 0x00b34, 0x111c1, 0x2e014, 0x30286 },	\
52217fa8ea2Sdamien 	{ 128, 0x00b34, 0x111c3, 0x2e014, 0x30282 },	\
52317fa8ea2Sdamien 	{ 132, 0x00b34, 0x111c4, 0x2e014, 0x30288 },	\
52417fa8ea2Sdamien 	{ 136, 0x00b34, 0x111c6, 0x2e014, 0x30284 },	\
52517fa8ea2Sdamien 	{ 140, 0x00b34, 0x111c8, 0x2e014, 0x30280 },	\
52617fa8ea2Sdamien 							\
52717fa8ea2Sdamien 	{ 149, 0x00b34, 0x111cb, 0x2e014, 0x30286 },	\
52817fa8ea2Sdamien 	{ 153, 0x00b34, 0x111cd, 0x2e014, 0x30282 },	\
52917fa8ea2Sdamien 	{ 157, 0x00b35, 0x11242, 0x2e014, 0x30285 },	\
53017fa8ea2Sdamien 	{ 161, 0x00b35, 0x11244, 0x2e014, 0x30285 },	\
53117fa8ea2Sdamien 	{ 165, 0x00b35, 0x11246, 0x2e014, 0x30285 }
532