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