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