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