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 38struct rtl8187_rx_info { 39 struct urb *urb; 40 struct ieee80211_hw *dev; 41}; 42 43struct rtl8187_rx_hdr { 44 __le32 flags; 45 u8 noise; 46 u8 signal; 47 u8 agc; 48 u8 reserved; 49 __le64 mac_time; 50} __packed; 51 52struct 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} __packed; 63 64/* {rtl8187,rtl8187b}_tx_info is in skb */ 65 66struct rtl8187_tx_hdr { 67 __le32 flags; 68 __le16 rts_duration; 69 __le16 len; 70 __le32 retry; 71} __packed; 72 73struct 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} __packed; 84 85enum { 86 DEVICE_RTL8187, 87 DEVICE_RTL8187B 88}; 89 90struct 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 144void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); 145 146static 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 163static inline u8 rtl818x_ioread8(struct rtl8187_priv *priv, u8 *addr) 164{ 165 return rtl818x_ioread8_idx(priv, addr, 0); 166} 167 168static 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 185static inline u16 rtl818x_ioread16(struct rtl8187_priv *priv, __le16 *addr) 186{ 187 return rtl818x_ioread16_idx(priv, addr, 0); 188} 189 190static 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 207static inline u32 rtl818x_ioread32(struct rtl8187_priv *priv, __le32 *addr) 208{ 209 return rtl818x_ioread32_idx(priv, addr, 0); 210} 211 212static 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 226static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) 227{ 228 rtl818x_iowrite8_idx(priv, addr, val, 0); 229} 230 231static 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 245static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, 246 u16 val) 247{ 248 rtl818x_iowrite16_idx(priv, addr, val, 0); 249} 250 251static 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 265static 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 */ 272