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