|
|
1.1 root 1: /*
2: * Definitions for RTL818x hardware
3: *
4: * Copyright 2007 Michael Wu <[email protected]>
5: * Copyright 2007 Andrea Merello <[email protected]>
6: *
7: * Modified for iPXE, June 2009, by Joshua Oreman <[email protected]>
8: *
9: * Based on the r8187 driver, which is:
10: * Copyright 2005 Andrea Merello <[email protected]>, 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 <ipxe/spi_bit.h>
21: #include <ipxe/tables.h>
22:
23: FILE_LICENCE(GPL2_ONLY);
24:
25: struct 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:
223: enum 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:
237: struct 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:
251: enum 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:
270: struct rtl818x_rx_desc {
271: u32 flags;
272: u32 flags2;
273: union {
274: u32 rx_buf;
275: u64 tsft;
276: };
277: } __attribute__ ((packed));
278:
279: struct 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:
311: void rtl818x_write_phy(struct net80211_device *dev, u8 addr, u32 data);
312: void rtl818x_set_anaparam(struct rtl818x_priv *priv, u32 anaparam);
313:
314: static inline u8 rtl818x_ioread8(struct rtl818x_priv *priv __unused, u8 *addr)
315: {
316: return inb(addr);
317: }
318:
319: static inline u16 rtl818x_ioread16(struct rtl818x_priv *priv __unused, u16 *addr)
320: {
321: return inw(addr);
322: }
323:
324: static inline u32 rtl818x_ioread32(struct rtl818x_priv *priv __unused, u32 *addr)
325: {
326: return inl(addr);
327: }
328:
329: static inline void rtl818x_iowrite8(struct rtl818x_priv *priv __unused,
330: u8 *addr, u8 val)
331: {
332: outb(val, addr);
333: }
334:
335: static inline void rtl818x_iowrite16(struct rtl818x_priv *priv __unused,
336: u16 *addr, u16 val)
337: {
338: outw(val, addr);
339: }
340:
341: static 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:
350: struct 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 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.