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