xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/realtek/rtl818x/rtl818x.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Definitions for RTL818x hardware
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright 2007 Michael Wu <flamingice@sourmilk.net>
6*4882a593Smuzhiyun  * Copyright 2007 Andrea Merello <andrea.merello@gmail.com>
7*4882a593Smuzhiyun  *
8*4882a593Smuzhiyun  * Based on the r8187 driver, which is:
9*4882a593Smuzhiyun  * Copyright 2005 Andrea Merello <andrea.merello@gmail.com>, et al.
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #ifndef RTL818X_H
13*4882a593Smuzhiyun #define RTL818X_H
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun struct rtl818x_csr {
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun 	u8	MAC[6];
18*4882a593Smuzhiyun 	u8	reserved_0[2];
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun 	union {
21*4882a593Smuzhiyun 		__le32	MAR[2];  /* 0x8 */
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun 		struct{ /* rtl8187se */
24*4882a593Smuzhiyun 			u8 rf_sw_config; /* 0x8 */
25*4882a593Smuzhiyun 			u8 reserved_01[3];
26*4882a593Smuzhiyun 			__le32 TMGDA; /* 0xc */
27*4882a593Smuzhiyun 		} __packed;
28*4882a593Smuzhiyun 	} __packed;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	union { /*  0x10  */
31*4882a593Smuzhiyun 		struct {
32*4882a593Smuzhiyun 			u8	RX_FIFO_COUNT;
33*4882a593Smuzhiyun 			u8	reserved_1;
34*4882a593Smuzhiyun 			u8	TX_FIFO_COUNT;
35*4882a593Smuzhiyun 			u8	BQREQ;
36*4882a593Smuzhiyun 		} __packed;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 		__le32 TBKDA; /* for 8187se */
39*4882a593Smuzhiyun 	} __packed;
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	__le32 TBEDA; /* 0x14 - for rtl8187se */
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	__le32	TSFT[2];
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	union { /* 0x20 */
46*4882a593Smuzhiyun 		__le32	TLPDA;
47*4882a593Smuzhiyun 		__le32  TVIDA; /* for 8187se */
48*4882a593Smuzhiyun 	} __packed;
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	union { /* 0x24 */
51*4882a593Smuzhiyun 		__le32	TNPDA;
52*4882a593Smuzhiyun 		__le32  TVODA; /* for 8187se */
53*4882a593Smuzhiyun 	} __packed;
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun 	/* hi pri ring for all cards */
56*4882a593Smuzhiyun 	__le32	THPDA; /* 0x28 */
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 	union { /* 0x2c */
59*4882a593Smuzhiyun 		struct {
60*4882a593Smuzhiyun 			u8 reserved_2a;
61*4882a593Smuzhiyun 			u8 EIFS_8187SE;
62*4882a593Smuzhiyun 		} __packed;
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 		__le16	BRSR;
65*4882a593Smuzhiyun 	} __packed;
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	u8	BSSID[6]; /* 0x2e */
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	union { /* 0x34 */
70*4882a593Smuzhiyun 		struct {
71*4882a593Smuzhiyun 			u8 RESP_RATE;
72*4882a593Smuzhiyun 			u8 EIFS;
73*4882a593Smuzhiyun 		} __packed;
74*4882a593Smuzhiyun 		__le16 BRSR_8187SE;
75*4882a593Smuzhiyun 	} __packed;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	u8	reserved_3[1]; /* 0x36 */
78*4882a593Smuzhiyun 	u8	CMD; /* 0x37 */
79*4882a593Smuzhiyun #define RTL818X_CMD_TX_ENABLE		(1 << 2)
80*4882a593Smuzhiyun #define RTL818X_CMD_RX_ENABLE		(1 << 3)
81*4882a593Smuzhiyun #define RTL818X_CMD_RESET		(1 << 4)
82*4882a593Smuzhiyun 	u8	reserved_4[4]; /* 0x38 */
83*4882a593Smuzhiyun 	union {
84*4882a593Smuzhiyun 		struct {
85*4882a593Smuzhiyun 			__le16	INT_MASK;
86*4882a593Smuzhiyun 			__le16	INT_STATUS;
87*4882a593Smuzhiyun 		} __packed;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun 		__le32	INT_STATUS_SE; /* 0x3c */
90*4882a593Smuzhiyun 	} __packed;
91*4882a593Smuzhiyun /* status bits for rtl8187 and rtl8180/8185 */
92*4882a593Smuzhiyun #define RTL818X_INT_RX_OK		(1 <<  0)
93*4882a593Smuzhiyun #define RTL818X_INT_RX_ERR		(1 <<  1)
94*4882a593Smuzhiyun #define RTL818X_INT_TXL_OK		(1 <<  2)
95*4882a593Smuzhiyun #define RTL818X_INT_TXL_ERR		(1 <<  3)
96*4882a593Smuzhiyun #define RTL818X_INT_RX_DU		(1 <<  4)
97*4882a593Smuzhiyun #define RTL818X_INT_RX_FO		(1 <<  5)
98*4882a593Smuzhiyun #define RTL818X_INT_TXN_OK		(1 <<  6)
99*4882a593Smuzhiyun #define RTL818X_INT_TXN_ERR		(1 <<  7)
100*4882a593Smuzhiyun #define RTL818X_INT_TXH_OK		(1 <<  8)
101*4882a593Smuzhiyun #define RTL818X_INT_TXH_ERR		(1 <<  9)
102*4882a593Smuzhiyun #define RTL818X_INT_TXB_OK		(1 << 10)
103*4882a593Smuzhiyun #define RTL818X_INT_TXB_ERR		(1 << 11)
104*4882a593Smuzhiyun #define RTL818X_INT_ATIM		(1 << 12)
105*4882a593Smuzhiyun #define RTL818X_INT_BEACON		(1 << 13)
106*4882a593Smuzhiyun #define RTL818X_INT_TIME_OUT		(1 << 14)
107*4882a593Smuzhiyun #define RTL818X_INT_TX_FO		(1 << 15)
108*4882a593Smuzhiyun /* status bits for rtl8187se */
109*4882a593Smuzhiyun #define RTL818X_INT_SE_TIMER3		(1 <<  0)
110*4882a593Smuzhiyun #define RTL818X_INT_SE_TIMER2		(1 <<  1)
111*4882a593Smuzhiyun #define RTL818X_INT_SE_RQ0SOR		(1 <<  2)
112*4882a593Smuzhiyun #define RTL818X_INT_SE_TXBED_OK		(1 <<  3)
113*4882a593Smuzhiyun #define RTL818X_INT_SE_TXBED_ERR	(1 <<  4)
114*4882a593Smuzhiyun #define RTL818X_INT_SE_TXBE_OK		(1 <<  5)
115*4882a593Smuzhiyun #define RTL818X_INT_SE_TXBE_ERR		(1 <<  6)
116*4882a593Smuzhiyun #define RTL818X_INT_SE_RX_OK		(1 <<  7)
117*4882a593Smuzhiyun #define RTL818X_INT_SE_RX_ERR		(1 <<  8)
118*4882a593Smuzhiyun #define RTL818X_INT_SE_TXL_OK		(1 <<  9)
119*4882a593Smuzhiyun #define RTL818X_INT_SE_TXL_ERR		(1 << 10)
120*4882a593Smuzhiyun #define RTL818X_INT_SE_RX_DU		(1 << 11)
121*4882a593Smuzhiyun #define RTL818X_INT_SE_RX_FIFO		(1 << 12)
122*4882a593Smuzhiyun #define RTL818X_INT_SE_TXN_OK		(1 << 13)
123*4882a593Smuzhiyun #define RTL818X_INT_SE_TXN_ERR		(1 << 14)
124*4882a593Smuzhiyun #define RTL818X_INT_SE_TXH_OK		(1 << 15)
125*4882a593Smuzhiyun #define RTL818X_INT_SE_TXH_ERR		(1 << 16)
126*4882a593Smuzhiyun #define RTL818X_INT_SE_TXB_OK		(1 << 17)
127*4882a593Smuzhiyun #define RTL818X_INT_SE_TXB_ERR		(1 << 18)
128*4882a593Smuzhiyun #define RTL818X_INT_SE_ATIM_TO		(1 << 19)
129*4882a593Smuzhiyun #define RTL818X_INT_SE_BK_TO		(1 << 20)
130*4882a593Smuzhiyun #define RTL818X_INT_SE_TIMER1		(1 << 21)
131*4882a593Smuzhiyun #define RTL818X_INT_SE_TX_FIFO		(1 << 22)
132*4882a593Smuzhiyun #define RTL818X_INT_SE_WAKEUP		(1 << 23)
133*4882a593Smuzhiyun #define RTL818X_INT_SE_BK_DMA		(1 << 24)
134*4882a593Smuzhiyun #define RTL818X_INT_SE_TMGD_OK		(1 << 30)
135*4882a593Smuzhiyun 	__le32	TX_CONF; /* 0x40 */
136*4882a593Smuzhiyun #define RTL818X_TX_CONF_LOOPBACK_MAC	(1 << 17)
137*4882a593Smuzhiyun #define RTL818X_TX_CONF_LOOPBACK_CONT	(3 << 17)
138*4882a593Smuzhiyun #define RTL818X_TX_CONF_NO_ICV		(1 << 19)
139*4882a593Smuzhiyun #define RTL818X_TX_CONF_DISCW		(1 << 20)
140*4882a593Smuzhiyun #define RTL818X_TX_CONF_SAT_HWPLCP	(1 << 24)
141*4882a593Smuzhiyun #define RTL818X_TX_CONF_R8180_ABCD	(2 << 25)
142*4882a593Smuzhiyun #define RTL818X_TX_CONF_R8180_F		(3 << 25)
143*4882a593Smuzhiyun #define RTL818X_TX_CONF_R8185_ABC	(4 << 25)
144*4882a593Smuzhiyun #define RTL818X_TX_CONF_R8185_D		(5 << 25)
145*4882a593Smuzhiyun #define RTL818X_TX_CONF_R8187vD		(5 << 25)
146*4882a593Smuzhiyun #define RTL818X_TX_CONF_R8187vD_B	(6 << 25)
147*4882a593Smuzhiyun #define RTL818X_TX_CONF_RTL8187SE	(6 << 25)
148*4882a593Smuzhiyun #define RTL818X_TX_CONF_HWVER_MASK	(7 << 25)
149*4882a593Smuzhiyun #define RTL818X_TX_CONF_DISREQQSIZE	(1 << 28)
150*4882a593Smuzhiyun #define RTL818X_TX_CONF_PROBE_DTS	(1 << 29)
151*4882a593Smuzhiyun #define RTL818X_TX_CONF_HW_SEQNUM	(1 << 30)
152*4882a593Smuzhiyun #define RTL818X_TX_CONF_CW_MIN		(1 << 31)
153*4882a593Smuzhiyun 	__le32	RX_CONF;
154*4882a593Smuzhiyun #define RTL818X_RX_CONF_MONITOR		(1 <<  0)
155*4882a593Smuzhiyun #define RTL818X_RX_CONF_NICMAC		(1 <<  1)
156*4882a593Smuzhiyun #define RTL818X_RX_CONF_MULTICAST	(1 <<  2)
157*4882a593Smuzhiyun #define RTL818X_RX_CONF_BROADCAST	(1 <<  3)
158*4882a593Smuzhiyun #define RTL818X_RX_CONF_FCS		(1 <<  5)
159*4882a593Smuzhiyun #define RTL818X_RX_CONF_DATA		(1 << 18)
160*4882a593Smuzhiyun #define RTL818X_RX_CONF_CTRL		(1 << 19)
161*4882a593Smuzhiyun #define RTL818X_RX_CONF_MGMT		(1 << 20)
162*4882a593Smuzhiyun #define RTL818X_RX_CONF_ADDR3		(1 << 21)
163*4882a593Smuzhiyun #define RTL818X_RX_CONF_PM		(1 << 22)
164*4882a593Smuzhiyun #define RTL818X_RX_CONF_BSSID		(1 << 23)
165*4882a593Smuzhiyun #define RTL818X_RX_CONF_RX_AUTORESETPHY	(1 << 28)
166*4882a593Smuzhiyun #define RTL818X_RX_CONF_CSDM1		(1 << 29)
167*4882a593Smuzhiyun #define RTL818X_RX_CONF_CSDM2		(1 << 30)
168*4882a593Smuzhiyun #define RTL818X_RX_CONF_ONLYERLPKT	(1 << 31)
169*4882a593Smuzhiyun 	__le32	INT_TIMEOUT;
170*4882a593Smuzhiyun 	__le32	TBDA;
171*4882a593Smuzhiyun 	u8	EEPROM_CMD;
172*4882a593Smuzhiyun #define RTL818X_EEPROM_CMD_READ		(1 << 0)
173*4882a593Smuzhiyun #define RTL818X_EEPROM_CMD_WRITE	(1 << 1)
174*4882a593Smuzhiyun #define RTL818X_EEPROM_CMD_CK		(1 << 2)
175*4882a593Smuzhiyun #define RTL818X_EEPROM_CMD_CS		(1 << 3)
176*4882a593Smuzhiyun #define RTL818X_EEPROM_CMD_NORMAL	(0 << 6)
177*4882a593Smuzhiyun #define RTL818X_EEPROM_CMD_LOAD		(1 << 6)
178*4882a593Smuzhiyun #define RTL818X_EEPROM_CMD_PROGRAM	(2 << 6)
179*4882a593Smuzhiyun #define RTL818X_EEPROM_CMD_CONFIG	(3 << 6)
180*4882a593Smuzhiyun 	u8	CONFIG0;
181*4882a593Smuzhiyun 	u8	CONFIG1;
182*4882a593Smuzhiyun 	u8	CONFIG2;
183*4882a593Smuzhiyun #define RTL818X_CONFIG2_ANTENNA_DIV	(1 << 6)
184*4882a593Smuzhiyun 	__le32	ANAPARAM;
185*4882a593Smuzhiyun 	u8	MSR;
186*4882a593Smuzhiyun #define RTL818X_MSR_NO_LINK		(0 << 2)
187*4882a593Smuzhiyun #define RTL818X_MSR_ADHOC		(1 << 2)
188*4882a593Smuzhiyun #define RTL818X_MSR_INFRA		(2 << 2)
189*4882a593Smuzhiyun #define RTL818X_MSR_MASTER		(3 << 2)
190*4882a593Smuzhiyun #define RTL818X_MSR_ENEDCA		(4 << 2)
191*4882a593Smuzhiyun 	u8	CONFIG3;
192*4882a593Smuzhiyun #define RTL818X_CONFIG3_ANAPARAM_WRITE	(1 << 6)
193*4882a593Smuzhiyun #define RTL818X_CONFIG3_GNT_SELECT	(1 << 7)
194*4882a593Smuzhiyun 	u8	CONFIG4;
195*4882a593Smuzhiyun #define RTL818X_CONFIG4_POWEROFF	(1 << 6)
196*4882a593Smuzhiyun #define RTL818X_CONFIG4_VCOOFF		(1 << 7)
197*4882a593Smuzhiyun 	u8	TESTR;
198*4882a593Smuzhiyun 	u8	reserved_9[2];
199*4882a593Smuzhiyun 	u8	PGSELECT;
200*4882a593Smuzhiyun 	u8	SECURITY;
201*4882a593Smuzhiyun 	__le32	ANAPARAM2;
202*4882a593Smuzhiyun 	u8	reserved_10[8];
203*4882a593Smuzhiyun 	__le32  IMR;		/* 0x6c	- Interrupt mask reg for 8187se */
204*4882a593Smuzhiyun #define IMR_TMGDOK      ((1 << 30))
205*4882a593Smuzhiyun #define IMR_DOT11HINT	((1 << 25))	/* 802.11h Measurement Interrupt */
206*4882a593Smuzhiyun #define IMR_BCNDMAINT	((1 << 24))	/* Beacon DMA Interrupt */
207*4882a593Smuzhiyun #define IMR_WAKEINT	((1 << 23))	/* Wake Up Interrupt */
208*4882a593Smuzhiyun #define IMR_TXFOVW	((1 << 22))	/* Tx FIFO Overflow */
209*4882a593Smuzhiyun #define IMR_TIMEOUT1	((1 << 21))	/* Time Out Interrupt 1 */
210*4882a593Smuzhiyun #define IMR_BCNINT	((1 << 20))	/* Beacon Time out */
211*4882a593Smuzhiyun #define IMR_ATIMINT	((1 << 19))	/* ATIM Time Out */
212*4882a593Smuzhiyun #define IMR_TBDER	((1 << 18))	/* Tx Beacon Descriptor Error */
213*4882a593Smuzhiyun #define IMR_TBDOK	((1 << 17))	/* Tx Beacon Descriptor OK */
214*4882a593Smuzhiyun #define IMR_THPDER	((1 << 16))	/* Tx High Priority Descriptor Error */
215*4882a593Smuzhiyun #define IMR_THPDOK	((1 << 15))	/* Tx High Priority Descriptor OK */
216*4882a593Smuzhiyun #define IMR_TVODER	((1 << 14))	/* Tx AC_VO Descriptor Error Int */
217*4882a593Smuzhiyun #define IMR_TVODOK	((1 << 13))	/* Tx AC_VO Descriptor OK Interrupt */
218*4882a593Smuzhiyun #define IMR_FOVW	((1 << 12))	/* Rx FIFO Overflow Interrupt */
219*4882a593Smuzhiyun #define IMR_RDU		((1 << 11))	/* Rx Descriptor Unavailable */
220*4882a593Smuzhiyun #define IMR_TVIDER	((1 << 10))	/* Tx AC_VI Descriptor Error */
221*4882a593Smuzhiyun #define IMR_TVIDOK	((1 << 9))	/* Tx AC_VI Descriptor OK Interrupt */
222*4882a593Smuzhiyun #define IMR_RER		((1 << 8))	/* Rx Error Interrupt */
223*4882a593Smuzhiyun #define IMR_ROK		((1 << 7))	/* Receive OK Interrupt */
224*4882a593Smuzhiyun #define IMR_TBEDER	((1 << 6))	/* Tx AC_BE Descriptor Error */
225*4882a593Smuzhiyun #define IMR_TBEDOK	((1 << 5))	/* Tx AC_BE Descriptor OK */
226*4882a593Smuzhiyun #define IMR_TBKDER	((1 << 4))	/* Tx AC_BK Descriptor Error */
227*4882a593Smuzhiyun #define IMR_TBKDOK	((1 << 3))	/* Tx AC_BK Descriptor OK */
228*4882a593Smuzhiyun #define IMR_RQOSOK	((1 << 2))	/* Rx QoS OK Interrupt */
229*4882a593Smuzhiyun #define IMR_TIMEOUT2	((1 << 1))	/* Time Out Interrupt 2 */
230*4882a593Smuzhiyun #define IMR_TIMEOUT3	((1 << 0))	/* Time Out Interrupt 3 */
231*4882a593Smuzhiyun 	__le16	BEACON_INTERVAL; /* 0x70 */
232*4882a593Smuzhiyun 	__le16	ATIM_WND; /*  0x72 */
233*4882a593Smuzhiyun 	__le16	BEACON_INTERVAL_TIME; /*  0x74 */
234*4882a593Smuzhiyun 	__le16	ATIMTR_INTERVAL; /*  0x76 */
235*4882a593Smuzhiyun 	u8	PHY_DELAY; /*  0x78 */
236*4882a593Smuzhiyun 	u8	CARRIER_SENSE_COUNTER; /* 0x79 */
237*4882a593Smuzhiyun 	u8	reserved_11[2]; /* 0x7a */
238*4882a593Smuzhiyun 	u8	PHY[4]; /* 0x7c  */
239*4882a593Smuzhiyun 	__le16	RFPinsOutput; /* 0x80 */
240*4882a593Smuzhiyun 	__le16	RFPinsEnable; /* 0x82 */
241*4882a593Smuzhiyun 	__le16	RFPinsSelect; /* 0x84 */
242*4882a593Smuzhiyun 	__le16	RFPinsInput;  /* 0x86 */
243*4882a593Smuzhiyun 	__le32	RF_PARA; /*  0x88 */
244*4882a593Smuzhiyun 	__le32	RF_TIMING; /*  0x8c */
245*4882a593Smuzhiyun 	u8	GP_ENABLE; /*  0x90 */
246*4882a593Smuzhiyun 	u8	GPIO0; /*  0x91 */
247*4882a593Smuzhiyun 	u8	GPIO1; /*  0x92 */
248*4882a593Smuzhiyun 	u8	TPPOLL_STOP; /*  0x93 - rtl8187se only */
249*4882a593Smuzhiyun #define RTL818x_TPPOLL_STOP_BQ			(1 << 7)
250*4882a593Smuzhiyun #define RTL818x_TPPOLL_STOP_VI			(1 << 4)
251*4882a593Smuzhiyun #define RTL818x_TPPOLL_STOP_VO			(1 << 5)
252*4882a593Smuzhiyun #define RTL818x_TPPOLL_STOP_BE			(1 << 3)
253*4882a593Smuzhiyun #define RTL818x_TPPOLL_STOP_BK			(1 << 2)
254*4882a593Smuzhiyun #define RTL818x_TPPOLL_STOP_MG			(1 << 1)
255*4882a593Smuzhiyun #define RTL818x_TPPOLL_STOP_HI			(1 << 6)
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	__le32	HSSI_PARA; /*  0x94 */
258*4882a593Smuzhiyun 	u8	reserved_13[4]; /* 0x98 */
259*4882a593Smuzhiyun 	u8	TX_AGC_CTL; /*  0x9c */
260*4882a593Smuzhiyun #define RTL818X_TX_AGC_CTL_PERPACKET_GAIN	(1 << 0)
261*4882a593Smuzhiyun #define RTL818X_TX_AGC_CTL_PERPACKET_ANTSEL	(1 << 1)
262*4882a593Smuzhiyun #define RTL818X_TX_AGC_CTL_FEEDBACK_ANT		(1 << 2)
263*4882a593Smuzhiyun 	u8	TX_GAIN_CCK;
264*4882a593Smuzhiyun 	u8	TX_GAIN_OFDM;
265*4882a593Smuzhiyun 	u8	TX_ANTENNA;
266*4882a593Smuzhiyun 	u8	reserved_14[16];
267*4882a593Smuzhiyun 	u8	WPA_CONF;
268*4882a593Smuzhiyun 	u8	reserved_15[3];
269*4882a593Smuzhiyun 	u8	SIFS;
270*4882a593Smuzhiyun 	u8	DIFS;
271*4882a593Smuzhiyun 	u8	SLOT;
272*4882a593Smuzhiyun 	u8	reserved_16[5];
273*4882a593Smuzhiyun 	u8	CW_CONF;
274*4882a593Smuzhiyun #define RTL818X_CW_CONF_PERPACKET_CW	(1 << 0)
275*4882a593Smuzhiyun #define RTL818X_CW_CONF_PERPACKET_RETRY	(1 << 1)
276*4882a593Smuzhiyun 	u8	CW_VAL;
277*4882a593Smuzhiyun 	u8	RATE_FALLBACK;
278*4882a593Smuzhiyun #define RTL818X_RATE_FALLBACK_ENABLE	(1 << 7)
279*4882a593Smuzhiyun 	u8	ACM_CONTROL;
280*4882a593Smuzhiyun 	u8	reserved_17[24];
281*4882a593Smuzhiyun 	u8	CONFIG5;
282*4882a593Smuzhiyun 	u8	TX_DMA_POLLING;
283*4882a593Smuzhiyun 	u8	PHY_PR;
284*4882a593Smuzhiyun 	u8	reserved_18;
285*4882a593Smuzhiyun 	__le16	CWR;
286*4882a593Smuzhiyun 	u8	RETRY_CTR;
287*4882a593Smuzhiyun 	u8	reserved_19[3];
288*4882a593Smuzhiyun 	__le16	INT_MIG;
289*4882a593Smuzhiyun /* RTL818X_R8187B_*: magic numbers from ioregisters */
290*4882a593Smuzhiyun #define RTL818X_R8187B_B	0
291*4882a593Smuzhiyun #define RTL818X_R8187B_D	1
292*4882a593Smuzhiyun #define RTL818X_R8187B_E	2
293*4882a593Smuzhiyun 	__le32	RDSAR;
294*4882a593Smuzhiyun 	__le16	TID_AC_MAP;
295*4882a593Smuzhiyun 	u8	reserved_20[4];
296*4882a593Smuzhiyun 	union {
297*4882a593Smuzhiyun 		__le16	ANAPARAM3; /* 0xee */
298*4882a593Smuzhiyun 		u8	ANAPARAM3A; /* for rtl8187 */
299*4882a593Smuzhiyun 	};
300*4882a593Smuzhiyun 
301*4882a593Smuzhiyun #define AC_PARAM_TXOP_LIMIT_SHIFT	16
302*4882a593Smuzhiyun #define AC_PARAM_ECW_MAX_SHIFT		12
303*4882a593Smuzhiyun #define AC_PARAM_ECW_MIN_SHIFT		8
304*4882a593Smuzhiyun #define AC_PARAM_AIFS_SHIFT		0
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 	__le32 AC_VO_PARAM; /* 0xf0 */
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun 	union { /* 0xf4 */
309*4882a593Smuzhiyun 		__le32 AC_VI_PARAM;
310*4882a593Smuzhiyun 		__le16 FEMR;
311*4882a593Smuzhiyun 	} __packed;
312*4882a593Smuzhiyun 
313*4882a593Smuzhiyun 	union{ /* 0xf8 */
314*4882a593Smuzhiyun 		__le32  AC_BE_PARAM; /* rtl8187se */
315*4882a593Smuzhiyun 		struct{
316*4882a593Smuzhiyun 			u8      reserved_21[2];
317*4882a593Smuzhiyun 			__le16	TALLY_CNT; /* 0xfa */
318*4882a593Smuzhiyun 		} __packed;
319*4882a593Smuzhiyun 	} __packed;
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	union {
322*4882a593Smuzhiyun 		u8	TALLY_SEL; /* 0xfc */
323*4882a593Smuzhiyun 		__le32  AC_BK_PARAM;
324*4882a593Smuzhiyun 
325*4882a593Smuzhiyun 	} __packed;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun } __packed;
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun /* These are addresses with NON-standard usage.
330*4882a593Smuzhiyun  * They have offsets very far from this struct.
331*4882a593Smuzhiyun  * I don't like to introduce a ton of "reserved"..
332*4882a593Smuzhiyun  * They are for RTL8187SE
333*4882a593Smuzhiyun  */
334*4882a593Smuzhiyun #define REG_ADDR1(addr)	((u8 __iomem *)priv->map + (addr))
335*4882a593Smuzhiyun #define REG_ADDR2(addr)	((__le16 __iomem *)priv->map + ((addr) >> 1))
336*4882a593Smuzhiyun #define REG_ADDR4(addr)	((__le32 __iomem *)priv->map + ((addr) >> 2))
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun #define FEMR_SE		REG_ADDR2(0x1D4)
339*4882a593Smuzhiyun #define ARFR		REG_ADDR2(0x1E0)
340*4882a593Smuzhiyun #define RFSW_CTRL	REG_ADDR2(0x272)
341*4882a593Smuzhiyun #define SW_3W_DB0	REG_ADDR2(0x274)
342*4882a593Smuzhiyun #define SW_3W_DB0_4	REG_ADDR4(0x274)
343*4882a593Smuzhiyun #define SW_3W_DB1	REG_ADDR2(0x278)
344*4882a593Smuzhiyun #define SW_3W_DB1_4	REG_ADDR4(0x278)
345*4882a593Smuzhiyun #define SW_3W_CMD1	REG_ADDR1(0x27D)
346*4882a593Smuzhiyun #define PI_DATA_REG	REG_ADDR2(0x360)
347*4882a593Smuzhiyun #define SI_DATA_REG     REG_ADDR2(0x362)
348*4882a593Smuzhiyun 
349*4882a593Smuzhiyun struct rtl818x_rf_ops {
350*4882a593Smuzhiyun 	char *name;
351*4882a593Smuzhiyun 	void (*init)(struct ieee80211_hw *);
352*4882a593Smuzhiyun 	void (*stop)(struct ieee80211_hw *);
353*4882a593Smuzhiyun 	void (*set_chan)(struct ieee80211_hw *, struct ieee80211_conf *);
354*4882a593Smuzhiyun 	u8 (*calc_rssi)(u8 agc, u8 sq);
355*4882a593Smuzhiyun };
356*4882a593Smuzhiyun 
357*4882a593Smuzhiyun /**
358*4882a593Smuzhiyun  * enum rtl818x_tx_desc_flags - Tx/Rx flags are common between RTL818X chips
359*4882a593Smuzhiyun  *
360*4882a593Smuzhiyun  * @RTL818X_TX_DESC_FLAG_NO_ENC: Disable hardware based encryption.
361*4882a593Smuzhiyun  * @RTL818X_TX_DESC_FLAG_TX_OK: TX frame was ACKed.
362*4882a593Smuzhiyun  * @RTL818X_TX_DESC_FLAG_SPLCP: Use short preamble.
363*4882a593Smuzhiyun  * @RTL818X_TX_DESC_FLAG_MOREFRAG: More fragments follow.
364*4882a593Smuzhiyun  * @RTL818X_TX_DESC_FLAG_CTS: Use CTS-to-self protection.
365*4882a593Smuzhiyun  * @RTL818X_TX_DESC_FLAG_RTS: Use RTS/CTS protection.
366*4882a593Smuzhiyun  * @RTL818X_TX_DESC_FLAG_LS: Last segment of the frame.
367*4882a593Smuzhiyun  * @RTL818X_TX_DESC_FLAG_FS: First segment of the frame.
368*4882a593Smuzhiyun  */
369*4882a593Smuzhiyun enum rtl818x_tx_desc_flags {
370*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_NO_ENC	= (1 << 15),
371*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_TX_OK	= (1 << 15),
372*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_SPLCP	= (1 << 16),
373*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_RX_UNDER	= (1 << 16),
374*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_MOREFRAG	= (1 << 17),
375*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_CTS	= (1 << 18),
376*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_RTS	= (1 << 23),
377*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_LS		= (1 << 28),
378*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_FS		= (1 << 29),
379*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_DMA	= (1 << 30),
380*4882a593Smuzhiyun 	RTL818X_TX_DESC_FLAG_OWN	= (1 << 31)
381*4882a593Smuzhiyun };
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun enum rtl818x_rx_desc_flags {
384*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_ICV_ERR	= (1 << 12),
385*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_CRC32_ERR	= (1 << 13),
386*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_PM		= (1 << 14),
387*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_RX_ERR	= (1 << 15),
388*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_BCAST	= (1 << 16),
389*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_PAM	= (1 << 17),
390*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_MCAST	= (1 << 18),
391*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_QOS	= (1 << 19), /* RTL8187(B) only */
392*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_TRSW	= (1 << 24), /* RTL8187(B) only */
393*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_SPLCP	= (1 << 25),
394*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_FOF	= (1 << 26),
395*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_DMA_FAIL	= (1 << 27),
396*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_LS		= (1 << 28),
397*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_FS		= (1 << 29),
398*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_EOR	= (1 << 30),
399*4882a593Smuzhiyun 	RTL818X_RX_DESC_FLAG_OWN	= (1 << 31)
400*4882a593Smuzhiyun };
401*4882a593Smuzhiyun 
402*4882a593Smuzhiyun #endif /* RTL818X_H */
403