compat-wireless-2010-03-10
[pandora-wifi.git] / drivers / net / wireless / rtl818x / rtl8187.h
1 /*
2  * Definitions for RTL8187 hardware
3  *
4  * Copyright 2007 Michael Wu <flamingice@sourmilk.net>
5  * Copyright 2007 Andrea Merello <andreamrl@tiscali.it>
6  *
7  * Based on the r8187 driver, which is:
8  * Copyright 2005 Andrea Merello <andreamrl@tiscali.it>, 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 RTL8187_H
16 #define RTL8187_H
17
18 #include "rtl818x.h"
19 #include "rtl8187_leds.h"
20
21 #define RTL8187_EEPROM_TXPWR_BASE       0x05
22 #define RTL8187_EEPROM_MAC_ADDR         0x07
23 #define RTL8187_EEPROM_TXPWR_CHAN_1     0x16    /* 3 channels */
24 #define RTL8187_EEPROM_TXPWR_CHAN_6     0x1B    /* 2 channels */
25 #define RTL8187_EEPROM_TXPWR_CHAN_4     0x3D    /* 2 channels */
26 #define RTL8187_EEPROM_SELECT_GPIO      0x3B
27
28 #define RTL8187_REQT_READ       0xC0
29 #define RTL8187_REQT_WRITE      0x40
30 #define RTL8187_REQ_GET_REG     0x05
31 #define RTL8187_REQ_SET_REG     0x05
32
33 #define RTL8187_MAX_RX          0x9C4
34
35 #define RFKILL_MASK_8187_89_97  0x2
36 #define RFKILL_MASK_8198        0x4
37
38 struct rtl8187_rx_info {
39         struct urb *urb;
40         struct ieee80211_hw *dev;
41 };
42
43 struct rtl8187_rx_hdr {
44         __le32 flags;
45         u8 noise;
46         u8 signal;
47         u8 agc;
48         u8 reserved;
49         __le64 mac_time;
50 } __attribute__((packed));
51
52 struct rtl8187b_rx_hdr {
53         __le32 flags;
54         __le64 mac_time;
55         u8 sq;
56         u8 rssi;
57         u8 agc;
58         u8 flags2;
59         __le16 snr_long2end;
60         s8 pwdb_g12;
61         u8 fot;
62 } __attribute__((packed));
63
64 /* {rtl8187,rtl8187b}_tx_info is in skb */
65
66 struct rtl8187_tx_hdr {
67         __le32 flags;
68         __le16 rts_duration;
69         __le16 len;
70         __le32 retry;
71 } __attribute__((packed));
72
73 struct rtl8187b_tx_hdr {
74         __le32 flags;
75         __le16 rts_duration;
76         __le16 len;
77         __le32 unused_1;
78         __le16 unused_2;
79         __le16 tx_duration;
80         __le32 unused_3;
81         __le32 retry;
82         __le32 unused_4[2];
83 } __attribute__((packed));
84
85 enum {
86         DEVICE_RTL8187,
87         DEVICE_RTL8187B
88 };
89
90 struct rtl8187_priv {
91         /* common between rtl818x drivers */
92         struct rtl818x_csr *map;
93         const struct rtl818x_rf_ops *rf;
94         struct ieee80211_vif *vif;
95
96         /* The mutex protects the TX loopback state.
97          * Any attempt to set channels concurrently locks the device.
98          */
99         struct mutex conf_mutex;
100
101         /* rtl8187 specific */
102         struct ieee80211_channel channels[14];
103         struct ieee80211_rate rates[12];
104         struct ieee80211_supported_band band;
105         struct usb_device *udev;
106         u32 rx_conf;
107         struct usb_anchor anchored;
108         struct delayed_work work;
109         struct ieee80211_hw *dev;
110 #ifdef CONFIG_RTL8187_LEDS
111         struct rtl8187_led led_radio;
112         struct rtl8187_led led_tx;
113         struct rtl8187_led led_rx;
114         struct delayed_work led_on;
115         struct delayed_work led_off;
116 #endif
117         u16 txpwr_base;
118         u8 asic_rev;
119         u8 is_rtl8187b;
120         enum {
121                 RTL8187BvB,
122                 RTL8187BvD,
123                 RTL8187BvE
124         } hw_rev;
125         struct sk_buff_head rx_queue;
126         u8 signal;
127         u8 noise;
128         u8 slot_time;
129         u8 aifsn[4];
130         u8 rfkill_mask;
131         struct {
132                 __le64 buf;
133                 struct sk_buff_head queue;
134         } b_tx_status; /* This queue is used by both -b and non-b devices */
135         struct mutex io_mutex;
136         union {
137                 u8 bits8;
138                 __le16 bits16;
139                 __le32 bits32;
140         } *io_dmabuf;
141         bool rfkill_off;
142 };
143
144 void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data);
145
146 static inline u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv,
147                                      u8 *addr, u8 idx)
148 {
149         u8 val;
150
151         mutex_lock(&priv->io_mutex);
152         usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
153                         RTL8187_REQ_GET_REG, RTL8187_REQT_READ,
154                         (unsigned long)addr, idx & 0x03,
155                         &priv->io_dmabuf->bits8, sizeof(val), HZ / 2);
156
157         val = priv->io_dmabuf->bits8;
158         mutex_unlock(&priv->io_mutex);
159
160         return val;
161 }
162
163 static inline u8 rtl818x_ioread8(struct rtl8187_priv *priv, u8 *addr)
164 {
165         return rtl818x_ioread8_idx(priv, addr, 0);
166 }
167
168 static inline u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv,
169                                        __le16 *addr, u8 idx)
170 {
171         __le16 val;
172
173         mutex_lock(&priv->io_mutex);
174         usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
175                         RTL8187_REQ_GET_REG, RTL8187_REQT_READ,
176                         (unsigned long)addr, idx & 0x03,
177                         &priv->io_dmabuf->bits16, sizeof(val), HZ / 2);
178
179         val = priv->io_dmabuf->bits16;
180         mutex_unlock(&priv->io_mutex);
181
182         return le16_to_cpu(val);
183 }
184
185 static inline u16 rtl818x_ioread16(struct rtl8187_priv *priv, __le16 *addr)
186 {
187         return rtl818x_ioread16_idx(priv, addr, 0);
188 }
189
190 static inline u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv,
191                                        __le32 *addr, u8 idx)
192 {
193         __le32 val;
194
195         mutex_lock(&priv->io_mutex);
196         usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
197                         RTL8187_REQ_GET_REG, RTL8187_REQT_READ,
198                         (unsigned long)addr, idx & 0x03,
199                         &priv->io_dmabuf->bits32, sizeof(val), HZ / 2);
200
201         val = priv->io_dmabuf->bits32;
202         mutex_unlock(&priv->io_mutex);
203
204         return le32_to_cpu(val);
205 }
206
207 static inline u32 rtl818x_ioread32(struct rtl8187_priv *priv, __le32 *addr)
208 {
209         return rtl818x_ioread32_idx(priv, addr, 0);
210 }
211
212 static inline void rtl818x_iowrite8_idx(struct rtl8187_priv *priv,
213                                         u8 *addr, u8 val, u8 idx)
214 {
215         mutex_lock(&priv->io_mutex);
216
217         priv->io_dmabuf->bits8 = val;
218         usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
219                         RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE,
220                         (unsigned long)addr, idx & 0x03,
221                         &priv->io_dmabuf->bits8, sizeof(val), HZ / 2);
222
223         mutex_unlock(&priv->io_mutex);
224 }
225
226 static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val)
227 {
228         rtl818x_iowrite8_idx(priv, addr, val, 0);
229 }
230
231 static inline void rtl818x_iowrite16_idx(struct rtl8187_priv *priv,
232                                          __le16 *addr, u16 val, u8 idx)
233 {
234         mutex_lock(&priv->io_mutex);
235
236         priv->io_dmabuf->bits16 = cpu_to_le16(val);
237         usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
238                         RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE,
239                         (unsigned long)addr, idx & 0x03,
240                         &priv->io_dmabuf->bits16, sizeof(val), HZ / 2);
241
242         mutex_unlock(&priv->io_mutex);
243 }
244
245 static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr,
246                                      u16 val)
247 {
248         rtl818x_iowrite16_idx(priv, addr, val, 0);
249 }
250
251 static inline void rtl818x_iowrite32_idx(struct rtl8187_priv *priv,
252                                          __le32 *addr, u32 val, u8 idx)
253 {
254         mutex_lock(&priv->io_mutex);
255
256         priv->io_dmabuf->bits32 = cpu_to_le32(val);
257         usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
258                         RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE,
259                         (unsigned long)addr, idx & 0x03,
260                         &priv->io_dmabuf->bits32, sizeof(val), HZ / 2);
261
262         mutex_unlock(&priv->io_mutex);
263 }
264
265 static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr,
266                                      u32 val)
267 {
268         rtl818x_iowrite32_idx(priv, addr, val, 0);
269 }
270
271 #endif /* RTL8187_H */