注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

BCB-DG's Blog

...

 
 
 

日志

 
 

Linux/drivers/net/wireless/rtl818x/rtl8187.h  

2014-04-23 14:52:57|  分类: Linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 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         int mode;
 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 */
  评论这张
 
阅读(322)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017