1 /* $OpenBSD: if_urtwn.c,v 1.16 2011/02/10 17:26:40 jakemsr Exp $ */ 2 3 /*- 4 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr> 5 * Copyright (c) 2014 Kevin Lo <kevlo@FreeBSD.org> 6 * Copyright (c) 2015 Andriy Voskoboinyk <avos@FreeBSD.org> 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 #include <sys/cdefs.h> 22 __FBSDID("$FreeBSD$"); 23 24 /* 25 * Driver for Realtek RTL8188CE-VAU/RTL8188CUS/RTL8188EU/RTL8188RU/RTL8192CU. 26 */ 27 28 #include "opt_wlan.h" 29 #include "opt_urtwn.h" 30 31 #include <sys/param.h> 32 #include <sys/sockio.h> 33 #include <sys/sysctl.h> 34 #include <sys/lock.h> 35 #include <sys/mutex.h> 36 #include <sys/condvar.h> 37 #include <sys/mbuf.h> 38 #include <sys/kernel.h> 39 #include <sys/socket.h> 40 #include <sys/systm.h> 41 #include <sys/malloc.h> 42 #include <sys/module.h> 43 #include <sys/bus.h> 44 #include <sys/endian.h> 45 #include <sys/linker.h> 46 #include <sys/firmware.h> 47 #if defined(__DragonFly__) 48 #else 49 #include <sys/kdb.h> 50 51 #include <machine/bus.h> 52 #include <machine/resource.h> 53 #endif 54 55 #include <sys/rman.h> 56 57 #include <net/bpf.h> 58 #include <net/if.h> 59 #include <net/if_var.h> 60 #include <net/if_arp.h> 61 #include <net/ethernet.h> 62 #include <net/if_dl.h> 63 #include <net/if_media.h> 64 #include <net/if_types.h> 65 66 #include <netinet/in.h> 67 #include <netinet/in_systm.h> 68 #include <netinet/in_var.h> 69 #include <netinet/if_ether.h> 70 #include <netinet/ip.h> 71 72 #include <netproto/802_11/ieee80211_var.h> 73 #include <netproto/802_11/ieee80211_regdomain.h> 74 #include <netproto/802_11/ieee80211_radiotap.h> 75 #include <netproto/802_11/ieee80211_ratectl.h> 76 #ifdef IEEE80211_SUPPORT_SUPERG 77 #include <netproto/802_11/ieee80211_superg.h> 78 #endif 79 80 #include <bus/u4b/usb.h> 81 #include <bus/u4b/usbdi.h> 82 #include <bus/u4b/usb_device.h> 83 #include "usbdevs.h" 84 85 #include <bus/u4b/usb_debug.h> 86 87 #include <bus/u4b/wlan/if_urtwnreg.h> 88 #include <bus/u4b/wlan/if_urtwnvar.h> 89 90 #ifdef USB_DEBUG 91 enum { 92 URTWN_DEBUG_XMIT = 0x00000001, /* basic xmit operation */ 93 URTWN_DEBUG_RECV = 0x00000002, /* basic recv operation */ 94 URTWN_DEBUG_STATE = 0x00000004, /* 802.11 state transitions */ 95 URTWN_DEBUG_RA = 0x00000008, /* f/w rate adaptation setup */ 96 URTWN_DEBUG_USB = 0x00000010, /* usb requests */ 97 URTWN_DEBUG_FIRMWARE = 0x00000020, /* firmware(9) loading debug */ 98 URTWN_DEBUG_BEACON = 0x00000040, /* beacon handling */ 99 URTWN_DEBUG_INTR = 0x00000080, /* ISR */ 100 URTWN_DEBUG_TEMP = 0x00000100, /* temperature calibration */ 101 URTWN_DEBUG_ROM = 0x00000200, /* various ROM info */ 102 URTWN_DEBUG_KEY = 0x00000400, /* crypto keys management */ 103 URTWN_DEBUG_TXPWR = 0x00000800, /* dump Tx power values */ 104 URTWN_DEBUG_RSSI = 0x00001000, /* dump RSSI lookups */ 105 URTWN_DEBUG_ANY = 0xffffffff 106 }; 107 108 #define URTWN_DPRINTF(_sc, _m, ...) do { \ 109 if ((_sc)->sc_debug & (_m)) \ 110 device_printf((_sc)->sc_dev, __VA_ARGS__); \ 111 } while(0) 112 113 #else 114 #define URTWN_DPRINTF(_sc, _m, ...) do { (void) sc; } while (0) 115 #endif 116 117 #define IEEE80211_HAS_ADDR4(wh) IEEE80211_IS_DSTODS(wh) 118 119 static int urtwn_enable_11n = 1; 120 TUNABLE_INT("hw.usb.urtwn.enable_11n", &urtwn_enable_11n); 121 122 /* various supported device vendors/products */ 123 static const STRUCT_USB_HOST_ID urtwn_devs[] = { 124 #define URTWN_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) } 125 #define URTWN_RTL8188E_DEV(v,p) \ 126 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTWN_RTL8188E) } 127 #define URTWN_RTL8188E 1 128 URTWN_DEV(ABOCOM, RTL8188CU_1), 129 URTWN_DEV(ABOCOM, RTL8188CU_2), 130 URTWN_DEV(ABOCOM, RTL8192CU), 131 URTWN_DEV(ASUS, RTL8192CU), 132 URTWN_DEV(ASUS, USBN10NANO), 133 URTWN_DEV(AZUREWAVE, RTL8188CE_1), 134 URTWN_DEV(AZUREWAVE, RTL8188CE_2), 135 URTWN_DEV(AZUREWAVE, RTL8188CU), 136 URTWN_DEV(BELKIN, F7D2102), 137 URTWN_DEV(BELKIN, RTL8188CU), 138 URTWN_DEV(BELKIN, RTL8192CU), 139 URTWN_DEV(CHICONY, RTL8188CUS_1), 140 URTWN_DEV(CHICONY, RTL8188CUS_2), 141 URTWN_DEV(CHICONY, RTL8188CUS_3), 142 URTWN_DEV(CHICONY, RTL8188CUS_4), 143 URTWN_DEV(CHICONY, RTL8188CUS_5), 144 URTWN_DEV(COREGA, RTL8192CU), 145 URTWN_DEV(DLINK, RTL8188CU), 146 URTWN_DEV(DLINK, RTL8192CU_1), 147 URTWN_DEV(DLINK, RTL8192CU_2), 148 URTWN_DEV(DLINK, RTL8192CU_3), 149 URTWN_DEV(DLINK, DWA131B), 150 URTWN_DEV(EDIMAX, EW7811UN), 151 URTWN_DEV(EDIMAX, RTL8192CU), 152 URTWN_DEV(FEIXUN, RTL8188CU), 153 URTWN_DEV(FEIXUN, RTL8192CU), 154 URTWN_DEV(GUILLEMOT, HWNUP150), 155 URTWN_DEV(HAWKING, RTL8192CU), 156 URTWN_DEV(HP3, RTL8188CU), 157 URTWN_DEV(NETGEAR, WNA1000M), 158 URTWN_DEV(NETGEAR, RTL8192CU), 159 URTWN_DEV(NETGEAR4, RTL8188CU), 160 URTWN_DEV(NOVATECH, RTL8188CU), 161 URTWN_DEV(PLANEX2, RTL8188CU_1), 162 URTWN_DEV(PLANEX2, RTL8188CU_2), 163 URTWN_DEV(PLANEX2, RTL8188CU_3), 164 URTWN_DEV(PLANEX2, RTL8188CU_4), 165 URTWN_DEV(PLANEX2, RTL8188CUS), 166 URTWN_DEV(PLANEX2, RTL8192CU), 167 URTWN_DEV(REALTEK, RTL8188CE_0), 168 URTWN_DEV(REALTEK, RTL8188CE_1), 169 URTWN_DEV(REALTEK, RTL8188CTV), 170 URTWN_DEV(REALTEK, RTL8188CU_0), 171 URTWN_DEV(REALTEK, RTL8188CU_1), 172 URTWN_DEV(REALTEK, RTL8188CU_2), 173 URTWN_DEV(REALTEK, RTL8188CU_3), 174 URTWN_DEV(REALTEK, RTL8188CU_COMBO), 175 URTWN_DEV(REALTEK, RTL8188CUS), 176 URTWN_DEV(REALTEK, RTL8188RU_1), 177 URTWN_DEV(REALTEK, RTL8188RU_2), 178 URTWN_DEV(REALTEK, RTL8188RU_3), 179 URTWN_DEV(REALTEK, RTL8191CU), 180 URTWN_DEV(REALTEK, RTL8192CE), 181 URTWN_DEV(REALTEK, RTL8192CU), 182 URTWN_DEV(SITECOMEU, RTL8188CU_1), 183 URTWN_DEV(SITECOMEU, RTL8188CU_2), 184 URTWN_DEV(SITECOMEU, RTL8192CU), 185 URTWN_DEV(TRENDNET, RTL8188CU), 186 URTWN_DEV(TRENDNET, RTL8192CU), 187 URTWN_DEV(ZYXEL, RTL8192CU), 188 /* URTWN_RTL8188E */ 189 URTWN_RTL8188E_DEV(ABOCOM, RTL8188EU), 190 URTWN_RTL8188E_DEV(DLINK, DWA123D1), 191 URTWN_RTL8188E_DEV(DLINK, DWA125D1), 192 URTWN_RTL8188E_DEV(ELECOM, WDC150SU2M), 193 URTWN_RTL8188E_DEV(REALTEK, RTL8188ETV), 194 URTWN_RTL8188E_DEV(REALTEK, RTL8188EU), 195 #undef URTWN_RTL8188E_DEV 196 #undef URTWN_DEV 197 }; 198 199 static device_probe_t urtwn_match; 200 static device_attach_t urtwn_attach; 201 static device_detach_t urtwn_detach; 202 203 static usb_callback_t urtwn_bulk_tx_callback; 204 static usb_callback_t urtwn_bulk_rx_callback; 205 206 static void urtwn_sysctlattach(struct urtwn_softc *); 207 static void urtwn_drain_mbufq(struct urtwn_softc *); 208 static usb_error_t urtwn_do_request(struct urtwn_softc *, 209 struct usb_device_request *, void *); 210 static struct ieee80211vap *urtwn_vap_create(struct ieee80211com *, 211 const char [IFNAMSIZ], int, enum ieee80211_opmode, int, 212 const uint8_t [IEEE80211_ADDR_LEN], 213 const uint8_t [IEEE80211_ADDR_LEN]); 214 static void urtwn_vap_delete(struct ieee80211vap *); 215 static struct mbuf * urtwn_rx_copy_to_mbuf(struct urtwn_softc *, 216 struct r92c_rx_stat *, int); 217 static struct mbuf * urtwn_report_intr(struct usb_xfer *, 218 struct urtwn_data *); 219 static struct mbuf * urtwn_rxeof(struct urtwn_softc *, uint8_t *, int); 220 static void urtwn_r88e_ratectl_tx_complete(struct urtwn_softc *, 221 void *); 222 static struct ieee80211_node *urtwn_rx_frame(struct urtwn_softc *, 223 struct mbuf *, int8_t *); 224 static void urtwn_txeof(struct urtwn_softc *, struct urtwn_data *, 225 int); 226 static int urtwn_alloc_list(struct urtwn_softc *, 227 struct urtwn_data[], int, int); 228 static int urtwn_alloc_rx_list(struct urtwn_softc *); 229 static int urtwn_alloc_tx_list(struct urtwn_softc *); 230 static void urtwn_free_list(struct urtwn_softc *, 231 struct urtwn_data data[], int); 232 static void urtwn_free_rx_list(struct urtwn_softc *); 233 static void urtwn_free_tx_list(struct urtwn_softc *); 234 static struct urtwn_data * _urtwn_getbuf(struct urtwn_softc *); 235 static struct urtwn_data * urtwn_getbuf(struct urtwn_softc *); 236 static usb_error_t urtwn_write_region_1(struct urtwn_softc *, uint16_t, 237 uint8_t *, int); 238 static usb_error_t urtwn_write_1(struct urtwn_softc *, uint16_t, uint8_t); 239 static usb_error_t urtwn_write_2(struct urtwn_softc *, uint16_t, uint16_t); 240 static usb_error_t urtwn_write_4(struct urtwn_softc *, uint16_t, uint32_t); 241 static usb_error_t urtwn_read_region_1(struct urtwn_softc *, uint16_t, 242 uint8_t *, int); 243 static uint8_t urtwn_read_1(struct urtwn_softc *, uint16_t); 244 static uint16_t urtwn_read_2(struct urtwn_softc *, uint16_t); 245 static uint32_t urtwn_read_4(struct urtwn_softc *, uint16_t); 246 static int urtwn_fw_cmd(struct urtwn_softc *, uint8_t, 247 const void *, int); 248 static void urtwn_cmdq_cb(void *, int); 249 static int urtwn_cmd_sleepable(struct urtwn_softc *, const void *, 250 size_t, CMD_FUNC_PROTO); 251 static void urtwn_r92c_rf_write(struct urtwn_softc *, int, 252 uint8_t, uint32_t); 253 static void urtwn_r88e_rf_write(struct urtwn_softc *, int, 254 uint8_t, uint32_t); 255 static uint32_t urtwn_rf_read(struct urtwn_softc *, int, uint8_t); 256 static int urtwn_llt_write(struct urtwn_softc *, uint32_t, 257 uint32_t); 258 static int urtwn_efuse_read_next(struct urtwn_softc *, uint8_t *); 259 static int urtwn_efuse_read_data(struct urtwn_softc *, uint8_t *, 260 uint8_t, uint8_t); 261 #ifdef USB_DEBUG 262 static void urtwn_dump_rom_contents(struct urtwn_softc *, 263 uint8_t *, uint16_t); 264 #endif 265 static int urtwn_efuse_read(struct urtwn_softc *, uint8_t *, 266 uint16_t); 267 static int urtwn_efuse_switch_power(struct urtwn_softc *); 268 static int urtwn_read_chipid(struct urtwn_softc *); 269 static int urtwn_read_rom(struct urtwn_softc *); 270 static int urtwn_r88e_read_rom(struct urtwn_softc *); 271 static int urtwn_ra_init(struct urtwn_softc *); 272 static void urtwn_init_beacon(struct urtwn_softc *, 273 struct urtwn_vap *); 274 static int urtwn_setup_beacon(struct urtwn_softc *, 275 struct ieee80211_node *); 276 static void urtwn_update_beacon(struct ieee80211vap *, int); 277 static int urtwn_tx_beacon(struct urtwn_softc *sc, 278 struct urtwn_vap *); 279 static int urtwn_key_alloc(struct ieee80211vap *, 280 struct ieee80211_key *, ieee80211_keyix *, 281 ieee80211_keyix *); 282 static void urtwn_key_set_cb(struct urtwn_softc *, 283 union sec_param *); 284 static void urtwn_key_del_cb(struct urtwn_softc *, 285 union sec_param *); 286 static int urtwn_key_set(struct ieee80211vap *, 287 const struct ieee80211_key *); 288 static int urtwn_key_delete(struct ieee80211vap *, 289 const struct ieee80211_key *); 290 static void urtwn_tsf_task_adhoc(void *, int); 291 static void urtwn_tsf_sync_enable(struct urtwn_softc *, 292 struct ieee80211vap *); 293 static void urtwn_get_tsf(struct urtwn_softc *, uint64_t *); 294 static void urtwn_set_led(struct urtwn_softc *, int, int); 295 static void urtwn_set_mode(struct urtwn_softc *, uint8_t); 296 static void urtwn_ibss_recv_mgmt(struct ieee80211_node *, 297 struct mbuf *, int, 298 const struct ieee80211_rx_stats *, int, int); 299 static int urtwn_newstate(struct ieee80211vap *, 300 enum ieee80211_state, int); 301 static void urtwn_calib_to(void *); 302 static void urtwn_calib_cb(struct urtwn_softc *, 303 union sec_param *); 304 static void urtwn_watchdog(void *); 305 static void urtwn_update_avgrssi(struct urtwn_softc *, int, int8_t); 306 static int8_t urtwn_get_rssi(struct urtwn_softc *, int, void *); 307 static int8_t urtwn_r88e_get_rssi(struct urtwn_softc *, int, void *); 308 static int urtwn_tx_data(struct urtwn_softc *, 309 struct ieee80211_node *, struct mbuf *, 310 struct urtwn_data *); 311 static int urtwn_tx_raw(struct urtwn_softc *, 312 struct ieee80211_node *, struct mbuf *, 313 struct urtwn_data *, 314 const struct ieee80211_bpf_params *); 315 static void urtwn_tx_start(struct urtwn_softc *, struct mbuf *, 316 uint8_t, struct urtwn_data *); 317 static int urtwn_transmit(struct ieee80211com *, struct mbuf *); 318 static void urtwn_start(struct urtwn_softc *); 319 static void urtwn_parent(struct ieee80211com *); 320 static int urtwn_r92c_power_on(struct urtwn_softc *); 321 static int urtwn_r88e_power_on(struct urtwn_softc *); 322 static void urtwn_r92c_power_off(struct urtwn_softc *); 323 static void urtwn_r88e_power_off(struct urtwn_softc *); 324 static int urtwn_llt_init(struct urtwn_softc *); 325 #ifndef URTWN_WITHOUT_UCODE 326 static void urtwn_fw_reset(struct urtwn_softc *); 327 static void urtwn_r88e_fw_reset(struct urtwn_softc *); 328 static int urtwn_fw_loadpage(struct urtwn_softc *, int, 329 const uint8_t *, int); 330 static int urtwn_load_firmware(struct urtwn_softc *); 331 #endif 332 static int urtwn_dma_init(struct urtwn_softc *); 333 static int urtwn_mac_init(struct urtwn_softc *); 334 static void urtwn_bb_init(struct urtwn_softc *); 335 static void urtwn_rf_init(struct urtwn_softc *); 336 static void urtwn_cam_init(struct urtwn_softc *); 337 static int urtwn_cam_write(struct urtwn_softc *, uint32_t, 338 uint32_t); 339 static void urtwn_pa_bias_init(struct urtwn_softc *); 340 static void urtwn_rxfilter_init(struct urtwn_softc *); 341 static void urtwn_edca_init(struct urtwn_softc *); 342 static void urtwn_write_txpower(struct urtwn_softc *, int, 343 uint16_t[]); 344 static void urtwn_get_txpower(struct urtwn_softc *, int, 345 struct ieee80211_channel *, 346 struct ieee80211_channel *, uint16_t[]); 347 static void urtwn_r88e_get_txpower(struct urtwn_softc *, int, 348 struct ieee80211_channel *, 349 struct ieee80211_channel *, uint16_t[]); 350 static void urtwn_set_txpower(struct urtwn_softc *, 351 struct ieee80211_channel *, 352 struct ieee80211_channel *); 353 static void urtwn_set_rx_bssid_all(struct urtwn_softc *, int); 354 static void urtwn_set_gain(struct urtwn_softc *, uint8_t); 355 static void urtwn_scan_start(struct ieee80211com *); 356 static void urtwn_scan_end(struct ieee80211com *); 357 static void urtwn_set_channel(struct ieee80211com *); 358 static int urtwn_wme_update(struct ieee80211com *); 359 static void urtwn_update_slot(struct ieee80211com *); 360 static void urtwn_update_slot_cb(struct urtwn_softc *, 361 union sec_param *); 362 static void urtwn_update_aifs(struct urtwn_softc *, uint8_t); 363 static uint8_t urtwn_get_multi_pos(const uint8_t[]); 364 static void urtwn_set_multi(struct urtwn_softc *); 365 static void urtwn_set_promisc(struct urtwn_softc *); 366 static void urtwn_update_promisc(struct ieee80211com *); 367 static void urtwn_update_mcast(struct ieee80211com *); 368 static struct ieee80211_node *urtwn_node_alloc(struct ieee80211vap *, 369 const uint8_t mac[IEEE80211_ADDR_LEN]); 370 static void urtwn_newassoc(struct ieee80211_node *, int); 371 static void urtwn_node_free(struct ieee80211_node *); 372 static void urtwn_set_chan(struct urtwn_softc *, 373 struct ieee80211_channel *, 374 struct ieee80211_channel *); 375 static void urtwn_iq_calib(struct urtwn_softc *); 376 static void urtwn_lc_calib(struct urtwn_softc *); 377 static void urtwn_temp_calib(struct urtwn_softc *); 378 static int urtwn_init(struct urtwn_softc *); 379 static void urtwn_stop(struct urtwn_softc *); 380 static void urtwn_abort_xfers(struct urtwn_softc *); 381 static int urtwn_raw_xmit(struct ieee80211_node *, struct mbuf *, 382 const struct ieee80211_bpf_params *); 383 static void urtwn_ms_delay(struct urtwn_softc *); 384 385 /* Aliases. */ 386 #define urtwn_bb_write urtwn_write_4 387 #define urtwn_bb_read urtwn_read_4 388 389 static const struct usb_config urtwn_config[URTWN_N_TRANSFER] = { 390 [URTWN_BULK_RX] = { 391 .type = UE_BULK, 392 .endpoint = UE_ADDR_ANY, 393 .direction = UE_DIR_IN, 394 .bufsize = URTWN_RXBUFSZ, 395 .flags = { 396 .pipe_bof = 1, 397 .short_xfer_ok = 1 398 }, 399 .callback = urtwn_bulk_rx_callback, 400 }, 401 [URTWN_BULK_TX_BE] = { 402 .type = UE_BULK, 403 .endpoint = 0x03, 404 .direction = UE_DIR_OUT, 405 .bufsize = URTWN_TXBUFSZ, 406 .flags = { 407 .ext_buffer = 1, 408 .pipe_bof = 1, 409 .force_short_xfer = 1 410 }, 411 .callback = urtwn_bulk_tx_callback, 412 .timeout = URTWN_TX_TIMEOUT, /* ms */ 413 }, 414 [URTWN_BULK_TX_BK] = { 415 .type = UE_BULK, 416 .endpoint = 0x03, 417 .direction = UE_DIR_OUT, 418 .bufsize = URTWN_TXBUFSZ, 419 .flags = { 420 .ext_buffer = 1, 421 .pipe_bof = 1, 422 .force_short_xfer = 1, 423 }, 424 .callback = urtwn_bulk_tx_callback, 425 .timeout = URTWN_TX_TIMEOUT, /* ms */ 426 }, 427 [URTWN_BULK_TX_VI] = { 428 .type = UE_BULK, 429 .endpoint = 0x02, 430 .direction = UE_DIR_OUT, 431 .bufsize = URTWN_TXBUFSZ, 432 .flags = { 433 .ext_buffer = 1, 434 .pipe_bof = 1, 435 .force_short_xfer = 1 436 }, 437 .callback = urtwn_bulk_tx_callback, 438 .timeout = URTWN_TX_TIMEOUT, /* ms */ 439 }, 440 [URTWN_BULK_TX_VO] = { 441 .type = UE_BULK, 442 .endpoint = 0x02, 443 .direction = UE_DIR_OUT, 444 .bufsize = URTWN_TXBUFSZ, 445 .flags = { 446 .ext_buffer = 1, 447 .pipe_bof = 1, 448 .force_short_xfer = 1 449 }, 450 .callback = urtwn_bulk_tx_callback, 451 .timeout = URTWN_TX_TIMEOUT, /* ms */ 452 }, 453 }; 454 455 static const struct wme_to_queue { 456 uint16_t reg; 457 uint8_t qid; 458 } wme2queue[WME_NUM_AC] = { 459 { R92C_EDCA_BE_PARAM, URTWN_BULK_TX_BE}, 460 { R92C_EDCA_BK_PARAM, URTWN_BULK_TX_BK}, 461 { R92C_EDCA_VI_PARAM, URTWN_BULK_TX_VI}, 462 { R92C_EDCA_VO_PARAM, URTWN_BULK_TX_VO} 463 }; 464 465 static int 466 urtwn_match(device_t self) 467 { 468 struct usb_attach_arg *uaa = device_get_ivars(self); 469 470 if (uaa->usb_mode != USB_MODE_HOST) 471 return (ENXIO); 472 if (uaa->info.bConfigIndex != URTWN_CONFIG_INDEX) 473 return (ENXIO); 474 if (uaa->info.bIfaceIndex != URTWN_IFACE_INDEX) 475 return (ENXIO); 476 477 return (usbd_lookup_id_by_uaa(urtwn_devs, sizeof(urtwn_devs), uaa)); 478 } 479 480 static void 481 urtwn_update_chw(struct ieee80211com *ic) 482 { 483 } 484 485 static int 486 urtwn_ampdu_enable(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap) 487 { 488 489 /* We're driving this ourselves (eventually); don't involve net80211 */ 490 return (0); 491 } 492 493 static int 494 urtwn_attach(device_t self) 495 { 496 struct usb_attach_arg *uaa = device_get_ivars(self); 497 struct urtwn_softc *sc = device_get_softc(self); 498 struct ieee80211com *ic = &sc->sc_ic; 499 uint8_t bands[IEEE80211_MODE_BYTES]; 500 int error; 501 502 device_set_usb_desc(self); 503 sc->sc_udev = uaa->device; 504 sc->sc_dev = self; 505 if (USB_GET_DRIVER_INFO(uaa) == URTWN_RTL8188E) 506 sc->chip |= URTWN_CHIP_88E; 507 508 #ifdef USB_DEBUG 509 int debug; 510 if (resource_int_value(device_get_name(sc->sc_dev), 511 device_get_unit(sc->sc_dev), "debug", &debug) == 0) 512 sc->sc_debug = debug; 513 #endif 514 515 #if defined(__DragonFly__) 516 lockinit(&sc->sc_mtx, device_get_nameunit(self), 0, 0); 517 #else 518 mtx_init(&sc->sc_mtx, device_get_nameunit(self), 519 MTX_NETWORK_LOCK, MTX_DEF); 520 #endif 521 URTWN_CMDQ_LOCK_INIT(sc); 522 URTWN_NT_LOCK_INIT(sc); 523 #if defined(__DragonFly__) 524 callout_init(&sc->sc_calib_to); 525 callout_init(&sc->sc_watchdog_ch); 526 #else 527 callout_init(&sc->sc_calib_to, 0); 528 callout_init(&sc->sc_watchdog_ch, 0); 529 #endif 530 mbufq_init(&sc->sc_snd, ifqmaxlen); 531 532 sc->sc_iface_index = URTWN_IFACE_INDEX; 533 error = usbd_transfer_setup(uaa->device, &sc->sc_iface_index, 534 sc->sc_xfer, urtwn_config, URTWN_N_TRANSFER, sc, &sc->sc_mtx); 535 if (error) { 536 device_printf(self, "could not allocate USB transfers, " 537 "err=%s\n", usbd_errstr(error)); 538 goto detach; 539 } 540 541 URTWN_LOCK(sc); 542 543 error = urtwn_read_chipid(sc); 544 if (error) { 545 device_printf(sc->sc_dev, "unsupported test chip\n"); 546 URTWN_UNLOCK(sc); 547 goto detach; 548 } 549 550 /* Determine number of Tx/Rx chains. */ 551 if (sc->chip & URTWN_CHIP_92C) { 552 sc->ntxchains = (sc->chip & URTWN_CHIP_92C_1T2R) ? 1 : 2; 553 sc->nrxchains = 2; 554 } else { 555 sc->ntxchains = 1; 556 sc->nrxchains = 1; 557 } 558 559 if (sc->chip & URTWN_CHIP_88E) 560 error = urtwn_r88e_read_rom(sc); 561 else 562 error = urtwn_read_rom(sc); 563 if (error != 0) { 564 device_printf(sc->sc_dev, "%s: cannot read rom, error %d\n", 565 __func__, error); 566 URTWN_UNLOCK(sc); 567 goto detach; 568 } 569 570 device_printf(sc->sc_dev, "MAC/BB RTL%s, RF 6052 %dT%dR\n", 571 (sc->chip & URTWN_CHIP_92C) ? "8192CU" : 572 (sc->chip & URTWN_CHIP_88E) ? "8188EU" : 573 (sc->board_type == R92C_BOARD_TYPE_HIGHPA) ? "8188RU" : 574 (sc->board_type == R92C_BOARD_TYPE_MINICARD) ? "8188CE-VAU" : 575 "8188CUS", sc->ntxchains, sc->nrxchains); 576 577 URTWN_UNLOCK(sc); 578 579 ic->ic_softc = sc; 580 ic->ic_name = device_get_nameunit(self); 581 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ 582 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ 583 584 /* set device capabilities */ 585 ic->ic_caps = 586 IEEE80211_C_STA /* station mode */ 587 | IEEE80211_C_MONITOR /* monitor mode */ 588 | IEEE80211_C_IBSS /* adhoc mode */ 589 | IEEE80211_C_HOSTAP /* hostap mode */ 590 | IEEE80211_C_SHPREAMBLE /* short preamble supported */ 591 | IEEE80211_C_SHSLOT /* short slot time supported */ 592 #if 0 593 | IEEE80211_C_BGSCAN /* capable of bg scanning */ 594 #endif 595 | IEEE80211_C_WPA /* 802.11i */ 596 | IEEE80211_C_WME /* 802.11e */ 597 | IEEE80211_C_SWAMSDUTX /* Do software A-MSDU TX */ 598 | IEEE80211_C_FF /* Atheros fast-frames */ 599 ; 600 601 ic->ic_cryptocaps = 602 IEEE80211_CRYPTO_WEP | 603 IEEE80211_CRYPTO_TKIP | 604 IEEE80211_CRYPTO_AES_CCM; 605 606 /* Assume they're all 11n capable for now */ 607 if (urtwn_enable_11n) { 608 device_printf(self, "enabling 11n\n"); 609 ic->ic_htcaps = IEEE80211_HTC_HT | 610 #if 0 611 IEEE80211_HTC_AMPDU | 612 #endif 613 IEEE80211_HTC_AMSDU | 614 IEEE80211_HTCAP_MAXAMSDU_3839 | 615 IEEE80211_HTCAP_SMPS_OFF; 616 /* no HT40 just yet */ 617 // ic->ic_htcaps |= IEEE80211_HTCAP_CHWIDTH40; 618 619 /* XXX TODO: verify chains versus streams for urtwn */ 620 ic->ic_txstream = sc->ntxchains; 621 ic->ic_rxstream = sc->nrxchains; 622 } 623 624 memset(bands, 0, sizeof(bands)); 625 setbit(bands, IEEE80211_MODE_11B); 626 setbit(bands, IEEE80211_MODE_11G); 627 if (urtwn_enable_11n) 628 setbit(bands, IEEE80211_MODE_11NG); 629 ieee80211_init_channels(ic, NULL, bands); 630 631 ieee80211_ifattach(ic); 632 ic->ic_raw_xmit = urtwn_raw_xmit; 633 ic->ic_scan_start = urtwn_scan_start; 634 ic->ic_scan_end = urtwn_scan_end; 635 ic->ic_set_channel = urtwn_set_channel; 636 ic->ic_transmit = urtwn_transmit; 637 ic->ic_parent = urtwn_parent; 638 ic->ic_vap_create = urtwn_vap_create; 639 ic->ic_vap_delete = urtwn_vap_delete; 640 ic->ic_wme.wme_update = urtwn_wme_update; 641 ic->ic_updateslot = urtwn_update_slot; 642 ic->ic_update_promisc = urtwn_update_promisc; 643 ic->ic_update_mcast = urtwn_update_mcast; 644 if (sc->chip & URTWN_CHIP_88E) { 645 ic->ic_node_alloc = urtwn_node_alloc; 646 ic->ic_newassoc = urtwn_newassoc; 647 sc->sc_node_free = ic->ic_node_free; 648 ic->ic_node_free = urtwn_node_free; 649 } 650 ic->ic_update_chw = urtwn_update_chw; 651 ic->ic_ampdu_enable = urtwn_ampdu_enable; 652 653 ieee80211_radiotap_attach(ic, &sc->sc_txtap.wt_ihdr, 654 sizeof(sc->sc_txtap), URTWN_TX_RADIOTAP_PRESENT, 655 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap), 656 URTWN_RX_RADIOTAP_PRESENT); 657 658 TASK_INIT(&sc->cmdq_task, 0, urtwn_cmdq_cb, sc); 659 660 urtwn_sysctlattach(sc); 661 662 if (bootverbose) 663 ieee80211_announce(ic); 664 665 return (0); 666 667 detach: 668 urtwn_detach(self); 669 return (ENXIO); /* failure */ 670 } 671 672 static void 673 urtwn_sysctlattach(struct urtwn_softc *sc) 674 { 675 #ifdef USB_DEBUG 676 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev); 677 struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev); 678 679 SYSCTL_ADD_UINT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO, 680 "debug", CTLFLAG_RW, &sc->sc_debug, sc->sc_debug, 681 "control debugging printfs"); 682 #endif 683 } 684 685 static int 686 urtwn_detach(device_t self) 687 { 688 struct urtwn_softc *sc = device_get_softc(self); 689 struct ieee80211com *ic = &sc->sc_ic; 690 unsigned int x; 691 692 /* Prevent further ioctls. */ 693 URTWN_LOCK(sc); 694 sc->sc_flags |= URTWN_DETACHED; 695 URTWN_UNLOCK(sc); 696 697 urtwn_stop(sc); 698 699 callout_drain(&sc->sc_watchdog_ch); 700 callout_drain(&sc->sc_calib_to); 701 702 /* stop all USB transfers */ 703 usbd_transfer_unsetup(sc->sc_xfer, URTWN_N_TRANSFER); 704 705 /* Prevent further allocations from RX/TX data lists. */ 706 URTWN_LOCK(sc); 707 STAILQ_INIT(&sc->sc_tx_active); 708 STAILQ_INIT(&sc->sc_tx_inactive); 709 STAILQ_INIT(&sc->sc_tx_pending); 710 711 STAILQ_INIT(&sc->sc_rx_active); 712 STAILQ_INIT(&sc->sc_rx_inactive); 713 URTWN_UNLOCK(sc); 714 715 /* drain USB transfers */ 716 for (x = 0; x != URTWN_N_TRANSFER; x++) 717 usbd_transfer_drain(sc->sc_xfer[x]); 718 719 /* Free data buffers. */ 720 URTWN_LOCK(sc); 721 urtwn_free_tx_list(sc); 722 urtwn_free_rx_list(sc); 723 URTWN_UNLOCK(sc); 724 725 if (ic->ic_softc == sc) { 726 ieee80211_draintask(ic, &sc->cmdq_task); 727 ieee80211_ifdetach(ic); 728 } 729 730 URTWN_NT_LOCK_DESTROY(sc); 731 URTWN_CMDQ_LOCK_DESTROY(sc); 732 lockuninit(&sc->sc_mtx); 733 734 return (0); 735 } 736 737 static void 738 urtwn_drain_mbufq(struct urtwn_softc *sc) 739 { 740 struct mbuf *m; 741 struct ieee80211_node *ni; 742 URTWN_ASSERT_LOCKED(sc); 743 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { 744 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; 745 m->m_pkthdr.rcvif = NULL; 746 ieee80211_free_node(ni); 747 m_freem(m); 748 } 749 } 750 751 static usb_error_t 752 urtwn_do_request(struct urtwn_softc *sc, struct usb_device_request *req, 753 void *data) 754 { 755 usb_error_t err; 756 int ntries = 10; 757 758 URTWN_ASSERT_LOCKED(sc); 759 760 err = 0; /* whack gcc warning */ 761 while (ntries--) { 762 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx, 763 req, data, 0, NULL, 250 /* ms */); 764 if (err == 0) 765 break; 766 767 URTWN_DPRINTF(sc, URTWN_DEBUG_USB, 768 "%s: control request failed, %s (retries left: %d)\n", 769 __func__, usbd_errstr(err), ntries); 770 usb_pause_mtx(&sc->sc_mtx, hz / 100); 771 } 772 return (err); 773 } 774 775 static struct ieee80211vap * 776 urtwn_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit, 777 enum ieee80211_opmode opmode, int flags, 778 const uint8_t bssid[IEEE80211_ADDR_LEN], 779 const uint8_t mac[IEEE80211_ADDR_LEN]) 780 { 781 struct urtwn_softc *sc = ic->ic_softc; 782 struct urtwn_vap *uvp; 783 struct ieee80211vap *vap; 784 785 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */ 786 return (NULL); 787 788 uvp = kmalloc(sizeof(struct urtwn_vap), M_80211_VAP, M_WAITOK | M_ZERO); 789 vap = &uvp->vap; 790 /* enable s/w bmiss handling for sta mode */ 791 792 if (ieee80211_vap_setup(ic, vap, name, unit, opmode, 793 flags | IEEE80211_CLONE_NOBEACONS, bssid) != 0) { 794 /* out of memory */ 795 kfree(uvp, M_80211_VAP); 796 return (NULL); 797 } 798 799 if (opmode == IEEE80211_M_HOSTAP || opmode == IEEE80211_M_IBSS) 800 urtwn_init_beacon(sc, uvp); 801 802 /* override state transition machine */ 803 uvp->newstate = vap->iv_newstate; 804 vap->iv_newstate = urtwn_newstate; 805 vap->iv_update_beacon = urtwn_update_beacon; 806 vap->iv_key_alloc = urtwn_key_alloc; 807 vap->iv_key_set = urtwn_key_set; 808 vap->iv_key_delete = urtwn_key_delete; 809 810 /* 802.11n parameters */ 811 vap->iv_ampdu_density = IEEE80211_HTCAP_MPDUDENSITY_16; 812 vap->iv_ampdu_rxmax = IEEE80211_HTCAP_MAXRXAMPDU_64K; 813 814 if (opmode == IEEE80211_M_IBSS) { 815 uvp->recv_mgmt = vap->iv_recv_mgmt; 816 vap->iv_recv_mgmt = urtwn_ibss_recv_mgmt; 817 TASK_INIT(&uvp->tsf_task_adhoc, 0, urtwn_tsf_task_adhoc, vap); 818 } 819 820 if (URTWN_CHIP_HAS_RATECTL(sc)) 821 ieee80211_ratectl_init(vap); 822 /* complete setup */ 823 ieee80211_vap_attach(vap, ieee80211_media_change, 824 ieee80211_media_status, mac); 825 ic->ic_opmode = opmode; 826 return (vap); 827 } 828 829 static void 830 urtwn_vap_delete(struct ieee80211vap *vap) 831 { 832 struct ieee80211com *ic = vap->iv_ic; 833 struct urtwn_softc *sc = ic->ic_softc; 834 struct urtwn_vap *uvp = URTWN_VAP(vap); 835 836 if (uvp->bcn_mbuf != NULL) 837 m_freem(uvp->bcn_mbuf); 838 if (vap->iv_opmode == IEEE80211_M_IBSS) 839 ieee80211_draintask(ic, &uvp->tsf_task_adhoc); 840 if (URTWN_CHIP_HAS_RATECTL(sc)) 841 ieee80211_ratectl_deinit(vap); 842 ieee80211_vap_detach(vap); 843 kfree(uvp, M_80211_VAP); 844 } 845 846 static struct mbuf * 847 urtwn_rx_copy_to_mbuf(struct urtwn_softc *sc, struct r92c_rx_stat *stat, 848 int totlen) 849 { 850 /* ic is not used, remove to fix gcc warning */ 851 /* struct ieee80211com *ic = &sc->sc_ic; */ 852 struct mbuf *m; 853 uint32_t rxdw0; 854 int pktlen; 855 856 /* 857 * don't pass packets to the ieee80211 framework if the driver isn't 858 * RUNNING. 859 */ 860 if (!(sc->sc_flags & URTWN_RUNNING)) 861 return (NULL); 862 863 rxdw0 = le32toh(stat->rxdw0); 864 if (rxdw0 & (R92C_RXDW0_CRCERR | R92C_RXDW0_ICVERR)) { 865 /* 866 * This should not happen since we setup our Rx filter 867 * to not receive these frames. 868 */ 869 URTWN_DPRINTF(sc, URTWN_DEBUG_RECV, 870 "%s: RX flags error (%s)\n", __func__, 871 rxdw0 & R92C_RXDW0_CRCERR ? "CRC" : "ICV"); 872 goto fail; 873 } 874 875 pktlen = MS(rxdw0, R92C_RXDW0_PKTLEN); 876 if (pktlen < sizeof(struct ieee80211_frame_ack)) { 877 URTWN_DPRINTF(sc, URTWN_DEBUG_RECV, 878 "%s: frame is too short: %d\n", __func__, pktlen); 879 goto fail; 880 } 881 882 if (__predict_false(totlen > MCLBYTES)) { 883 /* convert to m_getjcl if this happens */ 884 device_printf(sc->sc_dev, "%s: frame too long: %d (%d)\n", 885 __func__, pktlen, totlen); 886 goto fail; 887 } 888 889 m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR); 890 if (__predict_false(m == NULL)) { 891 device_printf(sc->sc_dev, "%s: could not allocate RX mbuf\n", 892 __func__); 893 goto fail; 894 } 895 896 /* Finalize mbuf. */ 897 memcpy(mtod(m, uint8_t *), (uint8_t *)stat, totlen); 898 m->m_pkthdr.len = m->m_len = totlen; 899 900 return (m); 901 fail: 902 #if defined(__DragonFly__) 903 /* unimplemented */ 904 #else 905 counter_u64_add(ic->ic_ierrors, 1); 906 #endif 907 return (NULL); 908 } 909 910 static struct mbuf * 911 urtwn_report_intr(struct usb_xfer *xfer, struct urtwn_data *data) 912 { 913 struct urtwn_softc *sc = data->sc; 914 /* ic not used, remove to fix gcc error */ 915 /* struct ieee80211com *ic = &sc->sc_ic;*/ 916 struct r92c_rx_stat *stat; 917 uint8_t *buf; 918 int len; 919 920 usbd_xfer_status(xfer, &len, NULL, NULL, NULL); 921 922 if (len < sizeof(*stat)) { 923 #if defined(__DragonFly__) 924 /* unimplemented */ 925 #else 926 counter_u64_add(ic->ic_ierrors, 1); 927 #endif 928 return (NULL); 929 } 930 931 buf = data->buf; 932 stat = (struct r92c_rx_stat *)buf; 933 934 /* 935 * For 88E chips we can tie the FF flushing here; 936 * this is where we do know exactly how deep the 937 * transmit queue is. 938 * 939 * But it won't work for R92 chips, so we can't 940 * take the easy way out. 941 */ 942 943 if (sc->chip & URTWN_CHIP_88E) { 944 int report_sel = MS(le32toh(stat->rxdw3), R88E_RXDW3_RPT); 945 946 switch (report_sel) { 947 case R88E_RXDW3_RPT_RX: 948 return (urtwn_rxeof(sc, buf, len)); 949 case R88E_RXDW3_RPT_TX1: 950 urtwn_r88e_ratectl_tx_complete(sc, &stat[1]); 951 break; 952 default: 953 URTWN_DPRINTF(sc, URTWN_DEBUG_INTR, 954 "%s: case %d was not handled\n", __func__, 955 report_sel); 956 break; 957 } 958 } else 959 return (urtwn_rxeof(sc, buf, len)); 960 961 return (NULL); 962 } 963 964 static struct mbuf * 965 urtwn_rxeof(struct urtwn_softc *sc, uint8_t *buf, int len) 966 { 967 struct r92c_rx_stat *stat; 968 struct mbuf *m, *m0 = NULL, *prevm = NULL; 969 uint32_t rxdw0; 970 int totlen, pktlen, infosz, npkts; 971 972 /* Get the number of encapsulated frames. */ 973 stat = (struct r92c_rx_stat *)buf; 974 npkts = MS(le32toh(stat->rxdw2), R92C_RXDW2_PKTCNT); 975 URTWN_DPRINTF(sc, URTWN_DEBUG_RECV, 976 "%s: Rx %d frames in one chunk\n", __func__, npkts); 977 978 /* Process all of them. */ 979 while (npkts-- > 0) { 980 if (len < sizeof(*stat)) 981 break; 982 stat = (struct r92c_rx_stat *)buf; 983 rxdw0 = le32toh(stat->rxdw0); 984 985 pktlen = MS(rxdw0, R92C_RXDW0_PKTLEN); 986 if (pktlen == 0) 987 break; 988 989 infosz = MS(rxdw0, R92C_RXDW0_INFOSZ) * 8; 990 991 /* Make sure everything fits in xfer. */ 992 totlen = sizeof(*stat) + infosz + pktlen; 993 if (totlen > len) 994 break; 995 996 m = urtwn_rx_copy_to_mbuf(sc, stat, totlen); 997 if (m0 == NULL) 998 m0 = m; 999 if (prevm == NULL) 1000 prevm = m; 1001 else { 1002 prevm->m_next = m; 1003 prevm = m; 1004 } 1005 1006 /* Next chunk is 128-byte aligned. */ 1007 totlen = (totlen + 127) & ~127; 1008 buf += totlen; 1009 len -= totlen; 1010 } 1011 1012 return (m0); 1013 } 1014 1015 static void 1016 urtwn_r88e_ratectl_tx_complete(struct urtwn_softc *sc, void *arg) 1017 { 1018 struct r88e_tx_rpt_ccx *rpt = arg; 1019 struct ieee80211vap *vap; 1020 struct ieee80211_node *ni; 1021 uint8_t macid; 1022 int ntries; 1023 1024 macid = MS(rpt->rptb1, R88E_RPTB1_MACID); 1025 ntries = MS(rpt->rptb2, R88E_RPTB2_RETRY_CNT); 1026 1027 URTWN_NT_LOCK(sc); 1028 ni = sc->node_list[macid]; 1029 if (ni != NULL) { 1030 vap = ni->ni_vap; 1031 URTWN_DPRINTF(sc, URTWN_DEBUG_INTR, "%s: frame for macid %d was" 1032 "%s sent (%d retries)\n", __func__, macid, 1033 (rpt->rptb1 & R88E_RPTB1_PKT_OK) ? "" : " not", 1034 ntries); 1035 1036 if (rpt->rptb1 & R88E_RPTB1_PKT_OK) { 1037 ieee80211_ratectl_tx_complete(vap, ni, 1038 IEEE80211_RATECTL_TX_SUCCESS, &ntries, NULL); 1039 } else { 1040 ieee80211_ratectl_tx_complete(vap, ni, 1041 IEEE80211_RATECTL_TX_FAILURE, &ntries, NULL); 1042 } 1043 } else { 1044 URTWN_DPRINTF(sc, URTWN_DEBUG_INTR, "%s: macid %d, ni is NULL\n", 1045 __func__, macid); 1046 } 1047 URTWN_NT_UNLOCK(sc); 1048 } 1049 1050 static struct ieee80211_node * 1051 urtwn_rx_frame(struct urtwn_softc *sc, struct mbuf *m, int8_t *rssi_p) 1052 { 1053 struct ieee80211com *ic = &sc->sc_ic; 1054 struct ieee80211_frame_min *wh; 1055 struct r92c_rx_stat *stat; 1056 uint32_t rxdw0, rxdw3; 1057 uint8_t rate, cipher; 1058 int8_t rssi = -127; 1059 int infosz; 1060 1061 stat = mtod(m, struct r92c_rx_stat *); 1062 rxdw0 = le32toh(stat->rxdw0); 1063 rxdw3 = le32toh(stat->rxdw3); 1064 1065 rate = MS(rxdw3, R92C_RXDW3_RATE); 1066 cipher = MS(rxdw0, R92C_RXDW0_CIPHER); 1067 infosz = MS(rxdw0, R92C_RXDW0_INFOSZ) * 8; 1068 1069 /* Get RSSI from PHY status descriptor if present. */ 1070 if (infosz != 0 && (rxdw0 & R92C_RXDW0_PHYST)) { 1071 if (sc->chip & URTWN_CHIP_88E) 1072 rssi = urtwn_r88e_get_rssi(sc, rate, &stat[1]); 1073 else 1074 rssi = urtwn_get_rssi(sc, rate, &stat[1]); 1075 URTWN_DPRINTF(sc, URTWN_DEBUG_RSSI, "%s: rssi=%d\n", __func__, rssi); 1076 /* Update our average RSSI. */ 1077 urtwn_update_avgrssi(sc, rate, rssi); 1078 } 1079 1080 if (ieee80211_radiotap_active(ic)) { 1081 struct urtwn_rx_radiotap_header *tap = &sc->sc_rxtap; 1082 1083 tap->wr_flags = 0; 1084 1085 urtwn_get_tsf(sc, &tap->wr_tsft); 1086 if (__predict_false(le32toh((uint32_t)tap->wr_tsft) < 1087 le32toh(stat->rxdw5))) { 1088 tap->wr_tsft = le32toh(tap->wr_tsft >> 32) - 1; 1089 tap->wr_tsft = (uint64_t)htole32(tap->wr_tsft) << 32; 1090 } else 1091 tap->wr_tsft &= 0xffffffff00000000; 1092 tap->wr_tsft += stat->rxdw5; 1093 1094 /* XXX 20/40? */ 1095 /* XXX shortgi? */ 1096 1097 /* Map HW rate index to 802.11 rate. */ 1098 if (!(rxdw3 & R92C_RXDW3_HT)) { 1099 tap->wr_rate = ridx2rate[rate]; 1100 } else if (rate >= 12) { /* MCS0~15. */ 1101 /* Bit 7 set means HT MCS instead of rate. */ 1102 tap->wr_rate = 0x80 | (rate - 12); 1103 } 1104 1105 /* XXX TODO: this isn't right; should use the last good RSSI */ 1106 tap->wr_dbm_antsignal = rssi; 1107 tap->wr_dbm_antnoise = URTWN_NOISE_FLOOR; 1108 } 1109 1110 *rssi_p = rssi; 1111 1112 /* Drop descriptor. */ 1113 m_adj(m, sizeof(*stat) + infosz); 1114 wh = mtod(m, struct ieee80211_frame_min *); 1115 1116 if ((wh->i_fc[1] & IEEE80211_FC1_PROTECTED) && 1117 cipher != R92C_CAM_ALGO_NONE) { 1118 m->m_flags |= M_WEP; 1119 } 1120 1121 if (m->m_len >= sizeof(*wh)) 1122 return (ieee80211_find_rxnode(ic, wh)); 1123 1124 return (NULL); 1125 } 1126 1127 static void 1128 urtwn_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error) 1129 { 1130 struct urtwn_softc *sc = usbd_xfer_softc(xfer); 1131 struct ieee80211com *ic = &sc->sc_ic; 1132 struct ieee80211_node *ni; 1133 struct mbuf *m = NULL, *next; 1134 struct urtwn_data *data; 1135 int8_t nf, rssi; 1136 1137 URTWN_ASSERT_LOCKED(sc); 1138 1139 switch (USB_GET_STATE(xfer)) { 1140 case USB_ST_TRANSFERRED: 1141 data = STAILQ_FIRST(&sc->sc_rx_active); 1142 if (data == NULL) 1143 goto tr_setup; 1144 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); 1145 m = urtwn_report_intr(xfer, data); 1146 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); 1147 /* FALLTHROUGH */ 1148 case USB_ST_SETUP: 1149 tr_setup: 1150 data = STAILQ_FIRST(&sc->sc_rx_inactive); 1151 if (data == NULL) { 1152 KASSERT(m == NULL, ("mbuf isn't NULL")); 1153 goto finish; 1154 } 1155 STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next); 1156 STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next); 1157 usbd_xfer_set_frame_data(xfer, 0, data->buf, 1158 usbd_xfer_max_len(xfer)); 1159 usbd_transfer_submit(xfer); 1160 1161 /* 1162 * To avoid LOR we should unlock our private mutex here to call 1163 * ieee80211_input() because here is at the end of a USB 1164 * callback and safe to unlock. 1165 */ 1166 while (m != NULL) { 1167 next = m->m_next; 1168 m->m_next = NULL; 1169 1170 ni = urtwn_rx_frame(sc, m, &rssi); 1171 1172 /* Store a global last-good RSSI */ 1173 if (rssi != -127) 1174 sc->last_rssi = rssi; 1175 1176 URTWN_UNLOCK(sc); 1177 1178 nf = URTWN_NOISE_FLOOR; 1179 if (ni != NULL) { 1180 if (rssi != -127) 1181 URTWN_NODE(ni)->last_rssi = rssi; 1182 if (ni->ni_flags & IEEE80211_NODE_HT) 1183 m->m_flags |= M_AMPDU; 1184 (void)ieee80211_input(ni, m, 1185 URTWN_NODE(ni)->last_rssi - nf, nf); 1186 ieee80211_free_node(ni); 1187 } else { 1188 /* Use last good global RSSI */ 1189 (void)ieee80211_input_all(ic, m, 1190 sc->last_rssi - nf, nf); 1191 } 1192 URTWN_LOCK(sc); 1193 m = next; 1194 } 1195 break; 1196 default: 1197 /* needs it to the inactive queue due to a error. */ 1198 data = STAILQ_FIRST(&sc->sc_rx_active); 1199 if (data != NULL) { 1200 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next); 1201 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next); 1202 } 1203 if (error != USB_ERR_CANCELLED) { 1204 usbd_xfer_set_stall(xfer); 1205 #if defined(__DragonFly__) 1206 /* unimplemented */ 1207 #else 1208 counter_u64_add(ic->ic_ierrors, 1); 1209 #endif 1210 goto tr_setup; 1211 } 1212 break; 1213 } 1214 finish: 1215 /* Finished receive; age anything left on the FF queue by a little bump */ 1216 /* 1217 * XXX TODO: just make this a callout timer schedule so we can 1218 * flush the FF staging queue if we're approaching idle. 1219 */ 1220 #ifdef IEEE80211_SUPPORT_SUPERG 1221 URTWN_UNLOCK(sc); 1222 ieee80211_ff_age_all(ic, 1); 1223 URTWN_LOCK(sc); 1224 #endif 1225 1226 /* Kick-start more transmit in case we stalled */ 1227 urtwn_start(sc); 1228 } 1229 1230 static void 1231 urtwn_txeof(struct urtwn_softc *sc, struct urtwn_data *data, int status) 1232 { 1233 1234 URTWN_ASSERT_LOCKED(sc); 1235 1236 if (data->ni != NULL) /* not a beacon frame */ 1237 ieee80211_tx_complete(data->ni, data->m, status); 1238 1239 if (sc->sc_tx_n_active > 0) 1240 sc->sc_tx_n_active--; 1241 1242 data->ni = NULL; 1243 data->m = NULL; 1244 1245 sc->sc_txtimer = 0; 1246 1247 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next); 1248 } 1249 1250 static int 1251 urtwn_alloc_list(struct urtwn_softc *sc, struct urtwn_data data[], 1252 int ndata, int maxsz) 1253 { 1254 int i, error; 1255 1256 for (i = 0; i < ndata; i++) { 1257 struct urtwn_data *dp = &data[i]; 1258 dp->sc = sc; 1259 dp->m = NULL; 1260 dp->buf = kmalloc(maxsz, M_USBDEV, M_INTWAIT); 1261 if (dp->buf == NULL) { 1262 device_printf(sc->sc_dev, 1263 "could not allocate buffer\n"); 1264 error = ENOMEM; 1265 goto fail; 1266 } 1267 dp->ni = NULL; 1268 } 1269 1270 return (0); 1271 fail: 1272 urtwn_free_list(sc, data, ndata); 1273 return (error); 1274 } 1275 1276 static int 1277 urtwn_alloc_rx_list(struct urtwn_softc *sc) 1278 { 1279 int error, i; 1280 1281 error = urtwn_alloc_list(sc, sc->sc_rx, URTWN_RX_LIST_COUNT, 1282 URTWN_RXBUFSZ); 1283 if (error != 0) 1284 return (error); 1285 1286 STAILQ_INIT(&sc->sc_rx_active); 1287 STAILQ_INIT(&sc->sc_rx_inactive); 1288 1289 for (i = 0; i < URTWN_RX_LIST_COUNT; i++) 1290 STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next); 1291 1292 return (0); 1293 } 1294 1295 static int 1296 urtwn_alloc_tx_list(struct urtwn_softc *sc) 1297 { 1298 int error, i; 1299 1300 error = urtwn_alloc_list(sc, sc->sc_tx, URTWN_TX_LIST_COUNT, 1301 URTWN_TXBUFSZ); 1302 if (error != 0) 1303 return (error); 1304 1305 STAILQ_INIT(&sc->sc_tx_active); 1306 STAILQ_INIT(&sc->sc_tx_inactive); 1307 STAILQ_INIT(&sc->sc_tx_pending); 1308 1309 for (i = 0; i < URTWN_TX_LIST_COUNT; i++) 1310 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i], next); 1311 1312 return (0); 1313 } 1314 1315 static void 1316 urtwn_free_list(struct urtwn_softc *sc, struct urtwn_data data[], int ndata) 1317 { 1318 int i; 1319 1320 for (i = 0; i < ndata; i++) { 1321 struct urtwn_data *dp = &data[i]; 1322 1323 if (dp->buf != NULL) { 1324 kfree(dp->buf, M_USBDEV); 1325 dp->buf = NULL; 1326 } 1327 if (dp->ni != NULL) { 1328 ieee80211_free_node(dp->ni); 1329 dp->ni = NULL; 1330 } 1331 } 1332 } 1333 1334 static void 1335 urtwn_free_rx_list(struct urtwn_softc *sc) 1336 { 1337 urtwn_free_list(sc, sc->sc_rx, URTWN_RX_LIST_COUNT); 1338 } 1339 1340 static void 1341 urtwn_free_tx_list(struct urtwn_softc *sc) 1342 { 1343 urtwn_free_list(sc, sc->sc_tx, URTWN_TX_LIST_COUNT); 1344 } 1345 1346 static void 1347 urtwn_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error) 1348 { 1349 struct urtwn_softc *sc = usbd_xfer_softc(xfer); 1350 #ifdef IEEE80211_SUPPORT_SUPERG 1351 struct ieee80211com *ic = &sc->sc_ic; 1352 #endif 1353 struct urtwn_data *data; 1354 1355 URTWN_ASSERT_LOCKED(sc); 1356 1357 switch (USB_GET_STATE(xfer)){ 1358 case USB_ST_TRANSFERRED: 1359 data = STAILQ_FIRST(&sc->sc_tx_active); 1360 if (data == NULL) 1361 goto tr_setup; 1362 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next); 1363 urtwn_txeof(sc, data, 0); 1364 /* FALLTHROUGH */ 1365 case USB_ST_SETUP: 1366 tr_setup: 1367 data = STAILQ_FIRST(&sc->sc_tx_pending); 1368 if (data == NULL) { 1369 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, 1370 "%s: empty pending queue\n", __func__); 1371 sc->sc_tx_n_active = 0; 1372 goto finish; 1373 } 1374 STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next); 1375 STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next); 1376 usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen); 1377 usbd_transfer_submit(xfer); 1378 sc->sc_tx_n_active++; 1379 break; 1380 default: 1381 data = STAILQ_FIRST(&sc->sc_tx_active); 1382 if (data == NULL) 1383 goto tr_setup; 1384 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next); 1385 urtwn_txeof(sc, data, 1); 1386 if (error != USB_ERR_CANCELLED) { 1387 usbd_xfer_set_stall(xfer); 1388 goto tr_setup; 1389 } 1390 break; 1391 } 1392 finish: 1393 #ifdef IEEE80211_SUPPORT_SUPERG 1394 /* 1395 * If the TX active queue drops below a certain 1396 * threshold, ensure we age fast-frames out so they're 1397 * transmitted. 1398 */ 1399 if (sc->sc_tx_n_active <= 1) { 1400 /* XXX ew - net80211 should defer this for us! */ 1401 1402 /* 1403 * Note: this sc_tx_n_active currently tracks 1404 * the number of pending transmit submissions 1405 * and not the actual depth of the TX frames 1406 * pending to the hardware. That means that 1407 * we're going to end up with some sub-optimal 1408 * aggregation behaviour. 1409 */ 1410 /* 1411 * XXX TODO: just make this a callout timer schedule so we can 1412 * flush the FF staging queue if we're approaching idle. 1413 */ 1414 URTWN_UNLOCK(sc); 1415 ieee80211_ff_flush(ic, WME_AC_VO); 1416 ieee80211_ff_flush(ic, WME_AC_VI); 1417 ieee80211_ff_flush(ic, WME_AC_BE); 1418 ieee80211_ff_flush(ic, WME_AC_BK); 1419 URTWN_LOCK(sc); 1420 } 1421 #endif 1422 /* Kick-start more transmit */ 1423 urtwn_start(sc); 1424 } 1425 1426 static struct urtwn_data * 1427 _urtwn_getbuf(struct urtwn_softc *sc) 1428 { 1429 struct urtwn_data *bf; 1430 1431 bf = STAILQ_FIRST(&sc->sc_tx_inactive); 1432 if (bf != NULL) 1433 STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next); 1434 else { 1435 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, 1436 "%s: out of xmit buffers\n", __func__); 1437 } 1438 return (bf); 1439 } 1440 1441 static struct urtwn_data * 1442 urtwn_getbuf(struct urtwn_softc *sc) 1443 { 1444 struct urtwn_data *bf; 1445 1446 URTWN_ASSERT_LOCKED(sc); 1447 1448 bf = _urtwn_getbuf(sc); 1449 if (bf == NULL) { 1450 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: stop queue\n", 1451 __func__); 1452 } 1453 return (bf); 1454 } 1455 1456 static usb_error_t 1457 urtwn_write_region_1(struct urtwn_softc *sc, uint16_t addr, uint8_t *buf, 1458 int len) 1459 { 1460 usb_device_request_t req; 1461 1462 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1463 req.bRequest = R92C_REQ_REGS; 1464 USETW(req.wValue, addr); 1465 USETW(req.wIndex, 0); 1466 USETW(req.wLength, len); 1467 return (urtwn_do_request(sc, &req, buf)); 1468 } 1469 1470 static usb_error_t 1471 urtwn_write_1(struct urtwn_softc *sc, uint16_t addr, uint8_t val) 1472 { 1473 return (urtwn_write_region_1(sc, addr, &val, sizeof(val))); 1474 } 1475 1476 static usb_error_t 1477 urtwn_write_2(struct urtwn_softc *sc, uint16_t addr, uint16_t val) 1478 { 1479 val = htole16(val); 1480 return (urtwn_write_region_1(sc, addr, (uint8_t *)&val, sizeof(val))); 1481 } 1482 1483 static usb_error_t 1484 urtwn_write_4(struct urtwn_softc *sc, uint16_t addr, uint32_t val) 1485 { 1486 val = htole32(val); 1487 return (urtwn_write_region_1(sc, addr, (uint8_t *)&val, sizeof(val))); 1488 } 1489 1490 static usb_error_t 1491 urtwn_read_region_1(struct urtwn_softc *sc, uint16_t addr, uint8_t *buf, 1492 int len) 1493 { 1494 usb_device_request_t req; 1495 1496 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1497 req.bRequest = R92C_REQ_REGS; 1498 USETW(req.wValue, addr); 1499 USETW(req.wIndex, 0); 1500 USETW(req.wLength, len); 1501 return (urtwn_do_request(sc, &req, buf)); 1502 } 1503 1504 static uint8_t 1505 urtwn_read_1(struct urtwn_softc *sc, uint16_t addr) 1506 { 1507 uint8_t val; 1508 1509 if (urtwn_read_region_1(sc, addr, &val, 1) != 0) 1510 return (0xff); 1511 return (val); 1512 } 1513 1514 static uint16_t 1515 urtwn_read_2(struct urtwn_softc *sc, uint16_t addr) 1516 { 1517 uint16_t val; 1518 1519 if (urtwn_read_region_1(sc, addr, (uint8_t *)&val, 2) != 0) 1520 return (0xffff); 1521 return (le16toh(val)); 1522 } 1523 1524 static uint32_t 1525 urtwn_read_4(struct urtwn_softc *sc, uint16_t addr) 1526 { 1527 uint32_t val; 1528 1529 if (urtwn_read_region_1(sc, addr, (uint8_t *)&val, 4) != 0) 1530 return (0xffffffff); 1531 return (le32toh(val)); 1532 } 1533 1534 static int 1535 urtwn_fw_cmd(struct urtwn_softc *sc, uint8_t id, const void *buf, int len) 1536 { 1537 struct r92c_fw_cmd cmd; 1538 usb_error_t error; 1539 int ntries; 1540 1541 if (!(sc->sc_flags & URTWN_FW_LOADED)) { 1542 URTWN_DPRINTF(sc, URTWN_DEBUG_FIRMWARE, "%s: firmware " 1543 "was not loaded; command (id %d) will be discarded\n", 1544 __func__, id); 1545 return (0); 1546 } 1547 1548 /* Wait for current FW box to be empty. */ 1549 for (ntries = 0; ntries < 100; ntries++) { 1550 if (!(urtwn_read_1(sc, R92C_HMETFR) & (1 << sc->fwcur))) 1551 break; 1552 urtwn_ms_delay(sc); 1553 } 1554 if (ntries == 100) { 1555 device_printf(sc->sc_dev, 1556 "could not send firmware command\n"); 1557 return (ETIMEDOUT); 1558 } 1559 memset(&cmd, 0, sizeof(cmd)); 1560 cmd.id = id; 1561 if (len > 3) 1562 cmd.id |= R92C_CMD_FLAG_EXT; 1563 KASSERT(len <= sizeof(cmd.msg), ("urtwn_fw_cmd\n")); 1564 memcpy(cmd.msg, buf, len); 1565 1566 /* Write the first word last since that will trigger the FW. */ 1567 error = urtwn_write_region_1(sc, R92C_HMEBOX_EXT(sc->fwcur), 1568 (uint8_t *)&cmd + 4, 2); 1569 if (error != USB_ERR_NORMAL_COMPLETION) 1570 return (EIO); 1571 error = urtwn_write_region_1(sc, R92C_HMEBOX(sc->fwcur), 1572 (uint8_t *)&cmd + 0, 4); 1573 if (error != USB_ERR_NORMAL_COMPLETION) 1574 return (EIO); 1575 1576 sc->fwcur = (sc->fwcur + 1) % R92C_H2C_NBOX; 1577 return (0); 1578 } 1579 1580 static void 1581 urtwn_cmdq_cb(void *arg, int pending) 1582 { 1583 struct urtwn_softc *sc = arg; 1584 struct urtwn_cmdq *item; 1585 1586 /* 1587 * Device must be powered on (via urtwn_power_on()) 1588 * before any command may be sent. 1589 */ 1590 URTWN_LOCK(sc); 1591 if (!(sc->sc_flags & URTWN_RUNNING)) { 1592 URTWN_UNLOCK(sc); 1593 return; 1594 } 1595 1596 URTWN_CMDQ_LOCK(sc); 1597 while (sc->cmdq[sc->cmdq_first].func != NULL) { 1598 item = &sc->cmdq[sc->cmdq_first]; 1599 sc->cmdq_first = (sc->cmdq_first + 1) % URTWN_CMDQ_SIZE; 1600 URTWN_CMDQ_UNLOCK(sc); 1601 1602 item->func(sc, &item->data); 1603 1604 URTWN_CMDQ_LOCK(sc); 1605 memset(item, 0, sizeof (*item)); 1606 } 1607 URTWN_CMDQ_UNLOCK(sc); 1608 URTWN_UNLOCK(sc); 1609 } 1610 1611 static int 1612 urtwn_cmd_sleepable(struct urtwn_softc *sc, const void *ptr, size_t len, 1613 CMD_FUNC_PROTO) 1614 { 1615 struct ieee80211com *ic = &sc->sc_ic; 1616 1617 KASSERT(len <= sizeof(union sec_param), ("buffer overflow")); 1618 1619 URTWN_CMDQ_LOCK(sc); 1620 if (sc->cmdq[sc->cmdq_last].func != NULL) { 1621 device_printf(sc->sc_dev, "%s: cmdq overflow\n", __func__); 1622 URTWN_CMDQ_UNLOCK(sc); 1623 1624 return (EAGAIN); 1625 } 1626 1627 if (ptr != NULL) 1628 memcpy(&sc->cmdq[sc->cmdq_last].data, ptr, len); 1629 sc->cmdq[sc->cmdq_last].func = func; 1630 sc->cmdq_last = (sc->cmdq_last + 1) % URTWN_CMDQ_SIZE; 1631 URTWN_CMDQ_UNLOCK(sc); 1632 1633 ieee80211_runtask(ic, &sc->cmdq_task); 1634 1635 return (0); 1636 } 1637 1638 static __inline void 1639 urtwn_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr, uint32_t val) 1640 { 1641 1642 sc->sc_rf_write(sc, chain, addr, val); 1643 } 1644 1645 static void 1646 urtwn_r92c_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr, 1647 uint32_t val) 1648 { 1649 urtwn_bb_write(sc, R92C_LSSI_PARAM(chain), 1650 SM(R92C_LSSI_PARAM_ADDR, addr) | 1651 SM(R92C_LSSI_PARAM_DATA, val)); 1652 } 1653 1654 static void 1655 urtwn_r88e_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr, 1656 uint32_t val) 1657 { 1658 urtwn_bb_write(sc, R92C_LSSI_PARAM(chain), 1659 SM(R88E_LSSI_PARAM_ADDR, addr) | 1660 SM(R92C_LSSI_PARAM_DATA, val)); 1661 } 1662 1663 static uint32_t 1664 urtwn_rf_read(struct urtwn_softc *sc, int chain, uint8_t addr) 1665 { 1666 uint32_t reg[R92C_MAX_CHAINS], val; 1667 1668 reg[0] = urtwn_bb_read(sc, R92C_HSSI_PARAM2(0)); 1669 if (chain != 0) 1670 reg[chain] = urtwn_bb_read(sc, R92C_HSSI_PARAM2(chain)); 1671 1672 urtwn_bb_write(sc, R92C_HSSI_PARAM2(0), 1673 reg[0] & ~R92C_HSSI_PARAM2_READ_EDGE); 1674 urtwn_ms_delay(sc); 1675 1676 urtwn_bb_write(sc, R92C_HSSI_PARAM2(chain), 1677 RW(reg[chain], R92C_HSSI_PARAM2_READ_ADDR, addr) | 1678 R92C_HSSI_PARAM2_READ_EDGE); 1679 urtwn_ms_delay(sc); 1680 1681 urtwn_bb_write(sc, R92C_HSSI_PARAM2(0), 1682 reg[0] | R92C_HSSI_PARAM2_READ_EDGE); 1683 urtwn_ms_delay(sc); 1684 1685 if (urtwn_bb_read(sc, R92C_HSSI_PARAM1(chain)) & R92C_HSSI_PARAM1_PI) 1686 val = urtwn_bb_read(sc, R92C_HSPI_READBACK(chain)); 1687 else 1688 val = urtwn_bb_read(sc, R92C_LSSI_READBACK(chain)); 1689 return (MS(val, R92C_LSSI_READBACK_DATA)); 1690 } 1691 1692 static int 1693 urtwn_llt_write(struct urtwn_softc *sc, uint32_t addr, uint32_t data) 1694 { 1695 usb_error_t error; 1696 int ntries; 1697 1698 error = urtwn_write_4(sc, R92C_LLT_INIT, 1699 SM(R92C_LLT_INIT_OP, R92C_LLT_INIT_OP_WRITE) | 1700 SM(R92C_LLT_INIT_ADDR, addr) | 1701 SM(R92C_LLT_INIT_DATA, data)); 1702 if (error != USB_ERR_NORMAL_COMPLETION) 1703 return (EIO); 1704 /* Wait for write operation to complete. */ 1705 for (ntries = 0; ntries < 20; ntries++) { 1706 if (MS(urtwn_read_4(sc, R92C_LLT_INIT), R92C_LLT_INIT_OP) == 1707 R92C_LLT_INIT_OP_NO_ACTIVE) 1708 return (0); 1709 urtwn_ms_delay(sc); 1710 } 1711 return (ETIMEDOUT); 1712 } 1713 1714 static int 1715 urtwn_efuse_read_next(struct urtwn_softc *sc, uint8_t *val) 1716 { 1717 uint32_t reg; 1718 usb_error_t error; 1719 int ntries; 1720 1721 if (sc->last_rom_addr >= URTWN_EFUSE_MAX_LEN) 1722 return (EFAULT); 1723 1724 reg = urtwn_read_4(sc, R92C_EFUSE_CTRL); 1725 reg = RW(reg, R92C_EFUSE_CTRL_ADDR, sc->last_rom_addr); 1726 reg &= ~R92C_EFUSE_CTRL_VALID; 1727 1728 error = urtwn_write_4(sc, R92C_EFUSE_CTRL, reg); 1729 if (error != USB_ERR_NORMAL_COMPLETION) 1730 return (EIO); 1731 /* Wait for read operation to complete. */ 1732 for (ntries = 0; ntries < 100; ntries++) { 1733 reg = urtwn_read_4(sc, R92C_EFUSE_CTRL); 1734 if (reg & R92C_EFUSE_CTRL_VALID) 1735 break; 1736 urtwn_ms_delay(sc); 1737 } 1738 if (ntries == 100) { 1739 device_printf(sc->sc_dev, 1740 "could not read efuse byte at address 0x%x\n", 1741 sc->last_rom_addr); 1742 return (ETIMEDOUT); 1743 } 1744 1745 *val = MS(reg, R92C_EFUSE_CTRL_DATA); 1746 sc->last_rom_addr++; 1747 1748 return (0); 1749 } 1750 1751 static int 1752 urtwn_efuse_read_data(struct urtwn_softc *sc, uint8_t *rom, uint8_t off, 1753 uint8_t msk) 1754 { 1755 uint8_t reg; 1756 int i, error; 1757 1758 for (i = 0; i < 4; i++) { 1759 if (msk & (1 << i)) 1760 continue; 1761 error = urtwn_efuse_read_next(sc, ®); 1762 if (error != 0) 1763 return (error); 1764 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "rom[0x%03X] == 0x%02X\n", 1765 off * 8 + i * 2, reg); 1766 rom[off * 8 + i * 2 + 0] = reg; 1767 1768 error = urtwn_efuse_read_next(sc, ®); 1769 if (error != 0) 1770 return (error); 1771 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "rom[0x%03X] == 0x%02X\n", 1772 off * 8 + i * 2 + 1, reg); 1773 rom[off * 8 + i * 2 + 1] = reg; 1774 } 1775 1776 return (0); 1777 } 1778 1779 #ifdef USB_DEBUG 1780 static void 1781 urtwn_dump_rom_contents(struct urtwn_softc *sc, uint8_t *rom, uint16_t size) 1782 { 1783 int i; 1784 1785 /* Dump ROM contents. */ 1786 device_printf(sc->sc_dev, "%s:", __func__); 1787 for (i = 0; i < size; i++) { 1788 if (i % 32 == 0) 1789 kprintf("\n%03X: ", i); 1790 else if (i % 4 == 0) 1791 kprintf(" "); 1792 1793 kprintf("%02X", rom[i]); 1794 } 1795 kprintf("\n"); 1796 } 1797 #endif 1798 1799 static int 1800 urtwn_efuse_read(struct urtwn_softc *sc, uint8_t *rom, uint16_t size) 1801 { 1802 #define URTWN_CHK(res) do { \ 1803 if ((error = res) != 0) \ 1804 goto end; \ 1805 } while(0) 1806 uint8_t msk, off, reg; 1807 int error; 1808 1809 URTWN_CHK(urtwn_efuse_switch_power(sc)); 1810 1811 /* Read full ROM image. */ 1812 sc->last_rom_addr = 0; 1813 memset(rom, 0xff, size); 1814 1815 URTWN_CHK(urtwn_efuse_read_next(sc, ®)); 1816 while (reg != 0xff) { 1817 /* check for extended header */ 1818 if ((sc->chip & URTWN_CHIP_88E) && (reg & 0x1f) == 0x0f) { 1819 off = reg >> 5; 1820 URTWN_CHK(urtwn_efuse_read_next(sc, ®)); 1821 1822 if ((reg & 0x0f) != 0x0f) 1823 off = ((reg & 0xf0) >> 1) | off; 1824 else 1825 continue; 1826 } else 1827 off = reg >> 4; 1828 msk = reg & 0xf; 1829 1830 URTWN_CHK(urtwn_efuse_read_data(sc, rom, off, msk)); 1831 URTWN_CHK(urtwn_efuse_read_next(sc, ®)); 1832 } 1833 1834 end: 1835 1836 #ifdef USB_DEBUG 1837 if (sc->sc_debug & URTWN_DEBUG_ROM) 1838 urtwn_dump_rom_contents(sc, rom, size); 1839 #endif 1840 1841 urtwn_write_1(sc, R92C_EFUSE_ACCESS, R92C_EFUSE_ACCESS_OFF); 1842 1843 if (error != 0) { 1844 device_printf(sc->sc_dev, "%s: error while reading ROM\n", 1845 __func__); 1846 } 1847 1848 return (error); 1849 #undef URTWN_CHK 1850 } 1851 1852 static int 1853 urtwn_efuse_switch_power(struct urtwn_softc *sc) 1854 { 1855 usb_error_t error; 1856 uint32_t reg; 1857 1858 error = urtwn_write_1(sc, R92C_EFUSE_ACCESS, R92C_EFUSE_ACCESS_ON); 1859 if (error != USB_ERR_NORMAL_COMPLETION) 1860 return (EIO); 1861 1862 reg = urtwn_read_2(sc, R92C_SYS_ISO_CTRL); 1863 if (!(reg & R92C_SYS_ISO_CTRL_PWC_EV12V)) { 1864 error = urtwn_write_2(sc, R92C_SYS_ISO_CTRL, 1865 reg | R92C_SYS_ISO_CTRL_PWC_EV12V); 1866 if (error != USB_ERR_NORMAL_COMPLETION) 1867 return (EIO); 1868 } 1869 reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN); 1870 if (!(reg & R92C_SYS_FUNC_EN_ELDR)) { 1871 error = urtwn_write_2(sc, R92C_SYS_FUNC_EN, 1872 reg | R92C_SYS_FUNC_EN_ELDR); 1873 if (error != USB_ERR_NORMAL_COMPLETION) 1874 return (EIO); 1875 } 1876 reg = urtwn_read_2(sc, R92C_SYS_CLKR); 1877 if ((reg & (R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M)) != 1878 (R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M)) { 1879 error = urtwn_write_2(sc, R92C_SYS_CLKR, 1880 reg | R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M); 1881 if (error != USB_ERR_NORMAL_COMPLETION) 1882 return (EIO); 1883 } 1884 1885 return (0); 1886 } 1887 1888 static int 1889 urtwn_read_chipid(struct urtwn_softc *sc) 1890 { 1891 uint32_t reg; 1892 1893 if (sc->chip & URTWN_CHIP_88E) 1894 return (0); 1895 1896 reg = urtwn_read_4(sc, R92C_SYS_CFG); 1897 if (reg & R92C_SYS_CFG_TRP_VAUX_EN) 1898 return (EIO); 1899 1900 if (reg & R92C_SYS_CFG_TYPE_92C) { 1901 sc->chip |= URTWN_CHIP_92C; 1902 /* Check if it is a castrated 8192C. */ 1903 if (MS(urtwn_read_4(sc, R92C_HPON_FSM), 1904 R92C_HPON_FSM_CHIP_BONDING_ID) == 1905 R92C_HPON_FSM_CHIP_BONDING_ID_92C_1T2R) 1906 sc->chip |= URTWN_CHIP_92C_1T2R; 1907 } 1908 if (reg & R92C_SYS_CFG_VENDOR_UMC) { 1909 sc->chip |= URTWN_CHIP_UMC; 1910 if (MS(reg, R92C_SYS_CFG_CHIP_VER_RTL) == 0) 1911 sc->chip |= URTWN_CHIP_UMC_A_CUT; 1912 } 1913 return (0); 1914 } 1915 1916 static int 1917 urtwn_read_rom(struct urtwn_softc *sc) 1918 { 1919 struct r92c_rom *rom = &sc->rom.r92c_rom; 1920 int error; 1921 1922 /* Read full ROM image. */ 1923 error = urtwn_efuse_read(sc, (uint8_t *)rom, sizeof(*rom)); 1924 if (error != 0) 1925 return (error); 1926 1927 /* XXX Weird but this is what the vendor driver does. */ 1928 sc->last_rom_addr = 0x1fa; 1929 error = urtwn_efuse_read_next(sc, &sc->pa_setting); 1930 if (error != 0) 1931 return (error); 1932 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: PA setting=0x%x\n", __func__, 1933 sc->pa_setting); 1934 1935 sc->board_type = MS(rom->rf_opt1, R92C_ROM_RF1_BOARD_TYPE); 1936 1937 sc->regulatory = MS(rom->rf_opt1, R92C_ROM_RF1_REGULATORY); 1938 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: regulatory type=%d\n", 1939 __func__, sc->regulatory); 1940 IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr); 1941 1942 sc->sc_rf_write = urtwn_r92c_rf_write; 1943 sc->sc_power_on = urtwn_r92c_power_on; 1944 sc->sc_power_off = urtwn_r92c_power_off; 1945 1946 return (0); 1947 } 1948 1949 static int 1950 urtwn_r88e_read_rom(struct urtwn_softc *sc) 1951 { 1952 struct r88e_rom *rom = &sc->rom.r88e_rom; 1953 int error; 1954 1955 error = urtwn_efuse_read(sc, (uint8_t *)rom, sizeof(sc->rom.r88e_rom)); 1956 if (error != 0) 1957 return (error); 1958 1959 sc->bw20_tx_pwr_diff = (rom->tx_pwr_diff >> 4); 1960 if (sc->bw20_tx_pwr_diff & 0x08) 1961 sc->bw20_tx_pwr_diff |= 0xf0; 1962 sc->ofdm_tx_pwr_diff = (rom->tx_pwr_diff & 0xf); 1963 if (sc->ofdm_tx_pwr_diff & 0x08) 1964 sc->ofdm_tx_pwr_diff |= 0xf0; 1965 sc->regulatory = MS(rom->rf_board_opt, R92C_ROM_RF1_REGULATORY); 1966 URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: regulatory type %d\n", 1967 __func__,sc->regulatory); 1968 IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr); 1969 1970 sc->sc_rf_write = urtwn_r88e_rf_write; 1971 sc->sc_power_on = urtwn_r88e_power_on; 1972 sc->sc_power_off = urtwn_r88e_power_off; 1973 1974 return (0); 1975 } 1976 1977 static __inline uint8_t 1978 rate2ridx(uint8_t rate) 1979 { 1980 if (rate & IEEE80211_RATE_MCS) { 1981 /* 11n rates start at idx 12 */ 1982 return ((rate & 0xf) + 12); 1983 } 1984 switch (rate) { 1985 /* 11g */ 1986 case 12: return 4; 1987 case 18: return 5; 1988 case 24: return 6; 1989 case 36: return 7; 1990 case 48: return 8; 1991 case 72: return 9; 1992 case 96: return 10; 1993 case 108: return 11; 1994 /* 11b */ 1995 case 2: return 0; 1996 case 4: return 1; 1997 case 11: return 2; 1998 case 22: return 3; 1999 default: return URTWN_RIDX_UNKNOWN; 2000 } 2001 } 2002 2003 /* 2004 * Initialize rate adaptation in firmware. 2005 */ 2006 static int 2007 urtwn_ra_init(struct urtwn_softc *sc) 2008 { 2009 struct ieee80211com *ic = &sc->sc_ic; 2010 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); 2011 struct ieee80211_node *ni; 2012 struct ieee80211_rateset *rs, *rs_ht; 2013 struct r92c_fw_cmd_macid_cfg cmd; 2014 uint32_t rates, basicrates; 2015 uint8_t mode, ridx; 2016 int maxrate, maxbasicrate, error, i; 2017 2018 ni = ieee80211_ref_node(vap->iv_bss); 2019 rs = &ni->ni_rates; 2020 rs_ht = (struct ieee80211_rateset *) &ni->ni_htrates; 2021 2022 /* Get normal and basic rates mask. */ 2023 rates = basicrates = 0; 2024 maxrate = maxbasicrate = 0; 2025 2026 /* This is for 11bg */ 2027 for (i = 0; i < rs->rs_nrates; i++) { 2028 /* Convert 802.11 rate to HW rate index. */ 2029 ridx = rate2ridx(IEEE80211_RV(rs->rs_rates[i])); 2030 if (ridx == URTWN_RIDX_UNKNOWN) /* Unknown rate, skip. */ 2031 continue; 2032 rates |= 1 << ridx; 2033 if (ridx > maxrate) 2034 maxrate = ridx; 2035 if (rs->rs_rates[i] & IEEE80211_RATE_BASIC) { 2036 basicrates |= 1 << ridx; 2037 if (ridx > maxbasicrate) 2038 maxbasicrate = ridx; 2039 } 2040 } 2041 2042 /* If we're doing 11n, enable 11n rates */ 2043 if (ni->ni_flags & IEEE80211_NODE_HT) { 2044 for (i = 0; i < rs_ht->rs_nrates; i++) { 2045 if ((rs_ht->rs_rates[i] & 0x7f) > 0xf) 2046 continue; 2047 /* 11n rates start at index 12 */ 2048 ridx = ((rs_ht->rs_rates[i]) & 0xf) + 12; 2049 rates |= (1 << ridx); 2050 2051 /* Guard against the rate table being oddly ordered */ 2052 if (ridx > maxrate) 2053 maxrate = ridx; 2054 } 2055 } 2056 2057 #if 0 2058 if (ic->ic_curmode == IEEE80211_MODE_11NG) 2059 raid = R92C_RAID_11GN; 2060 #endif 2061 /* NB: group addressed frames are done at 11bg rates for now */ 2062 if (ic->ic_curmode == IEEE80211_MODE_11B) 2063 mode = R92C_RAID_11B; 2064 else 2065 mode = R92C_RAID_11BG; 2066 /* XXX misleading 'mode' value here for unicast frames */ 2067 URTWN_DPRINTF(sc, URTWN_DEBUG_RA, 2068 "%s: mode 0x%x, rates 0x%08x, basicrates 0x%08x\n", __func__, 2069 mode, rates, basicrates); 2070 2071 /* Set rates mask for group addressed frames. */ 2072 cmd.macid = URTWN_MACID_BC | URTWN_MACID_VALID; 2073 cmd.mask = htole32(mode << 28 | basicrates); 2074 error = urtwn_fw_cmd(sc, R92C_CMD_MACID_CONFIG, &cmd, sizeof(cmd)); 2075 if (error != 0) { 2076 ieee80211_free_node(ni); 2077 device_printf(sc->sc_dev, 2078 "could not add broadcast station\n"); 2079 return (error); 2080 } 2081 2082 /* Set initial MRR rate. */ 2083 URTWN_DPRINTF(sc, URTWN_DEBUG_RA, "%s: maxbasicrate %d\n", __func__, 2084 maxbasicrate); 2085 urtwn_write_1(sc, R92C_INIDATA_RATE_SEL(URTWN_MACID_BC), 2086 maxbasicrate); 2087 2088 /* Set rates mask for unicast frames. */ 2089 if (ni->ni_flags & IEEE80211_NODE_HT) 2090 mode = R92C_RAID_11GN; 2091 else if (ic->ic_curmode == IEEE80211_MODE_11B) 2092 mode = R92C_RAID_11B; 2093 else 2094 mode = R92C_RAID_11BG; 2095 cmd.macid = URTWN_MACID_BSS | URTWN_MACID_VALID; 2096 cmd.mask = htole32(mode << 28 | rates); 2097 error = urtwn_fw_cmd(sc, R92C_CMD_MACID_CONFIG, &cmd, sizeof(cmd)); 2098 if (error != 0) { 2099 ieee80211_free_node(ni); 2100 device_printf(sc->sc_dev, "could not add BSS station\n"); 2101 return (error); 2102 } 2103 /* Set initial MRR rate. */ 2104 URTWN_DPRINTF(sc, URTWN_DEBUG_RA, "%s: maxrate %d\n", __func__, 2105 maxrate); 2106 urtwn_write_1(sc, R92C_INIDATA_RATE_SEL(URTWN_MACID_BSS), 2107 maxrate); 2108 2109 /* Indicate highest supported rate. */ 2110 if (ni->ni_flags & IEEE80211_NODE_HT) 2111 ni->ni_txrate = rs_ht->rs_rates[rs_ht->rs_nrates - 1] 2112 | IEEE80211_RATE_MCS; 2113 else 2114 ni->ni_txrate = rs->rs_rates[rs->rs_nrates - 1]; 2115 ieee80211_free_node(ni); 2116 2117 return (0); 2118 } 2119 2120 static void 2121 urtwn_init_beacon(struct urtwn_softc *sc, struct urtwn_vap *uvp) 2122 { 2123 struct r92c_tx_desc *txd = &uvp->bcn_desc; 2124 2125 txd->txdw0 = htole32( 2126 SM(R92C_TXDW0_OFFSET, sizeof(*txd)) | R92C_TXDW0_BMCAST | 2127 R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG); 2128 txd->txdw1 = htole32( 2129 SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_BEACON) | 2130 SM(R92C_TXDW1_RAID, R92C_RAID_11B)); 2131 2132 if (sc->chip & URTWN_CHIP_88E) { 2133 txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, URTWN_MACID_BC)); 2134 txd->txdseq |= htole16(R88E_TXDSEQ_HWSEQ_EN); 2135 } else { 2136 txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, URTWN_MACID_BC)); 2137 txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN); 2138 } 2139 2140 txd->txdw4 = htole32(R92C_TXDW4_DRVRATE); 2141 txd->txdw5 = htole32(SM(R92C_TXDW5_DATARATE, URTWN_RIDX_CCK1)); 2142 } 2143 2144 static int 2145 urtwn_setup_beacon(struct urtwn_softc *sc, struct ieee80211_node *ni) 2146 { 2147 struct ieee80211vap *vap = ni->ni_vap; 2148 struct urtwn_vap *uvp = URTWN_VAP(vap); 2149 struct mbuf *m; 2150 int error; 2151 2152 URTWN_ASSERT_LOCKED(sc); 2153 2154 if (ni->ni_chan == IEEE80211_CHAN_ANYC) 2155 return (EINVAL); 2156 2157 m = ieee80211_beacon_alloc(ni); 2158 if (m == NULL) { 2159 device_printf(sc->sc_dev, 2160 "%s: could not allocate beacon frame\n", __func__); 2161 return (ENOMEM); 2162 } 2163 2164 if (uvp->bcn_mbuf != NULL) 2165 m_freem(uvp->bcn_mbuf); 2166 2167 uvp->bcn_mbuf = m; 2168 2169 if ((error = urtwn_tx_beacon(sc, uvp)) != 0) 2170 return (error); 2171 2172 /* XXX bcnq stuck workaround */ 2173 if ((error = urtwn_tx_beacon(sc, uvp)) != 0) 2174 return (error); 2175 2176 URTWN_DPRINTF(sc, URTWN_DEBUG_BEACON, "%s: beacon was %srecognized\n", 2177 __func__, urtwn_read_1(sc, R92C_TDECTRL + 2) & 2178 (R92C_TDECTRL_BCN_VALID >> 16) ? "" : "not "); 2179 2180 return (0); 2181 } 2182 2183 static void 2184 urtwn_update_beacon(struct ieee80211vap *vap, int item) 2185 { 2186 struct urtwn_softc *sc = vap->iv_ic->ic_softc; 2187 struct urtwn_vap *uvp = URTWN_VAP(vap); 2188 struct ieee80211_beacon_offsets *bo = &vap->iv_bcn_off; 2189 struct ieee80211_node *ni = vap->iv_bss; 2190 int mcast = 0; 2191 2192 URTWN_LOCK(sc); 2193 if (uvp->bcn_mbuf == NULL) { 2194 uvp->bcn_mbuf = ieee80211_beacon_alloc(ni); 2195 if (uvp->bcn_mbuf == NULL) { 2196 device_printf(sc->sc_dev, 2197 "%s: could not allocate beacon frame\n", __func__); 2198 URTWN_UNLOCK(sc); 2199 return; 2200 } 2201 } 2202 URTWN_UNLOCK(sc); 2203 2204 if (item == IEEE80211_BEACON_TIM) 2205 mcast = 1; /* XXX */ 2206 2207 setbit(bo->bo_flags, item); 2208 ieee80211_beacon_update(ni, uvp->bcn_mbuf, mcast); 2209 2210 URTWN_LOCK(sc); 2211 urtwn_tx_beacon(sc, uvp); 2212 URTWN_UNLOCK(sc); 2213 } 2214 2215 /* 2216 * Push a beacon frame into the chip. Beacon will 2217 * be repeated by the chip every R92C_BCN_INTERVAL. 2218 */ 2219 static int 2220 urtwn_tx_beacon(struct urtwn_softc *sc, struct urtwn_vap *uvp) 2221 { 2222 struct r92c_tx_desc *desc = &uvp->bcn_desc; 2223 struct urtwn_data *bf; 2224 2225 URTWN_ASSERT_LOCKED(sc); 2226 2227 bf = urtwn_getbuf(sc); 2228 if (bf == NULL) 2229 return (ENOMEM); 2230 2231 memcpy(bf->buf, desc, sizeof(*desc)); 2232 urtwn_tx_start(sc, uvp->bcn_mbuf, IEEE80211_FC0_TYPE_MGT, bf); 2233 2234 sc->sc_txtimer = 5; 2235 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc); 2236 2237 return (0); 2238 } 2239 2240 static int 2241 urtwn_key_alloc(struct ieee80211vap *vap, struct ieee80211_key *k, 2242 ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix) 2243 { 2244 struct urtwn_softc *sc = vap->iv_ic->ic_softc; 2245 uint8_t i; 2246 2247 if (!(&vap->iv_nw_keys[0] <= k && 2248 k < &vap->iv_nw_keys[IEEE80211_WEP_NKID])) { 2249 if (!(k->wk_flags & IEEE80211_KEY_SWCRYPT)) { 2250 URTWN_LOCK(sc); 2251 /* 2252 * First 4 slots for group keys, 2253 * what is left - for pairwise. 2254 * XXX incompatible with IBSS RSN. 2255 */ 2256 for (i = IEEE80211_WEP_NKID; 2257 i < R92C_CAM_ENTRY_COUNT; i++) { 2258 if ((sc->keys_bmap & (1 << i)) == 0) { 2259 sc->keys_bmap |= 1 << i; 2260 *keyix = i; 2261 break; 2262 } 2263 } 2264 URTWN_UNLOCK(sc); 2265 if (i == R92C_CAM_ENTRY_COUNT) { 2266 device_printf(sc->sc_dev, 2267 "%s: no free space in the key table\n", 2268 __func__); 2269 return 0; 2270 } 2271 } else 2272 *keyix = 0; 2273 } else { 2274 *keyix = k - vap->iv_nw_keys; 2275 } 2276 *rxkeyix = *keyix; 2277 return 1; 2278 } 2279 2280 static void 2281 urtwn_key_set_cb(struct urtwn_softc *sc, union sec_param *data) 2282 { 2283 struct ieee80211_key *k = &data->key; 2284 uint8_t algo, keyid; 2285 int i, error; 2286 2287 if (k->wk_keyix < IEEE80211_WEP_NKID) 2288 keyid = k->wk_keyix; 2289 else 2290 keyid = 0; 2291 2292 /* Map net80211 cipher to HW crypto algorithm. */ 2293 switch (k->wk_cipher->ic_cipher) { 2294 case IEEE80211_CIPHER_WEP: 2295 if (k->wk_keylen < 8) 2296 algo = R92C_CAM_ALGO_WEP40; 2297 else 2298 algo = R92C_CAM_ALGO_WEP104; 2299 break; 2300 case IEEE80211_CIPHER_TKIP: 2301 algo = R92C_CAM_ALGO_TKIP; 2302 break; 2303 case IEEE80211_CIPHER_AES_CCM: 2304 algo = R92C_CAM_ALGO_AES; 2305 break; 2306 default: 2307 device_printf(sc->sc_dev, "%s: undefined cipher %d\n", 2308 __func__, k->wk_cipher->ic_cipher); 2309 return; 2310 } 2311 2312 URTWN_DPRINTF(sc, URTWN_DEBUG_KEY, 2313 "%s: keyix %d, keyid %d, algo %d/%d, flags %04X, len %d, " 2314 "macaddr %s\n", __func__, k->wk_keyix, keyid, 2315 k->wk_cipher->ic_cipher, algo, k->wk_flags, k->wk_keylen, 2316 ether_sprintf(k->wk_macaddr)); 2317 2318 /* Write key. */ 2319 for (i = 0; i < 4; i++) { 2320 error = urtwn_cam_write(sc, R92C_CAM_KEY(k->wk_keyix, i), 2321 le32dec(&k->wk_key[i * 4])); 2322 if (error != 0) 2323 goto fail; 2324 } 2325 2326 /* Write CTL0 last since that will validate the CAM entry. */ 2327 error = urtwn_cam_write(sc, R92C_CAM_CTL1(k->wk_keyix), 2328 le32dec(&k->wk_macaddr[2])); 2329 if (error != 0) 2330 goto fail; 2331 error = urtwn_cam_write(sc, R92C_CAM_CTL0(k->wk_keyix), 2332 SM(R92C_CAM_ALGO, algo) | 2333 SM(R92C_CAM_KEYID, keyid) | 2334 SM(R92C_CAM_MACLO, le16dec(&k->wk_macaddr[0])) | 2335 R92C_CAM_VALID); 2336 if (error != 0) 2337 goto fail; 2338 2339 return; 2340 2341 fail: 2342 device_printf(sc->sc_dev, "%s fails, error %d\n", __func__, error); 2343 } 2344 2345 static void 2346 urtwn_key_del_cb(struct urtwn_softc *sc, union sec_param *data) 2347 { 2348 struct ieee80211_key *k = &data->key; 2349 int i; 2350 2351 URTWN_DPRINTF(sc, URTWN_DEBUG_KEY, 2352 "%s: keyix %d, flags %04X, macaddr %s\n", __func__, 2353 k->wk_keyix, k->wk_flags, ether_sprintf(k->wk_macaddr)); 2354 2355 urtwn_cam_write(sc, R92C_CAM_CTL0(k->wk_keyix), 0); 2356 urtwn_cam_write(sc, R92C_CAM_CTL1(k->wk_keyix), 0); 2357 2358 /* Clear key. */ 2359 for (i = 0; i < 4; i++) 2360 urtwn_cam_write(sc, R92C_CAM_KEY(k->wk_keyix, i), 0); 2361 sc->keys_bmap &= ~(1 << k->wk_keyix); 2362 } 2363 2364 static int 2365 urtwn_key_set(struct ieee80211vap *vap, const struct ieee80211_key *k) 2366 { 2367 struct urtwn_softc *sc = vap->iv_ic->ic_softc; 2368 2369 if (k->wk_flags & IEEE80211_KEY_SWCRYPT) { 2370 /* Not for us. */ 2371 return (1); 2372 } 2373 2374 return (!urtwn_cmd_sleepable(sc, k, sizeof(*k), urtwn_key_set_cb)); 2375 } 2376 2377 static int 2378 urtwn_key_delete(struct ieee80211vap *vap, const struct ieee80211_key *k) 2379 { 2380 struct urtwn_softc *sc = vap->iv_ic->ic_softc; 2381 2382 if (k->wk_flags & IEEE80211_KEY_SWCRYPT) { 2383 /* Not for us. */ 2384 return (1); 2385 } 2386 2387 return (!urtwn_cmd_sleepable(sc, k, sizeof(*k), urtwn_key_del_cb)); 2388 } 2389 2390 static void 2391 urtwn_tsf_task_adhoc(void *arg, int pending) 2392 { 2393 struct ieee80211vap *vap = arg; 2394 struct urtwn_softc *sc = vap->iv_ic->ic_softc; 2395 struct ieee80211_node *ni; 2396 uint32_t reg; 2397 2398 URTWN_LOCK(sc); 2399 ni = ieee80211_ref_node(vap->iv_bss); 2400 reg = urtwn_read_1(sc, R92C_BCN_CTRL); 2401 2402 /* Accept beacons with the same BSSID. */ 2403 urtwn_set_rx_bssid_all(sc, 0); 2404 2405 /* Enable synchronization. */ 2406 reg &= ~R92C_BCN_CTRL_DIS_TSF_UDT0; 2407 urtwn_write_1(sc, R92C_BCN_CTRL, reg); 2408 2409 /* Synchronize. */ 2410 usb_pause_mtx(&sc->sc_mtx, hz * ni->ni_intval * 5 / 1000); 2411 2412 /* Disable synchronization. */ 2413 reg |= R92C_BCN_CTRL_DIS_TSF_UDT0; 2414 urtwn_write_1(sc, R92C_BCN_CTRL, reg); 2415 2416 /* Remove beacon filter. */ 2417 urtwn_set_rx_bssid_all(sc, 1); 2418 2419 /* Enable beaconing. */ 2420 urtwn_write_1(sc, R92C_MBID_NUM, 2421 urtwn_read_1(sc, R92C_MBID_NUM) | R92C_MBID_TXBCN_RPT0); 2422 reg |= R92C_BCN_CTRL_EN_BCN; 2423 2424 urtwn_write_1(sc, R92C_BCN_CTRL, reg); 2425 ieee80211_free_node(ni); 2426 URTWN_UNLOCK(sc); 2427 } 2428 2429 static void 2430 urtwn_tsf_sync_enable(struct urtwn_softc *sc, struct ieee80211vap *vap) 2431 { 2432 struct ieee80211com *ic = &sc->sc_ic; 2433 struct urtwn_vap *uvp = URTWN_VAP(vap); 2434 2435 /* Reset TSF. */ 2436 urtwn_write_1(sc, R92C_DUAL_TSF_RST, R92C_DUAL_TSF_RST0); 2437 2438 switch (vap->iv_opmode) { 2439 case IEEE80211_M_STA: 2440 /* Enable TSF synchronization. */ 2441 urtwn_write_1(sc, R92C_BCN_CTRL, 2442 urtwn_read_1(sc, R92C_BCN_CTRL) & 2443 ~R92C_BCN_CTRL_DIS_TSF_UDT0); 2444 break; 2445 case IEEE80211_M_IBSS: 2446 ieee80211_runtask(ic, &uvp->tsf_task_adhoc); 2447 break; 2448 case IEEE80211_M_HOSTAP: 2449 /* Enable beaconing. */ 2450 urtwn_write_1(sc, R92C_MBID_NUM, 2451 urtwn_read_1(sc, R92C_MBID_NUM) | R92C_MBID_TXBCN_RPT0); 2452 urtwn_write_1(sc, R92C_BCN_CTRL, 2453 urtwn_read_1(sc, R92C_BCN_CTRL) | R92C_BCN_CTRL_EN_BCN); 2454 break; 2455 default: 2456 device_printf(sc->sc_dev, "undefined opmode %d\n", 2457 vap->iv_opmode); 2458 return; 2459 } 2460 } 2461 2462 static void 2463 urtwn_get_tsf(struct urtwn_softc *sc, uint64_t *buf) 2464 { 2465 urtwn_read_region_1(sc, R92C_TSFTR, (uint8_t *)buf, sizeof(*buf)); 2466 } 2467 2468 static void 2469 urtwn_set_led(struct urtwn_softc *sc, int led, int on) 2470 { 2471 uint8_t reg; 2472 2473 if (led == URTWN_LED_LINK) { 2474 if (sc->chip & URTWN_CHIP_88E) { 2475 reg = urtwn_read_1(sc, R92C_LEDCFG2) & 0xf0; 2476 urtwn_write_1(sc, R92C_LEDCFG2, reg | 0x60); 2477 if (!on) { 2478 reg = urtwn_read_1(sc, R92C_LEDCFG2) & 0x90; 2479 urtwn_write_1(sc, R92C_LEDCFG2, 2480 reg | R92C_LEDCFG0_DIS); 2481 urtwn_write_1(sc, R92C_MAC_PINMUX_CFG, 2482 urtwn_read_1(sc, R92C_MAC_PINMUX_CFG) & 2483 0xfe); 2484 } 2485 } else { 2486 reg = urtwn_read_1(sc, R92C_LEDCFG0) & 0x70; 2487 if (!on) 2488 reg |= R92C_LEDCFG0_DIS; 2489 urtwn_write_1(sc, R92C_LEDCFG0, reg); 2490 } 2491 sc->ledlink = on; /* Save LED state. */ 2492 } 2493 } 2494 2495 static void 2496 urtwn_set_mode(struct urtwn_softc *sc, uint8_t mode) 2497 { 2498 uint8_t reg; 2499 2500 reg = urtwn_read_1(sc, R92C_MSR); 2501 reg = (reg & ~R92C_MSR_MASK) | mode; 2502 urtwn_write_1(sc, R92C_MSR, reg); 2503 } 2504 2505 static void 2506 urtwn_ibss_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, int subtype, 2507 const struct ieee80211_rx_stats *rxs, 2508 int rssi, int nf) 2509 { 2510 struct ieee80211vap *vap = ni->ni_vap; 2511 struct urtwn_softc *sc = vap->iv_ic->ic_softc; 2512 struct urtwn_vap *uvp = URTWN_VAP(vap); 2513 uint64_t ni_tstamp, curr_tstamp; 2514 2515 uvp->recv_mgmt(ni, m, subtype, rxs, rssi, nf); 2516 2517 if (vap->iv_state == IEEE80211_S_RUN && 2518 (subtype == IEEE80211_FC0_SUBTYPE_BEACON || 2519 subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)) { 2520 ni_tstamp = le64toh(ni->ni_tstamp.tsf); 2521 URTWN_LOCK(sc); 2522 urtwn_get_tsf(sc, &curr_tstamp); 2523 URTWN_UNLOCK(sc); 2524 curr_tstamp = le64toh(curr_tstamp); 2525 2526 if (ni_tstamp >= curr_tstamp) 2527 (void) ieee80211_ibss_merge(ni); 2528 } 2529 } 2530 2531 static int 2532 urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) 2533 { 2534 struct urtwn_vap *uvp = URTWN_VAP(vap); 2535 struct ieee80211com *ic = vap->iv_ic; 2536 struct urtwn_softc *sc = ic->ic_softc; 2537 struct ieee80211_node *ni; 2538 enum ieee80211_state ostate; 2539 uint32_t reg; 2540 uint8_t mode; 2541 int error = 0; 2542 2543 ostate = vap->iv_state; 2544 URTWN_DPRINTF(sc, URTWN_DEBUG_STATE, "%s -> %s\n", 2545 ieee80211_state_name[ostate], ieee80211_state_name[nstate]); 2546 2547 IEEE80211_UNLOCK(ic); 2548 URTWN_LOCK(sc); 2549 callout_stop(&sc->sc_watchdog_ch); 2550 2551 if (ostate == IEEE80211_S_RUN) { 2552 /* Stop calibration. */ 2553 callout_stop(&sc->sc_calib_to); 2554 2555 /* Turn link LED off. */ 2556 urtwn_set_led(sc, URTWN_LED_LINK, 0); 2557 2558 /* Set media status to 'No Link'. */ 2559 urtwn_set_mode(sc, R92C_MSR_NOLINK); 2560 2561 /* Stop Rx of data frames. */ 2562 urtwn_write_2(sc, R92C_RXFLTMAP2, 0); 2563 2564 /* Disable TSF synchronization. */ 2565 urtwn_write_1(sc, R92C_BCN_CTRL, 2566 (urtwn_read_1(sc, R92C_BCN_CTRL) & ~R92C_BCN_CTRL_EN_BCN) | 2567 R92C_BCN_CTRL_DIS_TSF_UDT0); 2568 2569 /* Disable beaconing. */ 2570 urtwn_write_1(sc, R92C_MBID_NUM, 2571 urtwn_read_1(sc, R92C_MBID_NUM) & ~R92C_MBID_TXBCN_RPT0); 2572 2573 /* Reset TSF. */ 2574 urtwn_write_1(sc, R92C_DUAL_TSF_RST, R92C_DUAL_TSF_RST0); 2575 2576 /* Reset EDCA parameters. */ 2577 urtwn_write_4(sc, R92C_EDCA_VO_PARAM, 0x002f3217); 2578 urtwn_write_4(sc, R92C_EDCA_VI_PARAM, 0x005e4317); 2579 urtwn_write_4(sc, R92C_EDCA_BE_PARAM, 0x00105320); 2580 urtwn_write_4(sc, R92C_EDCA_BK_PARAM, 0x0000a444); 2581 } 2582 2583 switch (nstate) { 2584 case IEEE80211_S_INIT: 2585 /* Turn link LED off. */ 2586 urtwn_set_led(sc, URTWN_LED_LINK, 0); 2587 break; 2588 case IEEE80211_S_SCAN: 2589 /* Pause AC Tx queues. */ 2590 urtwn_write_1(sc, R92C_TXPAUSE, 2591 urtwn_read_1(sc, R92C_TXPAUSE) | R92C_TX_QUEUE_AC); 2592 break; 2593 case IEEE80211_S_AUTH: 2594 urtwn_set_chan(sc, ic->ic_curchan, NULL); 2595 break; 2596 case IEEE80211_S_RUN: 2597 if (vap->iv_opmode == IEEE80211_M_MONITOR) { 2598 /* Turn link LED on. */ 2599 urtwn_set_led(sc, URTWN_LED_LINK, 1); 2600 break; 2601 } 2602 2603 ni = ieee80211_ref_node(vap->iv_bss); 2604 2605 if (ic->ic_bsschan == IEEE80211_CHAN_ANYC || 2606 ni->ni_chan == IEEE80211_CHAN_ANYC) { 2607 device_printf(sc->sc_dev, 2608 "%s: could not move to RUN state\n", __func__); 2609 error = EINVAL; 2610 goto end_run; 2611 } 2612 2613 switch (vap->iv_opmode) { 2614 case IEEE80211_M_STA: 2615 mode = R92C_MSR_INFRA; 2616 break; 2617 case IEEE80211_M_IBSS: 2618 mode = R92C_MSR_ADHOC; 2619 break; 2620 case IEEE80211_M_HOSTAP: 2621 mode = R92C_MSR_AP; 2622 break; 2623 default: 2624 device_printf(sc->sc_dev, "undefined opmode %d\n", 2625 vap->iv_opmode); 2626 error = EINVAL; 2627 goto end_run; 2628 } 2629 2630 /* Set media status to 'Associated'. */ 2631 urtwn_set_mode(sc, mode); 2632 2633 /* Set BSSID. */ 2634 urtwn_write_4(sc, R92C_BSSID + 0, le32dec(&ni->ni_bssid[0])); 2635 urtwn_write_4(sc, R92C_BSSID + 4, le16dec(&ni->ni_bssid[4])); 2636 2637 if (ic->ic_curmode == IEEE80211_MODE_11B) 2638 urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0); 2639 else /* 802.11b/g */ 2640 urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 3); 2641 2642 /* Enable Rx of data frames. */ 2643 urtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff); 2644 2645 /* Flush all AC queues. */ 2646 urtwn_write_1(sc, R92C_TXPAUSE, 0); 2647 2648 /* Set beacon interval. */ 2649 urtwn_write_2(sc, R92C_BCN_INTERVAL, ni->ni_intval); 2650 2651 /* Allow Rx from our BSSID only. */ 2652 if (ic->ic_promisc == 0) { 2653 reg = urtwn_read_4(sc, R92C_RCR); 2654 2655 if (vap->iv_opmode != IEEE80211_M_HOSTAP) 2656 reg |= R92C_RCR_CBSSID_DATA; 2657 if (vap->iv_opmode != IEEE80211_M_IBSS) 2658 reg |= R92C_RCR_CBSSID_BCN; 2659 2660 urtwn_write_4(sc, R92C_RCR, reg); 2661 } 2662 2663 if (vap->iv_opmode == IEEE80211_M_HOSTAP || 2664 vap->iv_opmode == IEEE80211_M_IBSS) { 2665 error = urtwn_setup_beacon(sc, ni); 2666 if (error != 0) { 2667 device_printf(sc->sc_dev, 2668 "unable to push beacon into the chip, " 2669 "error %d\n", error); 2670 goto end_run; 2671 } 2672 } 2673 2674 /* Enable TSF synchronization. */ 2675 urtwn_tsf_sync_enable(sc, vap); 2676 2677 urtwn_write_1(sc, R92C_SIFS_CCK + 1, 10); 2678 urtwn_write_1(sc, R92C_SIFS_OFDM + 1, 10); 2679 urtwn_write_1(sc, R92C_SPEC_SIFS + 1, 10); 2680 urtwn_write_1(sc, R92C_MAC_SPEC_SIFS + 1, 10); 2681 urtwn_write_1(sc, R92C_R2T_SIFS + 1, 10); 2682 urtwn_write_1(sc, R92C_T2T_SIFS + 1, 10); 2683 2684 /* Intialize rate adaptation. */ 2685 if (!(sc->chip & URTWN_CHIP_88E)) 2686 urtwn_ra_init(sc); 2687 /* Turn link LED on. */ 2688 urtwn_set_led(sc, URTWN_LED_LINK, 1); 2689 2690 sc->avg_pwdb = -1; /* Reset average RSSI. */ 2691 /* Reset temperature calibration state machine. */ 2692 sc->sc_flags &= ~URTWN_TEMP_MEASURED; 2693 sc->thcal_lctemp = 0; 2694 /* Start periodic calibration. */ 2695 callout_reset(&sc->sc_calib_to, 2*hz, urtwn_calib_to, sc); 2696 2697 end_run: 2698 ieee80211_free_node(ni); 2699 break; 2700 default: 2701 break; 2702 } 2703 2704 URTWN_UNLOCK(sc); 2705 IEEE80211_LOCK(ic); 2706 return (error != 0 ? error : uvp->newstate(vap, nstate, arg)); 2707 } 2708 2709 static void 2710 urtwn_calib_to(void *arg) 2711 { 2712 struct urtwn_softc *sc = arg; 2713 2714 /* Do it in a process context. */ 2715 urtwn_cmd_sleepable(sc, NULL, 0, urtwn_calib_cb); 2716 } 2717 2718 static void 2719 urtwn_calib_cb(struct urtwn_softc *sc, union sec_param *data) 2720 { 2721 /* Do temperature compensation. */ 2722 urtwn_temp_calib(sc); 2723 2724 if ((urtwn_read_1(sc, R92C_MSR) & R92C_MSR_MASK) != R92C_MSR_NOLINK) 2725 callout_reset(&sc->sc_calib_to, 2*hz, urtwn_calib_to, sc); 2726 } 2727 2728 static void 2729 urtwn_watchdog(void *arg) 2730 { 2731 struct urtwn_softc *sc = arg; 2732 2733 if (sc->sc_txtimer > 0) { 2734 if (--sc->sc_txtimer == 0) { 2735 device_printf(sc->sc_dev, "device timeout\n"); 2736 #if defined(__DragonFly__) 2737 /* unimplemented */ 2738 #else 2739 counter_u64_add(sc->sc_ic.ic_oerrors, 1); 2740 #endif 2741 return; 2742 } 2743 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc); 2744 } 2745 } 2746 2747 static void 2748 urtwn_update_avgrssi(struct urtwn_softc *sc, int rate, int8_t rssi) 2749 { 2750 int pwdb; 2751 2752 /* Convert antenna signal to percentage. */ 2753 if (rssi <= -100 || rssi >= 20) 2754 pwdb = 0; 2755 else if (rssi >= 0) 2756 pwdb = 100; 2757 else 2758 pwdb = 100 + rssi; 2759 if (!(sc->chip & URTWN_CHIP_88E)) { 2760 if (rate <= URTWN_RIDX_CCK11) { 2761 /* CCK gain is smaller than OFDM/MCS gain. */ 2762 pwdb += 6; 2763 if (pwdb > 100) 2764 pwdb = 100; 2765 if (pwdb <= 14) 2766 pwdb -= 4; 2767 else if (pwdb <= 26) 2768 pwdb -= 8; 2769 else if (pwdb <= 34) 2770 pwdb -= 6; 2771 else if (pwdb <= 42) 2772 pwdb -= 2; 2773 } 2774 } 2775 if (sc->avg_pwdb == -1) /* Init. */ 2776 sc->avg_pwdb = pwdb; 2777 else if (sc->avg_pwdb < pwdb) 2778 sc->avg_pwdb = ((sc->avg_pwdb * 19 + pwdb) / 20) + 1; 2779 else 2780 sc->avg_pwdb = ((sc->avg_pwdb * 19 + pwdb) / 20); 2781 URTWN_DPRINTF(sc, URTWN_DEBUG_RSSI, "%s: PWDB %d, EMA %d\n", __func__, 2782 pwdb, sc->avg_pwdb); 2783 } 2784 2785 static int8_t 2786 urtwn_get_rssi(struct urtwn_softc *sc, int rate, void *physt) 2787 { 2788 static const int8_t cckoff[] = { 16, -12, -26, -46 }; 2789 struct r92c_rx_phystat *phy; 2790 struct r92c_rx_cck *cck; 2791 uint8_t rpt; 2792 int8_t rssi; 2793 2794 if (rate <= URTWN_RIDX_CCK11) { 2795 cck = (struct r92c_rx_cck *)physt; 2796 if (sc->sc_flags & URTWN_FLAG_CCK_HIPWR) { 2797 rpt = (cck->agc_rpt >> 5) & 0x3; 2798 rssi = (cck->agc_rpt & 0x1f) << 1; 2799 } else { 2800 rpt = (cck->agc_rpt >> 6) & 0x3; 2801 rssi = cck->agc_rpt & 0x3e; 2802 } 2803 rssi = cckoff[rpt] - rssi; 2804 } else { /* OFDM/HT. */ 2805 phy = (struct r92c_rx_phystat *)physt; 2806 rssi = ((le32toh(phy->phydw1) >> 1) & 0x7f) - 110; 2807 } 2808 return (rssi); 2809 } 2810 2811 static int8_t 2812 urtwn_r88e_get_rssi(struct urtwn_softc *sc, int rate, void *physt) 2813 { 2814 struct r92c_rx_phystat *phy; 2815 struct r88e_rx_cck *cck; 2816 uint8_t cck_agc_rpt, lna_idx, vga_idx; 2817 int8_t rssi; 2818 2819 rssi = 0; 2820 if (rate <= URTWN_RIDX_CCK11) { 2821 cck = (struct r88e_rx_cck *)physt; 2822 cck_agc_rpt = cck->agc_rpt; 2823 lna_idx = (cck_agc_rpt & 0xe0) >> 5; 2824 vga_idx = cck_agc_rpt & 0x1f; 2825 switch (lna_idx) { 2826 case 7: 2827 if (vga_idx <= 27) 2828 rssi = -100 + 2* (27 - vga_idx); 2829 else 2830 rssi = -100; 2831 break; 2832 case 6: 2833 rssi = -48 + 2 * (2 - vga_idx); 2834 break; 2835 case 5: 2836 rssi = -42 + 2 * (7 - vga_idx); 2837 break; 2838 case 4: 2839 rssi = -36 + 2 * (7 - vga_idx); 2840 break; 2841 case 3: 2842 rssi = -24 + 2 * (7 - vga_idx); 2843 break; 2844 case 2: 2845 rssi = -12 + 2 * (5 - vga_idx); 2846 break; 2847 case 1: 2848 rssi = 8 - (2 * vga_idx); 2849 break; 2850 case 0: 2851 rssi = 14 - (2 * vga_idx); 2852 break; 2853 } 2854 rssi += 6; 2855 } else { /* OFDM/HT. */ 2856 phy = (struct r92c_rx_phystat *)physt; 2857 rssi = ((le32toh(phy->phydw1) >> 1) & 0x7f) - 110; 2858 } 2859 return (rssi); 2860 } 2861 2862 static int 2863 urtwn_tx_data(struct urtwn_softc *sc, struct ieee80211_node *ni, 2864 struct mbuf *m, struct urtwn_data *data) 2865 { 2866 const struct ieee80211_txparam *tp; 2867 struct ieee80211com *ic = &sc->sc_ic; 2868 struct ieee80211vap *vap = ni->ni_vap; 2869 struct ieee80211_key *k = NULL; 2870 struct ieee80211_channel *chan; 2871 struct ieee80211_frame *wh; 2872 struct r92c_tx_desc *txd; 2873 uint8_t macid, raid, rate, ridx, subtype, type, tid, qsel; 2874 int hasqos, ismcast; 2875 2876 URTWN_ASSERT_LOCKED(sc); 2877 2878 /* 2879 * Software crypto. 2880 */ 2881 wh = mtod(m, struct ieee80211_frame *); 2882 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; 2883 subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; 2884 hasqos = IEEE80211_QOS_HAS_SEQ(wh); 2885 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1); 2886 2887 /* Select TX ring for this frame. */ 2888 if (hasqos) { 2889 tid = ((const struct ieee80211_qosframe *)wh)->i_qos[0]; 2890 tid &= IEEE80211_QOS_TID; 2891 } else 2892 tid = 0; 2893 2894 chan = (ni->ni_chan != IEEE80211_CHAN_ANYC) ? 2895 ni->ni_chan : ic->ic_curchan; 2896 tp = &vap->iv_txparms[ieee80211_chan2mode(chan)]; 2897 2898 /* Choose a TX rate index. */ 2899 if (type == IEEE80211_FC0_TYPE_MGT) 2900 rate = tp->mgmtrate; 2901 else if (ismcast) 2902 rate = tp->mcastrate; 2903 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) 2904 rate = tp->ucastrate; 2905 else if (m->m_flags & M_EAPOL) 2906 rate = tp->mgmtrate; 2907 else { 2908 if (URTWN_CHIP_HAS_RATECTL(sc)) { 2909 /* XXX pass pktlen */ 2910 (void) ieee80211_ratectl_rate(ni, NULL, 0); 2911 rate = ni->ni_txrate; 2912 } else { 2913 /* XXX TODO: drop the default rate for 11b/11g? */ 2914 if (ni->ni_flags & IEEE80211_NODE_HT) 2915 rate = IEEE80211_RATE_MCS | 0x4; /* MCS4 */ 2916 else if (ic->ic_curmode != IEEE80211_MODE_11B) 2917 rate = 108; 2918 else 2919 rate = 22; 2920 } 2921 } 2922 2923 /* 2924 * XXX TODO: this should be per-node, for 11b versus 11bg 2925 * nodes in hostap mode 2926 */ 2927 ridx = rate2ridx(rate); 2928 if (ni->ni_flags & IEEE80211_NODE_HT) 2929 raid = R92C_RAID_11GN; 2930 else if (ic->ic_curmode != IEEE80211_MODE_11B) 2931 raid = R92C_RAID_11BG; 2932 else 2933 raid = R92C_RAID_11B; 2934 2935 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) { 2936 k = ieee80211_crypto_encap(ni, m); 2937 if (k == NULL) { 2938 device_printf(sc->sc_dev, 2939 "ieee80211_crypto_encap returns NULL.\n"); 2940 return (ENOBUFS); 2941 } 2942 2943 /* in case packet header moved, reset pointer */ 2944 wh = mtod(m, struct ieee80211_frame *); 2945 } 2946 2947 /* Fill Tx descriptor. */ 2948 txd = (struct r92c_tx_desc *)data->buf; 2949 memset(txd, 0, sizeof(*txd)); 2950 2951 txd->txdw0 |= htole32( 2952 SM(R92C_TXDW0_OFFSET, sizeof(*txd)) | 2953 R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG); 2954 if (ismcast) 2955 txd->txdw0 |= htole32(R92C_TXDW0_BMCAST); 2956 2957 if (!ismcast) { 2958 if (sc->chip & URTWN_CHIP_88E) { 2959 struct urtwn_node *un = URTWN_NODE(ni); 2960 macid = un->id; 2961 } else 2962 macid = URTWN_MACID_BSS; 2963 2964 if (type == IEEE80211_FC0_TYPE_DATA) { 2965 qsel = tid % URTWN_MAX_TID; 2966 2967 if (sc->chip & URTWN_CHIP_88E) { 2968 txd->txdw2 |= htole32( 2969 R88E_TXDW2_AGGBK | 2970 R88E_TXDW2_CCX_RPT); 2971 } else 2972 txd->txdw1 |= htole32(R92C_TXDW1_AGGBK); 2973 2974 /* protmode, non-HT */ 2975 /* XXX TODO: noack frames? */ 2976 if ((rate & 0x80) == 0 && 2977 (ic->ic_flags & IEEE80211_F_USEPROT)) { 2978 switch (ic->ic_protmode) { 2979 case IEEE80211_PROT_CTSONLY: 2980 txd->txdw4 |= htole32( 2981 R92C_TXDW4_CTS2SELF | 2982 R92C_TXDW4_HWRTSEN); 2983 break; 2984 case IEEE80211_PROT_RTSCTS: 2985 txd->txdw4 |= htole32( 2986 R92C_TXDW4_RTSEN | 2987 R92C_TXDW4_HWRTSEN); 2988 break; 2989 default: 2990 break; 2991 } 2992 } 2993 2994 /* protmode, HT */ 2995 /* XXX TODO: noack frames? */ 2996 if ((rate & 0x80) && 2997 (ic->ic_htprotmode == IEEE80211_PROT_RTSCTS)) { 2998 txd->txdw4 |= htole32( 2999 R92C_TXDW4_RTSEN | 3000 R92C_TXDW4_HWRTSEN); 3001 } 3002 3003 /* XXX TODO: rtsrate is configurable? 24mbit may 3004 * be a bit high for RTS rate? */ 3005 txd->txdw4 |= htole32(SM(R92C_TXDW4_RTSRATE, 3006 URTWN_RIDX_OFDM24)); 3007 3008 txd->txdw5 |= htole32(0x0001ff00); 3009 } else /* IEEE80211_FC0_TYPE_MGT */ 3010 qsel = R92C_TXDW1_QSEL_MGNT; 3011 } else { 3012 macid = URTWN_MACID_BC; 3013 qsel = R92C_TXDW1_QSEL_MGNT; 3014 } 3015 3016 txd->txdw1 |= htole32( 3017 SM(R92C_TXDW1_QSEL, qsel) | 3018 SM(R92C_TXDW1_RAID, raid)); 3019 3020 /* XXX TODO: 40MHZ flag? */ 3021 /* XXX TODO: AMPDU flag? (AGG_ENABLE or AGG_BREAK?) Density shift? */ 3022 /* XXX Short preamble? */ 3023 /* XXX Short-GI? */ 3024 3025 if (sc->chip & URTWN_CHIP_88E) 3026 txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, macid)); 3027 else 3028 txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, macid)); 3029 3030 txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, ridx)); 3031 3032 /* Force this rate if needed. */ 3033 if (URTWN_CHIP_HAS_RATECTL(sc) || ismcast || 3034 (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) || 3035 (m->m_flags & M_EAPOL) || type != IEEE80211_FC0_TYPE_DATA) 3036 txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE); 3037 3038 if (!hasqos) { 3039 /* Use HW sequence numbering for non-QoS frames. */ 3040 if (sc->chip & URTWN_CHIP_88E) 3041 txd->txdseq = htole16(R88E_TXDSEQ_HWSEQ_EN); 3042 else 3043 txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN); 3044 } else { 3045 /* Set sequence number. */ 3046 txd->txdseq = htole16(M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE); 3047 } 3048 3049 if (k != NULL && !(k->wk_flags & IEEE80211_KEY_SWCRYPT)) { 3050 uint8_t cipher; 3051 3052 switch (k->wk_cipher->ic_cipher) { 3053 case IEEE80211_CIPHER_WEP: 3054 case IEEE80211_CIPHER_TKIP: 3055 cipher = R92C_TXDW1_CIPHER_RC4; 3056 break; 3057 case IEEE80211_CIPHER_AES_CCM: 3058 cipher = R92C_TXDW1_CIPHER_AES; 3059 break; 3060 default: 3061 device_printf(sc->sc_dev, "%s: unknown cipher %d\n", 3062 __func__, k->wk_cipher->ic_cipher); 3063 return (EINVAL); 3064 } 3065 3066 txd->txdw1 |= htole32(SM(R92C_TXDW1_CIPHER, cipher)); 3067 } 3068 3069 if (ieee80211_radiotap_active_vap(vap)) { 3070 struct urtwn_tx_radiotap_header *tap = &sc->sc_txtap; 3071 3072 tap->wt_flags = 0; 3073 if (k != NULL) 3074 tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; 3075 ieee80211_radiotap_tx(vap, m); 3076 } 3077 3078 data->ni = ni; 3079 3080 urtwn_tx_start(sc, m, type, data); 3081 3082 return (0); 3083 } 3084 3085 static int 3086 urtwn_tx_raw(struct urtwn_softc *sc, struct ieee80211_node *ni, 3087 struct mbuf *m, struct urtwn_data *data, 3088 const struct ieee80211_bpf_params *params) 3089 { 3090 struct ieee80211vap *vap = ni->ni_vap; 3091 struct ieee80211_key *k = NULL; 3092 struct ieee80211_frame *wh; 3093 struct r92c_tx_desc *txd; 3094 uint8_t cipher, ridx, type; 3095 3096 /* Encrypt the frame if need be. */ 3097 cipher = R92C_TXDW1_CIPHER_NONE; 3098 if (params->ibp_flags & IEEE80211_BPF_CRYPTO) { 3099 /* Retrieve key for TX. */ 3100 k = ieee80211_crypto_encap(ni, m); 3101 if (k == NULL) 3102 return (ENOBUFS); 3103 3104 if (!(k->wk_flags & IEEE80211_KEY_SWCRYPT)) { 3105 switch (k->wk_cipher->ic_cipher) { 3106 case IEEE80211_CIPHER_WEP: 3107 case IEEE80211_CIPHER_TKIP: 3108 cipher = R92C_TXDW1_CIPHER_RC4; 3109 break; 3110 case IEEE80211_CIPHER_AES_CCM: 3111 cipher = R92C_TXDW1_CIPHER_AES; 3112 break; 3113 default: 3114 device_printf(sc->sc_dev, 3115 "%s: unknown cipher %d\n", 3116 __func__, k->wk_cipher->ic_cipher); 3117 return (EINVAL); 3118 } 3119 } 3120 } 3121 3122 /* XXX TODO: 11n checks, matching urtwn_tx_data() */ 3123 3124 wh = mtod(m, struct ieee80211_frame *); 3125 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK; 3126 3127 /* Fill Tx descriptor. */ 3128 txd = (struct r92c_tx_desc *)data->buf; 3129 memset(txd, 0, sizeof(*txd)); 3130 3131 txd->txdw0 |= htole32( 3132 SM(R92C_TXDW0_OFFSET, sizeof(*txd)) | 3133 R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG); 3134 if (IEEE80211_IS_MULTICAST(wh->i_addr1)) 3135 txd->txdw0 |= htole32(R92C_TXDW0_BMCAST); 3136 3137 if (params->ibp_flags & IEEE80211_BPF_RTS) 3138 txd->txdw4 |= htole32(R92C_TXDW4_RTSEN); 3139 if (params->ibp_flags & IEEE80211_BPF_CTS) 3140 txd->txdw4 |= htole32(R92C_TXDW4_CTS2SELF); 3141 if (txd->txdw4 & htole32(R92C_TXDW4_RTSEN | R92C_TXDW4_CTS2SELF)) { 3142 txd->txdw4 |= htole32(R92C_TXDW4_HWRTSEN); 3143 txd->txdw4 |= htole32(SM(R92C_TXDW4_RTSRATE, 3144 URTWN_RIDX_OFDM24)); 3145 } 3146 3147 if (sc->chip & URTWN_CHIP_88E) 3148 txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, URTWN_MACID_BC)); 3149 else 3150 txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, URTWN_MACID_BC)); 3151 3152 /* XXX TODO: rate index/config (RAID) for 11n? */ 3153 txd->txdw1 |= htole32(SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_MGNT)); 3154 txd->txdw1 |= htole32(SM(R92C_TXDW1_CIPHER, cipher)); 3155 3156 /* Choose a TX rate index. */ 3157 ridx = rate2ridx(params->ibp_rate0); 3158 txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, ridx)); 3159 txd->txdw5 |= htole32(0x0001ff00); 3160 txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE); 3161 3162 if (!IEEE80211_QOS_HAS_SEQ(wh)) { 3163 /* Use HW sequence numbering for non-QoS frames. */ 3164 if (sc->chip & URTWN_CHIP_88E) 3165 txd->txdseq = htole16(R88E_TXDSEQ_HWSEQ_EN); 3166 else 3167 txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN); 3168 } else { 3169 /* Set sequence number. */ 3170 txd->txdseq = htole16(M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE); 3171 } 3172 3173 if (ieee80211_radiotap_active_vap(vap)) { 3174 struct urtwn_tx_radiotap_header *tap = &sc->sc_txtap; 3175 3176 tap->wt_flags = 0; 3177 if (k != NULL) 3178 tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP; 3179 ieee80211_radiotap_tx(vap, m); 3180 } 3181 3182 data->ni = ni; 3183 3184 urtwn_tx_start(sc, m, type, data); 3185 3186 return (0); 3187 } 3188 3189 static void 3190 urtwn_tx_start(struct urtwn_softc *sc, struct mbuf *m, uint8_t type, 3191 struct urtwn_data *data) 3192 { 3193 struct usb_xfer *xfer; 3194 struct r92c_tx_desc *txd; 3195 uint16_t ac, sum; 3196 int i, xferlen; 3197 3198 URTWN_ASSERT_LOCKED(sc); 3199 3200 ac = M_WME_GETAC(m); 3201 3202 switch (type) { 3203 case IEEE80211_FC0_TYPE_CTL: 3204 case IEEE80211_FC0_TYPE_MGT: 3205 xfer = sc->sc_xfer[URTWN_BULK_TX_VO]; 3206 break; 3207 default: 3208 xfer = sc->sc_xfer[wme2queue[ac].qid]; 3209 break; 3210 } 3211 3212 txd = (struct r92c_tx_desc *)data->buf; 3213 txd->txdw0 |= htole32(SM(R92C_TXDW0_PKTLEN, m->m_pkthdr.len)); 3214 3215 /* Compute Tx descriptor checksum. */ 3216 sum = 0; 3217 for (i = 0; i < sizeof(*txd) / 2; i++) 3218 sum ^= ((uint16_t *)txd)[i]; 3219 txd->txdsum = sum; /* NB: already little endian. */ 3220 3221 xferlen = sizeof(*txd) + m->m_pkthdr.len; 3222 m_copydata(m, 0, m->m_pkthdr.len, (caddr_t)&txd[1]); 3223 3224 data->buflen = xferlen; 3225 data->m = m; 3226 3227 STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next); 3228 usbd_transfer_start(xfer); 3229 } 3230 3231 static int 3232 urtwn_transmit(struct ieee80211com *ic, struct mbuf *m) 3233 { 3234 struct urtwn_softc *sc = ic->ic_softc; 3235 int error; 3236 3237 URTWN_LOCK(sc); 3238 if ((sc->sc_flags & URTWN_RUNNING) == 0) { 3239 URTWN_UNLOCK(sc); 3240 return (ENXIO); 3241 } 3242 error = mbufq_enqueue(&sc->sc_snd, m); 3243 if (error) { 3244 URTWN_UNLOCK(sc); 3245 return (error); 3246 } 3247 urtwn_start(sc); 3248 URTWN_UNLOCK(sc); 3249 3250 return (0); 3251 } 3252 3253 static void 3254 urtwn_start(struct urtwn_softc *sc) 3255 { 3256 struct ieee80211_node *ni; 3257 struct mbuf *m; 3258 struct urtwn_data *bf; 3259 3260 URTWN_ASSERT_LOCKED(sc); 3261 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { 3262 bf = urtwn_getbuf(sc); 3263 if (bf == NULL) { 3264 mbufq_prepend(&sc->sc_snd, m); 3265 break; 3266 } 3267 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; 3268 m->m_pkthdr.rcvif = NULL; 3269 3270 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: called; m=%p\n", 3271 __func__, 3272 m); 3273 3274 if (urtwn_tx_data(sc, ni, m, bf) != 0) { 3275 if_inc_counter(ni->ni_vap->iv_ifp, 3276 IFCOUNTER_OERRORS, 1); 3277 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); 3278 m_freem(m); 3279 ieee80211_free_node(ni); 3280 break; 3281 } 3282 sc->sc_txtimer = 5; 3283 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc); 3284 } 3285 } 3286 3287 static void 3288 urtwn_parent(struct ieee80211com *ic) 3289 { 3290 struct urtwn_softc *sc = ic->ic_softc; 3291 3292 URTWN_LOCK(sc); 3293 if (sc->sc_flags & URTWN_DETACHED) { 3294 URTWN_UNLOCK(sc); 3295 return; 3296 } 3297 URTWN_UNLOCK(sc); 3298 3299 if (ic->ic_nrunning > 0) { 3300 if (urtwn_init(sc) != 0) { 3301 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); 3302 if (vap != NULL) 3303 ieee80211_stop(vap); 3304 } else 3305 ieee80211_start_all(ic); 3306 } else 3307 urtwn_stop(sc); 3308 } 3309 3310 static __inline int 3311 urtwn_power_on(struct urtwn_softc *sc) 3312 { 3313 3314 return sc->sc_power_on(sc); 3315 } 3316 3317 static int 3318 urtwn_r92c_power_on(struct urtwn_softc *sc) 3319 { 3320 uint32_t reg; 3321 usb_error_t error; 3322 int ntries; 3323 3324 /* Wait for autoload done bit. */ 3325 for (ntries = 0; ntries < 1000; ntries++) { 3326 if (urtwn_read_1(sc, R92C_APS_FSMCO) & R92C_APS_FSMCO_PFM_ALDN) 3327 break; 3328 urtwn_ms_delay(sc); 3329 } 3330 if (ntries == 1000) { 3331 device_printf(sc->sc_dev, 3332 "timeout waiting for chip autoload\n"); 3333 return (ETIMEDOUT); 3334 } 3335 3336 /* Unlock ISO/CLK/Power control register. */ 3337 error = urtwn_write_1(sc, R92C_RSV_CTRL, 0); 3338 if (error != USB_ERR_NORMAL_COMPLETION) 3339 return (EIO); 3340 /* Move SPS into PWM mode. */ 3341 error = urtwn_write_1(sc, R92C_SPS0_CTRL, 0x2b); 3342 if (error != USB_ERR_NORMAL_COMPLETION) 3343 return (EIO); 3344 urtwn_ms_delay(sc); 3345 3346 reg = urtwn_read_1(sc, R92C_LDOV12D_CTRL); 3347 if (!(reg & R92C_LDOV12D_CTRL_LDV12_EN)) { 3348 error = urtwn_write_1(sc, R92C_LDOV12D_CTRL, 3349 reg | R92C_LDOV12D_CTRL_LDV12_EN); 3350 if (error != USB_ERR_NORMAL_COMPLETION) 3351 return (EIO); 3352 urtwn_ms_delay(sc); 3353 error = urtwn_write_1(sc, R92C_SYS_ISO_CTRL, 3354 urtwn_read_1(sc, R92C_SYS_ISO_CTRL) & 3355 ~R92C_SYS_ISO_CTRL_MD2PP); 3356 if (error != USB_ERR_NORMAL_COMPLETION) 3357 return (EIO); 3358 } 3359 3360 /* Auto enable WLAN. */ 3361 error = urtwn_write_2(sc, R92C_APS_FSMCO, 3362 urtwn_read_2(sc, R92C_APS_FSMCO) | R92C_APS_FSMCO_APFM_ONMAC); 3363 if (error != USB_ERR_NORMAL_COMPLETION) 3364 return (EIO); 3365 for (ntries = 0; ntries < 1000; ntries++) { 3366 if (!(urtwn_read_2(sc, R92C_APS_FSMCO) & 3367 R92C_APS_FSMCO_APFM_ONMAC)) 3368 break; 3369 urtwn_ms_delay(sc); 3370 } 3371 if (ntries == 1000) { 3372 device_printf(sc->sc_dev, 3373 "timeout waiting for MAC auto ON\n"); 3374 return (ETIMEDOUT); 3375 } 3376 3377 /* Enable radio, GPIO and LED functions. */ 3378 error = urtwn_write_2(sc, R92C_APS_FSMCO, 3379 R92C_APS_FSMCO_AFSM_HSUS | 3380 R92C_APS_FSMCO_PDN_EN | 3381 R92C_APS_FSMCO_PFM_ALDN); 3382 if (error != USB_ERR_NORMAL_COMPLETION) 3383 return (EIO); 3384 /* Release RF digital isolation. */ 3385 error = urtwn_write_2(sc, R92C_SYS_ISO_CTRL, 3386 urtwn_read_2(sc, R92C_SYS_ISO_CTRL) & ~R92C_SYS_ISO_CTRL_DIOR); 3387 if (error != USB_ERR_NORMAL_COMPLETION) 3388 return (EIO); 3389 3390 /* Initialize MAC. */ 3391 error = urtwn_write_1(sc, R92C_APSD_CTRL, 3392 urtwn_read_1(sc, R92C_APSD_CTRL) & ~R92C_APSD_CTRL_OFF); 3393 if (error != USB_ERR_NORMAL_COMPLETION) 3394 return (EIO); 3395 for (ntries = 0; ntries < 200; ntries++) { 3396 if (!(urtwn_read_1(sc, R92C_APSD_CTRL) & 3397 R92C_APSD_CTRL_OFF_STATUS)) 3398 break; 3399 urtwn_ms_delay(sc); 3400 } 3401 if (ntries == 200) { 3402 device_printf(sc->sc_dev, 3403 "timeout waiting for MAC initialization\n"); 3404 return (ETIMEDOUT); 3405 } 3406 3407 /* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */ 3408 reg = urtwn_read_2(sc, R92C_CR); 3409 reg |= R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN | 3410 R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | R92C_CR_PROTOCOL_EN | 3411 R92C_CR_SCHEDULE_EN | R92C_CR_MACTXEN | R92C_CR_MACRXEN | 3412 R92C_CR_ENSEC; 3413 error = urtwn_write_2(sc, R92C_CR, reg); 3414 if (error != USB_ERR_NORMAL_COMPLETION) 3415 return (EIO); 3416 3417 error = urtwn_write_1(sc, 0xfe10, 0x19); 3418 if (error != USB_ERR_NORMAL_COMPLETION) 3419 return (EIO); 3420 return (0); 3421 } 3422 3423 static int 3424 urtwn_r88e_power_on(struct urtwn_softc *sc) 3425 { 3426 uint32_t reg; 3427 usb_error_t error; 3428 int ntries; 3429 3430 /* Wait for power ready bit. */ 3431 for (ntries = 0; ntries < 5000; ntries++) { 3432 if (urtwn_read_4(sc, R92C_APS_FSMCO) & R92C_APS_FSMCO_SUS_HOST) 3433 break; 3434 urtwn_ms_delay(sc); 3435 } 3436 if (ntries == 5000) { 3437 device_printf(sc->sc_dev, 3438 "timeout waiting for chip power up\n"); 3439 return (ETIMEDOUT); 3440 } 3441 3442 /* Reset BB. */ 3443 error = urtwn_write_1(sc, R92C_SYS_FUNC_EN, 3444 urtwn_read_1(sc, R92C_SYS_FUNC_EN) & ~(R92C_SYS_FUNC_EN_BBRSTB | 3445 R92C_SYS_FUNC_EN_BB_GLB_RST)); 3446 if (error != USB_ERR_NORMAL_COMPLETION) 3447 return (EIO); 3448 3449 error = urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 2, 3450 urtwn_read_1(sc, R92C_AFE_XTAL_CTRL + 2) | 0x80); 3451 if (error != USB_ERR_NORMAL_COMPLETION) 3452 return (EIO); 3453 3454 /* Disable HWPDN. */ 3455 error = urtwn_write_2(sc, R92C_APS_FSMCO, 3456 urtwn_read_2(sc, R92C_APS_FSMCO) & ~R92C_APS_FSMCO_APDM_HPDN); 3457 if (error != USB_ERR_NORMAL_COMPLETION) 3458 return (EIO); 3459 3460 /* Disable WL suspend. */ 3461 error = urtwn_write_2(sc, R92C_APS_FSMCO, 3462 urtwn_read_2(sc, R92C_APS_FSMCO) & 3463 ~(R92C_APS_FSMCO_AFSM_HSUS | R92C_APS_FSMCO_AFSM_PCIE)); 3464 if (error != USB_ERR_NORMAL_COMPLETION) 3465 return (EIO); 3466 3467 error = urtwn_write_2(sc, R92C_APS_FSMCO, 3468 urtwn_read_2(sc, R92C_APS_FSMCO) | R92C_APS_FSMCO_APFM_ONMAC); 3469 if (error != USB_ERR_NORMAL_COMPLETION) 3470 return (EIO); 3471 for (ntries = 0; ntries < 5000; ntries++) { 3472 if (!(urtwn_read_2(sc, R92C_APS_FSMCO) & 3473 R92C_APS_FSMCO_APFM_ONMAC)) 3474 break; 3475 urtwn_ms_delay(sc); 3476 } 3477 if (ntries == 5000) 3478 return (ETIMEDOUT); 3479 3480 /* Enable LDO normal mode. */ 3481 error = urtwn_write_1(sc, R92C_LPLDO_CTRL, 3482 urtwn_read_1(sc, R92C_LPLDO_CTRL) & ~R92C_LPLDO_CTRL_SLEEP); 3483 if (error != USB_ERR_NORMAL_COMPLETION) 3484 return (EIO); 3485 3486 /* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */ 3487 error = urtwn_write_2(sc, R92C_CR, 0); 3488 if (error != USB_ERR_NORMAL_COMPLETION) 3489 return (EIO); 3490 reg = urtwn_read_2(sc, R92C_CR); 3491 reg |= R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN | 3492 R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | R92C_CR_PROTOCOL_EN | 3493 R92C_CR_SCHEDULE_EN | R92C_CR_ENSEC | R92C_CR_CALTMR_EN; 3494 error = urtwn_write_2(sc, R92C_CR, reg); 3495 if (error != USB_ERR_NORMAL_COMPLETION) 3496 return (EIO); 3497 3498 return (0); 3499 } 3500 3501 static __inline void 3502 urtwn_power_off(struct urtwn_softc *sc) 3503 { 3504 3505 return sc->sc_power_off(sc); 3506 } 3507 3508 static void 3509 urtwn_r92c_power_off(struct urtwn_softc *sc) 3510 { 3511 uint32_t reg; 3512 3513 /* Block all Tx queues. */ 3514 urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL); 3515 3516 /* Disable RF */ 3517 urtwn_rf_write(sc, 0, 0, 0); 3518 3519 urtwn_write_1(sc, R92C_APSD_CTRL, R92C_APSD_CTRL_OFF); 3520 3521 /* Reset BB state machine */ 3522 urtwn_write_1(sc, R92C_SYS_FUNC_EN, 3523 R92C_SYS_FUNC_EN_USBD | R92C_SYS_FUNC_EN_USBA | 3524 R92C_SYS_FUNC_EN_BB_GLB_RST); 3525 urtwn_write_1(sc, R92C_SYS_FUNC_EN, 3526 R92C_SYS_FUNC_EN_USBD | R92C_SYS_FUNC_EN_USBA); 3527 3528 /* 3529 * Reset digital sequence 3530 */ 3531 #ifndef URTWN_WITHOUT_UCODE 3532 if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RDY) { 3533 /* Reset MCU ready status */ 3534 urtwn_write_1(sc, R92C_MCUFWDL, 0); 3535 3536 /* If firmware in ram code, do reset */ 3537 urtwn_fw_reset(sc); 3538 } 3539 #endif 3540 3541 /* Reset MAC and Enable 8051 */ 3542 urtwn_write_1(sc, R92C_SYS_FUNC_EN + 1, 3543 (R92C_SYS_FUNC_EN_CPUEN | 3544 R92C_SYS_FUNC_EN_ELDR | 3545 R92C_SYS_FUNC_EN_HWPDN) >> 8); 3546 3547 /* Reset MCU ready status */ 3548 urtwn_write_1(sc, R92C_MCUFWDL, 0); 3549 3550 /* Disable MAC clock */ 3551 urtwn_write_2(sc, R92C_SYS_CLKR, 3552 R92C_SYS_CLKR_ANAD16V_EN | 3553 R92C_SYS_CLKR_ANA8M | 3554 R92C_SYS_CLKR_LOADER_EN | 3555 R92C_SYS_CLKR_80M_SSC_DIS | 3556 R92C_SYS_CLKR_SYS_EN | 3557 R92C_SYS_CLKR_RING_EN | 3558 0x4000); 3559 3560 /* Disable AFE PLL */ 3561 urtwn_write_1(sc, R92C_AFE_PLL_CTRL, 0x80); 3562 3563 /* Gated AFE DIG_CLOCK */ 3564 urtwn_write_2(sc, R92C_AFE_XTAL_CTRL, 0x880F); 3565 3566 /* Isolated digital to PON */ 3567 urtwn_write_1(sc, R92C_SYS_ISO_CTRL, 3568 R92C_SYS_ISO_CTRL_MD2PP | 3569 R92C_SYS_ISO_CTRL_PA2PCIE | 3570 R92C_SYS_ISO_CTRL_PD2CORE | 3571 R92C_SYS_ISO_CTRL_IP2MAC | 3572 R92C_SYS_ISO_CTRL_DIOP | 3573 R92C_SYS_ISO_CTRL_DIOE); 3574 3575 /* 3576 * Pull GPIO PIN to balance level and LED control 3577 */ 3578 /* 1. Disable GPIO[7:0] */ 3579 urtwn_write_2(sc, R92C_GPIO_IOSEL, 0x0000); 3580 3581 reg = urtwn_read_4(sc, R92C_GPIO_PIN_CTRL) & ~0x0000ff00; 3582 reg |= ((reg << 8) & 0x0000ff00) | 0x00ff0000; 3583 urtwn_write_4(sc, R92C_GPIO_PIN_CTRL, reg); 3584 3585 /* Disable GPIO[10:8] */ 3586 urtwn_write_1(sc, R92C_MAC_PINMUX_CFG, 0x00); 3587 3588 reg = urtwn_read_2(sc, R92C_GPIO_IO_SEL) & ~0x00f0; 3589 reg |= (((reg & 0x000f) << 4) | 0x0780); 3590 urtwn_write_2(sc, R92C_GPIO_IO_SEL, reg); 3591 3592 /* Disable LED0 & 1 */ 3593 urtwn_write_2(sc, R92C_LEDCFG0, 0x8080); 3594 3595 /* 3596 * Reset digital sequence 3597 */ 3598 /* Disable ELDR clock */ 3599 urtwn_write_2(sc, R92C_SYS_CLKR, 3600 R92C_SYS_CLKR_ANAD16V_EN | 3601 R92C_SYS_CLKR_ANA8M | 3602 R92C_SYS_CLKR_LOADER_EN | 3603 R92C_SYS_CLKR_80M_SSC_DIS | 3604 R92C_SYS_CLKR_SYS_EN | 3605 R92C_SYS_CLKR_RING_EN | 3606 0x4000); 3607 3608 /* Isolated ELDR to PON */ 3609 urtwn_write_1(sc, R92C_SYS_ISO_CTRL + 1, 3610 (R92C_SYS_ISO_CTRL_DIOR | 3611 R92C_SYS_ISO_CTRL_PWC_EV12V) >> 8); 3612 3613 /* 3614 * Disable analog sequence 3615 */ 3616 /* Disable A15 power */ 3617 urtwn_write_1(sc, R92C_LDOA15_CTRL, R92C_LDOA15_CTRL_OBUF); 3618 /* Disable digital core power */ 3619 urtwn_write_1(sc, R92C_LDOV12D_CTRL, 3620 urtwn_read_1(sc, R92C_LDOV12D_CTRL) & 3621 ~R92C_LDOV12D_CTRL_LDV12_EN); 3622 3623 /* Enter PFM mode */ 3624 urtwn_write_1(sc, R92C_SPS0_CTRL, 0x23); 3625 3626 /* Set USB suspend */ 3627 urtwn_write_2(sc, R92C_APS_FSMCO, 3628 R92C_APS_FSMCO_APDM_HOST | 3629 R92C_APS_FSMCO_AFSM_HSUS | 3630 R92C_APS_FSMCO_PFM_ALDN); 3631 3632 /* Lock ISO/CLK/Power control register. */ 3633 urtwn_write_1(sc, R92C_RSV_CTRL, 0x0E); 3634 } 3635 3636 static void 3637 urtwn_r88e_power_off(struct urtwn_softc *sc) 3638 { 3639 uint8_t reg; 3640 int ntries; 3641 3642 /* Disable any kind of TX reports. */ 3643 urtwn_write_1(sc, R88E_TX_RPT_CTRL, 3644 urtwn_read_1(sc, R88E_TX_RPT_CTRL) & 3645 ~(R88E_TX_RPT1_ENA | R88E_TX_RPT2_ENA)); 3646 3647 /* Stop Rx. */ 3648 urtwn_write_1(sc, R92C_CR, 0); 3649 3650 /* Move card to Low Power State. */ 3651 /* Block all Tx queues. */ 3652 urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL); 3653 3654 for (ntries = 0; ntries < 20; ntries++) { 3655 /* Should be zero if no packet is transmitting. */ 3656 if (urtwn_read_4(sc, R88E_SCH_TXCMD) == 0) 3657 break; 3658 3659 urtwn_ms_delay(sc); 3660 } 3661 if (ntries == 20) { 3662 device_printf(sc->sc_dev, "%s: failed to block Tx queues\n", 3663 __func__); 3664 return; 3665 } 3666 3667 /* CCK and OFDM are disabled, and clock are gated. */ 3668 urtwn_write_1(sc, R92C_SYS_FUNC_EN, 3669 urtwn_read_1(sc, R92C_SYS_FUNC_EN) & ~R92C_SYS_FUNC_EN_BBRSTB); 3670 3671 urtwn_ms_delay(sc); 3672 3673 /* Reset MAC TRX */ 3674 urtwn_write_1(sc, R92C_CR, 3675 R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN | 3676 R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | 3677 R92C_CR_PROTOCOL_EN | R92C_CR_SCHEDULE_EN); 3678 3679 /* check if removed later */ 3680 urtwn_write_1(sc, R92C_CR + 1, 3681 urtwn_read_1(sc, R92C_CR + 1) & ~(R92C_CR_ENSEC >> 8)); 3682 3683 /* Respond TxOK to scheduler */ 3684 urtwn_write_1(sc, R92C_DUAL_TSF_RST, 3685 urtwn_read_1(sc, R92C_DUAL_TSF_RST) | 0x20); 3686 3687 /* If firmware in ram code, do reset. */ 3688 #ifndef URTWN_WITHOUT_UCODE 3689 if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RDY) 3690 urtwn_r88e_fw_reset(sc); 3691 #endif 3692 3693 /* Reset MCU ready status. */ 3694 urtwn_write_1(sc, R92C_MCUFWDL, 0x00); 3695 3696 /* Disable 32k. */ 3697 urtwn_write_1(sc, R88E_32K_CTRL, 3698 urtwn_read_1(sc, R88E_32K_CTRL) & ~0x01); 3699 3700 /* Move card to Disabled state. */ 3701 /* Turn off RF. */ 3702 urtwn_write_1(sc, R92C_RF_CTRL, 0); 3703 3704 /* LDO Sleep mode. */ 3705 urtwn_write_1(sc, R92C_LPLDO_CTRL, 3706 urtwn_read_1(sc, R92C_LPLDO_CTRL) | R92C_LPLDO_CTRL_SLEEP); 3707 3708 /* Turn off MAC by HW state machine */ 3709 urtwn_write_1(sc, R92C_APS_FSMCO + 1, 3710 urtwn_read_1(sc, R92C_APS_FSMCO + 1) | 3711 (R92C_APS_FSMCO_APFM_OFF >> 8)); 3712 3713 for (ntries = 0; ntries < 20; ntries++) { 3714 /* Wait until it will be disabled. */ 3715 if ((urtwn_read_1(sc, R92C_APS_FSMCO + 1) & 3716 (R92C_APS_FSMCO_APFM_OFF >> 8)) == 0) 3717 break; 3718 3719 urtwn_ms_delay(sc); 3720 } 3721 if (ntries == 20) { 3722 device_printf(sc->sc_dev, "%s: could not turn off MAC\n", 3723 __func__); 3724 return; 3725 } 3726 3727 /* schmit trigger */ 3728 urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 2, 3729 urtwn_read_1(sc, R92C_AFE_XTAL_CTRL + 2) | 0x80); 3730 3731 /* Enable WL suspend. */ 3732 urtwn_write_1(sc, R92C_APS_FSMCO + 1, 3733 (urtwn_read_1(sc, R92C_APS_FSMCO + 1) & ~0x10) | 0x08); 3734 3735 /* Enable bandgap mbias in suspend. */ 3736 urtwn_write_1(sc, R92C_APS_FSMCO + 3, 0); 3737 3738 /* Clear SIC_EN register. */ 3739 urtwn_write_1(sc, R92C_GPIO_MUXCFG + 1, 3740 urtwn_read_1(sc, R92C_GPIO_MUXCFG + 1) & ~0x10); 3741 3742 /* Set USB suspend enable local register */ 3743 urtwn_write_1(sc, R92C_USB_SUSPEND, 3744 urtwn_read_1(sc, R92C_USB_SUSPEND) | 0x10); 3745 3746 /* Reset MCU IO Wrapper. */ 3747 reg = urtwn_read_1(sc, R92C_RSV_CTRL + 1); 3748 urtwn_write_1(sc, R92C_RSV_CTRL + 1, reg & ~0x08); 3749 urtwn_write_1(sc, R92C_RSV_CTRL + 1, reg | 0x08); 3750 3751 /* marked as 'For Power Consumption' code. */ 3752 urtwn_write_1(sc, R92C_GPIO_OUT, urtwn_read_1(sc, R92C_GPIO_IN)); 3753 urtwn_write_1(sc, R92C_GPIO_IOSEL, 0xff); 3754 3755 urtwn_write_1(sc, R92C_GPIO_IO_SEL, 3756 urtwn_read_1(sc, R92C_GPIO_IO_SEL) << 4); 3757 urtwn_write_1(sc, R92C_GPIO_MOD, 3758 urtwn_read_1(sc, R92C_GPIO_MOD) | 0x0f); 3759 3760 /* Set LNA, TRSW, EX_PA Pin to output mode. */ 3761 urtwn_write_4(sc, R88E_BB_PAD_CTRL, 0x00080808); 3762 } 3763 3764 static int 3765 urtwn_llt_init(struct urtwn_softc *sc) 3766 { 3767 int i, error, page_count, pktbuf_count; 3768 3769 page_count = (sc->chip & URTWN_CHIP_88E) ? 3770 R88E_TX_PAGE_COUNT : R92C_TX_PAGE_COUNT; 3771 pktbuf_count = (sc->chip & URTWN_CHIP_88E) ? 3772 R88E_TXPKTBUF_COUNT : R92C_TXPKTBUF_COUNT; 3773 3774 /* Reserve pages [0; page_count]. */ 3775 for (i = 0; i < page_count; i++) { 3776 if ((error = urtwn_llt_write(sc, i, i + 1)) != 0) 3777 return (error); 3778 } 3779 /* NB: 0xff indicates end-of-list. */ 3780 if ((error = urtwn_llt_write(sc, i, 0xff)) != 0) 3781 return (error); 3782 /* 3783 * Use pages [page_count + 1; pktbuf_count - 1] 3784 * as ring buffer. 3785 */ 3786 for (++i; i < pktbuf_count - 1; i++) { 3787 if ((error = urtwn_llt_write(sc, i, i + 1)) != 0) 3788 return (error); 3789 } 3790 /* Make the last page point to the beginning of the ring buffer. */ 3791 error = urtwn_llt_write(sc, i, page_count + 1); 3792 return (error); 3793 } 3794 3795 #ifndef URTWN_WITHOUT_UCODE 3796 static void 3797 urtwn_fw_reset(struct urtwn_softc *sc) 3798 { 3799 uint16_t reg; 3800 int ntries; 3801 3802 /* Tell 8051 to reset itself. */ 3803 urtwn_write_1(sc, R92C_HMETFR + 3, 0x20); 3804 3805 /* Wait until 8051 resets by itself. */ 3806 for (ntries = 0; ntries < 100; ntries++) { 3807 reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN); 3808 if (!(reg & R92C_SYS_FUNC_EN_CPUEN)) 3809 return; 3810 urtwn_ms_delay(sc); 3811 } 3812 /* Force 8051 reset. */ 3813 urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg & ~R92C_SYS_FUNC_EN_CPUEN); 3814 } 3815 3816 static void 3817 urtwn_r88e_fw_reset(struct urtwn_softc *sc) 3818 { 3819 uint16_t reg; 3820 3821 reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN); 3822 urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg & ~R92C_SYS_FUNC_EN_CPUEN); 3823 urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg | R92C_SYS_FUNC_EN_CPUEN); 3824 } 3825 3826 static int 3827 urtwn_fw_loadpage(struct urtwn_softc *sc, int page, const uint8_t *buf, int len) 3828 { 3829 uint32_t reg; 3830 usb_error_t error = USB_ERR_NORMAL_COMPLETION; 3831 int off, mlen; 3832 3833 reg = urtwn_read_4(sc, R92C_MCUFWDL); 3834 reg = RW(reg, R92C_MCUFWDL_PAGE, page); 3835 urtwn_write_4(sc, R92C_MCUFWDL, reg); 3836 3837 off = R92C_FW_START_ADDR; 3838 while (len > 0) { 3839 if (len > 196) 3840 mlen = 196; 3841 else if (len > 4) 3842 mlen = 4; 3843 else 3844 mlen = 1; 3845 /* XXX fix this deconst */ 3846 error = urtwn_write_region_1(sc, off, 3847 __DECONST(uint8_t *, buf), mlen); 3848 if (error != USB_ERR_NORMAL_COMPLETION) 3849 break; 3850 off += mlen; 3851 buf += mlen; 3852 len -= mlen; 3853 } 3854 return (error); 3855 } 3856 3857 static int 3858 urtwn_load_firmware(struct urtwn_softc *sc) 3859 { 3860 const struct firmware *fw; 3861 const struct r92c_fw_hdr *hdr; 3862 const char *imagename; 3863 const u_char *ptr; 3864 size_t len; 3865 uint32_t reg; 3866 int mlen, ntries, page, error; 3867 3868 URTWN_UNLOCK(sc); 3869 /* Read firmware image from the filesystem. */ 3870 if (sc->chip & URTWN_CHIP_88E) 3871 imagename = "urtwn-rtl8188eufw"; 3872 else if ((sc->chip & (URTWN_CHIP_UMC_A_CUT | URTWN_CHIP_92C)) == 3873 URTWN_CHIP_UMC_A_CUT) 3874 imagename = "urtwn-rtl8192cfwU"; 3875 else 3876 imagename = "urtwn-rtl8192cfwT"; 3877 3878 fw = firmware_get(imagename); 3879 URTWN_LOCK(sc); 3880 if (fw == NULL) { 3881 device_printf(sc->sc_dev, 3882 "failed loadfirmware of file %s\n", imagename); 3883 return (ENOENT); 3884 } 3885 3886 len = fw->datasize; 3887 3888 if (len < sizeof(*hdr)) { 3889 device_printf(sc->sc_dev, "firmware too short\n"); 3890 error = EINVAL; 3891 goto fail; 3892 } 3893 ptr = fw->data; 3894 hdr = (const struct r92c_fw_hdr *)ptr; 3895 /* Check if there is a valid FW header and skip it. */ 3896 if ((le16toh(hdr->signature) >> 4) == 0x88c || 3897 (le16toh(hdr->signature) >> 4) == 0x88e || 3898 (le16toh(hdr->signature) >> 4) == 0x92c) { 3899 URTWN_DPRINTF(sc, URTWN_DEBUG_FIRMWARE, 3900 "FW V%d.%d %02d-%02d %02d:%02d\n", 3901 le16toh(hdr->version), le16toh(hdr->subversion), 3902 hdr->month, hdr->date, hdr->hour, hdr->minute); 3903 ptr += sizeof(*hdr); 3904 len -= sizeof(*hdr); 3905 } 3906 3907 if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RAM_DL_SEL) { 3908 if (sc->chip & URTWN_CHIP_88E) 3909 urtwn_r88e_fw_reset(sc); 3910 else 3911 urtwn_fw_reset(sc); 3912 urtwn_write_1(sc, R92C_MCUFWDL, 0); 3913 } 3914 3915 if (!(sc->chip & URTWN_CHIP_88E)) { 3916 urtwn_write_2(sc, R92C_SYS_FUNC_EN, 3917 urtwn_read_2(sc, R92C_SYS_FUNC_EN) | 3918 R92C_SYS_FUNC_EN_CPUEN); 3919 } 3920 urtwn_write_1(sc, R92C_MCUFWDL, 3921 urtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_EN); 3922 urtwn_write_1(sc, R92C_MCUFWDL + 2, 3923 urtwn_read_1(sc, R92C_MCUFWDL + 2) & ~0x08); 3924 3925 /* Reset the FWDL checksum. */ 3926 urtwn_write_1(sc, R92C_MCUFWDL, 3927 urtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_CHKSUM_RPT); 3928 3929 for (page = 0; len > 0; page++) { 3930 mlen = min(len, R92C_FW_PAGE_SIZE); 3931 error = urtwn_fw_loadpage(sc, page, ptr, mlen); 3932 if (error != 0) { 3933 device_printf(sc->sc_dev, 3934 "could not load firmware page\n"); 3935 goto fail; 3936 } 3937 ptr += mlen; 3938 len -= mlen; 3939 } 3940 urtwn_write_1(sc, R92C_MCUFWDL, 3941 urtwn_read_1(sc, R92C_MCUFWDL) & ~R92C_MCUFWDL_EN); 3942 urtwn_write_1(sc, R92C_MCUFWDL + 1, 0); 3943 3944 /* Wait for checksum report. */ 3945 for (ntries = 0; ntries < 1000; ntries++) { 3946 if (urtwn_read_4(sc, R92C_MCUFWDL) & R92C_MCUFWDL_CHKSUM_RPT) 3947 break; 3948 urtwn_ms_delay(sc); 3949 } 3950 if (ntries == 1000) { 3951 device_printf(sc->sc_dev, 3952 "timeout waiting for checksum report\n"); 3953 error = ETIMEDOUT; 3954 goto fail; 3955 } 3956 3957 reg = urtwn_read_4(sc, R92C_MCUFWDL); 3958 reg = (reg & ~R92C_MCUFWDL_WINTINI_RDY) | R92C_MCUFWDL_RDY; 3959 urtwn_write_4(sc, R92C_MCUFWDL, reg); 3960 if (sc->chip & URTWN_CHIP_88E) 3961 urtwn_r88e_fw_reset(sc); 3962 /* Wait for firmware readiness. */ 3963 for (ntries = 0; ntries < 1000; ntries++) { 3964 if (urtwn_read_4(sc, R92C_MCUFWDL) & R92C_MCUFWDL_WINTINI_RDY) 3965 break; 3966 urtwn_ms_delay(sc); 3967 } 3968 if (ntries == 1000) { 3969 device_printf(sc->sc_dev, 3970 "timeout waiting for firmware readiness\n"); 3971 error = ETIMEDOUT; 3972 goto fail; 3973 } 3974 fail: 3975 firmware_put(fw, FIRMWARE_UNLOAD); 3976 return (error); 3977 } 3978 #endif 3979 3980 static int 3981 urtwn_dma_init(struct urtwn_softc *sc) 3982 { 3983 struct usb_endpoint *ep, *ep_end; 3984 usb_error_t usb_err; 3985 uint32_t reg; 3986 int hashq, hasnq, haslq, nqueues, ntx; 3987 int error, pagecount, npubqpages, nqpages, nrempages, tx_boundary; 3988 3989 /* Initialize LLT table. */ 3990 error = urtwn_llt_init(sc); 3991 if (error != 0) 3992 return (error); 3993 3994 /* Determine the number of bulk-out pipes. */ 3995 ntx = 0; 3996 ep = sc->sc_udev->endpoints; 3997 ep_end = sc->sc_udev->endpoints + sc->sc_udev->endpoints_max; 3998 for (; ep != ep_end; ep++) { 3999 if ((ep->edesc == NULL) || 4000 (ep->iface_index != sc->sc_iface_index)) 4001 continue; 4002 if (UE_GET_DIR(ep->edesc->bEndpointAddress) == UE_DIR_OUT) 4003 ntx++; 4004 } 4005 if (ntx == 0) { 4006 device_printf(sc->sc_dev, 4007 "%d: invalid number of Tx bulk pipes\n", ntx); 4008 return (EIO); 4009 } 4010 4011 /* Get Tx queues to USB endpoints mapping. */ 4012 hashq = hasnq = haslq = nqueues = 0; 4013 switch (ntx) { 4014 case 1: hashq = 1; break; 4015 case 2: hashq = hasnq = 1; break; 4016 case 3: case 4: hashq = hasnq = haslq = 1; break; 4017 } 4018 nqueues = hashq + hasnq + haslq; 4019 if (nqueues == 0) 4020 return (EIO); 4021 4022 npubqpages = nqpages = nrempages = pagecount = 0; 4023 if (sc->chip & URTWN_CHIP_88E) 4024 tx_boundary = R88E_TX_PAGE_BOUNDARY; 4025 else { 4026 pagecount = R92C_TX_PAGE_COUNT; 4027 npubqpages = R92C_PUBQ_NPAGES; 4028 tx_boundary = R92C_TX_PAGE_BOUNDARY; 4029 } 4030 4031 /* Set number of pages for normal priority queue. */ 4032 if (sc->chip & URTWN_CHIP_88E) { 4033 usb_err = urtwn_write_2(sc, R92C_RQPN_NPQ, 0xd); 4034 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4035 return (EIO); 4036 usb_err = urtwn_write_4(sc, R92C_RQPN, 0x808e000d); 4037 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4038 return (EIO); 4039 } else { 4040 /* Get the number of pages for each queue. */ 4041 nqpages = (pagecount - npubqpages) / nqueues; 4042 /* 4043 * The remaining pages are assigned to the high priority 4044 * queue. 4045 */ 4046 nrempages = (pagecount - npubqpages) % nqueues; 4047 usb_err = urtwn_write_1(sc, R92C_RQPN_NPQ, hasnq ? nqpages : 0); 4048 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4049 return (EIO); 4050 usb_err = urtwn_write_4(sc, R92C_RQPN, 4051 /* Set number of pages for public queue. */ 4052 SM(R92C_RQPN_PUBQ, npubqpages) | 4053 /* Set number of pages for high priority queue. */ 4054 SM(R92C_RQPN_HPQ, hashq ? nqpages + nrempages : 0) | 4055 /* Set number of pages for low priority queue. */ 4056 SM(R92C_RQPN_LPQ, haslq ? nqpages : 0) | 4057 /* Load values. */ 4058 R92C_RQPN_LD); 4059 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4060 return (EIO); 4061 } 4062 4063 usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_BCNQ_BDNY, tx_boundary); 4064 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4065 return (EIO); 4066 usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_MGQ_BDNY, tx_boundary); 4067 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4068 return (EIO); 4069 usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_WMAC_LBK_BF_HD, tx_boundary); 4070 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4071 return (EIO); 4072 usb_err = urtwn_write_1(sc, R92C_TRXFF_BNDY, tx_boundary); 4073 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4074 return (EIO); 4075 usb_err = urtwn_write_1(sc, R92C_TDECTRL + 1, tx_boundary); 4076 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4077 return (EIO); 4078 4079 /* Set queue to USB pipe mapping. */ 4080 reg = urtwn_read_2(sc, R92C_TRXDMA_CTRL); 4081 reg &= ~R92C_TRXDMA_CTRL_QMAP_M; 4082 if (nqueues == 1) { 4083 if (hashq) 4084 reg |= R92C_TRXDMA_CTRL_QMAP_HQ; 4085 else if (hasnq) 4086 reg |= R92C_TRXDMA_CTRL_QMAP_NQ; 4087 else 4088 reg |= R92C_TRXDMA_CTRL_QMAP_LQ; 4089 } else if (nqueues == 2) { 4090 /* 4091 * All 2-endpoints configs have high and normal 4092 * priority queues. 4093 */ 4094 reg |= R92C_TRXDMA_CTRL_QMAP_HQ_NQ; 4095 } else 4096 reg |= R92C_TRXDMA_CTRL_QMAP_3EP; 4097 usb_err = urtwn_write_2(sc, R92C_TRXDMA_CTRL, reg); 4098 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4099 return (EIO); 4100 4101 /* Set Tx/Rx transfer page boundary. */ 4102 usb_err = urtwn_write_2(sc, R92C_TRXFF_BNDY + 2, 4103 (sc->chip & URTWN_CHIP_88E) ? 0x23ff : 0x27ff); 4104 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4105 return (EIO); 4106 4107 /* Set Tx/Rx transfer page size. */ 4108 usb_err = urtwn_write_1(sc, R92C_PBP, 4109 SM(R92C_PBP_PSRX, R92C_PBP_128) | 4110 SM(R92C_PBP_PSTX, R92C_PBP_128)); 4111 if (usb_err != USB_ERR_NORMAL_COMPLETION) 4112 return (EIO); 4113 4114 return (0); 4115 } 4116 4117 static int 4118 urtwn_mac_init(struct urtwn_softc *sc) 4119 { 4120 usb_error_t error; 4121 int i; 4122 4123 /* Write MAC initialization values. */ 4124 if (sc->chip & URTWN_CHIP_88E) { 4125 for (i = 0; i < nitems(rtl8188eu_mac); i++) { 4126 error = urtwn_write_1(sc, rtl8188eu_mac[i].reg, 4127 rtl8188eu_mac[i].val); 4128 if (error != USB_ERR_NORMAL_COMPLETION) 4129 return (EIO); 4130 } 4131 urtwn_write_1(sc, R92C_MAX_AGGR_NUM, 0x07); 4132 } else { 4133 for (i = 0; i < nitems(rtl8192cu_mac); i++) { 4134 error = urtwn_write_1(sc, rtl8192cu_mac[i].reg, 4135 rtl8192cu_mac[i].val); 4136 if (error != USB_ERR_NORMAL_COMPLETION) 4137 return (EIO); 4138 } 4139 } 4140 4141 return (0); 4142 } 4143 4144 static void 4145 urtwn_bb_init(struct urtwn_softc *sc) 4146 { 4147 const struct urtwn_bb_prog *prog; 4148 uint32_t reg; 4149 uint8_t crystalcap; 4150 int i; 4151 4152 /* Enable BB and RF. */ 4153 urtwn_write_2(sc, R92C_SYS_FUNC_EN, 4154 urtwn_read_2(sc, R92C_SYS_FUNC_EN) | 4155 R92C_SYS_FUNC_EN_BBRSTB | R92C_SYS_FUNC_EN_BB_GLB_RST | 4156 R92C_SYS_FUNC_EN_DIO_RF); 4157 4158 if (!(sc->chip & URTWN_CHIP_88E)) 4159 urtwn_write_2(sc, R92C_AFE_PLL_CTRL, 0xdb83); 4160 4161 urtwn_write_1(sc, R92C_RF_CTRL, 4162 R92C_RF_CTRL_EN | R92C_RF_CTRL_RSTB | R92C_RF_CTRL_SDMRSTB); 4163 urtwn_write_1(sc, R92C_SYS_FUNC_EN, 4164 R92C_SYS_FUNC_EN_USBA | R92C_SYS_FUNC_EN_USBD | 4165 R92C_SYS_FUNC_EN_BB_GLB_RST | R92C_SYS_FUNC_EN_BBRSTB); 4166 4167 if (!(sc->chip & URTWN_CHIP_88E)) { 4168 urtwn_write_1(sc, R92C_LDOHCI12_CTRL, 0x0f); 4169 urtwn_write_1(sc, 0x15, 0xe9); 4170 urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 1, 0x80); 4171 } 4172 4173 /* Select BB programming based on board type. */ 4174 if (sc->chip & URTWN_CHIP_88E) 4175 prog = &rtl8188eu_bb_prog; 4176 else if (!(sc->chip & URTWN_CHIP_92C)) { 4177 if (sc->board_type == R92C_BOARD_TYPE_MINICARD) 4178 prog = &rtl8188ce_bb_prog; 4179 else if (sc->board_type == R92C_BOARD_TYPE_HIGHPA) 4180 prog = &rtl8188ru_bb_prog; 4181 else 4182 prog = &rtl8188cu_bb_prog; 4183 } else { 4184 if (sc->board_type == R92C_BOARD_TYPE_MINICARD) 4185 prog = &rtl8192ce_bb_prog; 4186 else 4187 prog = &rtl8192cu_bb_prog; 4188 } 4189 /* Write BB initialization values. */ 4190 for (i = 0; i < prog->count; i++) { 4191 urtwn_bb_write(sc, prog->regs[i], prog->vals[i]); 4192 urtwn_ms_delay(sc); 4193 } 4194 4195 if (sc->chip & URTWN_CHIP_92C_1T2R) { 4196 /* 8192C 1T only configuration. */ 4197 reg = urtwn_bb_read(sc, R92C_FPGA0_TXINFO); 4198 reg = (reg & ~0x00000003) | 0x2; 4199 urtwn_bb_write(sc, R92C_FPGA0_TXINFO, reg); 4200 4201 reg = urtwn_bb_read(sc, R92C_FPGA1_TXINFO); 4202 reg = (reg & ~0x00300033) | 0x00200022; 4203 urtwn_bb_write(sc, R92C_FPGA1_TXINFO, reg); 4204 4205 reg = urtwn_bb_read(sc, R92C_CCK0_AFESETTING); 4206 reg = (reg & ~0xff000000) | 0x45 << 24; 4207 urtwn_bb_write(sc, R92C_CCK0_AFESETTING, reg); 4208 4209 reg = urtwn_bb_read(sc, R92C_OFDM0_TRXPATHENA); 4210 reg = (reg & ~0x000000ff) | 0x23; 4211 urtwn_bb_write(sc, R92C_OFDM0_TRXPATHENA, reg); 4212 4213 reg = urtwn_bb_read(sc, R92C_OFDM0_AGCPARAM1); 4214 reg = (reg & ~0x00000030) | 1 << 4; 4215 urtwn_bb_write(sc, R92C_OFDM0_AGCPARAM1, reg); 4216 4217 reg = urtwn_bb_read(sc, 0xe74); 4218 reg = (reg & ~0x0c000000) | 2 << 26; 4219 urtwn_bb_write(sc, 0xe74, reg); 4220 reg = urtwn_bb_read(sc, 0xe78); 4221 reg = (reg & ~0x0c000000) | 2 << 26; 4222 urtwn_bb_write(sc, 0xe78, reg); 4223 reg = urtwn_bb_read(sc, 0xe7c); 4224 reg = (reg & ~0x0c000000) | 2 << 26; 4225 urtwn_bb_write(sc, 0xe7c, reg); 4226 reg = urtwn_bb_read(sc, 0xe80); 4227 reg = (reg & ~0x0c000000) | 2 << 26; 4228 urtwn_bb_write(sc, 0xe80, reg); 4229 reg = urtwn_bb_read(sc, 0xe88); 4230 reg = (reg & ~0x0c000000) | 2 << 26; 4231 urtwn_bb_write(sc, 0xe88, reg); 4232 } 4233 4234 /* Write AGC values. */ 4235 for (i = 0; i < prog->agccount; i++) { 4236 urtwn_bb_write(sc, R92C_OFDM0_AGCRSSITABLE, 4237 prog->agcvals[i]); 4238 urtwn_ms_delay(sc); 4239 } 4240 4241 if (sc->chip & URTWN_CHIP_88E) { 4242 urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), 0x69553422); 4243 urtwn_ms_delay(sc); 4244 urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), 0x69553420); 4245 urtwn_ms_delay(sc); 4246 4247 crystalcap = sc->rom.r88e_rom.crystalcap; 4248 if (crystalcap == 0xff) 4249 crystalcap = 0x20; 4250 crystalcap &= 0x3f; 4251 reg = urtwn_bb_read(sc, R92C_AFE_XTAL_CTRL); 4252 urtwn_bb_write(sc, R92C_AFE_XTAL_CTRL, 4253 RW(reg, R92C_AFE_XTAL_CTRL_ADDR, 4254 crystalcap | crystalcap << 6)); 4255 } else { 4256 if (urtwn_bb_read(sc, R92C_HSSI_PARAM2(0)) & 4257 R92C_HSSI_PARAM2_CCK_HIPWR) 4258 sc->sc_flags |= URTWN_FLAG_CCK_HIPWR; 4259 } 4260 } 4261 4262 static void 4263 urtwn_rf_init(struct urtwn_softc *sc) 4264 { 4265 const struct urtwn_rf_prog *prog; 4266 uint32_t reg, type; 4267 int i, j, idx, off; 4268 4269 /* Select RF programming based on board type. */ 4270 if (sc->chip & URTWN_CHIP_88E) 4271 prog = rtl8188eu_rf_prog; 4272 else if (!(sc->chip & URTWN_CHIP_92C)) { 4273 if (sc->board_type == R92C_BOARD_TYPE_MINICARD) 4274 prog = rtl8188ce_rf_prog; 4275 else if (sc->board_type == R92C_BOARD_TYPE_HIGHPA) 4276 prog = rtl8188ru_rf_prog; 4277 else 4278 prog = rtl8188cu_rf_prog; 4279 } else 4280 prog = rtl8192ce_rf_prog; 4281 4282 for (i = 0; i < sc->nrxchains; i++) { 4283 /* Save RF_ENV control type. */ 4284 idx = i / 2; 4285 off = (i % 2) * 16; 4286 reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACESW(idx)); 4287 type = (reg >> off) & 0x10; 4288 4289 /* Set RF_ENV enable. */ 4290 reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACEOE(i)); 4291 reg |= 0x100000; 4292 urtwn_bb_write(sc, R92C_FPGA0_RFIFACEOE(i), reg); 4293 urtwn_ms_delay(sc); 4294 /* Set RF_ENV output high. */ 4295 reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACEOE(i)); 4296 reg |= 0x10; 4297 urtwn_bb_write(sc, R92C_FPGA0_RFIFACEOE(i), reg); 4298 urtwn_ms_delay(sc); 4299 /* Set address and data lengths of RF registers. */ 4300 reg = urtwn_bb_read(sc, R92C_HSSI_PARAM2(i)); 4301 reg &= ~R92C_HSSI_PARAM2_ADDR_LENGTH; 4302 urtwn_bb_write(sc, R92C_HSSI_PARAM2(i), reg); 4303 urtwn_ms_delay(sc); 4304 reg = urtwn_bb_read(sc, R92C_HSSI_PARAM2(i)); 4305 reg &= ~R92C_HSSI_PARAM2_DATA_LENGTH; 4306 urtwn_bb_write(sc, R92C_HSSI_PARAM2(i), reg); 4307 urtwn_ms_delay(sc); 4308 4309 /* Write RF initialization values for this chain. */ 4310 for (j = 0; j < prog[i].count; j++) { 4311 if (prog[i].regs[j] >= 0xf9 && 4312 prog[i].regs[j] <= 0xfe) { 4313 /* 4314 * These are fake RF registers offsets that 4315 * indicate a delay is required. 4316 */ 4317 usb_pause_mtx(&sc->sc_mtx, hz / 20); /* 50ms */ 4318 continue; 4319 } 4320 urtwn_rf_write(sc, i, prog[i].regs[j], 4321 prog[i].vals[j]); 4322 urtwn_ms_delay(sc); 4323 } 4324 4325 /* Restore RF_ENV control type. */ 4326 reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACESW(idx)); 4327 reg &= ~(0x10 << off) | (type << off); 4328 urtwn_bb_write(sc, R92C_FPGA0_RFIFACESW(idx), reg); 4329 4330 /* Cache RF register CHNLBW. */ 4331 sc->rf_chnlbw[i] = urtwn_rf_read(sc, i, R92C_RF_CHNLBW); 4332 } 4333 4334 if ((sc->chip & (URTWN_CHIP_UMC_A_CUT | URTWN_CHIP_92C)) == 4335 URTWN_CHIP_UMC_A_CUT) { 4336 urtwn_rf_write(sc, 0, R92C_RF_RX_G1, 0x30255); 4337 urtwn_rf_write(sc, 0, R92C_RF_RX_G2, 0x50a00); 4338 } 4339 } 4340 4341 static void 4342 urtwn_cam_init(struct urtwn_softc *sc) 4343 { 4344 /* Invalidate all CAM entries. */ 4345 urtwn_write_4(sc, R92C_CAMCMD, 4346 R92C_CAMCMD_POLLING | R92C_CAMCMD_CLR); 4347 } 4348 4349 static int 4350 urtwn_cam_write(struct urtwn_softc *sc, uint32_t addr, uint32_t data) 4351 { 4352 usb_error_t error; 4353 4354 error = urtwn_write_4(sc, R92C_CAMWRITE, data); 4355 if (error != USB_ERR_NORMAL_COMPLETION) 4356 return (EIO); 4357 error = urtwn_write_4(sc, R92C_CAMCMD, 4358 R92C_CAMCMD_POLLING | R92C_CAMCMD_WRITE | 4359 SM(R92C_CAMCMD_ADDR, addr)); 4360 if (error != USB_ERR_NORMAL_COMPLETION) 4361 return (EIO); 4362 4363 return (0); 4364 } 4365 4366 static void 4367 urtwn_pa_bias_init(struct urtwn_softc *sc) 4368 { 4369 uint8_t reg; 4370 int i; 4371 4372 for (i = 0; i < sc->nrxchains; i++) { 4373 if (sc->pa_setting & (1 << i)) 4374 continue; 4375 urtwn_rf_write(sc, i, R92C_RF_IPA, 0x0f406); 4376 urtwn_rf_write(sc, i, R92C_RF_IPA, 0x4f406); 4377 urtwn_rf_write(sc, i, R92C_RF_IPA, 0x8f406); 4378 urtwn_rf_write(sc, i, R92C_RF_IPA, 0xcf406); 4379 } 4380 if (!(sc->pa_setting & 0x10)) { 4381 reg = urtwn_read_1(sc, 0x16); 4382 reg = (reg & ~0xf0) | 0x90; 4383 urtwn_write_1(sc, 0x16, reg); 4384 } 4385 } 4386 4387 static void 4388 urtwn_rxfilter_init(struct urtwn_softc *sc) 4389 { 4390 struct ieee80211com *ic = &sc->sc_ic; 4391 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); 4392 uint32_t rcr; 4393 uint16_t filter; 4394 4395 URTWN_ASSERT_LOCKED(sc); 4396 4397 /* Setup multicast filter. */ 4398 urtwn_set_multi(sc); 4399 4400 /* Filter for management frames. */ 4401 filter = 0x7f3f; 4402 switch (vap->iv_opmode) { 4403 case IEEE80211_M_STA: 4404 filter &= ~( 4405 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_ASSOC_REQ) | 4406 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_REASSOC_REQ) | 4407 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_PROBE_REQ)); 4408 break; 4409 case IEEE80211_M_HOSTAP: 4410 filter &= ~( 4411 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_ASSOC_RESP) | 4412 R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_REASSOC_RESP)); 4413 break; 4414 case IEEE80211_M_MONITOR: 4415 case IEEE80211_M_IBSS: 4416 break; 4417 default: 4418 device_printf(sc->sc_dev, "%s: undefined opmode %d\n", 4419 __func__, vap->iv_opmode); 4420 break; 4421 } 4422 urtwn_write_2(sc, R92C_RXFLTMAP0, filter); 4423 4424 /* Reject all control frames. */ 4425 urtwn_write_2(sc, R92C_RXFLTMAP1, 0x0000); 4426 4427 /* Reject all data frames. */ 4428 urtwn_write_2(sc, R92C_RXFLTMAP2, 0x0000); 4429 4430 rcr = R92C_RCR_AM | R92C_RCR_AB | R92C_RCR_APM | 4431 R92C_RCR_HTC_LOC_CTRL | R92C_RCR_APP_PHYSTS | 4432 R92C_RCR_APP_ICV | R92C_RCR_APP_MIC; 4433 4434 if (vap->iv_opmode == IEEE80211_M_MONITOR) { 4435 /* Accept all frames. */ 4436 rcr |= R92C_RCR_ACF | R92C_RCR_ADF | R92C_RCR_AMF | 4437 R92C_RCR_AAP; 4438 } 4439 4440 /* Set Rx filter. */ 4441 urtwn_write_4(sc, R92C_RCR, rcr); 4442 4443 if (ic->ic_promisc != 0) { 4444 /* Update Rx filter. */ 4445 urtwn_set_promisc(sc); 4446 } 4447 } 4448 4449 static void 4450 urtwn_edca_init(struct urtwn_softc *sc) 4451 { 4452 urtwn_write_2(sc, R92C_SPEC_SIFS, 0x100a); 4453 urtwn_write_2(sc, R92C_MAC_SPEC_SIFS, 0x100a); 4454 urtwn_write_2(sc, R92C_SIFS_CCK, 0x100a); 4455 urtwn_write_2(sc, R92C_SIFS_OFDM, 0x100a); 4456 urtwn_write_4(sc, R92C_EDCA_BE_PARAM, 0x005ea42b); 4457 urtwn_write_4(sc, R92C_EDCA_BK_PARAM, 0x0000a44f); 4458 urtwn_write_4(sc, R92C_EDCA_VI_PARAM, 0x005ea324); 4459 urtwn_write_4(sc, R92C_EDCA_VO_PARAM, 0x002fa226); 4460 } 4461 4462 static void 4463 urtwn_write_txpower(struct urtwn_softc *sc, int chain, 4464 uint16_t power[URTWN_RIDX_COUNT]) 4465 { 4466 uint32_t reg; 4467 4468 /* Write per-CCK rate Tx power. */ 4469 if (chain == 0) { 4470 reg = urtwn_bb_read(sc, R92C_TXAGC_A_CCK1_MCS32); 4471 reg = RW(reg, R92C_TXAGC_A_CCK1, power[0]); 4472 urtwn_bb_write(sc, R92C_TXAGC_A_CCK1_MCS32, reg); 4473 reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK11_A_CCK2_11); 4474 reg = RW(reg, R92C_TXAGC_A_CCK2, power[1]); 4475 reg = RW(reg, R92C_TXAGC_A_CCK55, power[2]); 4476 reg = RW(reg, R92C_TXAGC_A_CCK11, power[3]); 4477 urtwn_bb_write(sc, R92C_TXAGC_B_CCK11_A_CCK2_11, reg); 4478 } else { 4479 reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK1_55_MCS32); 4480 reg = RW(reg, R92C_TXAGC_B_CCK1, power[0]); 4481 reg = RW(reg, R92C_TXAGC_B_CCK2, power[1]); 4482 reg = RW(reg, R92C_TXAGC_B_CCK55, power[2]); 4483 urtwn_bb_write(sc, R92C_TXAGC_B_CCK1_55_MCS32, reg); 4484 reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK11_A_CCK2_11); 4485 reg = RW(reg, R92C_TXAGC_B_CCK11, power[3]); 4486 urtwn_bb_write(sc, R92C_TXAGC_B_CCK11_A_CCK2_11, reg); 4487 } 4488 /* Write per-OFDM rate Tx power. */ 4489 urtwn_bb_write(sc, R92C_TXAGC_RATE18_06(chain), 4490 SM(R92C_TXAGC_RATE06, power[ 4]) | 4491 SM(R92C_TXAGC_RATE09, power[ 5]) | 4492 SM(R92C_TXAGC_RATE12, power[ 6]) | 4493 SM(R92C_TXAGC_RATE18, power[ 7])); 4494 urtwn_bb_write(sc, R92C_TXAGC_RATE54_24(chain), 4495 SM(R92C_TXAGC_RATE24, power[ 8]) | 4496 SM(R92C_TXAGC_RATE36, power[ 9]) | 4497 SM(R92C_TXAGC_RATE48, power[10]) | 4498 SM(R92C_TXAGC_RATE54, power[11])); 4499 /* Write per-MCS Tx power. */ 4500 urtwn_bb_write(sc, R92C_TXAGC_MCS03_MCS00(chain), 4501 SM(R92C_TXAGC_MCS00, power[12]) | 4502 SM(R92C_TXAGC_MCS01, power[13]) | 4503 SM(R92C_TXAGC_MCS02, power[14]) | 4504 SM(R92C_TXAGC_MCS03, power[15])); 4505 urtwn_bb_write(sc, R92C_TXAGC_MCS07_MCS04(chain), 4506 SM(R92C_TXAGC_MCS04, power[16]) | 4507 SM(R92C_TXAGC_MCS05, power[17]) | 4508 SM(R92C_TXAGC_MCS06, power[18]) | 4509 SM(R92C_TXAGC_MCS07, power[19])); 4510 urtwn_bb_write(sc, R92C_TXAGC_MCS11_MCS08(chain), 4511 SM(R92C_TXAGC_MCS08, power[20]) | 4512 SM(R92C_TXAGC_MCS09, power[21]) | 4513 SM(R92C_TXAGC_MCS10, power[22]) | 4514 SM(R92C_TXAGC_MCS11, power[23])); 4515 urtwn_bb_write(sc, R92C_TXAGC_MCS15_MCS12(chain), 4516 SM(R92C_TXAGC_MCS12, power[24]) | 4517 SM(R92C_TXAGC_MCS13, power[25]) | 4518 SM(R92C_TXAGC_MCS14, power[26]) | 4519 SM(R92C_TXAGC_MCS15, power[27])); 4520 } 4521 4522 static void 4523 urtwn_get_txpower(struct urtwn_softc *sc, int chain, 4524 struct ieee80211_channel *c, struct ieee80211_channel *extc, 4525 uint16_t power[URTWN_RIDX_COUNT]) 4526 { 4527 struct ieee80211com *ic = &sc->sc_ic; 4528 struct r92c_rom *rom = &sc->rom.r92c_rom; 4529 uint16_t cckpow, ofdmpow, htpow, diff, max; 4530 const struct urtwn_txpwr *base; 4531 int ridx, chan, group; 4532 4533 /* Determine channel group. */ 4534 chan = ieee80211_chan2ieee(ic, c); /* XXX center freq! */ 4535 if (chan <= 3) 4536 group = 0; 4537 else if (chan <= 9) 4538 group = 1; 4539 else 4540 group = 2; 4541 4542 /* Get original Tx power based on board type and RF chain. */ 4543 if (!(sc->chip & URTWN_CHIP_92C)) { 4544 if (sc->board_type == R92C_BOARD_TYPE_HIGHPA) 4545 base = &rtl8188ru_txagc[chain]; 4546 else 4547 base = &rtl8192cu_txagc[chain]; 4548 } else 4549 base = &rtl8192cu_txagc[chain]; 4550 4551 memset(power, 0, URTWN_RIDX_COUNT * sizeof(power[0])); 4552 if (sc->regulatory == 0) { 4553 for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) 4554 power[ridx] = base->pwr[0][ridx]; 4555 } 4556 for (ridx = URTWN_RIDX_OFDM6; ridx < URTWN_RIDX_COUNT; ridx++) { 4557 if (sc->regulatory == 3) { 4558 power[ridx] = base->pwr[0][ridx]; 4559 /* Apply vendor limits. */ 4560 if (extc != NULL) 4561 max = rom->ht40_max_pwr[group]; 4562 else 4563 max = rom->ht20_max_pwr[group]; 4564 max = (max >> (chain * 4)) & 0xf; 4565 if (power[ridx] > max) 4566 power[ridx] = max; 4567 } else if (sc->regulatory == 1) { 4568 if (extc == NULL) 4569 power[ridx] = base->pwr[group][ridx]; 4570 } else if (sc->regulatory != 2) 4571 power[ridx] = base->pwr[0][ridx]; 4572 } 4573 4574 /* Compute per-CCK rate Tx power. */ 4575 cckpow = rom->cck_tx_pwr[chain][group]; 4576 for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) { 4577 power[ridx] += cckpow; 4578 if (power[ridx] > R92C_MAX_TX_PWR) 4579 power[ridx] = R92C_MAX_TX_PWR; 4580 } 4581 4582 htpow = rom->ht40_1s_tx_pwr[chain][group]; 4583 if (sc->ntxchains > 1) { 4584 /* Apply reduction for 2 spatial streams. */ 4585 diff = rom->ht40_2s_tx_pwr_diff[group]; 4586 diff = (diff >> (chain * 4)) & 0xf; 4587 htpow = (htpow > diff) ? htpow - diff : 0; 4588 } 4589 4590 /* Compute per-OFDM rate Tx power. */ 4591 diff = rom->ofdm_tx_pwr_diff[group]; 4592 diff = (diff >> (chain * 4)) & 0xf; 4593 ofdmpow = htpow + diff; /* HT->OFDM correction. */ 4594 for (ridx = URTWN_RIDX_OFDM6; ridx <= URTWN_RIDX_OFDM54; ridx++) { 4595 power[ridx] += ofdmpow; 4596 if (power[ridx] > R92C_MAX_TX_PWR) 4597 power[ridx] = R92C_MAX_TX_PWR; 4598 } 4599 4600 /* Compute per-MCS Tx power. */ 4601 if (extc == NULL) { 4602 diff = rom->ht20_tx_pwr_diff[group]; 4603 diff = (diff >> (chain * 4)) & 0xf; 4604 htpow += diff; /* HT40->HT20 correction. */ 4605 } 4606 for (ridx = 12; ridx <= 27; ridx++) { 4607 power[ridx] += htpow; 4608 if (power[ridx] > R92C_MAX_TX_PWR) 4609 power[ridx] = R92C_MAX_TX_PWR; 4610 } 4611 #ifdef USB_DEBUG 4612 if (sc->sc_debug & URTWN_DEBUG_TXPWR) { 4613 /* Dump per-rate Tx power values. */ 4614 kprintf("Tx power for chain %d:\n", chain); 4615 for (ridx = URTWN_RIDX_CCK1; ridx < URTWN_RIDX_COUNT; ridx++) 4616 kprintf("Rate %d = %u\n", ridx, power[ridx]); 4617 } 4618 #endif 4619 } 4620 4621 static void 4622 urtwn_r88e_get_txpower(struct urtwn_softc *sc, int chain, 4623 struct ieee80211_channel *c, struct ieee80211_channel *extc, 4624 uint16_t power[URTWN_RIDX_COUNT]) 4625 { 4626 struct ieee80211com *ic = &sc->sc_ic; 4627 struct r88e_rom *rom = &sc->rom.r88e_rom; 4628 uint16_t cckpow, ofdmpow, bw20pow, htpow; 4629 const struct urtwn_r88e_txpwr *base; 4630 int ridx, chan, group; 4631 4632 /* Determine channel group. */ 4633 chan = ieee80211_chan2ieee(ic, c); /* XXX center freq! */ 4634 if (chan <= 2) 4635 group = 0; 4636 else if (chan <= 5) 4637 group = 1; 4638 else if (chan <= 8) 4639 group = 2; 4640 else if (chan <= 11) 4641 group = 3; 4642 else if (chan <= 13) 4643 group = 4; 4644 else 4645 group = 5; 4646 4647 /* Get original Tx power based on board type and RF chain. */ 4648 base = &rtl8188eu_txagc[chain]; 4649 4650 memset(power, 0, URTWN_RIDX_COUNT * sizeof(power[0])); 4651 if (sc->regulatory == 0) { 4652 for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) 4653 power[ridx] = base->pwr[0][ridx]; 4654 } 4655 for (ridx = URTWN_RIDX_OFDM6; ridx < URTWN_RIDX_COUNT; ridx++) { 4656 if (sc->regulatory == 3) 4657 power[ridx] = base->pwr[0][ridx]; 4658 else if (sc->regulatory == 1) { 4659 if (extc == NULL) 4660 power[ridx] = base->pwr[group][ridx]; 4661 } else if (sc->regulatory != 2) 4662 power[ridx] = base->pwr[0][ridx]; 4663 } 4664 4665 /* Compute per-CCK rate Tx power. */ 4666 cckpow = rom->cck_tx_pwr[group]; 4667 for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) { 4668 power[ridx] += cckpow; 4669 if (power[ridx] > R92C_MAX_TX_PWR) 4670 power[ridx] = R92C_MAX_TX_PWR; 4671 } 4672 4673 htpow = rom->ht40_tx_pwr[group]; 4674 4675 /* Compute per-OFDM rate Tx power. */ 4676 ofdmpow = htpow + sc->ofdm_tx_pwr_diff; 4677 for (ridx = URTWN_RIDX_OFDM6; ridx <= URTWN_RIDX_OFDM54; ridx++) { 4678 power[ridx] += ofdmpow; 4679 if (power[ridx] > R92C_MAX_TX_PWR) 4680 power[ridx] = R92C_MAX_TX_PWR; 4681 } 4682 4683 bw20pow = htpow + sc->bw20_tx_pwr_diff; 4684 for (ridx = 12; ridx <= 27; ridx++) { 4685 power[ridx] += bw20pow; 4686 if (power[ridx] > R92C_MAX_TX_PWR) 4687 power[ridx] = R92C_MAX_TX_PWR; 4688 } 4689 } 4690 4691 static void 4692 urtwn_set_txpower(struct urtwn_softc *sc, struct ieee80211_channel *c, 4693 struct ieee80211_channel *extc) 4694 { 4695 uint16_t power[URTWN_RIDX_COUNT]; 4696 int i; 4697 4698 for (i = 0; i < sc->ntxchains; i++) { 4699 /* Compute per-rate Tx power values. */ 4700 if (sc->chip & URTWN_CHIP_88E) 4701 urtwn_r88e_get_txpower(sc, i, c, extc, power); 4702 else 4703 urtwn_get_txpower(sc, i, c, extc, power); 4704 /* Write per-rate Tx power values to hardware. */ 4705 urtwn_write_txpower(sc, i, power); 4706 } 4707 } 4708 4709 static void 4710 urtwn_set_rx_bssid_all(struct urtwn_softc *sc, int enable) 4711 { 4712 uint32_t reg; 4713 4714 reg = urtwn_read_4(sc, R92C_RCR); 4715 if (enable) 4716 reg &= ~R92C_RCR_CBSSID_BCN; 4717 else 4718 reg |= R92C_RCR_CBSSID_BCN; 4719 urtwn_write_4(sc, R92C_RCR, reg); 4720 } 4721 4722 static void 4723 urtwn_set_gain(struct urtwn_softc *sc, uint8_t gain) 4724 { 4725 uint32_t reg; 4726 4727 reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0)); 4728 reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain); 4729 urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg); 4730 4731 if (!(sc->chip & URTWN_CHIP_88E)) { 4732 reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1)); 4733 reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain); 4734 urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg); 4735 } 4736 } 4737 4738 static void 4739 urtwn_scan_start(struct ieee80211com *ic) 4740 { 4741 struct urtwn_softc *sc = ic->ic_softc; 4742 4743 URTWN_LOCK(sc); 4744 /* Receive beacons / probe responses from any BSSID. */ 4745 if (ic->ic_opmode != IEEE80211_M_IBSS) 4746 urtwn_set_rx_bssid_all(sc, 1); 4747 4748 /* Set gain for scanning. */ 4749 urtwn_set_gain(sc, 0x20); 4750 URTWN_UNLOCK(sc); 4751 } 4752 4753 static void 4754 urtwn_scan_end(struct ieee80211com *ic) 4755 { 4756 struct urtwn_softc *sc = ic->ic_softc; 4757 4758 URTWN_LOCK(sc); 4759 /* Restore limitations. */ 4760 if (ic->ic_promisc == 0 && ic->ic_opmode != IEEE80211_M_IBSS) 4761 urtwn_set_rx_bssid_all(sc, 0); 4762 4763 /* Set gain under link. */ 4764 urtwn_set_gain(sc, 0x32); 4765 URTWN_UNLOCK(sc); 4766 } 4767 4768 static void 4769 urtwn_set_channel(struct ieee80211com *ic) 4770 { 4771 struct urtwn_softc *sc = ic->ic_softc; 4772 struct ieee80211_channel *c = ic->ic_curchan; 4773 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); 4774 4775 URTWN_LOCK(sc); 4776 if (vap->iv_state == IEEE80211_S_SCAN) { 4777 /* Make link LED blink during scan. */ 4778 urtwn_set_led(sc, URTWN_LED_LINK, !sc->ledlink); 4779 } 4780 urtwn_set_chan(sc, c, NULL); 4781 sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq); 4782 sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags); 4783 sc->sc_txtap.wt_chan_freq = htole16(c->ic_freq); 4784 sc->sc_txtap.wt_chan_flags = htole16(c->ic_flags); 4785 URTWN_UNLOCK(sc); 4786 } 4787 4788 static int 4789 urtwn_wme_update(struct ieee80211com *ic) 4790 { 4791 const struct wmeParams *wmep = 4792 ic->ic_wme.wme_chanParams.cap_wmeParams; 4793 struct urtwn_softc *sc = ic->ic_softc; 4794 uint8_t aifs, acm, slottime; 4795 int ac; 4796 4797 acm = 0; 4798 slottime = IEEE80211_GET_SLOTTIME(ic); 4799 4800 URTWN_LOCK(sc); 4801 for (ac = WME_AC_BE; ac < WME_NUM_AC; ac++) { 4802 /* AIFS[AC] = AIFSN[AC] * aSlotTime + aSIFSTime. */ 4803 aifs = wmep[ac].wmep_aifsn * slottime + IEEE80211_DUR_SIFS; 4804 urtwn_write_4(sc, wme2queue[ac].reg, 4805 SM(R92C_EDCA_PARAM_TXOP, wmep[ac].wmep_txopLimit) | 4806 SM(R92C_EDCA_PARAM_ECWMIN, wmep[ac].wmep_logcwmin) | 4807 SM(R92C_EDCA_PARAM_ECWMAX, wmep[ac].wmep_logcwmax) | 4808 SM(R92C_EDCA_PARAM_AIFS, aifs)); 4809 if (ac != WME_AC_BE) 4810 acm |= wmep[ac].wmep_acm << ac; 4811 } 4812 4813 if (acm != 0) 4814 acm |= R92C_ACMHWCTRL_EN; 4815 urtwn_write_1(sc, R92C_ACMHWCTRL, 4816 (urtwn_read_1(sc, R92C_ACMHWCTRL) & ~R92C_ACMHWCTRL_ACM_MASK) | 4817 acm); 4818 4819 URTWN_UNLOCK(sc); 4820 4821 return 0; 4822 } 4823 4824 static void 4825 urtwn_update_slot(struct ieee80211com *ic) 4826 { 4827 urtwn_cmd_sleepable(ic->ic_softc, NULL, 0, urtwn_update_slot_cb); 4828 } 4829 4830 static void 4831 urtwn_update_slot_cb(struct urtwn_softc *sc, union sec_param *data) 4832 { 4833 struct ieee80211com *ic = &sc->sc_ic; 4834 uint8_t slottime; 4835 4836 slottime = IEEE80211_GET_SLOTTIME(ic); 4837 4838 URTWN_DPRINTF(sc, URTWN_DEBUG_ANY, "%s: setting slot time to %uus\n", 4839 __func__, slottime); 4840 4841 urtwn_write_1(sc, R92C_SLOT, slottime); 4842 urtwn_update_aifs(sc, slottime); 4843 } 4844 4845 static void 4846 urtwn_update_aifs(struct urtwn_softc *sc, uint8_t slottime) 4847 { 4848 const struct wmeParams *wmep = 4849 sc->sc_ic.ic_wme.wme_chanParams.cap_wmeParams; 4850 uint8_t aifs, ac; 4851 4852 for (ac = WME_AC_BE; ac < WME_NUM_AC; ac++) { 4853 /* AIFS[AC] = AIFSN[AC] * aSlotTime + aSIFSTime. */ 4854 aifs = wmep[ac].wmep_aifsn * slottime + IEEE80211_DUR_SIFS; 4855 urtwn_write_1(sc, wme2queue[ac].reg, aifs); 4856 } 4857 } 4858 4859 static uint8_t 4860 urtwn_get_multi_pos(const uint8_t maddr[]) 4861 { 4862 uint64_t mask = 0x00004d101df481b4; 4863 uint8_t pos = 0x27; /* initial value */ 4864 int i, j; 4865 4866 for (i = 0; i < IEEE80211_ADDR_LEN; i++) 4867 for (j = (i == 0) ? 1 : 0; j < 8; j++) 4868 if ((maddr[i] >> j) & 1) 4869 pos ^= (mask >> (i * 8 + j - 1)); 4870 4871 pos &= 0x3f; 4872 4873 return (pos); 4874 } 4875 4876 static void 4877 urtwn_set_multi(struct urtwn_softc *sc) 4878 { 4879 struct ieee80211com *ic = &sc->sc_ic; 4880 uint32_t mfilt[2]; 4881 4882 URTWN_ASSERT_LOCKED(sc); 4883 4884 /* general structure was copied from ath(4). */ 4885 if (ic->ic_allmulti == 0) { 4886 struct ieee80211vap *vap; 4887 struct ifnet *ifp; 4888 struct ifmultiaddr *ifma; 4889 4890 /* 4891 * Merge multicast addresses to form the hardware filter. 4892 */ 4893 mfilt[0] = mfilt[1] = 0; 4894 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) { 4895 ifp = vap->iv_ifp; 4896 #if defined(__DragonFly__) 4897 /* XXX not implemented */ 4898 #else 4899 if_maddr_rlock(ifp); 4900 #endif 4901 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 4902 caddr_t dl; 4903 uint8_t pos; 4904 4905 dl = LLADDR((struct sockaddr_dl *) 4906 ifma->ifma_addr); 4907 pos = urtwn_get_multi_pos(dl); 4908 4909 mfilt[pos / 32] |= (1 << (pos % 32)); 4910 } 4911 #if defined(__DragonFly__) 4912 /* XXX not implemented */ 4913 #else 4914 if_maddr_runlock(ifp); 4915 #endif 4916 } 4917 } else 4918 mfilt[0] = mfilt[1] = ~0; 4919 4920 4921 urtwn_write_4(sc, R92C_MAR + 0, mfilt[0]); 4922 urtwn_write_4(sc, R92C_MAR + 4, mfilt[1]); 4923 4924 URTWN_DPRINTF(sc, URTWN_DEBUG_STATE, "%s: MC filter %08x:%08x\n", 4925 __func__, mfilt[0], mfilt[1]); 4926 } 4927 4928 static void 4929 urtwn_set_promisc(struct urtwn_softc *sc) 4930 { 4931 struct ieee80211com *ic = &sc->sc_ic; 4932 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); 4933 uint32_t rcr, mask1, mask2; 4934 4935 URTWN_ASSERT_LOCKED(sc); 4936 4937 if (vap->iv_opmode == IEEE80211_M_MONITOR) 4938 return; 4939 4940 mask1 = R92C_RCR_ACF | R92C_RCR_ADF | R92C_RCR_AMF | R92C_RCR_AAP; 4941 mask2 = R92C_RCR_APM; 4942 4943 if (vap->iv_state == IEEE80211_S_RUN) { 4944 switch (vap->iv_opmode) { 4945 case IEEE80211_M_STA: 4946 mask2 |= R92C_RCR_CBSSID_DATA; 4947 /* FALLTHROUGH */ 4948 case IEEE80211_M_HOSTAP: 4949 mask2 |= R92C_RCR_CBSSID_BCN; 4950 break; 4951 case IEEE80211_M_IBSS: 4952 mask2 |= R92C_RCR_CBSSID_DATA; 4953 break; 4954 default: 4955 device_printf(sc->sc_dev, "%s: undefined opmode %d\n", 4956 __func__, vap->iv_opmode); 4957 return; 4958 } 4959 } 4960 4961 rcr = urtwn_read_4(sc, R92C_RCR); 4962 if (ic->ic_promisc == 0) 4963 rcr = (rcr & ~mask1) | mask2; 4964 else 4965 rcr = (rcr & ~mask2) | mask1; 4966 urtwn_write_4(sc, R92C_RCR, rcr); 4967 } 4968 4969 static void 4970 urtwn_update_promisc(struct ieee80211com *ic) 4971 { 4972 struct urtwn_softc *sc = ic->ic_softc; 4973 4974 URTWN_LOCK(sc); 4975 if (sc->sc_flags & URTWN_RUNNING) 4976 urtwn_set_promisc(sc); 4977 URTWN_UNLOCK(sc); 4978 } 4979 4980 static void 4981 urtwn_update_mcast(struct ieee80211com *ic) 4982 { 4983 struct urtwn_softc *sc = ic->ic_softc; 4984 4985 URTWN_LOCK(sc); 4986 if (sc->sc_flags & URTWN_RUNNING) 4987 urtwn_set_multi(sc); 4988 URTWN_UNLOCK(sc); 4989 } 4990 4991 static struct ieee80211_node * 4992 urtwn_node_alloc(struct ieee80211vap *vap, 4993 const uint8_t mac[IEEE80211_ADDR_LEN]) 4994 { 4995 struct urtwn_node *un; 4996 4997 un = kmalloc(sizeof (struct urtwn_node), M_80211_NODE, 4998 M_INTWAIT | M_ZERO); 4999 5000 if (un == NULL) 5001 return NULL; 5002 5003 un->id = URTWN_MACID_UNDEFINED; 5004 5005 return &un->ni; 5006 } 5007 5008 static void 5009 urtwn_newassoc(struct ieee80211_node *ni, int isnew) 5010 { 5011 struct urtwn_softc *sc = ni->ni_ic->ic_softc; 5012 struct urtwn_node *un = URTWN_NODE(ni); 5013 uint8_t id; 5014 5015 /* Only do this bit for R88E chips */ 5016 if (! (sc->chip & URTWN_CHIP_88E)) 5017 return; 5018 5019 if (!isnew) 5020 return; 5021 5022 URTWN_NT_LOCK(sc); 5023 for (id = 0; id <= URTWN_MACID_MAX(sc); id++) { 5024 if (id != URTWN_MACID_BC && sc->node_list[id] == NULL) { 5025 un->id = id; 5026 sc->node_list[id] = ni; 5027 break; 5028 } 5029 } 5030 URTWN_NT_UNLOCK(sc); 5031 5032 if (id > URTWN_MACID_MAX(sc)) { 5033 device_printf(sc->sc_dev, "%s: node table is full\n", 5034 __func__); 5035 } 5036 } 5037 5038 static void 5039 urtwn_node_free(struct ieee80211_node *ni) 5040 { 5041 struct urtwn_softc *sc = ni->ni_ic->ic_softc; 5042 struct urtwn_node *un = URTWN_NODE(ni); 5043 5044 URTWN_NT_LOCK(sc); 5045 if (un->id != URTWN_MACID_UNDEFINED) 5046 sc->node_list[un->id] = NULL; 5047 URTWN_NT_UNLOCK(sc); 5048 5049 sc->sc_node_free(ni); 5050 } 5051 5052 static void 5053 urtwn_set_chan(struct urtwn_softc *sc, struct ieee80211_channel *c, 5054 struct ieee80211_channel *extc) 5055 { 5056 struct ieee80211com *ic = &sc->sc_ic; 5057 uint32_t reg; 5058 u_int chan; 5059 int i; 5060 5061 chan = ieee80211_chan2ieee(ic, c); /* XXX center freq! */ 5062 if (chan == 0 || chan == IEEE80211_CHAN_ANY) { 5063 device_printf(sc->sc_dev, 5064 "%s: invalid channel %x\n", __func__, chan); 5065 return; 5066 } 5067 5068 /* Set Tx power for this new channel. */ 5069 urtwn_set_txpower(sc, c, extc); 5070 5071 for (i = 0; i < sc->nrxchains; i++) { 5072 urtwn_rf_write(sc, i, R92C_RF_CHNLBW, 5073 RW(sc->rf_chnlbw[i], R92C_RF_CHNLBW_CHNL, chan)); 5074 } 5075 #ifndef IEEE80211_NO_HT 5076 if (extc != NULL) { 5077 /* Is secondary channel below or above primary? */ 5078 int prichlo = c->ic_freq < extc->ic_freq; 5079 5080 urtwn_write_1(sc, R92C_BWOPMODE, 5081 urtwn_read_1(sc, R92C_BWOPMODE) & ~R92C_BWOPMODE_20MHZ); 5082 5083 reg = urtwn_read_1(sc, R92C_RRSR + 2); 5084 reg = (reg & ~0x6f) | (prichlo ? 1 : 2) << 5; 5085 urtwn_write_1(sc, R92C_RRSR + 2, reg); 5086 5087 urtwn_bb_write(sc, R92C_FPGA0_RFMOD, 5088 urtwn_bb_read(sc, R92C_FPGA0_RFMOD) | R92C_RFMOD_40MHZ); 5089 urtwn_bb_write(sc, R92C_FPGA1_RFMOD, 5090 urtwn_bb_read(sc, R92C_FPGA1_RFMOD) | R92C_RFMOD_40MHZ); 5091 5092 /* Set CCK side band. */ 5093 reg = urtwn_bb_read(sc, R92C_CCK0_SYSTEM); 5094 reg = (reg & ~0x00000010) | (prichlo ? 0 : 1) << 4; 5095 urtwn_bb_write(sc, R92C_CCK0_SYSTEM, reg); 5096 5097 reg = urtwn_bb_read(sc, R92C_OFDM1_LSTF); 5098 reg = (reg & ~0x00000c00) | (prichlo ? 1 : 2) << 10; 5099 urtwn_bb_write(sc, R92C_OFDM1_LSTF, reg); 5100 5101 urtwn_bb_write(sc, R92C_FPGA0_ANAPARAM2, 5102 urtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) & 5103 ~R92C_FPGA0_ANAPARAM2_CBW20); 5104 5105 reg = urtwn_bb_read(sc, 0x818); 5106 reg = (reg & ~0x0c000000) | (prichlo ? 2 : 1) << 26; 5107 urtwn_bb_write(sc, 0x818, reg); 5108 5109 /* Select 40MHz bandwidth. */ 5110 urtwn_rf_write(sc, 0, R92C_RF_CHNLBW, 5111 (sc->rf_chnlbw[0] & ~0xfff) | chan); 5112 } else 5113 #endif 5114 { 5115 urtwn_write_1(sc, R92C_BWOPMODE, 5116 urtwn_read_1(sc, R92C_BWOPMODE) | R92C_BWOPMODE_20MHZ); 5117 5118 urtwn_bb_write(sc, R92C_FPGA0_RFMOD, 5119 urtwn_bb_read(sc, R92C_FPGA0_RFMOD) & ~R92C_RFMOD_40MHZ); 5120 urtwn_bb_write(sc, R92C_FPGA1_RFMOD, 5121 urtwn_bb_read(sc, R92C_FPGA1_RFMOD) & ~R92C_RFMOD_40MHZ); 5122 5123 if (!(sc->chip & URTWN_CHIP_88E)) { 5124 urtwn_bb_write(sc, R92C_FPGA0_ANAPARAM2, 5125 urtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) | 5126 R92C_FPGA0_ANAPARAM2_CBW20); 5127 } 5128 5129 /* Select 20MHz bandwidth. */ 5130 urtwn_rf_write(sc, 0, R92C_RF_CHNLBW, 5131 (sc->rf_chnlbw[0] & ~0xfff) | chan | 5132 ((sc->chip & URTWN_CHIP_88E) ? R88E_RF_CHNLBW_BW20 : 5133 R92C_RF_CHNLBW_BW20)); 5134 } 5135 } 5136 5137 static void 5138 urtwn_iq_calib(struct urtwn_softc *sc) 5139 { 5140 /* TODO */ 5141 } 5142 5143 static void 5144 urtwn_lc_calib(struct urtwn_softc *sc) 5145 { 5146 uint32_t rf_ac[2]; 5147 uint8_t txmode; 5148 int i; 5149 5150 txmode = urtwn_read_1(sc, R92C_OFDM1_LSTF + 3); 5151 if ((txmode & 0x70) != 0) { 5152 /* Disable all continuous Tx. */ 5153 urtwn_write_1(sc, R92C_OFDM1_LSTF + 3, txmode & ~0x70); 5154 5155 /* Set RF mode to standby mode. */ 5156 for (i = 0; i < sc->nrxchains; i++) { 5157 rf_ac[i] = urtwn_rf_read(sc, i, R92C_RF_AC); 5158 urtwn_rf_write(sc, i, R92C_RF_AC, 5159 RW(rf_ac[i], R92C_RF_AC_MODE, 5160 R92C_RF_AC_MODE_STANDBY)); 5161 } 5162 } else { 5163 /* Block all Tx queues. */ 5164 urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL); 5165 } 5166 /* Start calibration. */ 5167 urtwn_rf_write(sc, 0, R92C_RF_CHNLBW, 5168 urtwn_rf_read(sc, 0, R92C_RF_CHNLBW) | R92C_RF_CHNLBW_LCSTART); 5169 5170 /* Give calibration the time to complete. */ 5171 usb_pause_mtx(&sc->sc_mtx, hz / 10); /* 100ms */ 5172 5173 /* Restore configuration. */ 5174 if ((txmode & 0x70) != 0) { 5175 /* Restore Tx mode. */ 5176 urtwn_write_1(sc, R92C_OFDM1_LSTF + 3, txmode); 5177 /* Restore RF mode. */ 5178 for (i = 0; i < sc->nrxchains; i++) 5179 urtwn_rf_write(sc, i, R92C_RF_AC, rf_ac[i]); 5180 } else { 5181 /* Unblock all Tx queues. */ 5182 urtwn_write_1(sc, R92C_TXPAUSE, 0x00); 5183 } 5184 } 5185 5186 static void 5187 urtwn_temp_calib(struct urtwn_softc *sc) 5188 { 5189 uint8_t temp; 5190 5191 URTWN_ASSERT_LOCKED(sc); 5192 5193 if (!(sc->sc_flags & URTWN_TEMP_MEASURED)) { 5194 /* Start measuring temperature. */ 5195 URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP, 5196 "%s: start measuring temperature\n", __func__); 5197 if (sc->chip & URTWN_CHIP_88E) { 5198 urtwn_rf_write(sc, 0, R88E_RF_T_METER, 5199 R88E_RF_T_METER_START); 5200 } else { 5201 urtwn_rf_write(sc, 0, R92C_RF_T_METER, 5202 R92C_RF_T_METER_START); 5203 } 5204 sc->sc_flags |= URTWN_TEMP_MEASURED; 5205 return; 5206 } 5207 sc->sc_flags &= ~URTWN_TEMP_MEASURED; 5208 5209 /* Read measured temperature. */ 5210 if (sc->chip & URTWN_CHIP_88E) { 5211 temp = MS(urtwn_rf_read(sc, 0, R88E_RF_T_METER), 5212 R88E_RF_T_METER_VAL); 5213 } else { 5214 temp = MS(urtwn_rf_read(sc, 0, R92C_RF_T_METER), 5215 R92C_RF_T_METER_VAL); 5216 } 5217 if (temp == 0) { /* Read failed, skip. */ 5218 URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP, 5219 "%s: temperature read failed, skipping\n", __func__); 5220 return; 5221 } 5222 5223 URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP, 5224 "%s: temperature: previous %u, current %u\n", 5225 __func__, sc->thcal_lctemp, temp); 5226 5227 /* 5228 * Redo LC calibration if temperature changed significantly since 5229 * last calibration. 5230 */ 5231 if (sc->thcal_lctemp == 0) { 5232 /* First LC calibration is performed in urtwn_init(). */ 5233 sc->thcal_lctemp = temp; 5234 } else if (abs(temp - sc->thcal_lctemp) > 1) { 5235 URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP, 5236 "%s: LC calib triggered by temp: %u -> %u\n", 5237 __func__, sc->thcal_lctemp, temp); 5238 urtwn_lc_calib(sc); 5239 /* Record temperature of last LC calibration. */ 5240 sc->thcal_lctemp = temp; 5241 } 5242 } 5243 5244 static int 5245 urtwn_init(struct urtwn_softc *sc) 5246 { 5247 struct ieee80211com *ic = &sc->sc_ic; 5248 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps); 5249 uint8_t macaddr[IEEE80211_ADDR_LEN]; 5250 uint32_t reg; 5251 usb_error_t usb_err = USB_ERR_NORMAL_COMPLETION; 5252 int error; 5253 5254 URTWN_LOCK(sc); 5255 if (sc->sc_flags & URTWN_RUNNING) { 5256 URTWN_UNLOCK(sc); 5257 return (0); 5258 } 5259 5260 /* Init firmware commands ring. */ 5261 sc->fwcur = 0; 5262 5263 /* Allocate Tx/Rx buffers. */ 5264 error = urtwn_alloc_rx_list(sc); 5265 if (error != 0) 5266 goto fail; 5267 5268 error = urtwn_alloc_tx_list(sc); 5269 if (error != 0) 5270 goto fail; 5271 5272 /* Power on adapter. */ 5273 error = urtwn_power_on(sc); 5274 if (error != 0) 5275 goto fail; 5276 5277 /* Initialize DMA. */ 5278 error = urtwn_dma_init(sc); 5279 if (error != 0) 5280 goto fail; 5281 5282 /* Set info size in Rx descriptors (in 64-bit words). */ 5283 urtwn_write_1(sc, R92C_RX_DRVINFO_SZ, 4); 5284 5285 /* Init interrupts. */ 5286 if (sc->chip & URTWN_CHIP_88E) { 5287 usb_err = urtwn_write_4(sc, R88E_HISR, 0xffffffff); 5288 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5289 goto fail; 5290 usb_err = urtwn_write_4(sc, R88E_HIMR, R88E_HIMR_CPWM | R88E_HIMR_CPWM2 | 5291 R88E_HIMR_TBDER | R88E_HIMR_PSTIMEOUT); 5292 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5293 goto fail; 5294 usb_err = urtwn_write_4(sc, R88E_HIMRE, R88E_HIMRE_RXFOVW | 5295 R88E_HIMRE_TXFOVW | R88E_HIMRE_RXERR | R88E_HIMRE_TXERR); 5296 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5297 goto fail; 5298 usb_err = urtwn_write_1(sc, R92C_USB_SPECIAL_OPTION, 5299 urtwn_read_1(sc, R92C_USB_SPECIAL_OPTION) | 5300 R92C_USB_SPECIAL_OPTION_INT_BULK_SEL); 5301 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5302 goto fail; 5303 } else { 5304 usb_err = urtwn_write_4(sc, R92C_HISR, 0xffffffff); 5305 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5306 goto fail; 5307 usb_err = urtwn_write_4(sc, R92C_HIMR, 0xffffffff); 5308 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5309 goto fail; 5310 } 5311 5312 /* Set MAC address. */ 5313 IEEE80211_ADDR_COPY(macaddr, vap ? vap->iv_myaddr : ic->ic_macaddr); 5314 usb_err = urtwn_write_region_1(sc, R92C_MACID, macaddr, IEEE80211_ADDR_LEN); 5315 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5316 goto fail; 5317 5318 /* Set initial network type. */ 5319 urtwn_set_mode(sc, R92C_MSR_INFRA); 5320 5321 /* Initialize Rx filter. */ 5322 urtwn_rxfilter_init(sc); 5323 5324 /* Set response rate. */ 5325 reg = urtwn_read_4(sc, R92C_RRSR); 5326 reg = RW(reg, R92C_RRSR_RATE_BITMAP, R92C_RRSR_RATE_CCK_ONLY_1M); 5327 urtwn_write_4(sc, R92C_RRSR, reg); 5328 5329 /* Set short/long retry limits. */ 5330 urtwn_write_2(sc, R92C_RL, 5331 SM(R92C_RL_SRL, 0x30) | SM(R92C_RL_LRL, 0x30)); 5332 5333 /* Initialize EDCA parameters. */ 5334 urtwn_edca_init(sc); 5335 5336 /* Setup rate fallback. */ 5337 if (!(sc->chip & URTWN_CHIP_88E)) { 5338 urtwn_write_4(sc, R92C_DARFRC + 0, 0x00000000); 5339 urtwn_write_4(sc, R92C_DARFRC + 4, 0x10080404); 5340 urtwn_write_4(sc, R92C_RARFRC + 0, 0x04030201); 5341 urtwn_write_4(sc, R92C_RARFRC + 4, 0x08070605); 5342 } 5343 5344 urtwn_write_1(sc, R92C_FWHW_TXQ_CTRL, 5345 urtwn_read_1(sc, R92C_FWHW_TXQ_CTRL) | 5346 R92C_FWHW_TXQ_CTRL_AMPDU_RTY_NEW); 5347 /* Set ACK timeout. */ 5348 urtwn_write_1(sc, R92C_ACKTO, 0x40); 5349 5350 /* Setup USB aggregation. */ 5351 reg = urtwn_read_4(sc, R92C_TDECTRL); 5352 reg = RW(reg, R92C_TDECTRL_BLK_DESC_NUM, 6); 5353 urtwn_write_4(sc, R92C_TDECTRL, reg); 5354 urtwn_write_1(sc, R92C_TRXDMA_CTRL, 5355 urtwn_read_1(sc, R92C_TRXDMA_CTRL) | 5356 R92C_TRXDMA_CTRL_RXDMA_AGG_EN); 5357 urtwn_write_1(sc, R92C_RXDMA_AGG_PG_TH, 48); 5358 if (sc->chip & URTWN_CHIP_88E) 5359 urtwn_write_1(sc, R92C_RXDMA_AGG_PG_TH + 1, 4); 5360 else { 5361 urtwn_write_1(sc, R92C_USB_DMA_AGG_TO, 4); 5362 urtwn_write_1(sc, R92C_USB_SPECIAL_OPTION, 5363 urtwn_read_1(sc, R92C_USB_SPECIAL_OPTION) | 5364 R92C_USB_SPECIAL_OPTION_AGG_EN); 5365 urtwn_write_1(sc, R92C_USB_AGG_TH, 8); 5366 urtwn_write_1(sc, R92C_USB_AGG_TO, 6); 5367 } 5368 5369 /* Initialize beacon parameters. */ 5370 urtwn_write_2(sc, R92C_BCN_CTRL, 0x1010); 5371 urtwn_write_2(sc, R92C_TBTT_PROHIBIT, 0x6404); 5372 urtwn_write_1(sc, R92C_DRVERLYINT, 0x05); 5373 urtwn_write_1(sc, R92C_BCNDMATIM, 0x02); 5374 urtwn_write_2(sc, R92C_BCNTCFG, 0x660f); 5375 5376 if (!(sc->chip & URTWN_CHIP_88E)) { 5377 /* Setup AMPDU aggregation. */ 5378 urtwn_write_4(sc, R92C_AGGLEN_LMT, 0x99997631); /* MCS7~0 */ 5379 urtwn_write_1(sc, R92C_AGGR_BREAK_TIME, 0x16); 5380 urtwn_write_2(sc, R92C_MAX_AGGR_NUM, 0x0708); 5381 5382 urtwn_write_1(sc, R92C_BCN_MAX_ERR, 0xff); 5383 } 5384 5385 #ifndef URTWN_WITHOUT_UCODE 5386 /* Load 8051 microcode. */ 5387 error = urtwn_load_firmware(sc); 5388 if (error == 0) 5389 sc->sc_flags |= URTWN_FW_LOADED; 5390 #endif 5391 5392 /* Initialize MAC/BB/RF blocks. */ 5393 error = urtwn_mac_init(sc); 5394 if (error != 0) { 5395 device_printf(sc->sc_dev, 5396 "%s: error while initializing MAC block\n", __func__); 5397 goto fail; 5398 } 5399 urtwn_bb_init(sc); 5400 urtwn_rf_init(sc); 5401 5402 /* Reinitialize Rx filter (D3845 is not committed yet). */ 5403 urtwn_rxfilter_init(sc); 5404 5405 if (sc->chip & URTWN_CHIP_88E) { 5406 urtwn_write_2(sc, R92C_CR, 5407 urtwn_read_2(sc, R92C_CR) | R92C_CR_MACTXEN | 5408 R92C_CR_MACRXEN); 5409 } 5410 5411 /* Turn CCK and OFDM blocks on. */ 5412 reg = urtwn_bb_read(sc, R92C_FPGA0_RFMOD); 5413 reg |= R92C_RFMOD_CCK_EN; 5414 usb_err = urtwn_bb_write(sc, R92C_FPGA0_RFMOD, reg); 5415 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5416 goto fail; 5417 reg = urtwn_bb_read(sc, R92C_FPGA0_RFMOD); 5418 reg |= R92C_RFMOD_OFDM_EN; 5419 usb_err = urtwn_bb_write(sc, R92C_FPGA0_RFMOD, reg); 5420 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5421 goto fail; 5422 5423 /* Clear per-station keys table. */ 5424 urtwn_cam_init(sc); 5425 5426 /* Enable decryption / encryption. */ 5427 urtwn_write_2(sc, R92C_SECCFG, 5428 R92C_SECCFG_TXUCKEY_DEF | R92C_SECCFG_RXUCKEY_DEF | 5429 R92C_SECCFG_TXENC_ENA | R92C_SECCFG_RXDEC_ENA | 5430 R92C_SECCFG_TXBCKEY_DEF | R92C_SECCFG_RXBCKEY_DEF); 5431 5432 /* 5433 * Install static keys (if any). 5434 * Must be called after urtwn_cam_init(). 5435 */ 5436 ieee80211_runtask(ic, &sc->cmdq_task); 5437 5438 /* Enable hardware sequence numbering. */ 5439 urtwn_write_1(sc, R92C_HWSEQ_CTRL, R92C_TX_QUEUE_ALL); 5440 5441 /* Enable per-packet TX report. */ 5442 if (sc->chip & URTWN_CHIP_88E) { 5443 urtwn_write_1(sc, R88E_TX_RPT_CTRL, 5444 urtwn_read_1(sc, R88E_TX_RPT_CTRL) | R88E_TX_RPT1_ENA); 5445 } 5446 5447 /* Perform LO and IQ calibrations. */ 5448 urtwn_iq_calib(sc); 5449 /* Perform LC calibration. */ 5450 urtwn_lc_calib(sc); 5451 5452 /* Fix USB interference issue. */ 5453 if (!(sc->chip & URTWN_CHIP_88E)) { 5454 urtwn_write_1(sc, 0xfe40, 0xe0); 5455 urtwn_write_1(sc, 0xfe41, 0x8d); 5456 urtwn_write_1(sc, 0xfe42, 0x80); 5457 5458 urtwn_pa_bias_init(sc); 5459 } 5460 5461 /* Initialize GPIO setting. */ 5462 urtwn_write_1(sc, R92C_GPIO_MUXCFG, 5463 urtwn_read_1(sc, R92C_GPIO_MUXCFG) & ~R92C_GPIO_MUXCFG_ENBT); 5464 5465 /* Fix for lower temperature. */ 5466 if (!(sc->chip & URTWN_CHIP_88E)) 5467 urtwn_write_1(sc, 0x15, 0xe9); 5468 5469 usbd_transfer_start(sc->sc_xfer[URTWN_BULK_RX]); 5470 5471 sc->sc_flags |= URTWN_RUNNING; 5472 5473 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc); 5474 fail: 5475 if (usb_err != USB_ERR_NORMAL_COMPLETION) 5476 error = EIO; 5477 5478 URTWN_UNLOCK(sc); 5479 5480 return (error); 5481 } 5482 5483 static void 5484 urtwn_stop(struct urtwn_softc *sc) 5485 { 5486 5487 URTWN_LOCK(sc); 5488 if (!(sc->sc_flags & URTWN_RUNNING)) { 5489 URTWN_UNLOCK(sc); 5490 return; 5491 } 5492 5493 sc->sc_flags &= ~(URTWN_RUNNING | URTWN_FW_LOADED | 5494 URTWN_TEMP_MEASURED); 5495 sc->thcal_lctemp = 0; 5496 callout_stop(&sc->sc_watchdog_ch); 5497 5498 urtwn_abort_xfers(sc); 5499 urtwn_drain_mbufq(sc); 5500 urtwn_power_off(sc); 5501 URTWN_UNLOCK(sc); 5502 } 5503 5504 static void 5505 urtwn_abort_xfers(struct urtwn_softc *sc) 5506 { 5507 int i; 5508 5509 URTWN_ASSERT_LOCKED(sc); 5510 5511 /* abort any pending transfers */ 5512 for (i = 0; i < URTWN_N_TRANSFER; i++) 5513 usbd_transfer_stop(sc->sc_xfer[i]); 5514 } 5515 5516 static int 5517 urtwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m, 5518 const struct ieee80211_bpf_params *params) 5519 { 5520 struct ieee80211com *ic = ni->ni_ic; 5521 struct urtwn_softc *sc = ic->ic_softc; 5522 struct urtwn_data *bf; 5523 int error; 5524 5525 URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: called; m=%p\n", 5526 __func__, 5527 m); 5528 5529 /* prevent management frames from being sent if we're not ready */ 5530 URTWN_LOCK(sc); 5531 if (!(sc->sc_flags & URTWN_RUNNING)) { 5532 error = ENETDOWN; 5533 goto end; 5534 } 5535 5536 bf = urtwn_getbuf(sc); 5537 if (bf == NULL) { 5538 error = ENOBUFS; 5539 goto end; 5540 } 5541 5542 if (params == NULL) { 5543 /* 5544 * Legacy path; interpret frame contents to decide 5545 * precisely how to send the frame. 5546 */ 5547 error = urtwn_tx_data(sc, ni, m, bf); 5548 } else { 5549 /* 5550 * Caller supplied explicit parameters to use in 5551 * sending the frame. 5552 */ 5553 error = urtwn_tx_raw(sc, ni, m, bf, params); 5554 } 5555 if (error != 0) { 5556 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next); 5557 goto end; 5558 } 5559 5560 sc->sc_txtimer = 5; 5561 callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc); 5562 5563 end: 5564 if (error != 0) 5565 m_freem(m); 5566 5567 URTWN_UNLOCK(sc); 5568 5569 return (error); 5570 } 5571 5572 static void 5573 urtwn_ms_delay(struct urtwn_softc *sc) 5574 { 5575 usb_pause_mtx(&sc->sc_mtx, hz / 1000); 5576 } 5577 5578 static device_method_t urtwn_methods[] = { 5579 /* Device interface */ 5580 DEVMETHOD(device_probe, urtwn_match), 5581 DEVMETHOD(device_attach, urtwn_attach), 5582 DEVMETHOD(device_detach, urtwn_detach), 5583 5584 DEVMETHOD_END 5585 }; 5586 5587 static driver_t urtwn_driver = { 5588 "urtwn", 5589 urtwn_methods, 5590 sizeof(struct urtwn_softc) 5591 }; 5592 5593 static devclass_t urtwn_devclass; 5594 5595 DRIVER_MODULE(urtwn, uhub, urtwn_driver, urtwn_devclass, NULL, NULL); 5596 MODULE_DEPEND(urtwn, usb, 1, 1, 1); 5597 MODULE_DEPEND(urtwn, wlan, 1, 1, 1); 5598 #ifndef URTWN_WITHOUT_UCODE 5599 MODULE_DEPEND(urtwn, firmware, 1, 1, 1); 5600 #endif 5601 MODULE_VERSION(urtwn, 1); 5602 #if defined(__DragonFly__) 5603 /* USB_PNP_HOST_INFO() not implemented */ 5604 #else 5605 USB_PNP_HOST_INFO(urtwn_devs); 5606 #endif 5607