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