Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rtl8187.h
Go to the documentation of this file.
1 /*
2  * Definitions for RTL8187 hardware
3  *
4  * Copyright 2007 Michael Wu <[email protected]>
5  * Copyright 2007 Andrea Merello <[email protected]>
6  *
7  * Based on the r8187 driver, which is:
8  * Copyright 2005 Andrea Merello <[email protected]>, 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 "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 #define RETRY_COUNT 7
39 
41  struct urb *urb;
42  struct ieee80211_hw *dev;
43 };
44 
52 } __packed;
53 
57  u8 sq;
64 } __packed;
65 
66 /* {rtl8187,rtl8187b}_tx_info is in skb */
67 
73 } __packed;
74 
85 } __packed;
86 
87 enum {
90 };
91 
92 struct rtl8187_vif {
93  struct ieee80211_hw *dev;
94 
95  /* beaconing */
98 };
99 
100 struct rtl8187_priv {
101  /* common between rtl818x drivers */
102  struct rtl818x_csr *map;
103  const struct rtl818x_rf_ops *rf;
105 
106  /* The mutex protects the TX loopback state.
107  * Any attempt to set channels concurrently locks the device.
108  */
110 
111  /* rtl8187 specific */
113  struct ieee80211_rate rates[12];
115  struct usb_device *udev;
117  struct usb_anchor anchored;
119  struct ieee80211_hw *dev;
120 #ifdef CONFIG_RTL8187_LEDS
121  struct rtl8187_led led_radio;
122  struct rtl8187_led led_tx;
123  struct rtl8187_led led_rx;
124  struct delayed_work led_on;
125  struct delayed_work led_off;
126 #endif
130  enum {
134  } hw_rev;
139  u8 aifsn[4];
141  struct {
144  } b_tx_status; /* This queue is used by both -b and non-b devices */
145  struct mutex io_mutex;
146  union {
150  } *io_dmabuf;
153 };
154 
156 
157 static inline u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv,
158  u8 *addr, u8 idx)
159 {
160  u8 val;
161 
162  mutex_lock(&priv->io_mutex);
163  usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
165  (unsigned long)addr, idx & 0x03,
166  &priv->io_dmabuf->bits8, sizeof(val), HZ / 2);
167 
168  val = priv->io_dmabuf->bits8;
169  mutex_unlock(&priv->io_mutex);
170 
171  return val;
172 }
173 
174 static inline u8 rtl818x_ioread8(struct rtl8187_priv *priv, u8 *addr)
175 {
176  return rtl818x_ioread8_idx(priv, addr, 0);
177 }
178 
179 static inline u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv,
180  __le16 *addr, u8 idx)
181 {
182  __le16 val;
183 
184  mutex_lock(&priv->io_mutex);
185  usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
187  (unsigned long)addr, idx & 0x03,
188  &priv->io_dmabuf->bits16, sizeof(val), HZ / 2);
189 
190  val = priv->io_dmabuf->bits16;
191  mutex_unlock(&priv->io_mutex);
192 
193  return le16_to_cpu(val);
194 }
195 
196 static inline u16 rtl818x_ioread16(struct rtl8187_priv *priv, __le16 *addr)
197 {
198  return rtl818x_ioread16_idx(priv, addr, 0);
199 }
200 
201 static inline u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv,
202  __le32 *addr, u8 idx)
203 {
204  __le32 val;
205 
206  mutex_lock(&priv->io_mutex);
207  usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0),
209  (unsigned long)addr, idx & 0x03,
210  &priv->io_dmabuf->bits32, sizeof(val), HZ / 2);
211 
212  val = priv->io_dmabuf->bits32;
213  mutex_unlock(&priv->io_mutex);
214 
215  return le32_to_cpu(val);
216 }
217 
218 static inline u32 rtl818x_ioread32(struct rtl8187_priv *priv, __le32 *addr)
219 {
220  return rtl818x_ioread32_idx(priv, addr, 0);
221 }
222 
223 static inline void rtl818x_iowrite8_idx(struct rtl8187_priv *priv,
224  u8 *addr, u8 val, u8 idx)
225 {
226  mutex_lock(&priv->io_mutex);
227 
228  priv->io_dmabuf->bits8 = val;
229  usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
231  (unsigned long)addr, idx & 0x03,
232  &priv->io_dmabuf->bits8, sizeof(val), HZ / 2);
233 
234  mutex_unlock(&priv->io_mutex);
235 }
236 
237 static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val)
238 {
239  rtl818x_iowrite8_idx(priv, addr, val, 0);
240 }
241 
242 static inline void rtl818x_iowrite16_idx(struct rtl8187_priv *priv,
243  __le16 *addr, u16 val, u8 idx)
244 {
245  mutex_lock(&priv->io_mutex);
246 
247  priv->io_dmabuf->bits16 = cpu_to_le16(val);
248  usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
250  (unsigned long)addr, idx & 0x03,
251  &priv->io_dmabuf->bits16, sizeof(val), HZ / 2);
252 
253  mutex_unlock(&priv->io_mutex);
254 }
255 
256 static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr,
257  u16 val)
258 {
259  rtl818x_iowrite16_idx(priv, addr, val, 0);
260 }
261 
262 static inline void rtl818x_iowrite32_idx(struct rtl8187_priv *priv,
263  __le32 *addr, u32 val, u8 idx)
264 {
265  mutex_lock(&priv->io_mutex);
266 
267  priv->io_dmabuf->bits32 = cpu_to_le32(val);
268  usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0),
270  (unsigned long)addr, idx & 0x03,
271  &priv->io_dmabuf->bits32, sizeof(val), HZ / 2);
272 
273  mutex_unlock(&priv->io_mutex);
274 }
275 
276 static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr,
277  u32 val)
278 {
279  rtl818x_iowrite32_idx(priv, addr, val, 0);
280 }
281 
282 #endif /* RTL8187_H */