1 /* $NetBSD: if_run.c,v 1.42 2020/06/24 21:06:39 jdolecek Exp $ */ 2 /* $OpenBSD: if_run.c,v 1.90 2012/03/24 15:11:04 jsg Exp $ */ 3 4 /*- 5 * Copyright (c) 2008-2010 Damien Bergamini <damien.bergamini@free.fr> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /*- 21 * Ralink Technology RT2700U/RT2800U/RT3000U/RT3900E chipset driver. 22 * http://www.ralinktech.com/ 23 */ 24 25 #include <sys/cdefs.h> 26 __KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.42 2020/06/24 21:06:39 jdolecek Exp $"); 27 28 #ifdef _KERNEL_OPT 29 #include "opt_usb.h" 30 #endif 31 32 #include <sys/param.h> 33 #include <sys/sockio.h> 34 #include <sys/sysctl.h> 35 #include <sys/mbuf.h> 36 #include <sys/kernel.h> 37 #include <sys/socket.h> 38 #include <sys/systm.h> 39 #include <sys/malloc.h> 40 #include <sys/callout.h> 41 #include <sys/module.h> 42 #include <sys/conf.h> 43 #include <sys/device.h> 44 #include <sys/atomic.h> 45 46 #include <sys/bus.h> 47 #include <machine/endian.h> 48 #include <sys/intr.h> 49 50 #include <net/bpf.h> 51 #include <net/if.h> 52 #include <net/if_arp.h> 53 #include <net/if_dl.h> 54 #include <net/if_ether.h> 55 #include <net/if_media.h> 56 #include <net/if_types.h> 57 58 #include <net80211/ieee80211_var.h> 59 #include <net80211/ieee80211_amrr.h> 60 #include <net80211/ieee80211_radiotap.h> 61 62 #include <dev/firmload.h> 63 64 #include <dev/usb/usb.h> 65 #include <dev/usb/usbdi.h> 66 #include <dev/usb/usbdivar.h> 67 #include <dev/usb/usbdi_util.h> 68 #include <dev/usb/usbdevs.h> 69 70 #include <dev/ic/rt2860reg.h> /* shared with ral(4) */ 71 #include <dev/usb/if_runvar.h> 72 73 #ifdef RUN_DEBUG 74 #define DPRINTF(x) do { if (run_debug) printf x; } while (0) 75 #define DPRINTFN(n, x) do { if (run_debug >= (n)) printf x; } while (0) 76 int run_debug = 0; 77 #else 78 #define DPRINTF(x) 79 #define DPRINTFN(n, x) 80 #endif 81 82 #define IEEE80211_HAS_ADDR4(wh) IEEE80211_IS_DSTODS(wh) 83 84 #define USB_ID(v, p) { USB_VENDOR_##v, USB_PRODUCT_##v##_##p } 85 static const struct usb_devno run_devs[] = { 86 USB_ID(ABOCOM, RT2770), 87 USB_ID(ABOCOM, RT2870), 88 USB_ID(ABOCOM, RT3070), 89 USB_ID(ABOCOM, RT3071), 90 USB_ID(ABOCOM, RT3072), 91 USB_ID(ABOCOM2, RT2870_1), 92 USB_ID(ACCTON, RT2770), 93 USB_ID(ACCTON, RT2870_1), 94 USB_ID(ACCTON, RT2870_2), 95 USB_ID(ACCTON, RT2870_3), 96 USB_ID(ACCTON, RT2870_4), 97 USB_ID(ACCTON, RT2870_5), 98 USB_ID(ACCTON, RT3070), 99 USB_ID(ACCTON, RT3070_1), 100 USB_ID(ACCTON, RT3070_2), 101 USB_ID(ACCTON, RT3070_3), 102 USB_ID(ACCTON, RT3070_4), 103 USB_ID(ACCTON, RT3070_5), 104 USB_ID(ACCTON, RT3070_6), 105 USB_ID(AIRTIES, RT3070), 106 USB_ID(AIRTIES, RT3070_2), 107 USB_ID(ALLWIN, RT2070), 108 USB_ID(ALLWIN, RT2770), 109 USB_ID(ALLWIN, RT2870), 110 USB_ID(ALLWIN, RT3070), 111 USB_ID(ALLWIN, RT3071), 112 USB_ID(ALLWIN, RT3072), 113 USB_ID(ALLWIN, RT3572), 114 USB_ID(AMIGO, RT2870_1), 115 USB_ID(AMIGO, RT2870_2), 116 USB_ID(AMIT, CGWLUSB2GNR), 117 USB_ID(AMIT, RT2870_1), 118 USB_ID(AMIT2, RT2870), 119 USB_ID(ASUSTEK, RT2870_1), 120 USB_ID(ASUSTEK, RT2870_2), 121 USB_ID(ASUSTEK, RT2870_3), 122 USB_ID(ASUSTEK, RT2870_4), 123 USB_ID(ASUSTEK, RT2870_5), 124 USB_ID(ASUSTEK, RT3070), 125 USB_ID(ASUSTEK, RT3070_1), 126 USB_ID(ASUSTEK, USBN53), 127 USB_ID(ASUSTEK, USBN66), 128 USB_ID(ASUSTEK2, USBN11), 129 USB_ID(AZUREWAVE, RT2870_1), 130 USB_ID(AZUREWAVE, RT2870_2), 131 USB_ID(AZUREWAVE, RT3070), 132 USB_ID(AZUREWAVE, RT3070_2), 133 USB_ID(AZUREWAVE, RT3070_3), 134 USB_ID(AZUREWAVE, RT3070_4), 135 USB_ID(AZUREWAVE, RT3070_5), 136 USB_ID(BELKIN, F5D8053V3), 137 USB_ID(BELKIN, F5D8055), 138 USB_ID(BELKIN, F5D8055V2), 139 USB_ID(BELKIN, F6D4050V1), 140 USB_ID(BELKIN, F6D4050V2), 141 USB_ID(BELKIN, F7D1101V2), 142 USB_ID(BELKIN, RT2870_1), 143 USB_ID(BELKIN, RT2870_2), 144 USB_ID(BELKIN, RTL8192CU_2), 145 USB_ID(BEWAN, RT3070), 146 USB_ID(CISCOLINKSYS, AE1000), 147 USB_ID(CISCOLINKSYS, AM10), 148 USB_ID(CISCOLINKSYS2, RT3070), 149 USB_ID(CISCOLINKSYS3, RT3070), 150 USB_ID(CONCEPTRONIC, RT2870_1), 151 USB_ID(CONCEPTRONIC, RT2870_2), 152 USB_ID(CONCEPTRONIC, RT2870_3), 153 USB_ID(CONCEPTRONIC, RT2870_4), 154 USB_ID(CONCEPTRONIC, RT2870_5), 155 USB_ID(CONCEPTRONIC, RT2870_6), 156 USB_ID(CONCEPTRONIC, RT2870_7), 157 USB_ID(CONCEPTRONIC, RT2870_8), 158 USB_ID(CONCEPTRONIC, RT3070_1), 159 USB_ID(CONCEPTRONIC, RT3070_2), 160 USB_ID(CONCEPTRONIC, RT3070_3), 161 USB_ID(COREGA, CGWLUSB300GNM), 162 USB_ID(COREGA, RT2870_1), 163 USB_ID(COREGA, RT2870_2), 164 USB_ID(COREGA, RT2870_3), 165 USB_ID(COREGA, RT3070), 166 USB_ID(CYBERTAN, RT2870), 167 USB_ID(DLINK, RT2870), 168 USB_ID(DLINK, RT3072), 169 USB_ID(DLINK, DWA127), 170 USB_ID(DLINK, DWA140B3), 171 USB_ID(DLINK, DWA160B2), 172 USB_ID(DLINK, DWA162), 173 USB_ID(DLINK2, DWA130), 174 USB_ID(DLINK2, RT2870_1), 175 USB_ID(DLINK2, RT2870_2), 176 USB_ID(DLINK2, RT3070_1), 177 USB_ID(DLINK2, RT3070_2), 178 USB_ID(DLINK2, RT3070_3), 179 USB_ID(DLINK2, RT3070_4), 180 USB_ID(DLINK2, RT3070_5), 181 USB_ID(DLINK2, RT3072), 182 USB_ID(DLINK2, RT3072_1), 183 USB_ID(DVICO, RT3070), 184 USB_ID(EDIMAX, EW7717), 185 USB_ID(EDIMAX, EW7718), 186 USB_ID(EDIMAX, EW7722UTN), 187 USB_ID(EDIMAX, RT2870_1), 188 USB_ID(ENCORE, RT3070), 189 USB_ID(ENCORE, RT3070_2), 190 USB_ID(ENCORE, RT3070_3), 191 USB_ID(GIGABYTE, GNWB31N), 192 USB_ID(GIGABYTE, GNWB32L), 193 USB_ID(GIGABYTE, RT2870_1), 194 USB_ID(GIGASET, RT3070_1), 195 USB_ID(GIGASET, RT3070_2), 196 USB_ID(GUILLEMOT, HWNU300), 197 USB_ID(HAWKING, HWUN2), 198 USB_ID(HAWKING, RT2870_1), 199 USB_ID(HAWKING, RT2870_2), 200 USB_ID(HAWKING, RT2870_3), 201 USB_ID(HAWKING, RT2870_4), 202 USB_ID(HAWKING, RT2870_5), 203 USB_ID(HAWKING, RT3070), 204 USB_ID(IODATA, RT3072_1), 205 USB_ID(IODATA, RT3072_2), 206 USB_ID(IODATA, RT3072_3), 207 USB_ID(IODATA, RT3072_4), 208 USB_ID(LINKSYS4, RT3070), 209 USB_ID(LINKSYS4, WUSB100), 210 USB_ID(LINKSYS4, WUSB54GC_3), 211 USB_ID(LINKSYS4, WUSB600N), 212 USB_ID(LINKSYS4, WUSB600NV2), 213 USB_ID(LOGITEC, LANW300NU2), 214 USB_ID(LOGITEC, LANW300NU2S), 215 USB_ID(LOGITEC, LAN_W300ANU2), 216 USB_ID(LOGITEC, LAN_W450ANU2E), 217 USB_ID(LOGITEC, RT2870_1), 218 USB_ID(LOGITEC, RT2870_2), 219 USB_ID(LOGITEC, RT2870_3), 220 USB_ID(LOGITEC, RT3020), 221 USB_ID(MELCO, RT2870_1), 222 USB_ID(MELCO, RT2870_2), 223 USB_ID(MELCO, WLIUCAG300N), 224 USB_ID(MELCO, WLIUCG300N), 225 USB_ID(MELCO, WLIUCG301N), 226 USB_ID(MELCO, WLIUCGN), 227 USB_ID(MELCO, WLIUCGNHP), 228 USB_ID(MELCO, WLIUCGNM), 229 USB_ID(MELCO, WLIUCGNM2T), 230 USB_ID(MOTOROLA4, RT2770), 231 USB_ID(MOTOROLA4, RT3070), 232 USB_ID(MSI, RT3070), 233 USB_ID(MSI, RT3070_2), 234 USB_ID(MSI, RT3070_3), 235 USB_ID(MSI, RT3070_4), 236 USB_ID(MSI, RT3070_5), 237 USB_ID(MSI, RT3070_6), 238 USB_ID(MSI, RT3070_7), 239 USB_ID(MSI, RT3070_8), 240 USB_ID(MSI, RT3070_9), 241 USB_ID(MSI, RT3070_10), 242 USB_ID(MSI, RT3070_11), 243 USB_ID(MSI, RT3070_12), 244 USB_ID(MSI, RT3070_13), 245 USB_ID(MSI, RT3070_14), 246 USB_ID(MSI, RT3070_15), 247 USB_ID(OVISLINK, RT3071), 248 USB_ID(OVISLINK, RT3072), 249 USB_ID(PARA, RT3070), 250 USB_ID(PEGATRON, RT2870), 251 USB_ID(PEGATRON, RT3070), 252 USB_ID(PEGATRON, RT3070_2), 253 USB_ID(PEGATRON, RT3070_3), 254 USB_ID(PEGATRON, RT3072), 255 USB_ID(PHILIPS, RT2870), 256 USB_ID(PLANEX2, GWUS300MINIS), 257 USB_ID(PLANEX2, GWUSMICRO300), 258 USB_ID(PLANEX2, GWUSMICRON), 259 USB_ID(PLANEX2, GWUS300MINIX), 260 USB_ID(PLANEX2, RT3070), 261 USB_ID(QCOM, RT2870), 262 USB_ID(QUANTA, RT3070), 263 USB_ID(RALINK, RT2070), 264 USB_ID(RALINK, RT2770), 265 USB_ID(RALINK, RT2870), 266 USB_ID(RALINK, RT3070), 267 USB_ID(RALINK, RT3071), 268 USB_ID(RALINK, RT3072), 269 USB_ID(RALINK, RT3370), 270 USB_ID(RALINK, RT3572), 271 USB_ID(RALINK, RT3573), 272 USB_ID(RALINK, RT5370), 273 USB_ID(RALINK, RT5572), 274 USB_ID(RALINK, RT8070), 275 USB_ID(SAMSUNG, RT2870_1), 276 USB_ID(SENAO, RT2870_1), 277 USB_ID(SENAO, RT2870_2), 278 USB_ID(SENAO, RT2870_3), 279 USB_ID(SENAO, RT2870_4), 280 USB_ID(SENAO, RT3070), 281 USB_ID(SENAO, RT3071), 282 USB_ID(SENAO, RT3072), 283 USB_ID(SENAO, RT3072_2), 284 USB_ID(SENAO, RT3072_3), 285 USB_ID(SENAO, RT3072_4), 286 USB_ID(SENAO, RT3072_5), 287 USB_ID(SITECOMEU, RT2870_1), 288 USB_ID(SITECOMEU, RT2870_2), 289 USB_ID(SITECOMEU, RT2870_3), 290 USB_ID(SITECOMEU, RT3070_1), 291 USB_ID(SITECOMEU, RT3070_3), 292 USB_ID(SITECOMEU, RT3072_3), 293 USB_ID(SITECOMEU, RT3072_4), 294 USB_ID(SITECOMEU, RT3072_5), 295 USB_ID(SITECOMEU, RT3072_6), 296 USB_ID(SITECOMEU, WL302), 297 USB_ID(SITECOMEU, WL315), 298 USB_ID(SITECOMEU, WL321), 299 USB_ID(SITECOMEU, WL324), 300 USB_ID(SITECOMEU, WL329), 301 USB_ID(SITECOMEU, WL343), 302 USB_ID(SITECOMEU, WL344), 303 USB_ID(SITECOMEU, WL345), 304 USB_ID(SITECOMEU, WL349V4), 305 USB_ID(SITECOMEU, WL608), 306 USB_ID(SITECOMEU, WLA4000), 307 USB_ID(SITECOMEU, WLA5000), 308 USB_ID(SPARKLAN, RT2870_1), 309 USB_ID(SPARKLAN, RT2870_2), 310 USB_ID(SPARKLAN, RT3070), 311 USB_ID(SWEEX2, LW153), 312 USB_ID(SWEEX2, LW303), 313 USB_ID(SWEEX2, LW313), 314 USB_ID(TOSHIBA, RT3070), 315 USB_ID(UMEDIA, RT2870_1), 316 USB_ID(UMEDIA, TEW645UB), 317 USB_ID(ZCOM, RT2870_1), 318 USB_ID(ZCOM, RT2870_2), 319 USB_ID(ZINWELL, RT2870_1), 320 USB_ID(ZINWELL, RT2870_2), 321 USB_ID(ZINWELL, RT3070), 322 USB_ID(ZINWELL, RT3072), 323 USB_ID(ZINWELL, RT3072_2), 324 USB_ID(ZYXEL, NWD2105), 325 USB_ID(ZYXEL, NWD211AN), 326 USB_ID(ZYXEL, RT2870_1), 327 USB_ID(ZYXEL, RT2870_2), 328 USB_ID(ZYXEL, RT3070), 329 }; 330 331 static int run_match(device_t, cfdata_t, void *); 332 static void run_attach(device_t, device_t, void *); 333 static int run_detach(device_t, int); 334 static int run_activate(device_t, enum devact); 335 336 CFATTACH_DECL_NEW(run, sizeof(struct run_softc), 337 run_match, run_attach, run_detach, run_activate); 338 339 static int run_alloc_rx_ring(struct run_softc *); 340 static void run_free_rx_ring(struct run_softc *); 341 static int run_alloc_tx_ring(struct run_softc *, int); 342 static void run_free_tx_ring(struct run_softc *, int); 343 static int run_load_microcode(struct run_softc *); 344 static int run_reset(struct run_softc *); 345 static int run_read(struct run_softc *, uint16_t, uint32_t *); 346 static int run_read_region_1(struct run_softc *, uint16_t, 347 uint8_t *, int); 348 static int run_write_2(struct run_softc *, uint16_t, uint16_t); 349 static int run_write(struct run_softc *, uint16_t, uint32_t); 350 static int run_write_region_1(struct run_softc *, uint16_t, 351 const uint8_t *, int); 352 static int run_set_region_4(struct run_softc *, uint16_t, 353 uint32_t, int); 354 static int run_efuse_read(struct run_softc *, uint16_t, 355 uint16_t *, int); 356 static int run_efuse_read_2(struct run_softc *, uint16_t, 357 uint16_t *); 358 static int run_eeprom_read_2(struct run_softc *, uint16_t, 359 uint16_t *); 360 static int run_rt2870_rf_write(struct run_softc *, uint8_t, 361 uint32_t); 362 static int run_rt3070_rf_read(struct run_softc *, uint8_t, 363 uint8_t *); 364 static int run_rt3070_rf_write(struct run_softc *, uint8_t, 365 uint8_t); 366 static int run_bbp_read(struct run_softc *, uint8_t, uint8_t *); 367 static int run_bbp_write(struct run_softc *, uint8_t, uint8_t); 368 static int run_mcu_cmd(struct run_softc *, uint8_t, uint16_t); 369 static const char * run_get_rf(uint16_t); 370 static void run_rt3593_get_txpower(struct run_softc *); 371 static void run_get_txpower(struct run_softc *); 372 static int run_read_eeprom(struct run_softc *); 373 static struct ieee80211_node * 374 run_node_alloc(struct ieee80211_node_table *); 375 static int run_media_change(struct ifnet *); 376 static void run_next_scan(void *); 377 static void run_task(void *); 378 static void run_do_async(struct run_softc *, 379 void (*)(struct run_softc *, void *), void *, int); 380 static int run_newstate(struct ieee80211com *, 381 enum ieee80211_state, int); 382 static void run_newstate_cb(struct run_softc *, void *); 383 static int run_updateedca(struct ieee80211com *); 384 static void run_updateedca_cb(struct run_softc *, void *); 385 #ifdef RUN_HWCRYPTO 386 static int run_set_key(struct ieee80211com *, 387 const struct ieee80211_key *, const uint8_t *); 388 static void run_set_key_cb(struct run_softc *, void *); 389 static int run_delete_key(struct ieee80211com *, 390 const struct ieee80211_key *); 391 static void run_delete_key_cb(struct run_softc *, void *); 392 #endif 393 static void run_calibrate_to(void *); 394 static void run_calibrate_cb(struct run_softc *, void *); 395 static void run_newassoc(struct ieee80211_node *, int); 396 static void run_rx_frame(struct run_softc *, uint8_t *, int); 397 static void run_rxeof(struct usbd_xfer *, void *, 398 usbd_status); 399 static void run_txeof(struct usbd_xfer *, void *, 400 usbd_status); 401 static int run_tx(struct run_softc *, struct mbuf *, 402 struct ieee80211_node *); 403 static void run_start(struct ifnet *); 404 static void run_watchdog(struct ifnet *); 405 static int run_ioctl(struct ifnet *, u_long, void *); 406 static void run_select_chan_group(struct run_softc *, int); 407 static void run_iq_calib(struct run_softc *, u_int); 408 static void run_set_agc(struct run_softc *, uint8_t); 409 static void run_set_rx_antenna(struct run_softc *, int); 410 static void run_rt2870_set_chan(struct run_softc *, u_int); 411 static void run_rt3070_set_chan(struct run_softc *, u_int); 412 static void run_rt3572_set_chan(struct run_softc *, u_int); 413 static void run_rt3593_set_chan(struct run_softc *, u_int); 414 static void run_rt5390_set_chan(struct run_softc *, u_int); 415 static void run_rt5592_set_chan(struct run_softc *, u_int); 416 static int run_set_chan(struct run_softc *, 417 struct ieee80211_channel *); 418 static void run_updateprot(struct run_softc *); 419 static void run_enable_tsf_sync(struct run_softc *); 420 static void run_enable_mrr(struct run_softc *); 421 static void run_set_txpreamble(struct run_softc *); 422 static void run_set_basicrates(struct run_softc *); 423 static void run_set_leds(struct run_softc *, uint16_t); 424 static void run_set_bssid(struct run_softc *, const uint8_t *); 425 static void run_set_macaddr(struct run_softc *, const uint8_t *); 426 static void run_updateslot(struct ifnet *); 427 static void run_updateslot_cb(struct run_softc *, void *); 428 static int8_t run_rssi2dbm(struct run_softc *, uint8_t, uint8_t); 429 static void run_rt5390_bbp_init(struct run_softc *); 430 static int run_bbp_init(struct run_softc *); 431 static int run_rt3070_rf_init(struct run_softc *); 432 static int run_rt3593_rf_init(struct run_softc *); 433 static int run_rt5390_rf_init(struct run_softc *); 434 static int run_rt3070_filter_calib(struct run_softc *, uint8_t, 435 uint8_t, uint8_t *); 436 static void run_rt3070_rf_setup(struct run_softc *); 437 static void run_rt3593_rf_setup(struct run_softc *); 438 static void run_rt5390_rf_setup(struct run_softc *); 439 static int run_txrx_enable(struct run_softc *); 440 static int run_adjust_freq_offset(struct run_softc *); 441 static int run_init(struct ifnet *); 442 static void run_stop(struct ifnet *, int); 443 #ifndef IEEE80211_STA_ONLY 444 static int run_setup_beacon(struct run_softc *); 445 #endif 446 447 static const struct { 448 uint32_t reg; 449 uint32_t val; 450 } rt2870_def_mac[] = { 451 RT2870_DEF_MAC 452 }; 453 454 static const struct { 455 uint8_t reg; 456 uint8_t val; 457 } rt2860_def_bbp[] = { 458 RT2860_DEF_BBP 459 }, rt5390_def_bbp[] = { 460 RT5390_DEF_BBP 461 }, rt5592_def_bbp[] = { 462 RT5592_DEF_BBP 463 }; 464 465 /* 466 * Default values for BBP register R196 for RT5592. 467 */ 468 static const uint8_t rt5592_bbp_r196[] = { 469 0xe0, 0x1f, 0x38, 0x32, 0x08, 0x28, 0x19, 0x0a, 0xff, 0x00, 470 0x16, 0x10, 0x10, 0x0b, 0x36, 0x2c, 0x26, 0x24, 0x42, 0x36, 471 0x30, 0x2d, 0x4c, 0x46, 0x3d, 0x40, 0x3e, 0x42, 0x3d, 0x40, 472 0x3c, 0x34, 0x2c, 0x2f, 0x3c, 0x35, 0x2e, 0x2a, 0x49, 0x41, 473 0x36, 0x31, 0x30, 0x30, 0x0e, 0x0d, 0x28, 0x21, 0x1c, 0x16, 474 0x50, 0x4a, 0x43, 0x40, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 476 0x00, 0x00, 0x7d, 0x14, 0x32, 0x2c, 0x36, 0x4c, 0x43, 0x2c, 477 0x2e, 0x36, 0x30, 0x6e 478 }; 479 480 static const struct rfprog { 481 uint8_t chan; 482 uint32_t r1, r2, r3, r4; 483 } rt2860_rf2850[] = { 484 RT2860_RF2850 485 }; 486 487 static const struct { 488 uint8_t n, r, k; 489 } rt3070_freqs[] = { 490 RT3070_RF3052 491 }; 492 493 static const struct rt5592_freqs { 494 uint16_t n; 495 uint8_t k, m, r; 496 } rt5592_freqs_20mhz[] = { 497 RT5592_RF5592_20MHZ 498 },rt5592_freqs_40mhz[] = { 499 RT5592_RF5592_40MHZ 500 }; 501 502 static const struct { 503 uint8_t reg; 504 uint8_t val; 505 } rt3070_def_rf[] = { 506 RT3070_DEF_RF 507 }, rt3572_def_rf[] = { 508 RT3572_DEF_RF 509 },rt3593_def_rf[] = { 510 RT3593_DEF_RF 511 },rt5390_def_rf[] = { 512 RT5390_DEF_RF 513 },rt5392_def_rf[] = { 514 RT5392_DEF_RF 515 },rt5592_def_rf[] = { 516 RT5592_DEF_RF 517 },rt5592_2ghz_def_rf[] = { 518 RT5592_2GHZ_DEF_RF 519 },rt5592_5ghz_def_rf[] = { 520 RT5592_5GHZ_DEF_RF 521 }; 522 523 static const struct { 524 u_int firstchan; 525 u_int lastchan; 526 uint8_t reg; 527 uint8_t val; 528 } rt5592_chan_5ghz[] = { 529 RT5592_CHAN_5GHZ 530 }; 531 532 static int 533 firmware_load(const char *dname, const char *iname, uint8_t **ucodep, 534 size_t *sizep) 535 { 536 firmware_handle_t fh; 537 int error; 538 539 if ((error = firmware_open(dname, iname, &fh)) != 0) 540 return error; 541 *sizep = firmware_get_size(fh); 542 if ((*ucodep = firmware_malloc(*sizep)) == NULL) { 543 firmware_close(fh); 544 return ENOMEM; 545 } 546 if ((error = firmware_read(fh, 0, *ucodep, *sizep)) != 0) 547 firmware_free(*ucodep, *sizep); 548 firmware_close(fh); 549 550 return error; 551 } 552 553 static int 554 run_match(device_t parent, cfdata_t match, void *aux) 555 { 556 struct usb_attach_arg *uaa = aux; 557 558 return (usb_lookup(run_devs, uaa->uaa_vendor, uaa->uaa_product) != NULL) ? 559 UMATCH_VENDOR_PRODUCT : UMATCH_NONE; 560 } 561 562 static void 563 run_attach(device_t parent, device_t self, void *aux) 564 { 565 struct run_softc *sc = device_private(self); 566 struct usb_attach_arg *uaa = aux; 567 struct ieee80211com *ic = &sc->sc_ic; 568 struct ifnet *ifp = &sc->sc_if; 569 usb_interface_descriptor_t *id; 570 usb_endpoint_descriptor_t *ed; 571 char *devinfop; 572 int i, nrx, ntx, ntries, error; 573 uint32_t ver; 574 575 aprint_naive("\n"); 576 aprint_normal("\n"); 577 578 sc->sc_dev = self; 579 sc->sc_udev = uaa->uaa_device; 580 581 devinfop = usbd_devinfo_alloc(sc->sc_udev, 0); 582 aprint_normal_dev(sc->sc_dev, "%s\n", devinfop); 583 usbd_devinfo_free(devinfop); 584 585 error = usbd_set_config_no(sc->sc_udev, 1, 0); 586 if (error != 0) { 587 aprint_error_dev(sc->sc_dev, "failed to set configuration" 588 ", err=%s\n", usbd_errstr(error)); 589 return; 590 } 591 592 /* get the first interface handle */ 593 error = usbd_device2interface_handle(sc->sc_udev, 0, &sc->sc_iface); 594 if (error != 0) { 595 aprint_error_dev(sc->sc_dev, 596 "could not get interface handle\n"); 597 return; 598 } 599 600 /* 601 * Find all bulk endpoints. There are 7 bulk endpoints: 1 for RX 602 * and 6 for TX (4 EDCAs + HCCA + Prio). 603 * Update 03-14-2009: some devices like the Planex GW-US300MiniS 604 * seem to have only 4 TX bulk endpoints (Fukaumi Naoki). 605 */ 606 nrx = ntx = 0; 607 id = usbd_get_interface_descriptor(sc->sc_iface); 608 for (i = 0; i < id->bNumEndpoints; i++) { 609 ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i); 610 if (ed == NULL || UE_GET_XFERTYPE(ed->bmAttributes) != UE_BULK) 611 continue; 612 613 if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN) { 614 sc->rxq.pipe_no = ed->bEndpointAddress; 615 nrx++; 616 } else if (ntx < RUN_MAXEPOUT) { 617 sc->txq[ntx].pipe_no = ed->bEndpointAddress; 618 ntx++; 619 } 620 } 621 /* make sure we've got them all */ 622 if (nrx < 1 || ntx < RUN_MAXEPOUT) { 623 aprint_error_dev(sc->sc_dev, "missing endpoint\n"); 624 return; 625 } 626 627 usb_init_task(&sc->sc_task, run_task, sc, 0); 628 callout_init(&sc->scan_to, 0); 629 callout_setfunc(&sc->scan_to, run_next_scan, sc); 630 callout_init(&sc->calib_to, 0); 631 callout_setfunc(&sc->calib_to, run_calibrate_to, sc); 632 633 sc->amrr.amrr_min_success_threshold = 1; 634 sc->amrr.amrr_max_success_threshold = 10; 635 636 /* wait for the chip to settle */ 637 for (ntries = 0; ntries < 100; ntries++) { 638 if (run_read(sc, RT2860_ASIC_VER_ID, &ver) != 0) 639 return; 640 if (ver != 0 && ver != 0xffffffff) 641 break; 642 DELAY(10); 643 } 644 if (ntries == 100) { 645 aprint_error_dev(sc->sc_dev, 646 "timeout waiting for NIC to initialize\n"); 647 return; 648 } 649 sc->mac_ver = ver >> 16; 650 sc->mac_rev = ver & 0xffff; 651 652 /* 653 * Per the comment in run_write_region_1(), "the WRITE_REGION_1 654 * command is not stable on RT2860", but WRITE_REGION_1 calls 655 * of up to 64 bytes have been tested and found to work with 656 * mac_ver 0x5390, and they reduce the run time of "ifconfig 657 * run0 up" from 30 seconds to a couple of seconds on OHCI. 658 * Enable WRITE_REGION_1 for the tested version only. As other 659 * versions are tested and found to work, they can be added 660 * here. 661 */ 662 if (sc->mac_ver == 0x5390) 663 sc->sc_flags |= RUN_USE_BLOCK_WRITE; 664 665 /* retrieve RF rev. no and various other things from EEPROM */ 666 run_read_eeprom(sc); 667 668 aprint_verbose_dev(sc->sc_dev, 669 "MAC/BBP RT%04X (rev 0x%04X), RF %s (MIMO %dT%dR), address %s\n", 670 sc->mac_ver, sc->mac_rev, run_get_rf(sc->rf_rev), sc->ntxchains, 671 sc->nrxchains, ether_sprintf(ic->ic_myaddr)); 672 673 ic->ic_ifp = ifp; 674 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ 675 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ 676 ic->ic_state = IEEE80211_S_INIT; 677 678 /* set device capabilities */ 679 ic->ic_caps = 680 IEEE80211_C_MONITOR | /* monitor mode supported */ 681 #ifndef IEEE80211_STA_ONLY 682 IEEE80211_C_IBSS | /* IBSS mode supported */ 683 IEEE80211_C_HOSTAP | /* HostAP mode supported */ 684 #endif 685 IEEE80211_C_SHPREAMBLE | /* short preamble supported */ 686 IEEE80211_C_SHSLOT | /* short slot time supported */ 687 #ifdef RUN_HWCRYPTO 688 IEEE80211_C_WEP | /* WEP */ 689 IEEE80211_C_TKIP | /* TKIP */ 690 IEEE80211_C_AES_CCM | /* AES CCMP */ 691 IEEE80211_C_TKIPMIC | /* TKIPMIC */ 692 #endif 693 IEEE80211_C_WME | /* WME */ 694 IEEE80211_C_WPA; /* WPA/RSN */ 695 696 if (sc->rf_rev == RT2860_RF_2750 || 697 sc->rf_rev == RT2860_RF_2850 || 698 sc->rf_rev == RT3070_RF_3052 || 699 sc->rf_rev == RT3070_RF_3053 || 700 sc->rf_rev == RT5592_RF_5592) { 701 /* set supported .11a rates */ 702 ic->ic_sup_rates[IEEE80211_MODE_11A] = 703 ieee80211_std_rateset_11a; 704 705 /* set supported .11a channels */ 706 for (i = 14; i < (int)__arraycount(rt2860_rf2850); i++) { 707 uint8_t chan = rt2860_rf2850[i].chan; 708 ic->ic_channels[chan].ic_freq = 709 ieee80211_ieee2mhz(chan, IEEE80211_CHAN_5GHZ); 710 ic->ic_channels[chan].ic_flags = IEEE80211_CHAN_A; 711 } 712 } 713 714 /* set supported .11b and .11g rates */ 715 ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b; 716 ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g; 717 718 /* set supported .11b and .11g channels (1 through 14) */ 719 for (i = 1; i <= 14; i++) { 720 ic->ic_channels[i].ic_freq = 721 ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ); 722 ic->ic_channels[i].ic_flags = 723 IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | 724 IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; 725 } 726 727 ifp->if_softc = sc; 728 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 729 ifp->if_init = run_init; 730 ifp->if_ioctl = run_ioctl; 731 ifp->if_start = run_start; 732 ifp->if_watchdog = run_watchdog; 733 IFQ_SET_READY(&ifp->if_snd); 734 memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ); 735 736 if_attach(ifp); 737 ieee80211_ifattach(ic); 738 ic->ic_node_alloc = run_node_alloc; 739 ic->ic_newassoc = run_newassoc; 740 ic->ic_updateslot = run_updateslot; 741 ic->ic_wme.wme_update = run_updateedca; 742 #ifdef RUN_HWCRYPTO 743 ic->ic_crypto.cs_key_set = run_set_key; 744 ic->ic_crypto.cs_key_delete = run_delete_key; 745 #endif 746 /* override state transition machine */ 747 sc->sc_newstate = ic->ic_newstate; 748 ic->ic_newstate = run_newstate; 749 750 /* XXX media locking needs revisiting */ 751 mutex_init(&sc->sc_media_mtx, MUTEX_DEFAULT, IPL_SOFTUSB); 752 ieee80211_media_init_with_lock(ic, 753 run_media_change, ieee80211_media_status, &sc->sc_media_mtx); 754 755 bpf_attach2(ifp, DLT_IEEE802_11_RADIO, 756 sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN, 757 &sc->sc_drvbpf); 758 759 sc->sc_rxtap_len = sizeof(sc->sc_rxtapu); 760 sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len); 761 sc->sc_rxtap.wr_ihdr.it_present = htole32(RUN_RX_RADIOTAP_PRESENT); 762 763 sc->sc_txtap_len = sizeof(sc->sc_txtapu); 764 sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len); 765 sc->sc_txtap.wt_ihdr.it_present = htole32(RUN_TX_RADIOTAP_PRESENT); 766 767 ieee80211_announce(ic); 768 769 usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, sc->sc_dev); 770 771 if (!pmf_device_register(self, NULL, NULL)) 772 aprint_error_dev(self, "couldn't establish power handler\n"); 773 } 774 775 static int 776 run_detach(device_t self, int flags) 777 { 778 struct run_softc *sc = device_private(self); 779 struct ifnet *ifp = &sc->sc_if; 780 struct ieee80211com *ic = &sc->sc_ic; 781 int s; 782 783 if (ifp->if_softc == NULL) 784 return 0; 785 786 pmf_device_deregister(self); 787 788 s = splusb(); 789 790 sc->sc_flags |= RUN_DETACHING; 791 792 if (ifp->if_flags & IFF_RUNNING) { 793 run_stop(ifp, 0); 794 callout_halt(&sc->scan_to, NULL); 795 callout_halt(&sc->calib_to, NULL); 796 usb_rem_task_wait(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER, 797 NULL); 798 } 799 800 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 801 bpf_detach(ifp); 802 ieee80211_ifdetach(ic); 803 if_detach(ifp); 804 805 splx(s); 806 807 usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev); 808 809 callout_stop(&sc->scan_to); 810 callout_stop(&sc->calib_to); 811 812 callout_destroy(&sc->scan_to); 813 callout_destroy(&sc->calib_to); 814 815 return 0; 816 } 817 818 static int 819 run_activate(device_t self, enum devact act) 820 { 821 struct run_softc *sc = device_private(self); 822 823 switch (act) { 824 case DVACT_DEACTIVATE: 825 if_deactivate(sc->sc_ic.ic_ifp); 826 return 0; 827 default: 828 return EOPNOTSUPP; 829 } 830 } 831 832 static int 833 run_alloc_rx_ring(struct run_softc *sc) 834 { 835 struct run_rx_ring *rxq = &sc->rxq; 836 int i, error; 837 838 error = usbd_open_pipe(sc->sc_iface, rxq->pipe_no, 0, &rxq->pipeh); 839 if (error != 0) 840 goto fail; 841 842 for (i = 0; i < RUN_RX_RING_COUNT; i++) { 843 struct run_rx_data *data = &rxq->data[i]; 844 845 data->sc = sc; /* backpointer for callbacks */ 846 847 error = usbd_create_xfer(sc->rxq.pipeh, RUN_MAX_RXSZ, 848 0, 0, &data->xfer); 849 if (error) 850 goto fail; 851 852 data->buf = usbd_get_buffer(data->xfer); 853 } 854 if (error != 0) 855 fail: run_free_rx_ring(sc); 856 return error; 857 } 858 859 static void 860 run_free_rx_ring(struct run_softc *sc) 861 { 862 struct run_rx_ring *rxq = &sc->rxq; 863 int i; 864 865 if (rxq->pipeh != NULL) { 866 usbd_abort_pipe(rxq->pipeh); 867 } 868 for (i = 0; i < RUN_RX_RING_COUNT; i++) { 869 if (rxq->data[i].xfer != NULL) 870 usbd_destroy_xfer(rxq->data[i].xfer); 871 rxq->data[i].xfer = NULL; 872 } 873 if (rxq->pipeh != NULL) { 874 usbd_close_pipe(rxq->pipeh); 875 rxq->pipeh = NULL; 876 } 877 } 878 879 static int 880 run_alloc_tx_ring(struct run_softc *sc, int qid) 881 { 882 struct run_tx_ring *txq = &sc->txq[qid]; 883 int i, error; 884 uint16_t txwisize; 885 886 txwisize = sizeof(struct rt2860_txwi); 887 if (sc->mac_ver == 0x5592) 888 txwisize += sizeof(uint32_t); 889 890 txq->cur = txq->queued = 0; 891 892 error = usbd_open_pipe(sc->sc_iface, txq->pipe_no, 0, &txq->pipeh); 893 if (error != 0) 894 goto fail; 895 896 for (i = 0; i < RUN_TX_RING_COUNT; i++) { 897 struct run_tx_data *data = &txq->data[i]; 898 899 data->sc = sc; /* backpointer for callbacks */ 900 data->qid = qid; 901 902 error = usbd_create_xfer(txq->pipeh, RUN_MAX_TXSZ, 903 USBD_FORCE_SHORT_XFER, 0, &data->xfer); 904 if (error) 905 goto fail; 906 907 data->buf = usbd_get_buffer(data->xfer); 908 /* zeroize the TXD + TXWI part */ 909 memset(data->buf, 0, sizeof(struct rt2870_txd) + txwisize); 910 } 911 if (error != 0) 912 fail: run_free_tx_ring(sc, qid); 913 return error; 914 } 915 916 static void 917 run_free_tx_ring(struct run_softc *sc, int qid) 918 { 919 struct run_tx_ring *txq = &sc->txq[qid]; 920 int i; 921 922 if (txq->pipeh != NULL) { 923 usbd_abort_pipe(txq->pipeh); 924 usbd_close_pipe(txq->pipeh); 925 txq->pipeh = NULL; 926 } 927 for (i = 0; i < RUN_TX_RING_COUNT; i++) { 928 if (txq->data[i].xfer != NULL) 929 usbd_destroy_xfer(txq->data[i].xfer); 930 txq->data[i].xfer = NULL; 931 } 932 } 933 934 static int __noinline 935 run_load_microcode(struct run_softc *sc) 936 { 937 usb_device_request_t req; 938 const char *fwname; 939 u_char *ucode = NULL; /* XXX gcc 4.8.3: maybe-uninitialized */ 940 size_t size = 0; /* XXX gcc 4.8.3: maybe-uninitialized */ 941 uint32_t tmp; 942 int ntries, error; 943 944 /* RT3071/RT3072 use a different firmware */ 945 if (sc->mac_ver != 0x2860 && 946 sc->mac_ver != 0x2872 && 947 sc->mac_ver != 0x3070) 948 fwname = "run-rt3071"; 949 else 950 fwname = "run-rt2870"; 951 952 if ((error = firmware_load("run", fwname, &ucode, &size)) != 0) { 953 device_printf(sc->sc_dev, 954 "error %d, could not read firmware %s\n", error, fwname); 955 return error; 956 } 957 if (size != 4096) { 958 device_printf(sc->sc_dev, 959 "invalid firmware size (should be 4KB)\n"); 960 firmware_free(ucode, size); 961 return EINVAL; 962 } 963 964 run_read(sc, RT2860_ASIC_VER_ID, &tmp); 965 /* write microcode image */ 966 run_write_region_1(sc, RT2870_FW_BASE, ucode, size); 967 firmware_free(ucode, size); 968 run_write(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff); 969 run_write(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff); 970 971 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 972 req.bRequest = RT2870_RESET; 973 USETW(req.wValue, 8); 974 USETW(req.wIndex, 0); 975 USETW(req.wLength, 0); 976 if ((error = usbd_do_request(sc->sc_udev, &req, NULL)) != 0) 977 return error; 978 979 usbd_delay_ms(sc->sc_udev, 10); 980 run_write(sc, RT2860_H2M_BBPAGENT, 0); 981 run_write(sc, RT2860_H2M_MAILBOX, 0); 982 run_write(sc, RT2860_H2M_INTSRC, 0); 983 if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0)) != 0) 984 return error; 985 986 /* wait until microcontroller is ready */ 987 for (ntries = 0; ntries < 1000; ntries++) { 988 if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0) 989 return error; 990 if (tmp & RT2860_MCU_READY) 991 break; 992 usbd_delay_ms(sc->sc_udev, 10); 993 } 994 if (ntries == 1000) { 995 device_printf(sc->sc_dev, 996 "timeout waiting for MCU to initialize\n"); 997 return ETIMEDOUT; 998 } 999 1000 sc->sc_flags |= RUN_FWLOADED; 1001 1002 DPRINTF(("microcode successfully loaded after %d tries\n", ntries)); 1003 return 0; 1004 } 1005 1006 static int __noinline 1007 run_reset(struct run_softc *sc) 1008 { 1009 usb_device_request_t req; 1010 1011 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1012 req.bRequest = RT2870_RESET; 1013 USETW(req.wValue, 1); 1014 USETW(req.wIndex, 0); 1015 USETW(req.wLength, 0); 1016 return usbd_do_request(sc->sc_udev, &req, NULL); 1017 } 1018 1019 static int __noinline 1020 run_read(struct run_softc *sc, uint16_t reg, uint32_t *val) 1021 { 1022 uint32_t tmp; 1023 int error; 1024 1025 error = run_read_region_1(sc, reg, (uint8_t *)&tmp, sizeof(tmp)); 1026 if (error == 0) 1027 *val = le32toh(tmp); 1028 else 1029 *val = 0xffffffff; 1030 return error; 1031 } 1032 1033 static int 1034 run_read_region_1(struct run_softc *sc, uint16_t reg, uint8_t *buf, int len) 1035 { 1036 usb_device_request_t req; 1037 1038 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1039 req.bRequest = RT2870_READ_REGION_1; 1040 USETW(req.wValue, 0); 1041 USETW(req.wIndex, reg); 1042 USETW(req.wLength, len); 1043 return usbd_do_request(sc->sc_udev, &req, buf); 1044 } 1045 1046 static int 1047 run_write_2(struct run_softc *sc, uint16_t reg, uint16_t val) 1048 { 1049 usb_device_request_t req; 1050 1051 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1052 req.bRequest = RT2870_WRITE_2; 1053 USETW(req.wValue, val); 1054 USETW(req.wIndex, reg); 1055 USETW(req.wLength, 0); 1056 return usbd_do_request(sc->sc_udev, &req, NULL); 1057 } 1058 1059 static int __noinline 1060 run_write(struct run_softc *sc, uint16_t reg, uint32_t val) 1061 { 1062 uint32_t tmp = htole32(val); 1063 return run_write_region_1(sc, reg, (uint8_t *)&tmp, sizeof(tmp)); 1064 } 1065 1066 static int 1067 run_write_region_1(struct run_softc *sc, uint16_t reg, const uint8_t *buf, 1068 int len) 1069 { 1070 int error = 0; 1071 if (sc->sc_flags & RUN_USE_BLOCK_WRITE) { 1072 usb_device_request_t req; 1073 /* 1074 * NOTE: It appears the WRITE_REGION_1 command cannot be 1075 * passed a huge amount of data, which will crash the 1076 * firmware. Limit amount of data passed to 64 bytes at a 1077 * time. 1078 */ 1079 while (len > 0) { 1080 int delta = MIN(len, 64); 1081 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1082 req.bRequest = RT2870_WRITE_REGION_1; 1083 USETW(req.wValue, 0); 1084 USETW(req.wIndex, reg); 1085 USETW(req.wLength, delta); 1086 error = usbd_do_request(sc->sc_udev, &req, 1087 __UNCONST(buf)); 1088 if (error != 0) 1089 break; 1090 reg += delta; 1091 buf += delta; 1092 len -= delta; 1093 } 1094 } else { 1095 /* 1096 * NB: the WRITE_REGION_1 command is not stable on RT2860. 1097 * We thus issue multiple WRITE_2 commands instead. 1098 */ 1099 int i; 1100 KASSERT((len & 1) == 0); 1101 for (i = 0; i < len && error == 0; i += 2) 1102 error = run_write_2(sc, reg + i, buf[i] | buf[i + 1] << 8); 1103 } 1104 return error; 1105 } 1106 1107 static int 1108 run_set_region_4(struct run_softc *sc, uint16_t reg, uint32_t val, int count) 1109 { 1110 int error = 0; 1111 1112 if (sc->sc_flags & RUN_USE_BLOCK_WRITE) { 1113 while (count > 0) { 1114 int i, delta; 1115 uint32_t tmp[16]; 1116 1117 delta = MIN(count, __arraycount(tmp)); 1118 for (i = 0; i < delta; i++) 1119 tmp[i] = htole32(val); 1120 error = run_write_region_1(sc, reg, (uint8_t *)tmp, 1121 delta * sizeof(uint32_t)); 1122 if (error != 0) 1123 break; 1124 reg += delta * sizeof(uint32_t); 1125 count -= delta; 1126 } 1127 } else { 1128 for (; count > 0 && error == 0; count--, reg += 4) 1129 error = run_write(sc, reg, val); 1130 } 1131 return error; 1132 } 1133 1134 static int 1135 run_efuse_read(struct run_softc *sc, uint16_t addr, uint16_t *val, int count) 1136 { 1137 uint32_t tmp; 1138 uint16_t reg; 1139 int error, ntries; 1140 1141 if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0) 1142 return error; 1143 1144 if (count == 2) 1145 addr *= 2; 1146 /*- 1147 * Read one 16-byte block into registers EFUSE_DATA[0-3]: 1148 * DATA0: F E D C 1149 * DATA1: B A 9 8 1150 * DATA2: 7 6 5 4 1151 * DATA3: 3 2 1 0 1152 */ 1153 tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK); 1154 tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK; 1155 run_write(sc, RT3070_EFUSE_CTRL, tmp); 1156 for (ntries = 0; ntries < 100; ntries++) { 1157 if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0) 1158 return error; 1159 if (!(tmp & RT3070_EFSROM_KICK)) 1160 break; 1161 usbd_delay_ms(sc->sc_udev, 2); 1162 } 1163 if (ntries == 100) 1164 return ETIMEDOUT; 1165 1166 if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) { 1167 *val = 0xffff; /* address not found */ 1168 return 0; 1169 } 1170 /* determine to which 32-bit register our 16-bit word belongs */ 1171 reg = RT3070_EFUSE_DATA3 - (addr & 0xc); 1172 if ((error = run_read(sc, reg, &tmp)) != 0) 1173 return error; 1174 1175 tmp >>= (8 * (addr & 0x3)); 1176 *val = (addr & 1) ? tmp >> 16 : tmp & 0xffff; 1177 return 0; 1178 } 1179 1180 /* Read 16-bit from eFUSE ROM for RT3xxxx. */ 1181 static int 1182 run_efuse_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val) 1183 { 1184 return run_efuse_read(sc, addr, val, 2); 1185 } 1186 1187 static int 1188 run_eeprom_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val) 1189 { 1190 usb_device_request_t req; 1191 uint16_t tmp; 1192 int error; 1193 1194 addr *= 2; 1195 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1196 req.bRequest = RT2870_EEPROM_READ; 1197 USETW(req.wValue, 0); 1198 USETW(req.wIndex, addr); 1199 USETW(req.wLength, sizeof(tmp)); 1200 error = usbd_do_request(sc->sc_udev, &req, &tmp); 1201 if (error == 0) 1202 *val = le16toh(tmp); 1203 else 1204 *val = 0xffff; 1205 return error; 1206 } 1207 1208 static __inline int 1209 run_srom_read(struct run_softc *sc, uint16_t addr, uint16_t *val) 1210 { 1211 1212 /* either eFUSE ROM or EEPROM */ 1213 return sc->sc_srom_read(sc, addr, val); 1214 } 1215 1216 static int 1217 run_rt2870_rf_write(struct run_softc *sc, uint8_t reg, uint32_t val) 1218 { 1219 uint32_t tmp; 1220 int error, ntries; 1221 1222 for (ntries = 0; ntries < 10; ntries++) { 1223 if ((error = run_read(sc, RT2860_RF_CSR_CFG0, &tmp)) != 0) 1224 return error; 1225 if (!(tmp & RT2860_RF_REG_CTRL)) 1226 break; 1227 } 1228 if (ntries == 10) 1229 return ETIMEDOUT; 1230 1231 /* RF registers are 24-bit on the RT2860 */ 1232 tmp = RT2860_RF_REG_CTRL | 24 << RT2860_RF_REG_WIDTH_SHIFT | 1233 (val & 0x3fffff) << 2 | (reg & 3); 1234 return run_write(sc, RT2860_RF_CSR_CFG0, tmp); 1235 } 1236 1237 static int 1238 run_rt3070_rf_read(struct run_softc *sc, uint8_t reg, uint8_t *val) 1239 { 1240 uint32_t tmp; 1241 int error, ntries; 1242 1243 for (ntries = 0; ntries < 100; ntries++) { 1244 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0) 1245 return error; 1246 if (!(tmp & RT3070_RF_KICK)) 1247 break; 1248 } 1249 if (ntries == 100) 1250 return ETIMEDOUT; 1251 1252 tmp = RT3070_RF_KICK | reg << 8; 1253 if ((error = run_write(sc, RT3070_RF_CSR_CFG, tmp)) != 0) 1254 return error; 1255 1256 for (ntries = 0; ntries < 100; ntries++) { 1257 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0) 1258 return error; 1259 if (!(tmp & RT3070_RF_KICK)) 1260 break; 1261 } 1262 if (ntries == 100) 1263 return ETIMEDOUT; 1264 1265 *val = tmp & 0xff; 1266 return 0; 1267 } 1268 1269 static int 1270 run_rt3070_rf_write(struct run_softc *sc, uint8_t reg, uint8_t val) 1271 { 1272 uint32_t tmp; 1273 int error, ntries; 1274 1275 for (ntries = 0; ntries < 10; ntries++) { 1276 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0) 1277 return error; 1278 if (!(tmp & RT3070_RF_KICK)) 1279 break; 1280 } 1281 if (ntries == 10) 1282 return ETIMEDOUT; 1283 1284 tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val; 1285 return run_write(sc, RT3070_RF_CSR_CFG, tmp); 1286 } 1287 1288 static int 1289 run_bbp_read(struct run_softc *sc, uint8_t reg, uint8_t *val) 1290 { 1291 uint32_t tmp; 1292 int ntries, error; 1293 1294 for (ntries = 0; ntries < 10; ntries++) { 1295 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0) 1296 return error; 1297 if (!(tmp & RT2860_BBP_CSR_KICK)) 1298 break; 1299 } 1300 if (ntries == 10) 1301 return ETIMEDOUT; 1302 1303 tmp = RT2860_BBP_CSR_READ | RT2860_BBP_CSR_KICK | reg << 8; 1304 if ((error = run_write(sc, RT2860_BBP_CSR_CFG, tmp)) != 0) 1305 return error; 1306 1307 for (ntries = 0; ntries < 10; ntries++) { 1308 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0) 1309 return error; 1310 if (!(tmp & RT2860_BBP_CSR_KICK)) 1311 break; 1312 } 1313 if (ntries == 10) 1314 return ETIMEDOUT; 1315 1316 *val = tmp & 0xff; 1317 return 0; 1318 } 1319 1320 static int 1321 run_bbp_write(struct run_softc *sc, uint8_t reg, uint8_t val) 1322 { 1323 uint32_t tmp; 1324 int ntries, error; 1325 1326 for (ntries = 0; ntries < 10; ntries++) { 1327 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0) 1328 return error; 1329 if (!(tmp & RT2860_BBP_CSR_KICK)) 1330 break; 1331 } 1332 if (ntries == 10) 1333 return ETIMEDOUT; 1334 1335 tmp = RT2860_BBP_CSR_KICK | reg << 8 | val; 1336 return run_write(sc, RT2860_BBP_CSR_CFG, tmp); 1337 } 1338 1339 /* 1340 * Send a command to the 8051 microcontroller unit. 1341 */ 1342 static int 1343 run_mcu_cmd(struct run_softc *sc, uint8_t cmd, uint16_t arg) 1344 { 1345 uint32_t tmp; 1346 int error, ntries; 1347 1348 for (ntries = 0; ntries < 100; ntries++) { 1349 if ((error = run_read(sc, RT2860_H2M_MAILBOX, &tmp)) != 0) 1350 return error; 1351 if (!(tmp & RT2860_H2M_BUSY)) 1352 break; 1353 } 1354 if (ntries == 100) 1355 return ETIMEDOUT; 1356 1357 tmp = RT2860_H2M_BUSY | RT2860_TOKEN_NO_INTR << 16 | arg; 1358 if ((error = run_write(sc, RT2860_H2M_MAILBOX, tmp)) == 0) 1359 error = run_write(sc, RT2860_HOST_CMD, cmd); 1360 return error; 1361 } 1362 1363 /* 1364 * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word. 1365 * Used to adjust per-rate Tx power registers. 1366 */ 1367 static __inline uint32_t 1368 b4inc(uint32_t b32, int8_t delta) 1369 { 1370 int8_t i, b4; 1371 1372 for (i = 0; i < 8; i++) { 1373 b4 = b32 & 0xf; 1374 b4 += delta; 1375 if (b4 < 0) 1376 b4 = 0; 1377 else if (b4 > 0xf) 1378 b4 = 0xf; 1379 b32 = b32 >> 4 | b4 << 28; 1380 } 1381 return b32; 1382 } 1383 1384 static const char * 1385 run_get_rf(uint16_t rev) 1386 { 1387 switch (rev) { 1388 case RT2860_RF_2820: return "RT2820"; 1389 case RT2860_RF_2850: return "RT2850"; 1390 case RT2860_RF_2720: return "RT2720"; 1391 case RT2860_RF_2750: return "RT2750"; 1392 case RT3070_RF_3020: return "RT3020"; 1393 case RT3070_RF_2020: return "RT2020"; 1394 case RT3070_RF_3021: return "RT3021"; 1395 case RT3070_RF_3022: return "RT3022"; 1396 case RT3070_RF_3052: return "RT3052"; 1397 case RT3070_RF_3053: return "RT3053"; 1398 case RT5592_RF_5592: return "RT5592"; 1399 case RT5390_RF_5370: return "RT5370"; 1400 case RT5390_RF_5372: return "RT5372"; 1401 } 1402 return "unknown"; 1403 } 1404 1405 static void 1406 run_rt3593_get_txpower(struct run_softc *sc) 1407 { 1408 uint16_t addr, val; 1409 int i; 1410 1411 /* Read power settings for 2GHz channels. */ 1412 for (i = 0; i < 14; i += 2) { 1413 addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE1 : 1414 RT2860_EEPROM_PWR2GHZ_BASE1; 1415 run_srom_read(sc, addr + i / 2, &val); 1416 sc->txpow1[i + 0] = (int8_t)(val & 0xff); 1417 sc->txpow1[i + 1] = (int8_t)(val >> 8); 1418 1419 addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE2 : 1420 RT2860_EEPROM_PWR2GHZ_BASE2; 1421 run_srom_read(sc, addr + i / 2, &val); 1422 sc->txpow2[i + 0] = (int8_t)(val & 0xff); 1423 sc->txpow2[i + 1] = (int8_t)(val >> 8); 1424 1425 if (sc->ntxchains == 3) { 1426 run_srom_read(sc, RT3593_EEPROM_PWR2GHZ_BASE3 + i / 2, 1427 &val); 1428 sc->txpow3[i + 0] = (int8_t)(val & 0xff); 1429 sc->txpow3[i + 1] = (int8_t)(val >> 8); 1430 } 1431 } 1432 /* Fix broken Tx power entries. */ 1433 for (i = 0; i < 14; i++) { 1434 if (sc->txpow1[i] > 31) 1435 sc->txpow1[i] = 5; 1436 if (sc->txpow2[i] > 31) 1437 sc->txpow2[i] = 5; 1438 if (sc->ntxchains == 3) { 1439 if (sc->txpow3[i] > 31) 1440 sc->txpow3[i] = 5; 1441 } 1442 } 1443 /* Read power settings for 5GHz channels. */ 1444 for (i = 0; i < 40; i += 2) { 1445 run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE1 + i / 2, &val); 1446 sc->txpow1[i + 14] = (int8_t)(val & 0xff); 1447 sc->txpow1[i + 15] = (int8_t)(val >> 8); 1448 1449 run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE2 + i / 2, &val); 1450 sc->txpow2[i + 14] = (int8_t)(val & 0xff); 1451 sc->txpow2[i + 15] = (int8_t)(val >> 8); 1452 1453 if (sc->ntxchains == 3) { 1454 run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE3 + i / 2, 1455 &val); 1456 sc->txpow3[i + 14] = (int8_t)(val & 0xff); 1457 sc->txpow3[i + 15] = (int8_t)(val >> 8); 1458 } 1459 } 1460 } 1461 1462 static void 1463 run_get_txpower(struct run_softc *sc) 1464 { 1465 uint16_t val; 1466 int i; 1467 1468 /* Read power settings for 2GHz channels. */ 1469 for (i = 0; i < 14; i += 2) { 1470 run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2, &val); 1471 sc->txpow1[i + 0] = (int8_t)(val & 0xff); 1472 sc->txpow1[i + 1] = (int8_t)(val >> 8); 1473 1474 if (sc->mac_ver != 0x5390) { 1475 run_srom_read(sc, 1476 RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2, &val); 1477 sc->txpow2[i + 0] = (int8_t)(val & 0xff); 1478 sc->txpow2[i + 1] = (int8_t)(val >> 8); 1479 } 1480 } 1481 /* Fix broken Tx power entries. */ 1482 for (i = 0; i < 14; i++) { 1483 if (sc->mac_ver >= 0x5390) { 1484 if (sc->txpow1[i] < 0 || sc->txpow1[i] > 39) 1485 sc->txpow1[i] = 5; 1486 } else { 1487 if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31) 1488 sc->txpow1[i] = 5; 1489 } 1490 if (sc->mac_ver > 0x5390) { 1491 if (sc->txpow2[i] < 0 || sc->txpow2[i] > 39) 1492 sc->txpow2[i] = 5; 1493 } else if (sc->mac_ver < 0x5390) { 1494 if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31) 1495 sc->txpow2[i] = 5; 1496 } 1497 DPRINTF(("chan %d: power1=%d, power2=%d\n", 1498 rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i])); 1499 } 1500 /* Read power settings for 5GHz channels. */ 1501 for (i = 0; i < 40; i += 2) { 1502 run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2, &val); 1503 sc->txpow1[i + 14] = (int8_t)(val & 0xff); 1504 sc->txpow1[i + 15] = (int8_t)(val >> 8); 1505 1506 run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2, &val); 1507 sc->txpow2[i + 14] = (int8_t)(val & 0xff); 1508 sc->txpow2[i + 15] = (int8_t)(val >> 8); 1509 } 1510 /* Fix broken Tx power entries. */ 1511 for (i = 0; i < 40; i++ ) { 1512 if (sc->mac_ver != 0x5592) { 1513 if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15) 1514 sc->txpow1[14 + i] = 5; 1515 if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15) 1516 sc->txpow2[14 + i] = 5; 1517 } 1518 DPRINTF(("chan %d: power1=%d, power2=%d\n", 1519 rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i], 1520 sc->txpow2[14 + i])); 1521 } 1522 } 1523 1524 static int 1525 run_read_eeprom(struct run_softc *sc) 1526 { 1527 struct ieee80211com *ic = &sc->sc_ic; 1528 int8_t delta_2ghz, delta_5ghz; 1529 uint32_t tmp; 1530 uint16_t val; 1531 int ridx, ant, i; 1532 1533 /* check whether the ROM is eFUSE ROM or EEPROM */ 1534 sc->sc_srom_read = run_eeprom_read_2; 1535 if (sc->mac_ver >= 0x3070) { 1536 run_read(sc, RT3070_EFUSE_CTRL, &tmp); 1537 DPRINTF(("EFUSE_CTRL=0x%08x\n", tmp)); 1538 if (tmp & RT3070_SEL_EFUSE) 1539 sc->sc_srom_read = run_efuse_read_2; 1540 } 1541 1542 /* read ROM version */ 1543 run_srom_read(sc, RT2860_EEPROM_VERSION, &val); 1544 DPRINTF(("EEPROM rev=%d, FAE=%d\n", val & 0xff, val >> 8)); 1545 1546 /* read MAC address */ 1547 run_srom_read(sc, RT2860_EEPROM_MAC01, &val); 1548 ic->ic_myaddr[0] = val & 0xff; 1549 ic->ic_myaddr[1] = val >> 8; 1550 run_srom_read(sc, RT2860_EEPROM_MAC23, &val); 1551 ic->ic_myaddr[2] = val & 0xff; 1552 ic->ic_myaddr[3] = val >> 8; 1553 run_srom_read(sc, RT2860_EEPROM_MAC45, &val); 1554 ic->ic_myaddr[4] = val & 0xff; 1555 ic->ic_myaddr[5] = val >> 8; 1556 1557 if (sc->mac_ver < 0x3593) { 1558 /* read vendor BBP settings */ 1559 for (i = 0; i < 10; i++) { 1560 run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val); 1561 sc->bbp[i].val = val & 0xff; 1562 sc->bbp[i].reg = val >> 8; 1563 DPRINTF(("BBP%d=0x%02x\n", sc->bbp[i].reg, 1564 sc->bbp[i].val)); 1565 } 1566 1567 if (sc->mac_ver >= 0x3071) { 1568 /* read vendor RF settings */ 1569 for (i = 0; i < 8; i++) { 1570 run_srom_read(sc, RT3071_EEPROM_RF_BASE + i, 1571 &val); 1572 sc->rf[i].val = val & 0xff; 1573 sc->rf[i].reg = val >> 8; 1574 DPRINTF(("RF%d=0x%02x\n", sc->rf[i].reg, 1575 sc->rf[i].val)); 1576 } 1577 } 1578 } 1579 1580 /* read RF frequency offset from EEPROM */ 1581 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_FREQ_LEDS : 1582 RT3593_EEPROM_FREQ, &val); 1583 sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0; 1584 DPRINTF(("EEPROM freq offset %d\n", sc->freq & 0xff)); 1585 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_FREQ_LEDS : 1586 RT3593_EEPROM_FREQ, &val); 1587 if ((val >> 8) != 0xff) { 1588 /* read LEDs operating mode */ 1589 sc->leds = val >> 8; 1590 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED1 : 1591 RT3593_EEPROM_LED1, &sc->led[0]); 1592 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED2 : 1593 RT3593_EEPROM_LED2, &sc->led[1]); 1594 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED3 : 1595 RT3593_EEPROM_LED3, &sc->led[2]); 1596 } else { 1597 /* broken EEPROM, use default settings */ 1598 sc->leds = 0x01; 1599 sc->led[0] = 0x5555; 1600 sc->led[1] = 0x2221; 1601 sc->led[2] = 0x5627; /* differs from RT2860 */ 1602 } 1603 DPRINTF(("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n", 1604 sc->leds, sc->led[0], sc->led[1], sc->led[2])); 1605 1606 /* read RF information */ 1607 if (sc->mac_ver == 0x5390 || sc->mac_ver == 0x5392) 1608 run_srom_read(sc, 0x00, &val); 1609 else 1610 run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val); 1611 if (val == 0xffff) { 1612 DPRINTF(("invalid EEPROM antenna info, using default\n")); 1613 if (sc->mac_ver == 0x3572) { 1614 /* default to RF3052 2T2R */ 1615 sc->rf_rev = RT3070_RF_3052; 1616 sc->ntxchains = 2; 1617 sc->nrxchains = 2; 1618 } else if (sc->mac_ver >= 0x3070) { 1619 /* default to RF3020 1T1R */ 1620 sc->rf_rev = RT3070_RF_3020; 1621 sc->ntxchains = 1; 1622 sc->nrxchains = 1; 1623 } else { 1624 /* default to RF2820 1T2R */ 1625 sc->rf_rev = RT2860_RF_2820; 1626 sc->ntxchains = 1; 1627 sc->nrxchains = 2; 1628 } 1629 } else { 1630 if (sc->mac_ver == 0x5390 || sc->mac_ver == 0x5392) { 1631 sc->rf_rev = val; 1632 run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val); 1633 } else 1634 sc->rf_rev = (val >> 8) & 0xf; 1635 sc->ntxchains = (val >> 4) & 0xf; 1636 sc->nrxchains = val & 0xf; 1637 } 1638 DPRINTF(("EEPROM RF rev=0x%04x chains=%dT%dR\n", 1639 sc->rf_rev, sc->ntxchains, sc->nrxchains)); 1640 1641 run_srom_read(sc, RT2860_EEPROM_CONFIG, &val); 1642 DPRINTF(("EEPROM CFG 0x%04x\n", val)); 1643 /* check if driver should patch the DAC issue */ 1644 if ((val >> 8) != 0xff) 1645 sc->patch_dac = (val >> 15) & 1; 1646 if ((val & 0xff) != 0xff) { 1647 sc->ext_5ghz_lna = (val >> 3) & 1; 1648 sc->ext_2ghz_lna = (val >> 2) & 1; 1649 /* check if RF supports automatic Tx access gain control */ 1650 sc->calib_2ghz = sc->calib_5ghz = (val >> 1) & 1; 1651 /* check if we have a hardware radio switch */ 1652 sc->rfswitch = val & 1; 1653 } 1654 1655 /* Read Tx power settings. */ 1656 if (sc->mac_ver == 0x3593) 1657 run_rt3593_get_txpower(sc); 1658 else 1659 run_get_txpower(sc); 1660 1661 /* read Tx power compensation for each Tx rate */ 1662 run_srom_read(sc, RT2860_EEPROM_DELTAPWR, &val); 1663 delta_2ghz = delta_5ghz = 0; 1664 if ((val & 0xff) != 0xff && (val & 0x80)) { 1665 delta_2ghz = val & 0xf; 1666 if (!(val & 0x40)) /* negative number */ 1667 delta_2ghz = -delta_2ghz; 1668 } 1669 val >>= 8; 1670 if ((val & 0xff) != 0xff && (val & 0x80)) { 1671 delta_5ghz = val & 0xf; 1672 if (!(val & 0x40)) /* negative number */ 1673 delta_5ghz = -delta_5ghz; 1674 } 1675 DPRINTF(("power compensation=%d (2GHz), %d (5GHz)\n", 1676 delta_2ghz, delta_5ghz)); 1677 1678 for (ridx = 0; ridx < 5; ridx++) { 1679 uint32_t reg; 1680 1681 run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2, &val); 1682 reg = val; 1683 run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2 + 1, &val); 1684 reg |= (uint32_t)val << 16; 1685 1686 sc->txpow20mhz[ridx] = reg; 1687 sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz); 1688 sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz); 1689 1690 DPRINTF(("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, " 1691 "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx], 1692 sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx])); 1693 } 1694 1695 DPRINTF(("mac_ver %hx\n", sc->mac_ver)); 1696 /* read RSSI offsets and LNA gains from EEPROM */ 1697 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_2GHZ : 1698 RT3593_EEPROM_RSSI1_2GHZ, &val); 1699 sc->rssi_2ghz[0] = val & 0xff; /* Ant A */ 1700 sc->rssi_2ghz[1] = val >> 8; /* Ant B */ 1701 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_2GHZ : 1702 RT3593_EEPROM_RSSI2_2GHZ, &val); 1703 if (sc->mac_ver >= 0x3070) { 1704 if (sc->mac_ver == 0x3593) { 1705 sc->txmixgain_2ghz = 0; 1706 sc->rssi_2ghz[2] = val & 0xff; /* Ant C */ 1707 } else { 1708 /* 1709 * On RT3070 chips (limited to 2 Rx chains), this ROM 1710 * field contains the Tx mixer gain for the 2GHz band. 1711 */ 1712 if ((val & 0xff) != 0xff) 1713 sc->txmixgain_2ghz = val & 0x7; 1714 } 1715 DPRINTF(("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz)); 1716 } else { 1717 sc->rssi_2ghz[2] = val & 0xff; /* Ant C */ 1718 } 1719 if (sc->mac_ver == 0x3593) 1720 run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val); 1721 sc->lna[2] = val >> 8; /* channel group 2 */ 1722 1723 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_5GHZ : 1724 RT3593_EEPROM_RSSI1_5GHZ, &val); 1725 sc->rssi_5ghz[0] = val & 0xff; /* Ant A */ 1726 sc->rssi_5ghz[1] = val >> 8; /* Ant B */ 1727 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_5GHZ : 1728 RT3593_EEPROM_RSSI2_5GHZ, &val); 1729 if (sc->mac_ver == 0x3572) { 1730 /* 1731 * On RT3572 chips (limited to 2 Rx chains), this ROM 1732 * field contains the Tx mixer gain for the 5GHz band. 1733 */ 1734 if ((val & 0xff) != 0xff) 1735 sc->txmixgain_5ghz = val & 0x7; 1736 DPRINTF(("tx mixer gain=%u (5GHz)\n", sc->txmixgain_5ghz)); 1737 } else { 1738 sc->rssi_5ghz[2] = val & 0xff; /* Ant C */ 1739 } 1740 if (sc->mac_ver == 0x3593) { 1741 sc->txmixgain_5ghz = 0; 1742 run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val); 1743 } 1744 sc->lna[3] = val >> 8; /* channel group 3 */ 1745 1746 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LNA : 1747 RT3593_EEPROM_LNA, &val); 1748 sc->lna[0] = val & 0xff; /* channel group 0 */ 1749 sc->lna[1] = val >> 8; /* channel group 1 */ 1750 1751 /* fix broken 5GHz LNA entries */ 1752 if (sc->lna[2] == 0 || sc->lna[2] == 0xff) { 1753 DPRINTF(("invalid LNA for channel group %d\n", 2)); 1754 sc->lna[2] = sc->lna[1]; 1755 } 1756 if (sc->lna[3] == 0 || sc->lna[3] == 0xff) { 1757 DPRINTF(("invalid LNA for channel group %d\n", 3)); 1758 sc->lna[3] = sc->lna[1]; 1759 } 1760 1761 /* fix broken RSSI offset entries */ 1762 for (ant = 0; ant < 3; ant++) { 1763 if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) { 1764 DPRINTF(("invalid RSSI%d offset: %d (2GHz)\n", 1765 ant + 1, sc->rssi_2ghz[ant])); 1766 sc->rssi_2ghz[ant] = 0; 1767 } 1768 if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) { 1769 DPRINTF(("invalid RSSI%d offset: %d (5GHz)\n", 1770 ant + 1, sc->rssi_5ghz[ant])); 1771 sc->rssi_5ghz[ant] = 0; 1772 } 1773 } 1774 return 0; 1775 } 1776 1777 static struct ieee80211_node * 1778 run_node_alloc(struct ieee80211_node_table *nt) 1779 { 1780 struct run_node *rn = 1781 malloc(sizeof(struct run_node), M_DEVBUF, M_NOWAIT | M_ZERO); 1782 return rn ? &rn->ni : NULL; 1783 } 1784 1785 static int 1786 run_media_change(struct ifnet *ifp) 1787 { 1788 struct run_softc *sc = ifp->if_softc; 1789 struct ieee80211com *ic = &sc->sc_ic; 1790 uint8_t rate, ridx; 1791 int error; 1792 1793 error = ieee80211_media_change(ifp); 1794 if (error != ENETRESET) 1795 return error; 1796 1797 if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) { 1798 rate = ic->ic_sup_rates[ic->ic_curmode]. 1799 rs_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL; 1800 for (ridx = 0; ridx <= RT2860_RIDX_MAX; ridx++) 1801 if (rt2860_rates[ridx].rate == rate) 1802 break; 1803 sc->fixed_ridx = ridx; 1804 } 1805 1806 if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING)) 1807 run_init(ifp); 1808 1809 return 0; 1810 } 1811 1812 static void 1813 run_next_scan(void *arg) 1814 { 1815 struct run_softc *sc = arg; 1816 1817 if (sc->sc_ic.ic_state == IEEE80211_S_SCAN) 1818 ieee80211_next_scan(&sc->sc_ic); 1819 } 1820 1821 static void 1822 run_task(void *arg) 1823 { 1824 struct run_softc *sc = arg; 1825 struct run_host_cmd_ring *ring = &sc->cmdq; 1826 struct run_host_cmd *cmd; 1827 int s; 1828 1829 /* process host commands */ 1830 s = splusb(); 1831 while (ring->next != ring->cur) { 1832 cmd = &ring->cmd[ring->next]; 1833 splx(s); 1834 membar_consumer(); 1835 /* callback */ 1836 cmd->cb(sc, cmd->data); 1837 s = splusb(); 1838 atomic_dec_uint(&ring->queued); 1839 ring->next = (ring->next + 1) % RUN_HOST_CMD_RING_COUNT; 1840 } 1841 wakeup(ring); 1842 splx(s); 1843 } 1844 1845 static void 1846 run_do_async(struct run_softc *sc, void (*cb)(struct run_softc *, void *), 1847 void *arg, int len) 1848 { 1849 struct run_host_cmd_ring *ring = &sc->cmdq; 1850 struct run_host_cmd *cmd; 1851 int s; 1852 1853 if (sc->sc_flags & RUN_DETACHING) 1854 return; 1855 1856 s = splusb(); 1857 cmd = &ring->cmd[ring->cur]; 1858 cmd->cb = cb; 1859 KASSERT(len <= sizeof(cmd->data)); 1860 memcpy(cmd->data, arg, len); 1861 membar_producer(); 1862 ring->cur = (ring->cur + 1) % RUN_HOST_CMD_RING_COUNT; 1863 1864 /* if there is no pending command already, schedule a task */ 1865 if (atomic_inc_uint_nv(&ring->queued) == 1) 1866 usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER); 1867 splx(s); 1868 } 1869 1870 static int 1871 run_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg) 1872 { 1873 struct run_softc *sc = ic->ic_ifp->if_softc; 1874 struct run_cmd_newstate cmd; 1875 1876 callout_stop(&sc->scan_to); 1877 callout_stop(&sc->calib_to); 1878 1879 /* do it in a process context */ 1880 cmd.state = nstate; 1881 cmd.arg = arg; 1882 run_do_async(sc, run_newstate_cb, &cmd, sizeof(cmd)); 1883 return 0; 1884 } 1885 1886 static void 1887 run_newstate_cb(struct run_softc *sc, void *arg) 1888 { 1889 struct run_cmd_newstate *cmd = arg; 1890 struct ifnet *ifp = &sc->sc_if; 1891 struct ieee80211com *ic = &sc->sc_ic; 1892 enum ieee80211_state ostate; 1893 struct ieee80211_node *ni; 1894 uint32_t tmp, sta[3]; 1895 uint8_t wcid; 1896 int s; 1897 1898 s = splnet(); 1899 ostate = ic->ic_state; 1900 1901 if (ostate == IEEE80211_S_RUN) { 1902 /* turn link LED off */ 1903 run_set_leds(sc, RT2860_LED_RADIO); 1904 } 1905 1906 switch (cmd->state) { 1907 case IEEE80211_S_INIT: 1908 if (ostate == IEEE80211_S_RUN) { 1909 /* abort TSF synchronization */ 1910 run_read(sc, RT2860_BCN_TIME_CFG, &tmp); 1911 run_write(sc, RT2860_BCN_TIME_CFG, 1912 tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN | 1913 RT2860_TBTT_TIMER_EN)); 1914 } 1915 break; 1916 1917 case IEEE80211_S_SCAN: 1918 run_set_chan(sc, ic->ic_curchan); 1919 callout_schedule(&sc->scan_to, hz / 5); 1920 break; 1921 1922 case IEEE80211_S_AUTH: 1923 case IEEE80211_S_ASSOC: 1924 run_set_chan(sc, ic->ic_curchan); 1925 break; 1926 1927 case IEEE80211_S_RUN: 1928 run_set_chan(sc, ic->ic_curchan); 1929 1930 ni = ic->ic_bss; 1931 1932 if (ic->ic_opmode != IEEE80211_M_MONITOR) { 1933 run_updateslot(ifp); 1934 run_enable_mrr(sc); 1935 run_set_txpreamble(sc); 1936 run_set_basicrates(sc); 1937 run_set_bssid(sc, ni->ni_bssid); 1938 } 1939 #ifndef IEEE80211_STA_ONLY 1940 if (ic->ic_opmode == IEEE80211_M_HOSTAP || 1941 ic->ic_opmode == IEEE80211_M_IBSS) 1942 (void)run_setup_beacon(sc); 1943 #endif 1944 if (ic->ic_opmode == IEEE80211_M_STA) { 1945 /* add BSS entry to the WCID table */ 1946 wcid = RUN_AID2WCID(ni->ni_associd); 1947 run_write_region_1(sc, RT2860_WCID_ENTRY(wcid), 1948 ni->ni_macaddr, IEEE80211_ADDR_LEN); 1949 1950 /* fake a join to init the tx rate */ 1951 run_newassoc(ni, 1); 1952 } 1953 if (ic->ic_opmode != IEEE80211_M_MONITOR) { 1954 run_enable_tsf_sync(sc); 1955 1956 /* clear statistic registers used by AMRR */ 1957 run_read_region_1(sc, RT2860_TX_STA_CNT0, 1958 (uint8_t *)sta, sizeof(sta)); 1959 /* start calibration timer */ 1960 callout_schedule(&sc->calib_to, hz); 1961 } 1962 1963 /* turn link LED on */ 1964 run_set_leds(sc, RT2860_LED_RADIO | 1965 (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ? 1966 RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ)); 1967 break; 1968 } 1969 (void)sc->sc_newstate(ic, cmd->state, cmd->arg); 1970 splx(s); 1971 } 1972 1973 static int 1974 run_updateedca(struct ieee80211com *ic) 1975 { 1976 1977 /* do it in a process context */ 1978 run_do_async(ic->ic_ifp->if_softc, run_updateedca_cb, NULL, 0); 1979 return 0; 1980 } 1981 1982 /* ARGSUSED */ 1983 static void 1984 run_updateedca_cb(struct run_softc *sc, void *arg) 1985 { 1986 struct ieee80211com *ic = &sc->sc_ic; 1987 int s, aci; 1988 1989 s = splnet(); 1990 /* update MAC TX configuration registers */ 1991 for (aci = 0; aci < WME_NUM_AC; aci++) { 1992 run_write(sc, RT2860_EDCA_AC_CFG(aci), 1993 ic->ic_wme.wme_params[aci].wmep_logcwmax << 16 | 1994 ic->ic_wme.wme_params[aci].wmep_logcwmin << 12 | 1995 ic->ic_wme.wme_params[aci].wmep_aifsn << 8 | 1996 ic->ic_wme.wme_params[aci].wmep_txopLimit); 1997 } 1998 1999 /* update SCH/DMA registers too */ 2000 run_write(sc, RT2860_WMM_AIFSN_CFG, 2001 ic->ic_wme.wme_params[WME_AC_VO].wmep_aifsn << 12 | 2002 ic->ic_wme.wme_params[WME_AC_VI].wmep_aifsn << 8 | 2003 ic->ic_wme.wme_params[WME_AC_BK].wmep_aifsn << 4 | 2004 ic->ic_wme.wme_params[WME_AC_BE].wmep_aifsn); 2005 run_write(sc, RT2860_WMM_CWMIN_CFG, 2006 ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmin << 12 | 2007 ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmin << 8 | 2008 ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmin << 4 | 2009 ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmin); 2010 run_write(sc, RT2860_WMM_CWMAX_CFG, 2011 ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmax << 12 | 2012 ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmax << 8 | 2013 ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmax << 4 | 2014 ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmax); 2015 run_write(sc, RT2860_WMM_TXOP0_CFG, 2016 ic->ic_wme.wme_params[WME_AC_BK].wmep_txopLimit << 16 | 2017 ic->ic_wme.wme_params[WME_AC_BE].wmep_txopLimit); 2018 run_write(sc, RT2860_WMM_TXOP1_CFG, 2019 ic->ic_wme.wme_params[WME_AC_VO].wmep_txopLimit << 16 | 2020 ic->ic_wme.wme_params[WME_AC_VI].wmep_txopLimit); 2021 splx(s); 2022 } 2023 2024 #ifdef RUN_HWCRYPTO 2025 static int 2026 run_set_key(struct ieee80211com *ic, const struct ieee80211_key *k, 2027 const uint8_t *mac) 2028 { 2029 struct run_softc *sc = ic->ic_ifp->if_softc; 2030 struct ieee80211_node *ni = ic->ic_bss; 2031 struct run_cmd_key cmd; 2032 2033 /* do it in a process context */ 2034 cmd.key = *k; 2035 cmd.associd = (ni != NULL) ? ni->ni_associd : 0; 2036 run_do_async(sc, run_set_key_cb, &cmd, sizeof(cmd)); 2037 return 1; 2038 } 2039 2040 static void 2041 run_set_key_cb(struct run_softc *sc, void *arg) 2042 { 2043 #ifndef IEEE80211_STA_ONLY 2044 struct ieee80211com *ic = &sc->sc_ic; 2045 #endif 2046 struct run_cmd_key *cmd = arg; 2047 struct ieee80211_key *k = &cmd->key; 2048 uint32_t attr; 2049 uint16_t base; 2050 uint8_t mode, wcid, iv[8]; 2051 2052 /* map net80211 cipher to RT2860 security mode */ 2053 switch (k->wk_cipher->ic_cipher) { 2054 case IEEE80211_CIPHER_WEP: 2055 k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */ 2056 if (k->wk_keylen == 5) 2057 mode = RT2860_MODE_WEP40; 2058 else 2059 mode = RT2860_MODE_WEP104; 2060 break; 2061 case IEEE80211_CIPHER_TKIP: 2062 mode = RT2860_MODE_TKIP; 2063 break; 2064 case IEEE80211_CIPHER_AES_CCM: 2065 mode = RT2860_MODE_AES_CCMP; 2066 break; 2067 default: 2068 return; 2069 } 2070 2071 if (k->wk_flags & IEEE80211_KEY_GROUP) { 2072 wcid = 0; /* NB: update WCID0 for group keys */ 2073 base = RT2860_SKEY(0, k->wk_keyix); 2074 } else { 2075 wcid = RUN_AID2WCID(cmd->associd); 2076 base = RT2860_PKEY(wcid); 2077 } 2078 2079 if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) { 2080 run_write_region_1(sc, base, k->wk_key, 16); 2081 #ifndef IEEE80211_STA_ONLY 2082 if (ic->ic_opmode == IEEE80211_M_HOSTAP) { 2083 run_write_region_1(sc, base + 16, &k->wk_key[16], 8); 2084 run_write_region_1(sc, base + 24, &k->wk_key[24], 8); 2085 } else 2086 #endif 2087 { 2088 run_write_region_1(sc, base + 16, &k->wk_key[24], 8); 2089 run_write_region_1(sc, base + 24, &k->wk_key[16], 8); 2090 } 2091 } else { 2092 /* roundup len to 16-bit: XXX fix write_region_1() instead */ 2093 run_write_region_1(sc, base, k->wk_key, 2094 (k->wk_keylen + 1) & ~1); 2095 } 2096 2097 if (!(k->wk_flags & IEEE80211_KEY_GROUP) || 2098 (k->wk_flags & IEEE80211_KEY_XMIT)) { 2099 /* set initial packet number in IV+EIV */ 2100 if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP) { 2101 memset(iv, 0, sizeof(iv)); 2102 iv[3] = sc->sc_ic.ic_crypto.cs_def_txkey << 6; 2103 } else { 2104 if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) { 2105 iv[0] = k->wk_keytsc >> 8; 2106 iv[1] = (iv[0] | 0x20) & 0x7f; 2107 iv[2] = k->wk_keytsc; 2108 } else /* CCMP */ { 2109 iv[0] = k->wk_keytsc; 2110 iv[1] = k->wk_keytsc >> 8; 2111 iv[2] = 0; 2112 } 2113 iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV; 2114 iv[4] = k->wk_keytsc >> 16; 2115 iv[5] = k->wk_keytsc >> 24; 2116 iv[6] = k->wk_keytsc >> 32; 2117 iv[7] = k->wk_keytsc >> 40; 2118 } 2119 run_write_region_1(sc, RT2860_IVEIV(wcid), iv, 8); 2120 } 2121 2122 if (k->wk_flags & IEEE80211_KEY_GROUP) { 2123 /* install group key */ 2124 run_read(sc, RT2860_SKEY_MODE_0_7, &attr); 2125 attr &= ~(0xf << (k->wk_keyix * 4)); 2126 attr |= mode << (k->wk_keyix * 4); 2127 run_write(sc, RT2860_SKEY_MODE_0_7, attr); 2128 } else { 2129 /* install pairwise key */ 2130 run_read(sc, RT2860_WCID_ATTR(wcid), &attr); 2131 attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN; 2132 run_write(sc, RT2860_WCID_ATTR(wcid), attr); 2133 } 2134 } 2135 2136 static int 2137 run_delete_key(struct ieee80211com *ic, const struct ieee80211_key *k) 2138 { 2139 struct run_softc *sc = ic->ic_ifp->if_softc; 2140 struct ieee80211_node *ni = ic->ic_bss; 2141 struct run_cmd_key cmd; 2142 2143 /* do it in a process context */ 2144 cmd.key = *k; 2145 cmd.associd = (ni != NULL) ? ni->ni_associd : 0; 2146 run_do_async(sc, run_delete_key_cb, &cmd, sizeof(cmd)); 2147 return 1; 2148 } 2149 2150 static void 2151 run_delete_key_cb(struct run_softc *sc, void *arg) 2152 { 2153 struct run_cmd_key *cmd = arg; 2154 struct ieee80211_key *k = &cmd->key; 2155 uint32_t attr; 2156 uint8_t wcid; 2157 2158 if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP) 2159 k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */ 2160 2161 if (k->wk_flags & IEEE80211_KEY_GROUP) { 2162 /* remove group key */ 2163 run_read(sc, RT2860_SKEY_MODE_0_7, &attr); 2164 attr &= ~(0xf << (k->wk_keyix * 4)); 2165 run_write(sc, RT2860_SKEY_MODE_0_7, attr); 2166 2167 } else { 2168 /* remove pairwise key */ 2169 wcid = RUN_AID2WCID(cmd->associd); 2170 run_read(sc, RT2860_WCID_ATTR(wcid), &attr); 2171 attr &= ~0xf; 2172 run_write(sc, RT2860_WCID_ATTR(wcid), attr); 2173 } 2174 } 2175 #endif 2176 2177 static void 2178 run_calibrate_to(void *arg) 2179 { 2180 2181 /* do it in a process context */ 2182 run_do_async(arg, run_calibrate_cb, NULL, 0); 2183 /* next timeout will be rescheduled in the calibration task */ 2184 } 2185 2186 /* ARGSUSED */ 2187 static void 2188 run_calibrate_cb(struct run_softc *sc, void *arg) 2189 { 2190 struct ifnet *ifp = &sc->sc_if; 2191 uint32_t sta[3]; 2192 int s, error; 2193 2194 /* read statistic counters (clear on read) and update AMRR state */ 2195 error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta, 2196 sizeof(sta)); 2197 if (error != 0) 2198 goto skip; 2199 2200 DPRINTF(("retrycnt=%d txcnt=%d failcnt=%d\n", 2201 le32toh(sta[1]) >> 16, le32toh(sta[1]) & 0xffff, 2202 le32toh(sta[0]) & 0xffff)); 2203 2204 s = splnet(); 2205 /* count failed TX as errors */ 2206 if_statadd(ifp, if_oerrors, le32toh(sta[0]) & 0xffff); 2207 2208 sc->amn.amn_retrycnt = 2209 (le32toh(sta[0]) & 0xffff) + /* failed TX count */ 2210 (le32toh(sta[1]) >> 16); /* TX retransmission count */ 2211 2212 sc->amn.amn_txcnt = 2213 sc->amn.amn_retrycnt + 2214 (le32toh(sta[1]) & 0xffff); /* successful TX count */ 2215 2216 ieee80211_amrr_choose(&sc->amrr, sc->sc_ic.ic_bss, &sc->amn); 2217 splx(s); 2218 2219 skip: callout_schedule(&sc->calib_to, hz); 2220 } 2221 2222 static void 2223 run_newassoc(struct ieee80211_node *ni, int isnew) 2224 { 2225 struct run_softc *sc = ni->ni_ic->ic_ifp->if_softc; 2226 struct run_node *rn = (void *)ni; 2227 struct ieee80211_rateset *rs = &ni->ni_rates; 2228 uint8_t rate; 2229 int ridx, i, j; 2230 2231 DPRINTF(("new assoc isnew=%d addr=%s\n", 2232 isnew, ether_sprintf(ni->ni_macaddr))); 2233 2234 ieee80211_amrr_node_init(&sc->amrr, &sc->amn); 2235 /* start at lowest available bit-rate, AMRR will raise */ 2236 ni->ni_txrate = 0; 2237 2238 for (i = 0; i < rs->rs_nrates; i++) { 2239 rate = rs->rs_rates[i] & IEEE80211_RATE_VAL; 2240 /* convert 802.11 rate to hardware rate index */ 2241 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++) 2242 if (rt2860_rates[ridx].rate == rate) 2243 break; 2244 rn->ridx[i] = ridx; 2245 /* determine rate of control response frames */ 2246 for (j = i; j >= 0; j--) { 2247 if ((rs->rs_rates[j] & IEEE80211_RATE_BASIC) && 2248 rt2860_rates[rn->ridx[i]].phy == 2249 rt2860_rates[rn->ridx[j]].phy) 2250 break; 2251 } 2252 if (j >= 0) { 2253 rn->ctl_ridx[i] = rn->ridx[j]; 2254 } else { 2255 /* no basic rate found, use mandatory one */ 2256 rn->ctl_ridx[i] = rt2860_rates[ridx].ctl_ridx; 2257 } 2258 DPRINTF(("rate=0x%02x ridx=%d ctl_ridx=%d\n", 2259 rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i])); 2260 } 2261 } 2262 2263 /* 2264 * Return the Rx chain with the highest RSSI for a given frame. 2265 */ 2266 static __inline uint8_t 2267 run_maxrssi_chain(struct run_softc *sc, const struct rt2860_rxwi *rxwi) 2268 { 2269 uint8_t rxchain = 0; 2270 2271 if (sc->nrxchains > 1) { 2272 if (rxwi->rssi[1] > rxwi->rssi[rxchain]) 2273 rxchain = 1; 2274 if (sc->nrxchains > 2) 2275 if (rxwi->rssi[2] > rxwi->rssi[rxchain]) 2276 rxchain = 2; 2277 } 2278 return rxchain; 2279 } 2280 2281 static void 2282 run_rx_frame(struct run_softc *sc, uint8_t *buf, int dmalen) 2283 { 2284 struct ieee80211com *ic = &sc->sc_ic; 2285 struct ifnet *ifp = &sc->sc_if; 2286 struct ieee80211_frame *wh; 2287 struct ieee80211_node *ni; 2288 struct rt2870_rxd *rxd; 2289 struct rt2860_rxwi *rxwi; 2290 struct mbuf *m; 2291 uint32_t flags; 2292 uint16_t len, rxwisize, phy; 2293 uint8_t ant, rssi; 2294 int s; 2295 #ifdef RUN_HWCRYPTO 2296 int decrypted = 0; 2297 #endif 2298 2299 rxwi = (struct rt2860_rxwi *)buf; 2300 rxwisize = sizeof(struct rt2860_rxwi); 2301 if (sc->mac_ver == 0x5592) 2302 rxwisize += sizeof(uint64_t); 2303 else if (sc->mac_ver == 0x3593) 2304 rxwisize += sizeof(uint32_t); 2305 len = le16toh(rxwi->len) & 0xfff; 2306 if (__predict_false(len > dmalen)) { 2307 DPRINTF(("bad RXWI length %u > %u\n", len, dmalen)); 2308 return; 2309 } 2310 /* Rx descriptor is located at the end */ 2311 rxd = (struct rt2870_rxd *)(buf + dmalen); 2312 flags = le32toh(rxd->flags); 2313 2314 if (__predict_false(flags & (RT2860_RX_CRCERR | RT2860_RX_ICVERR))) { 2315 if_statinc(ifp, if_ierrors); 2316 return; 2317 } 2318 2319 wh = (struct ieee80211_frame *)(buf + rxwisize); 2320 2321 if (__predict_false((flags & RT2860_RX_MICERR))) { 2322 /* report MIC failures to net80211 for TKIP */ 2323 ieee80211_notify_michael_failure(ic, wh, 0/* XXX */); 2324 if_statinc(ifp, if_ierrors); 2325 return; 2326 } 2327 2328 if (flags & RT2860_RX_L2PAD) { 2329 u_int hdrlen = ieee80211_hdrspace(ic, wh); 2330 memmove((uint8_t *)wh + 2, wh, hdrlen); 2331 wh = (struct ieee80211_frame *)((uint8_t *)wh + 2); 2332 } 2333 2334 #ifdef RUN_HWCRYPTO 2335 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { 2336 wh->i_fc[1] &= ~IEEE80211_FC1_WEP; 2337 decrypted = 1; 2338 } 2339 #endif 2340 2341 /* could use m_devget but net80211 wants contig mgmt frames */ 2342 MGETHDR(m, M_DONTWAIT, MT_DATA); 2343 if (__predict_false(m == NULL)) { 2344 if_statinc(ifp, if_ierrors); 2345 return; 2346 } 2347 if (len > MHLEN) { 2348 if (__predict_true(len <= MCLBYTES)) 2349 MCLGET(m, M_DONTWAIT); 2350 if (__predict_false(!(m->m_flags & M_EXT))) { 2351 if_statinc(ifp, if_ierrors); 2352 m_freem(m); 2353 return; 2354 } 2355 } 2356 /* finalize mbuf */ 2357 m_set_rcvif(m, ifp); 2358 memcpy(mtod(m, void *), wh, len); 2359 m->m_pkthdr.len = m->m_len = len; 2360 2361 ant = run_maxrssi_chain(sc, rxwi); 2362 rssi = rxwi->rssi[ant]; 2363 2364 if (__predict_false(sc->sc_drvbpf != NULL)) { 2365 struct run_rx_radiotap_header *tap = &sc->sc_rxtap; 2366 2367 tap->wr_flags = 0; 2368 tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq); 2369 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); 2370 tap->wr_antsignal = rssi; 2371 tap->wr_antenna = ant; 2372 tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant); 2373 tap->wr_rate = 2; /* in case it can't be found below */ 2374 phy = le16toh(rxwi->phy); 2375 switch (phy & RT2860_PHY_MODE) { 2376 case RT2860_PHY_CCK: 2377 switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) { 2378 case 0: tap->wr_rate = 2; break; 2379 case 1: tap->wr_rate = 4; break; 2380 case 2: tap->wr_rate = 11; break; 2381 case 3: tap->wr_rate = 22; break; 2382 } 2383 if (phy & RT2860_PHY_SHPRE) 2384 tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; 2385 break; 2386 case RT2860_PHY_OFDM: 2387 switch (phy & RT2860_PHY_MCS) { 2388 case 0: tap->wr_rate = 12; break; 2389 case 1: tap->wr_rate = 18; break; 2390 case 2: tap->wr_rate = 24; break; 2391 case 3: tap->wr_rate = 36; break; 2392 case 4: tap->wr_rate = 48; break; 2393 case 5: tap->wr_rate = 72; break; 2394 case 6: tap->wr_rate = 96; break; 2395 case 7: tap->wr_rate = 108; break; 2396 } 2397 break; 2398 } 2399 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m, BPF_D_IN); 2400 } 2401 2402 s = splnet(); 2403 ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); 2404 #ifdef RUN_HWCRYPTO 2405 if (decrypted) { 2406 uint32_t icflags = ic->ic_flags; 2407 2408 ic->ic_flags &= ~IEEE80211_F_DROPUNENC; /* XXX */ 2409 ieee80211_input(ic, m, ni, rssi, 0); 2410 ic->ic_flags = icflags; 2411 } else 2412 #endif 2413 ieee80211_input(ic, m, ni, rssi, 0); 2414 2415 /* node is no longer needed */ 2416 ieee80211_free_node(ni); 2417 2418 /* 2419 * In HostAP mode, ieee80211_input() will enqueue packets in if_snd 2420 * without calling if_start(). 2421 */ 2422 if (!IFQ_IS_EMPTY(&ifp->if_snd) && !(ifp->if_flags & IFF_OACTIVE)) 2423 run_start(ifp); 2424 2425 splx(s); 2426 } 2427 2428 static void 2429 run_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status) 2430 { 2431 struct run_rx_data *data = priv; 2432 struct run_softc *sc = data->sc; 2433 uint8_t *buf; 2434 uint32_t dmalen; 2435 int xferlen; 2436 uint16_t rxwisize; 2437 2438 if (__predict_false(sc->sc_flags & RUN_DETACHING)) 2439 return; 2440 2441 rxwisize = sizeof(struct rt2860_rxwi); 2442 if (sc->mac_ver == 0x5592) 2443 rxwisize += sizeof(uint64_t); 2444 else if (sc->mac_ver == 0x3593) 2445 rxwisize += sizeof(uint32_t); 2446 2447 if (__predict_false(status != USBD_NORMAL_COMPLETION)) { 2448 DPRINTF(("RX status=%s\n", usbd_errstr(status))); 2449 if (status == USBD_STALLED) 2450 usbd_clear_endpoint_stall_async(sc->rxq.pipeh); 2451 if (status != USBD_CANCELLED) 2452 goto skip; 2453 return; 2454 } 2455 usbd_get_xfer_status(xfer, NULL, NULL, &xferlen, NULL); 2456 2457 if (__predict_false(xferlen < (int)(sizeof(uint32_t) + 2458 rxwisize + sizeof(struct rt2870_rxd)))) { 2459 DPRINTF(("xfer too short %d\n", xferlen)); 2460 goto skip; 2461 } 2462 2463 /* HW can aggregate multiple 802.11 frames in a single USB xfer */ 2464 buf = data->buf; 2465 while (xferlen > 8) { 2466 dmalen = le32toh(*(uint32_t *)buf) & 0xffff; 2467 2468 if (__predict_false((dmalen >= (uint32_t)-8) || dmalen == 0 || 2469 (dmalen & 3) != 0)) { 2470 DPRINTF(("bad DMA length %u (%x)\n", dmalen, dmalen)); 2471 break; 2472 } 2473 if (__predict_false(dmalen + 8 > (uint32_t)xferlen)) { 2474 DPRINTF(("bad DMA length %u > %d\n", 2475 dmalen + 8, xferlen)); 2476 break; 2477 } 2478 run_rx_frame(sc, buf + sizeof(uint32_t), dmalen); 2479 buf += dmalen + 8; 2480 xferlen -= dmalen + 8; 2481 } 2482 2483 skip: /* setup a new transfer */ 2484 usbd_setup_xfer(xfer, data, data->buf, RUN_MAX_RXSZ, 2485 USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof); 2486 status = usbd_transfer(xfer); 2487 if (status != USBD_NORMAL_COMPLETION && 2488 status != USBD_IN_PROGRESS) 2489 device_printf(sc->sc_dev, "requeuing rx failed: %s\n", 2490 usbd_errstr(status)); 2491 } 2492 2493 static void 2494 run_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status) 2495 { 2496 struct run_tx_data *data = priv; 2497 struct run_softc *sc = data->sc; 2498 struct run_tx_ring *txq = &sc->txq[data->qid]; 2499 struct ifnet *ifp = &sc->sc_if; 2500 int s; 2501 2502 s = splnet(); 2503 txq->queued--; 2504 sc->qfullmsk &= ~(1 << data->qid); 2505 2506 if (__predict_false(status != USBD_NORMAL_COMPLETION)) { 2507 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) 2508 return; 2509 2510 DPRINTF(("%s: usb error on tx: %s\n", 2511 device_xname(sc->sc_dev), usbd_errstr(status))); 2512 if (status == USBD_STALLED) 2513 usbd_clear_endpoint_stall_async(txq->pipeh); 2514 if_statinc(ifp, if_oerrors); 2515 splx(s); 2516 return; 2517 } 2518 2519 sc->sc_tx_timer = 0; 2520 if_statinc(ifp, if_opackets); 2521 ifp->if_flags &= ~IFF_OACTIVE; 2522 run_start(ifp); 2523 splx(s); 2524 } 2525 2526 static int 2527 run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni) 2528 { 2529 struct ieee80211com *ic = &sc->sc_ic; 2530 struct run_node *rn = (void *)ni; 2531 struct ieee80211_frame *wh; 2532 #ifndef RUN_HWCRYPTO 2533 struct ieee80211_key *k; 2534 #endif 2535 struct run_tx_ring *ring; 2536 struct run_tx_data *data; 2537 struct rt2870_txd *txd; 2538 struct rt2860_txwi *txwi; 2539 uint16_t qos, dur, mcs; 2540 uint16_t txwisize; 2541 uint8_t type, tid, qid; 2542 int hasqos, ridx, ctl_ridx, xferlen; 2543 uint8_t pad; 2544 usbd_status status; 2545 2546 wh = mtod(m, struct ieee80211_frame *); 2547 2548 #ifndef RUN_HWCRYPTO 2549 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { 2550 k = ieee80211_crypto_encap(ic, ni, m); 2551 if (k == NULL) { 2552 m_freem(m); 2553 return ENOBUFS; 2554 } 2555 2556 /* packet header may have moved, reset our local pointer */ 2557 wh = mtod(m, struct ieee80211_frame *); 2558 } 2559 #endif 2560 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; 2561 2562 if ((hasqos = ieee80211_has_qos(wh))) { 2563 qos = ((struct ieee80211_qosframe *)wh)->i_qos[0]; 2564 tid = qos & IEEE80211_QOS_TID; 2565 qid = TID_TO_WME_AC(tid); 2566 } else { 2567 qos = 0; 2568 tid = 0; 2569 qid = WME_AC_BE; 2570 } 2571 ring = &sc->txq[qid]; 2572 data = &ring->data[ring->cur]; 2573 2574 /* pickup a rate index */ 2575 if (IEEE80211_IS_MULTICAST(wh->i_addr1) || 2576 type != IEEE80211_FC0_TYPE_DATA) { 2577 ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ? 2578 RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1; 2579 ctl_ridx = rt2860_rates[ridx].ctl_ridx; 2580 } else if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) { 2581 ridx = sc->fixed_ridx; 2582 ctl_ridx = rt2860_rates[ridx].ctl_ridx; 2583 } else { 2584 ridx = rn->ridx[ni->ni_txrate]; 2585 ctl_ridx = rn->ctl_ridx[ni->ni_txrate]; 2586 } 2587 2588 /* get MCS code from rate index */ 2589 mcs = rt2860_rates[ridx].mcs; 2590 2591 txwisize = sizeof(struct rt2860_txwi); 2592 if (sc->mac_ver == 0x5592) 2593 txwisize += sizeof(uint32_t); 2594 xferlen = txwisize + m->m_pkthdr.len; 2595 2596 /* roundup to 32-bit alignment */ 2597 xferlen = (xferlen + 3) & ~3; 2598 2599 txd = (struct rt2870_txd *)data->buf; 2600 txd->flags = RT2860_TX_QSEL_EDCA; 2601 txd->len = htole16(xferlen); 2602 2603 /* 2604 * Ether both are true or both are false, the header 2605 * are nicely aligned to 32-bit. So, no L2 padding. 2606 */ 2607 if (IEEE80211_HAS_ADDR4(wh) == IEEE80211_QOS_HAS_SEQ(wh)) 2608 pad = 0; 2609 else 2610 pad = 2; 2611 2612 /* setup TX Wireless Information */ 2613 txwi = (struct rt2860_txwi *)(txd + 1); 2614 txwi->flags = 0; 2615 txwi->xflags = hasqos ? 0 : RT2860_TX_NSEQ; 2616 txwi->wcid = (type == IEEE80211_FC0_TYPE_DATA) ? 2617 RUN_AID2WCID(ni->ni_associd) : 0xff; 2618 txwi->len = htole16(m->m_pkthdr.len - pad); 2619 if (rt2860_rates[ridx].phy == IEEE80211_T_DS) { 2620 txwi->phy = htole16(RT2860_PHY_CCK); 2621 if (ridx != RT2860_RIDX_CCK1 && 2622 (ic->ic_flags & IEEE80211_F_SHPREAMBLE)) 2623 mcs |= RT2860_PHY_SHPRE; 2624 } else 2625 mcs |= RT2860_PHY_OFDM; 2626 txwi->phy = htole16(mcs); 2627 2628 txwi->txop = RT2860_TX_TXOP_BACKOFF; 2629 2630 if (!IEEE80211_IS_MULTICAST(wh->i_addr1) && 2631 (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) != 2632 IEEE80211_QOS_ACKPOLICY_NOACK)) { 2633 txwi->xflags |= RT2860_TX_ACK; 2634 if (ic->ic_flags & IEEE80211_F_SHPREAMBLE) 2635 dur = rt2860_rates[ctl_ridx].sp_ack_dur; 2636 else 2637 dur = rt2860_rates[ctl_ridx].lp_ack_dur; 2638 *(uint16_t *)wh->i_dur = htole16(dur); 2639 } 2640 2641 #ifndef IEEE80211_STA_ONLY 2642 /* ask MAC to insert timestamp into probe responses */ 2643 if ((wh->i_fc[0] & 2644 (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == 2645 (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP)) 2646 /* NOTE: beacons do not pass through tx_data() */ 2647 txwi->flags |= RT2860_TX_TS; 2648 #endif 2649 2650 if (__predict_false(sc->sc_drvbpf != NULL)) { 2651 struct run_tx_radiotap_header *tap = &sc->sc_txtap; 2652 2653 tap->wt_flags = 0; 2654 tap->wt_rate = rt2860_rates[ridx].rate; 2655 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); 2656 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); 2657 tap->wt_hwqueue = qid; 2658 if (mcs & RT2860_PHY_SHPRE) 2659 tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; 2660 2661 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m, BPF_D_OUT); 2662 } 2663 2664 m_copydata(m, 0, m->m_pkthdr.len, ((uint8_t *)txwi) + txwisize); 2665 m_freem(m); 2666 2667 xferlen += sizeof(*txd) + 4; 2668 2669 usbd_setup_xfer(data->xfer, data, data->buf, xferlen, 2670 USBD_FORCE_SHORT_XFER, RUN_TX_TIMEOUT, run_txeof); 2671 status = usbd_transfer(data->xfer); 2672 if (__predict_false(status != USBD_IN_PROGRESS && 2673 status != USBD_NORMAL_COMPLETION)) { 2674 device_printf(sc->sc_dev, "queuing tx failed: %s\n", 2675 usbd_errstr(status)); 2676 return EIO; 2677 } 2678 2679 ieee80211_free_node(ni); 2680 2681 ring->cur = (ring->cur + 1) % RUN_TX_RING_COUNT; 2682 if (++ring->queued >= RUN_TX_RING_COUNT) 2683 sc->qfullmsk |= 1 << qid; 2684 2685 return 0; 2686 } 2687 2688 static void 2689 run_start(struct ifnet *ifp) 2690 { 2691 struct run_softc *sc = ifp->if_softc; 2692 struct ieee80211com *ic = &sc->sc_ic; 2693 struct ether_header *eh; 2694 struct ieee80211_node *ni; 2695 struct mbuf *m; 2696 2697 if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING) 2698 return; 2699 2700 for (;;) { 2701 if (sc->qfullmsk != 0) { 2702 ifp->if_flags |= IFF_OACTIVE; 2703 break; 2704 } 2705 /* send pending management frames first */ 2706 IF_DEQUEUE(&ic->ic_mgtq, m); 2707 if (m != NULL) { 2708 ni = M_GETCTX(m, struct ieee80211_node *); 2709 M_CLEARCTX(m); 2710 goto sendit; 2711 } 2712 if (ic->ic_state != IEEE80211_S_RUN) 2713 break; 2714 2715 /* encapsulate and send data frames */ 2716 IFQ_DEQUEUE(&ifp->if_snd, m); 2717 if (m == NULL) 2718 break; 2719 if (m->m_len < (int)sizeof(*eh) && 2720 (m = m_pullup(m, sizeof(*eh))) == NULL) { 2721 if_statinc(ifp, if_oerrors); 2722 continue; 2723 } 2724 2725 eh = mtod(m, struct ether_header *); 2726 ni = ieee80211_find_txnode(ic, eh->ether_dhost); 2727 if (ni == NULL) { 2728 m_freem(m); 2729 if_statinc(ifp, if_oerrors); 2730 continue; 2731 } 2732 2733 bpf_mtap(ifp, m, BPF_D_OUT); 2734 2735 if ((m = ieee80211_encap(ic, m, ni)) == NULL) { 2736 ieee80211_free_node(ni); 2737 if_statinc(ifp, if_oerrors); 2738 continue; 2739 } 2740 sendit: 2741 bpf_mtap3(ic->ic_rawbpf, m, BPF_D_OUT); 2742 2743 if (run_tx(sc, m, ni) != 0) { 2744 ieee80211_free_node(ni); 2745 if_statinc(ifp, if_oerrors); 2746 continue; 2747 } 2748 2749 sc->sc_tx_timer = 5; 2750 ifp->if_timer = 1; 2751 } 2752 } 2753 2754 static void 2755 run_watchdog(struct ifnet *ifp) 2756 { 2757 struct run_softc *sc = ifp->if_softc; 2758 struct ieee80211com *ic = &sc->sc_ic; 2759 2760 ifp->if_timer = 0; 2761 2762 if (sc->sc_tx_timer > 0) { 2763 if (--sc->sc_tx_timer == 0) { 2764 device_printf(sc->sc_dev, "device timeout\n"); 2765 /* run_init(ifp); XXX needs a process context! */ 2766 if_statinc(ifp, if_oerrors); 2767 return; 2768 } 2769 ifp->if_timer = 1; 2770 } 2771 2772 ieee80211_watchdog(ic); 2773 } 2774 2775 static int 2776 run_ioctl(struct ifnet *ifp, u_long cmd, void *data) 2777 { 2778 struct run_softc *sc = ifp->if_softc; 2779 struct ieee80211com *ic = &sc->sc_ic; 2780 int s, error = 0; 2781 2782 s = splnet(); 2783 2784 switch (cmd) { 2785 case SIOCSIFFLAGS: 2786 if ((error = ifioctl_common(ifp, cmd, data)) != 0) 2787 break; 2788 switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) { 2789 case IFF_UP|IFF_RUNNING: 2790 break; 2791 case IFF_UP: 2792 run_init(ifp); 2793 break; 2794 case IFF_RUNNING: 2795 run_stop(ifp, 1); 2796 break; 2797 case 0: 2798 break; 2799 } 2800 break; 2801 2802 case SIOCADDMULTI: 2803 case SIOCDELMULTI: 2804 if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) { 2805 /* setup multicast filter, etc */ 2806 error = 0; 2807 } 2808 break; 2809 2810 default: 2811 error = ieee80211_ioctl(ic, cmd, data); 2812 break; 2813 } 2814 2815 if (error == ENETRESET) { 2816 if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == 2817 (IFF_UP | IFF_RUNNING)) { 2818 run_init(ifp); 2819 } 2820 error = 0; 2821 } 2822 2823 splx(s); 2824 2825 return error; 2826 } 2827 2828 static void 2829 run_select_chan_group(struct run_softc *sc, int group) 2830 { 2831 uint32_t tmp; 2832 uint8_t agc; 2833 2834 run_bbp_write(sc, 62, 0x37 - sc->lna[group]); 2835 run_bbp_write(sc, 63, 0x37 - sc->lna[group]); 2836 run_bbp_write(sc, 64, 0x37 - sc->lna[group]); 2837 if (sc->mac_ver < 0x3572) 2838 run_bbp_write(sc, 86, 0x00); 2839 2840 if (sc->mac_ver == 0x3593) { 2841 run_bbp_write(sc, 77, 0x98); 2842 run_bbp_write(sc, 83, (group == 0) ? 0x8a : 0x9a); 2843 } 2844 2845 if (group == 0) { 2846 if (sc->ext_2ghz_lna) { 2847 if (sc->mac_ver >= 0x5390) 2848 run_bbp_write(sc, 75, 0x52); 2849 else { 2850 run_bbp_write(sc, 82, 0x62); 2851 run_bbp_write(sc, 75, 0x46); 2852 } 2853 } else { 2854 if (sc->mac_ver == 0x5592) { 2855 run_bbp_write(sc, 79, 0x1c); 2856 run_bbp_write(sc, 80, 0x0e); 2857 run_bbp_write(sc, 81, 0x3a); 2858 run_bbp_write(sc, 82, 0x62); 2859 2860 run_bbp_write(sc, 195, 0x80); 2861 run_bbp_write(sc, 196, 0xe0); 2862 run_bbp_write(sc, 195, 0x81); 2863 run_bbp_write(sc, 196, 0x1f); 2864 run_bbp_write(sc, 195, 0x82); 2865 run_bbp_write(sc, 196, 0x38); 2866 run_bbp_write(sc, 195, 0x83); 2867 run_bbp_write(sc, 196, 0x32); 2868 run_bbp_write(sc, 195, 0x85); 2869 run_bbp_write(sc, 196, 0x28); 2870 run_bbp_write(sc, 195, 0x86); 2871 run_bbp_write(sc, 196, 0x19); 2872 } else if (sc->mac_ver >= 0x5390) { 2873 run_bbp_write(sc, 75, 0x50); 2874 } else { 2875 run_bbp_write(sc, 82, 2876 (sc->mac_ver == 0x3593) ? 0x62 : 0x84); 2877 run_bbp_write(sc, 75, 0x50); 2878 } 2879 } 2880 } else { 2881 if (sc->mac_ver == 0x5592) { 2882 run_bbp_write(sc, 79, 0x18); 2883 run_bbp_write(sc, 80, 0x08); 2884 run_bbp_write(sc, 81, 0x38); 2885 run_bbp_write(sc, 82, 0x92); 2886 2887 run_bbp_write(sc, 195, 0x80); 2888 run_bbp_write(sc, 196, 0xf0); 2889 run_bbp_write(sc, 195, 0x81); 2890 run_bbp_write(sc, 196, 0x1e); 2891 run_bbp_write(sc, 195, 0x82); 2892 run_bbp_write(sc, 196, 0x28); 2893 run_bbp_write(sc, 195, 0x83); 2894 run_bbp_write(sc, 196, 0x20); 2895 run_bbp_write(sc, 195, 0x85); 2896 run_bbp_write(sc, 196, 0x7f); 2897 run_bbp_write(sc, 195, 0x86); 2898 run_bbp_write(sc, 196, 0x7f); 2899 } else if (sc->mac_ver == 0x3572) 2900 run_bbp_write(sc, 82, 0x94); 2901 else 2902 run_bbp_write(sc, 82, 2903 (sc->mac_ver == 0x3593) ? 0x82 : 0xf2); 2904 if (sc->ext_5ghz_lna) 2905 run_bbp_write(sc, 75, 0x46); 2906 else 2907 run_bbp_write(sc, 75, 0x50); 2908 } 2909 2910 run_read(sc, RT2860_TX_BAND_CFG, &tmp); 2911 tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P); 2912 tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P; 2913 run_write(sc, RT2860_TX_BAND_CFG, tmp); 2914 2915 /* enable appropriate Power Amplifiers and Low Noise Amplifiers */ 2916 tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN; 2917 if (sc->mac_ver == 0x3593) 2918 tmp |= RT3593_LNA_PE_G2_EN | RT3593_LNA_PE_A2_EN; 2919 if (sc->nrxchains > 1) 2920 tmp |= RT2860_LNA_PE1_EN; 2921 if (group == 0) { /* 2GHz */ 2922 tmp |= RT2860_PA_PE_G0_EN; 2923 if (sc->ntxchains > 1) 2924 tmp |= RT2860_PA_PE_G1_EN; 2925 } else { /* 5GHz */ 2926 tmp |= RT2860_PA_PE_A0_EN; 2927 if (sc->ntxchains > 1) 2928 tmp |= RT2860_PA_PE_A1_EN; 2929 if (sc->mac_ver == 0x3593) { 2930 if (sc->ntxchains > 2) 2931 tmp |= RT3593_PA_PE_G2_EN; 2932 } 2933 } 2934 if (sc->mac_ver == 0x3572) { 2935 run_rt3070_rf_write(sc, 8, 0x00); 2936 run_write(sc, RT2860_TX_PIN_CFG, tmp); 2937 run_rt3070_rf_write(sc, 8, 0x80); 2938 } else 2939 run_write(sc, RT2860_TX_PIN_CFG, tmp); 2940 2941 if (sc->mac_ver == 0x5592) { 2942 run_bbp_write(sc, 195, 0x8d); 2943 run_bbp_write(sc, 196, 0x1a); 2944 } 2945 2946 if (sc->mac_ver == 0x3593) { 2947 run_read(sc, RT2860_GPIO_CTRL, &tmp); 2948 tmp &= ~0x01010000; 2949 if (group == 0) 2950 tmp |= 0x00010000; 2951 tmp = (tmp & ~0x00009090) | 0x00000090; 2952 run_write(sc, RT2860_GPIO_CTRL, tmp); 2953 } 2954 2955 /* set initial AGC value */ 2956 if (group == 0) { /* 2GHz band */ 2957 if (sc->mac_ver >= 0x3070) 2958 agc = 0x1c + sc->lna[0] * 2; 2959 else 2960 agc = 0x2e + sc->lna[0]; 2961 } else { /* 5GHz band */ 2962 if (sc->mac_ver == 0x3572) 2963 agc = 0x22 + (sc->lna[group] * 5) / 3; 2964 else 2965 agc = 0x32 + (sc->lna[group] * 5) / 3; 2966 } 2967 run_set_agc(sc, agc); 2968 } 2969 2970 static void 2971 run_rt2870_set_chan(struct run_softc *sc, u_int chan) 2972 { 2973 const struct rfprog *rfprog = rt2860_rf2850; 2974 uint32_t r2, r3, r4; 2975 int8_t txpow1, txpow2; 2976 int i; 2977 2978 /* find the settings for this channel (we know it exists) */ 2979 for (i = 0; rfprog[i].chan != chan; i++); 2980 2981 r2 = rfprog[i].r2; 2982 if (sc->ntxchains == 1) 2983 r2 |= 1 << 12; /* 1T: disable Tx chain 2 */ 2984 if (sc->nrxchains == 1) 2985 r2 |= 1 << 15 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */ 2986 else if (sc->nrxchains == 2) 2987 r2 |= 1 << 4; /* 2R: disable Rx chain 3 */ 2988 2989 /* use Tx power values from EEPROM */ 2990 txpow1 = sc->txpow1[i]; 2991 txpow2 = sc->txpow2[i]; 2992 if (chan > 14) { 2993 if (txpow1 >= 0) 2994 txpow1 = txpow1 << 1 | 1; 2995 else 2996 txpow1 = (7 + txpow1) << 1; 2997 if (txpow2 >= 0) 2998 txpow2 = txpow2 << 1 | 1; 2999 else 3000 txpow2 = (7 + txpow2) << 1; 3001 } 3002 r3 = rfprog[i].r3 | txpow1 << 7; 3003 r4 = rfprog[i].r4 | sc->freq << 13 | txpow2 << 4; 3004 3005 run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); 3006 run_rt2870_rf_write(sc, RT2860_RF2, r2); 3007 run_rt2870_rf_write(sc, RT2860_RF3, r3); 3008 run_rt2870_rf_write(sc, RT2860_RF4, r4); 3009 3010 usbd_delay_ms(sc->sc_udev, 10); 3011 3012 run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); 3013 run_rt2870_rf_write(sc, RT2860_RF2, r2); 3014 run_rt2870_rf_write(sc, RT2860_RF3, r3 | 1); 3015 run_rt2870_rf_write(sc, RT2860_RF4, r4); 3016 3017 usbd_delay_ms(sc->sc_udev, 10); 3018 3019 run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1); 3020 run_rt2870_rf_write(sc, RT2860_RF2, r2); 3021 run_rt2870_rf_write(sc, RT2860_RF3, r3); 3022 run_rt2870_rf_write(sc, RT2860_RF4, r4); 3023 } 3024 3025 static void 3026 run_rt3070_set_chan(struct run_softc *sc, u_int chan) 3027 { 3028 int8_t txpow1, txpow2; 3029 uint8_t rf; 3030 int i; 3031 3032 KASSERT(chan >= 1 && chan <= 14); /* RT3070 is 2GHz only */ 3033 3034 /* find the settings for this channel (we know it exists) */ 3035 for (i = 0; rt2860_rf2850[i].chan != chan; i++) 3036 continue; 3037 3038 /* use Tx power values from EEPROM */ 3039 txpow1 = sc->txpow1[i]; 3040 txpow2 = sc->txpow2[i]; 3041 3042 run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n); 3043 run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k); 3044 run_rt3070_rf_read(sc, 6, &rf); 3045 rf = (rf & ~0x03) | rt3070_freqs[i].r; 3046 run_rt3070_rf_write(sc, 6, rf); 3047 3048 /* set Tx0 power */ 3049 run_rt3070_rf_read(sc, 12, &rf); 3050 rf = (rf & ~0x1f) | txpow1; 3051 run_rt3070_rf_write(sc, 12, rf); 3052 3053 /* set Tx1 power */ 3054 run_rt3070_rf_read(sc, 13, &rf); 3055 rf = (rf & ~0x1f) | txpow2; 3056 run_rt3070_rf_write(sc, 13, rf); 3057 3058 run_rt3070_rf_read(sc, 1, &rf); 3059 rf &= ~0xfc; 3060 if (sc->ntxchains == 1) 3061 rf |= 1 << 7 | 1 << 5; /* 1T: disable Tx chains 2 & 3 */ 3062 else if (sc->ntxchains == 2) 3063 rf |= 1 << 7; /* 2T: disable Tx chain 3 */ 3064 if (sc->nrxchains == 1) 3065 rf |= 1 << 6 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */ 3066 else if (sc->nrxchains == 2) 3067 rf |= 1 << 6; /* 2R: disable Rx chain 3 */ 3068 run_rt3070_rf_write(sc, 1, rf); 3069 3070 /* set RF offset */ 3071 run_rt3070_rf_read(sc, 23, &rf); 3072 rf = (rf & ~0x7f) | sc->freq; 3073 run_rt3070_rf_write(sc, 23, rf); 3074 3075 /* program RF filter */ 3076 run_rt3070_rf_read(sc, 24, &rf); /* Tx */ 3077 rf = (rf & ~0x3f) | sc->rf24_20mhz; 3078 run_rt3070_rf_write(sc, 24, rf); 3079 run_rt3070_rf_read(sc, 31, &rf); /* Rx */ 3080 rf = (rf & ~0x3f) | sc->rf24_20mhz; 3081 run_rt3070_rf_write(sc, 31, rf); 3082 3083 /* enable RF tuning */ 3084 run_rt3070_rf_read(sc, 7, &rf); 3085 run_rt3070_rf_write(sc, 7, rf | 0x01); 3086 } 3087 3088 static void 3089 run_rt3572_set_chan(struct run_softc *sc, u_int chan) 3090 { 3091 int8_t txpow1, txpow2; 3092 uint32_t tmp; 3093 uint8_t rf; 3094 int i; 3095 3096 /* find the settings for this channel (we know it exists) */ 3097 for (i = 0; rt2860_rf2850[i].chan != chan; i++); 3098 3099 /* use Tx power values from EEPROM */ 3100 txpow1 = sc->txpow1[i]; 3101 txpow2 = sc->txpow2[i]; 3102 3103 if (chan <= 14) { 3104 run_bbp_write(sc, 25, sc->bbp25); 3105 run_bbp_write(sc, 26, sc->bbp26); 3106 } else { 3107 /* enable IQ phase correction */ 3108 run_bbp_write(sc, 25, 0x09); 3109 run_bbp_write(sc, 26, 0xff); 3110 } 3111 3112 run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n); 3113 run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k); 3114 run_rt3070_rf_read(sc, 6, &rf); 3115 rf = (rf & ~0x0f) | rt3070_freqs[i].r; 3116 rf |= (chan <= 14) ? 0x08 : 0x04; 3117 run_rt3070_rf_write(sc, 6, rf); 3118 3119 /* set PLL mode */ 3120 run_rt3070_rf_read(sc, 5, &rf); 3121 rf &= ~(0x08 | 0x04); 3122 rf |= (chan <= 14) ? 0x04 : 0x08; 3123 run_rt3070_rf_write(sc, 5, rf); 3124 3125 /* set Tx power for chain 0 */ 3126 if (chan <= 14) 3127 rf = 0x60 | txpow1; 3128 else 3129 rf = 0xe0 | (txpow1 & 0xc) << 1 | (txpow1 & 0x3); 3130 run_rt3070_rf_write(sc, 12, rf); 3131 3132 /* set Tx power for chain 1 */ 3133 if (chan <= 14) 3134 rf = 0x60 | txpow2; 3135 else 3136 rf = 0xe0 | (txpow2 & 0xc) << 1 | (txpow2 & 0x3); 3137 run_rt3070_rf_write(sc, 13, rf); 3138 3139 /* set Tx/Rx streams */ 3140 run_rt3070_rf_read(sc, 1, &rf); 3141 rf &= ~0xfc; 3142 if (sc->ntxchains == 1) 3143 rf |= 1 << 7 | 1 << 5; /* 1T: disable Tx chains 2 & 3 */ 3144 else if (sc->ntxchains == 2) 3145 rf |= 1 << 7; /* 2T: disable Tx chain 3 */ 3146 if (sc->nrxchains == 1) 3147 rf |= 1 << 6 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */ 3148 else if (sc->nrxchains == 2) 3149 rf |= 1 << 6; /* 2R: disable Rx chain 3 */ 3150 run_rt3070_rf_write(sc, 1, rf); 3151 3152 /* set RF offset */ 3153 run_rt3070_rf_read(sc, 23, &rf); 3154 rf = (rf & ~0x7f) | sc->freq; 3155 run_rt3070_rf_write(sc, 23, rf); 3156 3157 /* program RF filter */ 3158 rf = sc->rf24_20mhz; 3159 run_rt3070_rf_write(sc, 24, rf); /* Tx */ 3160 run_rt3070_rf_write(sc, 31, rf); /* Rx */ 3161 3162 /* enable RF tuning */ 3163 run_rt3070_rf_read(sc, 7, &rf); 3164 rf = (chan <= 14) ? 0xd8 : ((rf & ~0xc8) | 0x14); 3165 run_rt3070_rf_write(sc, 7, rf); 3166 3167 /* TSSI */ 3168 rf = (chan <= 14) ? 0xc3 : 0xc0; 3169 run_rt3070_rf_write(sc, 9, rf); 3170 3171 /* set loop filter 1 */ 3172 run_rt3070_rf_write(sc, 10, 0xf1); 3173 /* set loop filter 2 */ 3174 run_rt3070_rf_write(sc, 11, (chan <= 14) ? 0xb9 : 0x00); 3175 3176 /* set tx_mx2_ic */ 3177 run_rt3070_rf_write(sc, 15, (chan <= 14) ? 0x53 : 0x43); 3178 /* set tx_mx1_ic */ 3179 if (chan <= 14) 3180 rf = 0x48 | sc->txmixgain_2ghz; 3181 else 3182 rf = 0x78 | sc->txmixgain_5ghz; 3183 run_rt3070_rf_write(sc, 16, rf); 3184 3185 /* set tx_lo1 */ 3186 run_rt3070_rf_write(sc, 17, 0x23); 3187 /* set tx_lo2 */ 3188 if (chan <= 14) 3189 rf = 0x93; 3190 else if (chan <= 64) 3191 rf = 0xb7; 3192 else if (chan <= 128) 3193 rf = 0x74; 3194 else 3195 rf = 0x72; 3196 run_rt3070_rf_write(sc, 19, rf); 3197 3198 /* set rx_lo1 */ 3199 if (chan <= 14) 3200 rf = 0xb3; 3201 else if (chan <= 64) 3202 rf = 0xf6; 3203 else if (chan <= 128) 3204 rf = 0xf4; 3205 else 3206 rf = 0xf3; 3207 run_rt3070_rf_write(sc, 20, rf); 3208 3209 /* set pfd_delay */ 3210 if (chan <= 14) 3211 rf = 0x15; 3212 else if (chan <= 64) 3213 rf = 0x3d; 3214 else 3215 rf = 0x01; 3216 run_rt3070_rf_write(sc, 25, rf); 3217 3218 /* set rx_lo2 */ 3219 run_rt3070_rf_write(sc, 26, (chan <= 14) ? 0x85 : 0x87); 3220 /* set ldo_rf_vc */ 3221 run_rt3070_rf_write(sc, 27, (chan <= 14) ? 0x00 : 0x01); 3222 /* set drv_cc */ 3223 run_rt3070_rf_write(sc, 29, (chan <= 14) ? 0x9b : 0x9f); 3224 3225 run_read(sc, RT2860_GPIO_CTRL, &tmp); 3226 tmp &= ~0x8080; 3227 if (chan <= 14) 3228 tmp |= 0x80; 3229 run_write(sc, RT2860_GPIO_CTRL, tmp); 3230 3231 /* enable RF tuning */ 3232 run_rt3070_rf_read(sc, 7, &rf); 3233 run_rt3070_rf_write(sc, 7, rf | 0x01); 3234 3235 usbd_delay_ms(sc->sc_udev, 2); 3236 } 3237 3238 static void 3239 run_rt3593_set_chan(struct run_softc *sc, u_int chan) 3240 { 3241 int8_t txpow1, txpow2, txpow3; 3242 uint8_t h20mhz, rf; 3243 int i; 3244 3245 /* find the settings for this channel (we know it exists) */ 3246 for (i = 0; rt2860_rf2850[i].chan != chan; i++); 3247 3248 /* use Tx power values from EEPROM */ 3249 txpow1 = sc->txpow1[i]; 3250 txpow2 = sc->txpow2[i]; 3251 txpow3 = (sc->ntxchains == 3) ? sc->txpow3[i] : 0; 3252 3253 if (chan <= 14) { 3254 run_bbp_write(sc, 25, sc->bbp25); 3255 run_bbp_write(sc, 26, sc->bbp26); 3256 } else { 3257 /* Enable IQ phase correction. */ 3258 run_bbp_write(sc, 25, 0x09); 3259 run_bbp_write(sc, 26, 0xff); 3260 } 3261 3262 run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n); 3263 run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f); 3264 run_rt3070_rf_read(sc, 11, &rf); 3265 rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03); 3266 run_rt3070_rf_write(sc, 11, rf); 3267 3268 /* Set pll_idoh. */ 3269 run_rt3070_rf_read(sc, 11, &rf); 3270 rf &= ~0x4c; 3271 rf |= (chan <= 14) ? 0x44 : 0x48; 3272 run_rt3070_rf_write(sc, 11, rf); 3273 3274 if (chan <= 14) 3275 rf = txpow1 & 0x1f; 3276 else 3277 rf = 0x40 | ((txpow1 & 0x18) << 1) | (txpow1 & 0x07); 3278 run_rt3070_rf_write(sc, 53, rf); 3279 3280 if (chan <= 14) 3281 rf = txpow2 & 0x1f; 3282 else 3283 rf = 0x40 | ((txpow2 & 0x18) << 1) | (txpow2 & 0x07); 3284 run_rt3070_rf_write(sc, 55, rf); 3285 3286 if (chan <= 14) 3287 rf = txpow3 & 0x1f; 3288 else 3289 rf = 0x40 | ((txpow3 & 0x18) << 1) | (txpow3 & 0x07); 3290 run_rt3070_rf_write(sc, 54, rf); 3291 3292 rf = RT3070_RF_BLOCK | RT3070_PLL_PD; 3293 if (sc->ntxchains == 3) 3294 rf |= RT3070_TX0_PD | RT3070_TX1_PD | RT3070_TX2_PD; 3295 else 3296 rf |= RT3070_TX0_PD | RT3070_TX1_PD; 3297 rf |= RT3070_RX0_PD | RT3070_RX1_PD | RT3070_RX2_PD; 3298 run_rt3070_rf_write(sc, 1, rf); 3299 3300 run_adjust_freq_offset(sc); 3301 3302 run_rt3070_rf_write(sc, 31, (chan <= 14) ? 0xa0 : 0x80); 3303 3304 h20mhz = (sc->rf24_20mhz & 0x20) >> 5; 3305 run_rt3070_rf_read(sc, 30, &rf); 3306 rf = (rf & ~0x06) | (h20mhz << 1) | (h20mhz << 2); 3307 run_rt3070_rf_write(sc, 30, rf); 3308 3309 run_rt3070_rf_read(sc, 36, &rf); 3310 if (chan <= 14) 3311 rf |= 0x80; 3312 else 3313 rf &= ~0x80; 3314 run_rt3070_rf_write(sc, 36, rf); 3315 3316 /* Set vcolo_bs. */ 3317 run_rt3070_rf_write(sc, 34, (chan <= 14) ? 0x3c : 0x20); 3318 /* Set pfd_delay. */ 3319 run_rt3070_rf_write(sc, 12, (chan <= 14) ? 0x1a : 0x12); 3320 3321 /* Set vco bias current control. */ 3322 run_rt3070_rf_read(sc, 6, &rf); 3323 rf &= ~0xc0; 3324 if (chan <= 14) 3325 rf |= 0x40; 3326 else if (chan <= 128) 3327 rf |= 0x80; 3328 else 3329 rf |= 0x40; 3330 run_rt3070_rf_write(sc, 6, rf); 3331 3332 run_rt3070_rf_read(sc, 30, &rf); 3333 rf = (rf & ~0x18) | 0x10; 3334 run_rt3070_rf_write(sc, 30, rf); 3335 3336 run_rt3070_rf_write(sc, 10, (chan <= 14) ? 0xd3 : 0xd8); 3337 run_rt3070_rf_write(sc, 13, (chan <= 14) ? 0x12 : 0x23); 3338 3339 run_rt3070_rf_read(sc, 51, &rf); 3340 rf = (rf & ~0x03) | 0x01; 3341 run_rt3070_rf_write(sc, 51, rf); 3342 /* Set tx_mx1_cc. */ 3343 run_rt3070_rf_read(sc, 51, &rf); 3344 rf &= ~0x1c; 3345 rf |= (chan <= 14) ? 0x14 : 0x10; 3346 run_rt3070_rf_write(sc, 51, rf); 3347 /* Set tx_mx1_ic. */ 3348 run_rt3070_rf_read(sc, 51, &rf); 3349 rf &= ~0xe0; 3350 rf |= (chan <= 14) ? 0x60 : 0x40; 3351 run_rt3070_rf_write(sc, 51, rf); 3352 /* Set tx_lo1_ic. */ 3353 run_rt3070_rf_read(sc, 49, &rf); 3354 rf &= ~0x1c; 3355 rf |= (chan <= 14) ? 0x0c : 0x08; 3356 run_rt3070_rf_write(sc, 49, rf); 3357 /* Set tx_lo1_en. */ 3358 run_rt3070_rf_read(sc, 50, &rf); 3359 run_rt3070_rf_write(sc, 50, rf & ~0x20); 3360 /* Set drv_cc. */ 3361 run_rt3070_rf_read(sc, 57, &rf); 3362 rf &= ~0xfc; 3363 rf |= (chan <= 14) ? 0x6c : 0x3c; 3364 run_rt3070_rf_write(sc, 57, rf); 3365 /* Set rx_mix1_ic, rxa_lnactr, lna_vc, lna_inbias_en and lna_en. */ 3366 run_rt3070_rf_write(sc, 44, (chan <= 14) ? 0x93 : 0x9b); 3367 /* Set drv_gnd_a, tx_vga_cc_a and tx_mx2_gain. */ 3368 run_rt3070_rf_write(sc, 52, (chan <= 14) ? 0x45 : 0x05); 3369 /* Enable VCO calibration. */ 3370 run_rt3070_rf_read(sc, 3, &rf); 3371 rf &= ~RT5390_VCOCAL; 3372 rf |= (chan <= 14) ? RT5390_VCOCAL : 0xbe; 3373 run_rt3070_rf_write(sc, 3, rf); 3374 3375 if (chan <= 14) 3376 rf = 0x23; 3377 else if (chan <= 64) 3378 rf = 0x36; 3379 else if (chan <= 128) 3380 rf = 0x32; 3381 else 3382 rf = 0x30; 3383 run_rt3070_rf_write(sc, 39, rf); 3384 if (chan <= 14) 3385 rf = 0xbb; 3386 else if (chan <= 64) 3387 rf = 0xeb; 3388 else if (chan <= 128) 3389 rf = 0xb3; 3390 else 3391 rf = 0x9b; 3392 run_rt3070_rf_write(sc, 45, rf); 3393 3394 /* Set FEQ/AEQ control. */ 3395 run_bbp_write(sc, 105, 0x34); 3396 } 3397 3398 static void 3399 run_rt5390_set_chan(struct run_softc *sc, u_int chan) 3400 { 3401 int8_t txpow1, txpow2; 3402 uint8_t rf; 3403 int i; 3404 3405 /* find the settings for this channel (we know it exists) */ 3406 for (i = 0; rt2860_rf2850[i].chan != chan; i++); 3407 3408 /* use Tx power values from EEPROM */ 3409 txpow1 = sc->txpow1[i]; 3410 txpow2 = sc->txpow2[i]; 3411 3412 run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n); 3413 run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f); 3414 run_rt3070_rf_read(sc, 11, &rf); 3415 rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03); 3416 run_rt3070_rf_write(sc, 11, rf); 3417 3418 run_rt3070_rf_read(sc, 49, &rf); 3419 rf = (rf & ~0x3f) | (txpow1 & 0x3f); 3420 /* The valid range of the RF R49 is 0x00 to 0x27. */ 3421 if ((rf & 0x3f) > 0x27) 3422 rf = (rf & ~0x3f) | 0x27; 3423 run_rt3070_rf_write(sc, 49, rf); 3424 3425 if (sc->mac_ver == 0x5392) { 3426 run_rt3070_rf_read(sc, 50, &rf); 3427 rf = (rf & ~0x3f) | (txpow2 & 0x3f); 3428 /* The valid range of the RF R50 is 0x00 to 0x27. */ 3429 if ((rf & 0x3f) > 0x27) 3430 rf = (rf & ~0x3f) | 0x27; 3431 run_rt3070_rf_write(sc, 50, rf); 3432 } 3433 3434 run_rt3070_rf_read(sc, 1, &rf); 3435 rf |= RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD; 3436 if (sc->mac_ver == 0x5392) 3437 rf |= RT3070_RX1_PD | RT3070_TX1_PD; 3438 run_rt3070_rf_write(sc, 1, rf); 3439 3440 if (sc->mac_ver != 0x5392) { 3441 run_rt3070_rf_read(sc, 2, &rf); 3442 rf |= 0x80; 3443 run_rt3070_rf_write(sc, 2, rf); 3444 usbd_delay_ms(sc->sc_udev, 10); 3445 rf &= 0x7f; 3446 run_rt3070_rf_write(sc, 2, rf); 3447 } 3448 3449 run_adjust_freq_offset(sc); 3450 3451 if (sc->mac_ver == 0x5392) { 3452 /* Fix for RT5392C. */ 3453 if (sc->mac_rev >= 0x0223) { 3454 if (chan <= 4) 3455 rf = 0x0f; 3456 else if (chan >= 5 && chan <= 7) 3457 rf = 0x0e; 3458 else 3459 rf = 0x0d; 3460 run_rt3070_rf_write(sc, 23, rf); 3461 3462 if (chan <= 4) 3463 rf = 0x0c; 3464 else if (chan == 5) 3465 rf = 0x0b; 3466 else if (chan >= 6 && chan <= 7) 3467 rf = 0x0a; 3468 else if (chan >= 8 && chan <= 10) 3469 rf = 0x09; 3470 else 3471 rf = 0x08; 3472 run_rt3070_rf_write(sc, 59, rf); 3473 } else { 3474 if (chan <= 11) 3475 rf = 0x0f; 3476 else 3477 rf = 0x0b; 3478 run_rt3070_rf_write(sc, 59, rf); 3479 } 3480 } else { 3481 /* Fix for RT5390F. */ 3482 if (sc->mac_rev >= 0x0502) { 3483 if (chan <= 11) 3484 rf = 0x43; 3485 else 3486 rf = 0x23; 3487 run_rt3070_rf_write(sc, 55, rf); 3488 3489 if (chan <= 11) 3490 rf = 0x0f; 3491 else if (chan == 12) 3492 rf = 0x0d; 3493 else 3494 rf = 0x0b; 3495 run_rt3070_rf_write(sc, 59, rf); 3496 } else { 3497 run_rt3070_rf_write(sc, 55, 0x44); 3498 run_rt3070_rf_write(sc, 59, 0x8f); 3499 } 3500 } 3501 3502 /* Enable VCO calibration. */ 3503 run_rt3070_rf_read(sc, 3, &rf); 3504 rf |= RT5390_VCOCAL; 3505 run_rt3070_rf_write(sc, 3, rf); 3506 } 3507 3508 static void 3509 run_rt5592_set_chan(struct run_softc *sc, u_int chan) 3510 { 3511 const struct rt5592_freqs *freqs; 3512 uint32_t tmp; 3513 uint8_t reg, rf, txpow_bound; 3514 int8_t txpow1, txpow2; 3515 int i; 3516 3517 run_read(sc, RT5592_DEBUG_INDEX, &tmp); 3518 freqs = (tmp & RT5592_SEL_XTAL) ? 3519 rt5592_freqs_40mhz : rt5592_freqs_20mhz; 3520 3521 /* find the settings for this channel (we know it exists) */ 3522 for (i = 0; rt2860_rf2850[i].chan != chan; i++, freqs++); 3523 3524 /* use Tx power values from EEPROM */ 3525 txpow1 = sc->txpow1[i]; 3526 txpow2 = sc->txpow2[i]; 3527 3528 run_read(sc, RT3070_LDO_CFG0, &tmp); 3529 tmp &= ~0x1c000000; 3530 if (chan > 14) 3531 tmp |= 0x14000000; 3532 run_write(sc, RT3070_LDO_CFG0, tmp); 3533 3534 /* N setting. */ 3535 run_rt3070_rf_write(sc, 8, freqs->n & 0xff); 3536 run_rt3070_rf_read(sc, 9, &rf); 3537 rf &= ~(1 << 4); 3538 rf |= ((freqs->n & 0x0100) >> 8) << 4; 3539 run_rt3070_rf_write(sc, 9, rf); 3540 3541 /* K setting. */ 3542 run_rt3070_rf_read(sc, 9, &rf); 3543 rf &= ~0x0f; 3544 rf |= (freqs->k & 0x0f); 3545 run_rt3070_rf_write(sc, 9, rf); 3546 3547 /* Mode setting. */ 3548 run_rt3070_rf_read(sc, 11, &rf); 3549 rf &= ~0x0c; 3550 rf |= ((freqs->m - 0x8) & 0x3) << 2; 3551 run_rt3070_rf_write(sc, 11, rf); 3552 run_rt3070_rf_read(sc, 9, &rf); 3553 rf &= ~(1 << 7); 3554 rf |= (((freqs->m - 0x8) & 0x4) >> 2) << 7; 3555 run_rt3070_rf_write(sc, 9, rf); 3556 3557 /* R setting. */ 3558 run_rt3070_rf_read(sc, 11, &rf); 3559 rf &= ~0x03; 3560 rf |= (freqs->r - 0x1); 3561 run_rt3070_rf_write(sc, 11, rf); 3562 3563 if (chan <= 14) { 3564 /* Initialize RF registers for 2GHZ. */ 3565 for (i = 0; i < (int)__arraycount(rt5592_2ghz_def_rf); i++) { 3566 run_rt3070_rf_write(sc, rt5592_2ghz_def_rf[i].reg, 3567 rt5592_2ghz_def_rf[i].val); 3568 } 3569 3570 rf = (chan <= 10) ? 0x07 : 0x06; 3571 run_rt3070_rf_write(sc, 23, rf); 3572 run_rt3070_rf_write(sc, 59, rf); 3573 3574 run_rt3070_rf_write(sc, 55, 0x43); 3575 3576 /* 3577 * RF R49/R50 Tx power ALC code. 3578 * G-band bit<7:6>=1:0, bit<5:0> range from 0x0 ~ 0x27. 3579 */ 3580 reg = 2; 3581 txpow_bound = 0x27; 3582 } else { 3583 /* Initialize RF registers for 5GHZ. */ 3584 for (i = 0; i < (int)__arraycount(rt5592_5ghz_def_rf); i++) { 3585 run_rt3070_rf_write(sc, rt5592_5ghz_def_rf[i].reg, 3586 rt5592_5ghz_def_rf[i].val); 3587 } 3588 for (i = 0; i < (int)__arraycount(rt5592_chan_5ghz); i++) { 3589 if (chan >= rt5592_chan_5ghz[i].firstchan && 3590 chan <= rt5592_chan_5ghz[i].lastchan) { 3591 run_rt3070_rf_write(sc, rt5592_chan_5ghz[i].reg, 3592 rt5592_chan_5ghz[i].val); 3593 } 3594 } 3595 3596 /* 3597 * RF R49/R50 Tx power ALC code. 3598 * A-band bit<7:6>=1:1, bit<5:0> range from 0x0 ~ 0x2b. 3599 */ 3600 reg = 3; 3601 txpow_bound = 0x2b; 3602 } 3603 3604 /* RF R49 ch0 Tx power ALC code. */ 3605 run_rt3070_rf_read(sc, 49, &rf); 3606 rf &= ~0xc0; 3607 rf |= (reg << 6); 3608 rf = (rf & ~0x3f) | (txpow1 & 0x3f); 3609 if ((rf & 0x3f) > txpow_bound) 3610 rf = (rf & ~0x3f) | txpow_bound; 3611 run_rt3070_rf_write(sc, 49, rf); 3612 3613 /* RF R50 ch1 Tx power ALC code. */ 3614 run_rt3070_rf_read(sc, 50, &rf); 3615 rf &= ~(1 << 7 | 1 << 6); 3616 rf |= (reg << 6); 3617 rf = (rf & ~0x3f) | (txpow2 & 0x3f); 3618 if ((rf & 0x3f) > txpow_bound) 3619 rf = (rf & ~0x3f) | txpow_bound; 3620 run_rt3070_rf_write(sc, 50, rf); 3621 3622 /* Enable RF_BLOCK, PLL_PD, RX0_PD, and TX0_PD. */ 3623 run_rt3070_rf_read(sc, 1, &rf); 3624 rf |= (RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD); 3625 if (sc->ntxchains > 1) 3626 rf |= RT3070_TX1_PD; 3627 if (sc->nrxchains > 1) 3628 rf |= RT3070_RX1_PD; 3629 run_rt3070_rf_write(sc, 1, rf); 3630 3631 run_rt3070_rf_write(sc, 6, 0xe4); 3632 3633 run_rt3070_rf_write(sc, 30, 0x10); 3634 run_rt3070_rf_write(sc, 31, 0x80); 3635 run_rt3070_rf_write(sc, 32, 0x80); 3636 3637 run_adjust_freq_offset(sc); 3638 3639 /* Enable VCO calibration. */ 3640 run_rt3070_rf_read(sc, 3, &rf); 3641 rf |= RT5390_VCOCAL; 3642 run_rt3070_rf_write(sc, 3, rf); 3643 } 3644 3645 static void 3646 run_iq_calib(struct run_softc *sc, u_int chan) 3647 { 3648 uint16_t val; 3649 3650 /* Tx0 IQ gain. */ 3651 run_bbp_write(sc, 158, 0x2c); 3652 if (chan <= 14) 3653 run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX0_2GHZ, &val, 1); 3654 else if (chan <= 64) { 3655 run_efuse_read(sc, 3656 RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5GHZ, 3657 &val, 1); 3658 } else if (chan <= 138) { 3659 run_efuse_read(sc, 3660 RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5GHZ, 3661 &val, 1); 3662 } else if (chan <= 165) { 3663 run_efuse_read(sc, 3664 RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5GHZ, 3665 &val, 1); 3666 } else 3667 val = 0; 3668 run_bbp_write(sc, 159, val); 3669 3670 /* Tx0 IQ phase. */ 3671 run_bbp_write(sc, 158, 0x2d); 3672 if (chan <= 14) { 3673 run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX0_2GHZ, 3674 &val, 1); 3675 } else if (chan <= 64) { 3676 run_efuse_read(sc, 3677 RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5GHZ, 3678 &val, 1); 3679 } else if (chan <= 138) { 3680 run_efuse_read(sc, 3681 RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5GHZ, 3682 &val, 1); 3683 } else if (chan <= 165) { 3684 run_efuse_read(sc, 3685 RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5GHZ, 3686 &val, 1); 3687 } else 3688 val = 0; 3689 run_bbp_write(sc, 159, val); 3690 3691 /* Tx1 IQ gain. */ 3692 run_bbp_write(sc, 158, 0x4a); 3693 if (chan <= 14) { 3694 run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX1_2GHZ, 3695 &val, 1); 3696 } else if (chan <= 64) { 3697 run_efuse_read(sc, 3698 RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5GHZ, 3699 &val, 1); 3700 } else if (chan <= 138) { 3701 run_efuse_read(sc, 3702 RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5GHZ, 3703 &val, 1); 3704 } else if (chan <= 165) { 3705 run_efuse_read(sc, 3706 RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5GHZ, 3707 &val, 1); 3708 } else 3709 val = 0; 3710 run_bbp_write(sc, 159, val); 3711 3712 /* Tx1 IQ phase. */ 3713 run_bbp_write(sc, 158, 0x4b); 3714 if (chan <= 14) { 3715 run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX1_2GHZ, 3716 &val, 1); 3717 } else if (chan <= 64) { 3718 run_efuse_read(sc, 3719 RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5GHZ, 3720 &val, 1); 3721 } else if (chan <= 138) { 3722 run_efuse_read(sc, 3723 RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5GHZ, 3724 &val, 1); 3725 } else if (chan <= 165) { 3726 run_efuse_read(sc, 3727 RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5GHZ, 3728 &val, 1); 3729 } else 3730 val = 0; 3731 run_bbp_write(sc, 159, val); 3732 3733 /* RF IQ compensation control. */ 3734 run_bbp_write(sc, 158, 0x04); 3735 run_efuse_read(sc, RT5390_EEPROM_RF_IQ_COMPENSATION_CTL, 3736 &val, 1); 3737 run_bbp_write(sc, 159, val); 3738 3739 /* RF IQ imbalance compensation control. */ 3740 run_bbp_write(sc, 158, 0x03); 3741 run_efuse_read(sc, 3742 RT5390_EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CTL, &val, 1); 3743 run_bbp_write(sc, 159, val); 3744 } 3745 3746 static void 3747 run_set_agc(struct run_softc *sc, uint8_t agc) 3748 { 3749 uint8_t bbp; 3750 3751 if (sc->mac_ver == 0x3572) { 3752 run_bbp_read(sc, 27, &bbp); 3753 bbp &= ~(0x3 << 5); 3754 run_bbp_write(sc, 27, bbp | 0 << 5); /* select Rx0 */ 3755 run_bbp_write(sc, 66, agc); 3756 run_bbp_write(sc, 27, bbp | 1 << 5); /* select Rx1 */ 3757 run_bbp_write(sc, 66, agc); 3758 } else 3759 run_bbp_write(sc, 66, agc); 3760 } 3761 3762 static void 3763 run_set_rx_antenna(struct run_softc *sc, int aux) 3764 { 3765 uint32_t tmp; 3766 uint8_t bbp152; 3767 3768 if (aux) { 3769 if (sc->rf_rev == RT5390_RF_5370) { 3770 run_bbp_read(sc, 152, &bbp152); 3771 bbp152 &= ~0x80; 3772 run_bbp_write(sc, 152, bbp152); 3773 } else { 3774 run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, 0); 3775 run_read(sc, RT2860_GPIO_CTRL, &tmp); 3776 tmp &= ~0x0808; 3777 tmp |= 0x08; 3778 run_write(sc, RT2860_GPIO_CTRL, tmp); 3779 } 3780 } else { 3781 if (sc->rf_rev == RT5390_RF_5370) { 3782 run_bbp_read(sc, 152, &bbp152); 3783 bbp152 |= 0x80; 3784 run_bbp_write(sc, 152, bbp152); 3785 } else { 3786 run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, !aux); 3787 run_read(sc, RT2860_GPIO_CTRL, &tmp); 3788 tmp &= ~0x0808; 3789 run_write(sc, RT2860_GPIO_CTRL, tmp); 3790 } 3791 } 3792 } 3793 3794 static int 3795 run_set_chan(struct run_softc *sc, struct ieee80211_channel *c) 3796 { 3797 struct ieee80211com *ic = &sc->sc_ic; 3798 u_int chan, group; 3799 3800 chan = ieee80211_chan2ieee(ic, c); 3801 if (chan == 0 || chan == IEEE80211_CHAN_ANY) 3802 return EINVAL; 3803 3804 if (sc->mac_ver == 0x5592) 3805 run_rt5592_set_chan(sc, chan); 3806 else if (sc->mac_ver >= 0x5390) 3807 run_rt5390_set_chan(sc, chan); 3808 else if (sc->mac_ver == 0x3593) 3809 run_rt3593_set_chan(sc, chan); 3810 else if (sc->mac_ver == 0x3572) 3811 run_rt3572_set_chan(sc, chan); 3812 else if (sc->mac_ver >= 0x3070) 3813 run_rt3070_set_chan(sc, chan); 3814 else 3815 run_rt2870_set_chan(sc, chan); 3816 3817 /* determine channel group */ 3818 if (chan <= 14) 3819 group = 0; 3820 else if (chan <= 64) 3821 group = 1; 3822 else if (chan <= 128) 3823 group = 2; 3824 else 3825 group = 3; 3826 3827 /* XXX necessary only when group has changed! */ 3828 run_select_chan_group(sc, group); 3829 3830 usbd_delay_ms(sc->sc_udev, 10); 3831 3832 /* Perform IQ calibration. */ 3833 if (sc->mac_ver >= 0x5392) 3834 run_iq_calib(sc, chan); 3835 3836 return 0; 3837 } 3838 3839 static void 3840 run_updateprot(struct run_softc *sc) 3841 { 3842 struct ieee80211com *ic = &sc->sc_ic; 3843 uint32_t tmp; 3844 3845 tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL; 3846 /* setup protection frame rate (MCS code) */ 3847 tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ? 3848 rt2860_rates[RT2860_RIDX_OFDM6].mcs | RT2860_PHY_OFDM : 3849 rt2860_rates[RT2860_RIDX_CCK11].mcs; 3850 3851 /* CCK frames don't require protection */ 3852 run_write(sc, RT2860_CCK_PROT_CFG, tmp); 3853 if (ic->ic_flags & IEEE80211_F_USEPROT) { 3854 if (ic->ic_protmode == IEEE80211_PROT_RTSCTS) 3855 tmp |= RT2860_PROT_CTRL_RTS_CTS; 3856 else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY) 3857 tmp |= RT2860_PROT_CTRL_CTS; 3858 } 3859 run_write(sc, RT2860_OFDM_PROT_CFG, tmp); 3860 } 3861 3862 static void 3863 run_enable_tsf_sync(struct run_softc *sc) 3864 { 3865 struct ieee80211com *ic = &sc->sc_ic; 3866 uint32_t tmp; 3867 3868 run_read(sc, RT2860_BCN_TIME_CFG, &tmp); 3869 tmp &= ~0x1fffff; 3870 tmp |= ic->ic_bss->ni_intval * 16; 3871 tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN; 3872 if (ic->ic_opmode == IEEE80211_M_STA) { 3873 /* 3874 * Local TSF is always updated with remote TSF on beacon 3875 * reception. 3876 */ 3877 tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT; 3878 } 3879 #ifndef IEEE80211_STA_ONLY 3880 else if (ic->ic_opmode == IEEE80211_M_IBSS) { 3881 tmp |= RT2860_BCN_TX_EN; 3882 /* 3883 * Local TSF is updated with remote TSF on beacon reception 3884 * only if the remote TSF is greater than local TSF. 3885 */ 3886 tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT; 3887 } else if (ic->ic_opmode == IEEE80211_M_HOSTAP) { 3888 tmp |= RT2860_BCN_TX_EN; 3889 /* SYNC with nobody */ 3890 tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT; 3891 } 3892 #endif 3893 run_write(sc, RT2860_BCN_TIME_CFG, tmp); 3894 } 3895 3896 static void 3897 run_enable_mrr(struct run_softc *sc) 3898 { 3899 #define CCK(mcs) (mcs) 3900 #define OFDM(mcs) (1 << 3 | (mcs)) 3901 run_write(sc, RT2860_LG_FBK_CFG0, 3902 OFDM(6) << 28 | /* 54->48 */ 3903 OFDM(5) << 24 | /* 48->36 */ 3904 OFDM(4) << 20 | /* 36->24 */ 3905 OFDM(3) << 16 | /* 24->18 */ 3906 OFDM(2) << 12 | /* 18->12 */ 3907 OFDM(1) << 8 | /* 12-> 9 */ 3908 OFDM(0) << 4 | /* 9-> 6 */ 3909 OFDM(0)); /* 6-> 6 */ 3910 3911 run_write(sc, RT2860_LG_FBK_CFG1, 3912 CCK(2) << 12 | /* 11->5.5 */ 3913 CCK(1) << 8 | /* 5.5-> 2 */ 3914 CCK(0) << 4 | /* 2-> 1 */ 3915 CCK(0)); /* 1-> 1 */ 3916 #undef OFDM 3917 #undef CCK 3918 } 3919 3920 static void 3921 run_set_txpreamble(struct run_softc *sc) 3922 { 3923 uint32_t tmp; 3924 3925 run_read(sc, RT2860_AUTO_RSP_CFG, &tmp); 3926 if (sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE) 3927 tmp |= RT2860_CCK_SHORT_EN; 3928 else 3929 tmp &= ~RT2860_CCK_SHORT_EN; 3930 run_write(sc, RT2860_AUTO_RSP_CFG, tmp); 3931 } 3932 3933 static void 3934 run_set_basicrates(struct run_softc *sc) 3935 { 3936 struct ieee80211com *ic = &sc->sc_ic; 3937 3938 /* set basic rates mask */ 3939 if (ic->ic_curmode == IEEE80211_MODE_11B) 3940 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003); 3941 else if (ic->ic_curmode == IEEE80211_MODE_11A) 3942 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x150); 3943 else /* 11g */ 3944 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x15f); 3945 } 3946 3947 static void 3948 run_set_leds(struct run_softc *sc, uint16_t which) 3949 { 3950 3951 (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LEDS, 3952 which | (sc->leds & 0x7f)); 3953 } 3954 3955 static void 3956 run_set_bssid(struct run_softc *sc, const uint8_t *bssid) 3957 { 3958 3959 run_write(sc, RT2860_MAC_BSSID_DW0, 3960 bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24); 3961 run_write(sc, RT2860_MAC_BSSID_DW1, 3962 bssid[4] | bssid[5] << 8); 3963 } 3964 3965 static void 3966 run_set_macaddr(struct run_softc *sc, const uint8_t *addr) 3967 { 3968 3969 run_write(sc, RT2860_MAC_ADDR_DW0, 3970 addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24); 3971 run_write(sc, RT2860_MAC_ADDR_DW1, 3972 addr[4] | addr[5] << 8 | 0xff << 16); 3973 } 3974 3975 static void 3976 run_updateslot(struct ifnet *ifp) 3977 { 3978 3979 /* do it in a process context */ 3980 run_do_async(ifp->if_softc, run_updateslot_cb, NULL, 0); 3981 } 3982 3983 /* ARGSUSED */ 3984 static void 3985 run_updateslot_cb(struct run_softc *sc, void *arg) 3986 { 3987 uint32_t tmp; 3988 3989 run_read(sc, RT2860_BKOFF_SLOT_CFG, &tmp); 3990 tmp &= ~0xff; 3991 tmp |= (sc->sc_ic.ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20; 3992 run_write(sc, RT2860_BKOFF_SLOT_CFG, tmp); 3993 } 3994 3995 static int8_t 3996 run_rssi2dbm(struct run_softc *sc, uint8_t rssi, uint8_t rxchain) 3997 { 3998 struct ieee80211com *ic = &sc->sc_ic; 3999 struct ieee80211_channel *c = ic->ic_curchan; 4000 int delta; 4001 4002 if (IEEE80211_IS_CHAN_5GHZ(c)) { 4003 u_int chan = ieee80211_chan2ieee(ic, c); 4004 delta = sc->rssi_5ghz[rxchain]; 4005 4006 /* determine channel group */ 4007 if (chan <= 64) 4008 delta -= sc->lna[1]; 4009 else if (chan <= 128) 4010 delta -= sc->lna[2]; 4011 else 4012 delta -= sc->lna[3]; 4013 } else 4014 delta = sc->rssi_2ghz[rxchain] - sc->lna[0]; 4015 4016 return -12 - delta - rssi; 4017 } 4018 4019 static void 4020 run_rt5390_bbp_init(struct run_softc *sc) 4021 { 4022 u_int i; 4023 uint8_t bbp; 4024 4025 /* Apply maximum likelihood detection for 2 stream case. */ 4026 run_bbp_read(sc, 105, &bbp); 4027 if (sc->nrxchains > 1) 4028 run_bbp_write(sc, 105, bbp | RT5390_MLD); 4029 4030 /* Avoid data lost and CRC error. */ 4031 run_bbp_read(sc, 4, &bbp); 4032 run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL); 4033 4034 if (sc->mac_ver == 0x5592) { 4035 for (i = 0; i < (int)__arraycount(rt5592_def_bbp); i++) { 4036 run_bbp_write(sc, rt5592_def_bbp[i].reg, 4037 rt5592_def_bbp[i].val); 4038 } 4039 for (i = 0; i < (int)__arraycount(rt5592_bbp_r196); i++) { 4040 run_bbp_write(sc, 195, i + 0x80); 4041 run_bbp_write(sc, 196, rt5592_bbp_r196[i]); 4042 } 4043 } else { 4044 for (i = 0; i < (int)__arraycount(rt5390_def_bbp); i++) { 4045 run_bbp_write(sc, rt5390_def_bbp[i].reg, 4046 rt5390_def_bbp[i].val); 4047 } 4048 } 4049 if (sc->mac_ver == 0x5392) { 4050 run_bbp_write(sc, 88, 0x90); 4051 run_bbp_write(sc, 95, 0x9a); 4052 run_bbp_write(sc, 98, 0x12); 4053 run_bbp_write(sc, 106, 0x12); 4054 run_bbp_write(sc, 134, 0xd0); 4055 run_bbp_write(sc, 135, 0xf6); 4056 run_bbp_write(sc, 148, 0x84); 4057 } 4058 4059 run_bbp_read(sc, 152, &bbp); 4060 run_bbp_write(sc, 152, bbp | 0x80); 4061 4062 /* Fix BBP254 for RT5592C. */ 4063 if (sc->mac_ver == 0x5592 && sc->mac_rev >= 0x0221) { 4064 run_bbp_read(sc, 254, &bbp); 4065 run_bbp_write(sc, 254, bbp | 0x80); 4066 } 4067 4068 /* Disable hardware antenna diversity. */ 4069 if (sc->mac_ver == 0x5390) 4070 run_bbp_write(sc, 154, 0); 4071 4072 /* Initialize Rx CCK/OFDM frequency offset report. */ 4073 run_bbp_write(sc, 142, 1); 4074 run_bbp_write(sc, 143, 57); 4075 } 4076 4077 static int 4078 run_bbp_init(struct run_softc *sc) 4079 { 4080 int i, error, ntries; 4081 uint8_t bbp0; 4082 4083 /* wait for BBP to wake up */ 4084 for (ntries = 0; ntries < 20; ntries++) { 4085 if ((error = run_bbp_read(sc, 0, &bbp0)) != 0) 4086 return error; 4087 if (bbp0 != 0 && bbp0 != 0xff) 4088 break; 4089 } 4090 if (ntries == 20) 4091 return ETIMEDOUT; 4092 4093 /* initialize BBP registers to default values */ 4094 if (sc->mac_ver >= 0x5390) 4095 run_rt5390_bbp_init(sc); 4096 else { 4097 for (i = 0; i < (int)__arraycount(rt2860_def_bbp); i++) { 4098 run_bbp_write(sc, rt2860_def_bbp[i].reg, 4099 rt2860_def_bbp[i].val); 4100 } 4101 } 4102 4103 if (sc->mac_ver == 0x3593) { 4104 run_bbp_write(sc, 79, 0x13); 4105 run_bbp_write(sc, 80, 0x05); 4106 run_bbp_write(sc, 81, 0x33); 4107 run_bbp_write(sc, 86, 0x46); 4108 run_bbp_write(sc, 137, 0x0f); 4109 } 4110 4111 /* fix BBP84 for RT2860E */ 4112 if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101) 4113 run_bbp_write(sc, 84, 0x19); 4114 4115 if (sc->mac_ver >= 0x3070 && (sc->mac_ver != 0x3593 && 4116 sc->mac_ver != 0x5592)) { 4117 run_bbp_write(sc, 79, 0x13); 4118 run_bbp_write(sc, 80, 0x05); 4119 run_bbp_write(sc, 81, 0x33); 4120 } else if (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) { 4121 run_bbp_write(sc, 69, 0x16); 4122 run_bbp_write(sc, 73, 0x12); 4123 } 4124 return 0; 4125 } 4126 4127 static int 4128 run_rt3070_rf_init(struct run_softc *sc) 4129 { 4130 uint32_t tmp; 4131 uint8_t rf, target, bbp4; 4132 int i; 4133 4134 run_rt3070_rf_read(sc, 30, &rf); 4135 /* toggle RF R30 bit 7 */ 4136 run_rt3070_rf_write(sc, 30, rf | 0x80); 4137 usbd_delay_ms(sc->sc_udev, 10); 4138 run_rt3070_rf_write(sc, 30, rf & ~0x80); 4139 4140 /* initialize RF registers to default value */ 4141 if (sc->mac_ver == 0x3572) { 4142 for (i = 0; i < (int)__arraycount(rt3572_def_rf); i++) { 4143 run_rt3070_rf_write(sc, rt3572_def_rf[i].reg, 4144 rt3572_def_rf[i].val); 4145 } 4146 } else { 4147 for (i = 0; i < (int)__arraycount(rt3070_def_rf); i++) { 4148 run_rt3070_rf_write(sc, rt3070_def_rf[i].reg, 4149 rt3070_def_rf[i].val); 4150 } 4151 } 4152 if (sc->mac_ver == 0x3572) { 4153 run_rt3070_rf_read(sc, 6, &rf); 4154 run_rt3070_rf_write(sc, 6, rf | 0x40); 4155 run_rt3070_rf_write(sc, 31, 0x14); 4156 4157 run_read(sc, RT3070_LDO_CFG0, &tmp); 4158 tmp &= ~0x1f000000; 4159 if (sc->mac_rev < 0x0211 && sc->patch_dac) 4160 tmp |= 0x0d000000; /* 1.3V */ 4161 else 4162 tmp |= 0x01000000; /* 1.2V */ 4163 run_write(sc, RT3070_LDO_CFG0, tmp); 4164 } else if (sc->mac_ver == 0x3071) { 4165 run_rt3070_rf_read(sc, 6, &rf); 4166 run_rt3070_rf_write(sc, 6, rf | 0x40); 4167 run_rt3070_rf_write(sc, 31, 0x14); 4168 4169 run_read(sc, RT3070_LDO_CFG0, &tmp); 4170 tmp &= ~0x1f000000; 4171 if (sc->mac_rev < 0x0211) 4172 tmp |= 0x0d000000; /* 1.35V */ 4173 else 4174 tmp |= 0x01000000; /* 1.2V */ 4175 run_write(sc, RT3070_LDO_CFG0, tmp); 4176 4177 /* patch LNA_PE_G1 */ 4178 run_read(sc, RT3070_GPIO_SWITCH, &tmp); 4179 run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20); 4180 } else if (sc->mac_ver == 0x3070 && sc->mac_rev < 0x0201) { 4181 /* 4182 * Change voltage from 1.2V to 1.35V for RT3070. 4183 * The DAC issue (RT3070_LD0_CFG0) has been fixed 4184 * in RT3070(F). 4185 */ 4186 run_read(sc, RT3070_LDO_CFG0, &tmp); 4187 tmp = (tmp & ~0x0f000000) | 0x0d000000; 4188 run_write(sc, RT3070_LDO_CFG0, tmp); 4189 } 4190 4191 /* select 20MHz bandwidth */ 4192 run_rt3070_rf_read(sc, 31, &rf); 4193 run_rt3070_rf_write(sc, 31, rf & ~0x20); 4194 4195 /* calibrate filter for 20MHz bandwidth */ 4196 sc->rf24_20mhz = 0x1f; /* default value */ 4197 target = (sc->mac_ver < 0x3071) ? 0x16 : 0x13; 4198 run_rt3070_filter_calib(sc, 0x07, target, &sc->rf24_20mhz); 4199 4200 /* select 40MHz bandwidth */ 4201 run_bbp_read(sc, 4, &bbp4); 4202 run_bbp_write(sc, 4, (bbp4 & ~0x08) | 0x10); 4203 run_rt3070_rf_read(sc, 31, &rf); 4204 run_rt3070_rf_write(sc, 31, rf | 0x20); 4205 4206 /* calibrate filter for 40MHz bandwidth */ 4207 sc->rf24_40mhz = 0x2f; /* default value */ 4208 target = (sc->mac_ver < 0x3071) ? 0x19 : 0x15; 4209 run_rt3070_filter_calib(sc, 0x27, target, &sc->rf24_40mhz); 4210 4211 /* go back to 20MHz bandwidth */ 4212 run_bbp_read(sc, 4, &bbp4); 4213 run_bbp_write(sc, 4, bbp4 & ~0x18); 4214 4215 if (sc->mac_ver == 0x3572) { 4216 /* save default BBP registers 25 and 26 values */ 4217 run_bbp_read(sc, 25, &sc->bbp25); 4218 run_bbp_read(sc, 26, &sc->bbp26); 4219 } else if (sc->mac_rev < 0x0211) 4220 run_rt3070_rf_write(sc, 27, 0x03); 4221 4222 run_read(sc, RT3070_OPT_14, &tmp); 4223 run_write(sc, RT3070_OPT_14, tmp | 1); 4224 4225 if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) { 4226 run_rt3070_rf_read(sc, 17, &rf); 4227 rf &= ~RT3070_TX_LO1; 4228 if ((sc->mac_ver == 0x3070 || 4229 (sc->mac_ver == 0x3071 && sc->mac_rev >= 0x0211)) && 4230 !sc->ext_2ghz_lna) 4231 rf |= 0x20; /* fix for long range Rx issue */ 4232 if (sc->txmixgain_2ghz >= 1) 4233 rf = (rf & ~0x7) | sc->txmixgain_2ghz; 4234 run_rt3070_rf_write(sc, 17, rf); 4235 } 4236 if (sc->mac_ver == 0x3071) { 4237 run_rt3070_rf_read(sc, 1, &rf); 4238 rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD); 4239 rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD; 4240 run_rt3070_rf_write(sc, 1, rf); 4241 4242 run_rt3070_rf_read(sc, 15, &rf); 4243 run_rt3070_rf_write(sc, 15, rf & ~RT3070_TX_LO2); 4244 4245 run_rt3070_rf_read(sc, 20, &rf); 4246 run_rt3070_rf_write(sc, 20, rf & ~RT3070_RX_LO1); 4247 4248 run_rt3070_rf_read(sc, 21, &rf); 4249 run_rt3070_rf_write(sc, 21, rf & ~RT3070_RX_LO2); 4250 } 4251 if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) { 4252 /* fix Tx to Rx IQ glitch by raising RF voltage */ 4253 run_rt3070_rf_read(sc, 27, &rf); 4254 rf &= ~0x77; 4255 if (sc->mac_rev < 0x0211) 4256 rf |= 0x03; 4257 run_rt3070_rf_write(sc, 27, rf); 4258 } 4259 return 0; 4260 } 4261 4262 static int 4263 run_rt3593_rf_init(struct run_softc *sc) 4264 { 4265 uint32_t tmp; 4266 uint8_t rf; 4267 int i; 4268 4269 /* Disable the GPIO bits 4 and 7 for LNA PE control. */ 4270 run_read(sc, RT3070_GPIO_SWITCH, &tmp); 4271 tmp &= ~(1 << 4 | 1 << 7); 4272 run_write(sc, RT3070_GPIO_SWITCH, tmp); 4273 4274 /* Initialize RF registers to default value. */ 4275 for (i = 0; i < __arraycount(rt3593_def_rf); i++) { 4276 run_rt3070_rf_write(sc, rt3593_def_rf[i].reg, 4277 rt3593_def_rf[i].val); 4278 } 4279 4280 /* Toggle RF R2 to initiate calibration. */ 4281 run_rt3070_rf_write(sc, 2, RT5390_RESCAL); 4282 4283 /* Initialize RF frequency offset. */ 4284 run_adjust_freq_offset(sc); 4285 4286 run_rt3070_rf_read(sc, 18, &rf); 4287 run_rt3070_rf_write(sc, 18, rf | RT3593_AUTOTUNE_BYPASS); 4288 4289 /* 4290 * Increase voltage from 1.2V to 1.35V, wait for 1 msec to 4291 * decrease voltage back to 1.2V. 4292 */ 4293 run_read(sc, RT3070_LDO_CFG0, &tmp); 4294 tmp = (tmp & ~0x1f000000) | 0x0d000000; 4295 run_write(sc, RT3070_LDO_CFG0, tmp); 4296 usbd_delay_ms(sc->sc_udev, 1); 4297 tmp = (tmp & ~0x1f000000) | 0x01000000; 4298 run_write(sc, RT3070_LDO_CFG0, tmp); 4299 4300 sc->rf24_20mhz = 0x1f; 4301 sc->rf24_40mhz = 0x2f; 4302 4303 /* Save default BBP registers 25 and 26 values. */ 4304 run_bbp_read(sc, 25, &sc->bbp25); 4305 run_bbp_read(sc, 26, &sc->bbp26); 4306 4307 run_read(sc, RT3070_OPT_14, &tmp); 4308 run_write(sc, RT3070_OPT_14, tmp | 1); 4309 return 0; 4310 } 4311 4312 static int 4313 run_rt5390_rf_init(struct run_softc *sc) 4314 { 4315 uint32_t tmp; 4316 uint8_t rf; 4317 int i; 4318 4319 /* Toggle RF R2 to initiate calibration. */ 4320 if (sc->mac_ver == 0x5390) { 4321 run_rt3070_rf_read(sc, 2, &rf); 4322 run_rt3070_rf_write(sc, 2, rf | RT5390_RESCAL); 4323 usbd_delay_ms(sc->sc_udev, 10); 4324 run_rt3070_rf_write(sc, 2, rf & ~RT5390_RESCAL); 4325 } else { 4326 run_rt3070_rf_write(sc, 2, RT5390_RESCAL); 4327 usbd_delay_ms(sc->sc_udev, 10); 4328 } 4329 4330 /* Initialize RF registers to default value. */ 4331 if (sc->mac_ver == 0x5592) { 4332 for (i = 0; i < __arraycount(rt5592_def_rf); i++) { 4333 run_rt3070_rf_write(sc, rt5592_def_rf[i].reg, 4334 rt5592_def_rf[i].val); 4335 } 4336 /* Initialize RF frequency offset. */ 4337 run_adjust_freq_offset(sc); 4338 } else if (sc->mac_ver == 0x5392) { 4339 for (i = 0; i < __arraycount(rt5392_def_rf); i++) { 4340 run_rt3070_rf_write(sc, rt5392_def_rf[i].reg, 4341 rt5392_def_rf[i].val); 4342 } 4343 if (sc->mac_rev >= 0x0223) { 4344 run_rt3070_rf_write(sc, 23, 0x0f); 4345 run_rt3070_rf_write(sc, 24, 0x3e); 4346 run_rt3070_rf_write(sc, 51, 0x32); 4347 run_rt3070_rf_write(sc, 53, 0x22); 4348 run_rt3070_rf_write(sc, 56, 0xc1); 4349 run_rt3070_rf_write(sc, 59, 0x0f); 4350 } 4351 } else { 4352 for (i = 0; i < __arraycount(rt5390_def_rf); i++) { 4353 run_rt3070_rf_write(sc, rt5390_def_rf[i].reg, 4354 rt5390_def_rf[i].val); 4355 } 4356 if (sc->mac_rev >= 0x0502) { 4357 run_rt3070_rf_write(sc, 6, 0xe0); 4358 run_rt3070_rf_write(sc, 25, 0x80); 4359 run_rt3070_rf_write(sc, 46, 0x73); 4360 run_rt3070_rf_write(sc, 53, 0x00); 4361 run_rt3070_rf_write(sc, 56, 0x42); 4362 run_rt3070_rf_write(sc, 61, 0xd1); 4363 } 4364 } 4365 4366 sc->rf24_20mhz = 0x1f; /* default value */ 4367 sc->rf24_40mhz = (sc->mac_ver == 0x5592) ? 0 : 0x2f; 4368 4369 if (sc->mac_rev < 0x0211) 4370 run_rt3070_rf_write(sc, 27, 0x3); 4371 4372 run_read(sc, RT3070_OPT_14, &tmp); 4373 run_write(sc, RT3070_OPT_14, tmp | 1); 4374 return 0; 4375 } 4376 4377 static int 4378 run_rt3070_filter_calib(struct run_softc *sc, uint8_t init, uint8_t target, 4379 uint8_t *val) 4380 { 4381 uint8_t rf22, rf24; 4382 uint8_t bbp55_pb, bbp55_sb, delta; 4383 int ntries; 4384 4385 /* program filter */ 4386 run_rt3070_rf_read(sc, 24, &rf24); 4387 rf24 = (rf24 & 0xc0) | init; /* initial filter value */ 4388 run_rt3070_rf_write(sc, 24, rf24); 4389 4390 /* enable baseband loopback mode */ 4391 run_rt3070_rf_read(sc, 22, &rf22); 4392 run_rt3070_rf_write(sc, 22, rf22 | 0x01); 4393 4394 /* set power and frequency of passband test tone */ 4395 run_bbp_write(sc, 24, 0x00); 4396 for (ntries = 0; ntries < 100; ntries++) { 4397 /* transmit test tone */ 4398 run_bbp_write(sc, 25, 0x90); 4399 usbd_delay_ms(sc->sc_udev, 10); 4400 /* read received power */ 4401 run_bbp_read(sc, 55, &bbp55_pb); 4402 if (bbp55_pb != 0) 4403 break; 4404 } 4405 if (ntries == 100) 4406 return ETIMEDOUT; 4407 4408 /* set power and frequency of stopband test tone */ 4409 run_bbp_write(sc, 24, 0x06); 4410 for (ntries = 0; ntries < 100; ntries++) { 4411 /* transmit test tone */ 4412 run_bbp_write(sc, 25, 0x90); 4413 usbd_delay_ms(sc->sc_udev, 10); 4414 /* read received power */ 4415 run_bbp_read(sc, 55, &bbp55_sb); 4416 4417 delta = bbp55_pb - bbp55_sb; 4418 if (delta > target) 4419 break; 4420 4421 /* reprogram filter */ 4422 rf24++; 4423 run_rt3070_rf_write(sc, 24, rf24); 4424 } 4425 if (ntries < 100) { 4426 if (rf24 != init) 4427 rf24--; /* backtrack */ 4428 *val = rf24; 4429 run_rt3070_rf_write(sc, 24, rf24); 4430 } 4431 4432 /* restore initial state */ 4433 run_bbp_write(sc, 24, 0x00); 4434 4435 /* disable baseband loopback mode */ 4436 run_rt3070_rf_read(sc, 22, &rf22); 4437 run_rt3070_rf_write(sc, 22, rf22 & ~0x01); 4438 4439 return 0; 4440 } 4441 4442 static void 4443 run_rt3070_rf_setup(struct run_softc *sc) 4444 { 4445 uint8_t bbp, rf; 4446 int i; 4447 4448 if (sc->mac_ver == 0x3572) { 4449 /* enable DC filter */ 4450 if (sc->mac_rev >= 0x0201) 4451 run_bbp_write(sc, 103, 0xc0); 4452 4453 run_bbp_read(sc, 138, &bbp); 4454 if (sc->ntxchains == 1) 4455 bbp |= 0x20; /* turn off DAC1 */ 4456 if (sc->nrxchains == 1) 4457 bbp &= ~0x02; /* turn off ADC1 */ 4458 run_bbp_write(sc, 138, bbp); 4459 4460 if (sc->mac_rev >= 0x0211) { 4461 /* improve power consumption */ 4462 run_bbp_read(sc, 31, &bbp); 4463 run_bbp_write(sc, 31, bbp & ~0x03); 4464 } 4465 4466 run_rt3070_rf_read(sc, 16, &rf); 4467 rf = (rf & ~0x07) | sc->txmixgain_2ghz; 4468 run_rt3070_rf_write(sc, 16, rf); 4469 } else if (sc->mac_ver == 0x3071) { 4470 /* enable DC filter */ 4471 if (sc->mac_rev >= 0x0201) 4472 run_bbp_write(sc, 103, 0xc0); 4473 4474 run_bbp_read(sc, 138, &bbp); 4475 if (sc->ntxchains == 1) 4476 bbp |= 0x20; /* turn off DAC1 */ 4477 if (sc->nrxchains == 1) 4478 bbp &= ~0x02; /* turn off ADC1 */ 4479 run_bbp_write(sc, 138, bbp); 4480 4481 if (sc->mac_rev >= 0x0211) { 4482 /* improve power consumption */ 4483 run_bbp_read(sc, 31, &bbp); 4484 run_bbp_write(sc, 31, bbp & ~0x03); 4485 } 4486 4487 run_write(sc, RT2860_TX_SW_CFG1, 0); 4488 if (sc->mac_rev < 0x0211) { 4489 run_write(sc, RT2860_TX_SW_CFG2, 4490 sc->patch_dac ? 0x2c : 0x0f); 4491 } else 4492 run_write(sc, RT2860_TX_SW_CFG2, 0); 4493 } else if (sc->mac_ver == 0x3070) { 4494 if (sc->mac_rev >= 0x0201) { 4495 /* enable DC filter */ 4496 run_bbp_write(sc, 103, 0xc0); 4497 4498 /* improve power consumption */ 4499 run_bbp_read(sc, 31, &bbp); 4500 run_bbp_write(sc, 31, bbp & ~0x03); 4501 } 4502 4503 if (sc->mac_rev < 0x0211) { 4504 run_write(sc, RT2860_TX_SW_CFG1, 0); 4505 run_write(sc, RT2860_TX_SW_CFG2, 0x2c); 4506 } else 4507 run_write(sc, RT2860_TX_SW_CFG2, 0); 4508 } 4509 4510 /* initialize RF registers from ROM for >=RT3071*/ 4511 if (sc->mac_ver >= 0x3071) { 4512 for (i = 0; i < 10; i++) { 4513 if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff) 4514 continue; 4515 run_rt3070_rf_write(sc, sc->rf[i].reg, sc->rf[i].val); 4516 } 4517 } 4518 } 4519 4520 static void 4521 run_rt3593_rf_setup(struct run_softc *sc) 4522 { 4523 uint8_t bbp, rf; 4524 4525 if (sc->mac_rev >= 0x0211) { 4526 /* Enable DC filter. */ 4527 run_bbp_write(sc, 103, 0xc0); 4528 } 4529 run_write(sc, RT2860_TX_SW_CFG1, 0); 4530 if (sc->mac_rev < 0x0211) { 4531 run_write(sc, RT2860_TX_SW_CFG2, 4532 sc->patch_dac ? 0x2c : 0x0f); 4533 } else 4534 run_write(sc, RT2860_TX_SW_CFG2, 0); 4535 4536 run_rt3070_rf_read(sc, 50, &rf); 4537 run_rt3070_rf_write(sc, 50, rf & ~RT3593_TX_LO2); 4538 4539 run_rt3070_rf_read(sc, 51, &rf); 4540 rf = (rf & ~(RT3593_TX_LO1 | 0x0c)) | 4541 ((sc->txmixgain_2ghz & 0x07) << 2); 4542 run_rt3070_rf_write(sc, 51, rf); 4543 4544 run_rt3070_rf_read(sc, 38, &rf); 4545 run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1); 4546 4547 run_rt3070_rf_read(sc, 39, &rf); 4548 run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2); 4549 4550 run_rt3070_rf_read(sc, 1, &rf); 4551 run_rt3070_rf_write(sc, 1, rf & ~(RT3070_RF_BLOCK | RT3070_PLL_PD)); 4552 4553 run_rt3070_rf_read(sc, 30, &rf); 4554 rf = (rf & ~0x18) | 0x10; 4555 run_rt3070_rf_write(sc, 30, rf); 4556 4557 /* Apply maximum likelihood detection for 2 stream case. */ 4558 run_bbp_read(sc, 105, &bbp); 4559 if (sc->nrxchains > 1) 4560 run_bbp_write(sc, 105, bbp | RT5390_MLD); 4561 4562 /* Avoid data lost and CRC error. */ 4563 run_bbp_read(sc, 4, &bbp); 4564 run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL); 4565 4566 run_bbp_write(sc, 92, 0x02); 4567 run_bbp_write(sc, 82, 0x82); 4568 run_bbp_write(sc, 106, 0x05); 4569 run_bbp_write(sc, 104, 0x92); 4570 run_bbp_write(sc, 88, 0x90); 4571 run_bbp_write(sc, 148, 0xc8); 4572 run_bbp_write(sc, 47, 0x48); 4573 run_bbp_write(sc, 120, 0x50); 4574 4575 run_bbp_write(sc, 163, 0x9d); 4576 4577 /* SNR mapping. */ 4578 run_bbp_write(sc, 142, 0x06); 4579 run_bbp_write(sc, 143, 0xa0); 4580 run_bbp_write(sc, 142, 0x07); 4581 run_bbp_write(sc, 143, 0xa1); 4582 run_bbp_write(sc, 142, 0x08); 4583 run_bbp_write(sc, 143, 0xa2); 4584 4585 run_bbp_write(sc, 31, 0x08); 4586 run_bbp_write(sc, 68, 0x0b); 4587 run_bbp_write(sc, 105, 0x04); 4588 } 4589 4590 static void 4591 run_rt5390_rf_setup(struct run_softc *sc) 4592 { 4593 uint8_t bbp, rf; 4594 4595 if (sc->mac_rev >= 0x0211) { 4596 /* Enable DC filter. */ 4597 run_bbp_write(sc, 103, 0xc0); 4598 4599 if (sc->mac_ver != 0x5592) { 4600 /* Improve power consumption. */ 4601 run_bbp_read(sc, 31, &bbp); 4602 run_bbp_write(sc, 31, bbp & ~0x03); 4603 } 4604 } 4605 4606 run_bbp_read(sc, 138, &bbp); 4607 if (sc->ntxchains == 1) 4608 bbp |= 0x20; /* turn off DAC1 */ 4609 if (sc->nrxchains == 1) 4610 bbp &= ~0x02; /* turn off ADC1 */ 4611 run_bbp_write(sc, 138, bbp); 4612 4613 run_rt3070_rf_read(sc, 38, &rf); 4614 run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1); 4615 4616 run_rt3070_rf_read(sc, 39, &rf); 4617 run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2); 4618 4619 /* Avoid data lost and CRC error. */ 4620 run_bbp_read(sc, 4, &bbp); 4621 run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL); 4622 4623 run_rt3070_rf_read(sc, 30, &rf); 4624 rf = (rf & ~0x18) | 0x10; 4625 run_rt3070_rf_write(sc, 30, rf); 4626 4627 if (sc->mac_ver != 0x5592) { 4628 run_write(sc, RT2860_TX_SW_CFG1, 0); 4629 if (sc->mac_rev < 0x0211) { 4630 run_write(sc, RT2860_TX_SW_CFG2, 4631 sc->patch_dac ? 0x2c : 0x0f); 4632 } else 4633 run_write(sc, RT2860_TX_SW_CFG2, 0); 4634 } 4635 } 4636 4637 static int 4638 run_txrx_enable(struct run_softc *sc) 4639 { 4640 uint32_t tmp; 4641 int error, ntries; 4642 4643 run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN); 4644 for (ntries = 0; ntries < 200; ntries++) { 4645 if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0) 4646 return error; 4647 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0) 4648 break; 4649 usbd_delay_ms(sc->sc_udev, 50); 4650 } 4651 if (ntries == 200) 4652 return ETIMEDOUT; 4653 4654 usbd_delay_ms(sc->sc_udev, 50); 4655 4656 tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | RT2860_TX_WB_DDONE; 4657 run_write(sc, RT2860_WPDMA_GLO_CFG, tmp); 4658 4659 /* enable Rx bulk aggregation (set timeout and limit) */ 4660 tmp = RT2860_USB_TX_EN | RT2860_USB_RX_EN | RT2860_USB_RX_AGG_EN | 4661 RT2860_USB_RX_AGG_TO(128) | RT2860_USB_RX_AGG_LMT(2); 4662 run_write(sc, RT2860_USB_DMA_CFG, tmp); 4663 4664 /* set Rx filter */ 4665 tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR; 4666 if (sc->sc_ic.ic_opmode != IEEE80211_M_MONITOR) { 4667 tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL | 4668 RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK | 4669 RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV | 4670 RT2860_DROP_CFACK | RT2860_DROP_CFEND; 4671 if (sc->sc_ic.ic_opmode == IEEE80211_M_STA) 4672 tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL; 4673 } 4674 run_write(sc, RT2860_RX_FILTR_CFG, tmp); 4675 4676 run_write(sc, RT2860_MAC_SYS_CTRL, 4677 RT2860_MAC_RX_EN | RT2860_MAC_TX_EN); 4678 4679 return 0; 4680 } 4681 4682 static int 4683 run_adjust_freq_offset(struct run_softc *sc) 4684 { 4685 uint8_t rf, tmp; 4686 4687 run_rt3070_rf_read(sc, 17, &rf); 4688 tmp = rf; 4689 rf = (rf & ~0x7f) | (sc->freq & 0x7f); 4690 rf = MIN(rf, 0x5f); 4691 4692 if (tmp != rf) 4693 run_mcu_cmd(sc, 0x74, (tmp << 8 ) | rf); 4694 4695 return 0; 4696 } 4697 4698 static int 4699 run_init(struct ifnet *ifp) 4700 { 4701 struct run_softc *sc = ifp->if_softc; 4702 struct ieee80211com *ic = &sc->sc_ic; 4703 uint32_t tmp; 4704 uint8_t bbp1, bbp3; 4705 int i, error, qid, ridx, ntries; 4706 usbd_status status; 4707 4708 for (ntries = 0; ntries < 100; ntries++) { 4709 if ((error = run_read(sc, RT2860_ASIC_VER_ID, &tmp)) != 0) 4710 goto fail; 4711 if (tmp != 0 && tmp != 0xffffffff) 4712 break; 4713 usbd_delay_ms(sc->sc_udev, 10); 4714 } 4715 if (ntries == 100) { 4716 error = ETIMEDOUT; 4717 goto fail; 4718 } 4719 4720 if ((sc->sc_flags & RUN_FWLOADED) == 0 && 4721 (error = run_load_microcode(sc)) != 0) { 4722 device_printf(sc->sc_dev, 4723 "could not load 8051 microcode\n"); 4724 goto fail; 4725 } 4726 4727 if (ifp->if_flags & IFF_RUNNING) 4728 run_stop(ifp, 0); 4729 4730 /* init host command ring */ 4731 sc->cmdq.cur = sc->cmdq.next = sc->cmdq.queued = 0; 4732 4733 /* init Tx rings (4 EDCAs) */ 4734 for (qid = 0; qid < 4; qid++) { 4735 if ((error = run_alloc_tx_ring(sc, qid)) != 0) 4736 goto fail; 4737 } 4738 /* init Rx ring */ 4739 if ((error = run_alloc_rx_ring(sc)) != 0) 4740 goto fail; 4741 4742 IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl)); 4743 run_set_macaddr(sc, ic->ic_myaddr); 4744 4745 for (ntries = 0; ntries < 100; ntries++) { 4746 if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0) 4747 goto fail; 4748 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0) 4749 break; 4750 usbd_delay_ms(sc->sc_udev, 10); 4751 } 4752 if (ntries == 100) { 4753 device_printf(sc->sc_dev, 4754 "timeout waiting for DMA engine\n"); 4755 error = ETIMEDOUT; 4756 goto fail; 4757 } 4758 tmp &= 0xff0; 4759 tmp |= RT2860_TX_WB_DDONE; 4760 run_write(sc, RT2860_WPDMA_GLO_CFG, tmp); 4761 4762 /* turn off PME_OEN to solve high-current issue */ 4763 run_read(sc, RT2860_SYS_CTRL, &tmp); 4764 run_write(sc, RT2860_SYS_CTRL, tmp & ~RT2860_PME_OEN); 4765 4766 run_write(sc, RT2860_MAC_SYS_CTRL, 4767 RT2860_BBP_HRST | RT2860_MAC_SRST); 4768 run_write(sc, RT2860_USB_DMA_CFG, 0); 4769 4770 if ((error = run_reset(sc)) != 0) { 4771 device_printf(sc->sc_dev, "could not reset chipset\n"); 4772 goto fail; 4773 } 4774 4775 run_write(sc, RT2860_MAC_SYS_CTRL, 0); 4776 4777 /* init Tx power for all Tx rates (from EEPROM) */ 4778 for (ridx = 0; ridx < 5; ridx++) { 4779 if (sc->txpow20mhz[ridx] == 0xffffffff) 4780 continue; 4781 run_write(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]); 4782 } 4783 4784 for (i = 0; i < (int)__arraycount(rt2870_def_mac); i++) 4785 run_write(sc, rt2870_def_mac[i].reg, rt2870_def_mac[i].val); 4786 run_write(sc, RT2860_WMM_AIFSN_CFG, 0x00002273); 4787 run_write(sc, RT2860_WMM_CWMIN_CFG, 0x00002344); 4788 run_write(sc, RT2860_WMM_CWMAX_CFG, 0x000034aa); 4789 4790 if (sc->mac_ver >= 0x5390) { 4791 run_write(sc, RT2860_TX_SW_CFG0, 4792 4 << RT2860_DLY_PAPE_EN_SHIFT | 4); 4793 if (sc->mac_ver >= 0x5392) { 4794 run_write(sc, RT2860_MAX_LEN_CFG, 0x00002fff); 4795 if (sc->mac_ver == 0x5592) { 4796 run_write(sc, RT2860_HT_FBK_CFG1, 0xedcba980); 4797 run_write(sc, RT2860_TXOP_HLDR_ET, 0x00000082); 4798 } else { 4799 run_write(sc, RT2860_HT_FBK_CFG1, 0xedcb4980); 4800 run_write(sc, RT2860_LG_FBK_CFG0, 0xedcba322); 4801 } 4802 } 4803 } else if (sc->mac_ver >= 0x3593) { 4804 run_write(sc, RT2860_TX_SW_CFG0, 4805 4 << RT2860_DLY_PAPE_EN_SHIFT | 2); 4806 } else if (sc->mac_ver >= 0x3070) { 4807 /* set delay of PA_PE assertion to 1us (unit of 0.25us) */ 4808 run_write(sc, RT2860_TX_SW_CFG0, 4809 4 << RT2860_DLY_PAPE_EN_SHIFT); 4810 } 4811 4812 /* wait while MAC is busy */ 4813 for (ntries = 0; ntries < 100; ntries++) { 4814 if ((error = run_read(sc, RT2860_MAC_STATUS_REG, &tmp)) != 0) 4815 goto fail; 4816 if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY))) 4817 break; 4818 DELAY(1000); 4819 } 4820 if (ntries == 100) { 4821 error = ETIMEDOUT; 4822 goto fail; 4823 } 4824 4825 /* clear Host to MCU mailbox */ 4826 run_write(sc, RT2860_H2M_BBPAGENT, 0); 4827 run_write(sc, RT2860_H2M_MAILBOX, 0); 4828 usbd_delay_ms(sc->sc_udev, 10); 4829 4830 if ((error = run_bbp_init(sc)) != 0) { 4831 device_printf(sc->sc_dev, "could not initialize BBP\n"); 4832 goto fail; 4833 } 4834 4835 /* abort TSF synchronization */ 4836 run_read(sc, RT2860_BCN_TIME_CFG, &tmp); 4837 tmp &= ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN | 4838 RT2860_TBTT_TIMER_EN); 4839 run_write(sc, RT2860_BCN_TIME_CFG, tmp); 4840 4841 /* clear RX WCID search table */ 4842 run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512); 4843 /* clear Pair-wise key table */ 4844 run_set_region_4(sc, RT2860_PKEY(0), 0, 2048); 4845 /* clear IV/EIV table */ 4846 run_set_region_4(sc, RT2860_IVEIV(0), 0, 512); 4847 /* clear WCID attribute table */ 4848 run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32); 4849 /* clear shared key table */ 4850 run_set_region_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32); 4851 /* clear shared key mode */ 4852 run_set_region_4(sc, RT2860_SKEY_MODE_0_7, 0, 4); 4853 4854 /* clear RX WCID search table */ 4855 run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512); 4856 /* clear WCID attribute table */ 4857 run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32); 4858 4859 run_read(sc, RT2860_US_CYC_CNT, &tmp); 4860 tmp = (tmp & ~0xff) | 0x1e; 4861 run_write(sc, RT2860_US_CYC_CNT, tmp); 4862 4863 if (sc->mac_rev != 0x0101) 4864 run_write(sc, RT2860_TXOP_CTRL_CFG, 0x0000583f); 4865 4866 run_write(sc, RT2860_WMM_TXOP0_CFG, 0); 4867 run_write(sc, RT2860_WMM_TXOP1_CFG, 48 << 16 | 96); 4868 4869 /* write vendor-specific BBP values (from EEPROM) */ 4870 if (sc->mac_ver < 0x3593) { 4871 for (i = 0; i < 10; i++) { 4872 if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff) 4873 continue; 4874 run_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val); 4875 } 4876 } 4877 4878 /* select Main antenna for 1T1R devices */ 4879 if (sc->rf_rev == RT3070_RF_3020 || sc->rf_rev == RT5390_RF_5370) 4880 run_set_rx_antenna(sc, 0); 4881 4882 /* send LEDs operating mode to microcontroller */ 4883 (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0]); 4884 (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1]); 4885 (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2]); 4886 4887 if (sc->mac_ver >= 0x5390) 4888 run_rt5390_rf_init(sc); 4889 else if (sc->mac_ver == 0x3593) 4890 run_rt3593_rf_init(sc); 4891 else if (sc->mac_ver >= 0x3070) 4892 run_rt3070_rf_init(sc); 4893 4894 /* disable non-existing Rx chains */ 4895 run_bbp_read(sc, 3, &bbp3); 4896 bbp3 &= ~(1 << 3 | 1 << 4); 4897 if (sc->nrxchains == 2) 4898 bbp3 |= 1 << 3; 4899 else if (sc->nrxchains == 3) 4900 bbp3 |= 1 << 4; 4901 run_bbp_write(sc, 3, bbp3); 4902 4903 /* disable non-existing Tx chains */ 4904 run_bbp_read(sc, 1, &bbp1); 4905 if (sc->ntxchains == 1) 4906 bbp1 &= ~(1 << 3 | 1 << 4); 4907 run_bbp_write(sc, 1, bbp1); 4908 4909 if (sc->mac_ver >= 0x5390) 4910 run_rt5390_rf_setup(sc); 4911 else if (sc->mac_ver == 0x3593) 4912 run_rt3593_rf_setup(sc); 4913 else if (sc->mac_ver >= 0x3070) 4914 run_rt3070_rf_setup(sc); 4915 4916 /* select default channel */ 4917 run_set_chan(sc, ic->ic_curchan); 4918 4919 /* setup initial protection mode */ 4920 run_updateprot(sc); 4921 4922 /* turn radio LED on */ 4923 run_set_leds(sc, RT2860_LED_RADIO); 4924 4925 #ifdef RUN_HWCRYPTO 4926 if (ic->ic_flags & IEEE80211_F_PRIVACY) { 4927 /* install WEP keys */ 4928 for (i = 0; i < IEEE80211_WEP_NKID; i++) 4929 (void)run_set_key(ic, &ic->ic_crypto.cs_nw_keys[i], 4930 NULL); 4931 } 4932 #endif 4933 4934 for (i = 0; i < RUN_RX_RING_COUNT; i++) { 4935 struct run_rx_data *data = &sc->rxq.data[i]; 4936 4937 usbd_setup_xfer(data->xfer, data, data->buf, RUN_MAX_RXSZ, 4938 USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof); 4939 status = usbd_transfer(data->xfer); 4940 if (status != USBD_NORMAL_COMPLETION && 4941 status != USBD_IN_PROGRESS) { 4942 device_printf(sc->sc_dev, "queuing rx failed: %s\n", 4943 usbd_errstr(status)); 4944 error = EIO; 4945 goto fail; 4946 } 4947 } 4948 4949 if ((error = run_txrx_enable(sc)) != 0) 4950 goto fail; 4951 4952 ifp->if_flags &= ~IFF_OACTIVE; 4953 ifp->if_flags |= IFF_RUNNING; 4954 4955 if (ic->ic_opmode == IEEE80211_M_MONITOR) 4956 ieee80211_new_state(ic, IEEE80211_S_RUN, -1); 4957 else 4958 ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); 4959 4960 if (error != 0) 4961 fail: run_stop(ifp, 1); 4962 return error; 4963 } 4964 4965 static void 4966 run_stop(struct ifnet *ifp, int disable) 4967 { 4968 struct run_softc *sc = ifp->if_softc; 4969 struct ieee80211com *ic = &sc->sc_ic; 4970 uint32_t tmp; 4971 int ntries, qid; 4972 4973 if (ifp->if_flags & IFF_RUNNING) 4974 run_set_leds(sc, 0); /* turn all LEDs off */ 4975 4976 sc->sc_tx_timer = 0; 4977 ifp->if_timer = 0; 4978 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 4979 4980 callout_stop(&sc->scan_to); 4981 callout_stop(&sc->calib_to); 4982 4983 ieee80211_new_state(ic, IEEE80211_S_INIT, -1); 4984 /* wait for all queued asynchronous commands to complete */ 4985 while (sc->cmdq.queued > 0) 4986 tsleep(&sc->cmdq, 0, "cmdq", 0); 4987 4988 /* disable Tx/Rx */ 4989 run_read(sc, RT2860_MAC_SYS_CTRL, &tmp); 4990 tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN); 4991 run_write(sc, RT2860_MAC_SYS_CTRL, tmp); 4992 4993 /* wait for pending Tx to complete */ 4994 for (ntries = 0; ntries < 100; ntries++) { 4995 if (run_read(sc, RT2860_TXRXQ_PCNT, &tmp) != 0) 4996 break; 4997 if ((tmp & RT2860_TX2Q_PCNT_MASK) == 0) 4998 break; 4999 } 5000 DELAY(1000); 5001 run_write(sc, RT2860_USB_DMA_CFG, 0); 5002 5003 /* reset adapter */ 5004 run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST); 5005 run_write(sc, RT2860_MAC_SYS_CTRL, 0); 5006 5007 /* reset Tx and Rx rings */ 5008 sc->qfullmsk = 0; 5009 for (qid = 0; qid < 4; qid++) 5010 run_free_tx_ring(sc, qid); 5011 run_free_rx_ring(sc); 5012 } 5013 5014 #ifndef IEEE80211_STA_ONLY 5015 static int 5016 run_setup_beacon(struct run_softc *sc) 5017 { 5018 struct ieee80211com *ic = &sc->sc_ic; 5019 struct rt2860_txwi txwi; 5020 struct mbuf *m; 5021 uint16_t txwisize; 5022 int ridx; 5023 5024 if ((m = ieee80211_beacon_alloc(ic, ic->ic_bss, &sc->sc_bo)) == NULL) 5025 return ENOBUFS; 5026 5027 memset(&txwi, 0, sizeof(txwi)); 5028 txwi.wcid = 0xff; 5029 txwi.len = htole16(m->m_pkthdr.len); 5030 /* send beacons at the lowest available rate */ 5031 ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ? 5032 RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1; 5033 txwi.phy = htole16(rt2860_rates[ridx].mcs); 5034 if (rt2860_rates[ridx].phy == IEEE80211_T_OFDM) 5035 txwi.phy |= htole16(RT2860_PHY_OFDM); 5036 txwi.txop = RT2860_TX_TXOP_HT; 5037 txwi.flags = RT2860_TX_TS; 5038 5039 txwisize = (sc->mac_ver == 0x5592) ? 5040 sizeof(txwi) + sizeof(uint32_t) : sizeof(txwi); 5041 run_write_region_1(sc, RT2860_BCN_BASE(0), 5042 (uint8_t *)&txwi, txwisize); 5043 run_write_region_1(sc, RT2860_BCN_BASE(0) + txwisize, 5044 mtod(m, uint8_t *), (m->m_pkthdr.len + 1) & ~1); 5045 5046 m_freem(m); 5047 5048 return 0; 5049 } 5050 #endif 5051 5052 MODULE(MODULE_CLASS_DRIVER, if_run, NULL); 5053 5054 #ifdef _MODULE 5055 #include "ioconf.c" 5056 #endif 5057 5058 static int 5059 if_run_modcmd(modcmd_t cmd, void *arg) 5060 { 5061 int error = 0; 5062 5063 switch (cmd) { 5064 case MODULE_CMD_INIT: 5065 #ifdef _MODULE 5066 error = config_init_component(cfdriver_ioconf_run, 5067 cfattach_ioconf_run, cfdata_ioconf_run); 5068 #endif 5069 return error; 5070 case MODULE_CMD_FINI: 5071 #ifdef _MODULE 5072 error = config_fini_component(cfdriver_ioconf_run, 5073 cfattach_ioconf_run, cfdata_ioconf_run); 5074 #endif 5075 return error; 5076 default: 5077 return ENOTTY; 5078 } 5079 } 5080