19#include <sys/param.h> 20#include <sys/sockio.h> 21#include <sys/sysctl.h> 22#include <sys/lock.h> 23#include <sys/mutex.h> 24#include <sys/mbuf.h> 25#include <sys/kernel.h> 26#include <sys/socket.h> 27#include <sys/systm.h> 28#include <sys/malloc.h> 29#include <sys/module.h> 30#include <sys/bus.h> 31#include <sys/endian.h> 32#include <sys/kdb.h> 33 34#include <machine/bus.h> 35#include <machine/resource.h> 36#include <sys/rman.h> 37 38#include <net/if.h> 39#include <net/if_arp.h> 40#include <net/ethernet.h> 41#include <net/if_dl.h> 42#include <net/if_media.h> 43#include <net/if_types.h> 44 45#ifdef INET 46#include <netinet/in.h> 47#include <netinet/in_systm.h> 48#include <netinet/in_var.h> 49#include <netinet/if_ether.h> 50#include <netinet/ip.h> 51#endif 52 53#include <net80211/ieee80211_var.h> 54#include <net80211/ieee80211_regdomain.h> 55#include <net80211/ieee80211_radiotap.h> 56 57#include <dev/usb/usb.h> 58#include <dev/usb/usbdi.h> 59#include "usbdevs.h" 60 61#include <dev/usb/wlan/if_urtwreg.h> 62#include <dev/usb/wlan/if_urtwvar.h> 63 64SYSCTL_NODE(_hw_usb, OID_AUTO, urtw, CTLFLAG_RW, 0, "USB Realtek 8187L"); 65#ifdef URTW_DEBUG 66int urtw_debug = 0; 67SYSCTL_INT(_hw_usb_urtw, OID_AUTO, debug, CTLFLAG_RW, &urtw_debug, 0, 68 "control debugging printfs"); 69TUNABLE_INT("hw.usb.urtw.debug", &urtw_debug); 70enum { 71 URTW_DEBUG_XMIT = 0x00000001, /* basic xmit operation */ 72 URTW_DEBUG_RECV = 0x00000002, /* basic recv operation */ 73 URTW_DEBUG_RESET = 0x00000004, /* reset processing */ 74 URTW_DEBUG_TX_PROC = 0x00000008, /* tx ISR proc */ 75 URTW_DEBUG_RX_PROC = 0x00000010, /* rx ISR proc */ 76 URTW_DEBUG_STATE = 0x00000020, /* 802.11 state transitions */ 77 URTW_DEBUG_STAT = 0x00000040, /* statistic */ 78 URTW_DEBUG_INIT = 0x00000080, /* initialization of dev */ 79 URTW_DEBUG_TXSTATUS = 0x00000100, /* tx status */ 80 URTW_DEBUG_ANY = 0xffffffff 81}; 82#define DPRINTF(sc, m, fmt, ...) do { \ 83 if (sc->sc_debug & (m)) \ 84 printf(fmt, __VA_ARGS__); \ 85} while (0) 86#else 87#define DPRINTF(sc, m, fmt, ...) do { \ 88 (void) sc; \ 89} while (0) 90#endif 91static int urtw_preamble_mode = URTW_PREAMBLE_MODE_LONG; 92SYSCTL_INT(_hw_usb_urtw, OID_AUTO, preamble_mode, CTLFLAG_RW, 93 &urtw_preamble_mode, 0, "set the preable mode (long or short)"); 94TUNABLE_INT("hw.usb.urtw.preamble_mode", &urtw_preamble_mode); 95 96/* recognized device vendors/products */ 97#define urtw_lookup(v, p) \ 98 ((const struct urtw_type *)usb_lookup(urtw_devs, v, p)) 99#define URTW_DEV_B(v,p) \ 100 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187B) } 101#define URTW_DEV_L(v,p) \ 102 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187L) } 103#define URTW_REV_RTL8187B 0 104#define URTW_REV_RTL8187L 1 105static const struct usb_device_id urtw_devs[] = { 106 URTW_DEV_B(NETGEAR, WG111V3), 107 URTW_DEV_B(REALTEK, RTL8187B_0), 108 URTW_DEV_B(REALTEK, RTL8187B_1), 109 URTW_DEV_B(REALTEK, RTL8187B_2), 110 URTW_DEV_B(SITECOMEU, WL168V4), 111 URTW_DEV_L(ASUS, P5B_WIFI), 112 URTW_DEV_L(BELKIN, F5D7050E), 113 URTW_DEV_L(LINKSYS4, WUSB54GCV2), 114 URTW_DEV_L(NETGEAR, WG111V2), 115 URTW_DEV_L(REALTEK, RTL8187), 116 URTW_DEV_L(SITECOMEU, WL168V1), 117 URTW_DEV_L(SURECOM, EP9001G2A), 118 { USB_VPI(0x1b75, 0x8187, URTW_REV_RTL8187L) }, 119 { USB_VPI(USB_VENDOR_DICKSMITH, 0x9401, URTW_REV_RTL8187L) }, 120 { USB_VPI(USB_VENDOR_HP, 0xca02, URTW_REV_RTL8187L) }, 121 { USB_VPI(USB_VENDOR_LOGITEC, 0x010c, URTW_REV_RTL8187L) }, 122 { USB_VPI(USB_VENDOR_NETGEAR, 0x6100, URTW_REV_RTL8187L) }, 123 { USB_VPI(USB_VENDOR_SPHAIRON, 0x0150, URTW_REV_RTL8187L) }, 124 { USB_VPI(USB_VENDOR_QCOM, 0x6232, URTW_REV_RTL8187L) }, 125#undef URTW_DEV_L 126#undef URTW_DEV_B 127}; 128 129#define urtw_read8_m(sc, val, data) do { \ 130 error = urtw_read8_c(sc, val, data); \ 131 if (error != 0) \ 132 goto fail; \ 133} while (0) 134#define urtw_write8_m(sc, val, data) do { \ 135 error = urtw_write8_c(sc, val, data); \ 136 if (error != 0) \ 137 goto fail; \ 138} while (0) 139#define urtw_read16_m(sc, val, data) do { \ 140 error = urtw_read16_c(sc, val, data); \ 141 if (error != 0) \ 142 goto fail; \ 143} while (0) 144#define urtw_write16_m(sc, val, data) do { \ 145 error = urtw_write16_c(sc, val, data); \ 146 if (error != 0) \ 147 goto fail; \ 148} while (0) 149#define urtw_read32_m(sc, val, data) do { \ 150 error = urtw_read32_c(sc, val, data); \ 151 if (error != 0) \ 152 goto fail; \ 153} while (0) 154#define urtw_write32_m(sc, val, data) do { \ 155 error = urtw_write32_c(sc, val, data); \ 156 if (error != 0) \ 157 goto fail; \ 158} while (0) 159#define urtw_8187_write_phy_ofdm(sc, val, data) do { \ 160 error = urtw_8187_write_phy_ofdm_c(sc, val, data); \ 161 if (error != 0) \ 162 goto fail; \ 163} while (0) 164#define urtw_8187_write_phy_cck(sc, val, data) do { \ 165 error = urtw_8187_write_phy_cck_c(sc, val, data); \ 166 if (error != 0) \ 167 goto fail; \ 168} while (0) 169#define urtw_8225_write(sc, val, data) do { \ 170 error = urtw_8225_write_c(sc, val, data); \ 171 if (error != 0) \ 172 goto fail; \ 173} while (0) 174 175struct urtw_pair { 176 uint32_t reg; 177 uint32_t val; 178}; 179 180static uint8_t urtw_8225_agc[] = { 181 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9c, 0x9b, 182 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 183 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 184 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 185 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 186 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 187 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 188 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 189 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 190 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 191 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 192 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 193}; 194 195static uint8_t urtw_8225z2_agc[] = { 196 0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57, 0x55, 0x53, 0x51, 197 0x4f, 0x4d, 0x4b, 0x49, 0x47, 0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 198 0x39, 0x37, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 0x25, 199 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x13, 0x11, 0x0f, 200 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 201 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x19, 0x19, 202 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x20, 0x21, 0x22, 0x23, 203 0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2a, 204 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 205 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x31, 0x31, 206 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 207 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31 208}; 209 210static uint32_t urtw_8225_channel[] = { 211 0x0000, /* dummy channel 0 */ 212 0x085c, /* 1 */ 213 0x08dc, /* 2 */ 214 0x095c, /* 3 */ 215 0x09dc, /* 4 */ 216 0x0a5c, /* 5 */ 217 0x0adc, /* 6 */ 218 0x0b5c, /* 7 */ 219 0x0bdc, /* 8 */ 220 0x0c5c, /* 9 */ 221 0x0cdc, /* 10 */ 222 0x0d5c, /* 11 */ 223 0x0ddc, /* 12 */ 224 0x0e5c, /* 13 */ 225 0x0f72, /* 14 */ 226}; 227 228static uint8_t urtw_8225_gain[] = { 229 0x23, 0x88, 0x7c, 0xa5, /* -82dbm */ 230 0x23, 0x88, 0x7c, 0xb5, /* -82dbm */ 231 0x23, 0x88, 0x7c, 0xc5, /* -82dbm */ 232 0x33, 0x80, 0x79, 0xc5, /* -78dbm */ 233 0x43, 0x78, 0x76, 0xc5, /* -74dbm */ 234 0x53, 0x60, 0x73, 0xc5, /* -70dbm */ 235 0x63, 0x58, 0x70, 0xc5, /* -66dbm */ 236}; 237 238static struct urtw_pair urtw_8225_rf_part1[] = { 239 { 0x00, 0x0067 }, { 0x01, 0x0fe0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 240 { 0x04, 0x0486 }, { 0x05, 0x0bc0 }, { 0x06, 0x0ae6 }, { 0x07, 0x082a }, 241 { 0x08, 0x001f }, { 0x09, 0x0334 }, { 0x0a, 0x0fd4 }, { 0x0b, 0x0391 }, 242 { 0x0c, 0x0050 }, { 0x0d, 0x06db }, { 0x0e, 0x0029 }, { 0x0f, 0x0914 }, 243}; 244 245static struct urtw_pair urtw_8225_rf_part2[] = { 246 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, 247 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, 248 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x09 }, { 0x0b, 0x80 }, 249 { 0x0c, 0x01 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, { 0x10, 0x84 }, 250 { 0x11, 0x06 }, { 0x12, 0x20 }, { 0x13, 0x20 }, { 0x14, 0x00 }, 251 { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, { 0x18, 0xef }, 252 { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x76 }, { 0x1c, 0x04 }, 253 { 0x1e, 0x95 }, { 0x1f, 0x75 }, { 0x20, 0x1f }, { 0x21, 0x27 }, 254 { 0x22, 0x16 }, { 0x24, 0x46 }, { 0x25, 0x20 }, { 0x26, 0x90 }, 255 { 0x27, 0x88 } 256}; 257 258static struct urtw_pair urtw_8225_rf_part3[] = { 259 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 }, 260 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x10, 0x9b }, 261 { 0x11, 0x88 }, { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, 262 { 0x1a, 0xa0 }, { 0x1b, 0x08 }, { 0x40, 0x86 }, { 0x41, 0x8d }, 263 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x1f }, { 0x45, 0x1e }, 264 { 0x46, 0x1a }, { 0x47, 0x15 }, { 0x48, 0x10 }, { 0x49, 0x0a }, 265 { 0x4a, 0x05 }, { 0x4b, 0x02 }, { 0x4c, 0x05 } 266}; 267 268static uint16_t urtw_8225_rxgain[] = { 269 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 270 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 271 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 272 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 273 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 274 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 275 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 276 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 277 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 278 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 279 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3, 280 0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb 281}; 282 283static uint8_t urtw_8225_threshold[] = { 284 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd, 285}; 286 287static uint8_t urtw_8225_tx_gain_cck_ofdm[] = { 288 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e 289}; 290 291static uint8_t urtw_8225_txpwr_cck[] = { 292 0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02, 293 0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02, 294 0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02, 295 0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02, 296 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03, 297 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03 298}; 299 300static uint8_t urtw_8225_txpwr_cck_ch14[] = { 301 0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00, 302 0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00, 303 0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00, 304 0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00, 305 0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 306 0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00 307}; 308 309static uint8_t urtw_8225_txpwr_ofdm[]={ 310 0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4 311}; 312 313static uint8_t urtw_8225v2_gain_bg[]={ 314 0x23, 0x15, 0xa5, /* -82-1dbm */ 315 0x23, 0x15, 0xb5, /* -82-2dbm */ 316 0x23, 0x15, 0xc5, /* -82-3dbm */ 317 0x33, 0x15, 0xc5, /* -78dbm */ 318 0x43, 0x15, 0xc5, /* -74dbm */ 319 0x53, 0x15, 0xc5, /* -70dbm */ 320 0x63, 0x15, 0xc5, /* -66dbm */ 321}; 322 323static struct urtw_pair urtw_8225v2_rf_part1[] = { 324 { 0x00, 0x02bf }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 325 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, 326 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, 327 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } 328}; 329 330static struct urtw_pair urtw_8225v2b_rf_part0[] = { 331 { 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 332 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, 333 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, 334 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } 335}; 336 337static struct urtw_pair urtw_8225v2b_rf_part1[] = { 338 {0x0f0, 0x32}, {0x0f1, 0x32}, {0x0f2, 0x00}, 339 {0x0f3, 0x00}, {0x0f4, 0x32}, {0x0f5, 0x43}, 340 {0x0f6, 0x00}, {0x0f7, 0x00}, {0x0f8, 0x46}, 341 {0x0f9, 0xa4}, {0x0fa, 0x00}, {0x0fb, 0x00}, 342 {0x0fc, 0x96}, {0x0fd, 0xa4}, {0x0fe, 0x00}, 343 {0x0ff, 0x00}, {0x158, 0x4b}, {0x159, 0x00}, 344 {0x15a, 0x4b}, {0x15b, 0x00}, {0x160, 0x4b}, 345 {0x161, 0x09}, {0x162, 0x4b}, {0x163, 0x09}, 346 {0x1ce, 0x0f}, {0x1cf, 0x00}, {0x1e0, 0xff}, 347 {0x1e1, 0x0f}, {0x1e2, 0x00}, {0x1f0, 0x4e}, 348 {0x1f1, 0x01}, {0x1f2, 0x02}, {0x1f3, 0x03}, 349 {0x1f4, 0x04}, {0x1f5, 0x05}, {0x1f6, 0x06}, 350 {0x1f7, 0x07}, {0x1f8, 0x08}, {0x24e, 0x00}, 351 {0x20c, 0x04}, {0x221, 0x61}, {0x222, 0x68}, 352 {0x223, 0x6f}, {0x224, 0x76}, {0x225, 0x7d}, 353 {0x226, 0x84}, {0x227, 0x8d}, {0x24d, 0x08}, 354 {0x250, 0x05}, {0x251, 0xf5}, {0x252, 0x04}, 355 {0x253, 0xa0}, {0x254, 0x1f}, {0x255, 0x23}, 356 {0x256, 0x45}, {0x257, 0x67}, {0x258, 0x08}, 357 {0x259, 0x08}, {0x25a, 0x08}, {0x25b, 0x08}, 358 {0x260, 0x08}, {0x261, 0x08}, {0x262, 0x08}, 359 {0x263, 0x08}, {0x264, 0xcf}, {0x272, 0x56}, 360 {0x273, 0x9a}, {0x034, 0xf0}, {0x035, 0x0f}, 361 {0x05b, 0x40}, {0x084, 0x88}, {0x085, 0x24}, 362 {0x088, 0x54}, {0x08b, 0xb8}, {0x08c, 0x07}, 363 {0x08d, 0x00}, {0x094, 0x1b}, {0x095, 0x12}, 364 {0x096, 0x00}, {0x097, 0x06}, {0x09d, 0x1a}, 365 {0x09f, 0x10}, {0x0b4, 0x22}, {0x0be, 0x80}, 366 {0x0db, 0x00}, {0x0ee, 0x00}, {0x091, 0x03}, 367 {0x24c, 0x00}, {0x39f, 0x00}, {0x08c, 0x01}, 368 {0x08d, 0x10}, {0x08e, 0x08}, {0x08f, 0x00} 369}; 370 371static struct urtw_pair urtw_8225v2_rf_part2[] = { 372 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, 373 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, 374 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x08 }, { 0x0b, 0x80 }, 375 { 0x0c, 0x01 }, { 0x0d, 0x43 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, 376 { 0x10, 0x84 }, { 0x11, 0x07 }, { 0x12, 0x20 }, { 0x13, 0x20 }, 377 { 0x14, 0x00 }, { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, 378 { 0x18, 0xef }, { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x15 }, 379 { 0x1c, 0x04 }, { 0x1d, 0xc5 }, { 0x1e, 0x95 }, { 0x1f, 0x75 }, 380 { 0x20, 0x1f }, { 0x21, 0x17 }, { 0x22, 0x16 }, { 0x23, 0x80 }, 381 { 0x24, 0x46 }, { 0x25, 0x00 }, { 0x26, 0x90 }, { 0x27, 0x88 } 382}; 383 384static struct urtw_pair urtw_8225v2b_rf_part2[] = { 385 { 0x00, 0x10 }, { 0x01, 0x0d }, { 0x02, 0x01 }, { 0x03, 0x00 }, 386 { 0x04, 0x14 }, { 0x05, 0xfb }, { 0x06, 0xfb }, { 0x07, 0x60 }, 387 { 0x08, 0x00 }, { 0x09, 0x60 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, 388 { 0x0c, 0x00 }, { 0x0d, 0x5c }, { 0x0e, 0x00 }, { 0x0f, 0x00 }, 389 { 0x10, 0x40 }, { 0x11, 0x00 }, { 0x12, 0x40 }, { 0x13, 0x00 }, 390 { 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0xa8 }, { 0x17, 0x26 }, 391 { 0x18, 0x32 }, { 0x19, 0x33 }, { 0x1a, 0x07 }, { 0x1b, 0xa5 }, 392 { 0x1c, 0x6f }, { 0x1d, 0x55 }, { 0x1e, 0xc8 }, { 0x1f, 0xb3 }, 393 { 0x20, 0x0a }, { 0x21, 0xe1 }, { 0x22, 0x2C }, { 0x23, 0x8a }, 394 { 0x24, 0x86 }, { 0x25, 0x83 }, { 0x26, 0x34 }, { 0x27, 0x0f }, 395 { 0x28, 0x4f }, { 0x29, 0x24 }, { 0x2a, 0x6f }, { 0x2b, 0xc2 }, 396 { 0x2c, 0x6b }, { 0x2d, 0x40 }, { 0x2e, 0x80 }, { 0x2f, 0x00 }, 397 { 0x30, 0xc0 }, { 0x31, 0xc1 }, { 0x32, 0x58 }, { 0x33, 0xf1 }, 398 { 0x34, 0x00 }, { 0x35, 0xe4 }, { 0x36, 0x90 }, { 0x37, 0x3e }, 399 { 0x38, 0x6d }, { 0x39, 0x3c }, { 0x3a, 0xfb }, { 0x3b, 0x07 } 400}; 401 402static struct urtw_pair urtw_8225v2_rf_part3[] = { 403 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 }, 404 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x09, 0x11 }, 405 { 0x0a, 0x17 }, { 0x0b, 0x11 }, { 0x10, 0x9b }, { 0x11, 0x88 }, 406 { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, { 0x1a, 0xa0 }, 407 { 0x1b, 0x08 }, { 0x1d, 0x00 }, { 0x40, 0x86 }, { 0x41, 0x9d }, 408 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x36 }, { 0x45, 0x35 }, 409 { 0x46, 0x2e }, { 0x47, 0x25 }, { 0x48, 0x1c }, { 0x49, 0x12 }, 410 { 0x4a, 0x09 }, { 0x4b, 0x04 }, { 0x4c, 0x05 } 411}; 412 413static uint16_t urtw_8225v2_rxgain[] = { 414 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, 415 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, 416 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, 417 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, 418 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, 419 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, 420 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, 421 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, 422 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 423 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, 424 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 425 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb 426}; 427 428static uint16_t urtw_8225v2b_rxgain[] = { 429 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 430 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 431 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 432 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 433 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 434 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 435 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 436 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 437 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 438 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 439 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 440 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb 441}; 442 443static uint8_t urtw_8225v2_tx_gain_cck_ofdm[] = { 444 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 445 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 446 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 447 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 448 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 449 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 450}; 451 452static uint8_t urtw_8225v2_txpwr_cck[] = { 453 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04 454}; 455 456static uint8_t urtw_8225v2_txpwr_cck_ch14[] = { 457 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00 458}; 459 460static uint8_t urtw_8225v2b_txpwr_cck[] = { 461 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04, 462 0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03, 463 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03, 464 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03 465}; 466 467static uint8_t urtw_8225v2b_txpwr_cck_ch14[] = { 468 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00, 469 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 470 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 471 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00 472}; 473 474static struct urtw_pair urtw_ratetable[] = { 475 { 2, 0 }, { 4, 1 }, { 11, 2 }, { 12, 4 }, { 18, 5 }, 476 { 22, 3 }, { 24, 6 }, { 36, 7 }, { 48, 8 }, { 72, 9 }, 477 { 96, 10 }, { 108, 11 } 478}; 479 480static const uint8_t urtw_8187b_reg_table[][3] = { 481 { 0xf0, 0x32, 0 }, { 0xf1, 0x32, 0 }, { 0xf2, 0x00, 0 }, 482 { 0xf3, 0x00, 0 }, { 0xf4, 0x32, 0 }, { 0xf5, 0x43, 0 }, 483 { 0xf6, 0x00, 0 }, { 0xf7, 0x00, 0 }, { 0xf8, 0x46, 0 }, 484 { 0xf9, 0xa4, 0 }, { 0xfa, 0x00, 0 }, { 0xfb, 0x00, 0 }, 485 { 0xfc, 0x96, 0 }, { 0xfd, 0xa4, 0 }, { 0xfe, 0x00, 0 }, 486 { 0xff, 0x00, 0 }, { 0x58, 0x4b, 1 }, { 0x59, 0x00, 1 }, 487 { 0x5a, 0x4b, 1 }, { 0x5b, 0x00, 1 }, { 0x60, 0x4b, 1 }, 488 { 0x61, 0x09, 1 }, { 0x62, 0x4b, 1 }, { 0x63, 0x09, 1 }, 489 { 0xce, 0x0f, 1 }, { 0xcf, 0x00, 1 }, { 0xe0, 0xff, 1 }, 490 { 0xe1, 0x0f, 1 }, { 0xe2, 0x00, 1 }, { 0xf0, 0x4e, 1 }, 491 { 0xf1, 0x01, 1 }, { 0xf2, 0x02, 1 }, { 0xf3, 0x03, 1 }, 492 { 0xf4, 0x04, 1 }, { 0xf5, 0x05, 1 }, { 0xf6, 0x06, 1 }, 493 { 0xf7, 0x07, 1 }, { 0xf8, 0x08, 1 }, { 0x4e, 0x00, 2 }, 494 { 0x0c, 0x04, 2 }, { 0x21, 0x61, 2 }, { 0x22, 0x68, 2 }, 495 { 0x23, 0x6f, 2 }, { 0x24, 0x76, 2 }, { 0x25, 0x7d, 2 }, 496 { 0x26, 0x84, 2 }, { 0x27, 0x8d, 2 }, { 0x4d, 0x08, 2 }, 497 { 0x50, 0x05, 2 }, { 0x51, 0xf5, 2 }, { 0x52, 0x04, 2 }, 498 { 0x53, 0xa0, 2 }, { 0x54, 0x1f, 2 }, { 0x55, 0x23, 2 }, 499 { 0x56, 0x45, 2 }, { 0x57, 0x67, 2 }, { 0x58, 0x08, 2 }, 500 { 0x59, 0x08, 2 }, { 0x5a, 0x08, 2 }, { 0x5b, 0x08, 2 }, 501 { 0x60, 0x08, 2 }, { 0x61, 0x08, 2 }, { 0x62, 0x08, 2 }, 502 { 0x63, 0x08, 2 }, { 0x64, 0xcf, 2 }, { 0x72, 0x56, 2 }, 503 { 0x73, 0x9a, 2 }, { 0x34, 0xf0, 0 }, { 0x35, 0x0f, 0 }, 504 { 0x5b, 0x40, 0 }, { 0x84, 0x88, 0 }, { 0x85, 0x24, 0 }, 505 { 0x88, 0x54, 0 }, { 0x8b, 0xb8, 0 }, { 0x8c, 0x07, 0 }, 506 { 0x8d, 0x00, 0 }, { 0x94, 0x1b, 0 }, { 0x95, 0x12, 0 }, 507 { 0x96, 0x00, 0 }, { 0x97, 0x06, 0 }, { 0x9d, 0x1a, 0 }, 508 { 0x9f, 0x10, 0 }, { 0xb4, 0x22, 0 }, { 0xbe, 0x80, 0 }, 509 { 0xdb, 0x00, 0 }, { 0xee, 0x00, 0 }, { 0x91, 0x03, 0 }, 510 { 0x4c, 0x00, 2 }, { 0x9f, 0x00, 3 }, { 0x8c, 0x01, 0 }, 511 { 0x8d, 0x10, 0 }, { 0x8e, 0x08, 0 }, { 0x8f, 0x00, 0 } 512}; 513 514static usb_callback_t urtw_bulk_rx_callback; 515static usb_callback_t urtw_bulk_tx_callback; 516static usb_callback_t urtw_bulk_tx_status_callback; 517 518static const struct usb_config urtw_8187b_usbconfig[URTW_8187B_N_XFERS] = { 519 [URTW_8187B_BULK_RX] = { 520 .type = UE_BULK, 521 .endpoint = 0x83, 522 .direction = UE_DIR_IN, 523 .bufsize = MCLBYTES, 524 .flags = { 525 .ext_buffer = 1, 526 .pipe_bof = 1, 527 .short_xfer_ok = 1 528 }, 529 .callback = urtw_bulk_rx_callback 530 }, 531 [URTW_8187B_BULK_TX_STATUS] = { 532 .type = UE_BULK, 533 .endpoint = 0x89, 534 .direction = UE_DIR_IN, 535 .bufsize = MCLBYTES, 536 .flags = { 537 .ext_buffer = 1, 538 .pipe_bof = 1, 539 .short_xfer_ok = 1 540 }, 541 .callback = urtw_bulk_tx_status_callback 542 }, 543 [URTW_8187B_BULK_TX_BE] = { 544 .type = UE_BULK, 545 .endpoint = URTW_8187B_TXPIPE_BE, 546 .direction = UE_DIR_OUT, 547 .bufsize = URTW_TX_MAXSIZE, 548 .flags = { 549 .ext_buffer = 1, 550 .force_short_xfer = 1, 551 .pipe_bof = 1, 552 }, 553 .callback = urtw_bulk_tx_callback, 554 .timeout = URTW_DATA_TIMEOUT 555 }, 556 [URTW_8187B_BULK_TX_BK] = { 557 .type = UE_BULK, 558 .endpoint = URTW_8187B_TXPIPE_BK, 559 .direction = UE_DIR_OUT, 560 .bufsize = URTW_TX_MAXSIZE, 561 .flags = { 562 .ext_buffer = 1, 563 .force_short_xfer = 1, 564 .pipe_bof = 1, 565 }, 566 .callback = urtw_bulk_tx_callback, 567 .timeout = URTW_DATA_TIMEOUT 568 }, 569 [URTW_8187B_BULK_TX_VI] = { 570 .type = UE_BULK, 571 .endpoint = URTW_8187B_TXPIPE_VI, 572 .direction = UE_DIR_OUT, 573 .bufsize = URTW_TX_MAXSIZE, 574 .flags = { 575 .ext_buffer = 1, 576 .force_short_xfer = 1, 577 .pipe_bof = 1, 578 }, 579 .callback = urtw_bulk_tx_callback, 580 .timeout = URTW_DATA_TIMEOUT 581 }, 582 [URTW_8187B_BULK_TX_VO] = { 583 .type = UE_BULK, 584 .endpoint = URTW_8187B_TXPIPE_VO, 585 .direction = UE_DIR_OUT, 586 .bufsize = URTW_TX_MAXSIZE, 587 .flags = { 588 .ext_buffer = 1, 589 .force_short_xfer = 1, 590 .pipe_bof = 1, 591 }, 592 .callback = urtw_bulk_tx_callback, 593 .timeout = URTW_DATA_TIMEOUT 594 }, 595 [URTW_8187B_BULK_TX_EP12] = { 596 .type = UE_BULK, 597 .endpoint = 0xc, 598 .direction = UE_DIR_OUT, 599 .bufsize = URTW_TX_MAXSIZE, 600 .flags = { 601 .ext_buffer = 1, 602 .force_short_xfer = 1, 603 .pipe_bof = 1, 604 }, 605 .callback = urtw_bulk_tx_callback, 606 .timeout = URTW_DATA_TIMEOUT 607 } 608}; 609 610static const struct usb_config urtw_8187l_usbconfig[URTW_8187L_N_XFERS] = { 611 [URTW_8187L_BULK_RX] = { 612 .type = UE_BULK, 613 .endpoint = 0x81, 614 .direction = UE_DIR_IN, 615 .bufsize = MCLBYTES, 616 .flags = { 617 .ext_buffer = 1, 618 .pipe_bof = 1, 619 .short_xfer_ok = 1 620 }, 621 .callback = urtw_bulk_rx_callback 622 }, 623 [URTW_8187L_BULK_TX_LOW] = { 624 .type = UE_BULK, 625 .endpoint = 0x2, 626 .direction = UE_DIR_OUT, 627 .bufsize = URTW_TX_MAXSIZE, 628 .flags = { 629 .ext_buffer = 1, 630 .force_short_xfer = 1, 631 .pipe_bof = 1, 632 }, 633 .callback = urtw_bulk_tx_callback, 634 .timeout = URTW_DATA_TIMEOUT 635 }, 636 [URTW_8187L_BULK_TX_NORMAL] = { 637 .type = UE_BULK, 638 .endpoint = 0x3, 639 .direction = UE_DIR_OUT, 640 .bufsize = URTW_TX_MAXSIZE, 641 .flags = { 642 .ext_buffer = 1, 643 .force_short_xfer = 1, 644 .pipe_bof = 1, 645 }, 646 .callback = urtw_bulk_tx_callback, 647 .timeout = URTW_DATA_TIMEOUT 648 }, 649}; 650 651static struct ieee80211vap *urtw_vap_create(struct ieee80211com *, 652 const char name[IFNAMSIZ], int unit, int opmode, 653 int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], 654 const uint8_t mac[IEEE80211_ADDR_LEN]); 655static void urtw_vap_delete(struct ieee80211vap *); 656static void urtw_init(void *); 657static void urtw_stop(struct ifnet *, int); 658static void urtw_stop_locked(struct ifnet *, int); 659static int urtw_ioctl(struct ifnet *, u_long, caddr_t); 660static void urtw_start(struct ifnet *); 661static int urtw_alloc_rx_data_list(struct urtw_softc *); 662static int urtw_alloc_tx_data_list(struct urtw_softc *); 663static int urtw_raw_xmit(struct ieee80211_node *, struct mbuf *, 664 const struct ieee80211_bpf_params *); 665static void urtw_scan_start(struct ieee80211com *); 666static void urtw_scan_end(struct ieee80211com *); 667static void urtw_set_channel(struct ieee80211com *); 668static void urtw_update_mcast(struct ifnet *); 669static int urtw_tx_start(struct urtw_softc *, 670 struct ieee80211_node *, struct mbuf *, 671 struct urtw_data *, int); 672static int urtw_newstate(struct ieee80211vap *, 673 enum ieee80211_state, int); 674static void urtw_led_ch(void *); 675static void urtw_ledtask(void *, int); 676static void urtw_watchdog(void *); 677static void urtw_set_multi(void *); 678static int urtw_isbmode(uint16_t); 679static uint16_t urtw_rate2rtl(int); 680static uint16_t urtw_rtl2rate(int); 681static usb_error_t urtw_set_rate(struct urtw_softc *); 682static usb_error_t urtw_update_msr(struct urtw_softc *); 683static usb_error_t urtw_read8_c(struct urtw_softc *, int, uint8_t *); 684static usb_error_t urtw_read16_c(struct urtw_softc *, int, uint16_t *); 685static usb_error_t urtw_read32_c(struct urtw_softc *, int, uint32_t *); 686static usb_error_t urtw_write8_c(struct urtw_softc *, int, uint8_t); 687static usb_error_t urtw_write16_c(struct urtw_softc *, int, uint16_t); 688static usb_error_t urtw_write32_c(struct urtw_softc *, int, uint32_t); 689static usb_error_t urtw_eprom_cs(struct urtw_softc *, int); 690static usb_error_t urtw_eprom_ck(struct urtw_softc *); 691static usb_error_t urtw_eprom_sendbits(struct urtw_softc *, int16_t *, 692 int); 693static usb_error_t urtw_eprom_read32(struct urtw_softc *, uint32_t, 694 uint32_t *); 695static usb_error_t urtw_eprom_readbit(struct urtw_softc *, int16_t *); 696static usb_error_t urtw_eprom_writebit(struct urtw_softc *, int16_t); 697static usb_error_t urtw_get_macaddr(struct urtw_softc *); 698static usb_error_t urtw_get_txpwr(struct urtw_softc *); 699static usb_error_t urtw_get_rfchip(struct urtw_softc *); 700static usb_error_t urtw_led_init(struct urtw_softc *); 701static usb_error_t urtw_8185_rf_pins_enable(struct urtw_softc *); 702static usb_error_t urtw_8185_tx_antenna(struct urtw_softc *, uint8_t); 703static usb_error_t urtw_8187_write_phy(struct urtw_softc *, uint8_t, 704 uint32_t); 705static usb_error_t urtw_8187_write_phy_ofdm_c(struct urtw_softc *, 706 uint8_t, uint32_t); 707static usb_error_t urtw_8187_write_phy_cck_c(struct urtw_softc *, uint8_t, 708 uint32_t); 709static usb_error_t urtw_8225_setgain(struct urtw_softc *, int16_t); 710static usb_error_t urtw_8225_usb_init(struct urtw_softc *); 711static usb_error_t urtw_8225_write_c(struct urtw_softc *, uint8_t, 712 uint16_t); 713static usb_error_t urtw_8225_write_s16(struct urtw_softc *, uint8_t, int, 714 uint16_t *); 715static usb_error_t urtw_8225_read(struct urtw_softc *, uint8_t, 716 uint32_t *); 717static usb_error_t urtw_8225_rf_init(struct urtw_softc *); 718static usb_error_t urtw_8225_rf_set_chan(struct urtw_softc *, int); 719static usb_error_t urtw_8225_rf_set_sens(struct urtw_softc *, int); 720static usb_error_t urtw_8225_set_txpwrlvl(struct urtw_softc *, int); 721static usb_error_t urtw_8225_rf_stop(struct urtw_softc *); 722static usb_error_t urtw_8225v2_rf_init(struct urtw_softc *); 723static usb_error_t urtw_8225v2_rf_set_chan(struct urtw_softc *, int); 724static usb_error_t urtw_8225v2_set_txpwrlvl(struct urtw_softc *, int); 725static usb_error_t urtw_8225v2_setgain(struct urtw_softc *, int16_t); 726static usb_error_t urtw_8225_isv2(struct urtw_softc *, int *); 727static usb_error_t urtw_8225v2b_rf_init(struct urtw_softc *); 728static usb_error_t urtw_8225v2b_rf_set_chan(struct urtw_softc *, int); 729static usb_error_t urtw_read8e(struct urtw_softc *, int, uint8_t *); 730static usb_error_t urtw_write8e(struct urtw_softc *, int, uint8_t); 731static usb_error_t urtw_8180_set_anaparam(struct urtw_softc *, uint32_t); 732static usb_error_t urtw_8185_set_anaparam2(struct urtw_softc *, uint32_t); 733static usb_error_t urtw_intr_enable(struct urtw_softc *); 734static usb_error_t urtw_intr_disable(struct urtw_softc *); 735static usb_error_t urtw_reset(struct urtw_softc *); 736static usb_error_t urtw_led_on(struct urtw_softc *, int); 737static usb_error_t urtw_led_ctl(struct urtw_softc *, int); 738static usb_error_t urtw_led_blink(struct urtw_softc *); 739static usb_error_t urtw_led_mode0(struct urtw_softc *, int); 740static usb_error_t urtw_led_mode1(struct urtw_softc *, int); 741static usb_error_t urtw_led_mode2(struct urtw_softc *, int); 742static usb_error_t urtw_led_mode3(struct urtw_softc *, int); 743static usb_error_t urtw_rx_setconf(struct urtw_softc *); 744static usb_error_t urtw_rx_enable(struct urtw_softc *); 745static usb_error_t urtw_tx_enable(struct urtw_softc *sc); 746static void urtw_free_tx_data_list(struct urtw_softc *); 747static void urtw_free_rx_data_list(struct urtw_softc *); 748static void urtw_free_data_list(struct urtw_softc *, 749 struct urtw_data data[], int, int); 750static usb_error_t urtw_adapter_start(struct urtw_softc *); 751static usb_error_t urtw_adapter_start_b(struct urtw_softc *); 752static usb_error_t urtw_set_mode(struct urtw_softc *, uint32_t); 753static usb_error_t urtw_8187b_cmd_reset(struct urtw_softc *); 754static usb_error_t urtw_do_request(struct urtw_softc *, 755 struct usb_device_request *, void *); 756static usb_error_t urtw_8225v2b_set_txpwrlvl(struct urtw_softc *, int); 757static usb_error_t urtw_led_off(struct urtw_softc *, int); 758static void urtw_abort_xfers(struct urtw_softc *); 759static struct urtw_data * 760 urtw_getbuf(struct urtw_softc *sc); 761static int urtw_compute_txtime(uint16_t, uint16_t, uint8_t, 762 uint8_t); 763static void urtw_updateslot(struct ifnet *); 764static void urtw_updateslottask(void *, int); 765static void urtw_sysctl_node(struct urtw_softc *); 766 767static int 768urtw_match(device_t dev) 769{ 770 struct usb_attach_arg *uaa = device_get_ivars(dev); 771 772 if (uaa->usb_mode != USB_MODE_HOST) 773 return (ENXIO); 774 if (uaa->info.bConfigIndex != URTW_CONFIG_INDEX) 775 return (ENXIO); 776 if (uaa->info.bIfaceIndex != URTW_IFACE_INDEX) 777 return (ENXIO); 778 779 return (usbd_lookup_id_by_uaa(urtw_devs, sizeof(urtw_devs), uaa)); 780} 781 782static int 783urtw_attach(device_t dev) 784{ 785 const struct usb_config *setup_start; 786 int ret = ENXIO; 787 struct urtw_softc *sc = device_get_softc(dev); 788 struct usb_attach_arg *uaa = device_get_ivars(dev); 789 struct ieee80211com *ic; 790 struct ifnet *ifp; 791 uint8_t bands, iface_index = URTW_IFACE_INDEX; /* XXX */ 792 uint16_t n_setup; 793 uint32_t data; 794 usb_error_t error; 795 796 device_set_usb_desc(dev); 797 798 sc->sc_dev = dev; 799 sc->sc_udev = uaa->device; 800 if (USB_GET_DRIVER_INFO(uaa) == URTW_REV_RTL8187B) 801 sc->sc_flags |= URTW_RTL8187B; 802#ifdef URTW_DEBUG 803 sc->sc_debug = urtw_debug; 804#endif 805 806 mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), MTX_NETWORK_LOCK, 807 MTX_DEF); 808 usb_callout_init_mtx(&sc->sc_led_ch, &sc->sc_mtx, 0); 809 TASK_INIT(&sc->sc_led_task, 0, urtw_ledtask, sc); 810 TASK_INIT(&sc->sc_updateslot_task, 0, urtw_updateslottask, sc); 811 callout_init(&sc->sc_watchdog_ch, 0); 812 813 if (sc->sc_flags & URTW_RTL8187B) { 814 setup_start = urtw_8187b_usbconfig; 815 n_setup = URTW_8187B_N_XFERS; 816 } else { 817 setup_start = urtw_8187l_usbconfig; 818 n_setup = URTW_8187L_N_XFERS; 819 } 820 821 error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, 822 setup_start, n_setup, sc, &sc->sc_mtx); 823 if (error) { 824 device_printf(dev, "could not allocate USB transfers, " 825 "err=%s\n", usbd_errstr(error)); 826 ret = ENXIO; 827 goto fail0; 828 } 829 830 URTW_LOCK(sc); 831 832 urtw_read32_m(sc, URTW_RX, &data); 833 sc->sc_epromtype = (data & URTW_RX_9356SEL) ? URTW_EEPROM_93C56 : 834 URTW_EEPROM_93C46; 835 836 error = urtw_get_rfchip(sc); 837 if (error != 0) 838 goto fail; 839 error = urtw_get_macaddr(sc); 840 if (error != 0) 841 goto fail; 842 error = urtw_get_txpwr(sc); 843 if (error != 0) 844 goto fail; 845 error = urtw_led_init(sc); 846 if (error != 0) 847 goto fail; 848 849 URTW_UNLOCK(sc); 850 851 sc->sc_rts_retry = URTW_DEFAULT_RTS_RETRY; 852 sc->sc_tx_retry = URTW_DEFAULT_TX_RETRY; 853 sc->sc_currate = 3; 854 sc->sc_preamble_mode = urtw_preamble_mode; 855 856 ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); 857 if (ifp == NULL) { 858 device_printf(sc->sc_dev, "can not allocate ifnet\n"); 859 ret = ENOMEM; 860 goto fail1; 861 } 862 863 ifp->if_softc = sc; 864 if_initname(ifp, "urtw", device_get_unit(sc->sc_dev)); 865 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 866 ifp->if_init = urtw_init; 867 ifp->if_ioctl = urtw_ioctl; 868 ifp->if_start = urtw_start; 869 /* XXX URTW_TX_DATA_LIST_COUNT */ 870 IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); 871 ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; 872 IFQ_SET_READY(&ifp->if_snd); 873 874 ic = ifp->if_l2com; 875 ic->ic_ifp = ifp; 876 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ 877 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ 878 879 /* set device capabilities */ 880 ic->ic_caps = 881 IEEE80211_C_STA | /* station mode */ 882 IEEE80211_C_MONITOR | /* monitor mode supported */ 883 IEEE80211_C_TXPMGT | /* tx power management */ 884 IEEE80211_C_SHPREAMBLE | /* short preamble supported */ 885 IEEE80211_C_SHSLOT | /* short slot time supported */ 886 IEEE80211_C_BGSCAN | /* capable of bg scanning */ 887 IEEE80211_C_WPA; /* 802.11i */ 888 889 bands = 0; 890 setbit(&bands, IEEE80211_MODE_11B); 891 setbit(&bands, IEEE80211_MODE_11G); 892 ieee80211_init_channels(ic, NULL, &bands); 893 894 ieee80211_ifattach(ic, sc->sc_bssid); 895 ic->ic_raw_xmit = urtw_raw_xmit; 896 ic->ic_scan_start = urtw_scan_start; 897 ic->ic_scan_end = urtw_scan_end; 898 ic->ic_set_channel = urtw_set_channel; 899 ic->ic_updateslot = urtw_updateslot; 900 ic->ic_vap_create = urtw_vap_create; 901 ic->ic_vap_delete = urtw_vap_delete; 902 ic->ic_update_mcast = urtw_update_mcast; 903 904 ieee80211_radiotap_attach(ic, 905 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), 906 URTW_TX_RADIOTAP_PRESENT, 907 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), 908 URTW_RX_RADIOTAP_PRESENT); 909 910 urtw_sysctl_node(sc); 911 912 if (bootverbose) 913 ieee80211_announce(ic); 914 return (0); 915 916fail: URTW_UNLOCK(sc); 917fail1: usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ? 918 URTW_8187B_N_XFERS : URTW_8187L_N_XFERS); 919fail0: 920 return (ret); 921} 922 923static int 924urtw_detach(device_t dev) 925{ 926 struct urtw_softc *sc = device_get_softc(dev); 927 struct ifnet *ifp = sc->sc_ifp; 928 struct ieee80211com *ic = ifp->if_l2com; 929 930 if (!device_is_attached(dev)) 931 return (0); 932 933 urtw_stop(ifp, 1); 934 ieee80211_draintask(ic, &sc->sc_updateslot_task); 935 ieee80211_draintask(ic, &sc->sc_led_task); 936 937 usb_callout_drain(&sc->sc_led_ch); 938 callout_drain(&sc->sc_watchdog_ch); 939 940 usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ? 941 URTW_8187B_N_XFERS : URTW_8187L_N_XFERS); 942 ieee80211_ifdetach(ic); 943 944 urtw_free_tx_data_list(sc); 945 urtw_free_rx_data_list(sc); 946 947 if_free(ifp); 948 mtx_destroy(&sc->sc_mtx); 949 950 return (0); 951} 952 953static void 954urtw_free_tx_data_list(struct urtw_softc *sc) 955{ 956 957 urtw_free_data_list(sc, sc->sc_tx, URTW_TX_DATA_LIST_COUNT, 0); 958} 959 960static void 961urtw_free_rx_data_list(struct urtw_softc *sc) 962{ 963 964 urtw_free_data_list(sc, sc->sc_rx, URTW_RX_DATA_LIST_COUNT, 1); 965} 966 967static void 968urtw_free_data_list(struct urtw_softc *sc, struct urtw_data data[], int ndata, 969 int fillmbuf) 970{ 971 int i; 972 973 for (i = 0; i < ndata; i++) { 974 struct urtw_data *dp = &data[i]; 975 976 if (fillmbuf == 1) { 977 if (dp->m != NULL) { 978 m_freem(dp->m); 979 dp->m = NULL; 980 dp->buf = NULL; 981 } 982 } else { 983 if (dp->buf != NULL) { 984 free(dp->buf, M_USBDEV); 985 dp->buf = NULL; 986 } 987 } 988 if (dp->ni != NULL) { 989 ieee80211_free_node(dp->ni); 990 dp->ni = NULL; 991 } 992 } 993} 994 995static struct ieee80211vap * 996urtw_vap_create(struct ieee80211com *ic, 997 const char name[IFNAMSIZ], int unit, int opmode, int flags, 998 const uint8_t bssid[IEEE80211_ADDR_LEN], 999 const uint8_t mac[IEEE80211_ADDR_LEN]) 1000{ 1001 struct urtw_vap *uvp; 1002 struct ieee80211vap *vap; 1003 1004 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ 1005 return (NULL); 1006 uvp = (struct urtw_vap *) malloc(sizeof(struct urtw_vap), 1007 M_80211_VAP, M_NOWAIT | M_ZERO); 1008 if (uvp == NULL) 1009 return (NULL); 1010 vap = &uvp->vap; 1011 /* enable s/w bmiss handling for sta mode */ 1012 ieee80211_vap_setup(ic, vap, name, unit, opmode, 1013 flags | IEEE80211_CLONE_NOBEACONS, bssid, mac); 1014 1015 /* override state transition machine */ 1016 uvp->newstate = vap->iv_newstate; 1017 vap->iv_newstate = urtw_newstate; 1018 1019 /* complete setup */ 1020 ieee80211_vap_attach(vap, ieee80211_media_change, 1021 ieee80211_media_status); 1022 ic->ic_opmode = opmode; 1023 return (vap); 1024} 1025 1026static void 1027urtw_vap_delete(struct ieee80211vap *vap) 1028{ 1029 struct urtw_vap *uvp = URTW_VAP(vap); 1030 1031 ieee80211_vap_detach(vap); 1032 free(uvp, M_80211_VAP); 1033} 1034 1035static void 1036urtw_init_locked(void *arg) 1037{ 1038 int ret; 1039 struct urtw_softc *sc = arg; 1040 struct ifnet *ifp = sc->sc_ifp; 1041 usb_error_t error; 1042 1043 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1044 urtw_stop_locked(ifp, 0); 1045 1046 error = (sc->sc_flags & URTW_RTL8187B) ? urtw_adapter_start_b(sc) : 1047 urtw_adapter_start(sc); 1048 if (error != 0) 1049 goto fail; 1050 1051 /* reset softc variables */ 1052 sc->sc_txtimer = 0; 1053 1054 if (!(sc->sc_flags & URTW_INIT_ONCE)) { 1055 ret = urtw_alloc_rx_data_list(sc); 1056 if (error != 0) 1057 goto fail; 1058 ret = urtw_alloc_tx_data_list(sc); 1059 if (error != 0) 1060 goto fail; 1061 sc->sc_flags |= URTW_INIT_ONCE; 1062 } 1063 1064 error = urtw_rx_enable(sc); 1065 if (error != 0) 1066 goto fail; 1067 error = urtw_tx_enable(sc); 1068 if (error != 0) 1069 goto fail; 1070 1071 if (sc->sc_flags & URTW_RTL8187B) 1072 usbd_transfer_start(sc->sc_xfer[URTW_8187B_BULK_TX_STATUS]); 1073 1074 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1075 ifp->if_drv_flags |= IFF_DRV_RUNNING; 1076 1077 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1078fail: 1079 return; 1080} 1081 1082static void 1083urtw_init(void *arg) 1084{ 1085 struct urtw_softc *sc = arg; 1086 1087 URTW_LOCK(sc); 1088 urtw_init_locked(arg); 1089 URTW_UNLOCK(sc); 1090} 1091 1092static usb_error_t 1093urtw_adapter_start_b(struct urtw_softc *sc) 1094{ 1095#define N(a) (sizeof(a) / sizeof((a)[0])) 1096 uint8_t data8; 1097 usb_error_t error; 1098 1099 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1100 if (error) 1101 goto fail; 1102 1103 urtw_read8_m(sc, URTW_CONFIG3, &data8); 1104 urtw_write8_m(sc, URTW_CONFIG3, 1105 data8 | URTW_CONFIG3_ANAPARAM_WRITE | URTW_CONFIG3_GNT_SELECT); 1106 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8187B_8225_ANAPARAM2_ON); 1107 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_ON); 1108 urtw_write8_m(sc, URTW_ANAPARAM3, URTW_8187B_8225_ANAPARAM3_ON); 1109 1110 urtw_write8_m(sc, 0x61, 0x10); 1111 urtw_read8_m(sc, 0x62, &data8); 1112 urtw_write8_m(sc, 0x62, data8 & ~(1 << 5)); 1113 urtw_write8_m(sc, 0x62, data8 | (1 << 5)); 1114 1115 urtw_read8_m(sc, URTW_CONFIG3, &data8); 1116 data8 &= ~URTW_CONFIG3_ANAPARAM_WRITE; 1117 urtw_write8_m(sc, URTW_CONFIG3, data8); 1118 1119 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1120 if (error) 1121 goto fail; 1122 1123 error = urtw_8187b_cmd_reset(sc); 1124 if (error) 1125 goto fail; 1126 1127 error = sc->sc_rf_init(sc); 1128 if (error != 0) 1129 goto fail; 1130 urtw_write8_m(sc, URTW_CMD, URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE); 1131 1132 /* fix RTL8187B RX stall */ 1133 error = urtw_intr_enable(sc); 1134 if (error) 1135 goto fail; 1136 1137 error = urtw_write8e(sc, 0x41, 0xf4); 1138 if (error) 1139 goto fail; 1140 error = urtw_write8e(sc, 0x40, 0x00); 1141 if (error) 1142 goto fail; 1143 error = urtw_write8e(sc, 0x42, 0x00); 1144 if (error) 1145 goto fail; 1146 error = urtw_write8e(sc, 0x42, 0x01); 1147 if (error) 1148 goto fail; 1149 error = urtw_write8e(sc, 0x40, 0x0f); 1150 if (error) 1151 goto fail; 1152 error = urtw_write8e(sc, 0x42, 0x00); 1153 if (error) 1154 goto fail; 1155 error = urtw_write8e(sc, 0x42, 0x01); 1156 if (error) 1157 goto fail; 1158 1159 urtw_read8_m(sc, 0xdb, &data8); 1160 urtw_write8_m(sc, 0xdb, data8 | (1 << 2)); 1161 urtw_write16_m(sc, 0x372, 0x59fa); 1162 urtw_write16_m(sc, 0x374, 0x59d2); 1163 urtw_write16_m(sc, 0x376, 0x59d2); 1164 urtw_write16_m(sc, 0x378, 0x19fa); 1165 urtw_write16_m(sc, 0x37a, 0x19fa); 1166 urtw_write16_m(sc, 0x37c, 0x00d0); 1167 urtw_write8_m(sc, 0x61, 0); 1168 1169 urtw_write8_m(sc, 0x180, 0x0f); 1170 urtw_write8_m(sc, 0x183, 0x03); 1171 urtw_write8_m(sc, 0xda, 0x10); 1172 urtw_write8_m(sc, 0x24d, 0x08); 1173 urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b); 1174 1175 urtw_write16_m(sc, 0x1ec, 0x800); /* RX MAX SIZE */ 1176fail: 1177 return (error); 1178#undef N 1179} 1180 1181static usb_error_t 1182urtw_adapter_start(struct urtw_softc *sc) 1183{ 1184 usb_error_t error; 1185 1186 error = urtw_reset(sc); 1187 if (error) 1188 goto fail; 1189 1190 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 0); 1191 urtw_write8_m(sc, URTW_GPIO, 0); 1192 1193 /* for led */ 1194 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4); 1195 error = urtw_led_ctl(sc, URTW_LED_CTL_POWER_ON); 1196 if (error != 0) 1197 goto fail; 1198 1199 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1200 if (error) 1201 goto fail; 1202 /* applying MAC address again. */ 1203 urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]); 1204 urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff); 1205 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1206 if (error) 1207 goto fail; 1208 1209 error = urtw_update_msr(sc); 1210 if (error) 1211 goto fail; 1212 1213 urtw_write32_m(sc, URTW_INT_TIMEOUT, 0); 1214 urtw_write8_m(sc, URTW_WPA_CONFIG, 0); 1215 urtw_write8_m(sc, URTW_RATE_FALLBACK, URTW_RATE_FALLBACK_ENABLE | 0x1); 1216 error = urtw_set_rate(sc); 1217 if (error != 0) 1218 goto fail; 1219 1220 error = sc->sc_rf_init(sc); 1221 if (error != 0) 1222 goto fail; 1223 if (sc->sc_rf_set_sens != NULL) 1224 sc->sc_rf_set_sens(sc, sc->sc_sens); 1225 1226 /* XXX correct? to call write16 */ 1227 urtw_write16_m(sc, URTW_PSR, 1); 1228 urtw_write16_m(sc, URTW_ADDR_MAGIC2, 0x10); 1229 urtw_write8_m(sc, URTW_TALLY_SEL, 0x80); 1230 urtw_write8_m(sc, URTW_ADDR_MAGIC3, 0x60); 1231 /* XXX correct? to call write16 */ 1232 urtw_write16_m(sc, URTW_PSR, 0); 1233 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4); 1234 1235 error = urtw_intr_enable(sc); 1236 if (error != 0) 1237 goto fail; 1238 1239fail: 1240 return (error); 1241} 1242 1243static usb_error_t 1244urtw_set_mode(struct urtw_softc *sc, uint32_t mode) 1245{ 1246 uint8_t data; 1247 usb_error_t error; 1248 1249 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 1250 data = (data & ~URTW_EPROM_CMD_MASK) | (mode << URTW_EPROM_CMD_SHIFT); 1251 data = data & ~(URTW_EPROM_CS | URTW_EPROM_CK); 1252 urtw_write8_m(sc, URTW_EPROM_CMD, data); 1253fail: 1254 return (error); 1255} 1256 1257static usb_error_t 1258urtw_8187b_cmd_reset(struct urtw_softc *sc) 1259{ 1260 int i; 1261 uint8_t data8; 1262 usb_error_t error; 1263 1264 /* XXX the code can be duplicate with urtw_reset(). */ 1265 urtw_read8_m(sc, URTW_CMD, &data8); 1266 data8 = (data8 & 0x2) | URTW_CMD_RST; 1267 urtw_write8_m(sc, URTW_CMD, data8); 1268 1269 for (i = 0; i < 20; i++) { 1270 usb_pause_mtx(&sc->sc_mtx, 2); 1271 urtw_read8_m(sc, URTW_CMD, &data8); 1272 if (!(data8 & URTW_CMD_RST)) 1273 break; 1274 } 1275 if (i >= 20) { 1276 device_printf(sc->sc_dev, "reset timeout\n"); 1277 goto fail; 1278 } 1279fail: 1280 return (error); 1281} 1282 1283static usb_error_t 1284urtw_do_request(struct urtw_softc *sc, 1285 struct usb_device_request *req, void *data) 1286{ 1287 usb_error_t err; 1288 int ntries = 10; 1289 1290 URTW_ASSERT_LOCKED(sc); 1291 1292 while (ntries--) { 1293 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx, 1294 req, data, 0, NULL, 250 /* ms */); 1295 if (err == 0) 1296 break; 1297 1298 DPRINTF(sc, URTW_DEBUG_INIT, 1299 "Control request failed, %s (retrying)\n", 1300 usbd_errstr(err)); 1301 usb_pause_mtx(&sc->sc_mtx, hz / 100); 1302 } 1303 return (err); 1304} 1305 1306static void 1307urtw_stop_locked(struct ifnet *ifp, int disable) 1308{ 1309 struct urtw_softc *sc = ifp->if_softc; 1310 uint8_t data8; 1311 usb_error_t error; 1312 1313 (void)disable; 1314 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 1315 1316 error = urtw_intr_disable(sc); 1317 if (error) 1318 goto fail; 1319 urtw_read8_m(sc, URTW_CMD, &data8); 1320 data8 &= ~(URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE); 1321 urtw_write8_m(sc, URTW_CMD, data8); 1322 1323 error = sc->sc_rf_stop(sc); 1324 if (error != 0) 1325 goto fail; 1326 1327 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1328 if (error) 1329 goto fail; 1330 urtw_read8_m(sc, URTW_CONFIG4, &data8); 1331 urtw_write8_m(sc, URTW_CONFIG4, data8 | URTW_CONFIG4_VCOOFF); 1332 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1333 if (error) 1334 goto fail; 1335fail: 1336 if (error) 1337 device_printf(sc->sc_dev, "failed to stop (%s)\n", 1338 usbd_errstr(error)); 1339 1340 usb_callout_stop(&sc->sc_led_ch); 1341 callout_stop(&sc->sc_watchdog_ch); 1342 1343 urtw_abort_xfers(sc); 1344} 1345 1346static void 1347urtw_stop(struct ifnet *ifp, int disable) 1348{ 1349 struct urtw_softc *sc = ifp->if_softc; 1350 1351 URTW_LOCK(sc); 1352 urtw_stop_locked(ifp, disable); 1353 URTW_UNLOCK(sc); 1354} 1355 1356static void 1357urtw_abort_xfers(struct urtw_softc *sc) 1358{ 1359 int i, max; 1360 1361 URTW_ASSERT_LOCKED(sc); 1362 1363 max = (sc->sc_flags & URTW_RTL8187B) ? URTW_8187B_N_XFERS : 1364 URTW_8187L_N_XFERS; 1365 1366 /* abort any pending transfers */ 1367 for (i = 0; i < max; i++) 1368 usbd_transfer_stop(sc->sc_xfer[i]); 1369} 1370 1371static int 1372urtw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 1373{ 1374 struct urtw_softc *sc = ifp->if_softc; 1375 struct ieee80211com *ic = ifp->if_l2com; 1376 struct ifreq *ifr = (struct ifreq *) data; 1377 int error = 0, startall = 0; 1378 1379 switch (cmd) { 1380 case SIOCSIFFLAGS: 1381 if (ifp->if_flags & IFF_UP) { 1382 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1383 if ((ifp->if_flags ^ sc->sc_if_flags) & 1384 (IFF_ALLMULTI | IFF_PROMISC)) 1385 urtw_set_multi(sc); 1386 } else { 1387 urtw_init(ifp->if_softc); 1388 startall = 1; 1389 } 1390 } else { 1391 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1392 urtw_stop(ifp, 1); 1393 } 1394 sc->sc_if_flags = ifp->if_flags; 1395 if (startall) 1396 ieee80211_start_all(ic); 1397 break; 1398 case SIOCGIFMEDIA: 1399 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); 1400 break; 1401 case SIOCGIFADDR: 1402 error = ether_ioctl(ifp, cmd, data); 1403 break; 1404 default: 1405 error = EINVAL; 1406 break; 1407 } 1408 1409 return (error); 1410} 1411 1412static void 1413urtw_start(struct ifnet *ifp) 1414{ 1415 struct urtw_data *bf; 1416 struct urtw_softc *sc = ifp->if_softc; 1417 struct ieee80211_node *ni; 1418 struct mbuf *m; 1419 1420 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 1421 return; 1422 1423 URTW_LOCK(sc); 1424 for (;;) { 1425 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); 1426 if (m == NULL) 1427 break; 1428 bf = urtw_getbuf(sc); 1429 if (bf == NULL) { 1430 IFQ_DRV_PREPEND(&ifp->if_snd, m); 1431 break; 1432 } 1433 1434 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; 1435 m->m_pkthdr.rcvif = NULL; 1436 1437 if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_NORMAL) != 0) { 1438 ifp->if_oerrors++; 1439 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); 1440 ieee80211_free_node(ni); 1441 break; 1442 } 1443 1444 sc->sc_txtimer = 5; 1445 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1446 } 1447 URTW_UNLOCK(sc); 1448} 1449 1450static int 1451urtw_alloc_data_list(struct urtw_softc *sc, struct urtw_data data[], 1452 int ndata, int maxsz, int fillmbuf) 1453{ 1454 int i, error; 1455 1456 for (i = 0; i < ndata; i++) { 1457 struct urtw_data *dp = &data[i]; 1458 1459 dp->sc = sc; 1460 if (fillmbuf) { 1461 dp->m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); 1462 if (dp->m == NULL) { 1463 device_printf(sc->sc_dev, 1464 "could not allocate rx mbuf\n"); 1465 error = ENOMEM; 1466 goto fail; 1467 } 1468 dp->buf = mtod(dp->m, uint8_t *); 1469 } else { 1470 dp->m = NULL; 1471 dp->buf = malloc(maxsz, M_USBDEV, M_NOWAIT); 1472 if (dp->buf == NULL) { 1473 device_printf(sc->sc_dev, 1474 "could not allocate buffer\n"); 1475 error = ENOMEM; 1476 goto fail; 1477 } 1478 if (((unsigned long)dp->buf) % 4) 1479 device_printf(sc->sc_dev, 1480 "warn: unaligned buffer %p\n", dp->buf); 1481 } 1482 dp->ni = NULL; 1483 } 1484 1485 return 0; 1486 1487fail: urtw_free_data_list(sc, data, ndata, fillmbuf); 1488 return error; 1489} 1490 1491static int 1492urtw_alloc_rx_data_list(struct urtw_softc *sc) 1493{ 1494 int error, i; 1495 1496 error = urtw_alloc_data_list(sc, 1497 sc->sc_rx, URTW_RX_DATA_LIST_COUNT, MCLBYTES, 1 /* mbufs */); 1498 if (error != 0) 1499 return (error); 1500 1501 STAILQ_INIT(&sc->sc_rx_active); 1502 STAILQ_INIT(&sc->sc_rx_inactive); 1503 1504 for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) 1505 STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next); 1506 1507 return (0); 1508} 1509 1510static int 1511urtw_alloc_tx_data_list(struct urtw_softc *sc) 1512{ 1513 int error, i; 1514 1515 error = urtw_alloc_data_list(sc, 1516 sc->sc_tx, URTW_TX_DATA_LIST_COUNT, URTW_TX_MAXSIZE, 1517 0 /* no mbufs */); 1518 if (error != 0) 1519 return (error); 1520 1521 STAILQ_INIT(&sc->sc_tx_active); 1522 STAILQ_INIT(&sc->sc_tx_inactive); 1523 STAILQ_INIT(&sc->sc_tx_pending); 1524 1525 for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) 1526 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i], 1527 next); 1528 1529 return (0); 1530} 1531 1532static int 1533urtw_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, 1534 const struct ieee80211_bpf_params *params) 1535{ 1536 struct ieee80211com *ic = ni->ni_ic; 1537 struct ifnet *ifp = ic->ic_ifp; 1538 struct urtw_data *bf; 1539 struct urtw_softc *sc = ifp->if_softc; 1540 1541 /* prevent management frames from being sent if we're not ready */ 1542 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 1543 m_freem(m); 1544 ieee80211_free_node(ni); 1545 return ENETDOWN; 1546 } 1547 URTW_LOCK(sc); 1548 bf = urtw_getbuf(sc); 1549 if (bf == NULL) { 1550 ieee80211_free_node(ni); 1551 m_freem(m); 1552 URTW_UNLOCK(sc); 1553 return (ENOBUFS); /* XXX */ 1554 } 1555 1556 ifp->if_opackets++; 1557 if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_LOW) != 0) { 1558 ieee80211_free_node(ni); 1559 ifp->if_oerrors++; 1560 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); 1561 URTW_UNLOCK(sc); 1562 return (EIO); 1563 } 1564 URTW_UNLOCK(sc); 1565 1566 sc->sc_txtimer = 5; 1567 return (0); 1568} 1569 1570static void 1571urtw_scan_start(struct ieee80211com *ic) 1572{ 1573 1574 /* XXX do nothing? */ 1575} 1576 1577static void 1578urtw_scan_end(struct ieee80211com *ic) 1579{ 1580 1581 /* XXX do nothing? */ 1582} 1583 1584static void 1585urtw_set_channel(struct ieee80211com *ic) 1586{ 1587 struct urtw_softc *sc = ic->ic_ifp->if_softc; 1588 struct ifnet *ifp = sc->sc_ifp; 1589 uint32_t data, orig; 1590 usb_error_t error; 1591 1592 /* 1593 * if the user set a channel explicitly using ifconfig(8) this function 1594 * can be called earlier than we're expected that in some cases the 1595 * initialization would be failed if setting a channel is called before 1596 * the init have done. 1597 */ 1598 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1599 return; 1600 1601 if (sc->sc_curchan != NULL && sc->sc_curchan == ic->ic_curchan) 1602 return; 1603 1604 URTW_LOCK(sc); 1605 1606 /* 1607 * during changing th channel we need to temporarily be disable 1608 * TX. 1609 */ 1610 urtw_read32_m(sc, URTW_TX_CONF, &orig); 1611 data = orig & ~URTW_TX_LOOPBACK_MASK; 1612 urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_MAC); 1613 1614 error = sc->sc_rf_set_chan(sc, ieee80211_chan2ieee(ic, ic->ic_curchan)); 1615 if (error != 0) 1616 goto fail; 1617 usb_pause_mtx(&sc->sc_mtx, 10); 1618 urtw_write32_m(sc, URTW_TX_CONF, orig); 1619 1620 urtw_write16_m(sc, URTW_ATIM_WND, 2); 1621 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100); 1622 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); 1623 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100); 1624 1625fail: 1626 URTW_UNLOCK(sc); 1627 1628 sc->sc_curchan = ic->ic_curchan; 1629 1630 if (error != 0) 1631 device_printf(sc->sc_dev, "could not change the channel\n"); 1632} 1633 1634static void 1635urtw_update_mcast(struct ifnet *ifp) 1636{ 1637 1638 /* XXX do nothing? */ 1639} 1640 1641static int 1642urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0, 1643 struct urtw_data *data, int prior) 1644{ 1645 struct ifnet *ifp = sc->sc_ifp; 1646 struct ieee80211_frame *wh = mtod(m0, struct ieee80211_frame *); 1647 struct ieee80211_key *k; 1648 const struct ieee80211_txparam *tp; 1649 struct ieee80211com *ic = ifp->if_l2com; 1650 struct ieee80211vap *vap = ni->ni_vap; 1651 struct usb_xfer *rtl8187b_pipes[URTW_8187B_TXPIPE_MAX] = { 1652 sc->sc_xfer[URTW_8187B_BULK_TX_BE], 1653 sc->sc_xfer[URTW_8187B_BULK_TX_BK], 1654 sc->sc_xfer[URTW_8187B_BULK_TX_VI], 1655 sc->sc_xfer[URTW_8187B_BULK_TX_VO] 1656 }; 1657 struct usb_xfer *xfer; 1658 int dur = 0, rtsdur = 0, rtsenable = 0, ctsenable = 0, rate, 1659 pkttime = 0, txdur = 0, isshort = 0, xferlen; 1660 uint16_t acktime, rtstime, ctstime; 1661 uint32_t flags; 1662 usb_error_t error; 1663 1664 URTW_ASSERT_LOCKED(sc); 1665 1666 /* 1667 * Software crypto. 1668 */ 1669 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { 1670 k = ieee80211_crypto_encap(ni, m0); 1671 if (k == NULL) { 1672 device_printf(sc->sc_dev, 1673 "ieee80211_crypto_encap returns NULL.\n"); 1674 /* XXX we don't expect the fragmented frames */ 1675 m_freem(m0); 1676 return (ENOBUFS); 1677 } 1678 1679 /* in case packet header moved, reset pointer */ 1680 wh = mtod(m0, struct ieee80211_frame *); 1681 } 1682 1683 if (ieee80211_radiotap_active_vap(vap)) { 1684 struct urtw_tx_radiotap_header *tap = &sc->sc_txtap; 1685 1686 /* XXX Are variables correct? */ 1687 tap->wt_flags = 0; 1688 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); 1689 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); 1690 1691 ieee80211_radiotap_tx(vap, m0); 1692 } 1693 1694 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_MGT || 1695 (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) { 1696 tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; 1697 rate = tp->mgmtrate; 1698 } else { 1699 tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; 1700 /* for data frames */ 1701 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) 1702 rate = tp->mcastrate; 1703 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) 1704 rate = tp->ucastrate; 1705 else 1706 rate = urtw_rtl2rate(sc->sc_currate); 1707 } 1708 1709 sc->sc_stats.txrates[sc->sc_currate]++; 1710 1711 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) 1712 txdur = pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1713 IEEE80211_CRC_LEN, rate, 0, 0); 1714 else { 1715 acktime = urtw_compute_txtime(14, 2,0, 0); 1716 if ((m0->m_pkthdr.len + 4) > vap->iv_rtsthreshold) { 1717 rtsenable = 1; 1718 ctsenable = 0; 1719 rtstime = urtw_compute_txtime(URTW_ACKCTS_LEN, 2, 0, 0); 1720 ctstime = urtw_compute_txtime(14, 2, 0, 0); 1721 pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1722 IEEE80211_CRC_LEN, rate, 0, isshort); 1723 rtsdur = ctstime + pkttime + acktime + 1724 3 * URTW_ASIFS_TIME; 1725 txdur = rtstime + rtsdur; 1726 } else { 1727 rtsenable = ctsenable = rtsdur = 0; 1728 pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1729 IEEE80211_CRC_LEN, rate, 0, isshort); 1730 txdur = pkttime + URTW_ASIFS_TIME + acktime; 1731 } 1732 1733 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) 1734 dur = urtw_compute_txtime(m0->m_pkthdr.len + 1735 IEEE80211_CRC_LEN, rate, 0, isshort) + 1736 3 * URTW_ASIFS_TIME + 1737 2 * acktime; 1738 else 1739 dur = URTW_ASIFS_TIME + acktime; 1740 } 1741 *(uint16_t *)wh->i_dur = htole16(dur); 1742 1743 xferlen = m0->m_pkthdr.len; 1744 xferlen += (sc->sc_flags & URTW_RTL8187B) ? (4 * 8) : (4 * 3); 1745 if ((0 == xferlen % 64) || (0 == xferlen % 512)) 1746 xferlen += 1; 1747 1748 bzero(data->buf, URTW_TX_MAXSIZE); 1749 flags = m0->m_pkthdr.len & 0xfff; 1750 flags |= URTW_TX_FLAG_NO_ENC; 1751 if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && 1752 (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) && 1753 (sc->sc_preamble_mode == URTW_PREAMBLE_MODE_SHORT) && 1754 (sc->sc_currate != 0)) 1755 flags |= URTW_TX_FLAG_SPLCP; 1756 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) 1757 flags |= URTW_TX_FLAG_MOREFRAG; 1758 1759 flags |= (sc->sc_currate & 0xf) << URTW_TX_FLAG_TXRATE_SHIFT; 1760 1761 if (sc->sc_flags & URTW_RTL8187B) { 1762 struct urtw_8187b_txhdr *tx; 1763 1764 tx = (struct urtw_8187b_txhdr *)data->buf; 1765 if (ctsenable) 1766 flags |= URTW_TX_FLAG_CTS; 1767 if (rtsenable) { 1768 flags |= URTW_TX_FLAG_RTS; 1769 flags |= (urtw_rate2rtl(11) & 0xf) << 1770 URTW_TX_FLAG_RTSRATE_SHIFT; 1771 tx->rtsdur = rtsdur; 1772 } 1773 tx->flag = htole32(flags); 1774 tx->txdur = txdur; 1775 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == 1776 IEEE80211_FC0_TYPE_MGT && 1777 (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == 1778 IEEE80211_FC0_SUBTYPE_PROBE_RESP) 1779 tx->retry = 1; 1780 else 1781 tx->retry = URTW_TX_MAXRETRY; 1782 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1)); 1783 } else { 1784 struct urtw_8187l_txhdr *tx; 1785 1786 tx = (struct urtw_8187l_txhdr *)data->buf; 1787 if (rtsenable) { 1788 flags |= URTW_TX_FLAG_RTS; 1789 tx->rtsdur = rtsdur; 1790 } 1791 flags |= (urtw_rate2rtl(11) & 0xf) << URTW_TX_FLAG_RTSRATE_SHIFT; 1792 tx->flag = htole32(flags); 1793 tx->retry = 3; /* CW minimum */ 1794 tx->retry = 7 << 4; /* CW maximum */ 1795 tx->retry = URTW_TX_MAXRETRY << 8; /* retry limitation */ 1796 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1)); 1797 } 1798 1799 data->buflen = xferlen; 1800 data->ni = ni; 1801 data->m = m0; 1802 1803 if (sc->sc_flags & URTW_RTL8187B) { 1804 switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { 1805 case IEEE80211_FC0_TYPE_CTL: 1806 case IEEE80211_FC0_TYPE_MGT: 1807 xfer = sc->sc_xfer[URTW_8187B_BULK_TX_EP12]; 1808 break; 1809 default: 1810 KASSERT(M_WME_GETAC(m0) < URTW_8187B_TXPIPE_MAX, 1811 ("unsupported WME pipe %d", M_WME_GETAC(m0))); 1812 xfer = rtl8187b_pipes[M_WME_GETAC(m0)]; 1813 break; 1814 } 1815 } else 1816 xfer = (prior == URTW_PRIORITY_LOW) ? 1817 sc->sc_xfer[URTW_8187L_BULK_TX_LOW] : 1818 sc->sc_xfer[URTW_8187L_BULK_TX_NORMAL]; 1819 1820 STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next); 1821 usbd_transfer_start(xfer); 1822 1823 error = urtw_led_ctl(sc, URTW_LED_CTL_TX); 1824 if (error != 0) 1825 device_printf(sc->sc_dev, "could not control LED (%d)\n", 1826 error); 1827 return (0); 1828} 1829 1830static int 1831urtw_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) 1832{ 1833 struct ieee80211_node *ni = vap->iv_bss; 1834 struct ieee80211com *ic = vap->iv_ic; 1835 struct urtw_softc *sc = ic->ic_ifp->if_softc; 1836 struct urtw_vap *uvp = URTW_VAP(vap); 1837 usb_error_t error = 0; 1838 1839 DPRINTF(sc, URTW_DEBUG_STATE, "%s: %s -> %s\n", __func__, 1840 ieee80211_state_name[vap->iv_state], 1841 ieee80211_state_name[nstate]); 1842 1843 sc->sc_state = nstate; 1844 1845 IEEE80211_UNLOCK(ic); 1846 URTW_LOCK(sc); 1847 usb_callout_stop(&sc->sc_led_ch); 1848 callout_stop(&sc->sc_watchdog_ch); 1849 1850 switch (nstate) { 1851 case IEEE80211_S_INIT: 1852 case IEEE80211_S_SCAN: 1853 case IEEE80211_S_AUTH: 1854 case IEEE80211_S_ASSOC: 1855 break; 1856 case IEEE80211_S_RUN: 1857 /* setting bssid. */ 1858 urtw_write32_m(sc, URTW_BSSID, ((uint32_t *)ni->ni_bssid)[0]); 1859 urtw_write16_m(sc, URTW_BSSID + 4, 1860 ((uint16_t *)ni->ni_bssid)[2]); 1861 urtw_update_msr(sc); 1862 /* XXX maybe the below would be incorrect. */ 1863 urtw_write16_m(sc, URTW_ATIM_WND, 2); 1864 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100); 1865 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64); 1866 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100); 1867 error = urtw_led_ctl(sc, URTW_LED_CTL_LINK); 1868 if (error != 0) 1869 device_printf(sc->sc_dev, 1870 "could not control LED (%d)\n", error); 1871 break; 1872 default: 1873 break; 1874 } 1875fail: 1876 URTW_UNLOCK(sc); 1877 IEEE80211_LOCK(ic); 1878 return (uvp->newstate(vap, nstate, arg)); 1879} 1880 1881static void 1882urtw_watchdog(void *arg) 1883{ 1884 struct urtw_softc *sc = arg; 1885 struct ifnet *ifp = sc->sc_ifp; 1886 1887 if (sc->sc_txtimer > 0) { 1888 if (--sc->sc_txtimer == 0) { 1889 device_printf(sc->sc_dev, "device timeout\n"); 1890 ifp->if_oerrors++; 1891 return; 1892 } 1893 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1894 } 1895} 1896 1897static void 1898urtw_set_multi(void *arg) 1899{ 1900 struct urtw_softc *sc = arg; 1901 struct ifnet *ifp = sc->sc_ifp; 1902 1903 if (!(ifp->if_flags & IFF_UP)) 1904 return; 1905 1906 /* 1907 * XXX don't know how to set a device. Lack of docs. Just try to set 1908 * IFF_ALLMULTI flag here. 1909 */ 1910 ifp->if_flags |= IFF_ALLMULTI; 1911} 1912 1913static usb_error_t 1914urtw_set_rate(struct urtw_softc *sc) 1915{ 1916 int i, basic_rate, min_rr_rate, max_rr_rate; 1917 uint16_t data; 1918 usb_error_t error; 1919 1920 basic_rate = urtw_rate2rtl(48); 1921 min_rr_rate = urtw_rate2rtl(12); 1922 max_rr_rate = urtw_rate2rtl(48); 1923 1924 urtw_write8_m(sc, URTW_RESP_RATE, 1925 max_rr_rate << URTW_RESP_MAX_RATE_SHIFT | 1926 min_rr_rate << URTW_RESP_MIN_RATE_SHIFT); 1927 1928 urtw_read16_m(sc, URTW_BRSR, &data); 1929 data &= ~URTW_BRSR_MBR_8185; 1930 1931 for (i = 0; i <= basic_rate; i++) 1932 data |= (1 << i); 1933 1934 urtw_write16_m(sc, URTW_BRSR, data); 1935fail: 1936 return (error); 1937} 1938 1939static uint16_t 1940urtw_rate2rtl(int rate) 1941{ 1942#define N(a) (sizeof(a) / sizeof((a)[0])) 1943 int i; 1944 1945 for (i = 0; i < N(urtw_ratetable); i++) { 1946 if (rate == urtw_ratetable[i].reg) 1947 return urtw_ratetable[i].val; 1948 } 1949 1950 return (3); 1951#undef N 1952} 1953 1954static uint16_t 1955urtw_rtl2rate(int rate) 1956{ 1957#define N(a) (sizeof(a) / sizeof((a)[0])) 1958 int i; 1959 1960 for (i = 0; i < N(urtw_ratetable); i++) { 1961 if (rate == urtw_ratetable[i].val) 1962 return urtw_ratetable[i].reg; 1963 } 1964 1965 return (0); 1966#undef N 1967} 1968 1969static usb_error_t 1970urtw_update_msr(struct urtw_softc *sc) 1971{ 1972 struct ifnet *ifp = sc->sc_ifp; 1973 struct ieee80211com *ic = ifp->if_l2com; 1974 uint8_t data; 1975 usb_error_t error; 1976 1977 urtw_read8_m(sc, URTW_MSR, &data); 1978 data &= ~URTW_MSR_LINK_MASK; 1979 1980 if (sc->sc_state == IEEE80211_S_RUN) { 1981 switch (ic->ic_opmode) { 1982 case IEEE80211_M_STA: 1983 case IEEE80211_M_MONITOR: 1984 data |= URTW_MSR_LINK_STA; 1985 if (sc->sc_flags & URTW_RTL8187B) 1986 data |= URTW_MSR_LINK_ENEDCA; 1987 break; 1988 case IEEE80211_M_IBSS: 1989 data |= URTW_MSR_LINK_ADHOC; 1990 break; 1991 case IEEE80211_M_HOSTAP: 1992 data |= URTW_MSR_LINK_HOSTAP; 1993 break; 1994 default: 1995 panic("unsupported operation mode 0x%x\n", 1996 ic->ic_opmode); 1997 /* never reach */ 1998 } 1999 } else 2000 data |= URTW_MSR_LINK_NONE; 2001 2002 urtw_write8_m(sc, URTW_MSR, data); 2003fail: 2004 return (error); 2005} 2006 2007static usb_error_t 2008urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data) 2009{ 2010 struct usb_device_request req; 2011 usb_error_t error; 2012 2013 URTW_ASSERT_LOCKED(sc); 2014 2015 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2016 req.bRequest = URTW_8187_GETREGS_REQ; 2017 USETW(req.wValue, (val & 0xff) | 0xff00); 2018 USETW(req.wIndex, (val >> 8) & 0x3); 2019 USETW(req.wLength, sizeof(uint8_t)); 2020 2021 error = urtw_do_request(sc, &req, data); 2022 return (error); 2023} 2024 2025static usb_error_t 2026urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data) 2027{ 2028 struct usb_device_request req; 2029 usb_error_t error; 2030 2031 URTW_ASSERT_LOCKED(sc); 2032 2033 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2034 req.bRequest = URTW_8187_GETREGS_REQ; 2035 USETW(req.wValue, (val & 0xff) | 0xff00); 2036 USETW(req.wIndex, (val >> 8) & 0x3); 2037 USETW(req.wLength, sizeof(uint16_t)); 2038 2039 error = urtw_do_request(sc, &req, data); 2040 return (error); 2041} 2042 2043static usb_error_t 2044urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data) 2045{ 2046 struct usb_device_request req; 2047 usb_error_t error; 2048 2049 URTW_ASSERT_LOCKED(sc); 2050 2051 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2052 req.bRequest = URTW_8187_GETREGS_REQ; 2053 USETW(req.wValue, (val & 0xff) | 0xff00); 2054 USETW(req.wIndex, (val >> 8) & 0x3); 2055 USETW(req.wLength, sizeof(uint32_t)); 2056 2057 error = urtw_do_request(sc, &req, data); 2058 return (error); 2059} 2060 2061static usb_error_t 2062urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data) 2063{ 2064 struct usb_device_request req; 2065 2066 URTW_ASSERT_LOCKED(sc); 2067 2068 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2069 req.bRequest = URTW_8187_SETREGS_REQ; 2070 USETW(req.wValue, (val & 0xff) | 0xff00); 2071 USETW(req.wIndex, (val >> 8) & 0x3); 2072 USETW(req.wLength, sizeof(uint8_t)); 2073 2074 return (urtw_do_request(sc, &req, &data)); 2075} 2076 2077static usb_error_t 2078urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data) 2079{ 2080 struct usb_device_request req; 2081 2082 URTW_ASSERT_LOCKED(sc); 2083 2084 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2085 req.bRequest = URTW_8187_SETREGS_REQ; 2086 USETW(req.wValue, (val & 0xff) | 0xff00); 2087 USETW(req.wIndex, (val >> 8) & 0x3); 2088 USETW(req.wLength, sizeof(uint16_t)); 2089 2090 return (urtw_do_request(sc, &req, &data)); 2091} 2092 2093static usb_error_t 2094urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data) 2095{ 2096 struct usb_device_request req; 2097 2098 URTW_ASSERT_LOCKED(sc); 2099 2100 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2101 req.bRequest = URTW_8187_SETREGS_REQ; 2102 USETW(req.wValue, (val & 0xff) | 0xff00); 2103 USETW(req.wIndex, (val >> 8) & 0x3); 2104 USETW(req.wLength, sizeof(uint32_t)); 2105 2106 return (urtw_do_request(sc, &req, &data)); 2107} 2108 2109static usb_error_t 2110urtw_get_macaddr(struct urtw_softc *sc) 2111{ 2112 uint32_t data; 2113 usb_error_t error; 2114 2115 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data); 2116 if (error != 0) 2117 goto fail; 2118 sc->sc_bssid[0] = data & 0xff; 2119 sc->sc_bssid[1] = (data & 0xff00) >> 8; 2120 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data); 2121 if (error != 0) 2122 goto fail; 2123 sc->sc_bssid[2] = data & 0xff; 2124 sc->sc_bssid[3] = (data & 0xff00) >> 8; 2125 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data); 2126 if (error != 0) 2127 goto fail; 2128 sc->sc_bssid[4] = data & 0xff; 2129 sc->sc_bssid[5] = (data & 0xff00) >> 8; 2130fail: 2131 return (error); 2132} 2133 2134static usb_error_t 2135urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data) 2136{ 2137#define URTW_READCMD_LEN 3 2138 int addrlen, i; 2139 int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 }; 2140 usb_error_t error; 2141 2142 /* NB: make sure the buffer is initialized */ 2143 *data = 0; 2144 2145 /* enable EPROM programming */ 2146 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE); 2147 DELAY(URTW_EPROM_DELAY); 2148 2149 error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE); 2150 if (error != 0) 2151 goto fail; 2152 error = urtw_eprom_ck(sc); 2153 if (error != 0) 2154 goto fail; 2155 error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN); 2156 if (error != 0) 2157 goto fail; 2158 if (sc->sc_epromtype == URTW_EEPROM_93C56) { 2159 addrlen = 8; 2160 addrstr[0] = addr & (1 << 7); 2161 addrstr[1] = addr & (1 << 6); 2162 addrstr[2] = addr & (1 << 5); 2163 addrstr[3] = addr & (1 << 4); 2164 addrstr[4] = addr & (1 << 3); 2165 addrstr[5] = addr & (1 << 2); 2166 addrstr[6] = addr & (1 << 1); 2167 addrstr[7] = addr & (1 << 0); 2168 } else { 2169 addrlen=6; 2170 addrstr[0] = addr & (1 << 5); 2171 addrstr[1] = addr & (1 << 4); 2172 addrstr[2] = addr & (1 << 3); 2173 addrstr[3] = addr & (1 << 2); 2174 addrstr[4] = addr & (1 << 1); 2175 addrstr[5] = addr & (1 << 0); 2176 } 2177 error = urtw_eprom_sendbits(sc, addrstr, addrlen); 2178 if (error != 0) 2179 goto fail; 2180 2181 error = urtw_eprom_writebit(sc, 0); 2182 if (error != 0) 2183 goto fail; 2184 2185 for (i = 0; i < 16; i++) { 2186 error = urtw_eprom_ck(sc); 2187 if (error != 0) 2188 goto fail; 2189 error = urtw_eprom_readbit(sc, &data16); 2190 if (error != 0) 2191 goto fail; 2192 2193 (*data) |= (data16 << (15 - i)); 2194 } 2195 2196 error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE); 2197 if (error != 0) 2198 goto fail; 2199 error = urtw_eprom_ck(sc); 2200 if (error != 0) 2201 goto fail; 2202 2203 /* now disable EPROM programming */ 2204 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE); 2205fail: 2206 return (error); 2207#undef URTW_READCMD_LEN 2208} 2209 2210static usb_error_t 2211urtw_eprom_cs(struct urtw_softc *sc, int able) 2212{ 2213 uint8_t data; 2214 usb_error_t error; 2215 2216 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2217 if (able == URTW_EPROM_ENABLE) 2218 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS); 2219 else 2220 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS); 2221 DELAY(URTW_EPROM_DELAY); 2222fail: 2223 return (error); 2224} 2225 2226static usb_error_t 2227urtw_eprom_ck(struct urtw_softc *sc) 2228{ 2229 uint8_t data; 2230 usb_error_t error; 2231 2232 /* masking */ 2233 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2234 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK); 2235 DELAY(URTW_EPROM_DELAY); 2236 /* unmasking */ 2237 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2238 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK); 2239 DELAY(URTW_EPROM_DELAY); 2240fail: 2241 return (error); 2242} 2243 2244static usb_error_t 2245urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data) 2246{ 2247 uint8_t data8; 2248 usb_error_t error; 2249 2250 urtw_read8_m(sc, URTW_EPROM_CMD, &data8); 2251 *data = (data8 & URTW_EPROM_READBIT) ? 1 : 0; 2252 DELAY(URTW_EPROM_DELAY); 2253 2254fail: 2255 return (error); 2256} 2257 2258static usb_error_t 2259urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit) 2260{ 2261 uint8_t data; 2262 usb_error_t error; 2263 2264 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2265 if (bit != 0) 2266 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT); 2267 else 2268 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT); 2269 DELAY(URTW_EPROM_DELAY); 2270fail: 2271 return (error); 2272} 2273 2274static usb_error_t 2275urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen) 2276{ 2277 int i = 0; 2278 usb_error_t error = 0; 2279 2280 for (i = 0; i < buflen; i++) { 2281 error = urtw_eprom_writebit(sc, buf[i]); 2282 if (error != 0) 2283 goto fail; 2284 error = urtw_eprom_ck(sc); 2285 if (error != 0) 2286 goto fail; 2287 } 2288fail: 2289 return (error); 2290} 2291 2292 2293static usb_error_t 2294urtw_get_txpwr(struct urtw_softc *sc) 2295{ 2296 int i, j; 2297 uint32_t data; 2298 usb_error_t error; 2299 2300 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data); 2301 if (error != 0) 2302 goto fail; 2303 sc->sc_txpwr_cck_base = data & 0xf; 2304 sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf; 2305 2306 for (i = 1, j = 0; i < 6; i += 2, j++) { 2307 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data); 2308 if (error != 0) 2309 goto fail; 2310 sc->sc_txpwr_cck[i] = data & 0xf; 2311 sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8; 2312 sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4; 2313 sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12; 2314 } 2315 for (i = 1, j = 0; i < 4; i += 2, j++) { 2316 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data); 2317 if (error != 0) 2318 goto fail; 2319 sc->sc_txpwr_cck[i + 6] = data & 0xf; 2320 sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8; 2321 sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4; 2322 sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12; 2323 } 2324 if (sc->sc_flags & URTW_RTL8187B) { 2325 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2, &data); 2326 if (error != 0) 2327 goto fail; 2328 sc->sc_txpwr_cck[1 + 6 + 4] = data & 0xf; 2329 sc->sc_txpwr_ofdm[1 + 6 + 4] = (data & 0xf0) >> 4; 2330 error = urtw_eprom_read32(sc, 0x0a, &data); 2331 if (error != 0) 2332 goto fail; 2333 sc->sc_txpwr_cck[2 + 6 + 4] = data & 0xf; 2334 sc->sc_txpwr_ofdm[2 + 6 + 4] = (data & 0xf0) >> 4; 2335 error = urtw_eprom_read32(sc, 0x1c, &data); 2336 if (error != 0) 2337 goto fail; 2338 sc->sc_txpwr_cck[3 + 6 + 4] = data & 0xf; 2339 sc->sc_txpwr_cck[3 + 6 + 4 + 1] = (data & 0xf00) >> 8; 2340 sc->sc_txpwr_ofdm[3 + 6 + 4] = (data & 0xf0) >> 4; 2341 sc->sc_txpwr_ofdm[3 + 6 + 4 + 1] = (data & 0xf000) >> 12; 2342 } else { 2343 for (i = 1, j = 0; i < 4; i += 2, j++) { 2344 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j, 2345 &data); 2346 if (error != 0) 2347 goto fail; 2348 sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf; 2349 sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8; 2350 sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4; 2351 sc->sc_txpwr_ofdm[i + 6 + 4 + 1] = (data & 0xf000) >> 12; 2352 } 2353 } 2354fail: 2355 return (error); 2356} 2357 2358 2359static usb_error_t 2360urtw_get_rfchip(struct urtw_softc *sc) 2361{ 2362 int ret; 2363 uint8_t data8; 2364 uint32_t data; 2365 usb_error_t error; 2366 2367 if (sc->sc_flags & URTW_RTL8187B) { 2368 urtw_read8_m(sc, 0xe1, &data8); 2369 switch (data8) { 2370 case 0: 2371 sc->sc_flags |= URTW_RTL8187B_REV_B; 2372 break; 2373 case 1: 2374 sc->sc_flags |= URTW_RTL8187B_REV_D; 2375 break; 2376 case 2: 2377 sc->sc_flags |= URTW_RTL8187B_REV_E; 2378 break; 2379 default: 2380 device_printf(sc->sc_dev, "unknown type: %#x\n", data8); 2381 sc->sc_flags |= URTW_RTL8187B_REV_B; 2382 break; 2383 } 2384 } else { 2385 urtw_read32_m(sc, URTW_TX_CONF, &data); 2386 switch (data & URTW_TX_HWMASK) { 2387 case URTW_TX_R8187vD_B: 2388 sc->sc_flags |= URTW_RTL8187B; 2389 break; 2390 case URTW_TX_R8187vD: 2391 break; 2392 default: 2393 device_printf(sc->sc_dev, "unknown RTL8187L type: %#x\n", 2394 data & URTW_TX_HWMASK); 2395 break; 2396 } 2397 } 2398 2399 error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data); 2400 if (error != 0) 2401 goto fail; 2402 switch (data & 0xff) { 2403 case URTW_EPROM_RFCHIPID_RTL8225U: 2404 error = urtw_8225_isv2(sc, &ret); 2405 if (error != 0) 2406 goto fail; 2407 if (ret == 0) { 2408 sc->sc_rf_init = urtw_8225_rf_init; 2409 sc->sc_rf_set_sens = urtw_8225_rf_set_sens; 2410 sc->sc_rf_set_chan = urtw_8225_rf_set_chan; 2411 sc->sc_rf_stop = urtw_8225_rf_stop; 2412 } else { 2413 sc->sc_rf_init = urtw_8225v2_rf_init; 2414 sc->sc_rf_set_chan = urtw_8225v2_rf_set_chan; 2415 sc->sc_rf_stop = urtw_8225_rf_stop; 2416 } 2417 sc->sc_max_sens = URTW_8225_RF_MAX_SENS; 2418 sc->sc_sens = URTW_8225_RF_DEF_SENS; 2419 break; 2420 case URTW_EPROM_RFCHIPID_RTL8225Z2: 2421 sc->sc_rf_init = urtw_8225v2b_rf_init; 2422 sc->sc_rf_set_chan = urtw_8225v2b_rf_set_chan; 2423 sc->sc_max_sens = URTW_8225_RF_MAX_SENS; 2424 sc->sc_sens = URTW_8225_RF_DEF_SENS; 2425 sc->sc_rf_stop = urtw_8225_rf_stop; 2426 break; 2427 default: 2428 panic("unsupported RF chip %d\n", data & 0xff); 2429 /* never reach */ 2430 } 2431 2432 device_printf(sc->sc_dev, "%s rf %s hwrev %s\n", 2433 (sc->sc_flags & URTW_RTL8187B) ? "rtl8187b" : "rtl8187l", 2434 ((data & 0xff) == URTW_EPROM_RFCHIPID_RTL8225U) ? "rtl8225u" : 2435 "rtl8225z2", 2436 (sc->sc_flags & URTW_RTL8187B) ? ((data8 == 0) ? "b" : 2437 (data8 == 1) ? "d" : "e") : "none"); 2438 2439fail: 2440 return (error); 2441} 2442 2443 2444static usb_error_t 2445urtw_led_init(struct urtw_softc *sc) 2446{ 2447 uint32_t rev; 2448 usb_error_t error; 2449 2450 urtw_read8_m(sc, URTW_PSR, &sc->sc_psr); 2451 error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev); 2452 if (error != 0) 2453 goto fail; 2454 2455 switch (rev & URTW_EPROM_CID_MASK) { 2456 case URTW_EPROM_CID_ALPHA0: 2457 sc->sc_strategy = URTW_SW_LED_MODE1; 2458 break; 2459 case URTW_EPROM_CID_SERCOMM_PS: 2460 sc->sc_strategy = URTW_SW_LED_MODE3; 2461 break; 2462 case URTW_EPROM_CID_HW_LED: 2463 sc->sc_strategy = URTW_HW_LED; 2464 break; 2465 case URTW_EPROM_CID_RSVD0: 2466 case URTW_EPROM_CID_RSVD1: 2467 default: 2468 sc->sc_strategy = URTW_SW_LED_MODE0; 2469 break; 2470 } 2471 2472 sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0; 2473 2474fail: 2475 return (error); 2476} 2477 2478 2479static usb_error_t 2480urtw_8225_rf_init(struct urtw_softc *sc) 2481{ 2482#define N(a) (sizeof(a) / sizeof((a)[0])) 2483 int i; 2484 uint16_t data; 2485 usb_error_t error; 2486 2487 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 2488 if (error) 2489 goto fail; 2490 2491 error = urtw_8225_usb_init(sc); 2492 if (error) 2493 goto fail; 2494 2495 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008); 2496 urtw_read16_m(sc, URTW_BRSR, &data); /* XXX ??? */ 2497 urtw_write16_m(sc, URTW_BRSR, 0xffff); 2498 urtw_write32_m(sc, URTW_RF_PARA, 0x100044); 2499 2500 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2501 if (error) 2502 goto fail; 2503 urtw_write8_m(sc, URTW_CONFIG3, 0x44); 2504 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2505 if (error) 2506 goto fail; 2507 2508 error = urtw_8185_rf_pins_enable(sc); 2509 if (error) 2510 goto fail; 2511 usb_pause_mtx(&sc->sc_mtx, 1000); 2512 2513 for (i = 0; i < N(urtw_8225_rf_part1); i++) { 2514 urtw_8225_write(sc, urtw_8225_rf_part1[i].reg, 2515 urtw_8225_rf_part1[i].val); 2516 usb_pause_mtx(&sc->sc_mtx, 1); 2517 } 2518 usb_pause_mtx(&sc->sc_mtx, 100); 2519 urtw_8225_write(sc, 2520 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2521 usb_pause_mtx(&sc->sc_mtx, 200); 2522 urtw_8225_write(sc, 2523 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2524 usb_pause_mtx(&sc->sc_mtx, 200); 2525 urtw_8225_write(sc, 2526 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC3); 2527 2528 for (i = 0; i < 95; i++) { 2529 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 2530 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, urtw_8225_rxgain[i]); 2531 } 2532 2533 urtw_8225_write(sc, 2534 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC4); 2535 urtw_8225_write(sc, 2536 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC5); 2537 2538 for (i = 0; i < 128; i++) { 2539 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]); 2540 usb_pause_mtx(&sc->sc_mtx, 1); 2541 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80); 2542 usb_pause_mtx(&sc->sc_mtx, 1); 2543 } 2544 2545 for (i = 0; i < N(urtw_8225_rf_part2); i++) { 2546 urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg, 2547 urtw_8225_rf_part2[i].val); 2548 usb_pause_mtx(&sc->sc_mtx, 1); 2549 } 2550 2551 error = urtw_8225_setgain(sc, 4); 2552 if (error) 2553 goto fail; 2554 2555 for (i = 0; i < N(urtw_8225_rf_part3); i++) { 2556 urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg, 2557 urtw_8225_rf_part3[i].val); 2558 usb_pause_mtx(&sc->sc_mtx, 1); 2559 } 2560 2561 urtw_write8_m(sc, URTW_TESTR, 0x0d); 2562 2563 error = urtw_8225_set_txpwrlvl(sc, 1); 2564 if (error) 2565 goto fail; 2566 2567 urtw_8187_write_phy_cck(sc, 0x10, 0x9b); 2568 usb_pause_mtx(&sc->sc_mtx, 1); 2569 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90); 2570 usb_pause_mtx(&sc->sc_mtx, 1); 2571 2572 /* TX ant A, 0x0 for B */ 2573 error = urtw_8185_tx_antenna(sc, 0x3); 2574 if (error) 2575 goto fail; 2576 urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002); 2577 2578 error = urtw_8225_rf_set_chan(sc, 1); 2579fail: 2580 return (error); 2581#undef N 2582} 2583 2584static usb_error_t 2585urtw_8185_rf_pins_enable(struct urtw_softc *sc) 2586{ 2587 usb_error_t error = 0; 2588 2589 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7); 2590fail: 2591 return (error); 2592} 2593 2594static usb_error_t 2595urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant) 2596{ 2597 usb_error_t error; 2598 2599 urtw_write8_m(sc, URTW_TX_ANTENNA, ant); 2600 usb_pause_mtx(&sc->sc_mtx, 1); 2601fail: 2602 return (error); 2603} 2604 2605static usb_error_t 2606urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2607{ 2608 2609 data = data & 0xff; 2610 return urtw_8187_write_phy(sc, addr, data); 2611} 2612 2613static usb_error_t 2614urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2615{ 2616 2617 data = data & 0xff; 2618 return urtw_8187_write_phy(sc, addr, data | 0x10000); 2619} 2620 2621static usb_error_t 2622urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2623{ 2624 uint32_t phyw; 2625 usb_error_t error; 2626 2627 phyw = ((data << 8) | (addr | 0x80)); 2628 urtw_write8_m(sc, URTW_PHY_MAGIC4, ((phyw & 0xff000000) >> 24)); 2629 urtw_write8_m(sc, URTW_PHY_MAGIC3, ((phyw & 0x00ff0000) >> 16)); 2630 urtw_write8_m(sc, URTW_PHY_MAGIC2, ((phyw & 0x0000ff00) >> 8)); 2631 urtw_write8_m(sc, URTW_PHY_MAGIC1, ((phyw & 0x000000ff))); 2632 usb_pause_mtx(&sc->sc_mtx, 1); 2633fail: 2634 return (error); 2635} 2636 2637static usb_error_t 2638urtw_8225_setgain(struct urtw_softc *sc, int16_t gain) 2639{ 2640 usb_error_t error; 2641 2642 urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]); 2643 urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]); 2644 urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]); 2645 urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]); 2646fail: 2647 return (error); 2648} 2649 2650static usb_error_t 2651urtw_8225_usb_init(struct urtw_softc *sc) 2652{ 2653 uint8_t data; 2654 usb_error_t error; 2655 2656 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0); 2657 urtw_write8_m(sc, URTW_GPIO, 0); 2658 error = urtw_read8e(sc, 0x53, &data); 2659 if (error) 2660 goto fail; 2661 error = urtw_write8e(sc, 0x53, data | (1 << 7)); 2662 if (error) 2663 goto fail; 2664 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4); 2665 urtw_write8_m(sc, URTW_GPIO, 0x20); 2666 urtw_write8_m(sc, URTW_GP_ENABLE, 0); 2667 2668 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80); 2669 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80); 2670 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80); 2671 2672 usb_pause_mtx(&sc->sc_mtx, 500); 2673fail: 2674 return (error); 2675} 2676 2677static usb_error_t 2678urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data) 2679{ 2680 uint16_t d80, d82, d84; 2681 usb_error_t error; 2682 2683 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80); 2684 d80 &= URTW_RF_PINS_MAGIC1; 2685 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82); 2686 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84); 2687 d84 &= URTW_RF_PINS_MAGIC2; 2688 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | URTW_RF_PINS_MAGIC3); 2689 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | URTW_RF_PINS_MAGIC3); 2690 DELAY(10); 2691 2692 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2693 DELAY(2); 2694 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80); 2695 DELAY(10); 2696 2697 error = urtw_8225_write_s16(sc, addr, 0x8225, &data); 2698 if (error != 0) 2699 goto fail; 2700 2701 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2702 DELAY(10); 2703 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2704 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84); 2705 usb_pause_mtx(&sc->sc_mtx, 2); 2706fail: 2707 return (error); 2708} 2709 2710/* XXX why we should allocalte memory buffer instead of using memory stack? */ 2711static usb_error_t 2712urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index, 2713 uint16_t *data) 2714{ 2715 uint8_t *buf; 2716 uint16_t data16; 2717 struct usb_device_request *req; 2718 usb_error_t error = 0; 2719 2720 data16 = *data; 2721 req = (usb_device_request_t *)malloc(sizeof(usb_device_request_t), 2722 M_80211_VAP, M_NOWAIT | M_ZERO); 2723 if (req == NULL) { 2724 device_printf(sc->sc_dev, "could not allocate a memory\n"); 2725 goto fail0; 2726 } 2727 buf = (uint8_t *)malloc(2, M_80211_VAP, M_NOWAIT | M_ZERO); 2728 if (req == NULL) { 2729 device_printf(sc->sc_dev, "could not allocate a memory\n"); 2730 goto fail1; 2731 } 2732 2733 req->bmRequestType = UT_WRITE_VENDOR_DEVICE; 2734 req->bRequest = URTW_8187_SETREGS_REQ; 2735 USETW(req->wValue, addr); 2736 USETW(req->wIndex, index); 2737 USETW(req->wLength, sizeof(uint16_t)); 2738 buf[0] = (data16 & 0x00ff); 2739 buf[1] = (data16 & 0xff00) >> 8; 2740 2741 error = urtw_do_request(sc, req, buf); 2742 2743 free(buf, M_80211_VAP); 2744fail1: free(req, M_80211_VAP); 2745fail0: return (error); 2746} 2747 2748static usb_error_t 2749urtw_8225_rf_set_chan(struct urtw_softc *sc, int chan) 2750{ 2751 usb_error_t error; 2752 2753 error = urtw_8225_set_txpwrlvl(sc, chan); 2754 if (error) 2755 goto fail; 2756 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 2757 usb_pause_mtx(&sc->sc_mtx, 10); 2758fail: 2759 return (error); 2760} 2761 2762static usb_error_t 2763urtw_8225_rf_set_sens(struct urtw_softc *sc, int sens) 2764{ 2765 usb_error_t error; 2766 2767 if (sens < 0 || sens > 6) 2768 return -1; 2769 2770 if (sens > 4) 2771 urtw_8225_write(sc, 2772 URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC1); 2773 else 2774 urtw_8225_write(sc, 2775 URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC2); 2776 2777 sens = 6 - sens; 2778 error = urtw_8225_setgain(sc, sens); 2779 if (error) 2780 goto fail; 2781 2782 urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[sens]); 2783 2784fail: 2785 return (error); 2786} 2787 2788static usb_error_t 2789urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan) 2790{ 2791 int i, idx, set; 2792 uint8_t *cck_pwltable; 2793 uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max; 2794 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 2795 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 2796 usb_error_t error; 2797 2798 cck_pwrlvl_max = 11; 2799 ofdm_pwrlvl_max = 25; /* 12 -> 25 */ 2800 ofdm_pwrlvl_min = 10; 2801 2802 /* CCK power setting */ 2803 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl; 2804 idx = cck_pwrlvl % 6; 2805 set = cck_pwrlvl / 6; 2806 cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 : 2807 urtw_8225_txpwr_cck; 2808 2809 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 2810 urtw_8225_tx_gain_cck_ofdm[set] >> 1); 2811 for (i = 0; i < 8; i++) { 2812 urtw_8187_write_phy_cck(sc, 0x44 + i, 2813 cck_pwltable[idx * 8 + i]); 2814 } 2815 usb_pause_mtx(&sc->sc_mtx, 1); 2816 2817 /* OFDM power setting */ 2818 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 2819 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 2820 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 2821 2822 idx = ofdm_pwrlvl % 6; 2823 set = ofdm_pwrlvl / 6; 2824 2825 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 2826 if (error) 2827 goto fail; 2828 urtw_8187_write_phy_ofdm(sc, 2, 0x42); 2829 urtw_8187_write_phy_ofdm(sc, 6, 0); 2830 urtw_8187_write_phy_ofdm(sc, 8, 0); 2831 2832 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 2833 urtw_8225_tx_gain_cck_ofdm[set] >> 1); 2834 urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]); 2835 urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]); 2836 usb_pause_mtx(&sc->sc_mtx, 1); 2837fail: 2838 return (error); 2839} 2840 2841 2842static usb_error_t 2843urtw_8225_rf_stop(struct urtw_softc *sc) 2844{ 2845 uint8_t data; 2846 usb_error_t error; 2847 2848 urtw_8225_write(sc, 0x4, 0x1f); 2849 2850 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2851 if (error) 2852 goto fail; 2853 2854 urtw_read8_m(sc, URTW_CONFIG3, &data); 2855 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 2856 if (sc->sc_flags & URTW_RTL8187B) { 2857 urtw_write32_m(sc, URTW_ANAPARAM2, 2858 URTW_8187B_8225_ANAPARAM2_OFF); 2859 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_OFF); 2860 urtw_write32_m(sc, URTW_ANAPARAM3, 2861 URTW_8187B_8225_ANAPARAM3_OFF); 2862 } else { 2863 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8225_ANAPARAM2_OFF); 2864 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8225_ANAPARAM_OFF); 2865 } 2866 2867 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 2868 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2869 if (error) 2870 goto fail; 2871 2872fail: 2873 return (error); 2874} 2875 2876static usb_error_t 2877urtw_8225v2_rf_init(struct urtw_softc *sc) 2878{ 2879#define N(a) (sizeof(a) / sizeof((a)[0])) 2880 int i; 2881 uint16_t data; 2882 uint32_t data32; 2883 usb_error_t error; 2884 2885 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 2886 if (error) 2887 goto fail; 2888 2889 error = urtw_8225_usb_init(sc); 2890 if (error) 2891 goto fail; 2892 2893 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008); 2894 urtw_read16_m(sc, URTW_BRSR, &data); /* XXX ??? */ 2895 urtw_write16_m(sc, URTW_BRSR, 0xffff); 2896 urtw_write32_m(sc, URTW_RF_PARA, 0x100044); 2897 2898 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2899 if (error) 2900 goto fail; 2901 urtw_write8_m(sc, URTW_CONFIG3, 0x44); 2902 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2903 if (error) 2904 goto fail; 2905 2906 error = urtw_8185_rf_pins_enable(sc); 2907 if (error) 2908 goto fail; 2909 2910 usb_pause_mtx(&sc->sc_mtx, 500); 2911 2912 for (i = 0; i < N(urtw_8225v2_rf_part1); i++) { 2913 urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg, 2914 urtw_8225v2_rf_part1[i].val); 2915 } 2916 usb_pause_mtx(&sc->sc_mtx, 50); 2917 2918 urtw_8225_write(sc, 2919 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC1); 2920 2921 for (i = 0; i < 95; i++) { 2922 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 2923 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 2924 urtw_8225v2_rxgain[i]); 2925 } 2926 2927 urtw_8225_write(sc, 2928 URTW_8225_ADDR_3_MAGIC, URTW_8225_ADDR_3_DATA_MAGIC1); 2929 urtw_8225_write(sc, 2930 URTW_8225_ADDR_5_MAGIC, URTW_8225_ADDR_5_DATA_MAGIC1); 2931 urtw_8225_write(sc, 2932 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC2); 2933 urtw_8225_write(sc, 2934 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2935 usb_pause_mtx(&sc->sc_mtx, 100); 2936 urtw_8225_write(sc, 2937 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2938 usb_pause_mtx(&sc->sc_mtx, 100); 2939 2940 error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32); 2941 if (error != 0) 2942 goto fail; 2943 if (data32 != URTW_8225_ADDR_6_DATA_MAGIC1) 2944 device_printf(sc->sc_dev, "expect 0xe6!! (0x%x)\n", data32); 2945 if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) { 2946 urtw_8225_write(sc, 2947 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2948 usb_pause_mtx(&sc->sc_mtx, 100); 2949 urtw_8225_write(sc, 2950 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2951 usb_pause_mtx(&sc->sc_mtx, 50); 2952 error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32); 2953 if (error != 0) 2954 goto fail; 2955 if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) 2956 device_printf(sc->sc_dev, "RF calibration failed\n"); 2957 } 2958 usb_pause_mtx(&sc->sc_mtx, 100); 2959 2960 urtw_8225_write(sc, 2961 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC6); 2962 for (i = 0; i < 128; i++) { 2963 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]); 2964 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80); 2965 } 2966 2967 for (i = 0; i < N(urtw_8225v2_rf_part2); i++) { 2968 urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg, 2969 urtw_8225v2_rf_part2[i].val); 2970 } 2971 2972 error = urtw_8225v2_setgain(sc, 4); 2973 if (error) 2974 goto fail; 2975 2976 for (i = 0; i < N(urtw_8225v2_rf_part3); i++) { 2977 urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg, 2978 urtw_8225v2_rf_part3[i].val); 2979 } 2980 2981 urtw_write8_m(sc, URTW_TESTR, 0x0d); 2982 2983 error = urtw_8225v2_set_txpwrlvl(sc, 1); 2984 if (error) 2985 goto fail; 2986 2987 urtw_8187_write_phy_cck(sc, 0x10, 0x9b); 2988 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90); 2989 2990 /* TX ant A, 0x0 for B */ 2991 error = urtw_8185_tx_antenna(sc, 0x3); 2992 if (error) 2993 goto fail; 2994 urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002); 2995 2996 error = urtw_8225_rf_set_chan(sc, 1); 2997fail: 2998 return (error); 2999#undef N 3000} 3001 3002static usb_error_t 3003urtw_8225v2_rf_set_chan(struct urtw_softc *sc, int chan) 3004{ 3005 usb_error_t error; 3006 3007 error = urtw_8225v2_set_txpwrlvl(sc, chan); 3008 if (error) 3009 goto fail; 3010 3011 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 3012 usb_pause_mtx(&sc->sc_mtx, 10); 3013fail: 3014 return (error); 3015} 3016 3017static usb_error_t 3018urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data) 3019{ 3020 int i; 3021 int16_t bit; 3022 uint8_t rlen = 12, wlen = 6; 3023 uint16_t o1, o2, o3, tmp; 3024 uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27; 3025 uint32_t mask = 0x80000000, value = 0; 3026 usb_error_t error; 3027 3028 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1); 3029 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2); 3030 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3); 3031 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | URTW_RF_PINS_MAGIC4); 3032 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | URTW_RF_PINS_MAGIC4); 3033 o1 &= ~URTW_RF_PINS_MAGIC4; 3034 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN); 3035 DELAY(5); 3036 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1); 3037 DELAY(5); 3038 3039 for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) { 3040 bit = ((d2w & mask) != 0) ? 1 : 0; 3041 3042 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1); 3043 DELAY(2); 3044 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3045 URTW_BB_HOST_BANG_CLK); 3046 DELAY(2); 3047 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3048 URTW_BB_HOST_BANG_CLK); 3049 DELAY(2); 3050 mask = mask >> 1; 3051 if (i == 2) 3052 break; 3053 bit = ((d2w & mask) != 0) ? 1 : 0; 3054 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3055 URTW_BB_HOST_BANG_CLK); 3056 DELAY(2); 3057 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3058 URTW_BB_HOST_BANG_CLK); 3059 DELAY(2); 3060 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1); 3061 DELAY(1); 3062 } 3063 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW | 3064 URTW_BB_HOST_BANG_CLK); 3065 DELAY(2); 3066 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW); 3067 DELAY(2); 3068 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW); 3069 DELAY(2); 3070 3071 mask = 0x800; 3072 for (i = 0; i < rlen; i++, mask = mask >> 1) { 3073 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3074 o1 | URTW_BB_HOST_BANG_RW); 3075 DELAY(2); 3076 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3077 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3078 DELAY(2); 3079 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3080 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3081 DELAY(2); 3082 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3083 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3084 DELAY(2); 3085 3086 urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp); 3087 value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0); 3088 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3089 o1 | URTW_BB_HOST_BANG_RW); 3090 DELAY(2); 3091 } 3092 3093 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN | 3094 URTW_BB_HOST_BANG_RW); 3095 DELAY(2); 3096 3097 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2); 3098 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3); 3099 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_OUTPUT_MAGIC1); 3100 3101 if (data != NULL) 3102 *data = value; 3103fail: 3104 return (error); 3105} 3106 3107 3108static usb_error_t 3109urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan) 3110{ 3111 int i; 3112 uint8_t *cck_pwrtable; 3113 uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10; 3114 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 3115 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 3116 usb_error_t error; 3117 3118 /* CCK power setting */ 3119 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl; 3120 cck_pwrlvl += sc->sc_txpwr_cck_base; 3121 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl; 3122 cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 : 3123 urtw_8225v2_txpwr_cck; 3124 3125 for (i = 0; i < 8; i++) 3126 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]); 3127 3128 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 3129 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]); 3130 usb_pause_mtx(&sc->sc_mtx, 1); 3131 3132 /* OFDM power setting */ 3133 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 3134 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 3135 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base; 3136 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 3137 3138 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3139 if (error) 3140 goto fail; 3141 3142 urtw_8187_write_phy_ofdm(sc, 2, 0x42); 3143 urtw_8187_write_phy_ofdm(sc, 5, 0x0); 3144 urtw_8187_write_phy_ofdm(sc, 6, 0x40); 3145 urtw_8187_write_phy_ofdm(sc, 7, 0x0); 3146 urtw_8187_write_phy_ofdm(sc, 8, 0x40); 3147 3148 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 3149 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]); 3150 usb_pause_mtx(&sc->sc_mtx, 1); 3151fail: 3152 return (error); 3153} 3154 3155static usb_error_t 3156urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain) 3157{ 3158 uint8_t *gainp; 3159 usb_error_t error; 3160 3161 /* XXX for A? */ 3162 gainp = urtw_8225v2_gain_bg; 3163 urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]); 3164 usb_pause_mtx(&sc->sc_mtx, 1); 3165 urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]); 3166 usb_pause_mtx(&sc->sc_mtx, 1); 3167 urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]); 3168 usb_pause_mtx(&sc->sc_mtx, 1); 3169 urtw_8187_write_phy_ofdm(sc, 0x21, 0x17); 3170 usb_pause_mtx(&sc->sc_mtx, 1); 3171fail: 3172 return (error); 3173} 3174 3175static usb_error_t 3176urtw_8225_isv2(struct urtw_softc *sc, int *ret) 3177{ 3178 uint32_t data; 3179 usb_error_t error; 3180 3181 *ret = 1; 3182 3183 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_MAGIC5); 3184 urtw_write16_m(sc, URTW_RF_PINS_SELECT, URTW_RF_PINS_MAGIC5); 3185 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, URTW_RF_PINS_MAGIC5); 3186 usb_pause_mtx(&sc->sc_mtx, 500); 3187 3188 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 3189 URTW_8225_ADDR_0_DATA_MAGIC1); 3190 3191 error = urtw_8225_read(sc, URTW_8225_ADDR_8_MAGIC, &data); 3192 if (error != 0) 3193 goto fail; 3194 if (data != URTW_8225_ADDR_8_DATA_MAGIC1) 3195 *ret = 0; 3196 else { 3197 error = urtw_8225_read(sc, URTW_8225_ADDR_9_MAGIC, &data); 3198 if (error != 0) 3199 goto fail; 3200 if (data != URTW_8225_ADDR_9_DATA_MAGIC1) 3201 *ret = 0; 3202 } 3203 3204 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 3205 URTW_8225_ADDR_0_DATA_MAGIC2); 3206fail: 3207 return (error); 3208} 3209 3210static usb_error_t 3211urtw_8225v2b_rf_init(struct urtw_softc *sc) 3212{ 3213#define N(a) (sizeof(a) / sizeof((a)[0])) 3214 int i; 3215 uint8_t data8; 3216 usb_error_t error; 3217 3218 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3219 if (error) 3220 goto fail; 3221 3222 /* 3223 * initialize extra registers on 8187 3224 */ 3225 urtw_write16_m(sc, URTW_BRSR_8187B, 0xfff); 3226 3227 /* retry limit */ 3228 urtw_read8_m(sc, URTW_CW_CONF, &data8); 3229 data8 |= URTW_CW_CONF_PERPACKET_RETRY; 3230 urtw_write8_m(sc, URTW_CW_CONF, data8); 3231 3232 /* TX AGC */ 3233 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); 3234 data8 |= URTW_TX_AGC_CTL_PERPACKET_GAIN; 3235 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); 3236 3237 /* Auto Rate Fallback Control */ 3238#define URTW_ARFR 0x1e0 3239 urtw_write16_m(sc, URTW_ARFR, 0xfff); 3240 urtw_read8_m(sc, URTW_RATE_FALLBACK, &data8); 3241 urtw_write8_m(sc, URTW_RATE_FALLBACK, 3242 data8 | URTW_RATE_FALLBACK_ENABLE); 3243 3244 urtw_read8_m(sc, URTW_MSR, &data8); 3245 urtw_write8_m(sc, URTW_MSR, data8 & 0xf3); 3246 urtw_read8_m(sc, URTW_MSR, &data8); 3247 urtw_write8_m(sc, URTW_MSR, data8 | URTW_MSR_LINK_ENEDCA); 3248 urtw_write8_m(sc, URTW_ACM_CONTROL, sc->sc_acmctl); 3249 3250 urtw_write16_m(sc, URTW_ATIM_WND, 2); 3251 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); 3252#define URTW_FEMR_FOR_8187B 0x1d4 3253 urtw_write16_m(sc, URTW_FEMR_FOR_8187B, 0xffff); 3254 3255 /* led type */ 3256 urtw_read8_m(sc, URTW_CONFIG1, &data8); 3257 data8 = (data8 & 0x3f) | 0x80; 3258 urtw_write8_m(sc, URTW_CONFIG1, data8); 3259 3260 /* applying MAC address again. */ 3261 urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]); 3262 urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff); 3263 3264 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3265 if (error) 3266 goto fail; 3267 3268 urtw_write8_m(sc, URTW_WPA_CONFIG, 0); 3269 3270 /* 3271 * MAC configuration 3272 */ 3273 for (i = 0; i < N(urtw_8225v2b_rf_part1); i++) 3274 urtw_write8_m(sc, urtw_8225v2b_rf_part1[i].reg, 3275 urtw_8225v2b_rf_part1[i].val); 3276 urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50); 3277 urtw_write16_m(sc, URTW_INT_MIG, 0x0000); 3278 urtw_write32_m(sc, 0x1f0, 0); 3279 urtw_write32_m(sc, 0x1f4, 0); 3280 urtw_write8_m(sc, 0x1f8, 0); 3281 urtw_write32_m(sc, URTW_RF_TIMING, 0x4001); 3282 3283#define URTW_RFSW_CTRL 0x272 3284 urtw_write16_m(sc, URTW_RFSW_CTRL, 0x569a); 3285 3286 /* 3287 * initialize PHY 3288 */ 3289 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3290 if (error) 3291 goto fail; 3292 urtw_read8_m(sc, URTW_CONFIG3, &data8); 3293 urtw_write8_m(sc, URTW_CONFIG3, 3294 data8 | URTW_CONFIG3_ANAPARAM_WRITE); 3295 3296 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3297 if (error) 3298 goto fail; 3299 3300 /* setup RFE initial timing */ 3301 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480); 3302 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488); 3303 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff); 3304 usb_pause_mtx(&sc->sc_mtx, 1100); 3305 3306 for (i = 0; i < N(urtw_8225v2b_rf_part0); i++) { 3307 urtw_8225_write(sc, urtw_8225v2b_rf_part0[i].reg, 3308 urtw_8225v2b_rf_part0[i].val); 3309 usb_pause_mtx(&sc->sc_mtx, 1); 3310 } 3311 urtw_8225_write(sc, 0x00, 0x01b7); 3312 3313 for (i = 0; i < 95; i++) { 3314 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 3315 usb_pause_mtx(&sc->sc_mtx, 1); 3316 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 3317 urtw_8225v2b_rxgain[i]); 3318 usb_pause_mtx(&sc->sc_mtx, 1); 3319 } 3320 3321 urtw_8225_write(sc, URTW_8225_ADDR_3_MAGIC, 0x080); 3322 usb_pause_mtx(&sc->sc_mtx, 1); 3323 urtw_8225_write(sc, URTW_8225_ADDR_5_MAGIC, 0x004); 3324 usb_pause_mtx(&sc->sc_mtx, 1); 3325 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x0b7); 3326 usb_pause_mtx(&sc->sc_mtx, 1); 3327 usb_pause_mtx(&sc->sc_mtx, 3000); 3328 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0xc4d); 3329 usb_pause_mtx(&sc->sc_mtx, 2000); 3330 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0x44d); 3331 usb_pause_mtx(&sc->sc_mtx, 1); 3332 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x2bf); 3333 usb_pause_mtx(&sc->sc_mtx, 1); 3334 3335 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03); 3336 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07); 3337 urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03); 3338 3339 urtw_8187_write_phy_ofdm(sc, 0x80, 0x12); 3340 for (i = 0; i < 128; i++) { 3341 uint32_t addr, data; 3342 3343 data = (urtw_8225z2_agc[i] << 8) | 0x0000008f; 3344 addr = ((i + 0x80) << 8) | 0x0000008e; 3345 3346 urtw_8187_write_phy_ofdm(sc, data & 0x7f, (data >> 8) & 0xff); 3347 urtw_8187_write_phy_ofdm(sc, addr & 0x7f, (addr >> 8) & 0xff); 3348 urtw_8187_write_phy_ofdm(sc, 0x0e, 0x00); 3349 } 3350 urtw_8187_write_phy_ofdm(sc, 0x80, 0x10); 3351 3352 for (i = 0; i < N(urtw_8225v2b_rf_part2); i++) 3353 urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2b_rf_part2[i].val); 3354 3355 urtw_write32_m(sc, URTW_8187B_AC_VO, (7 << 12) | (3 << 8) | 0x1c); 3356 urtw_write32_m(sc, URTW_8187B_AC_VI, (7 << 12) | (3 << 8) | 0x1c); 3357 urtw_write32_m(sc, URTW_8187B_AC_BE, (7 << 12) | (3 << 8) | 0x1c); 3358 urtw_write32_m(sc, URTW_8187B_AC_BK, (7 << 12) | (3 << 8) | 0x1c); 3359 3360 urtw_8187_write_phy_ofdm(sc, 0x97, 0x46); 3361 urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6); 3362 urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc); 3363 urtw_8187_write_phy_cck(sc, 0xc1, 0x88); 3364 3365fail: 3366 return (error); 3367#undef N 3368} 3369 3370static usb_error_t 3371urtw_8225v2b_rf_set_chan(struct urtw_softc *sc, int chan) 3372{ 3373 usb_error_t error; 3374 3375 error = urtw_8225v2b_set_txpwrlvl(sc, chan); 3376 if (error) 3377 goto fail; 3378 3379 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 3380 usb_pause_mtx(&sc->sc_mtx, 10); 3381fail: 3382 return (error); 3383} 3384 3385static usb_error_t 3386urtw_8225v2b_set_txpwrlvl(struct urtw_softc *sc, int chan) 3387{ 3388 int i; 3389 uint8_t *cck_pwrtable; 3390 uint8_t cck_pwrlvl_max = 15; 3391 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 3392 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 3393 usb_error_t error; 3394 3395 /* CCK power setting */ 3396 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? 3397 ((sc->sc_flags & URTW_RTL8187B_REV_B) ? cck_pwrlvl_max : 22) : 3398 (cck_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 0 : 7)); 3399 cck_pwrlvl += sc->sc_txpwr_cck_base; 3400 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl; 3401 cck_pwrtable = (chan == 14) ? urtw_8225v2b_txpwr_cck_ch14 : 3402 urtw_8225v2b_txpwr_cck; 3403 3404 if (sc->sc_flags & URTW_RTL8187B_REV_B) 3405 cck_pwrtable += (cck_pwrlvl <= 6) ? 0 : 3406 ((cck_pwrlvl <= 11) ? 8 : 16); 3407 else 3408 cck_pwrtable += (cck_pwrlvl <= 5) ? 0 : 3409 ((cck_pwrlvl <= 11) ? 8 : ((cck_pwrlvl <= 17) ? 16 : 24)); 3410 3411 for (i = 0; i < 8; i++) 3412 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]); 3413 3414 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 3415 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1); 3416 usb_pause_mtx(&sc->sc_mtx, 1); 3417 3418 /* OFDM power setting */ 3419 ofdm_pwrlvl = (ofdm_pwrlvl > 15) ? 3420 ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 17 : 25) : 3421 (ofdm_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 2 : 10)); 3422 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base; 3423 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 3424 3425 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 3426 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1); 3427 3428 if (sc->sc_flags & URTW_RTL8187B_REV_B) { 3429 if (ofdm_pwrlvl <= 11) { 3430 urtw_8187_write_phy_ofdm(sc, 0x87, 0x60); 3431 urtw_8187_write_phy_ofdm(sc, 0x89, 0x60); 3432 } else { 3433 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c); 3434 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c); 3435 } 3436 } else { 3437 if (ofdm_pwrlvl <= 11) { 3438 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c); 3439 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c); 3440 } else if (ofdm_pwrlvl <= 17) { 3441 urtw_8187_write_phy_ofdm(sc, 0x87, 0x54); 3442 urtw_8187_write_phy_ofdm(sc, 0x89, 0x54); 3443 } else { 3444 urtw_8187_write_phy_ofdm(sc, 0x87, 0x50); 3445 urtw_8187_write_phy_ofdm(sc, 0x89, 0x50); 3446 } 3447 } 3448 usb_pause_mtx(&sc->sc_mtx, 1); 3449fail: 3450 return (error); 3451} 3452 3453static usb_error_t 3454urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data) 3455{ 3456 struct usb_device_request req; 3457 usb_error_t error; 3458 3459 req.bmRequestType = UT_READ_VENDOR_DEVICE; 3460 req.bRequest = URTW_8187_GETREGS_REQ; 3461 USETW(req.wValue, val | 0xfe00); 3462 USETW(req.wIndex, 0); 3463 USETW(req.wLength, sizeof(uint8_t)); 3464 3465 error = urtw_do_request(sc, &req, data); 3466 return (error); 3467} 3468 3469static usb_error_t 3470urtw_write8e(struct urtw_softc *sc, int val, uint8_t data) 3471{ 3472 struct usb_device_request req; 3473 3474 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 3475 req.bRequest = URTW_8187_SETREGS_REQ; 3476 USETW(req.wValue, val | 0xfe00); 3477 USETW(req.wIndex, 0); 3478 USETW(req.wLength, sizeof(uint8_t)); 3479 3480 return (urtw_do_request(sc, &req, &data)); 3481} 3482 3483static usb_error_t 3484urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val) 3485{ 3486 uint8_t data; 3487 usb_error_t error; 3488 3489 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3490 if (error) 3491 goto fail; 3492 3493 urtw_read8_m(sc, URTW_CONFIG3, &data); 3494 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 3495 urtw_write32_m(sc, URTW_ANAPARAM, val); 3496 urtw_read8_m(sc, URTW_CONFIG3, &data); 3497 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 3498 3499 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3500 if (error) 3501 goto fail; 3502fail: 3503 return (error); 3504} 3505 3506static usb_error_t 3507urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val) 3508{ 3509 uint8_t data; 3510 usb_error_t error; 3511 3512 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3513 if (error) 3514 goto fail; 3515 3516 urtw_read8_m(sc, URTW_CONFIG3, &data); 3517 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 3518 urtw_write32_m(sc, URTW_ANAPARAM2, val); 3519 urtw_read8_m(sc, URTW_CONFIG3, &data); 3520 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 3521 3522 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3523 if (error) 3524 goto fail; 3525fail: 3526 return (error); 3527} 3528 3529static usb_error_t 3530urtw_intr_enable(struct urtw_softc *sc) 3531{ 3532 usb_error_t error; 3533 3534 urtw_write16_m(sc, URTW_INTR_MASK, 0xffff); 3535fail: 3536 return (error); 3537} 3538 3539static usb_error_t 3540urtw_intr_disable(struct urtw_softc *sc) 3541{ 3542 usb_error_t error; 3543 3544 urtw_write16_m(sc, URTW_INTR_MASK, 0); 3545fail: 3546 return (error); 3547} 3548 3549static usb_error_t 3550urtw_reset(struct urtw_softc *sc) 3551{ 3552 uint8_t data; 3553 usb_error_t error; 3554 3555 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 3556 if (error) 3557 goto fail; 3558 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3559 if (error) 3560 goto fail; 3561 3562 error = urtw_intr_disable(sc); 3563 if (error) 3564 goto fail; 3565 usb_pause_mtx(&sc->sc_mtx, 100); 3566 3567 error = urtw_write8e(sc, 0x18, 0x10); 3568 if (error != 0) 3569 goto fail; 3570 error = urtw_write8e(sc, 0x18, 0x11); 3571 if (error != 0) 3572 goto fail; 3573 error = urtw_write8e(sc, 0x18, 0x00); 3574 if (error != 0) 3575 goto fail; 3576 usb_pause_mtx(&sc->sc_mtx, 100); 3577 3578 urtw_read8_m(sc, URTW_CMD, &data); 3579 data = (data & 0x2) | URTW_CMD_RST; 3580 urtw_write8_m(sc, URTW_CMD, data); 3581 usb_pause_mtx(&sc->sc_mtx, 100); 3582 3583 urtw_read8_m(sc, URTW_CMD, &data); 3584 if (data & URTW_CMD_RST) { 3585 device_printf(sc->sc_dev, "reset timeout\n"); 3586 goto fail; 3587 } 3588 3589 error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD); 3590 if (error) 3591 goto fail; 3592 usb_pause_mtx(&sc->sc_mtx, 100); 3593 3594 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 3595 if (error) 3596 goto fail; 3597 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3598 if (error) 3599 goto fail; 3600fail: 3601 return (error); 3602} 3603 3604static usb_error_t 3605urtw_led_ctl(struct urtw_softc *sc, int mode) 3606{ 3607 usb_error_t error = 0; 3608 3609 switch (sc->sc_strategy) { 3610 case URTW_SW_LED_MODE0: 3611 error = urtw_led_mode0(sc, mode); 3612 break; 3613 case URTW_SW_LED_MODE1: 3614 error = urtw_led_mode1(sc, mode); 3615 break; 3616 case URTW_SW_LED_MODE2: 3617 error = urtw_led_mode2(sc, mode); 3618 break; 3619 case URTW_SW_LED_MODE3: 3620 error = urtw_led_mode3(sc, mode); 3621 break; 3622 default: 3623 panic("unsupported LED mode %d\n", sc->sc_strategy); 3624 /* never reach */ 3625 } 3626 3627 return (error); 3628} 3629 3630static usb_error_t 3631urtw_led_mode0(struct urtw_softc *sc, int mode) 3632{ 3633 3634 switch (mode) { 3635 case URTW_LED_CTL_POWER_ON: 3636 sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK; 3637 break; 3638 case URTW_LED_CTL_TX: 3639 if (sc->sc_gpio_ledinprogress == 1) 3640 return (0); 3641 3642 sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL; 3643 sc->sc_gpio_blinktime = 2; 3644 break; 3645 case URTW_LED_CTL_LINK: 3646 sc->sc_gpio_ledstate = URTW_LED_ON; 3647 break; 3648 default: 3649 panic("unsupported LED mode 0x%x", mode); 3650 /* never reach */ 3651 } 3652 3653 switch (sc->sc_gpio_ledstate) { 3654 case URTW_LED_ON: 3655 if (sc->sc_gpio_ledinprogress != 0) 3656 break; 3657 urtw_led_on(sc, URTW_LED_GPIO); 3658 break; 3659 case URTW_LED_BLINK_NORMAL: 3660 if (sc->sc_gpio_ledinprogress != 0) 3661 break; 3662 sc->sc_gpio_ledinprogress = 1; 3663 sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ? 3664 URTW_LED_OFF : URTW_LED_ON; 3665 usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc); 3666 break; 3667 case URTW_LED_POWER_ON_BLINK: 3668 urtw_led_on(sc, URTW_LED_GPIO); 3669 usb_pause_mtx(&sc->sc_mtx, 100); 3670 urtw_led_off(sc, URTW_LED_GPIO); 3671 break; 3672 default: 3673 panic("unknown LED status 0x%x", sc->sc_gpio_ledstate); 3674 /* never reach */ 3675 } 3676 return (0); 3677} 3678 3679static usb_error_t 3680urtw_led_mode1(struct urtw_softc *sc, int mode) 3681{ 3682 3683 return (USB_ERR_INVAL); 3684} 3685 3686static usb_error_t 3687urtw_led_mode2(struct urtw_softc *sc, int mode) 3688{ 3689 3690 return (USB_ERR_INVAL); 3691} 3692 3693static usb_error_t 3694urtw_led_mode3(struct urtw_softc *sc, int mode) 3695{ 3696 3697 return (USB_ERR_INVAL); 3698} 3699 3700static usb_error_t 3701urtw_led_on(struct urtw_softc *sc, int type) 3702{ 3703 usb_error_t error; 3704 3705 if (type == URTW_LED_GPIO) { 3706 switch (sc->sc_gpio_ledpin) { 3707 case URTW_LED_PIN_GPIO0: 3708 urtw_write8_m(sc, URTW_GPIO, 0x01); 3709 urtw_write8_m(sc, URTW_GP_ENABLE, 0x00); 3710 break; 3711 default: 3712 panic("unsupported LED PIN type 0x%x", 3713 sc->sc_gpio_ledpin); 3714 /* never reach */ 3715 } 3716 } else { 3717 panic("unsupported LED type 0x%x", type); 3718 /* never reach */ 3719 } 3720 3721 sc->sc_gpio_ledon = 1; 3722fail: 3723 return (error); 3724} 3725 3726static usb_error_t 3727urtw_led_off(struct urtw_softc *sc, int type) 3728{ 3729 usb_error_t error; 3730 3731 if (type == URTW_LED_GPIO) { 3732 switch (sc->sc_gpio_ledpin) { 3733 case URTW_LED_PIN_GPIO0: 3734 urtw_write8_m(sc, URTW_GPIO, URTW_GPIO_DATA_MAGIC1); 3735 urtw_write8_m(sc, 3736 URTW_GP_ENABLE, URTW_GP_ENABLE_DATA_MAGIC1); 3737 break; 3738 default: 3739 panic("unsupported LED PIN type 0x%x", 3740 sc->sc_gpio_ledpin); 3741 /* never reach */ 3742 } 3743 } else { 3744 panic("unsupported LED type 0x%x", type); 3745 /* never reach */ 3746 } 3747 3748 sc->sc_gpio_ledon = 0; 3749 3750fail: 3751 return (error); 3752} 3753 3754static void 3755urtw_led_ch(void *arg) 3756{ 3757 struct urtw_softc *sc = arg; 3758 struct ifnet *ifp = sc->sc_ifp; 3759 struct ieee80211com *ic = ifp->if_l2com; 3760 3761 ieee80211_runtask(ic, &sc->sc_led_task); 3762} 3763 3764static void 3765urtw_ledtask(void *arg, int pending) 3766{ 3767 struct urtw_softc *sc = arg; 3768 3769 if (sc->sc_strategy != URTW_SW_LED_MODE0) 3770 panic("could not process a LED strategy 0x%x", sc->sc_strategy); 3771 3772 URTW_LOCK(sc); 3773 urtw_led_blink(sc); 3774 URTW_UNLOCK(sc); 3775} 3776 3777static usb_error_t 3778urtw_led_blink(struct urtw_softc *sc) 3779{ 3780 uint8_t ing = 0; 3781 usb_error_t error; 3782 3783 if (sc->sc_gpio_blinkstate == URTW_LED_ON) 3784 error = urtw_led_on(sc, URTW_LED_GPIO); 3785 else 3786 error = urtw_led_off(sc, URTW_LED_GPIO); 3787 sc->sc_gpio_blinktime--; 3788 if (sc->sc_gpio_blinktime == 0) 3789 ing = 1; 3790 else { 3791 if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL && 3792 sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY && 3793 sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3) 3794 ing = 1; 3795 } 3796 if (ing == 1) { 3797 if (sc->sc_gpio_ledstate == URTW_LED_ON && 3798 sc->sc_gpio_ledon == 0) 3799 error = urtw_led_on(sc, URTW_LED_GPIO); 3800 else if (sc->sc_gpio_ledstate == URTW_LED_OFF && 3801 sc->sc_gpio_ledon == 1) 3802 error = urtw_led_off(sc, URTW_LED_GPIO); 3803 3804 sc->sc_gpio_blinktime = 0; 3805 sc->sc_gpio_ledinprogress = 0; 3806 return (0); 3807 } 3808 3809 sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ? 3810 URTW_LED_ON : URTW_LED_OFF; 3811 3812 switch (sc->sc_gpio_ledstate) { 3813 case URTW_LED_BLINK_NORMAL: 3814 usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc); 3815 break; 3816 default: 3817 panic("unknown LED status 0x%x", sc->sc_gpio_ledstate); 3818 /* never reach */ 3819 } 3820 return (0); 3821} 3822 3823static usb_error_t 3824urtw_rx_enable(struct urtw_softc *sc) 3825{ 3826 uint8_t data; 3827 usb_error_t error; 3828 3829 usbd_transfer_start((sc->sc_flags & URTW_RTL8187B) ? 3830 sc->sc_xfer[URTW_8187B_BULK_RX] : sc->sc_xfer[URTW_8187L_BULK_RX]); 3831 3832 error = urtw_rx_setconf(sc); 3833 if (error != 0) 3834 goto fail; 3835 3836 if ((sc->sc_flags & URTW_RTL8187B) == 0) { 3837 urtw_read8_m(sc, URTW_CMD, &data); 3838 urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE); 3839 } 3840fail: 3841 return (error); 3842} 3843 3844static usb_error_t 3845urtw_tx_enable(struct urtw_softc *sc) 3846{ 3847 uint8_t data8; 3848 uint32_t data; 3849 usb_error_t error; 3850 3851 if (sc->sc_flags & URTW_RTL8187B) { 3852 urtw_read32_m(sc, URTW_TX_CONF, &data); 3853 data &= ~URTW_TX_LOOPBACK_MASK; 3854 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK); 3855 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK); 3856 data &= ~URTW_TX_SWPLCPLEN; 3857 data |= URTW_TX_HW_SEQNUM | URTW_TX_DISREQQSIZE | 3858 (7 << 8) | /* short retry limit */ 3859 (7 << 0) | /* long retry limit */ 3860 (7 << 21); /* MAX TX DMA */ 3861 urtw_write32_m(sc, URTW_TX_CONF, data); 3862 3863 urtw_read8_m(sc, URTW_MSR, &data8); 3864 data8 |= URTW_MSR_LINK_ENEDCA; 3865 urtw_write8_m(sc, URTW_MSR, data8); 3866 return (error); 3867 } 3868 3869 urtw_read8_m(sc, URTW_CW_CONF, &data8); 3870 data8 &= ~(URTW_CW_CONF_PERPACKET_CW | URTW_CW_CONF_PERPACKET_RETRY); 3871 urtw_write8_m(sc, URTW_CW_CONF, data8); 3872 3873 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); 3874 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN; 3875 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL; 3876 data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT; 3877 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); 3878 3879 urtw_read32_m(sc, URTW_TX_CONF, &data); 3880 data &= ~URTW_TX_LOOPBACK_MASK; 3881 data |= URTW_TX_LOOPBACK_NONE; 3882 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK); 3883 data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT; 3884 data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT; 3885 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK); 3886 data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW; 3887 data &= ~URTW_TX_SWPLCPLEN; 3888 data |= URTW_TX_NOICV; 3889 urtw_write32_m(sc, URTW_TX_CONF, data); 3890 3891 urtw_read8_m(sc, URTW_CMD, &data8); 3892 urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE); 3893fail: 3894 return (error); 3895} 3896 3897static usb_error_t 3898urtw_rx_setconf(struct urtw_softc *sc) 3899{ 3900 struct ifnet *ifp = sc->sc_ifp; 3901 struct ieee80211com *ic = ifp->if_l2com; 3902 uint32_t data; 3903 usb_error_t error; 3904 3905 urtw_read32_m(sc, URTW_RX, &data); 3906 data = data &~ URTW_RX_FILTER_MASK; 3907 if (sc->sc_flags & URTW_RTL8187B) { 3908 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA | 3909 URTW_RX_FILTER_MCAST | URTW_RX_FILTER_BCAST | 3910 URTW_RX_FILTER_NICMAC | URTW_RX_CHECK_BSSID | 3911 URTW_RX_FIFO_THRESHOLD_NONE | 3912 URTW_MAX_RX_DMA_2048 | 3913 URTW_RX_AUTORESETPHY | URTW_RCR_ONLYERLPKT; 3914 } else { 3915 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA; 3916 data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST; 3917 3918 if (ic->ic_opmode == IEEE80211_M_MONITOR) { 3919 data = data | URTW_RX_FILTER_ICVERR; 3920 data = data | URTW_RX_FILTER_PWR; 3921 } 3922 if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR) 3923 data = data | URTW_RX_FILTER_CRCERR; 3924 3925 if (ic->ic_opmode == IEEE80211_M_MONITOR || 3926 (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC))) { 3927 data = data | URTW_RX_FILTER_ALLMAC; 3928 } else { 3929 data = data | URTW_RX_FILTER_NICMAC; 3930 data = data | URTW_RX_CHECK_BSSID; 3931 } 3932 3933 data = data &~ URTW_RX_FIFO_THRESHOLD_MASK; 3934 data = data | URTW_RX_FIFO_THRESHOLD_NONE | 3935 URTW_RX_AUTORESETPHY; 3936 data = data &~ URTW_MAX_RX_DMA_MASK; 3937 data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT; 3938 } 3939 3940 urtw_write32_m(sc, URTW_RX, data); 3941fail: 3942 return (error); 3943} 3944 3945static struct mbuf * 3946urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p, 3947 int8_t *nf_p) 3948{ 3949 int actlen, flen, rssi; 3950 struct ieee80211_frame *wh; 3951 struct mbuf *m, *mnew; 3952 struct urtw_softc *sc = data->sc; 3953 struct ifnet *ifp = sc->sc_ifp; 3954 struct ieee80211com *ic = ifp->if_l2com; 3955 uint8_t noise = 0, rate; 3956 3957 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); 3958 3959 if (actlen < URTW_MIN_RXBUFSZ) { 3960 ifp->if_ierrors++; 3961 return (NULL); 3962 } 3963 3964 if (sc->sc_flags & URTW_RTL8187B) { 3965 struct urtw_8187b_rxhdr *rx; 3966 3967 rx = (struct urtw_8187b_rxhdr *)(data->buf + 3968 (actlen - (sizeof(struct urtw_8187b_rxhdr)))); 3969 flen = le32toh(rx->flag) & 0xfff; 3970 if (flen > actlen) { 3971 ifp->if_ierrors++; 3972 return (NULL); 3973 } 3974 rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf; 3975 /* XXX correct? */ 3976 rssi = rx->rssi & URTW_RX_RSSI_MASK; 3977 noise = rx->noise; 3978 } else { 3979 struct urtw_8187l_rxhdr *rx; 3980 3981 rx = (struct urtw_8187l_rxhdr *)(data->buf + 3982 (actlen - (sizeof(struct urtw_8187l_rxhdr)))); 3983 flen = le32toh(rx->flag) & 0xfff; 3984 if (flen > actlen) { 3985 ifp->if_ierrors++; 3986 return (NULL); 3987 } 3988 3989 rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf; 3990 /* XXX correct? */ 3991 rssi = rx->rssi & URTW_RX_8187L_RSSI_MASK; 3992 noise = rx->noise; 3993 } 3994 3995 mnew = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); 3996 if (mnew == NULL) { 3997 ifp->if_ierrors++; 3998 return (NULL); 3999 } 4000 4001 m = data->m; 4002 data->m = mnew; 4003 data->buf = mtod(mnew, uint8_t *); 4004 4005 /* finalize mbuf */ 4006 m->m_pkthdr.rcvif = ifp; 4007 m->m_pkthdr.len = m->m_len = flen - IEEE80211_CRC_LEN; 4008 4009 if (ieee80211_radiotap_active(ic)) { 4010 struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap; 4011 4012 /* XXX Are variables correct? */ 4013 tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq); 4014 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); 4015 tap->wr_dbm_antsignal = (int8_t)rssi; 4016 } 4017 4018 wh = mtod(m, struct ieee80211_frame *); 4019 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) 4020 sc->sc_currate = (rate > 0) ? rate : sc->sc_currate; 4021 4022 *rssi_p = rssi; 4023 *nf_p = noise; /* XXX correct? */ 4024 4025 return (m); 4026} 4027 4028static void 4029urtw_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error) 4030{ 4031 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4032 struct ifnet *ifp = sc->sc_ifp; 4033 struct ieee80211com *ic = ifp->if_l2com; 4034 struct ieee80211_frame *wh; 4035 struct ieee80211_node *ni; 4036 struct mbuf *m = NULL; 4037 struct urtw_data *data; 4038 int8_t nf = -95; 4039 int rssi = 1; 4040 4041 URTW_ASSERT_LOCKED(sc); 4042 4043 switch (USB_GET_STATE(xfer)) { 4044 case USB_ST_TRANSFERRED: 4045 data = STAILQ_FIRST(&sc->sc_rx_active); 4046 if (data == NULL) 4047 goto setup; 4048 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); 4049 m = urtw_rxeof(xfer, data, &rssi, &nf); 4050 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); 4051 /* FALLTHROUGH */ 4052 case USB_ST_SETUP: 4053setup: 4054 data = STAILQ_FIRST(&sc->sc_rx_inactive); 4055 if (data == NULL) { 4056 KASSERT(m == NULL, ("mbuf isn't NULL")); 4057 return; 4058 } 4059 STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next); 4060 STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next); 4061 usbd_xfer_set_frame_data(xfer, 0, data->buf, 4062 usbd_xfer_max_len(xfer)); 4063 usbd_transfer_submit(xfer); 4064 4065 /* 4066 * To avoid LOR we should unlock our private mutex here to call 4067 * ieee80211_input() because here is at the end of a USB 4068 * callback and safe to unlock. 4069 */ 4070 URTW_UNLOCK(sc); 4071 if (m != NULL) { 4072 wh = mtod(m, struct ieee80211_frame *); 4073 ni = ieee80211_find_rxnode(ic, 4074 (struct ieee80211_frame_min *)wh); 4075 if (ni != NULL) { 4076 (void) ieee80211_input(ni, m, rssi, nf); 4077 /* node is no longer needed */ 4078 ieee80211_free_node(ni); 4079 } else 4080 (void) ieee80211_input_all(ic, m, rssi, nf); 4081 m = NULL; 4082 } 4083 URTW_LOCK(sc); 4084 break; 4085 default: 4086 /* needs it to the inactive queue due to a error. */ 4087 data = STAILQ_FIRST(&sc->sc_rx_active); 4088 if (data != NULL) { 4089 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); 4090 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); 4091 } 4092 if (error != USB_ERR_CANCELLED) { 4093 usbd_xfer_set_stall(xfer); 4094 ifp->if_ierrors++; 4095 goto setup; 4096 } 4097 break; 4098 } 4099} 4100 4101#define URTW_STATUS_TYPE_TXCLOSE 1 4102#define URTW_STATUS_TYPE_BEACON_INTR 0 4103 4104static void 4105urtw_txstatus_eof(struct usb_xfer *xfer) 4106{ 4107 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4108 struct ifnet *ifp = sc->sc_ifp; 4109 int actlen, type, pktretry, seq; 4110 uint64_t val; 4111 4112 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); 4113 4114 if (actlen != sizeof(uint64_t)) 4115 return; 4116 4117 val = le64toh(sc->sc_txstatus); 4118 type = (val >> 30) & 0x3; 4119 if (type == URTW_STATUS_TYPE_TXCLOSE) { 4120 pktretry = val & 0xff; 4121 seq = (val >> 16) & 0xff; 4122 if (pktretry == URTW_TX_MAXRETRY) 4123 ifp->if_oerrors++; 4124 DPRINTF(sc, URTW_DEBUG_TXSTATUS, "pktretry %d seq %#x\n", 4125 pktretry, seq); 4126 } 4127} 4128 4129static void 4130urtw_bulk_tx_status_callback(struct usb_xfer *xfer, usb_error_t error) 4131{ 4132 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4133 struct ifnet *ifp = sc->sc_ifp; 4134 4135 URTW_ASSERT_LOCKED(sc); 4136 4137 switch (USB_GET_STATE(xfer)) { 4138 case USB_ST_TRANSFERRED: 4139 urtw_txstatus_eof(xfer); 4140 /* FALLTHROUGH */ 4141 case USB_ST_SETUP: 4142setup: 4143 usbd_xfer_set_frame_data(xfer, 0, &sc->sc_txstatus, 4144 sizeof(int64_t)); 4145 usbd_transfer_submit(xfer); 4146 break; 4147 default: 4148 if (error != USB_ERR_CANCELLED) { 4149 usbd_xfer_set_stall(xfer); 4150 ifp->if_ierrors++; 4151 goto setup; 4152 } 4153 break; 4154 } 4155} 4156 4157static void 4158urtw_txeof(struct usb_xfer *xfer, struct urtw_data *data) 4159{ 4160 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4161 struct ifnet *ifp = sc->sc_ifp; 4162 struct mbuf *m; 4163 4164 URTW_ASSERT_LOCKED(sc); 4165 4166 /* 4167 * Do any tx complete callback. Note this must be done before releasing 4168 * the node reference. 4169 */ 4170 if (data->m) { 4171 m = data->m; 4172 if (m->m_flags & M_TXCB) { 4173 /* XXX status? */ 4174 ieee80211_process_callback(data->ni, m, 0); 4175 } 4176 m_freem(m); 4177 data->m = NULL; 4178 } 4179 if (data->ni) { 4180 ieee80211_free_node(data->ni); 4181 data->ni = NULL; 4182 } 4183 sc->sc_txtimer = 0; 4184 ifp->if_opackets++; 4185 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 4186} 4187 4188static void 4189urtw_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error) 4190{ 4191 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4192 struct ifnet *ifp = sc->sc_ifp; 4193 struct urtw_data *data; 4194 4195 URTW_ASSERT_LOCKED(sc); 4196 4197 switch (USB_GET_STATE(xfer)) { 4198 case USB_ST_TRANSFERRED: 4199 data = STAILQ_FIRST(&sc->sc_tx_active); 4200 if (data == NULL) 4201 goto setup; 4202 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next); 4203 urtw_txeof(xfer, data); 4204 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next); 4205 /* FALLTHROUGH */ 4206 case USB_ST_SETUP: 4207setup: 4208 data = STAILQ_FIRST(&sc->sc_tx_pending); 4209 if (data == NULL) { 4210 DPRINTF(sc, URTW_DEBUG_XMIT, 4211 "%s: empty pending queue\n", __func__); 4212 return; 4213 } 4214 STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next); 4215 STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next); 4216 4217 usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen); 4218 usbd_transfer_submit(xfer); 4219 4220 URTW_UNLOCK(sc); 4221 urtw_start(ifp); 4222 URTW_LOCK(sc); 4223 break; 4224 default: 4225 data = STAILQ_FIRST(&sc->sc_tx_active); 4226 if (data == NULL) 4227 goto setup; 4228 if (data->ni != NULL) { 4229 ieee80211_free_node(data->ni); 4230 data->ni = NULL; 4231 ifp->if_oerrors++; 4232 } 4233 if (error != USB_ERR_CANCELLED) { 4234 usbd_xfer_set_stall(xfer); 4235 goto setup; 4236 } 4237 break; 4238 } 4239} 4240 4241static struct urtw_data * 4242_urtw_getbuf(struct urtw_softc *sc) 4243{ 4244 struct urtw_data *bf; 4245 4246 bf = STAILQ_FIRST(&sc->sc_tx_inactive); 4247 if (bf != NULL) 4248 STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next); 4249 else 4250 bf = NULL; 4251 if (bf == NULL) 4252 DPRINTF(sc, URTW_DEBUG_XMIT, "%s: %s\n", __func__, 4253 "out of xmit buffers"); 4254 return (bf); 4255} 4256 4257static struct urtw_data * 4258urtw_getbuf(struct urtw_softc *sc) 4259{ 4260 struct urtw_data *bf; 4261 4262 URTW_ASSERT_LOCKED(sc); 4263 4264 bf = _urtw_getbuf(sc); 4265 if (bf == NULL) { 4266 struct ifnet *ifp = sc->sc_ifp; 4267 4268 DPRINTF(sc, URTW_DEBUG_XMIT, "%s: stop queue\n", __func__); 4269 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 4270 } 4271 return (bf); 4272} 4273 4274static int 4275urtw_isbmode(uint16_t rate) 4276{ 4277 4278 return ((rate <= 22 && rate != 12 && rate != 18) || 4279 rate == 44) ? (1) : (0); 4280} 4281 4282static uint16_t 4283urtw_rate2dbps(uint16_t rate) 4284{ 4285 4286 switch(rate) { 4287 case 12: 4288 case 18: 4289 case 24: 4290 case 36: 4291 case 48: 4292 case 72: 4293 case 96: 4294 case 108: 4295 return (rate * 2); 4296 default: 4297 break; 4298 } 4299 return (24); 4300} 4301 4302static int 4303urtw_compute_txtime(uint16_t framelen, uint16_t rate, 4304 uint8_t ismgt, uint8_t isshort) 4305{ 4306 uint16_t ceiling, frametime, n_dbps; 4307 4308 if (urtw_isbmode(rate)) { 4309 if (ismgt || !isshort || rate == 2) 4310 frametime = (uint16_t)(144 + 48 + 4311 (framelen * 8 / (rate / 2))); 4312 else 4313 frametime = (uint16_t)(72 + 24 + 4314 (framelen * 8 / (rate / 2))); 4315 if ((framelen * 8 % (rate / 2)) != 0) 4316 frametime++; 4317 } else { 4318 n_dbps = urtw_rate2dbps(rate); 4319 ceiling = (16 + 8 * framelen + 6) / n_dbps 4320 + (((16 + 8 * framelen + 6) % n_dbps) ? 1 : 0); 4321 frametime = (uint16_t)(16 + 4 + 4 * ceiling + 6); 4322 } 4323 return (frametime); 4324} 4325 4326/* 4327 * Callback from the 802.11 layer to update the 4328 * slot time based on the current setting. 4329 */ 4330static void 4331urtw_updateslot(struct ifnet *ifp) 4332{ 4333 struct urtw_softc *sc = ifp->if_softc; 4334 struct ieee80211com *ic = ifp->if_l2com; 4335 4336 ieee80211_runtask(ic, &sc->sc_updateslot_task); 4337} 4338 4339static void 4340urtw_updateslottask(void *arg, int pending) 4341{ 4342 struct urtw_softc *sc = arg; 4343 struct ifnet *ifp = sc->sc_ifp; 4344 struct ieee80211com *ic = ifp->if_l2com; 4345 int error; 4346 4347 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 4348 return; 4349 4350 URTW_LOCK(sc); 4351 if (sc->sc_flags & URTW_RTL8187B) { 4352 urtw_write8_m(sc, URTW_SIFS, 0x22); 4353 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) 4354 urtw_write8_m(sc, URTW_SLOT, 0x9); 4355 else 4356 urtw_write8_m(sc, URTW_SLOT, 0x14); 4357 urtw_write8_m(sc, URTW_8187B_EIFS, 0x5b); 4358 urtw_write8_m(sc, URTW_CARRIER_SCOUNT, 0x5b); 4359 } else { 4360 urtw_write8_m(sc, URTW_SIFS, 0x22); 4361 if (sc->sc_state == IEEE80211_S_ASSOC && 4362 ic->ic_flags & IEEE80211_F_SHSLOT) 4363 urtw_write8_m(sc, URTW_SLOT, 0x9); 4364 else 4365 urtw_write8_m(sc, URTW_SLOT, 0x14); 4366 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) { 4367 urtw_write8_m(sc, URTW_DIFS, 0x14); 4368 urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14); 4369 urtw_write8_m(sc, URTW_CW_VAL, 0x73); 4370 } else { 4371 urtw_write8_m(sc, URTW_DIFS, 0x24); 4372 urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24); 4373 urtw_write8_m(sc, URTW_CW_VAL, 0xa5); 4374 } 4375 } 4376fail: 4377 URTW_UNLOCK(sc); 4378} 4379 4380static void 4381urtw_sysctl_node(struct urtw_softc *sc) 4382{ 4383#define URTW_SYSCTL_STAT_ADD32(c, h, n, p, d) \ 4384 SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d) 4385 struct sysctl_ctx_list *ctx; 4386 struct sysctl_oid_list *child, *parent; 4387 struct sysctl_oid *tree; 4388 struct urtw_stats *stats = &sc->sc_stats; 4389 4390 ctx = device_get_sysctl_ctx(sc->sc_dev); 4391 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); 4392 4393 tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD, 4394 NULL, "URTW statistics"); 4395 parent = SYSCTL_CHILDREN(tree); 4396 4397 /* Tx statistics. */ 4398 tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD, 4399 NULL, "Tx MAC statistics"); 4400 child = SYSCTL_CHILDREN(tree); 4401 URTW_SYSCTL_STAT_ADD32(ctx, child, "1m", &stats->txrates[0], 4402 "1 Mbit/s"); 4403 URTW_SYSCTL_STAT_ADD32(ctx, child, "2m", &stats->txrates[1], 4404 "2 Mbit/s"); 4405 URTW_SYSCTL_STAT_ADD32(ctx, child, "5.5m", &stats->txrates[2], 4406 "5.5 Mbit/s"); 4407 URTW_SYSCTL_STAT_ADD32(ctx, child, "6m", &stats->txrates[4], 4408 "6 Mbit/s"); 4409 URTW_SYSCTL_STAT_ADD32(ctx, child, "9m", &stats->txrates[5], 4410 "9 Mbit/s"); 4411 URTW_SYSCTL_STAT_ADD32(ctx, child, "11m", &stats->txrates[3], 4412 "11 Mbit/s"); 4413 URTW_SYSCTL_STAT_ADD32(ctx, child, "12m", &stats->txrates[6], 4414 "12 Mbit/s"); 4415 URTW_SYSCTL_STAT_ADD32(ctx, child, "18m", &stats->txrates[7], 4416 "18 Mbit/s"); 4417 URTW_SYSCTL_STAT_ADD32(ctx, child, "24m", &stats->txrates[8], 4418 "24 Mbit/s"); 4419 URTW_SYSCTL_STAT_ADD32(ctx, child, "36m", &stats->txrates[9], 4420 "36 Mbit/s"); 4421 URTW_SYSCTL_STAT_ADD32(ctx, child, "48m", &stats->txrates[10], 4422 "48 Mbit/s"); 4423 URTW_SYSCTL_STAT_ADD32(ctx, child, "54m", &stats->txrates[11], 4424 "54 Mbit/s"); 4425#undef URTW_SYSCTL_STAT_ADD32 4426} 4427 4428static device_method_t urtw_methods[] = { 4429 DEVMETHOD(device_probe, urtw_match), 4430 DEVMETHOD(device_attach, urtw_attach), 4431 DEVMETHOD(device_detach, urtw_detach), 4432 { 0, 0 } 4433}; 4434static driver_t urtw_driver = { 4435 "urtw", 4436 urtw_methods, 4437 sizeof(struct urtw_softc) 4438}; 4439static devclass_t urtw_devclass; 4440 4441DRIVER_MODULE(urtw, uhub, urtw_driver, urtw_devclass, NULL, 0); 4442MODULE_DEPEND(urtw, wlan, 1, 1, 1); 4443MODULE_DEPEND(urtw, usb, 1, 1, 1);
| 19#include <sys/param.h> 20#include <sys/sockio.h> 21#include <sys/sysctl.h> 22#include <sys/lock.h> 23#include <sys/mutex.h> 24#include <sys/mbuf.h> 25#include <sys/kernel.h> 26#include <sys/socket.h> 27#include <sys/systm.h> 28#include <sys/malloc.h> 29#include <sys/module.h> 30#include <sys/bus.h> 31#include <sys/endian.h> 32#include <sys/kdb.h> 33 34#include <machine/bus.h> 35#include <machine/resource.h> 36#include <sys/rman.h> 37 38#include <net/if.h> 39#include <net/if_arp.h> 40#include <net/ethernet.h> 41#include <net/if_dl.h> 42#include <net/if_media.h> 43#include <net/if_types.h> 44 45#ifdef INET 46#include <netinet/in.h> 47#include <netinet/in_systm.h> 48#include <netinet/in_var.h> 49#include <netinet/if_ether.h> 50#include <netinet/ip.h> 51#endif 52 53#include <net80211/ieee80211_var.h> 54#include <net80211/ieee80211_regdomain.h> 55#include <net80211/ieee80211_radiotap.h> 56 57#include <dev/usb/usb.h> 58#include <dev/usb/usbdi.h> 59#include "usbdevs.h" 60 61#include <dev/usb/wlan/if_urtwreg.h> 62#include <dev/usb/wlan/if_urtwvar.h> 63 64SYSCTL_NODE(_hw_usb, OID_AUTO, urtw, CTLFLAG_RW, 0, "USB Realtek 8187L"); 65#ifdef URTW_DEBUG 66int urtw_debug = 0; 67SYSCTL_INT(_hw_usb_urtw, OID_AUTO, debug, CTLFLAG_RW, &urtw_debug, 0, 68 "control debugging printfs"); 69TUNABLE_INT("hw.usb.urtw.debug", &urtw_debug); 70enum { 71 URTW_DEBUG_XMIT = 0x00000001, /* basic xmit operation */ 72 URTW_DEBUG_RECV = 0x00000002, /* basic recv operation */ 73 URTW_DEBUG_RESET = 0x00000004, /* reset processing */ 74 URTW_DEBUG_TX_PROC = 0x00000008, /* tx ISR proc */ 75 URTW_DEBUG_RX_PROC = 0x00000010, /* rx ISR proc */ 76 URTW_DEBUG_STATE = 0x00000020, /* 802.11 state transitions */ 77 URTW_DEBUG_STAT = 0x00000040, /* statistic */ 78 URTW_DEBUG_INIT = 0x00000080, /* initialization of dev */ 79 URTW_DEBUG_TXSTATUS = 0x00000100, /* tx status */ 80 URTW_DEBUG_ANY = 0xffffffff 81}; 82#define DPRINTF(sc, m, fmt, ...) do { \ 83 if (sc->sc_debug & (m)) \ 84 printf(fmt, __VA_ARGS__); \ 85} while (0) 86#else 87#define DPRINTF(sc, m, fmt, ...) do { \ 88 (void) sc; \ 89} while (0) 90#endif 91static int urtw_preamble_mode = URTW_PREAMBLE_MODE_LONG; 92SYSCTL_INT(_hw_usb_urtw, OID_AUTO, preamble_mode, CTLFLAG_RW, 93 &urtw_preamble_mode, 0, "set the preable mode (long or short)"); 94TUNABLE_INT("hw.usb.urtw.preamble_mode", &urtw_preamble_mode); 95 96/* recognized device vendors/products */ 97#define urtw_lookup(v, p) \ 98 ((const struct urtw_type *)usb_lookup(urtw_devs, v, p)) 99#define URTW_DEV_B(v,p) \ 100 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187B) } 101#define URTW_DEV_L(v,p) \ 102 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187L) } 103#define URTW_REV_RTL8187B 0 104#define URTW_REV_RTL8187L 1 105static const struct usb_device_id urtw_devs[] = { 106 URTW_DEV_B(NETGEAR, WG111V3), 107 URTW_DEV_B(REALTEK, RTL8187B_0), 108 URTW_DEV_B(REALTEK, RTL8187B_1), 109 URTW_DEV_B(REALTEK, RTL8187B_2), 110 URTW_DEV_B(SITECOMEU, WL168V4), 111 URTW_DEV_L(ASUS, P5B_WIFI), 112 URTW_DEV_L(BELKIN, F5D7050E), 113 URTW_DEV_L(LINKSYS4, WUSB54GCV2), 114 URTW_DEV_L(NETGEAR, WG111V2), 115 URTW_DEV_L(REALTEK, RTL8187), 116 URTW_DEV_L(SITECOMEU, WL168V1), 117 URTW_DEV_L(SURECOM, EP9001G2A), 118 { USB_VPI(0x1b75, 0x8187, URTW_REV_RTL8187L) }, 119 { USB_VPI(USB_VENDOR_DICKSMITH, 0x9401, URTW_REV_RTL8187L) }, 120 { USB_VPI(USB_VENDOR_HP, 0xca02, URTW_REV_RTL8187L) }, 121 { USB_VPI(USB_VENDOR_LOGITEC, 0x010c, URTW_REV_RTL8187L) }, 122 { USB_VPI(USB_VENDOR_NETGEAR, 0x6100, URTW_REV_RTL8187L) }, 123 { USB_VPI(USB_VENDOR_SPHAIRON, 0x0150, URTW_REV_RTL8187L) }, 124 { USB_VPI(USB_VENDOR_QCOM, 0x6232, URTW_REV_RTL8187L) }, 125#undef URTW_DEV_L 126#undef URTW_DEV_B 127}; 128 129#define urtw_read8_m(sc, val, data) do { \ 130 error = urtw_read8_c(sc, val, data); \ 131 if (error != 0) \ 132 goto fail; \ 133} while (0) 134#define urtw_write8_m(sc, val, data) do { \ 135 error = urtw_write8_c(sc, val, data); \ 136 if (error != 0) \ 137 goto fail; \ 138} while (0) 139#define urtw_read16_m(sc, val, data) do { \ 140 error = urtw_read16_c(sc, val, data); \ 141 if (error != 0) \ 142 goto fail; \ 143} while (0) 144#define urtw_write16_m(sc, val, data) do { \ 145 error = urtw_write16_c(sc, val, data); \ 146 if (error != 0) \ 147 goto fail; \ 148} while (0) 149#define urtw_read32_m(sc, val, data) do { \ 150 error = urtw_read32_c(sc, val, data); \ 151 if (error != 0) \ 152 goto fail; \ 153} while (0) 154#define urtw_write32_m(sc, val, data) do { \ 155 error = urtw_write32_c(sc, val, data); \ 156 if (error != 0) \ 157 goto fail; \ 158} while (0) 159#define urtw_8187_write_phy_ofdm(sc, val, data) do { \ 160 error = urtw_8187_write_phy_ofdm_c(sc, val, data); \ 161 if (error != 0) \ 162 goto fail; \ 163} while (0) 164#define urtw_8187_write_phy_cck(sc, val, data) do { \ 165 error = urtw_8187_write_phy_cck_c(sc, val, data); \ 166 if (error != 0) \ 167 goto fail; \ 168} while (0) 169#define urtw_8225_write(sc, val, data) do { \ 170 error = urtw_8225_write_c(sc, val, data); \ 171 if (error != 0) \ 172 goto fail; \ 173} while (0) 174 175struct urtw_pair { 176 uint32_t reg; 177 uint32_t val; 178}; 179 180static uint8_t urtw_8225_agc[] = { 181 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9c, 0x9b, 182 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90, 183 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85, 184 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 185 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f, 186 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 187 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19, 188 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e, 189 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 190 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 191 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 192 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 193}; 194 195static uint8_t urtw_8225z2_agc[] = { 196 0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57, 0x55, 0x53, 0x51, 197 0x4f, 0x4d, 0x4b, 0x49, 0x47, 0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 198 0x39, 0x37, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 0x25, 199 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x13, 0x11, 0x0f, 200 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 201 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x19, 0x19, 202 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x20, 0x21, 0x22, 0x23, 203 0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2a, 204 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d, 205 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x31, 0x31, 206 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 207 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31 208}; 209 210static uint32_t urtw_8225_channel[] = { 211 0x0000, /* dummy channel 0 */ 212 0x085c, /* 1 */ 213 0x08dc, /* 2 */ 214 0x095c, /* 3 */ 215 0x09dc, /* 4 */ 216 0x0a5c, /* 5 */ 217 0x0adc, /* 6 */ 218 0x0b5c, /* 7 */ 219 0x0bdc, /* 8 */ 220 0x0c5c, /* 9 */ 221 0x0cdc, /* 10 */ 222 0x0d5c, /* 11 */ 223 0x0ddc, /* 12 */ 224 0x0e5c, /* 13 */ 225 0x0f72, /* 14 */ 226}; 227 228static uint8_t urtw_8225_gain[] = { 229 0x23, 0x88, 0x7c, 0xa5, /* -82dbm */ 230 0x23, 0x88, 0x7c, 0xb5, /* -82dbm */ 231 0x23, 0x88, 0x7c, 0xc5, /* -82dbm */ 232 0x33, 0x80, 0x79, 0xc5, /* -78dbm */ 233 0x43, 0x78, 0x76, 0xc5, /* -74dbm */ 234 0x53, 0x60, 0x73, 0xc5, /* -70dbm */ 235 0x63, 0x58, 0x70, 0xc5, /* -66dbm */ 236}; 237 238static struct urtw_pair urtw_8225_rf_part1[] = { 239 { 0x00, 0x0067 }, { 0x01, 0x0fe0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 240 { 0x04, 0x0486 }, { 0x05, 0x0bc0 }, { 0x06, 0x0ae6 }, { 0x07, 0x082a }, 241 { 0x08, 0x001f }, { 0x09, 0x0334 }, { 0x0a, 0x0fd4 }, { 0x0b, 0x0391 }, 242 { 0x0c, 0x0050 }, { 0x0d, 0x06db }, { 0x0e, 0x0029 }, { 0x0f, 0x0914 }, 243}; 244 245static struct urtw_pair urtw_8225_rf_part2[] = { 246 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, 247 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, 248 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x09 }, { 0x0b, 0x80 }, 249 { 0x0c, 0x01 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, { 0x10, 0x84 }, 250 { 0x11, 0x06 }, { 0x12, 0x20 }, { 0x13, 0x20 }, { 0x14, 0x00 }, 251 { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, { 0x18, 0xef }, 252 { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x76 }, { 0x1c, 0x04 }, 253 { 0x1e, 0x95 }, { 0x1f, 0x75 }, { 0x20, 0x1f }, { 0x21, 0x27 }, 254 { 0x22, 0x16 }, { 0x24, 0x46 }, { 0x25, 0x20 }, { 0x26, 0x90 }, 255 { 0x27, 0x88 } 256}; 257 258static struct urtw_pair urtw_8225_rf_part3[] = { 259 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 }, 260 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x10, 0x9b }, 261 { 0x11, 0x88 }, { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, 262 { 0x1a, 0xa0 }, { 0x1b, 0x08 }, { 0x40, 0x86 }, { 0x41, 0x8d }, 263 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x1f }, { 0x45, 0x1e }, 264 { 0x46, 0x1a }, { 0x47, 0x15 }, { 0x48, 0x10 }, { 0x49, 0x0a }, 265 { 0x4a, 0x05 }, { 0x4b, 0x02 }, { 0x4c, 0x05 } 266}; 267 268static uint16_t urtw_8225_rxgain[] = { 269 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 270 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 271 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 272 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 273 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 274 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 275 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 276 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 277 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 278 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 279 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3, 280 0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb 281}; 282 283static uint8_t urtw_8225_threshold[] = { 284 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd, 285}; 286 287static uint8_t urtw_8225_tx_gain_cck_ofdm[] = { 288 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e 289}; 290 291static uint8_t urtw_8225_txpwr_cck[] = { 292 0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02, 293 0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02, 294 0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02, 295 0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02, 296 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03, 297 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03 298}; 299 300static uint8_t urtw_8225_txpwr_cck_ch14[] = { 301 0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00, 302 0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00, 303 0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00, 304 0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00, 305 0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00, 306 0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00 307}; 308 309static uint8_t urtw_8225_txpwr_ofdm[]={ 310 0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4 311}; 312 313static uint8_t urtw_8225v2_gain_bg[]={ 314 0x23, 0x15, 0xa5, /* -82-1dbm */ 315 0x23, 0x15, 0xb5, /* -82-2dbm */ 316 0x23, 0x15, 0xc5, /* -82-3dbm */ 317 0x33, 0x15, 0xc5, /* -78dbm */ 318 0x43, 0x15, 0xc5, /* -74dbm */ 319 0x53, 0x15, 0xc5, /* -70dbm */ 320 0x63, 0x15, 0xc5, /* -66dbm */ 321}; 322 323static struct urtw_pair urtw_8225v2_rf_part1[] = { 324 { 0x00, 0x02bf }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 325 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, 326 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, 327 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } 328}; 329 330static struct urtw_pair urtw_8225v2b_rf_part0[] = { 331 { 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 }, 332 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a }, 333 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb }, 334 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 } 335}; 336 337static struct urtw_pair urtw_8225v2b_rf_part1[] = { 338 {0x0f0, 0x32}, {0x0f1, 0x32}, {0x0f2, 0x00}, 339 {0x0f3, 0x00}, {0x0f4, 0x32}, {0x0f5, 0x43}, 340 {0x0f6, 0x00}, {0x0f7, 0x00}, {0x0f8, 0x46}, 341 {0x0f9, 0xa4}, {0x0fa, 0x00}, {0x0fb, 0x00}, 342 {0x0fc, 0x96}, {0x0fd, 0xa4}, {0x0fe, 0x00}, 343 {0x0ff, 0x00}, {0x158, 0x4b}, {0x159, 0x00}, 344 {0x15a, 0x4b}, {0x15b, 0x00}, {0x160, 0x4b}, 345 {0x161, 0x09}, {0x162, 0x4b}, {0x163, 0x09}, 346 {0x1ce, 0x0f}, {0x1cf, 0x00}, {0x1e0, 0xff}, 347 {0x1e1, 0x0f}, {0x1e2, 0x00}, {0x1f0, 0x4e}, 348 {0x1f1, 0x01}, {0x1f2, 0x02}, {0x1f3, 0x03}, 349 {0x1f4, 0x04}, {0x1f5, 0x05}, {0x1f6, 0x06}, 350 {0x1f7, 0x07}, {0x1f8, 0x08}, {0x24e, 0x00}, 351 {0x20c, 0x04}, {0x221, 0x61}, {0x222, 0x68}, 352 {0x223, 0x6f}, {0x224, 0x76}, {0x225, 0x7d}, 353 {0x226, 0x84}, {0x227, 0x8d}, {0x24d, 0x08}, 354 {0x250, 0x05}, {0x251, 0xf5}, {0x252, 0x04}, 355 {0x253, 0xa0}, {0x254, 0x1f}, {0x255, 0x23}, 356 {0x256, 0x45}, {0x257, 0x67}, {0x258, 0x08}, 357 {0x259, 0x08}, {0x25a, 0x08}, {0x25b, 0x08}, 358 {0x260, 0x08}, {0x261, 0x08}, {0x262, 0x08}, 359 {0x263, 0x08}, {0x264, 0xcf}, {0x272, 0x56}, 360 {0x273, 0x9a}, {0x034, 0xf0}, {0x035, 0x0f}, 361 {0x05b, 0x40}, {0x084, 0x88}, {0x085, 0x24}, 362 {0x088, 0x54}, {0x08b, 0xb8}, {0x08c, 0x07}, 363 {0x08d, 0x00}, {0x094, 0x1b}, {0x095, 0x12}, 364 {0x096, 0x00}, {0x097, 0x06}, {0x09d, 0x1a}, 365 {0x09f, 0x10}, {0x0b4, 0x22}, {0x0be, 0x80}, 366 {0x0db, 0x00}, {0x0ee, 0x00}, {0x091, 0x03}, 367 {0x24c, 0x00}, {0x39f, 0x00}, {0x08c, 0x01}, 368 {0x08d, 0x10}, {0x08e, 0x08}, {0x08f, 0x00} 369}; 370 371static struct urtw_pair urtw_8225v2_rf_part2[] = { 372 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 }, 373 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 }, 374 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x08 }, { 0x0b, 0x80 }, 375 { 0x0c, 0x01 }, { 0x0d, 0x43 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, 376 { 0x10, 0x84 }, { 0x11, 0x07 }, { 0x12, 0x20 }, { 0x13, 0x20 }, 377 { 0x14, 0x00 }, { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, 378 { 0x18, 0xef }, { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x15 }, 379 { 0x1c, 0x04 }, { 0x1d, 0xc5 }, { 0x1e, 0x95 }, { 0x1f, 0x75 }, 380 { 0x20, 0x1f }, { 0x21, 0x17 }, { 0x22, 0x16 }, { 0x23, 0x80 }, 381 { 0x24, 0x46 }, { 0x25, 0x00 }, { 0x26, 0x90 }, { 0x27, 0x88 } 382}; 383 384static struct urtw_pair urtw_8225v2b_rf_part2[] = { 385 { 0x00, 0x10 }, { 0x01, 0x0d }, { 0x02, 0x01 }, { 0x03, 0x00 }, 386 { 0x04, 0x14 }, { 0x05, 0xfb }, { 0x06, 0xfb }, { 0x07, 0x60 }, 387 { 0x08, 0x00 }, { 0x09, 0x60 }, { 0x0a, 0x00 }, { 0x0b, 0x00 }, 388 { 0x0c, 0x00 }, { 0x0d, 0x5c }, { 0x0e, 0x00 }, { 0x0f, 0x00 }, 389 { 0x10, 0x40 }, { 0x11, 0x00 }, { 0x12, 0x40 }, { 0x13, 0x00 }, 390 { 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0xa8 }, { 0x17, 0x26 }, 391 { 0x18, 0x32 }, { 0x19, 0x33 }, { 0x1a, 0x07 }, { 0x1b, 0xa5 }, 392 { 0x1c, 0x6f }, { 0x1d, 0x55 }, { 0x1e, 0xc8 }, { 0x1f, 0xb3 }, 393 { 0x20, 0x0a }, { 0x21, 0xe1 }, { 0x22, 0x2C }, { 0x23, 0x8a }, 394 { 0x24, 0x86 }, { 0x25, 0x83 }, { 0x26, 0x34 }, { 0x27, 0x0f }, 395 { 0x28, 0x4f }, { 0x29, 0x24 }, { 0x2a, 0x6f }, { 0x2b, 0xc2 }, 396 { 0x2c, 0x6b }, { 0x2d, 0x40 }, { 0x2e, 0x80 }, { 0x2f, 0x00 }, 397 { 0x30, 0xc0 }, { 0x31, 0xc1 }, { 0x32, 0x58 }, { 0x33, 0xf1 }, 398 { 0x34, 0x00 }, { 0x35, 0xe4 }, { 0x36, 0x90 }, { 0x37, 0x3e }, 399 { 0x38, 0x6d }, { 0x39, 0x3c }, { 0x3a, 0xfb }, { 0x3b, 0x07 } 400}; 401 402static struct urtw_pair urtw_8225v2_rf_part3[] = { 403 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 }, 404 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x09, 0x11 }, 405 { 0x0a, 0x17 }, { 0x0b, 0x11 }, { 0x10, 0x9b }, { 0x11, 0x88 }, 406 { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, { 0x1a, 0xa0 }, 407 { 0x1b, 0x08 }, { 0x1d, 0x00 }, { 0x40, 0x86 }, { 0x41, 0x9d }, 408 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x36 }, { 0x45, 0x35 }, 409 { 0x46, 0x2e }, { 0x47, 0x25 }, { 0x48, 0x1c }, { 0x49, 0x12 }, 410 { 0x4a, 0x09 }, { 0x4b, 0x04 }, { 0x4c, 0x05 } 411}; 412 413static uint16_t urtw_8225v2_rxgain[] = { 414 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009, 415 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141, 416 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183, 417 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244, 418 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288, 419 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345, 420 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389, 421 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393, 422 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d, 423 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9, 424 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 425 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb 426}; 427 428static uint16_t urtw_8225v2b_rxgain[] = { 429 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409, 430 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541, 431 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583, 432 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644, 433 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688, 434 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745, 435 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789, 436 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793, 437 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d, 438 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9, 439 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3, 440 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb 441}; 442 443static uint8_t urtw_8225v2_tx_gain_cck_ofdm[] = { 444 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 445 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 446 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 447 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 448 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 449 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 450}; 451 452static uint8_t urtw_8225v2_txpwr_cck[] = { 453 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04 454}; 455 456static uint8_t urtw_8225v2_txpwr_cck_ch14[] = { 457 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00 458}; 459 460static uint8_t urtw_8225v2b_txpwr_cck[] = { 461 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04, 462 0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03, 463 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03, 464 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03 465}; 466 467static uint8_t urtw_8225v2b_txpwr_cck_ch14[] = { 468 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00, 469 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 470 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00, 471 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00 472}; 473 474static struct urtw_pair urtw_ratetable[] = { 475 { 2, 0 }, { 4, 1 }, { 11, 2 }, { 12, 4 }, { 18, 5 }, 476 { 22, 3 }, { 24, 6 }, { 36, 7 }, { 48, 8 }, { 72, 9 }, 477 { 96, 10 }, { 108, 11 } 478}; 479 480static const uint8_t urtw_8187b_reg_table[][3] = { 481 { 0xf0, 0x32, 0 }, { 0xf1, 0x32, 0 }, { 0xf2, 0x00, 0 }, 482 { 0xf3, 0x00, 0 }, { 0xf4, 0x32, 0 }, { 0xf5, 0x43, 0 }, 483 { 0xf6, 0x00, 0 }, { 0xf7, 0x00, 0 }, { 0xf8, 0x46, 0 }, 484 { 0xf9, 0xa4, 0 }, { 0xfa, 0x00, 0 }, { 0xfb, 0x00, 0 }, 485 { 0xfc, 0x96, 0 }, { 0xfd, 0xa4, 0 }, { 0xfe, 0x00, 0 }, 486 { 0xff, 0x00, 0 }, { 0x58, 0x4b, 1 }, { 0x59, 0x00, 1 }, 487 { 0x5a, 0x4b, 1 }, { 0x5b, 0x00, 1 }, { 0x60, 0x4b, 1 }, 488 { 0x61, 0x09, 1 }, { 0x62, 0x4b, 1 }, { 0x63, 0x09, 1 }, 489 { 0xce, 0x0f, 1 }, { 0xcf, 0x00, 1 }, { 0xe0, 0xff, 1 }, 490 { 0xe1, 0x0f, 1 }, { 0xe2, 0x00, 1 }, { 0xf0, 0x4e, 1 }, 491 { 0xf1, 0x01, 1 }, { 0xf2, 0x02, 1 }, { 0xf3, 0x03, 1 }, 492 { 0xf4, 0x04, 1 }, { 0xf5, 0x05, 1 }, { 0xf6, 0x06, 1 }, 493 { 0xf7, 0x07, 1 }, { 0xf8, 0x08, 1 }, { 0x4e, 0x00, 2 }, 494 { 0x0c, 0x04, 2 }, { 0x21, 0x61, 2 }, { 0x22, 0x68, 2 }, 495 { 0x23, 0x6f, 2 }, { 0x24, 0x76, 2 }, { 0x25, 0x7d, 2 }, 496 { 0x26, 0x84, 2 }, { 0x27, 0x8d, 2 }, { 0x4d, 0x08, 2 }, 497 { 0x50, 0x05, 2 }, { 0x51, 0xf5, 2 }, { 0x52, 0x04, 2 }, 498 { 0x53, 0xa0, 2 }, { 0x54, 0x1f, 2 }, { 0x55, 0x23, 2 }, 499 { 0x56, 0x45, 2 }, { 0x57, 0x67, 2 }, { 0x58, 0x08, 2 }, 500 { 0x59, 0x08, 2 }, { 0x5a, 0x08, 2 }, { 0x5b, 0x08, 2 }, 501 { 0x60, 0x08, 2 }, { 0x61, 0x08, 2 }, { 0x62, 0x08, 2 }, 502 { 0x63, 0x08, 2 }, { 0x64, 0xcf, 2 }, { 0x72, 0x56, 2 }, 503 { 0x73, 0x9a, 2 }, { 0x34, 0xf0, 0 }, { 0x35, 0x0f, 0 }, 504 { 0x5b, 0x40, 0 }, { 0x84, 0x88, 0 }, { 0x85, 0x24, 0 }, 505 { 0x88, 0x54, 0 }, { 0x8b, 0xb8, 0 }, { 0x8c, 0x07, 0 }, 506 { 0x8d, 0x00, 0 }, { 0x94, 0x1b, 0 }, { 0x95, 0x12, 0 }, 507 { 0x96, 0x00, 0 }, { 0x97, 0x06, 0 }, { 0x9d, 0x1a, 0 }, 508 { 0x9f, 0x10, 0 }, { 0xb4, 0x22, 0 }, { 0xbe, 0x80, 0 }, 509 { 0xdb, 0x00, 0 }, { 0xee, 0x00, 0 }, { 0x91, 0x03, 0 }, 510 { 0x4c, 0x00, 2 }, { 0x9f, 0x00, 3 }, { 0x8c, 0x01, 0 }, 511 { 0x8d, 0x10, 0 }, { 0x8e, 0x08, 0 }, { 0x8f, 0x00, 0 } 512}; 513 514static usb_callback_t urtw_bulk_rx_callback; 515static usb_callback_t urtw_bulk_tx_callback; 516static usb_callback_t urtw_bulk_tx_status_callback; 517 518static const struct usb_config urtw_8187b_usbconfig[URTW_8187B_N_XFERS] = { 519 [URTW_8187B_BULK_RX] = { 520 .type = UE_BULK, 521 .endpoint = 0x83, 522 .direction = UE_DIR_IN, 523 .bufsize = MCLBYTES, 524 .flags = { 525 .ext_buffer = 1, 526 .pipe_bof = 1, 527 .short_xfer_ok = 1 528 }, 529 .callback = urtw_bulk_rx_callback 530 }, 531 [URTW_8187B_BULK_TX_STATUS] = { 532 .type = UE_BULK, 533 .endpoint = 0x89, 534 .direction = UE_DIR_IN, 535 .bufsize = MCLBYTES, 536 .flags = { 537 .ext_buffer = 1, 538 .pipe_bof = 1, 539 .short_xfer_ok = 1 540 }, 541 .callback = urtw_bulk_tx_status_callback 542 }, 543 [URTW_8187B_BULK_TX_BE] = { 544 .type = UE_BULK, 545 .endpoint = URTW_8187B_TXPIPE_BE, 546 .direction = UE_DIR_OUT, 547 .bufsize = URTW_TX_MAXSIZE, 548 .flags = { 549 .ext_buffer = 1, 550 .force_short_xfer = 1, 551 .pipe_bof = 1, 552 }, 553 .callback = urtw_bulk_tx_callback, 554 .timeout = URTW_DATA_TIMEOUT 555 }, 556 [URTW_8187B_BULK_TX_BK] = { 557 .type = UE_BULK, 558 .endpoint = URTW_8187B_TXPIPE_BK, 559 .direction = UE_DIR_OUT, 560 .bufsize = URTW_TX_MAXSIZE, 561 .flags = { 562 .ext_buffer = 1, 563 .force_short_xfer = 1, 564 .pipe_bof = 1, 565 }, 566 .callback = urtw_bulk_tx_callback, 567 .timeout = URTW_DATA_TIMEOUT 568 }, 569 [URTW_8187B_BULK_TX_VI] = { 570 .type = UE_BULK, 571 .endpoint = URTW_8187B_TXPIPE_VI, 572 .direction = UE_DIR_OUT, 573 .bufsize = URTW_TX_MAXSIZE, 574 .flags = { 575 .ext_buffer = 1, 576 .force_short_xfer = 1, 577 .pipe_bof = 1, 578 }, 579 .callback = urtw_bulk_tx_callback, 580 .timeout = URTW_DATA_TIMEOUT 581 }, 582 [URTW_8187B_BULK_TX_VO] = { 583 .type = UE_BULK, 584 .endpoint = URTW_8187B_TXPIPE_VO, 585 .direction = UE_DIR_OUT, 586 .bufsize = URTW_TX_MAXSIZE, 587 .flags = { 588 .ext_buffer = 1, 589 .force_short_xfer = 1, 590 .pipe_bof = 1, 591 }, 592 .callback = urtw_bulk_tx_callback, 593 .timeout = URTW_DATA_TIMEOUT 594 }, 595 [URTW_8187B_BULK_TX_EP12] = { 596 .type = UE_BULK, 597 .endpoint = 0xc, 598 .direction = UE_DIR_OUT, 599 .bufsize = URTW_TX_MAXSIZE, 600 .flags = { 601 .ext_buffer = 1, 602 .force_short_xfer = 1, 603 .pipe_bof = 1, 604 }, 605 .callback = urtw_bulk_tx_callback, 606 .timeout = URTW_DATA_TIMEOUT 607 } 608}; 609 610static const struct usb_config urtw_8187l_usbconfig[URTW_8187L_N_XFERS] = { 611 [URTW_8187L_BULK_RX] = { 612 .type = UE_BULK, 613 .endpoint = 0x81, 614 .direction = UE_DIR_IN, 615 .bufsize = MCLBYTES, 616 .flags = { 617 .ext_buffer = 1, 618 .pipe_bof = 1, 619 .short_xfer_ok = 1 620 }, 621 .callback = urtw_bulk_rx_callback 622 }, 623 [URTW_8187L_BULK_TX_LOW] = { 624 .type = UE_BULK, 625 .endpoint = 0x2, 626 .direction = UE_DIR_OUT, 627 .bufsize = URTW_TX_MAXSIZE, 628 .flags = { 629 .ext_buffer = 1, 630 .force_short_xfer = 1, 631 .pipe_bof = 1, 632 }, 633 .callback = urtw_bulk_tx_callback, 634 .timeout = URTW_DATA_TIMEOUT 635 }, 636 [URTW_8187L_BULK_TX_NORMAL] = { 637 .type = UE_BULK, 638 .endpoint = 0x3, 639 .direction = UE_DIR_OUT, 640 .bufsize = URTW_TX_MAXSIZE, 641 .flags = { 642 .ext_buffer = 1, 643 .force_short_xfer = 1, 644 .pipe_bof = 1, 645 }, 646 .callback = urtw_bulk_tx_callback, 647 .timeout = URTW_DATA_TIMEOUT 648 }, 649}; 650 651static struct ieee80211vap *urtw_vap_create(struct ieee80211com *, 652 const char name[IFNAMSIZ], int unit, int opmode, 653 int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], 654 const uint8_t mac[IEEE80211_ADDR_LEN]); 655static void urtw_vap_delete(struct ieee80211vap *); 656static void urtw_init(void *); 657static void urtw_stop(struct ifnet *, int); 658static void urtw_stop_locked(struct ifnet *, int); 659static int urtw_ioctl(struct ifnet *, u_long, caddr_t); 660static void urtw_start(struct ifnet *); 661static int urtw_alloc_rx_data_list(struct urtw_softc *); 662static int urtw_alloc_tx_data_list(struct urtw_softc *); 663static int urtw_raw_xmit(struct ieee80211_node *, struct mbuf *, 664 const struct ieee80211_bpf_params *); 665static void urtw_scan_start(struct ieee80211com *); 666static void urtw_scan_end(struct ieee80211com *); 667static void urtw_set_channel(struct ieee80211com *); 668static void urtw_update_mcast(struct ifnet *); 669static int urtw_tx_start(struct urtw_softc *, 670 struct ieee80211_node *, struct mbuf *, 671 struct urtw_data *, int); 672static int urtw_newstate(struct ieee80211vap *, 673 enum ieee80211_state, int); 674static void urtw_led_ch(void *); 675static void urtw_ledtask(void *, int); 676static void urtw_watchdog(void *); 677static void urtw_set_multi(void *); 678static int urtw_isbmode(uint16_t); 679static uint16_t urtw_rate2rtl(int); 680static uint16_t urtw_rtl2rate(int); 681static usb_error_t urtw_set_rate(struct urtw_softc *); 682static usb_error_t urtw_update_msr(struct urtw_softc *); 683static usb_error_t urtw_read8_c(struct urtw_softc *, int, uint8_t *); 684static usb_error_t urtw_read16_c(struct urtw_softc *, int, uint16_t *); 685static usb_error_t urtw_read32_c(struct urtw_softc *, int, uint32_t *); 686static usb_error_t urtw_write8_c(struct urtw_softc *, int, uint8_t); 687static usb_error_t urtw_write16_c(struct urtw_softc *, int, uint16_t); 688static usb_error_t urtw_write32_c(struct urtw_softc *, int, uint32_t); 689static usb_error_t urtw_eprom_cs(struct urtw_softc *, int); 690static usb_error_t urtw_eprom_ck(struct urtw_softc *); 691static usb_error_t urtw_eprom_sendbits(struct urtw_softc *, int16_t *, 692 int); 693static usb_error_t urtw_eprom_read32(struct urtw_softc *, uint32_t, 694 uint32_t *); 695static usb_error_t urtw_eprom_readbit(struct urtw_softc *, int16_t *); 696static usb_error_t urtw_eprom_writebit(struct urtw_softc *, int16_t); 697static usb_error_t urtw_get_macaddr(struct urtw_softc *); 698static usb_error_t urtw_get_txpwr(struct urtw_softc *); 699static usb_error_t urtw_get_rfchip(struct urtw_softc *); 700static usb_error_t urtw_led_init(struct urtw_softc *); 701static usb_error_t urtw_8185_rf_pins_enable(struct urtw_softc *); 702static usb_error_t urtw_8185_tx_antenna(struct urtw_softc *, uint8_t); 703static usb_error_t urtw_8187_write_phy(struct urtw_softc *, uint8_t, 704 uint32_t); 705static usb_error_t urtw_8187_write_phy_ofdm_c(struct urtw_softc *, 706 uint8_t, uint32_t); 707static usb_error_t urtw_8187_write_phy_cck_c(struct urtw_softc *, uint8_t, 708 uint32_t); 709static usb_error_t urtw_8225_setgain(struct urtw_softc *, int16_t); 710static usb_error_t urtw_8225_usb_init(struct urtw_softc *); 711static usb_error_t urtw_8225_write_c(struct urtw_softc *, uint8_t, 712 uint16_t); 713static usb_error_t urtw_8225_write_s16(struct urtw_softc *, uint8_t, int, 714 uint16_t *); 715static usb_error_t urtw_8225_read(struct urtw_softc *, uint8_t, 716 uint32_t *); 717static usb_error_t urtw_8225_rf_init(struct urtw_softc *); 718static usb_error_t urtw_8225_rf_set_chan(struct urtw_softc *, int); 719static usb_error_t urtw_8225_rf_set_sens(struct urtw_softc *, int); 720static usb_error_t urtw_8225_set_txpwrlvl(struct urtw_softc *, int); 721static usb_error_t urtw_8225_rf_stop(struct urtw_softc *); 722static usb_error_t urtw_8225v2_rf_init(struct urtw_softc *); 723static usb_error_t urtw_8225v2_rf_set_chan(struct urtw_softc *, int); 724static usb_error_t urtw_8225v2_set_txpwrlvl(struct urtw_softc *, int); 725static usb_error_t urtw_8225v2_setgain(struct urtw_softc *, int16_t); 726static usb_error_t urtw_8225_isv2(struct urtw_softc *, int *); 727static usb_error_t urtw_8225v2b_rf_init(struct urtw_softc *); 728static usb_error_t urtw_8225v2b_rf_set_chan(struct urtw_softc *, int); 729static usb_error_t urtw_read8e(struct urtw_softc *, int, uint8_t *); 730static usb_error_t urtw_write8e(struct urtw_softc *, int, uint8_t); 731static usb_error_t urtw_8180_set_anaparam(struct urtw_softc *, uint32_t); 732static usb_error_t urtw_8185_set_anaparam2(struct urtw_softc *, uint32_t); 733static usb_error_t urtw_intr_enable(struct urtw_softc *); 734static usb_error_t urtw_intr_disable(struct urtw_softc *); 735static usb_error_t urtw_reset(struct urtw_softc *); 736static usb_error_t urtw_led_on(struct urtw_softc *, int); 737static usb_error_t urtw_led_ctl(struct urtw_softc *, int); 738static usb_error_t urtw_led_blink(struct urtw_softc *); 739static usb_error_t urtw_led_mode0(struct urtw_softc *, int); 740static usb_error_t urtw_led_mode1(struct urtw_softc *, int); 741static usb_error_t urtw_led_mode2(struct urtw_softc *, int); 742static usb_error_t urtw_led_mode3(struct urtw_softc *, int); 743static usb_error_t urtw_rx_setconf(struct urtw_softc *); 744static usb_error_t urtw_rx_enable(struct urtw_softc *); 745static usb_error_t urtw_tx_enable(struct urtw_softc *sc); 746static void urtw_free_tx_data_list(struct urtw_softc *); 747static void urtw_free_rx_data_list(struct urtw_softc *); 748static void urtw_free_data_list(struct urtw_softc *, 749 struct urtw_data data[], int, int); 750static usb_error_t urtw_adapter_start(struct urtw_softc *); 751static usb_error_t urtw_adapter_start_b(struct urtw_softc *); 752static usb_error_t urtw_set_mode(struct urtw_softc *, uint32_t); 753static usb_error_t urtw_8187b_cmd_reset(struct urtw_softc *); 754static usb_error_t urtw_do_request(struct urtw_softc *, 755 struct usb_device_request *, void *); 756static usb_error_t urtw_8225v2b_set_txpwrlvl(struct urtw_softc *, int); 757static usb_error_t urtw_led_off(struct urtw_softc *, int); 758static void urtw_abort_xfers(struct urtw_softc *); 759static struct urtw_data * 760 urtw_getbuf(struct urtw_softc *sc); 761static int urtw_compute_txtime(uint16_t, uint16_t, uint8_t, 762 uint8_t); 763static void urtw_updateslot(struct ifnet *); 764static void urtw_updateslottask(void *, int); 765static void urtw_sysctl_node(struct urtw_softc *); 766 767static int 768urtw_match(device_t dev) 769{ 770 struct usb_attach_arg *uaa = device_get_ivars(dev); 771 772 if (uaa->usb_mode != USB_MODE_HOST) 773 return (ENXIO); 774 if (uaa->info.bConfigIndex != URTW_CONFIG_INDEX) 775 return (ENXIO); 776 if (uaa->info.bIfaceIndex != URTW_IFACE_INDEX) 777 return (ENXIO); 778 779 return (usbd_lookup_id_by_uaa(urtw_devs, sizeof(urtw_devs), uaa)); 780} 781 782static int 783urtw_attach(device_t dev) 784{ 785 const struct usb_config *setup_start; 786 int ret = ENXIO; 787 struct urtw_softc *sc = device_get_softc(dev); 788 struct usb_attach_arg *uaa = device_get_ivars(dev); 789 struct ieee80211com *ic; 790 struct ifnet *ifp; 791 uint8_t bands, iface_index = URTW_IFACE_INDEX; /* XXX */ 792 uint16_t n_setup; 793 uint32_t data; 794 usb_error_t error; 795 796 device_set_usb_desc(dev); 797 798 sc->sc_dev = dev; 799 sc->sc_udev = uaa->device; 800 if (USB_GET_DRIVER_INFO(uaa) == URTW_REV_RTL8187B) 801 sc->sc_flags |= URTW_RTL8187B; 802#ifdef URTW_DEBUG 803 sc->sc_debug = urtw_debug; 804#endif 805 806 mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), MTX_NETWORK_LOCK, 807 MTX_DEF); 808 usb_callout_init_mtx(&sc->sc_led_ch, &sc->sc_mtx, 0); 809 TASK_INIT(&sc->sc_led_task, 0, urtw_ledtask, sc); 810 TASK_INIT(&sc->sc_updateslot_task, 0, urtw_updateslottask, sc); 811 callout_init(&sc->sc_watchdog_ch, 0); 812 813 if (sc->sc_flags & URTW_RTL8187B) { 814 setup_start = urtw_8187b_usbconfig; 815 n_setup = URTW_8187B_N_XFERS; 816 } else { 817 setup_start = urtw_8187l_usbconfig; 818 n_setup = URTW_8187L_N_XFERS; 819 } 820 821 error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer, 822 setup_start, n_setup, sc, &sc->sc_mtx); 823 if (error) { 824 device_printf(dev, "could not allocate USB transfers, " 825 "err=%s\n", usbd_errstr(error)); 826 ret = ENXIO; 827 goto fail0; 828 } 829 830 URTW_LOCK(sc); 831 832 urtw_read32_m(sc, URTW_RX, &data); 833 sc->sc_epromtype = (data & URTW_RX_9356SEL) ? URTW_EEPROM_93C56 : 834 URTW_EEPROM_93C46; 835 836 error = urtw_get_rfchip(sc); 837 if (error != 0) 838 goto fail; 839 error = urtw_get_macaddr(sc); 840 if (error != 0) 841 goto fail; 842 error = urtw_get_txpwr(sc); 843 if (error != 0) 844 goto fail; 845 error = urtw_led_init(sc); 846 if (error != 0) 847 goto fail; 848 849 URTW_UNLOCK(sc); 850 851 sc->sc_rts_retry = URTW_DEFAULT_RTS_RETRY; 852 sc->sc_tx_retry = URTW_DEFAULT_TX_RETRY; 853 sc->sc_currate = 3; 854 sc->sc_preamble_mode = urtw_preamble_mode; 855 856 ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211); 857 if (ifp == NULL) { 858 device_printf(sc->sc_dev, "can not allocate ifnet\n"); 859 ret = ENOMEM; 860 goto fail1; 861 } 862 863 ifp->if_softc = sc; 864 if_initname(ifp, "urtw", device_get_unit(sc->sc_dev)); 865 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 866 ifp->if_init = urtw_init; 867 ifp->if_ioctl = urtw_ioctl; 868 ifp->if_start = urtw_start; 869 /* XXX URTW_TX_DATA_LIST_COUNT */ 870 IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen); 871 ifp->if_snd.ifq_drv_maxlen = ifqmaxlen; 872 IFQ_SET_READY(&ifp->if_snd); 873 874 ic = ifp->if_l2com; 875 ic->ic_ifp = ifp; 876 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ 877 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ 878 879 /* set device capabilities */ 880 ic->ic_caps = 881 IEEE80211_C_STA | /* station mode */ 882 IEEE80211_C_MONITOR | /* monitor mode supported */ 883 IEEE80211_C_TXPMGT | /* tx power management */ 884 IEEE80211_C_SHPREAMBLE | /* short preamble supported */ 885 IEEE80211_C_SHSLOT | /* short slot time supported */ 886 IEEE80211_C_BGSCAN | /* capable of bg scanning */ 887 IEEE80211_C_WPA; /* 802.11i */ 888 889 bands = 0; 890 setbit(&bands, IEEE80211_MODE_11B); 891 setbit(&bands, IEEE80211_MODE_11G); 892 ieee80211_init_channels(ic, NULL, &bands); 893 894 ieee80211_ifattach(ic, sc->sc_bssid); 895 ic->ic_raw_xmit = urtw_raw_xmit; 896 ic->ic_scan_start = urtw_scan_start; 897 ic->ic_scan_end = urtw_scan_end; 898 ic->ic_set_channel = urtw_set_channel; 899 ic->ic_updateslot = urtw_updateslot; 900 ic->ic_vap_create = urtw_vap_create; 901 ic->ic_vap_delete = urtw_vap_delete; 902 ic->ic_update_mcast = urtw_update_mcast; 903 904 ieee80211_radiotap_attach(ic, 905 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap), 906 URTW_TX_RADIOTAP_PRESENT, 907 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), 908 URTW_RX_RADIOTAP_PRESENT); 909 910 urtw_sysctl_node(sc); 911 912 if (bootverbose) 913 ieee80211_announce(ic); 914 return (0); 915 916fail: URTW_UNLOCK(sc); 917fail1: usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ? 918 URTW_8187B_N_XFERS : URTW_8187L_N_XFERS); 919fail0: 920 return (ret); 921} 922 923static int 924urtw_detach(device_t dev) 925{ 926 struct urtw_softc *sc = device_get_softc(dev); 927 struct ifnet *ifp = sc->sc_ifp; 928 struct ieee80211com *ic = ifp->if_l2com; 929 930 if (!device_is_attached(dev)) 931 return (0); 932 933 urtw_stop(ifp, 1); 934 ieee80211_draintask(ic, &sc->sc_updateslot_task); 935 ieee80211_draintask(ic, &sc->sc_led_task); 936 937 usb_callout_drain(&sc->sc_led_ch); 938 callout_drain(&sc->sc_watchdog_ch); 939 940 usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ? 941 URTW_8187B_N_XFERS : URTW_8187L_N_XFERS); 942 ieee80211_ifdetach(ic); 943 944 urtw_free_tx_data_list(sc); 945 urtw_free_rx_data_list(sc); 946 947 if_free(ifp); 948 mtx_destroy(&sc->sc_mtx); 949 950 return (0); 951} 952 953static void 954urtw_free_tx_data_list(struct urtw_softc *sc) 955{ 956 957 urtw_free_data_list(sc, sc->sc_tx, URTW_TX_DATA_LIST_COUNT, 0); 958} 959 960static void 961urtw_free_rx_data_list(struct urtw_softc *sc) 962{ 963 964 urtw_free_data_list(sc, sc->sc_rx, URTW_RX_DATA_LIST_COUNT, 1); 965} 966 967static void 968urtw_free_data_list(struct urtw_softc *sc, struct urtw_data data[], int ndata, 969 int fillmbuf) 970{ 971 int i; 972 973 for (i = 0; i < ndata; i++) { 974 struct urtw_data *dp = &data[i]; 975 976 if (fillmbuf == 1) { 977 if (dp->m != NULL) { 978 m_freem(dp->m); 979 dp->m = NULL; 980 dp->buf = NULL; 981 } 982 } else { 983 if (dp->buf != NULL) { 984 free(dp->buf, M_USBDEV); 985 dp->buf = NULL; 986 } 987 } 988 if (dp->ni != NULL) { 989 ieee80211_free_node(dp->ni); 990 dp->ni = NULL; 991 } 992 } 993} 994 995static struct ieee80211vap * 996urtw_vap_create(struct ieee80211com *ic, 997 const char name[IFNAMSIZ], int unit, int opmode, int flags, 998 const uint8_t bssid[IEEE80211_ADDR_LEN], 999 const uint8_t mac[IEEE80211_ADDR_LEN]) 1000{ 1001 struct urtw_vap *uvp; 1002 struct ieee80211vap *vap; 1003 1004 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ 1005 return (NULL); 1006 uvp = (struct urtw_vap *) malloc(sizeof(struct urtw_vap), 1007 M_80211_VAP, M_NOWAIT | M_ZERO); 1008 if (uvp == NULL) 1009 return (NULL); 1010 vap = &uvp->vap; 1011 /* enable s/w bmiss handling for sta mode */ 1012 ieee80211_vap_setup(ic, vap, name, unit, opmode, 1013 flags | IEEE80211_CLONE_NOBEACONS, bssid, mac); 1014 1015 /* override state transition machine */ 1016 uvp->newstate = vap->iv_newstate; 1017 vap->iv_newstate = urtw_newstate; 1018 1019 /* complete setup */ 1020 ieee80211_vap_attach(vap, ieee80211_media_change, 1021 ieee80211_media_status); 1022 ic->ic_opmode = opmode; 1023 return (vap); 1024} 1025 1026static void 1027urtw_vap_delete(struct ieee80211vap *vap) 1028{ 1029 struct urtw_vap *uvp = URTW_VAP(vap); 1030 1031 ieee80211_vap_detach(vap); 1032 free(uvp, M_80211_VAP); 1033} 1034 1035static void 1036urtw_init_locked(void *arg) 1037{ 1038 int ret; 1039 struct urtw_softc *sc = arg; 1040 struct ifnet *ifp = sc->sc_ifp; 1041 usb_error_t error; 1042 1043 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1044 urtw_stop_locked(ifp, 0); 1045 1046 error = (sc->sc_flags & URTW_RTL8187B) ? urtw_adapter_start_b(sc) : 1047 urtw_adapter_start(sc); 1048 if (error != 0) 1049 goto fail; 1050 1051 /* reset softc variables */ 1052 sc->sc_txtimer = 0; 1053 1054 if (!(sc->sc_flags & URTW_INIT_ONCE)) { 1055 ret = urtw_alloc_rx_data_list(sc); 1056 if (error != 0) 1057 goto fail; 1058 ret = urtw_alloc_tx_data_list(sc); 1059 if (error != 0) 1060 goto fail; 1061 sc->sc_flags |= URTW_INIT_ONCE; 1062 } 1063 1064 error = urtw_rx_enable(sc); 1065 if (error != 0) 1066 goto fail; 1067 error = urtw_tx_enable(sc); 1068 if (error != 0) 1069 goto fail; 1070 1071 if (sc->sc_flags & URTW_RTL8187B) 1072 usbd_transfer_start(sc->sc_xfer[URTW_8187B_BULK_TX_STATUS]); 1073 1074 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 1075 ifp->if_drv_flags |= IFF_DRV_RUNNING; 1076 1077 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1078fail: 1079 return; 1080} 1081 1082static void 1083urtw_init(void *arg) 1084{ 1085 struct urtw_softc *sc = arg; 1086 1087 URTW_LOCK(sc); 1088 urtw_init_locked(arg); 1089 URTW_UNLOCK(sc); 1090} 1091 1092static usb_error_t 1093urtw_adapter_start_b(struct urtw_softc *sc) 1094{ 1095#define N(a) (sizeof(a) / sizeof((a)[0])) 1096 uint8_t data8; 1097 usb_error_t error; 1098 1099 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1100 if (error) 1101 goto fail; 1102 1103 urtw_read8_m(sc, URTW_CONFIG3, &data8); 1104 urtw_write8_m(sc, URTW_CONFIG3, 1105 data8 | URTW_CONFIG3_ANAPARAM_WRITE | URTW_CONFIG3_GNT_SELECT); 1106 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8187B_8225_ANAPARAM2_ON); 1107 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_ON); 1108 urtw_write8_m(sc, URTW_ANAPARAM3, URTW_8187B_8225_ANAPARAM3_ON); 1109 1110 urtw_write8_m(sc, 0x61, 0x10); 1111 urtw_read8_m(sc, 0x62, &data8); 1112 urtw_write8_m(sc, 0x62, data8 & ~(1 << 5)); 1113 urtw_write8_m(sc, 0x62, data8 | (1 << 5)); 1114 1115 urtw_read8_m(sc, URTW_CONFIG3, &data8); 1116 data8 &= ~URTW_CONFIG3_ANAPARAM_WRITE; 1117 urtw_write8_m(sc, URTW_CONFIG3, data8); 1118 1119 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1120 if (error) 1121 goto fail; 1122 1123 error = urtw_8187b_cmd_reset(sc); 1124 if (error) 1125 goto fail; 1126 1127 error = sc->sc_rf_init(sc); 1128 if (error != 0) 1129 goto fail; 1130 urtw_write8_m(sc, URTW_CMD, URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE); 1131 1132 /* fix RTL8187B RX stall */ 1133 error = urtw_intr_enable(sc); 1134 if (error) 1135 goto fail; 1136 1137 error = urtw_write8e(sc, 0x41, 0xf4); 1138 if (error) 1139 goto fail; 1140 error = urtw_write8e(sc, 0x40, 0x00); 1141 if (error) 1142 goto fail; 1143 error = urtw_write8e(sc, 0x42, 0x00); 1144 if (error) 1145 goto fail; 1146 error = urtw_write8e(sc, 0x42, 0x01); 1147 if (error) 1148 goto fail; 1149 error = urtw_write8e(sc, 0x40, 0x0f); 1150 if (error) 1151 goto fail; 1152 error = urtw_write8e(sc, 0x42, 0x00); 1153 if (error) 1154 goto fail; 1155 error = urtw_write8e(sc, 0x42, 0x01); 1156 if (error) 1157 goto fail; 1158 1159 urtw_read8_m(sc, 0xdb, &data8); 1160 urtw_write8_m(sc, 0xdb, data8 | (1 << 2)); 1161 urtw_write16_m(sc, 0x372, 0x59fa); 1162 urtw_write16_m(sc, 0x374, 0x59d2); 1163 urtw_write16_m(sc, 0x376, 0x59d2); 1164 urtw_write16_m(sc, 0x378, 0x19fa); 1165 urtw_write16_m(sc, 0x37a, 0x19fa); 1166 urtw_write16_m(sc, 0x37c, 0x00d0); 1167 urtw_write8_m(sc, 0x61, 0); 1168 1169 urtw_write8_m(sc, 0x180, 0x0f); 1170 urtw_write8_m(sc, 0x183, 0x03); 1171 urtw_write8_m(sc, 0xda, 0x10); 1172 urtw_write8_m(sc, 0x24d, 0x08); 1173 urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b); 1174 1175 urtw_write16_m(sc, 0x1ec, 0x800); /* RX MAX SIZE */ 1176fail: 1177 return (error); 1178#undef N 1179} 1180 1181static usb_error_t 1182urtw_adapter_start(struct urtw_softc *sc) 1183{ 1184 usb_error_t error; 1185 1186 error = urtw_reset(sc); 1187 if (error) 1188 goto fail; 1189 1190 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 0); 1191 urtw_write8_m(sc, URTW_GPIO, 0); 1192 1193 /* for led */ 1194 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4); 1195 error = urtw_led_ctl(sc, URTW_LED_CTL_POWER_ON); 1196 if (error != 0) 1197 goto fail; 1198 1199 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1200 if (error) 1201 goto fail; 1202 /* applying MAC address again. */ 1203 urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]); 1204 urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff); 1205 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1206 if (error) 1207 goto fail; 1208 1209 error = urtw_update_msr(sc); 1210 if (error) 1211 goto fail; 1212 1213 urtw_write32_m(sc, URTW_INT_TIMEOUT, 0); 1214 urtw_write8_m(sc, URTW_WPA_CONFIG, 0); 1215 urtw_write8_m(sc, URTW_RATE_FALLBACK, URTW_RATE_FALLBACK_ENABLE | 0x1); 1216 error = urtw_set_rate(sc); 1217 if (error != 0) 1218 goto fail; 1219 1220 error = sc->sc_rf_init(sc); 1221 if (error != 0) 1222 goto fail; 1223 if (sc->sc_rf_set_sens != NULL) 1224 sc->sc_rf_set_sens(sc, sc->sc_sens); 1225 1226 /* XXX correct? to call write16 */ 1227 urtw_write16_m(sc, URTW_PSR, 1); 1228 urtw_write16_m(sc, URTW_ADDR_MAGIC2, 0x10); 1229 urtw_write8_m(sc, URTW_TALLY_SEL, 0x80); 1230 urtw_write8_m(sc, URTW_ADDR_MAGIC3, 0x60); 1231 /* XXX correct? to call write16 */ 1232 urtw_write16_m(sc, URTW_PSR, 0); 1233 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4); 1234 1235 error = urtw_intr_enable(sc); 1236 if (error != 0) 1237 goto fail; 1238 1239fail: 1240 return (error); 1241} 1242 1243static usb_error_t 1244urtw_set_mode(struct urtw_softc *sc, uint32_t mode) 1245{ 1246 uint8_t data; 1247 usb_error_t error; 1248 1249 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 1250 data = (data & ~URTW_EPROM_CMD_MASK) | (mode << URTW_EPROM_CMD_SHIFT); 1251 data = data & ~(URTW_EPROM_CS | URTW_EPROM_CK); 1252 urtw_write8_m(sc, URTW_EPROM_CMD, data); 1253fail: 1254 return (error); 1255} 1256 1257static usb_error_t 1258urtw_8187b_cmd_reset(struct urtw_softc *sc) 1259{ 1260 int i; 1261 uint8_t data8; 1262 usb_error_t error; 1263 1264 /* XXX the code can be duplicate with urtw_reset(). */ 1265 urtw_read8_m(sc, URTW_CMD, &data8); 1266 data8 = (data8 & 0x2) | URTW_CMD_RST; 1267 urtw_write8_m(sc, URTW_CMD, data8); 1268 1269 for (i = 0; i < 20; i++) { 1270 usb_pause_mtx(&sc->sc_mtx, 2); 1271 urtw_read8_m(sc, URTW_CMD, &data8); 1272 if (!(data8 & URTW_CMD_RST)) 1273 break; 1274 } 1275 if (i >= 20) { 1276 device_printf(sc->sc_dev, "reset timeout\n"); 1277 goto fail; 1278 } 1279fail: 1280 return (error); 1281} 1282 1283static usb_error_t 1284urtw_do_request(struct urtw_softc *sc, 1285 struct usb_device_request *req, void *data) 1286{ 1287 usb_error_t err; 1288 int ntries = 10; 1289 1290 URTW_ASSERT_LOCKED(sc); 1291 1292 while (ntries--) { 1293 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx, 1294 req, data, 0, NULL, 250 /* ms */); 1295 if (err == 0) 1296 break; 1297 1298 DPRINTF(sc, URTW_DEBUG_INIT, 1299 "Control request failed, %s (retrying)\n", 1300 usbd_errstr(err)); 1301 usb_pause_mtx(&sc->sc_mtx, hz / 100); 1302 } 1303 return (err); 1304} 1305 1306static void 1307urtw_stop_locked(struct ifnet *ifp, int disable) 1308{ 1309 struct urtw_softc *sc = ifp->if_softc; 1310 uint8_t data8; 1311 usb_error_t error; 1312 1313 (void)disable; 1314 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE); 1315 1316 error = urtw_intr_disable(sc); 1317 if (error) 1318 goto fail; 1319 urtw_read8_m(sc, URTW_CMD, &data8); 1320 data8 &= ~(URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE); 1321 urtw_write8_m(sc, URTW_CMD, data8); 1322 1323 error = sc->sc_rf_stop(sc); 1324 if (error != 0) 1325 goto fail; 1326 1327 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 1328 if (error) 1329 goto fail; 1330 urtw_read8_m(sc, URTW_CONFIG4, &data8); 1331 urtw_write8_m(sc, URTW_CONFIG4, data8 | URTW_CONFIG4_VCOOFF); 1332 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 1333 if (error) 1334 goto fail; 1335fail: 1336 if (error) 1337 device_printf(sc->sc_dev, "failed to stop (%s)\n", 1338 usbd_errstr(error)); 1339 1340 usb_callout_stop(&sc->sc_led_ch); 1341 callout_stop(&sc->sc_watchdog_ch); 1342 1343 urtw_abort_xfers(sc); 1344} 1345 1346static void 1347urtw_stop(struct ifnet *ifp, int disable) 1348{ 1349 struct urtw_softc *sc = ifp->if_softc; 1350 1351 URTW_LOCK(sc); 1352 urtw_stop_locked(ifp, disable); 1353 URTW_UNLOCK(sc); 1354} 1355 1356static void 1357urtw_abort_xfers(struct urtw_softc *sc) 1358{ 1359 int i, max; 1360 1361 URTW_ASSERT_LOCKED(sc); 1362 1363 max = (sc->sc_flags & URTW_RTL8187B) ? URTW_8187B_N_XFERS : 1364 URTW_8187L_N_XFERS; 1365 1366 /* abort any pending transfers */ 1367 for (i = 0; i < max; i++) 1368 usbd_transfer_stop(sc->sc_xfer[i]); 1369} 1370 1371static int 1372urtw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) 1373{ 1374 struct urtw_softc *sc = ifp->if_softc; 1375 struct ieee80211com *ic = ifp->if_l2com; 1376 struct ifreq *ifr = (struct ifreq *) data; 1377 int error = 0, startall = 0; 1378 1379 switch (cmd) { 1380 case SIOCSIFFLAGS: 1381 if (ifp->if_flags & IFF_UP) { 1382 if (ifp->if_drv_flags & IFF_DRV_RUNNING) { 1383 if ((ifp->if_flags ^ sc->sc_if_flags) & 1384 (IFF_ALLMULTI | IFF_PROMISC)) 1385 urtw_set_multi(sc); 1386 } else { 1387 urtw_init(ifp->if_softc); 1388 startall = 1; 1389 } 1390 } else { 1391 if (ifp->if_drv_flags & IFF_DRV_RUNNING) 1392 urtw_stop(ifp, 1); 1393 } 1394 sc->sc_if_flags = ifp->if_flags; 1395 if (startall) 1396 ieee80211_start_all(ic); 1397 break; 1398 case SIOCGIFMEDIA: 1399 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); 1400 break; 1401 case SIOCGIFADDR: 1402 error = ether_ioctl(ifp, cmd, data); 1403 break; 1404 default: 1405 error = EINVAL; 1406 break; 1407 } 1408 1409 return (error); 1410} 1411 1412static void 1413urtw_start(struct ifnet *ifp) 1414{ 1415 struct urtw_data *bf; 1416 struct urtw_softc *sc = ifp->if_softc; 1417 struct ieee80211_node *ni; 1418 struct mbuf *m; 1419 1420 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 1421 return; 1422 1423 URTW_LOCK(sc); 1424 for (;;) { 1425 IFQ_DRV_DEQUEUE(&ifp->if_snd, m); 1426 if (m == NULL) 1427 break; 1428 bf = urtw_getbuf(sc); 1429 if (bf == NULL) { 1430 IFQ_DRV_PREPEND(&ifp->if_snd, m); 1431 break; 1432 } 1433 1434 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; 1435 m->m_pkthdr.rcvif = NULL; 1436 1437 if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_NORMAL) != 0) { 1438 ifp->if_oerrors++; 1439 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); 1440 ieee80211_free_node(ni); 1441 break; 1442 } 1443 1444 sc->sc_txtimer = 5; 1445 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1446 } 1447 URTW_UNLOCK(sc); 1448} 1449 1450static int 1451urtw_alloc_data_list(struct urtw_softc *sc, struct urtw_data data[], 1452 int ndata, int maxsz, int fillmbuf) 1453{ 1454 int i, error; 1455 1456 for (i = 0; i < ndata; i++) { 1457 struct urtw_data *dp = &data[i]; 1458 1459 dp->sc = sc; 1460 if (fillmbuf) { 1461 dp->m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); 1462 if (dp->m == NULL) { 1463 device_printf(sc->sc_dev, 1464 "could not allocate rx mbuf\n"); 1465 error = ENOMEM; 1466 goto fail; 1467 } 1468 dp->buf = mtod(dp->m, uint8_t *); 1469 } else { 1470 dp->m = NULL; 1471 dp->buf = malloc(maxsz, M_USBDEV, M_NOWAIT); 1472 if (dp->buf == NULL) { 1473 device_printf(sc->sc_dev, 1474 "could not allocate buffer\n"); 1475 error = ENOMEM; 1476 goto fail; 1477 } 1478 if (((unsigned long)dp->buf) % 4) 1479 device_printf(sc->sc_dev, 1480 "warn: unaligned buffer %p\n", dp->buf); 1481 } 1482 dp->ni = NULL; 1483 } 1484 1485 return 0; 1486 1487fail: urtw_free_data_list(sc, data, ndata, fillmbuf); 1488 return error; 1489} 1490 1491static int 1492urtw_alloc_rx_data_list(struct urtw_softc *sc) 1493{ 1494 int error, i; 1495 1496 error = urtw_alloc_data_list(sc, 1497 sc->sc_rx, URTW_RX_DATA_LIST_COUNT, MCLBYTES, 1 /* mbufs */); 1498 if (error != 0) 1499 return (error); 1500 1501 STAILQ_INIT(&sc->sc_rx_active); 1502 STAILQ_INIT(&sc->sc_rx_inactive); 1503 1504 for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) 1505 STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next); 1506 1507 return (0); 1508} 1509 1510static int 1511urtw_alloc_tx_data_list(struct urtw_softc *sc) 1512{ 1513 int error, i; 1514 1515 error = urtw_alloc_data_list(sc, 1516 sc->sc_tx, URTW_TX_DATA_LIST_COUNT, URTW_TX_MAXSIZE, 1517 0 /* no mbufs */); 1518 if (error != 0) 1519 return (error); 1520 1521 STAILQ_INIT(&sc->sc_tx_active); 1522 STAILQ_INIT(&sc->sc_tx_inactive); 1523 STAILQ_INIT(&sc->sc_tx_pending); 1524 1525 for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) 1526 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i], 1527 next); 1528 1529 return (0); 1530} 1531 1532static int 1533urtw_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, 1534 const struct ieee80211_bpf_params *params) 1535{ 1536 struct ieee80211com *ic = ni->ni_ic; 1537 struct ifnet *ifp = ic->ic_ifp; 1538 struct urtw_data *bf; 1539 struct urtw_softc *sc = ifp->if_softc; 1540 1541 /* prevent management frames from being sent if we're not ready */ 1542 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { 1543 m_freem(m); 1544 ieee80211_free_node(ni); 1545 return ENETDOWN; 1546 } 1547 URTW_LOCK(sc); 1548 bf = urtw_getbuf(sc); 1549 if (bf == NULL) { 1550 ieee80211_free_node(ni); 1551 m_freem(m); 1552 URTW_UNLOCK(sc); 1553 return (ENOBUFS); /* XXX */ 1554 } 1555 1556 ifp->if_opackets++; 1557 if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_LOW) != 0) { 1558 ieee80211_free_node(ni); 1559 ifp->if_oerrors++; 1560 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); 1561 URTW_UNLOCK(sc); 1562 return (EIO); 1563 } 1564 URTW_UNLOCK(sc); 1565 1566 sc->sc_txtimer = 5; 1567 return (0); 1568} 1569 1570static void 1571urtw_scan_start(struct ieee80211com *ic) 1572{ 1573 1574 /* XXX do nothing? */ 1575} 1576 1577static void 1578urtw_scan_end(struct ieee80211com *ic) 1579{ 1580 1581 /* XXX do nothing? */ 1582} 1583 1584static void 1585urtw_set_channel(struct ieee80211com *ic) 1586{ 1587 struct urtw_softc *sc = ic->ic_ifp->if_softc; 1588 struct ifnet *ifp = sc->sc_ifp; 1589 uint32_t data, orig; 1590 usb_error_t error; 1591 1592 /* 1593 * if the user set a channel explicitly using ifconfig(8) this function 1594 * can be called earlier than we're expected that in some cases the 1595 * initialization would be failed if setting a channel is called before 1596 * the init have done. 1597 */ 1598 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) 1599 return; 1600 1601 if (sc->sc_curchan != NULL && sc->sc_curchan == ic->ic_curchan) 1602 return; 1603 1604 URTW_LOCK(sc); 1605 1606 /* 1607 * during changing th channel we need to temporarily be disable 1608 * TX. 1609 */ 1610 urtw_read32_m(sc, URTW_TX_CONF, &orig); 1611 data = orig & ~URTW_TX_LOOPBACK_MASK; 1612 urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_MAC); 1613 1614 error = sc->sc_rf_set_chan(sc, ieee80211_chan2ieee(ic, ic->ic_curchan)); 1615 if (error != 0) 1616 goto fail; 1617 usb_pause_mtx(&sc->sc_mtx, 10); 1618 urtw_write32_m(sc, URTW_TX_CONF, orig); 1619 1620 urtw_write16_m(sc, URTW_ATIM_WND, 2); 1621 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100); 1622 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); 1623 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100); 1624 1625fail: 1626 URTW_UNLOCK(sc); 1627 1628 sc->sc_curchan = ic->ic_curchan; 1629 1630 if (error != 0) 1631 device_printf(sc->sc_dev, "could not change the channel\n"); 1632} 1633 1634static void 1635urtw_update_mcast(struct ifnet *ifp) 1636{ 1637 1638 /* XXX do nothing? */ 1639} 1640 1641static int 1642urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0, 1643 struct urtw_data *data, int prior) 1644{ 1645 struct ifnet *ifp = sc->sc_ifp; 1646 struct ieee80211_frame *wh = mtod(m0, struct ieee80211_frame *); 1647 struct ieee80211_key *k; 1648 const struct ieee80211_txparam *tp; 1649 struct ieee80211com *ic = ifp->if_l2com; 1650 struct ieee80211vap *vap = ni->ni_vap; 1651 struct usb_xfer *rtl8187b_pipes[URTW_8187B_TXPIPE_MAX] = { 1652 sc->sc_xfer[URTW_8187B_BULK_TX_BE], 1653 sc->sc_xfer[URTW_8187B_BULK_TX_BK], 1654 sc->sc_xfer[URTW_8187B_BULK_TX_VI], 1655 sc->sc_xfer[URTW_8187B_BULK_TX_VO] 1656 }; 1657 struct usb_xfer *xfer; 1658 int dur = 0, rtsdur = 0, rtsenable = 0, ctsenable = 0, rate, 1659 pkttime = 0, txdur = 0, isshort = 0, xferlen; 1660 uint16_t acktime, rtstime, ctstime; 1661 uint32_t flags; 1662 usb_error_t error; 1663 1664 URTW_ASSERT_LOCKED(sc); 1665 1666 /* 1667 * Software crypto. 1668 */ 1669 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { 1670 k = ieee80211_crypto_encap(ni, m0); 1671 if (k == NULL) { 1672 device_printf(sc->sc_dev, 1673 "ieee80211_crypto_encap returns NULL.\n"); 1674 /* XXX we don't expect the fragmented frames */ 1675 m_freem(m0); 1676 return (ENOBUFS); 1677 } 1678 1679 /* in case packet header moved, reset pointer */ 1680 wh = mtod(m0, struct ieee80211_frame *); 1681 } 1682 1683 if (ieee80211_radiotap_active_vap(vap)) { 1684 struct urtw_tx_radiotap_header *tap = &sc->sc_txtap; 1685 1686 /* XXX Are variables correct? */ 1687 tap->wt_flags = 0; 1688 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); 1689 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); 1690 1691 ieee80211_radiotap_tx(vap, m0); 1692 } 1693 1694 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_MGT || 1695 (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) { 1696 tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)]; 1697 rate = tp->mgmtrate; 1698 } else { 1699 tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)]; 1700 /* for data frames */ 1701 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) 1702 rate = tp->mcastrate; 1703 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) 1704 rate = tp->ucastrate; 1705 else 1706 rate = urtw_rtl2rate(sc->sc_currate); 1707 } 1708 1709 sc->sc_stats.txrates[sc->sc_currate]++; 1710 1711 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) 1712 txdur = pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1713 IEEE80211_CRC_LEN, rate, 0, 0); 1714 else { 1715 acktime = urtw_compute_txtime(14, 2,0, 0); 1716 if ((m0->m_pkthdr.len + 4) > vap->iv_rtsthreshold) { 1717 rtsenable = 1; 1718 ctsenable = 0; 1719 rtstime = urtw_compute_txtime(URTW_ACKCTS_LEN, 2, 0, 0); 1720 ctstime = urtw_compute_txtime(14, 2, 0, 0); 1721 pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1722 IEEE80211_CRC_LEN, rate, 0, isshort); 1723 rtsdur = ctstime + pkttime + acktime + 1724 3 * URTW_ASIFS_TIME; 1725 txdur = rtstime + rtsdur; 1726 } else { 1727 rtsenable = ctsenable = rtsdur = 0; 1728 pkttime = urtw_compute_txtime(m0->m_pkthdr.len + 1729 IEEE80211_CRC_LEN, rate, 0, isshort); 1730 txdur = pkttime + URTW_ASIFS_TIME + acktime; 1731 } 1732 1733 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) 1734 dur = urtw_compute_txtime(m0->m_pkthdr.len + 1735 IEEE80211_CRC_LEN, rate, 0, isshort) + 1736 3 * URTW_ASIFS_TIME + 1737 2 * acktime; 1738 else 1739 dur = URTW_ASIFS_TIME + acktime; 1740 } 1741 *(uint16_t *)wh->i_dur = htole16(dur); 1742 1743 xferlen = m0->m_pkthdr.len; 1744 xferlen += (sc->sc_flags & URTW_RTL8187B) ? (4 * 8) : (4 * 3); 1745 if ((0 == xferlen % 64) || (0 == xferlen % 512)) 1746 xferlen += 1; 1747 1748 bzero(data->buf, URTW_TX_MAXSIZE); 1749 flags = m0->m_pkthdr.len & 0xfff; 1750 flags |= URTW_TX_FLAG_NO_ENC; 1751 if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) && 1752 (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) && 1753 (sc->sc_preamble_mode == URTW_PREAMBLE_MODE_SHORT) && 1754 (sc->sc_currate != 0)) 1755 flags |= URTW_TX_FLAG_SPLCP; 1756 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG) 1757 flags |= URTW_TX_FLAG_MOREFRAG; 1758 1759 flags |= (sc->sc_currate & 0xf) << URTW_TX_FLAG_TXRATE_SHIFT; 1760 1761 if (sc->sc_flags & URTW_RTL8187B) { 1762 struct urtw_8187b_txhdr *tx; 1763 1764 tx = (struct urtw_8187b_txhdr *)data->buf; 1765 if (ctsenable) 1766 flags |= URTW_TX_FLAG_CTS; 1767 if (rtsenable) { 1768 flags |= URTW_TX_FLAG_RTS; 1769 flags |= (urtw_rate2rtl(11) & 0xf) << 1770 URTW_TX_FLAG_RTSRATE_SHIFT; 1771 tx->rtsdur = rtsdur; 1772 } 1773 tx->flag = htole32(flags); 1774 tx->txdur = txdur; 1775 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == 1776 IEEE80211_FC0_TYPE_MGT && 1777 (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) == 1778 IEEE80211_FC0_SUBTYPE_PROBE_RESP) 1779 tx->retry = 1; 1780 else 1781 tx->retry = URTW_TX_MAXRETRY; 1782 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1)); 1783 } else { 1784 struct urtw_8187l_txhdr *tx; 1785 1786 tx = (struct urtw_8187l_txhdr *)data->buf; 1787 if (rtsenable) { 1788 flags |= URTW_TX_FLAG_RTS; 1789 tx->rtsdur = rtsdur; 1790 } 1791 flags |= (urtw_rate2rtl(11) & 0xf) << URTW_TX_FLAG_RTSRATE_SHIFT; 1792 tx->flag = htole32(flags); 1793 tx->retry = 3; /* CW minimum */ 1794 tx->retry = 7 << 4; /* CW maximum */ 1795 tx->retry = URTW_TX_MAXRETRY << 8; /* retry limitation */ 1796 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1)); 1797 } 1798 1799 data->buflen = xferlen; 1800 data->ni = ni; 1801 data->m = m0; 1802 1803 if (sc->sc_flags & URTW_RTL8187B) { 1804 switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) { 1805 case IEEE80211_FC0_TYPE_CTL: 1806 case IEEE80211_FC0_TYPE_MGT: 1807 xfer = sc->sc_xfer[URTW_8187B_BULK_TX_EP12]; 1808 break; 1809 default: 1810 KASSERT(M_WME_GETAC(m0) < URTW_8187B_TXPIPE_MAX, 1811 ("unsupported WME pipe %d", M_WME_GETAC(m0))); 1812 xfer = rtl8187b_pipes[M_WME_GETAC(m0)]; 1813 break; 1814 } 1815 } else 1816 xfer = (prior == URTW_PRIORITY_LOW) ? 1817 sc->sc_xfer[URTW_8187L_BULK_TX_LOW] : 1818 sc->sc_xfer[URTW_8187L_BULK_TX_NORMAL]; 1819 1820 STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next); 1821 usbd_transfer_start(xfer); 1822 1823 error = urtw_led_ctl(sc, URTW_LED_CTL_TX); 1824 if (error != 0) 1825 device_printf(sc->sc_dev, "could not control LED (%d)\n", 1826 error); 1827 return (0); 1828} 1829 1830static int 1831urtw_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) 1832{ 1833 struct ieee80211_node *ni = vap->iv_bss; 1834 struct ieee80211com *ic = vap->iv_ic; 1835 struct urtw_softc *sc = ic->ic_ifp->if_softc; 1836 struct urtw_vap *uvp = URTW_VAP(vap); 1837 usb_error_t error = 0; 1838 1839 DPRINTF(sc, URTW_DEBUG_STATE, "%s: %s -> %s\n", __func__, 1840 ieee80211_state_name[vap->iv_state], 1841 ieee80211_state_name[nstate]); 1842 1843 sc->sc_state = nstate; 1844 1845 IEEE80211_UNLOCK(ic); 1846 URTW_LOCK(sc); 1847 usb_callout_stop(&sc->sc_led_ch); 1848 callout_stop(&sc->sc_watchdog_ch); 1849 1850 switch (nstate) { 1851 case IEEE80211_S_INIT: 1852 case IEEE80211_S_SCAN: 1853 case IEEE80211_S_AUTH: 1854 case IEEE80211_S_ASSOC: 1855 break; 1856 case IEEE80211_S_RUN: 1857 /* setting bssid. */ 1858 urtw_write32_m(sc, URTW_BSSID, ((uint32_t *)ni->ni_bssid)[0]); 1859 urtw_write16_m(sc, URTW_BSSID + 4, 1860 ((uint16_t *)ni->ni_bssid)[2]); 1861 urtw_update_msr(sc); 1862 /* XXX maybe the below would be incorrect. */ 1863 urtw_write16_m(sc, URTW_ATIM_WND, 2); 1864 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100); 1865 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64); 1866 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100); 1867 error = urtw_led_ctl(sc, URTW_LED_CTL_LINK); 1868 if (error != 0) 1869 device_printf(sc->sc_dev, 1870 "could not control LED (%d)\n", error); 1871 break; 1872 default: 1873 break; 1874 } 1875fail: 1876 URTW_UNLOCK(sc); 1877 IEEE80211_LOCK(ic); 1878 return (uvp->newstate(vap, nstate, arg)); 1879} 1880 1881static void 1882urtw_watchdog(void *arg) 1883{ 1884 struct urtw_softc *sc = arg; 1885 struct ifnet *ifp = sc->sc_ifp; 1886 1887 if (sc->sc_txtimer > 0) { 1888 if (--sc->sc_txtimer == 0) { 1889 device_printf(sc->sc_dev, "device timeout\n"); 1890 ifp->if_oerrors++; 1891 return; 1892 } 1893 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc); 1894 } 1895} 1896 1897static void 1898urtw_set_multi(void *arg) 1899{ 1900 struct urtw_softc *sc = arg; 1901 struct ifnet *ifp = sc->sc_ifp; 1902 1903 if (!(ifp->if_flags & IFF_UP)) 1904 return; 1905 1906 /* 1907 * XXX don't know how to set a device. Lack of docs. Just try to set 1908 * IFF_ALLMULTI flag here. 1909 */ 1910 ifp->if_flags |= IFF_ALLMULTI; 1911} 1912 1913static usb_error_t 1914urtw_set_rate(struct urtw_softc *sc) 1915{ 1916 int i, basic_rate, min_rr_rate, max_rr_rate; 1917 uint16_t data; 1918 usb_error_t error; 1919 1920 basic_rate = urtw_rate2rtl(48); 1921 min_rr_rate = urtw_rate2rtl(12); 1922 max_rr_rate = urtw_rate2rtl(48); 1923 1924 urtw_write8_m(sc, URTW_RESP_RATE, 1925 max_rr_rate << URTW_RESP_MAX_RATE_SHIFT | 1926 min_rr_rate << URTW_RESP_MIN_RATE_SHIFT); 1927 1928 urtw_read16_m(sc, URTW_BRSR, &data); 1929 data &= ~URTW_BRSR_MBR_8185; 1930 1931 for (i = 0; i <= basic_rate; i++) 1932 data |= (1 << i); 1933 1934 urtw_write16_m(sc, URTW_BRSR, data); 1935fail: 1936 return (error); 1937} 1938 1939static uint16_t 1940urtw_rate2rtl(int rate) 1941{ 1942#define N(a) (sizeof(a) / sizeof((a)[0])) 1943 int i; 1944 1945 for (i = 0; i < N(urtw_ratetable); i++) { 1946 if (rate == urtw_ratetable[i].reg) 1947 return urtw_ratetable[i].val; 1948 } 1949 1950 return (3); 1951#undef N 1952} 1953 1954static uint16_t 1955urtw_rtl2rate(int rate) 1956{ 1957#define N(a) (sizeof(a) / sizeof((a)[0])) 1958 int i; 1959 1960 for (i = 0; i < N(urtw_ratetable); i++) { 1961 if (rate == urtw_ratetable[i].val) 1962 return urtw_ratetable[i].reg; 1963 } 1964 1965 return (0); 1966#undef N 1967} 1968 1969static usb_error_t 1970urtw_update_msr(struct urtw_softc *sc) 1971{ 1972 struct ifnet *ifp = sc->sc_ifp; 1973 struct ieee80211com *ic = ifp->if_l2com; 1974 uint8_t data; 1975 usb_error_t error; 1976 1977 urtw_read8_m(sc, URTW_MSR, &data); 1978 data &= ~URTW_MSR_LINK_MASK; 1979 1980 if (sc->sc_state == IEEE80211_S_RUN) { 1981 switch (ic->ic_opmode) { 1982 case IEEE80211_M_STA: 1983 case IEEE80211_M_MONITOR: 1984 data |= URTW_MSR_LINK_STA; 1985 if (sc->sc_flags & URTW_RTL8187B) 1986 data |= URTW_MSR_LINK_ENEDCA; 1987 break; 1988 case IEEE80211_M_IBSS: 1989 data |= URTW_MSR_LINK_ADHOC; 1990 break; 1991 case IEEE80211_M_HOSTAP: 1992 data |= URTW_MSR_LINK_HOSTAP; 1993 break; 1994 default: 1995 panic("unsupported operation mode 0x%x\n", 1996 ic->ic_opmode); 1997 /* never reach */ 1998 } 1999 } else 2000 data |= URTW_MSR_LINK_NONE; 2001 2002 urtw_write8_m(sc, URTW_MSR, data); 2003fail: 2004 return (error); 2005} 2006 2007static usb_error_t 2008urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data) 2009{ 2010 struct usb_device_request req; 2011 usb_error_t error; 2012 2013 URTW_ASSERT_LOCKED(sc); 2014 2015 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2016 req.bRequest = URTW_8187_GETREGS_REQ; 2017 USETW(req.wValue, (val & 0xff) | 0xff00); 2018 USETW(req.wIndex, (val >> 8) & 0x3); 2019 USETW(req.wLength, sizeof(uint8_t)); 2020 2021 error = urtw_do_request(sc, &req, data); 2022 return (error); 2023} 2024 2025static usb_error_t 2026urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data) 2027{ 2028 struct usb_device_request req; 2029 usb_error_t error; 2030 2031 URTW_ASSERT_LOCKED(sc); 2032 2033 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2034 req.bRequest = URTW_8187_GETREGS_REQ; 2035 USETW(req.wValue, (val & 0xff) | 0xff00); 2036 USETW(req.wIndex, (val >> 8) & 0x3); 2037 USETW(req.wLength, sizeof(uint16_t)); 2038 2039 error = urtw_do_request(sc, &req, data); 2040 return (error); 2041} 2042 2043static usb_error_t 2044urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data) 2045{ 2046 struct usb_device_request req; 2047 usb_error_t error; 2048 2049 URTW_ASSERT_LOCKED(sc); 2050 2051 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2052 req.bRequest = URTW_8187_GETREGS_REQ; 2053 USETW(req.wValue, (val & 0xff) | 0xff00); 2054 USETW(req.wIndex, (val >> 8) & 0x3); 2055 USETW(req.wLength, sizeof(uint32_t)); 2056 2057 error = urtw_do_request(sc, &req, data); 2058 return (error); 2059} 2060 2061static usb_error_t 2062urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data) 2063{ 2064 struct usb_device_request req; 2065 2066 URTW_ASSERT_LOCKED(sc); 2067 2068 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2069 req.bRequest = URTW_8187_SETREGS_REQ; 2070 USETW(req.wValue, (val & 0xff) | 0xff00); 2071 USETW(req.wIndex, (val >> 8) & 0x3); 2072 USETW(req.wLength, sizeof(uint8_t)); 2073 2074 return (urtw_do_request(sc, &req, &data)); 2075} 2076 2077static usb_error_t 2078urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data) 2079{ 2080 struct usb_device_request req; 2081 2082 URTW_ASSERT_LOCKED(sc); 2083 2084 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2085 req.bRequest = URTW_8187_SETREGS_REQ; 2086 USETW(req.wValue, (val & 0xff) | 0xff00); 2087 USETW(req.wIndex, (val >> 8) & 0x3); 2088 USETW(req.wLength, sizeof(uint16_t)); 2089 2090 return (urtw_do_request(sc, &req, &data)); 2091} 2092 2093static usb_error_t 2094urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data) 2095{ 2096 struct usb_device_request req; 2097 2098 URTW_ASSERT_LOCKED(sc); 2099 2100 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2101 req.bRequest = URTW_8187_SETREGS_REQ; 2102 USETW(req.wValue, (val & 0xff) | 0xff00); 2103 USETW(req.wIndex, (val >> 8) & 0x3); 2104 USETW(req.wLength, sizeof(uint32_t)); 2105 2106 return (urtw_do_request(sc, &req, &data)); 2107} 2108 2109static usb_error_t 2110urtw_get_macaddr(struct urtw_softc *sc) 2111{ 2112 uint32_t data; 2113 usb_error_t error; 2114 2115 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data); 2116 if (error != 0) 2117 goto fail; 2118 sc->sc_bssid[0] = data & 0xff; 2119 sc->sc_bssid[1] = (data & 0xff00) >> 8; 2120 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data); 2121 if (error != 0) 2122 goto fail; 2123 sc->sc_bssid[2] = data & 0xff; 2124 sc->sc_bssid[3] = (data & 0xff00) >> 8; 2125 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data); 2126 if (error != 0) 2127 goto fail; 2128 sc->sc_bssid[4] = data & 0xff; 2129 sc->sc_bssid[5] = (data & 0xff00) >> 8; 2130fail: 2131 return (error); 2132} 2133 2134static usb_error_t 2135urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data) 2136{ 2137#define URTW_READCMD_LEN 3 2138 int addrlen, i; 2139 int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 }; 2140 usb_error_t error; 2141 2142 /* NB: make sure the buffer is initialized */ 2143 *data = 0; 2144 2145 /* enable EPROM programming */ 2146 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE); 2147 DELAY(URTW_EPROM_DELAY); 2148 2149 error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE); 2150 if (error != 0) 2151 goto fail; 2152 error = urtw_eprom_ck(sc); 2153 if (error != 0) 2154 goto fail; 2155 error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN); 2156 if (error != 0) 2157 goto fail; 2158 if (sc->sc_epromtype == URTW_EEPROM_93C56) { 2159 addrlen = 8; 2160 addrstr[0] = addr & (1 << 7); 2161 addrstr[1] = addr & (1 << 6); 2162 addrstr[2] = addr & (1 << 5); 2163 addrstr[3] = addr & (1 << 4); 2164 addrstr[4] = addr & (1 << 3); 2165 addrstr[5] = addr & (1 << 2); 2166 addrstr[6] = addr & (1 << 1); 2167 addrstr[7] = addr & (1 << 0); 2168 } else { 2169 addrlen=6; 2170 addrstr[0] = addr & (1 << 5); 2171 addrstr[1] = addr & (1 << 4); 2172 addrstr[2] = addr & (1 << 3); 2173 addrstr[3] = addr & (1 << 2); 2174 addrstr[4] = addr & (1 << 1); 2175 addrstr[5] = addr & (1 << 0); 2176 } 2177 error = urtw_eprom_sendbits(sc, addrstr, addrlen); 2178 if (error != 0) 2179 goto fail; 2180 2181 error = urtw_eprom_writebit(sc, 0); 2182 if (error != 0) 2183 goto fail; 2184 2185 for (i = 0; i < 16; i++) { 2186 error = urtw_eprom_ck(sc); 2187 if (error != 0) 2188 goto fail; 2189 error = urtw_eprom_readbit(sc, &data16); 2190 if (error != 0) 2191 goto fail; 2192 2193 (*data) |= (data16 << (15 - i)); 2194 } 2195 2196 error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE); 2197 if (error != 0) 2198 goto fail; 2199 error = urtw_eprom_ck(sc); 2200 if (error != 0) 2201 goto fail; 2202 2203 /* now disable EPROM programming */ 2204 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE); 2205fail: 2206 return (error); 2207#undef URTW_READCMD_LEN 2208} 2209 2210static usb_error_t 2211urtw_eprom_cs(struct urtw_softc *sc, int able) 2212{ 2213 uint8_t data; 2214 usb_error_t error; 2215 2216 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2217 if (able == URTW_EPROM_ENABLE) 2218 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS); 2219 else 2220 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS); 2221 DELAY(URTW_EPROM_DELAY); 2222fail: 2223 return (error); 2224} 2225 2226static usb_error_t 2227urtw_eprom_ck(struct urtw_softc *sc) 2228{ 2229 uint8_t data; 2230 usb_error_t error; 2231 2232 /* masking */ 2233 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2234 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK); 2235 DELAY(URTW_EPROM_DELAY); 2236 /* unmasking */ 2237 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2238 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK); 2239 DELAY(URTW_EPROM_DELAY); 2240fail: 2241 return (error); 2242} 2243 2244static usb_error_t 2245urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data) 2246{ 2247 uint8_t data8; 2248 usb_error_t error; 2249 2250 urtw_read8_m(sc, URTW_EPROM_CMD, &data8); 2251 *data = (data8 & URTW_EPROM_READBIT) ? 1 : 0; 2252 DELAY(URTW_EPROM_DELAY); 2253 2254fail: 2255 return (error); 2256} 2257 2258static usb_error_t 2259urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit) 2260{ 2261 uint8_t data; 2262 usb_error_t error; 2263 2264 urtw_read8_m(sc, URTW_EPROM_CMD, &data); 2265 if (bit != 0) 2266 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT); 2267 else 2268 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT); 2269 DELAY(URTW_EPROM_DELAY); 2270fail: 2271 return (error); 2272} 2273 2274static usb_error_t 2275urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen) 2276{ 2277 int i = 0; 2278 usb_error_t error = 0; 2279 2280 for (i = 0; i < buflen; i++) { 2281 error = urtw_eprom_writebit(sc, buf[i]); 2282 if (error != 0) 2283 goto fail; 2284 error = urtw_eprom_ck(sc); 2285 if (error != 0) 2286 goto fail; 2287 } 2288fail: 2289 return (error); 2290} 2291 2292 2293static usb_error_t 2294urtw_get_txpwr(struct urtw_softc *sc) 2295{ 2296 int i, j; 2297 uint32_t data; 2298 usb_error_t error; 2299 2300 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data); 2301 if (error != 0) 2302 goto fail; 2303 sc->sc_txpwr_cck_base = data & 0xf; 2304 sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf; 2305 2306 for (i = 1, j = 0; i < 6; i += 2, j++) { 2307 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data); 2308 if (error != 0) 2309 goto fail; 2310 sc->sc_txpwr_cck[i] = data & 0xf; 2311 sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8; 2312 sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4; 2313 sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12; 2314 } 2315 for (i = 1, j = 0; i < 4; i += 2, j++) { 2316 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data); 2317 if (error != 0) 2318 goto fail; 2319 sc->sc_txpwr_cck[i + 6] = data & 0xf; 2320 sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8; 2321 sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4; 2322 sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12; 2323 } 2324 if (sc->sc_flags & URTW_RTL8187B) { 2325 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2, &data); 2326 if (error != 0) 2327 goto fail; 2328 sc->sc_txpwr_cck[1 + 6 + 4] = data & 0xf; 2329 sc->sc_txpwr_ofdm[1 + 6 + 4] = (data & 0xf0) >> 4; 2330 error = urtw_eprom_read32(sc, 0x0a, &data); 2331 if (error != 0) 2332 goto fail; 2333 sc->sc_txpwr_cck[2 + 6 + 4] = data & 0xf; 2334 sc->sc_txpwr_ofdm[2 + 6 + 4] = (data & 0xf0) >> 4; 2335 error = urtw_eprom_read32(sc, 0x1c, &data); 2336 if (error != 0) 2337 goto fail; 2338 sc->sc_txpwr_cck[3 + 6 + 4] = data & 0xf; 2339 sc->sc_txpwr_cck[3 + 6 + 4 + 1] = (data & 0xf00) >> 8; 2340 sc->sc_txpwr_ofdm[3 + 6 + 4] = (data & 0xf0) >> 4; 2341 sc->sc_txpwr_ofdm[3 + 6 + 4 + 1] = (data & 0xf000) >> 12; 2342 } else { 2343 for (i = 1, j = 0; i < 4; i += 2, j++) { 2344 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j, 2345 &data); 2346 if (error != 0) 2347 goto fail; 2348 sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf; 2349 sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8; 2350 sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4; 2351 sc->sc_txpwr_ofdm[i + 6 + 4 + 1] = (data & 0xf000) >> 12; 2352 } 2353 } 2354fail: 2355 return (error); 2356} 2357 2358 2359static usb_error_t 2360urtw_get_rfchip(struct urtw_softc *sc) 2361{ 2362 int ret; 2363 uint8_t data8; 2364 uint32_t data; 2365 usb_error_t error; 2366 2367 if (sc->sc_flags & URTW_RTL8187B) { 2368 urtw_read8_m(sc, 0xe1, &data8); 2369 switch (data8) { 2370 case 0: 2371 sc->sc_flags |= URTW_RTL8187B_REV_B; 2372 break; 2373 case 1: 2374 sc->sc_flags |= URTW_RTL8187B_REV_D; 2375 break; 2376 case 2: 2377 sc->sc_flags |= URTW_RTL8187B_REV_E; 2378 break; 2379 default: 2380 device_printf(sc->sc_dev, "unknown type: %#x\n", data8); 2381 sc->sc_flags |= URTW_RTL8187B_REV_B; 2382 break; 2383 } 2384 } else { 2385 urtw_read32_m(sc, URTW_TX_CONF, &data); 2386 switch (data & URTW_TX_HWMASK) { 2387 case URTW_TX_R8187vD_B: 2388 sc->sc_flags |= URTW_RTL8187B; 2389 break; 2390 case URTW_TX_R8187vD: 2391 break; 2392 default: 2393 device_printf(sc->sc_dev, "unknown RTL8187L type: %#x\n", 2394 data & URTW_TX_HWMASK); 2395 break; 2396 } 2397 } 2398 2399 error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data); 2400 if (error != 0) 2401 goto fail; 2402 switch (data & 0xff) { 2403 case URTW_EPROM_RFCHIPID_RTL8225U: 2404 error = urtw_8225_isv2(sc, &ret); 2405 if (error != 0) 2406 goto fail; 2407 if (ret == 0) { 2408 sc->sc_rf_init = urtw_8225_rf_init; 2409 sc->sc_rf_set_sens = urtw_8225_rf_set_sens; 2410 sc->sc_rf_set_chan = urtw_8225_rf_set_chan; 2411 sc->sc_rf_stop = urtw_8225_rf_stop; 2412 } else { 2413 sc->sc_rf_init = urtw_8225v2_rf_init; 2414 sc->sc_rf_set_chan = urtw_8225v2_rf_set_chan; 2415 sc->sc_rf_stop = urtw_8225_rf_stop; 2416 } 2417 sc->sc_max_sens = URTW_8225_RF_MAX_SENS; 2418 sc->sc_sens = URTW_8225_RF_DEF_SENS; 2419 break; 2420 case URTW_EPROM_RFCHIPID_RTL8225Z2: 2421 sc->sc_rf_init = urtw_8225v2b_rf_init; 2422 sc->sc_rf_set_chan = urtw_8225v2b_rf_set_chan; 2423 sc->sc_max_sens = URTW_8225_RF_MAX_SENS; 2424 sc->sc_sens = URTW_8225_RF_DEF_SENS; 2425 sc->sc_rf_stop = urtw_8225_rf_stop; 2426 break; 2427 default: 2428 panic("unsupported RF chip %d\n", data & 0xff); 2429 /* never reach */ 2430 } 2431 2432 device_printf(sc->sc_dev, "%s rf %s hwrev %s\n", 2433 (sc->sc_flags & URTW_RTL8187B) ? "rtl8187b" : "rtl8187l", 2434 ((data & 0xff) == URTW_EPROM_RFCHIPID_RTL8225U) ? "rtl8225u" : 2435 "rtl8225z2", 2436 (sc->sc_flags & URTW_RTL8187B) ? ((data8 == 0) ? "b" : 2437 (data8 == 1) ? "d" : "e") : "none"); 2438 2439fail: 2440 return (error); 2441} 2442 2443 2444static usb_error_t 2445urtw_led_init(struct urtw_softc *sc) 2446{ 2447 uint32_t rev; 2448 usb_error_t error; 2449 2450 urtw_read8_m(sc, URTW_PSR, &sc->sc_psr); 2451 error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev); 2452 if (error != 0) 2453 goto fail; 2454 2455 switch (rev & URTW_EPROM_CID_MASK) { 2456 case URTW_EPROM_CID_ALPHA0: 2457 sc->sc_strategy = URTW_SW_LED_MODE1; 2458 break; 2459 case URTW_EPROM_CID_SERCOMM_PS: 2460 sc->sc_strategy = URTW_SW_LED_MODE3; 2461 break; 2462 case URTW_EPROM_CID_HW_LED: 2463 sc->sc_strategy = URTW_HW_LED; 2464 break; 2465 case URTW_EPROM_CID_RSVD0: 2466 case URTW_EPROM_CID_RSVD1: 2467 default: 2468 sc->sc_strategy = URTW_SW_LED_MODE0; 2469 break; 2470 } 2471 2472 sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0; 2473 2474fail: 2475 return (error); 2476} 2477 2478 2479static usb_error_t 2480urtw_8225_rf_init(struct urtw_softc *sc) 2481{ 2482#define N(a) (sizeof(a) / sizeof((a)[0])) 2483 int i; 2484 uint16_t data; 2485 usb_error_t error; 2486 2487 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 2488 if (error) 2489 goto fail; 2490 2491 error = urtw_8225_usb_init(sc); 2492 if (error) 2493 goto fail; 2494 2495 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008); 2496 urtw_read16_m(sc, URTW_BRSR, &data); /* XXX ??? */ 2497 urtw_write16_m(sc, URTW_BRSR, 0xffff); 2498 urtw_write32_m(sc, URTW_RF_PARA, 0x100044); 2499 2500 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2501 if (error) 2502 goto fail; 2503 urtw_write8_m(sc, URTW_CONFIG3, 0x44); 2504 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2505 if (error) 2506 goto fail; 2507 2508 error = urtw_8185_rf_pins_enable(sc); 2509 if (error) 2510 goto fail; 2511 usb_pause_mtx(&sc->sc_mtx, 1000); 2512 2513 for (i = 0; i < N(urtw_8225_rf_part1); i++) { 2514 urtw_8225_write(sc, urtw_8225_rf_part1[i].reg, 2515 urtw_8225_rf_part1[i].val); 2516 usb_pause_mtx(&sc->sc_mtx, 1); 2517 } 2518 usb_pause_mtx(&sc->sc_mtx, 100); 2519 urtw_8225_write(sc, 2520 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2521 usb_pause_mtx(&sc->sc_mtx, 200); 2522 urtw_8225_write(sc, 2523 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2524 usb_pause_mtx(&sc->sc_mtx, 200); 2525 urtw_8225_write(sc, 2526 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC3); 2527 2528 for (i = 0; i < 95; i++) { 2529 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 2530 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, urtw_8225_rxgain[i]); 2531 } 2532 2533 urtw_8225_write(sc, 2534 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC4); 2535 urtw_8225_write(sc, 2536 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC5); 2537 2538 for (i = 0; i < 128; i++) { 2539 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]); 2540 usb_pause_mtx(&sc->sc_mtx, 1); 2541 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80); 2542 usb_pause_mtx(&sc->sc_mtx, 1); 2543 } 2544 2545 for (i = 0; i < N(urtw_8225_rf_part2); i++) { 2546 urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg, 2547 urtw_8225_rf_part2[i].val); 2548 usb_pause_mtx(&sc->sc_mtx, 1); 2549 } 2550 2551 error = urtw_8225_setgain(sc, 4); 2552 if (error) 2553 goto fail; 2554 2555 for (i = 0; i < N(urtw_8225_rf_part3); i++) { 2556 urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg, 2557 urtw_8225_rf_part3[i].val); 2558 usb_pause_mtx(&sc->sc_mtx, 1); 2559 } 2560 2561 urtw_write8_m(sc, URTW_TESTR, 0x0d); 2562 2563 error = urtw_8225_set_txpwrlvl(sc, 1); 2564 if (error) 2565 goto fail; 2566 2567 urtw_8187_write_phy_cck(sc, 0x10, 0x9b); 2568 usb_pause_mtx(&sc->sc_mtx, 1); 2569 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90); 2570 usb_pause_mtx(&sc->sc_mtx, 1); 2571 2572 /* TX ant A, 0x0 for B */ 2573 error = urtw_8185_tx_antenna(sc, 0x3); 2574 if (error) 2575 goto fail; 2576 urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002); 2577 2578 error = urtw_8225_rf_set_chan(sc, 1); 2579fail: 2580 return (error); 2581#undef N 2582} 2583 2584static usb_error_t 2585urtw_8185_rf_pins_enable(struct urtw_softc *sc) 2586{ 2587 usb_error_t error = 0; 2588 2589 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7); 2590fail: 2591 return (error); 2592} 2593 2594static usb_error_t 2595urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant) 2596{ 2597 usb_error_t error; 2598 2599 urtw_write8_m(sc, URTW_TX_ANTENNA, ant); 2600 usb_pause_mtx(&sc->sc_mtx, 1); 2601fail: 2602 return (error); 2603} 2604 2605static usb_error_t 2606urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2607{ 2608 2609 data = data & 0xff; 2610 return urtw_8187_write_phy(sc, addr, data); 2611} 2612 2613static usb_error_t 2614urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2615{ 2616 2617 data = data & 0xff; 2618 return urtw_8187_write_phy(sc, addr, data | 0x10000); 2619} 2620 2621static usb_error_t 2622urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data) 2623{ 2624 uint32_t phyw; 2625 usb_error_t error; 2626 2627 phyw = ((data << 8) | (addr | 0x80)); 2628 urtw_write8_m(sc, URTW_PHY_MAGIC4, ((phyw & 0xff000000) >> 24)); 2629 urtw_write8_m(sc, URTW_PHY_MAGIC3, ((phyw & 0x00ff0000) >> 16)); 2630 urtw_write8_m(sc, URTW_PHY_MAGIC2, ((phyw & 0x0000ff00) >> 8)); 2631 urtw_write8_m(sc, URTW_PHY_MAGIC1, ((phyw & 0x000000ff))); 2632 usb_pause_mtx(&sc->sc_mtx, 1); 2633fail: 2634 return (error); 2635} 2636 2637static usb_error_t 2638urtw_8225_setgain(struct urtw_softc *sc, int16_t gain) 2639{ 2640 usb_error_t error; 2641 2642 urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]); 2643 urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]); 2644 urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]); 2645 urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]); 2646fail: 2647 return (error); 2648} 2649 2650static usb_error_t 2651urtw_8225_usb_init(struct urtw_softc *sc) 2652{ 2653 uint8_t data; 2654 usb_error_t error; 2655 2656 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0); 2657 urtw_write8_m(sc, URTW_GPIO, 0); 2658 error = urtw_read8e(sc, 0x53, &data); 2659 if (error) 2660 goto fail; 2661 error = urtw_write8e(sc, 0x53, data | (1 << 7)); 2662 if (error) 2663 goto fail; 2664 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4); 2665 urtw_write8_m(sc, URTW_GPIO, 0x20); 2666 urtw_write8_m(sc, URTW_GP_ENABLE, 0); 2667 2668 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80); 2669 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80); 2670 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80); 2671 2672 usb_pause_mtx(&sc->sc_mtx, 500); 2673fail: 2674 return (error); 2675} 2676 2677static usb_error_t 2678urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data) 2679{ 2680 uint16_t d80, d82, d84; 2681 usb_error_t error; 2682 2683 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80); 2684 d80 &= URTW_RF_PINS_MAGIC1; 2685 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82); 2686 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84); 2687 d84 &= URTW_RF_PINS_MAGIC2; 2688 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | URTW_RF_PINS_MAGIC3); 2689 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | URTW_RF_PINS_MAGIC3); 2690 DELAY(10); 2691 2692 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2693 DELAY(2); 2694 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80); 2695 DELAY(10); 2696 2697 error = urtw_8225_write_s16(sc, addr, 0x8225, &data); 2698 if (error != 0) 2699 goto fail; 2700 2701 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2702 DELAY(10); 2703 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN); 2704 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84); 2705 usb_pause_mtx(&sc->sc_mtx, 2); 2706fail: 2707 return (error); 2708} 2709 2710/* XXX why we should allocalte memory buffer instead of using memory stack? */ 2711static usb_error_t 2712urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index, 2713 uint16_t *data) 2714{ 2715 uint8_t *buf; 2716 uint16_t data16; 2717 struct usb_device_request *req; 2718 usb_error_t error = 0; 2719 2720 data16 = *data; 2721 req = (usb_device_request_t *)malloc(sizeof(usb_device_request_t), 2722 M_80211_VAP, M_NOWAIT | M_ZERO); 2723 if (req == NULL) { 2724 device_printf(sc->sc_dev, "could not allocate a memory\n"); 2725 goto fail0; 2726 } 2727 buf = (uint8_t *)malloc(2, M_80211_VAP, M_NOWAIT | M_ZERO); 2728 if (req == NULL) { 2729 device_printf(sc->sc_dev, "could not allocate a memory\n"); 2730 goto fail1; 2731 } 2732 2733 req->bmRequestType = UT_WRITE_VENDOR_DEVICE; 2734 req->bRequest = URTW_8187_SETREGS_REQ; 2735 USETW(req->wValue, addr); 2736 USETW(req->wIndex, index); 2737 USETW(req->wLength, sizeof(uint16_t)); 2738 buf[0] = (data16 & 0x00ff); 2739 buf[1] = (data16 & 0xff00) >> 8; 2740 2741 error = urtw_do_request(sc, req, buf); 2742 2743 free(buf, M_80211_VAP); 2744fail1: free(req, M_80211_VAP); 2745fail0: return (error); 2746} 2747 2748static usb_error_t 2749urtw_8225_rf_set_chan(struct urtw_softc *sc, int chan) 2750{ 2751 usb_error_t error; 2752 2753 error = urtw_8225_set_txpwrlvl(sc, chan); 2754 if (error) 2755 goto fail; 2756 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 2757 usb_pause_mtx(&sc->sc_mtx, 10); 2758fail: 2759 return (error); 2760} 2761 2762static usb_error_t 2763urtw_8225_rf_set_sens(struct urtw_softc *sc, int sens) 2764{ 2765 usb_error_t error; 2766 2767 if (sens < 0 || sens > 6) 2768 return -1; 2769 2770 if (sens > 4) 2771 urtw_8225_write(sc, 2772 URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC1); 2773 else 2774 urtw_8225_write(sc, 2775 URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC2); 2776 2777 sens = 6 - sens; 2778 error = urtw_8225_setgain(sc, sens); 2779 if (error) 2780 goto fail; 2781 2782 urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[sens]); 2783 2784fail: 2785 return (error); 2786} 2787 2788static usb_error_t 2789urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan) 2790{ 2791 int i, idx, set; 2792 uint8_t *cck_pwltable; 2793 uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max; 2794 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 2795 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 2796 usb_error_t error; 2797 2798 cck_pwrlvl_max = 11; 2799 ofdm_pwrlvl_max = 25; /* 12 -> 25 */ 2800 ofdm_pwrlvl_min = 10; 2801 2802 /* CCK power setting */ 2803 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl; 2804 idx = cck_pwrlvl % 6; 2805 set = cck_pwrlvl / 6; 2806 cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 : 2807 urtw_8225_txpwr_cck; 2808 2809 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 2810 urtw_8225_tx_gain_cck_ofdm[set] >> 1); 2811 for (i = 0; i < 8; i++) { 2812 urtw_8187_write_phy_cck(sc, 0x44 + i, 2813 cck_pwltable[idx * 8 + i]); 2814 } 2815 usb_pause_mtx(&sc->sc_mtx, 1); 2816 2817 /* OFDM power setting */ 2818 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 2819 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 2820 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 2821 2822 idx = ofdm_pwrlvl % 6; 2823 set = ofdm_pwrlvl / 6; 2824 2825 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 2826 if (error) 2827 goto fail; 2828 urtw_8187_write_phy_ofdm(sc, 2, 0x42); 2829 urtw_8187_write_phy_ofdm(sc, 6, 0); 2830 urtw_8187_write_phy_ofdm(sc, 8, 0); 2831 2832 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 2833 urtw_8225_tx_gain_cck_ofdm[set] >> 1); 2834 urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]); 2835 urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]); 2836 usb_pause_mtx(&sc->sc_mtx, 1); 2837fail: 2838 return (error); 2839} 2840 2841 2842static usb_error_t 2843urtw_8225_rf_stop(struct urtw_softc *sc) 2844{ 2845 uint8_t data; 2846 usb_error_t error; 2847 2848 urtw_8225_write(sc, 0x4, 0x1f); 2849 2850 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2851 if (error) 2852 goto fail; 2853 2854 urtw_read8_m(sc, URTW_CONFIG3, &data); 2855 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 2856 if (sc->sc_flags & URTW_RTL8187B) { 2857 urtw_write32_m(sc, URTW_ANAPARAM2, 2858 URTW_8187B_8225_ANAPARAM2_OFF); 2859 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_OFF); 2860 urtw_write32_m(sc, URTW_ANAPARAM3, 2861 URTW_8187B_8225_ANAPARAM3_OFF); 2862 } else { 2863 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8225_ANAPARAM2_OFF); 2864 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8225_ANAPARAM_OFF); 2865 } 2866 2867 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 2868 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2869 if (error) 2870 goto fail; 2871 2872fail: 2873 return (error); 2874} 2875 2876static usb_error_t 2877urtw_8225v2_rf_init(struct urtw_softc *sc) 2878{ 2879#define N(a) (sizeof(a) / sizeof((a)[0])) 2880 int i; 2881 uint16_t data; 2882 uint32_t data32; 2883 usb_error_t error; 2884 2885 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 2886 if (error) 2887 goto fail; 2888 2889 error = urtw_8225_usb_init(sc); 2890 if (error) 2891 goto fail; 2892 2893 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008); 2894 urtw_read16_m(sc, URTW_BRSR, &data); /* XXX ??? */ 2895 urtw_write16_m(sc, URTW_BRSR, 0xffff); 2896 urtw_write32_m(sc, URTW_RF_PARA, 0x100044); 2897 2898 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 2899 if (error) 2900 goto fail; 2901 urtw_write8_m(sc, URTW_CONFIG3, 0x44); 2902 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 2903 if (error) 2904 goto fail; 2905 2906 error = urtw_8185_rf_pins_enable(sc); 2907 if (error) 2908 goto fail; 2909 2910 usb_pause_mtx(&sc->sc_mtx, 500); 2911 2912 for (i = 0; i < N(urtw_8225v2_rf_part1); i++) { 2913 urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg, 2914 urtw_8225v2_rf_part1[i].val); 2915 } 2916 usb_pause_mtx(&sc->sc_mtx, 50); 2917 2918 urtw_8225_write(sc, 2919 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC1); 2920 2921 for (i = 0; i < 95; i++) { 2922 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 2923 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 2924 urtw_8225v2_rxgain[i]); 2925 } 2926 2927 urtw_8225_write(sc, 2928 URTW_8225_ADDR_3_MAGIC, URTW_8225_ADDR_3_DATA_MAGIC1); 2929 urtw_8225_write(sc, 2930 URTW_8225_ADDR_5_MAGIC, URTW_8225_ADDR_5_DATA_MAGIC1); 2931 urtw_8225_write(sc, 2932 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC2); 2933 urtw_8225_write(sc, 2934 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2935 usb_pause_mtx(&sc->sc_mtx, 100); 2936 urtw_8225_write(sc, 2937 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2938 usb_pause_mtx(&sc->sc_mtx, 100); 2939 2940 error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32); 2941 if (error != 0) 2942 goto fail; 2943 if (data32 != URTW_8225_ADDR_6_DATA_MAGIC1) 2944 device_printf(sc->sc_dev, "expect 0xe6!! (0x%x)\n", data32); 2945 if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) { 2946 urtw_8225_write(sc, 2947 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1); 2948 usb_pause_mtx(&sc->sc_mtx, 100); 2949 urtw_8225_write(sc, 2950 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2); 2951 usb_pause_mtx(&sc->sc_mtx, 50); 2952 error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32); 2953 if (error != 0) 2954 goto fail; 2955 if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) 2956 device_printf(sc->sc_dev, "RF calibration failed\n"); 2957 } 2958 usb_pause_mtx(&sc->sc_mtx, 100); 2959 2960 urtw_8225_write(sc, 2961 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC6); 2962 for (i = 0; i < 128; i++) { 2963 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]); 2964 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80); 2965 } 2966 2967 for (i = 0; i < N(urtw_8225v2_rf_part2); i++) { 2968 urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg, 2969 urtw_8225v2_rf_part2[i].val); 2970 } 2971 2972 error = urtw_8225v2_setgain(sc, 4); 2973 if (error) 2974 goto fail; 2975 2976 for (i = 0; i < N(urtw_8225v2_rf_part3); i++) { 2977 urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg, 2978 urtw_8225v2_rf_part3[i].val); 2979 } 2980 2981 urtw_write8_m(sc, URTW_TESTR, 0x0d); 2982 2983 error = urtw_8225v2_set_txpwrlvl(sc, 1); 2984 if (error) 2985 goto fail; 2986 2987 urtw_8187_write_phy_cck(sc, 0x10, 0x9b); 2988 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90); 2989 2990 /* TX ant A, 0x0 for B */ 2991 error = urtw_8185_tx_antenna(sc, 0x3); 2992 if (error) 2993 goto fail; 2994 urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002); 2995 2996 error = urtw_8225_rf_set_chan(sc, 1); 2997fail: 2998 return (error); 2999#undef N 3000} 3001 3002static usb_error_t 3003urtw_8225v2_rf_set_chan(struct urtw_softc *sc, int chan) 3004{ 3005 usb_error_t error; 3006 3007 error = urtw_8225v2_set_txpwrlvl(sc, chan); 3008 if (error) 3009 goto fail; 3010 3011 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 3012 usb_pause_mtx(&sc->sc_mtx, 10); 3013fail: 3014 return (error); 3015} 3016 3017static usb_error_t 3018urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data) 3019{ 3020 int i; 3021 int16_t bit; 3022 uint8_t rlen = 12, wlen = 6; 3023 uint16_t o1, o2, o3, tmp; 3024 uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27; 3025 uint32_t mask = 0x80000000, value = 0; 3026 usb_error_t error; 3027 3028 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1); 3029 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2); 3030 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3); 3031 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | URTW_RF_PINS_MAGIC4); 3032 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | URTW_RF_PINS_MAGIC4); 3033 o1 &= ~URTW_RF_PINS_MAGIC4; 3034 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN); 3035 DELAY(5); 3036 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1); 3037 DELAY(5); 3038 3039 for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) { 3040 bit = ((d2w & mask) != 0) ? 1 : 0; 3041 3042 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1); 3043 DELAY(2); 3044 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3045 URTW_BB_HOST_BANG_CLK); 3046 DELAY(2); 3047 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3048 URTW_BB_HOST_BANG_CLK); 3049 DELAY(2); 3050 mask = mask >> 1; 3051 if (i == 2) 3052 break; 3053 bit = ((d2w & mask) != 0) ? 1 : 0; 3054 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3055 URTW_BB_HOST_BANG_CLK); 3056 DELAY(2); 3057 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | 3058 URTW_BB_HOST_BANG_CLK); 3059 DELAY(2); 3060 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1); 3061 DELAY(1); 3062 } 3063 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW | 3064 URTW_BB_HOST_BANG_CLK); 3065 DELAY(2); 3066 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW); 3067 DELAY(2); 3068 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW); 3069 DELAY(2); 3070 3071 mask = 0x800; 3072 for (i = 0; i < rlen; i++, mask = mask >> 1) { 3073 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3074 o1 | URTW_BB_HOST_BANG_RW); 3075 DELAY(2); 3076 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3077 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3078 DELAY(2); 3079 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3080 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3081 DELAY(2); 3082 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3083 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK); 3084 DELAY(2); 3085 3086 urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp); 3087 value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0); 3088 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 3089 o1 | URTW_BB_HOST_BANG_RW); 3090 DELAY(2); 3091 } 3092 3093 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN | 3094 URTW_BB_HOST_BANG_RW); 3095 DELAY(2); 3096 3097 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2); 3098 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3); 3099 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_OUTPUT_MAGIC1); 3100 3101 if (data != NULL) 3102 *data = value; 3103fail: 3104 return (error); 3105} 3106 3107 3108static usb_error_t 3109urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan) 3110{ 3111 int i; 3112 uint8_t *cck_pwrtable; 3113 uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10; 3114 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 3115 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 3116 usb_error_t error; 3117 3118 /* CCK power setting */ 3119 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl; 3120 cck_pwrlvl += sc->sc_txpwr_cck_base; 3121 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl; 3122 cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 : 3123 urtw_8225v2_txpwr_cck; 3124 3125 for (i = 0; i < 8; i++) 3126 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]); 3127 3128 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 3129 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]); 3130 usb_pause_mtx(&sc->sc_mtx, 1); 3131 3132 /* OFDM power setting */ 3133 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ? 3134 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min; 3135 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base; 3136 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 3137 3138 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3139 if (error) 3140 goto fail; 3141 3142 urtw_8187_write_phy_ofdm(sc, 2, 0x42); 3143 urtw_8187_write_phy_ofdm(sc, 5, 0x0); 3144 urtw_8187_write_phy_ofdm(sc, 6, 0x40); 3145 urtw_8187_write_phy_ofdm(sc, 7, 0x0); 3146 urtw_8187_write_phy_ofdm(sc, 8, 0x40); 3147 3148 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 3149 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]); 3150 usb_pause_mtx(&sc->sc_mtx, 1); 3151fail: 3152 return (error); 3153} 3154 3155static usb_error_t 3156urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain) 3157{ 3158 uint8_t *gainp; 3159 usb_error_t error; 3160 3161 /* XXX for A? */ 3162 gainp = urtw_8225v2_gain_bg; 3163 urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]); 3164 usb_pause_mtx(&sc->sc_mtx, 1); 3165 urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]); 3166 usb_pause_mtx(&sc->sc_mtx, 1); 3167 urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]); 3168 usb_pause_mtx(&sc->sc_mtx, 1); 3169 urtw_8187_write_phy_ofdm(sc, 0x21, 0x17); 3170 usb_pause_mtx(&sc->sc_mtx, 1); 3171fail: 3172 return (error); 3173} 3174 3175static usb_error_t 3176urtw_8225_isv2(struct urtw_softc *sc, int *ret) 3177{ 3178 uint32_t data; 3179 usb_error_t error; 3180 3181 *ret = 1; 3182 3183 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_MAGIC5); 3184 urtw_write16_m(sc, URTW_RF_PINS_SELECT, URTW_RF_PINS_MAGIC5); 3185 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, URTW_RF_PINS_MAGIC5); 3186 usb_pause_mtx(&sc->sc_mtx, 500); 3187 3188 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 3189 URTW_8225_ADDR_0_DATA_MAGIC1); 3190 3191 error = urtw_8225_read(sc, URTW_8225_ADDR_8_MAGIC, &data); 3192 if (error != 0) 3193 goto fail; 3194 if (data != URTW_8225_ADDR_8_DATA_MAGIC1) 3195 *ret = 0; 3196 else { 3197 error = urtw_8225_read(sc, URTW_8225_ADDR_9_MAGIC, &data); 3198 if (error != 0) 3199 goto fail; 3200 if (data != URTW_8225_ADDR_9_DATA_MAGIC1) 3201 *ret = 0; 3202 } 3203 3204 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 3205 URTW_8225_ADDR_0_DATA_MAGIC2); 3206fail: 3207 return (error); 3208} 3209 3210static usb_error_t 3211urtw_8225v2b_rf_init(struct urtw_softc *sc) 3212{ 3213#define N(a) (sizeof(a) / sizeof((a)[0])) 3214 int i; 3215 uint8_t data8; 3216 usb_error_t error; 3217 3218 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3219 if (error) 3220 goto fail; 3221 3222 /* 3223 * initialize extra registers on 8187 3224 */ 3225 urtw_write16_m(sc, URTW_BRSR_8187B, 0xfff); 3226 3227 /* retry limit */ 3228 urtw_read8_m(sc, URTW_CW_CONF, &data8); 3229 data8 |= URTW_CW_CONF_PERPACKET_RETRY; 3230 urtw_write8_m(sc, URTW_CW_CONF, data8); 3231 3232 /* TX AGC */ 3233 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); 3234 data8 |= URTW_TX_AGC_CTL_PERPACKET_GAIN; 3235 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); 3236 3237 /* Auto Rate Fallback Control */ 3238#define URTW_ARFR 0x1e0 3239 urtw_write16_m(sc, URTW_ARFR, 0xfff); 3240 urtw_read8_m(sc, URTW_RATE_FALLBACK, &data8); 3241 urtw_write8_m(sc, URTW_RATE_FALLBACK, 3242 data8 | URTW_RATE_FALLBACK_ENABLE); 3243 3244 urtw_read8_m(sc, URTW_MSR, &data8); 3245 urtw_write8_m(sc, URTW_MSR, data8 & 0xf3); 3246 urtw_read8_m(sc, URTW_MSR, &data8); 3247 urtw_write8_m(sc, URTW_MSR, data8 | URTW_MSR_LINK_ENEDCA); 3248 urtw_write8_m(sc, URTW_ACM_CONTROL, sc->sc_acmctl); 3249 3250 urtw_write16_m(sc, URTW_ATIM_WND, 2); 3251 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100); 3252#define URTW_FEMR_FOR_8187B 0x1d4 3253 urtw_write16_m(sc, URTW_FEMR_FOR_8187B, 0xffff); 3254 3255 /* led type */ 3256 urtw_read8_m(sc, URTW_CONFIG1, &data8); 3257 data8 = (data8 & 0x3f) | 0x80; 3258 urtw_write8_m(sc, URTW_CONFIG1, data8); 3259 3260 /* applying MAC address again. */ 3261 urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]); 3262 urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff); 3263 3264 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3265 if (error) 3266 goto fail; 3267 3268 urtw_write8_m(sc, URTW_WPA_CONFIG, 0); 3269 3270 /* 3271 * MAC configuration 3272 */ 3273 for (i = 0; i < N(urtw_8225v2b_rf_part1); i++) 3274 urtw_write8_m(sc, urtw_8225v2b_rf_part1[i].reg, 3275 urtw_8225v2b_rf_part1[i].val); 3276 urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50); 3277 urtw_write16_m(sc, URTW_INT_MIG, 0x0000); 3278 urtw_write32_m(sc, 0x1f0, 0); 3279 urtw_write32_m(sc, 0x1f4, 0); 3280 urtw_write8_m(sc, 0x1f8, 0); 3281 urtw_write32_m(sc, URTW_RF_TIMING, 0x4001); 3282 3283#define URTW_RFSW_CTRL 0x272 3284 urtw_write16_m(sc, URTW_RFSW_CTRL, 0x569a); 3285 3286 /* 3287 * initialize PHY 3288 */ 3289 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3290 if (error) 3291 goto fail; 3292 urtw_read8_m(sc, URTW_CONFIG3, &data8); 3293 urtw_write8_m(sc, URTW_CONFIG3, 3294 data8 | URTW_CONFIG3_ANAPARAM_WRITE); 3295 3296 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3297 if (error) 3298 goto fail; 3299 3300 /* setup RFE initial timing */ 3301 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480); 3302 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488); 3303 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff); 3304 usb_pause_mtx(&sc->sc_mtx, 1100); 3305 3306 for (i = 0; i < N(urtw_8225v2b_rf_part0); i++) { 3307 urtw_8225_write(sc, urtw_8225v2b_rf_part0[i].reg, 3308 urtw_8225v2b_rf_part0[i].val); 3309 usb_pause_mtx(&sc->sc_mtx, 1); 3310 } 3311 urtw_8225_write(sc, 0x00, 0x01b7); 3312 3313 for (i = 0; i < 95; i++) { 3314 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1)); 3315 usb_pause_mtx(&sc->sc_mtx, 1); 3316 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 3317 urtw_8225v2b_rxgain[i]); 3318 usb_pause_mtx(&sc->sc_mtx, 1); 3319 } 3320 3321 urtw_8225_write(sc, URTW_8225_ADDR_3_MAGIC, 0x080); 3322 usb_pause_mtx(&sc->sc_mtx, 1); 3323 urtw_8225_write(sc, URTW_8225_ADDR_5_MAGIC, 0x004); 3324 usb_pause_mtx(&sc->sc_mtx, 1); 3325 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x0b7); 3326 usb_pause_mtx(&sc->sc_mtx, 1); 3327 usb_pause_mtx(&sc->sc_mtx, 3000); 3328 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0xc4d); 3329 usb_pause_mtx(&sc->sc_mtx, 2000); 3330 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0x44d); 3331 usb_pause_mtx(&sc->sc_mtx, 1); 3332 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x2bf); 3333 usb_pause_mtx(&sc->sc_mtx, 1); 3334 3335 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03); 3336 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07); 3337 urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03); 3338 3339 urtw_8187_write_phy_ofdm(sc, 0x80, 0x12); 3340 for (i = 0; i < 128; i++) { 3341 uint32_t addr, data; 3342 3343 data = (urtw_8225z2_agc[i] << 8) | 0x0000008f; 3344 addr = ((i + 0x80) << 8) | 0x0000008e; 3345 3346 urtw_8187_write_phy_ofdm(sc, data & 0x7f, (data >> 8) & 0xff); 3347 urtw_8187_write_phy_ofdm(sc, addr & 0x7f, (addr >> 8) & 0xff); 3348 urtw_8187_write_phy_ofdm(sc, 0x0e, 0x00); 3349 } 3350 urtw_8187_write_phy_ofdm(sc, 0x80, 0x10); 3351 3352 for (i = 0; i < N(urtw_8225v2b_rf_part2); i++) 3353 urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2b_rf_part2[i].val); 3354 3355 urtw_write32_m(sc, URTW_8187B_AC_VO, (7 << 12) | (3 << 8) | 0x1c); 3356 urtw_write32_m(sc, URTW_8187B_AC_VI, (7 << 12) | (3 << 8) | 0x1c); 3357 urtw_write32_m(sc, URTW_8187B_AC_BE, (7 << 12) | (3 << 8) | 0x1c); 3358 urtw_write32_m(sc, URTW_8187B_AC_BK, (7 << 12) | (3 << 8) | 0x1c); 3359 3360 urtw_8187_write_phy_ofdm(sc, 0x97, 0x46); 3361 urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6); 3362 urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc); 3363 urtw_8187_write_phy_cck(sc, 0xc1, 0x88); 3364 3365fail: 3366 return (error); 3367#undef N 3368} 3369 3370static usb_error_t 3371urtw_8225v2b_rf_set_chan(struct urtw_softc *sc, int chan) 3372{ 3373 usb_error_t error; 3374 3375 error = urtw_8225v2b_set_txpwrlvl(sc, chan); 3376 if (error) 3377 goto fail; 3378 3379 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]); 3380 usb_pause_mtx(&sc->sc_mtx, 10); 3381fail: 3382 return (error); 3383} 3384 3385static usb_error_t 3386urtw_8225v2b_set_txpwrlvl(struct urtw_softc *sc, int chan) 3387{ 3388 int i; 3389 uint8_t *cck_pwrtable; 3390 uint8_t cck_pwrlvl_max = 15; 3391 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff; 3392 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff; 3393 usb_error_t error; 3394 3395 /* CCK power setting */ 3396 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? 3397 ((sc->sc_flags & URTW_RTL8187B_REV_B) ? cck_pwrlvl_max : 22) : 3398 (cck_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 0 : 7)); 3399 cck_pwrlvl += sc->sc_txpwr_cck_base; 3400 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl; 3401 cck_pwrtable = (chan == 14) ? urtw_8225v2b_txpwr_cck_ch14 : 3402 urtw_8225v2b_txpwr_cck; 3403 3404 if (sc->sc_flags & URTW_RTL8187B_REV_B) 3405 cck_pwrtable += (cck_pwrlvl <= 6) ? 0 : 3406 ((cck_pwrlvl <= 11) ? 8 : 16); 3407 else 3408 cck_pwrtable += (cck_pwrlvl <= 5) ? 0 : 3409 ((cck_pwrlvl <= 11) ? 8 : ((cck_pwrlvl <= 17) ? 16 : 24)); 3410 3411 for (i = 0; i < 8; i++) 3412 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]); 3413 3414 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 3415 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1); 3416 usb_pause_mtx(&sc->sc_mtx, 1); 3417 3418 /* OFDM power setting */ 3419 ofdm_pwrlvl = (ofdm_pwrlvl > 15) ? 3420 ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 17 : 25) : 3421 (ofdm_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 2 : 10)); 3422 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base; 3423 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl; 3424 3425 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 3426 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1); 3427 3428 if (sc->sc_flags & URTW_RTL8187B_REV_B) { 3429 if (ofdm_pwrlvl <= 11) { 3430 urtw_8187_write_phy_ofdm(sc, 0x87, 0x60); 3431 urtw_8187_write_phy_ofdm(sc, 0x89, 0x60); 3432 } else { 3433 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c); 3434 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c); 3435 } 3436 } else { 3437 if (ofdm_pwrlvl <= 11) { 3438 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c); 3439 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c); 3440 } else if (ofdm_pwrlvl <= 17) { 3441 urtw_8187_write_phy_ofdm(sc, 0x87, 0x54); 3442 urtw_8187_write_phy_ofdm(sc, 0x89, 0x54); 3443 } else { 3444 urtw_8187_write_phy_ofdm(sc, 0x87, 0x50); 3445 urtw_8187_write_phy_ofdm(sc, 0x89, 0x50); 3446 } 3447 } 3448 usb_pause_mtx(&sc->sc_mtx, 1); 3449fail: 3450 return (error); 3451} 3452 3453static usb_error_t 3454urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data) 3455{ 3456 struct usb_device_request req; 3457 usb_error_t error; 3458 3459 req.bmRequestType = UT_READ_VENDOR_DEVICE; 3460 req.bRequest = URTW_8187_GETREGS_REQ; 3461 USETW(req.wValue, val | 0xfe00); 3462 USETW(req.wIndex, 0); 3463 USETW(req.wLength, sizeof(uint8_t)); 3464 3465 error = urtw_do_request(sc, &req, data); 3466 return (error); 3467} 3468 3469static usb_error_t 3470urtw_write8e(struct urtw_softc *sc, int val, uint8_t data) 3471{ 3472 struct usb_device_request req; 3473 3474 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 3475 req.bRequest = URTW_8187_SETREGS_REQ; 3476 USETW(req.wValue, val | 0xfe00); 3477 USETW(req.wIndex, 0); 3478 USETW(req.wLength, sizeof(uint8_t)); 3479 3480 return (urtw_do_request(sc, &req, &data)); 3481} 3482 3483static usb_error_t 3484urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val) 3485{ 3486 uint8_t data; 3487 usb_error_t error; 3488 3489 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3490 if (error) 3491 goto fail; 3492 3493 urtw_read8_m(sc, URTW_CONFIG3, &data); 3494 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 3495 urtw_write32_m(sc, URTW_ANAPARAM, val); 3496 urtw_read8_m(sc, URTW_CONFIG3, &data); 3497 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 3498 3499 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3500 if (error) 3501 goto fail; 3502fail: 3503 return (error); 3504} 3505 3506static usb_error_t 3507urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val) 3508{ 3509 uint8_t data; 3510 usb_error_t error; 3511 3512 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG); 3513 if (error) 3514 goto fail; 3515 3516 urtw_read8_m(sc, URTW_CONFIG3, &data); 3517 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE); 3518 urtw_write32_m(sc, URTW_ANAPARAM2, val); 3519 urtw_read8_m(sc, URTW_CONFIG3, &data); 3520 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE); 3521 3522 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL); 3523 if (error) 3524 goto fail; 3525fail: 3526 return (error); 3527} 3528 3529static usb_error_t 3530urtw_intr_enable(struct urtw_softc *sc) 3531{ 3532 usb_error_t error; 3533 3534 urtw_write16_m(sc, URTW_INTR_MASK, 0xffff); 3535fail: 3536 return (error); 3537} 3538 3539static usb_error_t 3540urtw_intr_disable(struct urtw_softc *sc) 3541{ 3542 usb_error_t error; 3543 3544 urtw_write16_m(sc, URTW_INTR_MASK, 0); 3545fail: 3546 return (error); 3547} 3548 3549static usb_error_t 3550urtw_reset(struct urtw_softc *sc) 3551{ 3552 uint8_t data; 3553 usb_error_t error; 3554 3555 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 3556 if (error) 3557 goto fail; 3558 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3559 if (error) 3560 goto fail; 3561 3562 error = urtw_intr_disable(sc); 3563 if (error) 3564 goto fail; 3565 usb_pause_mtx(&sc->sc_mtx, 100); 3566 3567 error = urtw_write8e(sc, 0x18, 0x10); 3568 if (error != 0) 3569 goto fail; 3570 error = urtw_write8e(sc, 0x18, 0x11); 3571 if (error != 0) 3572 goto fail; 3573 error = urtw_write8e(sc, 0x18, 0x00); 3574 if (error != 0) 3575 goto fail; 3576 usb_pause_mtx(&sc->sc_mtx, 100); 3577 3578 urtw_read8_m(sc, URTW_CMD, &data); 3579 data = (data & 0x2) | URTW_CMD_RST; 3580 urtw_write8_m(sc, URTW_CMD, data); 3581 usb_pause_mtx(&sc->sc_mtx, 100); 3582 3583 urtw_read8_m(sc, URTW_CMD, &data); 3584 if (data & URTW_CMD_RST) { 3585 device_printf(sc->sc_dev, "reset timeout\n"); 3586 goto fail; 3587 } 3588 3589 error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD); 3590 if (error) 3591 goto fail; 3592 usb_pause_mtx(&sc->sc_mtx, 100); 3593 3594 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON); 3595 if (error) 3596 goto fail; 3597 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON); 3598 if (error) 3599 goto fail; 3600fail: 3601 return (error); 3602} 3603 3604static usb_error_t 3605urtw_led_ctl(struct urtw_softc *sc, int mode) 3606{ 3607 usb_error_t error = 0; 3608 3609 switch (sc->sc_strategy) { 3610 case URTW_SW_LED_MODE0: 3611 error = urtw_led_mode0(sc, mode); 3612 break; 3613 case URTW_SW_LED_MODE1: 3614 error = urtw_led_mode1(sc, mode); 3615 break; 3616 case URTW_SW_LED_MODE2: 3617 error = urtw_led_mode2(sc, mode); 3618 break; 3619 case URTW_SW_LED_MODE3: 3620 error = urtw_led_mode3(sc, mode); 3621 break; 3622 default: 3623 panic("unsupported LED mode %d\n", sc->sc_strategy); 3624 /* never reach */ 3625 } 3626 3627 return (error); 3628} 3629 3630static usb_error_t 3631urtw_led_mode0(struct urtw_softc *sc, int mode) 3632{ 3633 3634 switch (mode) { 3635 case URTW_LED_CTL_POWER_ON: 3636 sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK; 3637 break; 3638 case URTW_LED_CTL_TX: 3639 if (sc->sc_gpio_ledinprogress == 1) 3640 return (0); 3641 3642 sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL; 3643 sc->sc_gpio_blinktime = 2; 3644 break; 3645 case URTW_LED_CTL_LINK: 3646 sc->sc_gpio_ledstate = URTW_LED_ON; 3647 break; 3648 default: 3649 panic("unsupported LED mode 0x%x", mode); 3650 /* never reach */ 3651 } 3652 3653 switch (sc->sc_gpio_ledstate) { 3654 case URTW_LED_ON: 3655 if (sc->sc_gpio_ledinprogress != 0) 3656 break; 3657 urtw_led_on(sc, URTW_LED_GPIO); 3658 break; 3659 case URTW_LED_BLINK_NORMAL: 3660 if (sc->sc_gpio_ledinprogress != 0) 3661 break; 3662 sc->sc_gpio_ledinprogress = 1; 3663 sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ? 3664 URTW_LED_OFF : URTW_LED_ON; 3665 usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc); 3666 break; 3667 case URTW_LED_POWER_ON_BLINK: 3668 urtw_led_on(sc, URTW_LED_GPIO); 3669 usb_pause_mtx(&sc->sc_mtx, 100); 3670 urtw_led_off(sc, URTW_LED_GPIO); 3671 break; 3672 default: 3673 panic("unknown LED status 0x%x", sc->sc_gpio_ledstate); 3674 /* never reach */ 3675 } 3676 return (0); 3677} 3678 3679static usb_error_t 3680urtw_led_mode1(struct urtw_softc *sc, int mode) 3681{ 3682 3683 return (USB_ERR_INVAL); 3684} 3685 3686static usb_error_t 3687urtw_led_mode2(struct urtw_softc *sc, int mode) 3688{ 3689 3690 return (USB_ERR_INVAL); 3691} 3692 3693static usb_error_t 3694urtw_led_mode3(struct urtw_softc *sc, int mode) 3695{ 3696 3697 return (USB_ERR_INVAL); 3698} 3699 3700static usb_error_t 3701urtw_led_on(struct urtw_softc *sc, int type) 3702{ 3703 usb_error_t error; 3704 3705 if (type == URTW_LED_GPIO) { 3706 switch (sc->sc_gpio_ledpin) { 3707 case URTW_LED_PIN_GPIO0: 3708 urtw_write8_m(sc, URTW_GPIO, 0x01); 3709 urtw_write8_m(sc, URTW_GP_ENABLE, 0x00); 3710 break; 3711 default: 3712 panic("unsupported LED PIN type 0x%x", 3713 sc->sc_gpio_ledpin); 3714 /* never reach */ 3715 } 3716 } else { 3717 panic("unsupported LED type 0x%x", type); 3718 /* never reach */ 3719 } 3720 3721 sc->sc_gpio_ledon = 1; 3722fail: 3723 return (error); 3724} 3725 3726static usb_error_t 3727urtw_led_off(struct urtw_softc *sc, int type) 3728{ 3729 usb_error_t error; 3730 3731 if (type == URTW_LED_GPIO) { 3732 switch (sc->sc_gpio_ledpin) { 3733 case URTW_LED_PIN_GPIO0: 3734 urtw_write8_m(sc, URTW_GPIO, URTW_GPIO_DATA_MAGIC1); 3735 urtw_write8_m(sc, 3736 URTW_GP_ENABLE, URTW_GP_ENABLE_DATA_MAGIC1); 3737 break; 3738 default: 3739 panic("unsupported LED PIN type 0x%x", 3740 sc->sc_gpio_ledpin); 3741 /* never reach */ 3742 } 3743 } else { 3744 panic("unsupported LED type 0x%x", type); 3745 /* never reach */ 3746 } 3747 3748 sc->sc_gpio_ledon = 0; 3749 3750fail: 3751 return (error); 3752} 3753 3754static void 3755urtw_led_ch(void *arg) 3756{ 3757 struct urtw_softc *sc = arg; 3758 struct ifnet *ifp = sc->sc_ifp; 3759 struct ieee80211com *ic = ifp->if_l2com; 3760 3761 ieee80211_runtask(ic, &sc->sc_led_task); 3762} 3763 3764static void 3765urtw_ledtask(void *arg, int pending) 3766{ 3767 struct urtw_softc *sc = arg; 3768 3769 if (sc->sc_strategy != URTW_SW_LED_MODE0) 3770 panic("could not process a LED strategy 0x%x", sc->sc_strategy); 3771 3772 URTW_LOCK(sc); 3773 urtw_led_blink(sc); 3774 URTW_UNLOCK(sc); 3775} 3776 3777static usb_error_t 3778urtw_led_blink(struct urtw_softc *sc) 3779{ 3780 uint8_t ing = 0; 3781 usb_error_t error; 3782 3783 if (sc->sc_gpio_blinkstate == URTW_LED_ON) 3784 error = urtw_led_on(sc, URTW_LED_GPIO); 3785 else 3786 error = urtw_led_off(sc, URTW_LED_GPIO); 3787 sc->sc_gpio_blinktime--; 3788 if (sc->sc_gpio_blinktime == 0) 3789 ing = 1; 3790 else { 3791 if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL && 3792 sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY && 3793 sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3) 3794 ing = 1; 3795 } 3796 if (ing == 1) { 3797 if (sc->sc_gpio_ledstate == URTW_LED_ON && 3798 sc->sc_gpio_ledon == 0) 3799 error = urtw_led_on(sc, URTW_LED_GPIO); 3800 else if (sc->sc_gpio_ledstate == URTW_LED_OFF && 3801 sc->sc_gpio_ledon == 1) 3802 error = urtw_led_off(sc, URTW_LED_GPIO); 3803 3804 sc->sc_gpio_blinktime = 0; 3805 sc->sc_gpio_ledinprogress = 0; 3806 return (0); 3807 } 3808 3809 sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ? 3810 URTW_LED_ON : URTW_LED_OFF; 3811 3812 switch (sc->sc_gpio_ledstate) { 3813 case URTW_LED_BLINK_NORMAL: 3814 usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc); 3815 break; 3816 default: 3817 panic("unknown LED status 0x%x", sc->sc_gpio_ledstate); 3818 /* never reach */ 3819 } 3820 return (0); 3821} 3822 3823static usb_error_t 3824urtw_rx_enable(struct urtw_softc *sc) 3825{ 3826 uint8_t data; 3827 usb_error_t error; 3828 3829 usbd_transfer_start((sc->sc_flags & URTW_RTL8187B) ? 3830 sc->sc_xfer[URTW_8187B_BULK_RX] : sc->sc_xfer[URTW_8187L_BULK_RX]); 3831 3832 error = urtw_rx_setconf(sc); 3833 if (error != 0) 3834 goto fail; 3835 3836 if ((sc->sc_flags & URTW_RTL8187B) == 0) { 3837 urtw_read8_m(sc, URTW_CMD, &data); 3838 urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE); 3839 } 3840fail: 3841 return (error); 3842} 3843 3844static usb_error_t 3845urtw_tx_enable(struct urtw_softc *sc) 3846{ 3847 uint8_t data8; 3848 uint32_t data; 3849 usb_error_t error; 3850 3851 if (sc->sc_flags & URTW_RTL8187B) { 3852 urtw_read32_m(sc, URTW_TX_CONF, &data); 3853 data &= ~URTW_TX_LOOPBACK_MASK; 3854 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK); 3855 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK); 3856 data &= ~URTW_TX_SWPLCPLEN; 3857 data |= URTW_TX_HW_SEQNUM | URTW_TX_DISREQQSIZE | 3858 (7 << 8) | /* short retry limit */ 3859 (7 << 0) | /* long retry limit */ 3860 (7 << 21); /* MAX TX DMA */ 3861 urtw_write32_m(sc, URTW_TX_CONF, data); 3862 3863 urtw_read8_m(sc, URTW_MSR, &data8); 3864 data8 |= URTW_MSR_LINK_ENEDCA; 3865 urtw_write8_m(sc, URTW_MSR, data8); 3866 return (error); 3867 } 3868 3869 urtw_read8_m(sc, URTW_CW_CONF, &data8); 3870 data8 &= ~(URTW_CW_CONF_PERPACKET_CW | URTW_CW_CONF_PERPACKET_RETRY); 3871 urtw_write8_m(sc, URTW_CW_CONF, data8); 3872 3873 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8); 3874 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN; 3875 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL; 3876 data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT; 3877 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8); 3878 3879 urtw_read32_m(sc, URTW_TX_CONF, &data); 3880 data &= ~URTW_TX_LOOPBACK_MASK; 3881 data |= URTW_TX_LOOPBACK_NONE; 3882 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK); 3883 data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT; 3884 data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT; 3885 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK); 3886 data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW; 3887 data &= ~URTW_TX_SWPLCPLEN; 3888 data |= URTW_TX_NOICV; 3889 urtw_write32_m(sc, URTW_TX_CONF, data); 3890 3891 urtw_read8_m(sc, URTW_CMD, &data8); 3892 urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE); 3893fail: 3894 return (error); 3895} 3896 3897static usb_error_t 3898urtw_rx_setconf(struct urtw_softc *sc) 3899{ 3900 struct ifnet *ifp = sc->sc_ifp; 3901 struct ieee80211com *ic = ifp->if_l2com; 3902 uint32_t data; 3903 usb_error_t error; 3904 3905 urtw_read32_m(sc, URTW_RX, &data); 3906 data = data &~ URTW_RX_FILTER_MASK; 3907 if (sc->sc_flags & URTW_RTL8187B) { 3908 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA | 3909 URTW_RX_FILTER_MCAST | URTW_RX_FILTER_BCAST | 3910 URTW_RX_FILTER_NICMAC | URTW_RX_CHECK_BSSID | 3911 URTW_RX_FIFO_THRESHOLD_NONE | 3912 URTW_MAX_RX_DMA_2048 | 3913 URTW_RX_AUTORESETPHY | URTW_RCR_ONLYERLPKT; 3914 } else { 3915 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA; 3916 data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST; 3917 3918 if (ic->ic_opmode == IEEE80211_M_MONITOR) { 3919 data = data | URTW_RX_FILTER_ICVERR; 3920 data = data | URTW_RX_FILTER_PWR; 3921 } 3922 if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR) 3923 data = data | URTW_RX_FILTER_CRCERR; 3924 3925 if (ic->ic_opmode == IEEE80211_M_MONITOR || 3926 (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC))) { 3927 data = data | URTW_RX_FILTER_ALLMAC; 3928 } else { 3929 data = data | URTW_RX_FILTER_NICMAC; 3930 data = data | URTW_RX_CHECK_BSSID; 3931 } 3932 3933 data = data &~ URTW_RX_FIFO_THRESHOLD_MASK; 3934 data = data | URTW_RX_FIFO_THRESHOLD_NONE | 3935 URTW_RX_AUTORESETPHY; 3936 data = data &~ URTW_MAX_RX_DMA_MASK; 3937 data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT; 3938 } 3939 3940 urtw_write32_m(sc, URTW_RX, data); 3941fail: 3942 return (error); 3943} 3944 3945static struct mbuf * 3946urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p, 3947 int8_t *nf_p) 3948{ 3949 int actlen, flen, rssi; 3950 struct ieee80211_frame *wh; 3951 struct mbuf *m, *mnew; 3952 struct urtw_softc *sc = data->sc; 3953 struct ifnet *ifp = sc->sc_ifp; 3954 struct ieee80211com *ic = ifp->if_l2com; 3955 uint8_t noise = 0, rate; 3956 3957 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); 3958 3959 if (actlen < URTW_MIN_RXBUFSZ) { 3960 ifp->if_ierrors++; 3961 return (NULL); 3962 } 3963 3964 if (sc->sc_flags & URTW_RTL8187B) { 3965 struct urtw_8187b_rxhdr *rx; 3966 3967 rx = (struct urtw_8187b_rxhdr *)(data->buf + 3968 (actlen - (sizeof(struct urtw_8187b_rxhdr)))); 3969 flen = le32toh(rx->flag) & 0xfff; 3970 if (flen > actlen) { 3971 ifp->if_ierrors++; 3972 return (NULL); 3973 } 3974 rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf; 3975 /* XXX correct? */ 3976 rssi = rx->rssi & URTW_RX_RSSI_MASK; 3977 noise = rx->noise; 3978 } else { 3979 struct urtw_8187l_rxhdr *rx; 3980 3981 rx = (struct urtw_8187l_rxhdr *)(data->buf + 3982 (actlen - (sizeof(struct urtw_8187l_rxhdr)))); 3983 flen = le32toh(rx->flag) & 0xfff; 3984 if (flen > actlen) { 3985 ifp->if_ierrors++; 3986 return (NULL); 3987 } 3988 3989 rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf; 3990 /* XXX correct? */ 3991 rssi = rx->rssi & URTW_RX_8187L_RSSI_MASK; 3992 noise = rx->noise; 3993 } 3994 3995 mnew = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR); 3996 if (mnew == NULL) { 3997 ifp->if_ierrors++; 3998 return (NULL); 3999 } 4000 4001 m = data->m; 4002 data->m = mnew; 4003 data->buf = mtod(mnew, uint8_t *); 4004 4005 /* finalize mbuf */ 4006 m->m_pkthdr.rcvif = ifp; 4007 m->m_pkthdr.len = m->m_len = flen - IEEE80211_CRC_LEN; 4008 4009 if (ieee80211_radiotap_active(ic)) { 4010 struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap; 4011 4012 /* XXX Are variables correct? */ 4013 tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq); 4014 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); 4015 tap->wr_dbm_antsignal = (int8_t)rssi; 4016 } 4017 4018 wh = mtod(m, struct ieee80211_frame *); 4019 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA) 4020 sc->sc_currate = (rate > 0) ? rate : sc->sc_currate; 4021 4022 *rssi_p = rssi; 4023 *nf_p = noise; /* XXX correct? */ 4024 4025 return (m); 4026} 4027 4028static void 4029urtw_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error) 4030{ 4031 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4032 struct ifnet *ifp = sc->sc_ifp; 4033 struct ieee80211com *ic = ifp->if_l2com; 4034 struct ieee80211_frame *wh; 4035 struct ieee80211_node *ni; 4036 struct mbuf *m = NULL; 4037 struct urtw_data *data; 4038 int8_t nf = -95; 4039 int rssi = 1; 4040 4041 URTW_ASSERT_LOCKED(sc); 4042 4043 switch (USB_GET_STATE(xfer)) { 4044 case USB_ST_TRANSFERRED: 4045 data = STAILQ_FIRST(&sc->sc_rx_active); 4046 if (data == NULL) 4047 goto setup; 4048 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); 4049 m = urtw_rxeof(xfer, data, &rssi, &nf); 4050 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); 4051 /* FALLTHROUGH */ 4052 case USB_ST_SETUP: 4053setup: 4054 data = STAILQ_FIRST(&sc->sc_rx_inactive); 4055 if (data == NULL) { 4056 KASSERT(m == NULL, ("mbuf isn't NULL")); 4057 return; 4058 } 4059 STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next); 4060 STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next); 4061 usbd_xfer_set_frame_data(xfer, 0, data->buf, 4062 usbd_xfer_max_len(xfer)); 4063 usbd_transfer_submit(xfer); 4064 4065 /* 4066 * To avoid LOR we should unlock our private mutex here to call 4067 * ieee80211_input() because here is at the end of a USB 4068 * callback and safe to unlock. 4069 */ 4070 URTW_UNLOCK(sc); 4071 if (m != NULL) { 4072 wh = mtod(m, struct ieee80211_frame *); 4073 ni = ieee80211_find_rxnode(ic, 4074 (struct ieee80211_frame_min *)wh); 4075 if (ni != NULL) { 4076 (void) ieee80211_input(ni, m, rssi, nf); 4077 /* node is no longer needed */ 4078 ieee80211_free_node(ni); 4079 } else 4080 (void) ieee80211_input_all(ic, m, rssi, nf); 4081 m = NULL; 4082 } 4083 URTW_LOCK(sc); 4084 break; 4085 default: 4086 /* needs it to the inactive queue due to a error. */ 4087 data = STAILQ_FIRST(&sc->sc_rx_active); 4088 if (data != NULL) { 4089 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); 4090 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); 4091 } 4092 if (error != USB_ERR_CANCELLED) { 4093 usbd_xfer_set_stall(xfer); 4094 ifp->if_ierrors++; 4095 goto setup; 4096 } 4097 break; 4098 } 4099} 4100 4101#define URTW_STATUS_TYPE_TXCLOSE 1 4102#define URTW_STATUS_TYPE_BEACON_INTR 0 4103 4104static void 4105urtw_txstatus_eof(struct usb_xfer *xfer) 4106{ 4107 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4108 struct ifnet *ifp = sc->sc_ifp; 4109 int actlen, type, pktretry, seq; 4110 uint64_t val; 4111 4112 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); 4113 4114 if (actlen != sizeof(uint64_t)) 4115 return; 4116 4117 val = le64toh(sc->sc_txstatus); 4118 type = (val >> 30) & 0x3; 4119 if (type == URTW_STATUS_TYPE_TXCLOSE) { 4120 pktretry = val & 0xff; 4121 seq = (val >> 16) & 0xff; 4122 if (pktretry == URTW_TX_MAXRETRY) 4123 ifp->if_oerrors++; 4124 DPRINTF(sc, URTW_DEBUG_TXSTATUS, "pktretry %d seq %#x\n", 4125 pktretry, seq); 4126 } 4127} 4128 4129static void 4130urtw_bulk_tx_status_callback(struct usb_xfer *xfer, usb_error_t error) 4131{ 4132 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4133 struct ifnet *ifp = sc->sc_ifp; 4134 4135 URTW_ASSERT_LOCKED(sc); 4136 4137 switch (USB_GET_STATE(xfer)) { 4138 case USB_ST_TRANSFERRED: 4139 urtw_txstatus_eof(xfer); 4140 /* FALLTHROUGH */ 4141 case USB_ST_SETUP: 4142setup: 4143 usbd_xfer_set_frame_data(xfer, 0, &sc->sc_txstatus, 4144 sizeof(int64_t)); 4145 usbd_transfer_submit(xfer); 4146 break; 4147 default: 4148 if (error != USB_ERR_CANCELLED) { 4149 usbd_xfer_set_stall(xfer); 4150 ifp->if_ierrors++; 4151 goto setup; 4152 } 4153 break; 4154 } 4155} 4156 4157static void 4158urtw_txeof(struct usb_xfer *xfer, struct urtw_data *data) 4159{ 4160 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4161 struct ifnet *ifp = sc->sc_ifp; 4162 struct mbuf *m; 4163 4164 URTW_ASSERT_LOCKED(sc); 4165 4166 /* 4167 * Do any tx complete callback. Note this must be done before releasing 4168 * the node reference. 4169 */ 4170 if (data->m) { 4171 m = data->m; 4172 if (m->m_flags & M_TXCB) { 4173 /* XXX status? */ 4174 ieee80211_process_callback(data->ni, m, 0); 4175 } 4176 m_freem(m); 4177 data->m = NULL; 4178 } 4179 if (data->ni) { 4180 ieee80211_free_node(data->ni); 4181 data->ni = NULL; 4182 } 4183 sc->sc_txtimer = 0; 4184 ifp->if_opackets++; 4185 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; 4186} 4187 4188static void 4189urtw_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error) 4190{ 4191 struct urtw_softc *sc = usbd_xfer_softc(xfer); 4192 struct ifnet *ifp = sc->sc_ifp; 4193 struct urtw_data *data; 4194 4195 URTW_ASSERT_LOCKED(sc); 4196 4197 switch (USB_GET_STATE(xfer)) { 4198 case USB_ST_TRANSFERRED: 4199 data = STAILQ_FIRST(&sc->sc_tx_active); 4200 if (data == NULL) 4201 goto setup; 4202 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next); 4203 urtw_txeof(xfer, data); 4204 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next); 4205 /* FALLTHROUGH */ 4206 case USB_ST_SETUP: 4207setup: 4208 data = STAILQ_FIRST(&sc->sc_tx_pending); 4209 if (data == NULL) { 4210 DPRINTF(sc, URTW_DEBUG_XMIT, 4211 "%s: empty pending queue\n", __func__); 4212 return; 4213 } 4214 STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next); 4215 STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next); 4216 4217 usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen); 4218 usbd_transfer_submit(xfer); 4219 4220 URTW_UNLOCK(sc); 4221 urtw_start(ifp); 4222 URTW_LOCK(sc); 4223 break; 4224 default: 4225 data = STAILQ_FIRST(&sc->sc_tx_active); 4226 if (data == NULL) 4227 goto setup; 4228 if (data->ni != NULL) { 4229 ieee80211_free_node(data->ni); 4230 data->ni = NULL; 4231 ifp->if_oerrors++; 4232 } 4233 if (error != USB_ERR_CANCELLED) { 4234 usbd_xfer_set_stall(xfer); 4235 goto setup; 4236 } 4237 break; 4238 } 4239} 4240 4241static struct urtw_data * 4242_urtw_getbuf(struct urtw_softc *sc) 4243{ 4244 struct urtw_data *bf; 4245 4246 bf = STAILQ_FIRST(&sc->sc_tx_inactive); 4247 if (bf != NULL) 4248 STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next); 4249 else 4250 bf = NULL; 4251 if (bf == NULL) 4252 DPRINTF(sc, URTW_DEBUG_XMIT, "%s: %s\n", __func__, 4253 "out of xmit buffers"); 4254 return (bf); 4255} 4256 4257static struct urtw_data * 4258urtw_getbuf(struct urtw_softc *sc) 4259{ 4260 struct urtw_data *bf; 4261 4262 URTW_ASSERT_LOCKED(sc); 4263 4264 bf = _urtw_getbuf(sc); 4265 if (bf == NULL) { 4266 struct ifnet *ifp = sc->sc_ifp; 4267 4268 DPRINTF(sc, URTW_DEBUG_XMIT, "%s: stop queue\n", __func__); 4269 ifp->if_drv_flags |= IFF_DRV_OACTIVE; 4270 } 4271 return (bf); 4272} 4273 4274static int 4275urtw_isbmode(uint16_t rate) 4276{ 4277 4278 return ((rate <= 22 && rate != 12 && rate != 18) || 4279 rate == 44) ? (1) : (0); 4280} 4281 4282static uint16_t 4283urtw_rate2dbps(uint16_t rate) 4284{ 4285 4286 switch(rate) { 4287 case 12: 4288 case 18: 4289 case 24: 4290 case 36: 4291 case 48: 4292 case 72: 4293 case 96: 4294 case 108: 4295 return (rate * 2); 4296 default: 4297 break; 4298 } 4299 return (24); 4300} 4301 4302static int 4303urtw_compute_txtime(uint16_t framelen, uint16_t rate, 4304 uint8_t ismgt, uint8_t isshort) 4305{ 4306 uint16_t ceiling, frametime, n_dbps; 4307 4308 if (urtw_isbmode(rate)) { 4309 if (ismgt || !isshort || rate == 2) 4310 frametime = (uint16_t)(144 + 48 + 4311 (framelen * 8 / (rate / 2))); 4312 else 4313 frametime = (uint16_t)(72 + 24 + 4314 (framelen * 8 / (rate / 2))); 4315 if ((framelen * 8 % (rate / 2)) != 0) 4316 frametime++; 4317 } else { 4318 n_dbps = urtw_rate2dbps(rate); 4319 ceiling = (16 + 8 * framelen + 6) / n_dbps 4320 + (((16 + 8 * framelen + 6) % n_dbps) ? 1 : 0); 4321 frametime = (uint16_t)(16 + 4 + 4 * ceiling + 6); 4322 } 4323 return (frametime); 4324} 4325 4326/* 4327 * Callback from the 802.11 layer to update the 4328 * slot time based on the current setting. 4329 */ 4330static void 4331urtw_updateslot(struct ifnet *ifp) 4332{ 4333 struct urtw_softc *sc = ifp->if_softc; 4334 struct ieee80211com *ic = ifp->if_l2com; 4335 4336 ieee80211_runtask(ic, &sc->sc_updateslot_task); 4337} 4338 4339static void 4340urtw_updateslottask(void *arg, int pending) 4341{ 4342 struct urtw_softc *sc = arg; 4343 struct ifnet *ifp = sc->sc_ifp; 4344 struct ieee80211com *ic = ifp->if_l2com; 4345 int error; 4346 4347 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) 4348 return; 4349 4350 URTW_LOCK(sc); 4351 if (sc->sc_flags & URTW_RTL8187B) { 4352 urtw_write8_m(sc, URTW_SIFS, 0x22); 4353 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) 4354 urtw_write8_m(sc, URTW_SLOT, 0x9); 4355 else 4356 urtw_write8_m(sc, URTW_SLOT, 0x14); 4357 urtw_write8_m(sc, URTW_8187B_EIFS, 0x5b); 4358 urtw_write8_m(sc, URTW_CARRIER_SCOUNT, 0x5b); 4359 } else { 4360 urtw_write8_m(sc, URTW_SIFS, 0x22); 4361 if (sc->sc_state == IEEE80211_S_ASSOC && 4362 ic->ic_flags & IEEE80211_F_SHSLOT) 4363 urtw_write8_m(sc, URTW_SLOT, 0x9); 4364 else 4365 urtw_write8_m(sc, URTW_SLOT, 0x14); 4366 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) { 4367 urtw_write8_m(sc, URTW_DIFS, 0x14); 4368 urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14); 4369 urtw_write8_m(sc, URTW_CW_VAL, 0x73); 4370 } else { 4371 urtw_write8_m(sc, URTW_DIFS, 0x24); 4372 urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24); 4373 urtw_write8_m(sc, URTW_CW_VAL, 0xa5); 4374 } 4375 } 4376fail: 4377 URTW_UNLOCK(sc); 4378} 4379 4380static void 4381urtw_sysctl_node(struct urtw_softc *sc) 4382{ 4383#define URTW_SYSCTL_STAT_ADD32(c, h, n, p, d) \ 4384 SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d) 4385 struct sysctl_ctx_list *ctx; 4386 struct sysctl_oid_list *child, *parent; 4387 struct sysctl_oid *tree; 4388 struct urtw_stats *stats = &sc->sc_stats; 4389 4390 ctx = device_get_sysctl_ctx(sc->sc_dev); 4391 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); 4392 4393 tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD, 4394 NULL, "URTW statistics"); 4395 parent = SYSCTL_CHILDREN(tree); 4396 4397 /* Tx statistics. */ 4398 tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD, 4399 NULL, "Tx MAC statistics"); 4400 child = SYSCTL_CHILDREN(tree); 4401 URTW_SYSCTL_STAT_ADD32(ctx, child, "1m", &stats->txrates[0], 4402 "1 Mbit/s"); 4403 URTW_SYSCTL_STAT_ADD32(ctx, child, "2m", &stats->txrates[1], 4404 "2 Mbit/s"); 4405 URTW_SYSCTL_STAT_ADD32(ctx, child, "5.5m", &stats->txrates[2], 4406 "5.5 Mbit/s"); 4407 URTW_SYSCTL_STAT_ADD32(ctx, child, "6m", &stats->txrates[4], 4408 "6 Mbit/s"); 4409 URTW_SYSCTL_STAT_ADD32(ctx, child, "9m", &stats->txrates[5], 4410 "9 Mbit/s"); 4411 URTW_SYSCTL_STAT_ADD32(ctx, child, "11m", &stats->txrates[3], 4412 "11 Mbit/s"); 4413 URTW_SYSCTL_STAT_ADD32(ctx, child, "12m", &stats->txrates[6], 4414 "12 Mbit/s"); 4415 URTW_SYSCTL_STAT_ADD32(ctx, child, "18m", &stats->txrates[7], 4416 "18 Mbit/s"); 4417 URTW_SYSCTL_STAT_ADD32(ctx, child, "24m", &stats->txrates[8], 4418 "24 Mbit/s"); 4419 URTW_SYSCTL_STAT_ADD32(ctx, child, "36m", &stats->txrates[9], 4420 "36 Mbit/s"); 4421 URTW_SYSCTL_STAT_ADD32(ctx, child, "48m", &stats->txrates[10], 4422 "48 Mbit/s"); 4423 URTW_SYSCTL_STAT_ADD32(ctx, child, "54m", &stats->txrates[11], 4424 "54 Mbit/s"); 4425#undef URTW_SYSCTL_STAT_ADD32 4426} 4427 4428static device_method_t urtw_methods[] = { 4429 DEVMETHOD(device_probe, urtw_match), 4430 DEVMETHOD(device_attach, urtw_attach), 4431 DEVMETHOD(device_detach, urtw_detach), 4432 { 0, 0 } 4433}; 4434static driver_t urtw_driver = { 4435 "urtw", 4436 urtw_methods, 4437 sizeof(struct urtw_softc) 4438}; 4439static devclass_t urtw_devclass; 4440 4441DRIVER_MODULE(urtw, uhub, urtw_driver, urtw_devclass, NULL, 0); 4442MODULE_DEPEND(urtw, wlan, 1, 1, 1); 4443MODULE_DEPEND(urtw, usb, 1, 1, 1);
|