source: bootcd/isolinux/syslinux-6.03/gpxe/src/drivers/net/rtl818x/rtl818x.h

Last change on this file was e16e8f2, checked in by Edwin Eefting <edwin@datux.nl>, 3 years ago

bootstuff

  • Property mode set to 100644
File size: 9.6 KB
Line 
1/*
2 * Definitions for RTL818x hardware
3 *
4 * Copyright 2007 Michael Wu <flamingice@sourmilk.net>
5 * Copyright 2007 Andrea Merello <andreamrl@tiscali.it>
6 *
7 * Modified for gPXE, June 2009, by Joshua Oreman <oremanj@rwcr.net>
8 *
9 * Based on the r8187 driver, which is:
10 * Copyright 2005 Andrea Merello <andreamrl@tiscali.it>, et al.
11 *
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License version 2 as
14 * published by the Free Software Foundation.
15 */
16
17#ifndef RTL818X_H
18#define RTL818X_H
19
20#include <gpxe/spi_bit.h>
21#include <gpxe/tables.h>
22
23FILE_LICENCE(GPL2_ONLY);
24
25struct rtl818x_csr {
26        u8      MAC[6];
27        u8      reserved_0[2];
28        u32     MAR[2];
29        u8      RX_FIFO_COUNT;
30        u8      reserved_1;
31        u8      TX_FIFO_COUNT;
32        u8      BQREQ;
33        u8      reserved_2[4];
34        u32     TSFT[2];
35        u32     TLPDA;
36        u32     TNPDA;
37        u32     THPDA;
38        u16     BRSR;
39        u8      BSSID[6];
40        u8      RESP_RATE;
41        u8      EIFS;
42        u8      reserved_3[1];
43        u8      CMD;
44#define RTL818X_CMD_TX_ENABLE           (1 << 2)
45#define RTL818X_CMD_RX_ENABLE           (1 << 3)
46#define RTL818X_CMD_RESET               (1 << 4)
47        u8      reserved_4[4];
48        u16     INT_MASK;
49        u16     INT_STATUS;
50#define RTL818X_INT_RX_OK               (1 <<  0)
51#define RTL818X_INT_RX_ERR              (1 <<  1)
52#define RTL818X_INT_TXL_OK              (1 <<  2)
53#define RTL818X_INT_TXL_ERR             (1 <<  3)
54#define RTL818X_INT_RX_DU               (1 <<  4)
55#define RTL818X_INT_RX_FO               (1 <<  5)
56#define RTL818X_INT_TXN_OK              (1 <<  6)
57#define RTL818X_INT_TXN_ERR             (1 <<  7)
58#define RTL818X_INT_TXH_OK              (1 <<  8)
59#define RTL818X_INT_TXH_ERR             (1 <<  9)
60#define RTL818X_INT_TXB_OK              (1 << 10)
61#define RTL818X_INT_TXB_ERR             (1 << 11)
62#define RTL818X_INT_ATIM                (1 << 12)
63#define RTL818X_INT_BEACON              (1 << 13)
64#define RTL818X_INT_TIME_OUT            (1 << 14)
65#define RTL818X_INT_TX_FO               (1 << 15)
66        u32     TX_CONF;
67#define RTL818X_TX_CONF_LOOPBACK_MAC    (1 << 17)
68#define RTL818X_TX_CONF_LOOPBACK_CONT   (3 << 17)
69#define RTL818X_TX_CONF_NO_ICV          (1 << 19)
70#define RTL818X_TX_CONF_DISCW           (1 << 20)
71#define RTL818X_TX_CONF_SAT_HWPLCP      (1 << 24)
72#define RTL818X_TX_CONF_R8180_ABCD      (2 << 25)
73#define RTL818X_TX_CONF_R8180_F         (3 << 25)
74#define RTL818X_TX_CONF_R8185_ABC       (4 << 25)
75#define RTL818X_TX_CONF_R8185_D         (5 << 25)
76#define RTL818X_TX_CONF_R8187vD         (5 << 25)
77#define RTL818X_TX_CONF_R8187vD_B       (6 << 25)
78#define RTL818X_TX_CONF_HWVER_MASK      (7 << 25)
79#define RTL818X_TX_CONF_DISREQQSIZE     (1 << 28)
80#define RTL818X_TX_CONF_PROBE_DTS       (1 << 29)
81#define RTL818X_TX_CONF_HW_SEQNUM       (1 << 30)
82#define RTL818X_TX_CONF_CW_MIN          (1 << 31)
83        u32     RX_CONF;
84#define RTL818X_RX_CONF_MONITOR         (1 <<  0)
85#define RTL818X_RX_CONF_NICMAC          (1 <<  1)
86#define RTL818X_RX_CONF_MULTICAST       (1 <<  2)
87#define RTL818X_RX_CONF_BROADCAST       (1 <<  3)
88#define RTL818X_RX_CONF_FCS             (1 <<  5)
89#define RTL818X_RX_CONF_DATA            (1 << 18)
90#define RTL818X_RX_CONF_CTRL            (1 << 19)
91#define RTL818X_RX_CONF_MGMT            (1 << 20)
92#define RTL818X_RX_CONF_ADDR3           (1 << 21)
93#define RTL818X_RX_CONF_PM              (1 << 22)
94#define RTL818X_RX_CONF_BSSID           (1 << 23)
95#define RTL818X_RX_CONF_RX_AUTORESETPHY (1 << 28)
96#define RTL818X_RX_CONF_CSDM1           (1 << 29)
97#define RTL818X_RX_CONF_CSDM2           (1 << 30)
98#define RTL818X_RX_CONF_ONLYERLPKT      (1 << 31)
99        u32     INT_TIMEOUT;
100        u32     TBDA;
101        u8      EEPROM_CMD;
102#define RTL818X_EEPROM_CMD_READ         (1 << 0)
103#define RTL818X_EEPROM_CMD_WRITE        (1 << 1)
104#define RTL818X_EEPROM_CMD_CK           (1 << 2)
105#define RTL818X_EEPROM_CMD_CS           (1 << 3)
106#define RTL818X_EEPROM_CMD_NORMAL       (0 << 6)
107#define RTL818X_EEPROM_CMD_LOAD         (1 << 6)
108#define RTL818X_EEPROM_CMD_PROGRAM      (2 << 6)
109#define RTL818X_EEPROM_CMD_CONFIG       (3 << 6)
110        u8      CONFIG0;
111        u8      CONFIG1;
112        u8      CONFIG2;
113#define RTL818X_CONFIG2_ANTENNA_DIV     (1 << 6)
114        u32     ANAPARAM;
115        u8      MSR;
116#define RTL818X_MSR_NO_LINK             (0 << 2)
117#define RTL818X_MSR_ADHOC               (1 << 2)
118#define RTL818X_MSR_INFRA               (2 << 2)
119#define RTL818X_MSR_MASTER              (3 << 2)
120#define RTL818X_MSR_ENEDCA              (4 << 2)
121        u8      CONFIG3;
122#define RTL818X_CONFIG3_ANAPARAM_WRITE  (1 << 6)
123#define RTL818X_CONFIG3_GNT_SELECT      (1 << 7)
124        u8      CONFIG4;
125#define RTL818X_CONFIG4_POWEROFF        (1 << 6)
126#define RTL818X_CONFIG4_VCOOFF          (1 << 7)
127        u8      TESTR;
128        u8      reserved_9[2];
129        u8      PGSELECT;
130        u8      SECURITY;
131        u32     ANAPARAM2;
132        u8      reserved_10[12];
133        u16     BEACON_INTERVAL;
134        u16     ATIM_WND;
135        u16     BEACON_INTERVAL_TIME;
136        u16     ATIMTR_INTERVAL;
137        u8      PHY_DELAY;
138        u8      CARRIER_SENSE_COUNTER;
139        u8      reserved_11[2];
140        u8      PHY[4];
141        u16     RFPinsOutput;
142        u16     RFPinsEnable;
143        u16     RFPinsSelect;
144        u16     RFPinsInput;
145        u32     RF_PARA;
146        u32     RF_TIMING;
147        u8      GP_ENABLE;
148        u8      GPIO;
149        u8      reserved_12[2];
150        u32     HSSI_PARA;
151        u8      reserved_13[4];
152        u8      TX_AGC_CTL;
153#define RTL818X_TX_AGC_CTL_PERPACKET_GAIN_SHIFT         (1 << 0)
154#define RTL818X_TX_AGC_CTL_PERPACKET_ANTSEL_SHIFT       (1 << 1)
155#define RTL818X_TX_AGC_CTL_FEEDBACK_ANT                 (1 << 2)
156        u8      TX_GAIN_CCK;
157        u8      TX_GAIN_OFDM;
158        u8      TX_ANTENNA;
159        u8      reserved_14[16];
160        u8      WPA_CONF;
161        u8      reserved_15[3];
162        u8      SIFS;
163        u8      DIFS;
164        u8      SLOT;
165        u8      reserved_16[5];
166        u8      CW_CONF;
167#define RTL818X_CW_CONF_PERPACKET_CW_SHIFT      (1 << 0)
168#define RTL818X_CW_CONF_PERPACKET_RETRY_SHIFT   (1 << 1)
169        u8      CW_VAL;
170        u8      RATE_FALLBACK;
171#define RTL818X_RATE_FALLBACK_ENABLE    (1 << 7)
172        u8      ACM_CONTROL;
173        u8      reserved_17[24];
174        u8      CONFIG5;
175        u8      TX_DMA_POLLING;
176        u8      reserved_18[2];
177        u16     CWR;
178        u8      RETRY_CTR;
179        u8      reserved_19[3];
180        u16     INT_MIG;
181/* RTL818X_R8187B_*: magic numbers from ioregisters */
182#define RTL818X_R8187B_B        0
183#define RTL818X_R8187B_D        1
184#define RTL818X_R8187B_E        2
185        u32     RDSAR;
186        u16     TID_AC_MAP;
187        u8      reserved_20[4];
188        u8      ANAPARAM3;
189        u8      reserved_21[5];
190        u16     FEMR;
191        u8      reserved_22[4];
192        u16     TALLY_CNT;
193        u8      TALLY_SEL;
194} __attribute__((packed));
195
196#define MAX_RX_SIZE IEEE80211_MAX_FRAME_LEN
197
198#define RF_PARAM_ANALOGPHY      (1 << 0)
199#define RF_PARAM_ANTBDEFAULT    (1 << 1)
200#define RF_PARAM_CARRIERSENSE1  (1 << 2)
201#define RF_PARAM_CARRIERSENSE2  (1 << 3)
202
203#define BB_ANTATTEN_CHAN14      0x0C
204#define BB_ANTENNA_B            0x40
205
206#define BB_HOST_BANG            (1 << 30)
207#define BB_HOST_BANG_EN         (1 << 2)
208#define BB_HOST_BANG_CLK        (1 << 1)
209#define BB_HOST_BANG_DATA       1
210
211#define ANAPARAM_TXDACOFF_SHIFT 27
212#define ANAPARAM_PWR0_SHIFT     28
213#define ANAPARAM_PWR0_MASK      (0x07 << ANAPARAM_PWR0_SHIFT)
214#define ANAPARAM_PWR1_SHIFT     20
215#define ANAPARAM_PWR1_MASK      (0x7F << ANAPARAM_PWR1_SHIFT)
216
217#define RTL818X_RX_RING_SIZE    8 /* doesn't have to be a power of 2 */
218#define RTL818X_TX_RING_SIZE    8 /* nor this [but 2^n is very slightly faster] */
219#define RTL818X_RING_ALIGN      256
220
221#define RTL818X_MAX_RETRIES     4
222
223enum rtl818x_tx_desc_flags {
224        RTL818X_TX_DESC_FLAG_NO_ENC     = (1 << 15),
225        RTL818X_TX_DESC_FLAG_TX_OK      = (1 << 15),
226        RTL818X_TX_DESC_FLAG_SPLCP      = (1 << 16),
227        RTL818X_TX_DESC_FLAG_RX_UNDER   = (1 << 16),
228        RTL818X_TX_DESC_FLAG_MOREFRAG   = (1 << 17),
229        RTL818X_TX_DESC_FLAG_CTS        = (1 << 18),
230        RTL818X_TX_DESC_FLAG_RTS        = (1 << 23),
231        RTL818X_TX_DESC_FLAG_LS         = (1 << 28),
232        RTL818X_TX_DESC_FLAG_FS         = (1 << 29),
233        RTL818X_TX_DESC_FLAG_DMA        = (1 << 30),
234        RTL818X_TX_DESC_FLAG_OWN        = (1 << 31)
235};
236
237struct rtl818x_tx_desc {
238        u32 flags;
239        u16 rts_duration;
240        u16 plcp_len;
241        u32 tx_buf;
242        u32 frame_len;
243        u32 next_tx_desc;
244        u8 cw;
245        u8 retry_limit;
246        u8 agc;
247        u8 flags2;
248        u32 reserved[2];
249} __attribute__ ((packed));
250
251enum rtl818x_rx_desc_flags {
252        RTL818X_RX_DESC_FLAG_ICV_ERR    = (1 << 12),
253        RTL818X_RX_DESC_FLAG_CRC32_ERR  = (1 << 13),
254        RTL818X_RX_DESC_FLAG_PM         = (1 << 14),
255        RTL818X_RX_DESC_FLAG_RX_ERR     = (1 << 15),
256        RTL818X_RX_DESC_FLAG_BCAST      = (1 << 16),
257        RTL818X_RX_DESC_FLAG_PAM        = (1 << 17),
258        RTL818X_RX_DESC_FLAG_MCAST      = (1 << 18),
259        RTL818X_RX_DESC_FLAG_QOS        = (1 << 19), /* RTL8187(B) only */
260        RTL818X_RX_DESC_FLAG_TRSW       = (1 << 24), /* RTL8187(B) only */
261        RTL818X_RX_DESC_FLAG_SPLCP      = (1 << 25),
262        RTL818X_RX_DESC_FLAG_FOF        = (1 << 26),
263        RTL818X_RX_DESC_FLAG_DMA_FAIL   = (1 << 27),
264        RTL818X_RX_DESC_FLAG_LS         = (1 << 28),
265        RTL818X_RX_DESC_FLAG_FS         = (1 << 29),
266        RTL818X_RX_DESC_FLAG_EOR        = (1 << 30),
267        RTL818X_RX_DESC_FLAG_OWN        = (1 << 31)
268};
269
270struct rtl818x_rx_desc {
271        u32 flags;
272        u32 flags2;
273        union {
274                u32 rx_buf;
275                u64 tsft;
276        };
277} __attribute__ ((packed));
278
279struct rtl818x_priv {
280        struct rtl818x_csr *map;
281        const struct rtl818x_rf_ops *rf;
282        int rf_flag; /* whatever RF driver wishes to use it for */
283        int hw_rate;
284        int hw_rtscts_rate;
285
286        struct spi_bit_basher spibit;
287        struct spi_device eeprom;
288
289        struct rtl818x_rx_desc *rx_ring;
290        u32 rx_ring_dma;
291        unsigned int rx_idx;    /* next desc to be filled by card */
292        struct io_buffer *rx_buf[RTL818X_RX_RING_SIZE];
293
294        struct rtl818x_tx_desc *tx_ring;
295        u32 tx_ring_dma;
296        unsigned int tx_cons;   /* next desc to be filled by card */
297        unsigned int tx_prod;   /* next desc to be filled by driver */
298        struct io_buffer *tx_buf[RTL818X_TX_RING_SIZE];
299
300        struct pci_device *pdev;
301        u32 rx_conf;
302
303        u16 txpower[14];
304
305        int r8185;
306        u32 anaparam;
307        u16 rfparam;
308        u8 csthreshold;
309};
310
311void rtl818x_write_phy(struct net80211_device *dev, u8 addr, u32 data);
312void rtl818x_set_anaparam(struct rtl818x_priv *priv, u32 anaparam);
313
314static inline u8 rtl818x_ioread8(struct rtl818x_priv *priv __unused, u8 *addr)
315{
316        return inb(addr);
317}
318
319static inline u16 rtl818x_ioread16(struct rtl818x_priv *priv __unused, u16 *addr)
320{
321        return inw(addr);
322}
323
324static inline u32 rtl818x_ioread32(struct rtl818x_priv *priv __unused, u32 *addr)
325{
326        return inl(addr);
327}
328
329static inline void rtl818x_iowrite8(struct rtl818x_priv *priv __unused,
330                                    u8 *addr, u8 val)
331{
332        outb(val, addr);
333}
334
335static inline void rtl818x_iowrite16(struct rtl818x_priv *priv __unused,
336                                     u16 *addr, u16 val)
337{
338        outw(val, addr);
339}
340
341static inline void rtl818x_iowrite32(struct rtl818x_priv *priv __unused,
342                                     u32 *addr, u32 val)
343{
344        outl(val, addr);
345}
346
347#define RTL818X_RF_DRIVERS __table(struct rtl818x_rf_ops, "rtl818x_rf_drivers")
348#define __rtl818x_rf_driver __table_entry(RTL818X_RF_DRIVERS, 01)
349
350struct rtl818x_rf_ops {
351        char *name;
352        u8 id;                  /* as identified in EEPROM */
353        void (*init)(struct net80211_device *dev);
354        void (*stop)(struct net80211_device *dev);
355        void (*set_chan)(struct net80211_device *dev, struct net80211_channel *chan);
356        void (*conf_erp)(struct net80211_device *dev); /* set based on dev->erp_flags */
357};
358
359#endif /* RTL818X_H */
Note: See TracBrowser for help on using the repository browser.