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