1 /* $OpenBSD: if_rum.c,v 1.40 2006/09/18 16:20:20 damien Exp $ */ 2 /* $NetBSD: if_rum.c,v 1.17 2007/10/21 17:03:37 degroote Exp $ */ 3 4 /*- 5 * Copyright (c) 2005, 2006 Damien Bergamini <damien.bergamini@free.fr> 6 * Copyright (c) 2006 Niall O'Higgins <niallo@openbsd.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 /*- 22 * Ralink Technology RT2501USB/RT2601USB chipset driver 23 * http://www.ralinktech.com/ 24 */ 25 26 #include <sys/cdefs.h> 27 __KERNEL_RCSID(0, "$NetBSD: if_rum.c,v 1.17 2007/10/21 17:03:37 degroote Exp $"); 28 29 #include "bpfilter.h" 30 31 #include <sys/param.h> 32 #include <sys/sockio.h> 33 #include <sys/sysctl.h> 34 #include <sys/mbuf.h> 35 #include <sys/kernel.h> 36 #include <sys/socket.h> 37 #include <sys/systm.h> 38 #include <sys/malloc.h> 39 #include <sys/conf.h> 40 #include <sys/device.h> 41 42 #include <sys/bus.h> 43 #include <machine/endian.h> 44 #include <sys/intr.h> 45 46 #if NBPFILTER > 0 47 #include <net/bpf.h> 48 #endif 49 #include <net/if.h> 50 #include <net/if_arp.h> 51 #include <net/if_dl.h> 52 #include <net/if_ether.h> 53 #include <net/if_media.h> 54 #include <net/if_types.h> 55 56 #include <netinet/in.h> 57 #include <netinet/in_systm.h> 58 #include <netinet/in_var.h> 59 #include <netinet/ip.h> 60 61 #include <net80211/ieee80211_netbsd.h> 62 #include <net80211/ieee80211_var.h> 63 #include <net80211/ieee80211_amrr.h> 64 #include <net80211/ieee80211_radiotap.h> 65 66 #include <dev/firmload.h> 67 68 #include <dev/usb/usb.h> 69 #include <dev/usb/usbdi.h> 70 #include <dev/usb/usbdi_util.h> 71 #include <dev/usb/usbdevs.h> 72 73 #include <dev/usb/if_rumreg.h> 74 #include <dev/usb/if_rumvar.h> 75 76 #ifdef USB_DEBUG 77 #define RUM_DEBUG 78 #endif 79 80 #ifdef RUM_DEBUG 81 #define DPRINTF(x) do { if (rum_debug) logprintf x; } while (0) 82 #define DPRINTFN(n, x) do { if (rum_debug >= (n)) logprintf x; } while (0) 83 int rum_debug = 1; 84 #else 85 #define DPRINTF(x) 86 #define DPRINTFN(n, x) 87 #endif 88 89 /* various supported device vendors/products */ 90 static const struct usb_devno rum_devs[] = { 91 { USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_HWU54DM }, 92 { USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_2 }, 93 { USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_3 }, 94 { USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_4 }, 95 { USB_VENDOR_AMIT, USB_PRODUCT_AMIT_CGWLUSB2GO }, 96 { USB_VENDOR_ASUSTEK, USB_PRODUCT_ASUSTEK_WL167G_2 }, 97 { USB_VENDOR_ASUSTEK, USB_PRODUCT_ASUSTEK_WL167G_3 }, 98 { USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D7050A }, 99 { USB_VENDOR_BELKIN, USB_PRODUCT_BELKIN_F5D9050V3 }, 100 { USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_WUSB54GC }, 101 { USB_VENDOR_CISCOLINKSYS, USB_PRODUCT_CISCOLINKSYS_WUSB54GR }, 102 { USB_VENDOR_CONCEPTRONIC, USB_PRODUCT_CONCEPTRONIC_C54RU2 }, 103 { USB_VENDOR_DICKSMITH, USB_PRODUCT_DICKSMITH_CWD854F }, 104 { USB_VENDOR_DICKSMITH, USB_PRODUCT_DICKSMITH_RT2573 }, 105 { USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_DWLG122C1 }, 106 { USB_VENDOR_DLINK2, USB_PRODUCT_DLINK2_WUA1340 }, 107 { USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GNWB01GS }, 108 { USB_VENDOR_GIGABYTE, USB_PRODUCT_GIGABYTE_GNWI05GS }, 109 { USB_VENDOR_GIGASET, USB_PRODUCT_GIGASET_RT2573 }, 110 { USB_VENDOR_GOODWAY, USB_PRODUCT_GOODWAY_RT2573 }, 111 { USB_VENDOR_GUILLEMOT, USB_PRODUCT_GUILLEMOT_HWGUSB254LB }, 112 { USB_VENDOR_GUILLEMOT, USB_PRODUCT_GUILLEMOT_HWGUSB254V2AP }, 113 { USB_VENDOR_HUAWEI3COM, USB_PRODUCT_HUAWEI3COM_RT2573 }, 114 { USB_VENDOR_MELCO, USB_PRODUCT_MELCO_G54HP }, 115 { USB_VENDOR_MELCO, USB_PRODUCT_MELCO_SG54HP }, 116 { USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2573 }, 117 { USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2573_2 }, 118 { USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2573_3 }, 119 { USB_VENDOR_MSI, USB_PRODUCT_MSI_RT2573_4 }, 120 { USB_VENDOR_NOVATECH, USB_PRODUCT_NOVATECH_RT2573 }, 121 { USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_GWUS54HP }, 122 { USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_GWUS54MINI2 }, 123 { USB_VENDOR_PLANEX2, USB_PRODUCT_PLANEX2_GWUSMM }, 124 { USB_VENDOR_QCOM, USB_PRODUCT_QCOM_RT2573 }, 125 { USB_VENDOR_QCOM, USB_PRODUCT_QCOM_RT2573_2 }, 126 { USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2573 }, 127 { USB_VENDOR_RALINK_2, USB_PRODUCT_RALINK_2_RT2573 }, 128 { USB_VENDOR_RALINK, USB_PRODUCT_RALINK_RT2671 }, 129 { USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_WL113R2 }, 130 { USB_VENDOR_SITECOMEU, USB_PRODUCT_SITECOMEU_WL172 }, 131 { USB_VENDOR_SURECOM, USB_PRODUCT_SURECOM_RT2573 } 132 }; 133 134 Static int rum_attachhook(void *); 135 Static int rum_alloc_tx_list(struct rum_softc *); 136 Static void rum_free_tx_list(struct rum_softc *); 137 Static int rum_alloc_rx_list(struct rum_softc *); 138 Static void rum_free_rx_list(struct rum_softc *); 139 Static int rum_media_change(struct ifnet *); 140 Static void rum_next_scan(void *); 141 Static void rum_task(void *); 142 Static int rum_newstate(struct ieee80211com *, 143 enum ieee80211_state, int); 144 Static void rum_txeof(usbd_xfer_handle, usbd_private_handle, 145 usbd_status); 146 Static void rum_rxeof(usbd_xfer_handle, usbd_private_handle, 147 usbd_status); 148 #if NBPFILTER > 0 149 Static uint8_t rum_rxrate(struct rum_rx_desc *); 150 #endif 151 Static int rum_ack_rate(struct ieee80211com *, int); 152 Static uint16_t rum_txtime(int, int, uint32_t); 153 Static uint8_t rum_plcp_signal(int); 154 Static void rum_setup_tx_desc(struct rum_softc *, 155 struct rum_tx_desc *, uint32_t, uint16_t, int, 156 int); 157 Static int rum_tx_mgt(struct rum_softc *, struct mbuf *, 158 struct ieee80211_node *); 159 Static int rum_tx_data(struct rum_softc *, struct mbuf *, 160 struct ieee80211_node *); 161 Static void rum_start(struct ifnet *); 162 Static void rum_watchdog(struct ifnet *); 163 Static int rum_ioctl(struct ifnet *, u_long, void *); 164 Static void rum_eeprom_read(struct rum_softc *, uint16_t, void *, 165 int); 166 Static uint32_t rum_read(struct rum_softc *, uint16_t); 167 Static void rum_read_multi(struct rum_softc *, uint16_t, void *, 168 int); 169 Static void rum_write(struct rum_softc *, uint16_t, uint32_t); 170 Static void rum_write_multi(struct rum_softc *, uint16_t, void *, 171 size_t); 172 Static void rum_bbp_write(struct rum_softc *, uint8_t, uint8_t); 173 Static uint8_t rum_bbp_read(struct rum_softc *, uint8_t); 174 Static void rum_rf_write(struct rum_softc *, uint8_t, uint32_t); 175 Static void rum_select_antenna(struct rum_softc *); 176 Static void rum_enable_mrr(struct rum_softc *); 177 Static void rum_set_txpreamble(struct rum_softc *); 178 Static void rum_set_basicrates(struct rum_softc *); 179 Static void rum_select_band(struct rum_softc *, 180 struct ieee80211_channel *); 181 Static void rum_set_chan(struct rum_softc *, 182 struct ieee80211_channel *); 183 Static void rum_enable_tsf_sync(struct rum_softc *); 184 Static void rum_update_slot(struct rum_softc *); 185 Static void rum_set_bssid(struct rum_softc *, const uint8_t *); 186 Static void rum_set_macaddr(struct rum_softc *, const uint8_t *); 187 Static void rum_update_promisc(struct rum_softc *); 188 Static const char *rum_get_rf(int); 189 Static void rum_read_eeprom(struct rum_softc *); 190 Static int rum_bbp_init(struct rum_softc *); 191 Static int rum_init(struct ifnet *); 192 Static void rum_stop(struct ifnet *, int); 193 Static int rum_load_microcode(struct rum_softc *, const u_char *, 194 size_t); 195 Static int rum_prepare_beacon(struct rum_softc *); 196 Static void rum_amrr_start(struct rum_softc *, 197 struct ieee80211_node *); 198 Static void rum_amrr_timeout(void *); 199 Static void rum_amrr_update(usbd_xfer_handle, usbd_private_handle, 200 usbd_status status); 201 202 /* 203 * Supported rates for 802.11a/b/g modes (in 500Kbps unit). 204 */ 205 static const struct ieee80211_rateset rum_rateset_11a = 206 { 8, { 12, 18, 24, 36, 48, 72, 96, 108 } }; 207 208 static const struct ieee80211_rateset rum_rateset_11b = 209 { 4, { 2, 4, 11, 22 } }; 210 211 static const struct ieee80211_rateset rum_rateset_11g = 212 { 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } }; 213 214 static const struct { 215 uint32_t reg; 216 uint32_t val; 217 } rum_def_mac[] = { 218 RT2573_DEF_MAC 219 }; 220 221 static const struct { 222 uint8_t reg; 223 uint8_t val; 224 } rum_def_bbp[] = { 225 RT2573_DEF_BBP 226 }; 227 228 static const struct rfprog { 229 uint8_t chan; 230 uint32_t r1, r2, r3, r4; 231 } rum_rf5226[] = { 232 RT2573_RF5226 233 }, rum_rf5225[] = { 234 RT2573_RF5225 235 }; 236 237 USB_DECLARE_DRIVER(rum); 238 239 USB_MATCH(rum) 240 { 241 USB_MATCH_START(rum, uaa); 242 243 return (usb_lookup(rum_devs, uaa->vendor, uaa->product) != NULL) ? 244 UMATCH_VENDOR_PRODUCT : UMATCH_NONE; 245 } 246 247 Static int 248 rum_attachhook(void *xsc) 249 { 250 struct rum_softc *sc = xsc; 251 firmware_handle_t fwh; 252 const char *name = "rum-rt2573"; 253 u_char *ucode; 254 size_t size; 255 int error; 256 257 if ((error = firmware_open("rum", name, &fwh)) != 0) { 258 printf("%s: failed loadfirmware of file %s (error %d)\n", 259 USBDEVNAME(sc->sc_dev), name, error); 260 return error; 261 } 262 size = firmware_get_size(fwh); 263 ucode = firmware_malloc(size); 264 if (ucode == NULL) { 265 printf("%s: failed to allocate firmware memory\n", 266 USBDEVNAME(sc->sc_dev)); 267 firmware_close(fwh); 268 return ENOMEM;; 269 } 270 error = firmware_read(fwh, 0, ucode, size); 271 firmware_close(fwh); 272 if (error != 0) { 273 printf("%s: failed to read firmware (error %d)\n", 274 USBDEVNAME(sc->sc_dev), error); 275 firmware_free(ucode, 0); 276 return error; 277 } 278 279 if (rum_load_microcode(sc, ucode, size) != 0) { 280 printf("%s: could not load 8051 microcode\n", 281 USBDEVNAME(sc->sc_dev)); 282 firmware_free(ucode, 0); 283 return ENXIO; 284 } 285 286 firmware_free(ucode, 0); 287 sc->sc_flags |= RT2573_FWLOADED; 288 289 return 0; 290 } 291 292 USB_ATTACH(rum) 293 { 294 USB_ATTACH_START(rum, sc, uaa); 295 struct ieee80211com *ic = &sc->sc_ic; 296 struct ifnet *ifp = &sc->sc_if; 297 usb_interface_descriptor_t *id; 298 usb_endpoint_descriptor_t *ed; 299 usbd_status error; 300 char *devinfop; 301 int i, ntries; 302 uint32_t tmp; 303 304 sc->sc_udev = uaa->device; 305 sc->sc_flags = 0; 306 307 devinfop = usbd_devinfo_alloc(sc->sc_udev, 0); 308 USB_ATTACH_SETUP; 309 printf("%s: %s\n", USBDEVNAME(sc->sc_dev), devinfop); 310 usbd_devinfo_free(devinfop); 311 312 if (usbd_set_config_no(sc->sc_udev, RT2573_CONFIG_NO, 0) != 0) { 313 printf("%s: could not set configuration no\n", 314 USBDEVNAME(sc->sc_dev)); 315 USB_ATTACH_ERROR_RETURN; 316 } 317 318 /* get the first interface handle */ 319 error = usbd_device2interface_handle(sc->sc_udev, RT2573_IFACE_INDEX, 320 &sc->sc_iface); 321 if (error != 0) { 322 printf("%s: could not get interface handle\n", 323 USBDEVNAME(sc->sc_dev)); 324 USB_ATTACH_ERROR_RETURN; 325 } 326 327 /* 328 * Find endpoints. 329 */ 330 id = usbd_get_interface_descriptor(sc->sc_iface); 331 332 sc->sc_rx_no = sc->sc_tx_no = -1; 333 for (i = 0; i < id->bNumEndpoints; i++) { 334 ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i); 335 if (ed == NULL) { 336 printf("%s: no endpoint descriptor for iface %d\n", 337 USBDEVNAME(sc->sc_dev), i); 338 USB_ATTACH_ERROR_RETURN; 339 } 340 341 if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN && 342 UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) 343 sc->sc_rx_no = ed->bEndpointAddress; 344 else if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_OUT && 345 UE_GET_XFERTYPE(ed->bmAttributes) == UE_BULK) 346 sc->sc_tx_no = ed->bEndpointAddress; 347 } 348 if (sc->sc_rx_no == -1 || sc->sc_tx_no == -1) { 349 printf("%s: missing endpoint\n", USBDEVNAME(sc->sc_dev)); 350 USB_ATTACH_ERROR_RETURN; 351 } 352 353 usb_init_task(&sc->sc_task, rum_task, sc); 354 usb_callout_init(sc->sc_scan_ch); 355 356 sc->amrr.amrr_min_success_threshold = 1; 357 sc->amrr.amrr_max_success_threshold = 10; 358 usb_callout_init(sc->sc_amrr_ch); 359 360 /* retrieve RT2573 rev. no */ 361 for (ntries = 0; ntries < 1000; ntries++) { 362 if ((tmp = rum_read(sc, RT2573_MAC_CSR0)) != 0) 363 break; 364 DELAY(1000); 365 } 366 if (ntries == 1000) { 367 printf("%s: timeout waiting for chip to settle\n", 368 USBDEVNAME(sc->sc_dev)); 369 USB_ATTACH_ERROR_RETURN; 370 } 371 372 /* retrieve MAC address and various other things from EEPROM */ 373 rum_read_eeprom(sc); 374 375 printf("%s: MAC/BBP RT%04x (rev 0x%05x), RF %s, address %s\n", 376 USBDEVNAME(sc->sc_dev), sc->macbbp_rev, tmp, 377 rum_get_rf(sc->rf_rev), ether_sprintf(ic->ic_myaddr)); 378 379 ic->ic_ifp = ifp; 380 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */ 381 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */ 382 ic->ic_state = IEEE80211_S_INIT; 383 384 /* set device capabilities */ 385 ic->ic_caps = 386 IEEE80211_C_IBSS | /* IBSS mode supported */ 387 IEEE80211_C_MONITOR | /* monitor mode supported */ 388 IEEE80211_C_HOSTAP | /* HostAp mode supported */ 389 IEEE80211_C_TXPMGT | /* tx power management */ 390 IEEE80211_C_SHPREAMBLE | /* short preamble supported */ 391 IEEE80211_C_SHSLOT | /* short slot time supported */ 392 IEEE80211_C_WPA; /* 802.11i */ 393 394 if (sc->rf_rev == RT2573_RF_5225 || sc->rf_rev == RT2573_RF_5226) { 395 /* set supported .11a rates */ 396 ic->ic_sup_rates[IEEE80211_MODE_11A] = rum_rateset_11a; 397 398 /* set supported .11a channels */ 399 for (i = 34; i <= 46; i += 4) { 400 ic->ic_channels[i].ic_freq = 401 ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ); 402 ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A; 403 } 404 for (i = 36; i <= 64; i += 4) { 405 ic->ic_channels[i].ic_freq = 406 ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ); 407 ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A; 408 } 409 for (i = 100; i <= 140; i += 4) { 410 ic->ic_channels[i].ic_freq = 411 ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ); 412 ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A; 413 } 414 for (i = 149; i <= 165; i += 4) { 415 ic->ic_channels[i].ic_freq = 416 ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ); 417 ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A; 418 } 419 } 420 421 /* set supported .11b and .11g rates */ 422 ic->ic_sup_rates[IEEE80211_MODE_11B] = rum_rateset_11b; 423 ic->ic_sup_rates[IEEE80211_MODE_11G] = rum_rateset_11g; 424 425 /* set supported .11b and .11g channels (1 through 14) */ 426 for (i = 1; i <= 14; i++) { 427 ic->ic_channels[i].ic_freq = 428 ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ); 429 ic->ic_channels[i].ic_flags = 430 IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM | 431 IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ; 432 } 433 434 ifp->if_softc = sc; 435 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; 436 ifp->if_init = rum_init; 437 ifp->if_ioctl = rum_ioctl; 438 ifp->if_start = rum_start; 439 ifp->if_watchdog = rum_watchdog; 440 IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); 441 IFQ_SET_READY(&ifp->if_snd); 442 memcpy(ifp->if_xname, USBDEVNAME(sc->sc_dev), IFNAMSIZ); 443 444 if_attach(ifp); 445 ieee80211_ifattach(ic); 446 447 /* override state transition machine */ 448 sc->sc_newstate = ic->ic_newstate; 449 ic->ic_newstate = rum_newstate; 450 ieee80211_media_init(ic, rum_media_change, ieee80211_media_status); 451 452 #if NBPFILTER > 0 453 bpfattach2(ifp, DLT_IEEE802_11_RADIO, 454 sizeof (struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN, &sc->sc_drvbpf); 455 456 sc->sc_rxtap_len = sizeof sc->sc_rxtapu; 457 sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len); 458 sc->sc_rxtap.wr_ihdr.it_present = htole32(RT2573_RX_RADIOTAP_PRESENT); 459 460 sc->sc_txtap_len = sizeof sc->sc_txtapu; 461 sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len); 462 sc->sc_txtap.wt_ihdr.it_present = htole32(RT2573_TX_RADIOTAP_PRESENT); 463 #endif 464 465 ieee80211_announce(ic); 466 467 usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, 468 USBDEV(sc->sc_dev)); 469 470 USB_ATTACH_SUCCESS_RETURN; 471 } 472 473 USB_DETACH(rum) 474 { 475 USB_DETACH_START(rum, sc); 476 struct ieee80211com *ic = &sc->sc_ic; 477 struct ifnet *ifp = &sc->sc_if; 478 int s; 479 480 if (!ifp->if_softc) 481 return 0; 482 483 s = splusb(); 484 485 rum_stop(ifp, 1); 486 usb_rem_task(sc->sc_udev, &sc->sc_task); 487 usb_uncallout(sc->sc_scan_ch, rum_next_scan, sc); 488 usb_uncallout(sc->sc_amrr_ch, rum_amrr_timeout, sc); 489 490 if (sc->amrr_xfer != NULL) { 491 usbd_free_xfer(sc->amrr_xfer); 492 sc->amrr_xfer = NULL; 493 } 494 495 if (sc->sc_rx_pipeh != NULL) { 496 usbd_abort_pipe(sc->sc_rx_pipeh); 497 usbd_close_pipe(sc->sc_rx_pipeh); 498 } 499 500 if (sc->sc_tx_pipeh != NULL) { 501 usbd_abort_pipe(sc->sc_tx_pipeh); 502 usbd_close_pipe(sc->sc_tx_pipeh); 503 } 504 505 #if NBPFILTER > 0 506 bpfdetach(ifp); 507 #endif 508 ieee80211_ifdetach(ic); /* free all nodes */ 509 if_detach(ifp); 510 511 splx(s); 512 513 usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, 514 USBDEV(sc->sc_dev)); 515 516 return 0; 517 } 518 519 Static int 520 rum_alloc_tx_list(struct rum_softc *sc) 521 { 522 struct rum_tx_data *data; 523 int i, error; 524 525 sc->tx_queued = 0; 526 527 for (i = 0; i < RT2573_TX_LIST_COUNT; i++) { 528 data = &sc->tx_data[i]; 529 530 data->sc = sc; 531 532 data->xfer = usbd_alloc_xfer(sc->sc_udev); 533 if (data->xfer == NULL) { 534 printf("%s: could not allocate tx xfer\n", 535 USBDEVNAME(sc->sc_dev)); 536 error = ENOMEM; 537 goto fail; 538 } 539 540 data->buf = usbd_alloc_buffer(data->xfer, 541 RT2573_TX_DESC_SIZE + MCLBYTES); 542 if (data->buf == NULL) { 543 printf("%s: could not allocate tx buffer\n", 544 USBDEVNAME(sc->sc_dev)); 545 error = ENOMEM; 546 goto fail; 547 } 548 549 /* clean Tx descriptor */ 550 bzero(data->buf, RT2573_TX_DESC_SIZE); 551 } 552 553 return 0; 554 555 fail: rum_free_tx_list(sc); 556 return error; 557 } 558 559 Static void 560 rum_free_tx_list(struct rum_softc *sc) 561 { 562 struct rum_tx_data *data; 563 int i; 564 565 for (i = 0; i < RT2573_TX_LIST_COUNT; i++) { 566 data = &sc->tx_data[i]; 567 568 if (data->xfer != NULL) { 569 usbd_free_xfer(data->xfer); 570 data->xfer = NULL; 571 } 572 573 if (data->ni != NULL) { 574 ieee80211_free_node(data->ni); 575 data->ni = NULL; 576 } 577 } 578 } 579 580 Static int 581 rum_alloc_rx_list(struct rum_softc *sc) 582 { 583 struct rum_rx_data *data; 584 int i, error; 585 586 for (i = 0; i < RT2573_RX_LIST_COUNT; i++) { 587 data = &sc->rx_data[i]; 588 589 data->sc = sc; 590 591 data->xfer = usbd_alloc_xfer(sc->sc_udev); 592 if (data->xfer == NULL) { 593 printf("%s: could not allocate rx xfer\n", 594 USBDEVNAME(sc->sc_dev)); 595 error = ENOMEM; 596 goto fail; 597 } 598 599 if (usbd_alloc_buffer(data->xfer, MCLBYTES) == NULL) { 600 printf("%s: could not allocate rx buffer\n", 601 USBDEVNAME(sc->sc_dev)); 602 error = ENOMEM; 603 goto fail; 604 } 605 606 MGETHDR(data->m, M_DONTWAIT, MT_DATA); 607 if (data->m == NULL) { 608 printf("%s: could not allocate rx mbuf\n", 609 USBDEVNAME(sc->sc_dev)); 610 error = ENOMEM; 611 goto fail; 612 } 613 614 MCLGET(data->m, M_DONTWAIT); 615 if (!(data->m->m_flags & M_EXT)) { 616 printf("%s: could not allocate rx mbuf cluster\n", 617 USBDEVNAME(sc->sc_dev)); 618 error = ENOMEM; 619 goto fail; 620 } 621 622 data->buf = mtod(data->m, uint8_t *); 623 } 624 625 return 0; 626 627 fail: rum_free_tx_list(sc); 628 return error; 629 } 630 631 Static void 632 rum_free_rx_list(struct rum_softc *sc) 633 { 634 struct rum_rx_data *data; 635 int i; 636 637 for (i = 0; i < RT2573_RX_LIST_COUNT; i++) { 638 data = &sc->rx_data[i]; 639 640 if (data->xfer != NULL) { 641 usbd_free_xfer(data->xfer); 642 data->xfer = NULL; 643 } 644 645 if (data->m != NULL) { 646 m_freem(data->m); 647 data->m = NULL; 648 } 649 } 650 } 651 652 Static int 653 rum_media_change(struct ifnet *ifp) 654 { 655 int error; 656 657 error = ieee80211_media_change(ifp); 658 if (error != ENETRESET) 659 return error; 660 661 if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING)) 662 rum_init(ifp); 663 664 return 0; 665 } 666 667 /* 668 * This function is called periodically (every 200ms) during scanning to 669 * switch from one channel to another. 670 */ 671 Static void 672 rum_next_scan(void *arg) 673 { 674 struct rum_softc *sc = arg; 675 struct ieee80211com *ic = &sc->sc_ic; 676 677 if (ic->ic_state == IEEE80211_S_SCAN) 678 ieee80211_next_scan(ic); 679 } 680 681 Static void 682 rum_task(void *arg) 683 { 684 struct rum_softc *sc = arg; 685 struct ieee80211com *ic = &sc->sc_ic; 686 enum ieee80211_state ostate; 687 struct ieee80211_node *ni; 688 uint32_t tmp; 689 690 ostate = ic->ic_state; 691 692 switch (sc->sc_state) { 693 case IEEE80211_S_INIT: 694 if (ostate == IEEE80211_S_RUN) { 695 /* abort TSF synchronization */ 696 tmp = rum_read(sc, RT2573_TXRX_CSR9); 697 rum_write(sc, RT2573_TXRX_CSR9, tmp & ~0x00ffffff); 698 } 699 break; 700 701 case IEEE80211_S_SCAN: 702 rum_set_chan(sc, ic->ic_curchan); 703 usb_callout(sc->sc_scan_ch, hz / 5, rum_next_scan, sc); 704 break; 705 706 case IEEE80211_S_AUTH: 707 rum_set_chan(sc, ic->ic_curchan); 708 break; 709 710 case IEEE80211_S_ASSOC: 711 rum_set_chan(sc, ic->ic_curchan); 712 break; 713 714 case IEEE80211_S_RUN: 715 rum_set_chan(sc, ic->ic_curchan); 716 717 ni = ic->ic_bss; 718 719 if (ic->ic_opmode != IEEE80211_M_MONITOR) { 720 rum_update_slot(sc); 721 rum_enable_mrr(sc); 722 rum_set_txpreamble(sc); 723 rum_set_basicrates(sc); 724 rum_set_bssid(sc, ni->ni_bssid); 725 } 726 727 if (ic->ic_opmode == IEEE80211_M_HOSTAP || 728 ic->ic_opmode == IEEE80211_M_IBSS) 729 rum_prepare_beacon(sc); 730 731 if (ic->ic_opmode != IEEE80211_M_MONITOR) 732 rum_enable_tsf_sync(sc); 733 734 /* enable automatic rate adaptation in STA mode */ 735 if (ic->ic_opmode == IEEE80211_M_STA && 736 ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) 737 rum_amrr_start(sc, ni); 738 739 break; 740 } 741 742 sc->sc_newstate(ic, sc->sc_state, -1); 743 } 744 745 Static int 746 rum_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg) 747 { 748 struct rum_softc *sc = ic->ic_ifp->if_softc; 749 750 usb_rem_task(sc->sc_udev, &sc->sc_task); 751 usb_uncallout(sc->sc_scan_ch, rum_next_scan, sc); 752 usb_uncallout(sc->sc_amrr_ch, rum_amrr_timeout, sc); 753 754 /* do it in a process context */ 755 sc->sc_state = nstate; 756 usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER); 757 758 return 0; 759 } 760 761 /* quickly determine if a given rate is CCK or OFDM */ 762 #define RUM_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22) 763 764 #define RUM_ACK_SIZE 14 /* 10 + 4(FCS) */ 765 #define RUM_CTS_SIZE 14 /* 10 + 4(FCS) */ 766 767 Static void 768 rum_txeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) 769 { 770 struct rum_tx_data *data = priv; 771 struct rum_softc *sc = data->sc; 772 struct ifnet *ifp = &sc->sc_if; 773 int s; 774 775 if (status != USBD_NORMAL_COMPLETION) { 776 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) 777 return; 778 779 printf("%s: could not transmit buffer: %s\n", 780 USBDEVNAME(sc->sc_dev), usbd_errstr(status)); 781 782 if (status == USBD_STALLED) 783 usbd_clear_endpoint_stall_async(sc->sc_tx_pipeh); 784 785 ifp->if_oerrors++; 786 return; 787 } 788 789 s = splnet(); 790 791 m_freem(data->m); 792 data->m = NULL; 793 ieee80211_free_node(data->ni); 794 data->ni = NULL; 795 796 sc->tx_queued--; 797 ifp->if_opackets++; 798 799 DPRINTFN(10, ("tx done\n")); 800 801 sc->sc_tx_timer = 0; 802 ifp->if_flags &= ~IFF_OACTIVE; 803 rum_start(ifp); 804 805 splx(s); 806 } 807 808 Static void 809 rum_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status) 810 { 811 struct rum_rx_data *data = priv; 812 struct rum_softc *sc = data->sc; 813 struct ieee80211com *ic = &sc->sc_ic; 814 struct ifnet *ifp = &sc->sc_if; 815 struct rum_rx_desc *desc; 816 struct ieee80211_frame *wh; 817 struct ieee80211_node *ni; 818 struct mbuf *mnew, *m; 819 int s, len; 820 821 if (status != USBD_NORMAL_COMPLETION) { 822 if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) 823 return; 824 825 if (status == USBD_STALLED) 826 usbd_clear_endpoint_stall_async(sc->sc_rx_pipeh); 827 goto skip; 828 } 829 830 usbd_get_xfer_status(xfer, NULL, NULL, &len, NULL); 831 832 if (len < RT2573_RX_DESC_SIZE + sizeof (struct ieee80211_frame_min)) { 833 DPRINTF(("%s: xfer too short %d\n", USBDEVNAME(sc->sc_dev), 834 len)); 835 ifp->if_ierrors++; 836 goto skip; 837 } 838 839 desc = (struct rum_rx_desc *)data->buf; 840 841 if (le32toh(desc->flags) & RT2573_RX_CRC_ERROR) { 842 /* 843 * This should not happen since we did not request to receive 844 * those frames when we filled RT2573_TXRX_CSR0. 845 */ 846 DPRINTFN(5, ("CRC error\n")); 847 ifp->if_ierrors++; 848 goto skip; 849 } 850 851 MGETHDR(mnew, M_DONTWAIT, MT_DATA); 852 if (mnew == NULL) { 853 printf("%s: could not allocate rx mbuf\n", 854 USBDEVNAME(sc->sc_dev)); 855 ifp->if_ierrors++; 856 goto skip; 857 } 858 859 MCLGET(mnew, M_DONTWAIT); 860 if (!(mnew->m_flags & M_EXT)) { 861 printf("%s: could not allocate rx mbuf cluster\n", 862 USBDEVNAME(sc->sc_dev)); 863 m_freem(mnew); 864 ifp->if_ierrors++; 865 goto skip; 866 } 867 868 m = data->m; 869 data->m = mnew; 870 data->buf = mtod(data->m, uint8_t *); 871 872 /* finalize mbuf */ 873 m->m_pkthdr.rcvif = ifp; 874 m->m_data = (void *)(desc + 1); 875 m->m_pkthdr.len = m->m_len = (le32toh(desc->flags) >> 16) & 0xfff; 876 877 s = splnet(); 878 879 #if NBPFILTER > 0 880 if (sc->sc_drvbpf != NULL) { 881 struct rum_rx_radiotap_header *tap = &sc->sc_rxtap; 882 883 tap->wr_flags = IEEE80211_RADIOTAP_F_FCS; 884 tap->wr_rate = rum_rxrate(desc); 885 tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq); 886 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags); 887 tap->wr_antenna = sc->rx_ant; 888 tap->wr_antsignal = desc->rssi; 889 890 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m); 891 } 892 #endif 893 894 wh = mtod(m, struct ieee80211_frame *); 895 ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh); 896 897 /* send the frame to the 802.11 layer */ 898 ieee80211_input(ic, m, ni, desc->rssi, 0); 899 900 /* node is no longer needed */ 901 ieee80211_free_node(ni); 902 903 splx(s); 904 905 DPRINTFN(15, ("rx done\n")); 906 907 skip: /* setup a new transfer */ 908 usbd_setup_xfer(xfer, sc->sc_rx_pipeh, data, data->buf, MCLBYTES, 909 USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, rum_rxeof); 910 usbd_transfer(xfer); 911 } 912 913 /* 914 * This function is only used by the Rx radiotap code. It returns the rate at 915 * which a given frame was received. 916 */ 917 #if NBPFILTER > 0 918 Static uint8_t 919 rum_rxrate(struct rum_rx_desc *desc) 920 { 921 if (le32toh(desc->flags) & RT2573_RX_OFDM) { 922 /* reverse function of rum_plcp_signal */ 923 switch (desc->rate) { 924 case 0xb: return 12; 925 case 0xf: return 18; 926 case 0xa: return 24; 927 case 0xe: return 36; 928 case 0x9: return 48; 929 case 0xd: return 72; 930 case 0x8: return 96; 931 case 0xc: return 108; 932 } 933 } else { 934 if (desc->rate == 10) 935 return 2; 936 if (desc->rate == 20) 937 return 4; 938 if (desc->rate == 55) 939 return 11; 940 if (desc->rate == 110) 941 return 22; 942 } 943 return 2; /* should not get there */ 944 } 945 #endif 946 947 /* 948 * Return the expected ack rate for a frame transmitted at rate `rate'. 949 * XXX: this should depend on the destination node basic rate set. 950 */ 951 Static int 952 rum_ack_rate(struct ieee80211com *ic, int rate) 953 { 954 switch (rate) { 955 /* CCK rates */ 956 case 2: 957 return 2; 958 case 4: 959 case 11: 960 case 22: 961 return (ic->ic_curmode == IEEE80211_MODE_11B) ? 4 : rate; 962 963 /* OFDM rates */ 964 case 12: 965 case 18: 966 return 12; 967 case 24: 968 case 36: 969 return 24; 970 case 48: 971 case 72: 972 case 96: 973 case 108: 974 return 48; 975 } 976 977 /* default to 1Mbps */ 978 return 2; 979 } 980 981 /* 982 * Compute the duration (in us) needed to transmit `len' bytes at rate `rate'. 983 * The function automatically determines the operating mode depending on the 984 * given rate. `flags' indicates whether short preamble is in use or not. 985 */ 986 Static uint16_t 987 rum_txtime(int len, int rate, uint32_t flags) 988 { 989 uint16_t txtime; 990 991 if (RUM_RATE_IS_OFDM(rate)) { 992 /* IEEE Std 802.11a-1999, pp. 37 */ 993 txtime = (8 + 4 * len + 3 + rate - 1) / rate; 994 txtime = 16 + 4 + 4 * txtime + 6; 995 } else { 996 /* IEEE Std 802.11b-1999, pp. 28 */ 997 txtime = (16 * len + rate - 1) / rate; 998 if (rate != 2 && (flags & IEEE80211_F_SHPREAMBLE)) 999 txtime += 72 + 24; 1000 else 1001 txtime += 144 + 48; 1002 } 1003 return txtime; 1004 } 1005 1006 Static uint8_t 1007 rum_plcp_signal(int rate) 1008 { 1009 switch (rate) { 1010 /* CCK rates (returned values are device-dependent) */ 1011 case 2: return 0x0; 1012 case 4: return 0x1; 1013 case 11: return 0x2; 1014 case 22: return 0x3; 1015 1016 /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */ 1017 case 12: return 0xb; 1018 case 18: return 0xf; 1019 case 24: return 0xa; 1020 case 36: return 0xe; 1021 case 48: return 0x9; 1022 case 72: return 0xd; 1023 case 96: return 0x8; 1024 case 108: return 0xc; 1025 1026 /* unsupported rates (should not get there) */ 1027 default: return 0xff; 1028 } 1029 } 1030 1031 Static void 1032 rum_setup_tx_desc(struct rum_softc *sc, struct rum_tx_desc *desc, 1033 uint32_t flags, uint16_t xflags, int len, int rate) 1034 { 1035 struct ieee80211com *ic = &sc->sc_ic; 1036 uint16_t plcp_length; 1037 int remainder; 1038 1039 desc->flags = htole32(flags); 1040 desc->flags |= htole32(RT2573_TX_VALID); 1041 desc->flags |= htole32(len << 16); 1042 1043 desc->xflags = htole16(xflags); 1044 1045 desc->wme = htole16( 1046 RT2573_QID(0) | 1047 RT2573_AIFSN(2) | 1048 RT2573_LOGCWMIN(4) | 1049 RT2573_LOGCWMAX(10)); 1050 1051 /* setup PLCP fields */ 1052 desc->plcp_signal = rum_plcp_signal(rate); 1053 desc->plcp_service = 4; 1054 1055 len += IEEE80211_CRC_LEN; 1056 if (RUM_RATE_IS_OFDM(rate)) { 1057 desc->flags |= htole32(RT2573_TX_OFDM); 1058 1059 plcp_length = len & 0xfff; 1060 desc->plcp_length_hi = plcp_length >> 6; 1061 desc->plcp_length_lo = plcp_length & 0x3f; 1062 } else { 1063 plcp_length = (16 * len + rate - 1) / rate; 1064 if (rate == 22) { 1065 remainder = (16 * len) % 22; 1066 if (remainder != 0 && remainder < 7) 1067 desc->plcp_service |= RT2573_PLCP_LENGEXT; 1068 } 1069 desc->plcp_length_hi = plcp_length >> 8; 1070 desc->plcp_length_lo = plcp_length & 0xff; 1071 1072 if (rate != 2 && (ic->ic_flags & IEEE80211_F_SHPREAMBLE)) 1073 desc->plcp_signal |= 0x08; 1074 } 1075 } 1076 1077 #define RUM_TX_TIMEOUT 5000 1078 1079 Static int 1080 rum_tx_mgt(struct rum_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) 1081 { 1082 struct ieee80211com *ic = &sc->sc_ic; 1083 struct rum_tx_desc *desc; 1084 struct rum_tx_data *data; 1085 struct ieee80211_frame *wh; 1086 struct ieee80211_key *k; 1087 uint32_t flags = 0; 1088 uint16_t dur; 1089 usbd_status error; 1090 int xferlen, rate; 1091 1092 data = &sc->tx_data[0]; 1093 desc = (struct rum_tx_desc *)data->buf; 1094 1095 rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2; 1096 1097 data->m = m0; 1098 data->ni = ni; 1099 1100 wh = mtod(m0, struct ieee80211_frame *); 1101 1102 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { 1103 k = ieee80211_crypto_encap(ic, ni, m0); 1104 if (k == NULL) { 1105 m_freem(m0); 1106 return ENOBUFS; 1107 } 1108 } 1109 1110 wh = mtod(m0, struct ieee80211_frame *); 1111 1112 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { 1113 flags |= RT2573_TX_ACK; 1114 1115 dur = rum_txtime(RUM_ACK_SIZE, rum_ack_rate(ic, rate), 1116 ic->ic_flags) + sc->sifs; 1117 *(uint16_t *)wh->i_dur = htole16(dur); 1118 1119 /* tell hardware to set timestamp in probe responses */ 1120 if ((wh->i_fc[0] & 1121 (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == 1122 (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP)) 1123 flags |= RT2573_TX_TIMESTAMP; 1124 } 1125 1126 #if NBPFILTER > 0 1127 if (sc->sc_drvbpf != NULL) { 1128 struct rum_tx_radiotap_header *tap = &sc->sc_txtap; 1129 1130 tap->wt_flags = 0; 1131 tap->wt_rate = rate; 1132 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); 1133 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); 1134 tap->wt_antenna = sc->tx_ant; 1135 1136 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0); 1137 } 1138 #endif 1139 1140 m_copydata(m0, 0, m0->m_pkthdr.len, data->buf + RT2573_TX_DESC_SIZE); 1141 rum_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, rate); 1142 1143 /* align end on a 4-bytes boundary */ 1144 xferlen = (RT2573_TX_DESC_SIZE + m0->m_pkthdr.len + 3) & ~3; 1145 1146 /* 1147 * No space left in the last URB to store the extra 4 bytes, force 1148 * sending of another URB. 1149 */ 1150 if ((xferlen % 64) == 0) 1151 xferlen += 4; 1152 1153 DPRINTFN(10, ("sending msg frame len=%zu rate=%u xfer len=%u\n", 1154 (size_t)m0->m_pkthdr.len + RT2573_TX_DESC_SIZE, 1155 rate, xferlen)); 1156 1157 usbd_setup_xfer(data->xfer, sc->sc_tx_pipeh, data, data->buf, xferlen, 1158 USBD_FORCE_SHORT_XFER | USBD_NO_COPY, RUM_TX_TIMEOUT, rum_txeof); 1159 1160 error = usbd_transfer(data->xfer); 1161 if (error != USBD_NORMAL_COMPLETION && error != USBD_IN_PROGRESS) { 1162 m_freem(m0); 1163 return error; 1164 } 1165 1166 sc->tx_queued++; 1167 1168 return 0; 1169 } 1170 1171 Static int 1172 rum_tx_data(struct rum_softc *sc, struct mbuf *m0, struct ieee80211_node *ni) 1173 { 1174 struct ieee80211com *ic = &sc->sc_ic; 1175 struct rum_tx_desc *desc; 1176 struct rum_tx_data *data; 1177 struct ieee80211_frame *wh; 1178 struct ieee80211_key *k; 1179 uint32_t flags = 0; 1180 uint16_t dur; 1181 usbd_status error; 1182 int xferlen, rate; 1183 1184 wh = mtod(m0, struct ieee80211_frame *); 1185 1186 if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) 1187 rate = ic->ic_bss->ni_rates.rs_rates[ic->ic_fixed_rate]; 1188 else 1189 rate = ni->ni_rates.rs_rates[ni->ni_txrate]; 1190 rate &= IEEE80211_RATE_VAL; 1191 1192 if (wh->i_fc[1] & IEEE80211_FC1_WEP) { 1193 k = ieee80211_crypto_encap(ic, ni, m0); 1194 if (k == NULL) { 1195 m_freem(m0); 1196 return ENOBUFS; 1197 } 1198 1199 /* packet header may have moved, reset our local pointer */ 1200 wh = mtod(m0, struct ieee80211_frame *); 1201 } 1202 1203 data = &sc->tx_data[0]; 1204 desc = (struct rum_tx_desc *)data->buf; 1205 1206 data->m = m0; 1207 data->ni = ni; 1208 1209 if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) { 1210 flags |= RT2573_TX_ACK; 1211 1212 dur = rum_txtime(RUM_ACK_SIZE, rum_ack_rate(ic, rate), 1213 ic->ic_flags) + sc->sifs; 1214 *(uint16_t *)wh->i_dur = htole16(dur); 1215 } 1216 1217 #if NBPFILTER > 0 1218 if (sc->sc_drvbpf != NULL) { 1219 struct rum_tx_radiotap_header *tap = &sc->sc_txtap; 1220 1221 tap->wt_flags = 0; 1222 tap->wt_rate = rate; 1223 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq); 1224 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags); 1225 tap->wt_antenna = sc->tx_ant; 1226 1227 bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0); 1228 } 1229 #endif 1230 1231 m_copydata(m0, 0, m0->m_pkthdr.len, data->buf + RT2573_TX_DESC_SIZE); 1232 rum_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, rate); 1233 1234 /* align end on a 4-bytes boundary */ 1235 xferlen = (RT2573_TX_DESC_SIZE + m0->m_pkthdr.len + 3) & ~3; 1236 1237 /* 1238 * No space left in the last URB to store the extra 4 bytes, force 1239 * sending of another URB. 1240 */ 1241 if ((xferlen % 64) == 0) 1242 xferlen += 4; 1243 1244 DPRINTFN(10, ("sending data frame len=%zu rate=%u xfer len=%u\n", 1245 (size_t)m0->m_pkthdr.len + RT2573_TX_DESC_SIZE, 1246 rate, xferlen)); 1247 1248 usbd_setup_xfer(data->xfer, sc->sc_tx_pipeh, data, data->buf, xferlen, 1249 USBD_FORCE_SHORT_XFER | USBD_NO_COPY, RUM_TX_TIMEOUT, rum_txeof); 1250 1251 error = usbd_transfer(data->xfer); 1252 if (error != USBD_NORMAL_COMPLETION && error != USBD_IN_PROGRESS) { 1253 m_freem(m0); 1254 return error; 1255 } 1256 1257 sc->tx_queued++; 1258 1259 return 0; 1260 } 1261 1262 Static void 1263 rum_start(struct ifnet *ifp) 1264 { 1265 struct rum_softc *sc = ifp->if_softc; 1266 struct ieee80211com *ic = &sc->sc_ic; 1267 struct ether_header *eh; 1268 struct ieee80211_node *ni; 1269 struct mbuf *m0; 1270 1271 for (;;) { 1272 IF_POLL(&ic->ic_mgtq, m0); 1273 if (m0 != NULL) { 1274 if (sc->tx_queued >= RT2573_TX_LIST_COUNT) { 1275 ifp->if_flags |= IFF_OACTIVE; 1276 break; 1277 } 1278 IF_DEQUEUE(&ic->ic_mgtq, m0); 1279 1280 ni = (struct ieee80211_node *)m0->m_pkthdr.rcvif; 1281 m0->m_pkthdr.rcvif = NULL; 1282 #if NBPFILTER > 0 1283 if (ic->ic_rawbpf != NULL) 1284 bpf_mtap(ic->ic_rawbpf, m0); 1285 #endif 1286 if (rum_tx_mgt(sc, m0, ni) != 0) 1287 break; 1288 1289 } else { 1290 if (ic->ic_state != IEEE80211_S_RUN) 1291 break; 1292 IFQ_POLL(&ifp->if_snd, m0); 1293 if (m0 == NULL) 1294 break; 1295 if (sc->tx_queued >= RT2573_TX_LIST_COUNT) { 1296 ifp->if_flags |= IFF_OACTIVE; 1297 break; 1298 } 1299 IFQ_DEQUEUE(&ifp->if_snd, m0); 1300 if (m0->m_len < sizeof(struct ether_header) && 1301 !(m0 = m_pullup(m0, sizeof(struct ether_header)))) 1302 continue; 1303 1304 eh = mtod(m0, struct ether_header *); 1305 ni = ieee80211_find_txnode(ic, eh->ether_dhost); 1306 if (ni == NULL) { 1307 m_freem(m0); 1308 continue; 1309 } 1310 #if NBPFILTER > 0 1311 if (ifp->if_bpf != NULL) 1312 bpf_mtap(ifp->if_bpf, m0); 1313 #endif 1314 m0 = ieee80211_encap(ic, m0, ni); 1315 if (m0 == NULL) { 1316 ieee80211_free_node(ni); 1317 continue; 1318 } 1319 #if NBPFILTER > 0 1320 if (ic->ic_rawbpf != NULL) 1321 bpf_mtap(ic->ic_rawbpf, m0); 1322 #endif 1323 if (rum_tx_data(sc, m0, ni) != 0) { 1324 ieee80211_free_node(ni); 1325 ifp->if_oerrors++; 1326 break; 1327 } 1328 } 1329 1330 sc->sc_tx_timer = 5; 1331 ifp->if_timer = 1; 1332 } 1333 } 1334 1335 Static void 1336 rum_watchdog(struct ifnet *ifp) 1337 { 1338 struct rum_softc *sc = ifp->if_softc; 1339 struct ieee80211com *ic = &sc->sc_ic; 1340 1341 ifp->if_timer = 0; 1342 1343 if (sc->sc_tx_timer > 0) { 1344 if (--sc->sc_tx_timer == 0) { 1345 printf("%s: device timeout\n", USBDEVNAME(sc->sc_dev)); 1346 /*rum_init(ifp); XXX needs a process context! */ 1347 ifp->if_oerrors++; 1348 return; 1349 } 1350 ifp->if_timer = 1; 1351 } 1352 1353 ieee80211_watchdog(ic); 1354 } 1355 1356 Static int 1357 rum_ioctl(struct ifnet *ifp, u_long cmd, void *data) 1358 { 1359 struct rum_softc *sc = ifp->if_softc; 1360 struct ieee80211com *ic = &sc->sc_ic; 1361 int s, error = 0; 1362 1363 s = splnet(); 1364 1365 switch (cmd) { 1366 case SIOCSIFFLAGS: 1367 if (ifp->if_flags & IFF_UP) { 1368 if (ifp->if_flags & IFF_RUNNING) 1369 rum_update_promisc(sc); 1370 else 1371 rum_init(ifp); 1372 } else { 1373 if (ifp->if_flags & IFF_RUNNING) 1374 rum_stop(ifp, 1); 1375 } 1376 break; 1377 1378 default: 1379 error = ieee80211_ioctl(ic, cmd, data); 1380 } 1381 1382 if (error == ENETRESET) { 1383 if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == 1384 (IFF_UP | IFF_RUNNING)) 1385 rum_init(ifp); 1386 error = 0; 1387 } 1388 1389 splx(s); 1390 1391 return error; 1392 } 1393 1394 Static void 1395 rum_eeprom_read(struct rum_softc *sc, uint16_t addr, void *buf, int len) 1396 { 1397 usb_device_request_t req; 1398 usbd_status error; 1399 1400 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1401 req.bRequest = RT2573_READ_EEPROM; 1402 USETW(req.wValue, 0); 1403 USETW(req.wIndex, addr); 1404 USETW(req.wLength, len); 1405 1406 error = usbd_do_request(sc->sc_udev, &req, buf); 1407 if (error != 0) { 1408 printf("%s: could not read EEPROM: %s\n", 1409 USBDEVNAME(sc->sc_dev), usbd_errstr(error)); 1410 } 1411 } 1412 1413 Static uint32_t 1414 rum_read(struct rum_softc *sc, uint16_t reg) 1415 { 1416 uint32_t val; 1417 1418 rum_read_multi(sc, reg, &val, sizeof val); 1419 1420 return le32toh(val); 1421 } 1422 1423 Static void 1424 rum_read_multi(struct rum_softc *sc, uint16_t reg, void *buf, int len) 1425 { 1426 usb_device_request_t req; 1427 usbd_status error; 1428 1429 req.bmRequestType = UT_READ_VENDOR_DEVICE; 1430 req.bRequest = RT2573_READ_MULTI_MAC; 1431 USETW(req.wValue, 0); 1432 USETW(req.wIndex, reg); 1433 USETW(req.wLength, len); 1434 1435 error = usbd_do_request(sc->sc_udev, &req, buf); 1436 if (error != 0) { 1437 printf("%s: could not multi read MAC register: %s\n", 1438 USBDEVNAME(sc->sc_dev), usbd_errstr(error)); 1439 } 1440 } 1441 1442 Static void 1443 rum_write(struct rum_softc *sc, uint16_t reg, uint32_t val) 1444 { 1445 uint32_t tmp = htole32(val); 1446 1447 rum_write_multi(sc, reg, &tmp, sizeof tmp); 1448 } 1449 1450 Static void 1451 rum_write_multi(struct rum_softc *sc, uint16_t reg, void *buf, size_t len) 1452 { 1453 usb_device_request_t req; 1454 usbd_status error; 1455 1456 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 1457 req.bRequest = RT2573_WRITE_MULTI_MAC; 1458 USETW(req.wValue, 0); 1459 USETW(req.wIndex, reg); 1460 USETW(req.wLength, len); 1461 1462 error = usbd_do_request(sc->sc_udev, &req, buf); 1463 if (error != 0) { 1464 printf("%s: could not multi write MAC register: %s\n", 1465 USBDEVNAME(sc->sc_dev), usbd_errstr(error)); 1466 } 1467 } 1468 1469 Static void 1470 rum_bbp_write(struct rum_softc *sc, uint8_t reg, uint8_t val) 1471 { 1472 uint32_t tmp; 1473 int ntries; 1474 1475 for (ntries = 0; ntries < 5; ntries++) { 1476 if (!(rum_read(sc, RT2573_PHY_CSR3) & RT2573_BBP_BUSY)) 1477 break; 1478 } 1479 if (ntries == 5) { 1480 printf("%s: could not write to BBP\n", USBDEVNAME(sc->sc_dev)); 1481 return; 1482 } 1483 1484 tmp = RT2573_BBP_BUSY | (reg & 0x7f) << 8 | val; 1485 rum_write(sc, RT2573_PHY_CSR3, tmp); 1486 } 1487 1488 Static uint8_t 1489 rum_bbp_read(struct rum_softc *sc, uint8_t reg) 1490 { 1491 uint32_t val; 1492 int ntries; 1493 1494 for (ntries = 0; ntries < 5; ntries++) { 1495 if (!(rum_read(sc, RT2573_PHY_CSR3) & RT2573_BBP_BUSY)) 1496 break; 1497 } 1498 if (ntries == 5) { 1499 printf("%s: could not read BBP\n", USBDEVNAME(sc->sc_dev)); 1500 return 0; 1501 } 1502 1503 val = RT2573_BBP_BUSY | RT2573_BBP_READ | reg << 8; 1504 rum_write(sc, RT2573_PHY_CSR3, val); 1505 1506 for (ntries = 0; ntries < 100; ntries++) { 1507 val = rum_read(sc, RT2573_PHY_CSR3); 1508 if (!(val & RT2573_BBP_BUSY)) 1509 return val & 0xff; 1510 DELAY(1); 1511 } 1512 1513 printf("%s: could not read BBP\n", USBDEVNAME(sc->sc_dev)); 1514 return 0; 1515 } 1516 1517 Static void 1518 rum_rf_write(struct rum_softc *sc, uint8_t reg, uint32_t val) 1519 { 1520 uint32_t tmp; 1521 int ntries; 1522 1523 for (ntries = 0; ntries < 5; ntries++) { 1524 if (!(rum_read(sc, RT2573_PHY_CSR4) & RT2573_RF_BUSY)) 1525 break; 1526 } 1527 if (ntries == 5) { 1528 printf("%s: could not write to RF\n", USBDEVNAME(sc->sc_dev)); 1529 return; 1530 } 1531 1532 tmp = RT2573_RF_BUSY | RT2573_RF_20BIT | (val & 0xfffff) << 2 | 1533 (reg & 3); 1534 rum_write(sc, RT2573_PHY_CSR4, tmp); 1535 1536 /* remember last written value in sc */ 1537 sc->rf_regs[reg] = val; 1538 1539 DPRINTFN(15, ("RF R[%u] <- 0x%05x\n", reg & 3, val & 0xfffff)); 1540 } 1541 1542 Static void 1543 rum_select_antenna(struct rum_softc *sc) 1544 { 1545 uint8_t bbp4, bbp77; 1546 uint32_t tmp; 1547 1548 bbp4 = rum_bbp_read(sc, 4); 1549 bbp77 = rum_bbp_read(sc, 77); 1550 1551 /* TBD */ 1552 1553 /* make sure Rx is disabled before switching antenna */ 1554 tmp = rum_read(sc, RT2573_TXRX_CSR0); 1555 rum_write(sc, RT2573_TXRX_CSR0, tmp | RT2573_DISABLE_RX); 1556 1557 rum_bbp_write(sc, 4, bbp4); 1558 rum_bbp_write(sc, 77, bbp77); 1559 1560 rum_write(sc, RT2573_TXRX_CSR0, tmp); 1561 } 1562 1563 /* 1564 * Enable multi-rate retries for frames sent at OFDM rates. 1565 * In 802.11b/g mode, allow fallback to CCK rates. 1566 */ 1567 Static void 1568 rum_enable_mrr(struct rum_softc *sc) 1569 { 1570 struct ieee80211com *ic = &sc->sc_ic; 1571 uint32_t tmp; 1572 1573 tmp = rum_read(sc, RT2573_TXRX_CSR4); 1574 1575 tmp &= ~RT2573_MRR_CCK_FALLBACK; 1576 if (!IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) 1577 tmp |= RT2573_MRR_CCK_FALLBACK; 1578 tmp |= RT2573_MRR_ENABLED; 1579 1580 rum_write(sc, RT2573_TXRX_CSR4, tmp); 1581 } 1582 1583 Static void 1584 rum_set_txpreamble(struct rum_softc *sc) 1585 { 1586 uint32_t tmp; 1587 1588 tmp = rum_read(sc, RT2573_TXRX_CSR4); 1589 1590 tmp &= ~RT2573_SHORT_PREAMBLE; 1591 if (sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE) 1592 tmp |= RT2573_SHORT_PREAMBLE; 1593 1594 rum_write(sc, RT2573_TXRX_CSR4, tmp); 1595 } 1596 1597 Static void 1598 rum_set_basicrates(struct rum_softc *sc) 1599 { 1600 struct ieee80211com *ic = &sc->sc_ic; 1601 1602 /* update basic rate set */ 1603 if (ic->ic_curmode == IEEE80211_MODE_11B) { 1604 /* 11b basic rates: 1, 2Mbps */ 1605 rum_write(sc, RT2573_TXRX_CSR5, 0x3); 1606 } else if (IEEE80211_IS_CHAN_5GHZ(ic->ic_bss->ni_chan)) { 1607 /* 11a basic rates: 6, 12, 24Mbps */ 1608 rum_write(sc, RT2573_TXRX_CSR5, 0x150); 1609 } else { 1610 /* 11g basic rates: 1, 2, 5.5, 11, 6, 12, 24Mbps */ 1611 rum_write(sc, RT2573_TXRX_CSR5, 0x15f); 1612 } 1613 } 1614 1615 /* 1616 * Reprogram MAC/BBP to switch to a new band. Values taken from the reference 1617 * driver. 1618 */ 1619 Static void 1620 rum_select_band(struct rum_softc *sc, struct ieee80211_channel *c) 1621 { 1622 uint8_t bbp17, bbp35, bbp96, bbp97, bbp98, bbp104; 1623 uint32_t tmp; 1624 1625 /* update all BBP registers that depend on the band */ 1626 bbp17 = 0x20; bbp96 = 0x48; bbp104 = 0x2c; 1627 bbp35 = 0x50; bbp97 = 0x48; bbp98 = 0x48; 1628 if (IEEE80211_IS_CHAN_5GHZ(c)) { 1629 bbp17 += 0x08; bbp96 += 0x10; bbp104 += 0x0c; 1630 bbp35 += 0x10; bbp97 += 0x10; bbp98 += 0x10; 1631 } 1632 if ((IEEE80211_IS_CHAN_2GHZ(c) && sc->ext_2ghz_lna) || 1633 (IEEE80211_IS_CHAN_5GHZ(c) && sc->ext_5ghz_lna)) { 1634 bbp17 += 0x10; bbp96 += 0x10; bbp104 += 0x10; 1635 } 1636 1637 sc->bbp17 = bbp17; 1638 rum_bbp_write(sc, 17, bbp17); 1639 rum_bbp_write(sc, 96, bbp96); 1640 rum_bbp_write(sc, 104, bbp104); 1641 1642 if ((IEEE80211_IS_CHAN_2GHZ(c) && sc->ext_2ghz_lna) || 1643 (IEEE80211_IS_CHAN_5GHZ(c) && sc->ext_5ghz_lna)) { 1644 rum_bbp_write(sc, 75, 0x80); 1645 rum_bbp_write(sc, 86, 0x80); 1646 rum_bbp_write(sc, 88, 0x80); 1647 } 1648 1649 rum_bbp_write(sc, 35, bbp35); 1650 rum_bbp_write(sc, 97, bbp97); 1651 rum_bbp_write(sc, 98, bbp98); 1652 1653 tmp = rum_read(sc, RT2573_PHY_CSR0); 1654 tmp &= ~(RT2573_PA_PE_2GHZ | RT2573_PA_PE_5GHZ); 1655 if (IEEE80211_IS_CHAN_2GHZ(c)) 1656 tmp |= RT2573_PA_PE_2GHZ; 1657 else 1658 tmp |= RT2573_PA_PE_5GHZ; 1659 rum_write(sc, RT2573_PHY_CSR0, tmp); 1660 1661 /* 802.11a uses a 16 microseconds short interframe space */ 1662 sc->sifs = IEEE80211_IS_CHAN_5GHZ(c) ? 16 : 10; 1663 } 1664 1665 Static void 1666 rum_set_chan(struct rum_softc *sc, struct ieee80211_channel *c) 1667 { 1668 struct ieee80211com *ic = &sc->sc_ic; 1669 const struct rfprog *rfprog; 1670 uint8_t bbp3, bbp94 = RT2573_BBPR94_DEFAULT; 1671 int8_t power; 1672 u_int i, chan; 1673 1674 chan = ieee80211_chan2ieee(ic, c); 1675 if (chan == 0 || chan == IEEE80211_CHAN_ANY) 1676 return; 1677 1678 /* select the appropriate RF settings based on what EEPROM says */ 1679 rfprog = (sc->rf_rev == RT2573_RF_5225 || 1680 sc->rf_rev == RT2573_RF_2527) ? rum_rf5225 : rum_rf5226; 1681 1682 /* find the settings for this channel (we know it exists) */ 1683 for (i = 0; rfprog[i].chan != chan; i++); 1684 1685 power = sc->txpow[i]; 1686 if (power < 0) { 1687 bbp94 += power; 1688 power = 0; 1689 } else if (power > 31) { 1690 bbp94 += power - 31; 1691 power = 31; 1692 } 1693 1694 /* 1695 * If we are switching from the 2GHz band to the 5GHz band or 1696 * vice-versa, BBP registers need to be reprogrammed. 1697 */ 1698 if (c->ic_flags != ic->ic_curchan->ic_flags) { 1699 rum_select_band(sc, c); 1700 rum_select_antenna(sc); 1701 } 1702 ic->ic_curchan = c; 1703 1704 rum_rf_write(sc, RT2573_RF1, rfprog[i].r1); 1705 rum_rf_write(sc, RT2573_RF2, rfprog[i].r2); 1706 rum_rf_write(sc, RT2573_RF3, rfprog[i].r3 | power << 7); 1707 rum_rf_write(sc, RT2573_RF4, rfprog[i].r4 | sc->rffreq << 10); 1708 1709 rum_rf_write(sc, RT2573_RF1, rfprog[i].r1); 1710 rum_rf_write(sc, RT2573_RF2, rfprog[i].r2); 1711 rum_rf_write(sc, RT2573_RF3, rfprog[i].r3 | power << 7 | 1); 1712 rum_rf_write(sc, RT2573_RF4, rfprog[i].r4 | sc->rffreq << 10); 1713 1714 rum_rf_write(sc, RT2573_RF1, rfprog[i].r1); 1715 rum_rf_write(sc, RT2573_RF2, rfprog[i].r2); 1716 rum_rf_write(sc, RT2573_RF3, rfprog[i].r3 | power << 7); 1717 rum_rf_write(sc, RT2573_RF4, rfprog[i].r4 | sc->rffreq << 10); 1718 1719 DELAY(10); 1720 1721 /* enable smart mode for MIMO-capable RFs */ 1722 bbp3 = rum_bbp_read(sc, 3); 1723 1724 bbp3 &= ~RT2573_SMART_MODE; 1725 if (sc->rf_rev == RT2573_RF_5225 || sc->rf_rev == RT2573_RF_2527) 1726 bbp3 |= RT2573_SMART_MODE; 1727 1728 rum_bbp_write(sc, 3, bbp3); 1729 1730 if (bbp94 != RT2573_BBPR94_DEFAULT) 1731 rum_bbp_write(sc, 94, bbp94); 1732 } 1733 1734 /* 1735 * Enable TSF synchronization and tell h/w to start sending beacons for IBSS 1736 * and HostAP operating modes. 1737 */ 1738 Static void 1739 rum_enable_tsf_sync(struct rum_softc *sc) 1740 { 1741 struct ieee80211com *ic = &sc->sc_ic; 1742 uint32_t tmp; 1743 1744 if (ic->ic_opmode != IEEE80211_M_STA) { 1745 /* 1746 * Change default 16ms TBTT adjustment to 8ms. 1747 * Must be done before enabling beacon generation. 1748 */ 1749 rum_write(sc, RT2573_TXRX_CSR10, 1 << 12 | 8); 1750 } 1751 1752 tmp = rum_read(sc, RT2573_TXRX_CSR9) & 0xff000000; 1753 1754 /* set beacon interval (in 1/16ms unit) */ 1755 tmp |= ic->ic_bss->ni_intval * 16; 1756 1757 tmp |= RT2573_TSF_TICKING | RT2573_ENABLE_TBTT; 1758 if (ic->ic_opmode == IEEE80211_M_STA) 1759 tmp |= RT2573_TSF_MODE(1); 1760 else 1761 tmp |= RT2573_TSF_MODE(2) | RT2573_GENERATE_BEACON; 1762 1763 rum_write(sc, RT2573_TXRX_CSR9, tmp); 1764 } 1765 1766 Static void 1767 rum_update_slot(struct rum_softc *sc) 1768 { 1769 struct ieee80211com *ic = &sc->sc_ic; 1770 uint8_t slottime; 1771 uint32_t tmp; 1772 1773 slottime = (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20; 1774 1775 tmp = rum_read(sc, RT2573_MAC_CSR9); 1776 tmp = (tmp & ~0xff) | slottime; 1777 rum_write(sc, RT2573_MAC_CSR9, tmp); 1778 1779 DPRINTF(("setting slot time to %uus\n", slottime)); 1780 } 1781 1782 Static void 1783 rum_set_bssid(struct rum_softc *sc, const uint8_t *bssid) 1784 { 1785 uint32_t tmp; 1786 1787 tmp = bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24; 1788 rum_write(sc, RT2573_MAC_CSR4, tmp); 1789 1790 tmp = bssid[4] | bssid[5] << 8 | RT2573_ONE_BSSID << 16; 1791 rum_write(sc, RT2573_MAC_CSR5, tmp); 1792 } 1793 1794 Static void 1795 rum_set_macaddr(struct rum_softc *sc, const uint8_t *addr) 1796 { 1797 uint32_t tmp; 1798 1799 tmp = addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24; 1800 rum_write(sc, RT2573_MAC_CSR2, tmp); 1801 1802 tmp = addr[4] | addr[5] << 8 | 0xff << 16; 1803 rum_write(sc, RT2573_MAC_CSR3, tmp); 1804 } 1805 1806 Static void 1807 rum_update_promisc(struct rum_softc *sc) 1808 { 1809 struct ifnet *ifp = sc->sc_ic.ic_ifp; 1810 uint32_t tmp; 1811 1812 tmp = rum_read(sc, RT2573_TXRX_CSR0); 1813 1814 tmp &= ~RT2573_DROP_NOT_TO_ME; 1815 if (!(ifp->if_flags & IFF_PROMISC)) 1816 tmp |= RT2573_DROP_NOT_TO_ME; 1817 1818 rum_write(sc, RT2573_TXRX_CSR0, tmp); 1819 1820 DPRINTF(("%s promiscuous mode\n", (ifp->if_flags & IFF_PROMISC) ? 1821 "entering" : "leaving")); 1822 } 1823 1824 Static const char * 1825 rum_get_rf(int rev) 1826 { 1827 switch (rev) { 1828 case RT2573_RF_2527: return "RT2527 (MIMO XR)"; 1829 case RT2573_RF_2528: return "RT2528"; 1830 case RT2573_RF_5225: return "RT5225 (MIMO XR)"; 1831 case RT2573_RF_5226: return "RT5226"; 1832 default: return "unknown"; 1833 } 1834 } 1835 1836 Static void 1837 rum_read_eeprom(struct rum_softc *sc) 1838 { 1839 struct ieee80211com *ic = &sc->sc_ic; 1840 uint16_t val; 1841 #ifdef RUM_DEBUG 1842 int i; 1843 #endif 1844 1845 /* read MAC/BBP type */ 1846 rum_eeprom_read(sc, RT2573_EEPROM_MACBBP, &val, 2); 1847 sc->macbbp_rev = le16toh(val); 1848 1849 /* read MAC address */ 1850 rum_eeprom_read(sc, RT2573_EEPROM_ADDRESS, ic->ic_myaddr, 6); 1851 1852 rum_eeprom_read(sc, RT2573_EEPROM_ANTENNA, &val, 2); 1853 val = le16toh(val); 1854 sc->rf_rev = (val >> 11) & 0x1f; 1855 sc->hw_radio = (val >> 10) & 0x1; 1856 sc->rx_ant = (val >> 4) & 0x3; 1857 sc->tx_ant = (val >> 2) & 0x3; 1858 sc->nb_ant = val & 0x3; 1859 1860 DPRINTF(("RF revision=%d\n", sc->rf_rev)); 1861 1862 rum_eeprom_read(sc, RT2573_EEPROM_CONFIG2, &val, 2); 1863 val = le16toh(val); 1864 sc->ext_5ghz_lna = (val >> 6) & 0x1; 1865 sc->ext_2ghz_lna = (val >> 4) & 0x1; 1866 1867 DPRINTF(("External 2GHz LNA=%d\nExternal 5GHz LNA=%d\n", 1868 sc->ext_2ghz_lna, sc->ext_5ghz_lna)); 1869 1870 rum_eeprom_read(sc, RT2573_EEPROM_RSSI_2GHZ_OFFSET, &val, 2); 1871 val = le16toh(val); 1872 if ((val & 0xff) != 0xff) 1873 sc->rssi_2ghz_corr = (int8_t)(val & 0xff); /* signed */ 1874 1875 rum_eeprom_read(sc, RT2573_EEPROM_RSSI_5GHZ_OFFSET, &val, 2); 1876 val = le16toh(val); 1877 if ((val & 0xff) != 0xff) 1878 sc->rssi_5ghz_corr = (int8_t)(val & 0xff); /* signed */ 1879 1880 DPRINTF(("RSSI 2GHz corr=%d\nRSSI 5GHz corr=%d\n", 1881 sc->rssi_2ghz_corr, sc->rssi_5ghz_corr)); 1882 1883 rum_eeprom_read(sc, RT2573_EEPROM_FREQ_OFFSET, &val, 2); 1884 val = le16toh(val); 1885 if ((val & 0xff) != 0xff) 1886 sc->rffreq = val & 0xff; 1887 1888 DPRINTF(("RF freq=%d\n", sc->rffreq)); 1889 1890 /* read Tx power for all a/b/g channels */ 1891 rum_eeprom_read(sc, RT2573_EEPROM_TXPOWER, sc->txpow, 14); 1892 /* XXX default Tx power for 802.11a channels */ 1893 memset(sc->txpow + 14, 24, sizeof (sc->txpow) - 14); 1894 #ifdef RUM_DEBUG 1895 for (i = 0; i < 14; i++) 1896 DPRINTF(("Channel=%d Tx power=%d\n", i + 1, sc->txpow[i])); 1897 #endif 1898 1899 /* read default values for BBP registers */ 1900 rum_eeprom_read(sc, RT2573_EEPROM_BBP_BASE, sc->bbp_prom, 2 * 16); 1901 #ifdef RUM_DEBUG 1902 for (i = 0; i < 14; i++) { 1903 if (sc->bbp_prom[i].reg == 0 || sc->bbp_prom[i].reg == 0xff) 1904 continue; 1905 DPRINTF(("BBP R%d=%02x\n", sc->bbp_prom[i].reg, 1906 sc->bbp_prom[i].val)); 1907 } 1908 #endif 1909 } 1910 1911 Static int 1912 rum_bbp_init(struct rum_softc *sc) 1913 { 1914 #define N(a) (sizeof (a) / sizeof ((a)[0])) 1915 int i, ntries; 1916 uint8_t val; 1917 1918 /* wait for BBP to be ready */ 1919 for (ntries = 0; ntries < 100; ntries++) { 1920 val = rum_bbp_read(sc, 0); 1921 if (val != 0 && val != 0xff) 1922 break; 1923 DELAY(1000); 1924 } 1925 if (ntries == 100) { 1926 printf("%s: timeout waiting for BBP\n", 1927 USBDEVNAME(sc->sc_dev)); 1928 return EIO; 1929 } 1930 1931 /* initialize BBP registers to default values */ 1932 for (i = 0; i < N(rum_def_bbp); i++) 1933 rum_bbp_write(sc, rum_def_bbp[i].reg, rum_def_bbp[i].val); 1934 1935 /* write vendor-specific BBP values (from EEPROM) */ 1936 for (i = 0; i < 16; i++) { 1937 if (sc->bbp_prom[i].reg == 0 || sc->bbp_prom[i].reg == 0xff) 1938 continue; 1939 rum_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val); 1940 } 1941 1942 return 0; 1943 #undef N 1944 } 1945 1946 Static int 1947 rum_init(struct ifnet *ifp) 1948 { 1949 #define N(a) (sizeof (a) / sizeof ((a)[0])) 1950 struct rum_softc *sc = ifp->if_softc; 1951 struct ieee80211com *ic = &sc->sc_ic; 1952 struct rum_rx_data *data; 1953 uint32_t tmp; 1954 usbd_status error = 0; 1955 int i, ntries; 1956 1957 if ((sc->sc_flags & RT2573_FWLOADED) == 0) { 1958 if (rum_attachhook(sc)) 1959 goto fail; 1960 } 1961 1962 rum_stop(ifp, 0); 1963 1964 /* initialize MAC registers to default values */ 1965 for (i = 0; i < N(rum_def_mac); i++) 1966 rum_write(sc, rum_def_mac[i].reg, rum_def_mac[i].val); 1967 1968 /* set host ready */ 1969 rum_write(sc, RT2573_MAC_CSR1, 3); 1970 rum_write(sc, RT2573_MAC_CSR1, 0); 1971 1972 /* wait for BBP/RF to wakeup */ 1973 for (ntries = 0; ntries < 1000; ntries++) { 1974 if (rum_read(sc, RT2573_MAC_CSR12) & 8) 1975 break; 1976 rum_write(sc, RT2573_MAC_CSR12, 4); /* force wakeup */ 1977 DELAY(1000); 1978 } 1979 if (ntries == 1000) { 1980 printf("%s: timeout waiting for BBP/RF to wakeup\n", 1981 USBDEVNAME(sc->sc_dev)); 1982 goto fail; 1983 } 1984 1985 if ((error = rum_bbp_init(sc)) != 0) 1986 goto fail; 1987 1988 /* select default channel */ 1989 rum_select_band(sc, ic->ic_curchan); 1990 rum_select_antenna(sc); 1991 rum_set_chan(sc, ic->ic_curchan); 1992 1993 /* clear STA registers */ 1994 rum_read_multi(sc, RT2573_STA_CSR0, sc->sta, sizeof sc->sta); 1995 1996 IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl)); 1997 rum_set_macaddr(sc, ic->ic_myaddr); 1998 1999 /* initialize ASIC */ 2000 rum_write(sc, RT2573_MAC_CSR1, 4); 2001 2002 /* 2003 * Allocate xfer for AMRR statistics requests. 2004 */ 2005 sc->amrr_xfer = usbd_alloc_xfer(sc->sc_udev); 2006 if (sc->amrr_xfer == NULL) { 2007 printf("%s: could not allocate AMRR xfer\n", 2008 USBDEVNAME(sc->sc_dev)); 2009 goto fail; 2010 } 2011 2012 /* 2013 * Open Tx and Rx USB bulk pipes. 2014 */ 2015 error = usbd_open_pipe(sc->sc_iface, sc->sc_tx_no, USBD_EXCLUSIVE_USE, 2016 &sc->sc_tx_pipeh); 2017 if (error != 0) { 2018 printf("%s: could not open Tx pipe: %s\n", 2019 USBDEVNAME(sc->sc_dev), usbd_errstr(error)); 2020 goto fail; 2021 } 2022 2023 error = usbd_open_pipe(sc->sc_iface, sc->sc_rx_no, USBD_EXCLUSIVE_USE, 2024 &sc->sc_rx_pipeh); 2025 if (error != 0) { 2026 printf("%s: could not open Rx pipe: %s\n", 2027 USBDEVNAME(sc->sc_dev), usbd_errstr(error)); 2028 goto fail; 2029 } 2030 2031 /* 2032 * Allocate Tx and Rx xfer queues. 2033 */ 2034 error = rum_alloc_tx_list(sc); 2035 if (error != 0) { 2036 printf("%s: could not allocate Tx list\n", 2037 USBDEVNAME(sc->sc_dev)); 2038 goto fail; 2039 } 2040 2041 error = rum_alloc_rx_list(sc); 2042 if (error != 0) { 2043 printf("%s: could not allocate Rx list\n", 2044 USBDEVNAME(sc->sc_dev)); 2045 goto fail; 2046 } 2047 2048 /* 2049 * Start up the receive pipe. 2050 */ 2051 for (i = 0; i < RT2573_RX_LIST_COUNT; i++) { 2052 data = &sc->rx_data[i]; 2053 2054 usbd_setup_xfer(data->xfer, sc->sc_rx_pipeh, data, data->buf, 2055 MCLBYTES, USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, rum_rxeof); 2056 usbd_transfer(data->xfer); 2057 } 2058 2059 /* update Rx filter */ 2060 tmp = rum_read(sc, RT2573_TXRX_CSR0) & 0xffff; 2061 2062 tmp |= RT2573_DROP_PHY_ERROR | RT2573_DROP_CRC_ERROR; 2063 if (ic->ic_opmode != IEEE80211_M_MONITOR) { 2064 tmp |= RT2573_DROP_CTL | RT2573_DROP_VER_ERROR | 2065 RT2573_DROP_ACKCTS; 2066 if (ic->ic_opmode != IEEE80211_M_HOSTAP) 2067 tmp |= RT2573_DROP_TODS; 2068 if (!(ifp->if_flags & IFF_PROMISC)) 2069 tmp |= RT2573_DROP_NOT_TO_ME; 2070 } 2071 rum_write(sc, RT2573_TXRX_CSR0, tmp); 2072 2073 ifp->if_flags &= ~IFF_OACTIVE; 2074 ifp->if_flags |= IFF_RUNNING; 2075 2076 if (ic->ic_opmode == IEEE80211_M_MONITOR) 2077 ieee80211_new_state(ic, IEEE80211_S_RUN, -1); 2078 else 2079 ieee80211_new_state(ic, IEEE80211_S_SCAN, -1); 2080 2081 return 0; 2082 2083 fail: rum_stop(ifp, 1); 2084 return error; 2085 #undef N 2086 } 2087 2088 Static void 2089 rum_stop(struct ifnet *ifp, int disable) 2090 { 2091 struct rum_softc *sc = ifp->if_softc; 2092 struct ieee80211com *ic = &sc->sc_ic; 2093 uint32_t tmp; 2094 2095 ieee80211_new_state(ic, IEEE80211_S_INIT, -1); /* free all nodes */ 2096 2097 sc->sc_tx_timer = 0; 2098 ifp->if_timer = 0; 2099 ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); 2100 2101 /* disable Rx */ 2102 tmp = rum_read(sc, RT2573_TXRX_CSR0); 2103 rum_write(sc, RT2573_TXRX_CSR0, tmp | RT2573_DISABLE_RX); 2104 2105 /* reset ASIC */ 2106 rum_write(sc, RT2573_MAC_CSR1, 3); 2107 rum_write(sc, RT2573_MAC_CSR1, 0); 2108 2109 if (sc->sc_rx_pipeh != NULL) { 2110 usbd_abort_pipe(sc->sc_rx_pipeh); 2111 usbd_close_pipe(sc->sc_rx_pipeh); 2112 sc->sc_rx_pipeh = NULL; 2113 } 2114 2115 if (sc->sc_tx_pipeh != NULL) { 2116 usbd_abort_pipe(sc->sc_tx_pipeh); 2117 usbd_close_pipe(sc->sc_tx_pipeh); 2118 sc->sc_tx_pipeh = NULL; 2119 } 2120 2121 rum_free_rx_list(sc); 2122 rum_free_tx_list(sc); 2123 } 2124 2125 Static int 2126 rum_load_microcode(struct rum_softc *sc, const u_char *ucode, size_t size) 2127 { 2128 usb_device_request_t req; 2129 uint16_t reg = RT2573_MCU_CODE_BASE; 2130 usbd_status error; 2131 2132 /* copy firmware image into NIC */ 2133 for (; size >= 4; reg += 4, ucode += 4, size -= 4) 2134 rum_write(sc, reg, UGETDW(ucode)); 2135 2136 req.bmRequestType = UT_WRITE_VENDOR_DEVICE; 2137 req.bRequest = RT2573_MCU_CNTL; 2138 USETW(req.wValue, RT2573_MCU_RUN); 2139 USETW(req.wIndex, 0); 2140 USETW(req.wLength, 0); 2141 2142 error = usbd_do_request(sc->sc_udev, &req, NULL); 2143 if (error != 0) { 2144 printf("%s: could not run firmware: %s\n", 2145 USBDEVNAME(sc->sc_dev), usbd_errstr(error)); 2146 } 2147 return error; 2148 } 2149 2150 Static int 2151 rum_prepare_beacon(struct rum_softc *sc) 2152 { 2153 struct ieee80211com *ic = &sc->sc_ic; 2154 struct rum_tx_desc desc; 2155 struct mbuf *m0; 2156 int rate; 2157 2158 m0 = ieee80211_beacon_alloc(ic, ic->ic_bss, &sc->sc_bo); 2159 if (m0 == NULL) { 2160 printf("%s: could not allocate beacon frame\n", 2161 sc->sc_dev.dv_xname); 2162 return ENOBUFS; 2163 } 2164 2165 /* send beacons at the lowest available rate */ 2166 rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2; 2167 2168 rum_setup_tx_desc(sc, &desc, RT2573_TX_TIMESTAMP, RT2573_TX_HWSEQ, 2169 m0->m_pkthdr.len, rate); 2170 2171 /* copy the first 24 bytes of Tx descriptor into NIC memory */ 2172 rum_write_multi(sc, RT2573_HW_BEACON_BASE0, (uint8_t *)&desc, 24); 2173 2174 /* copy beacon header and payload into NIC memory */ 2175 rum_write_multi(sc, RT2573_HW_BEACON_BASE0 + 24, mtod(m0, uint8_t *), 2176 m0->m_pkthdr.len); 2177 2178 m_freem(m0); 2179 2180 return 0; 2181 } 2182 2183 Static void 2184 rum_amrr_start(struct rum_softc *sc, struct ieee80211_node *ni) 2185 { 2186 int i; 2187 2188 /* clear statistic registers (STA_CSR0 to STA_CSR5) */ 2189 rum_read_multi(sc, RT2573_STA_CSR0, sc->sta, sizeof sc->sta); 2190 2191 ieee80211_amrr_node_init(&sc->amrr, &sc->amn); 2192 2193 /* set rate to some reasonable initial value */ 2194 for (i = ni->ni_rates.rs_nrates - 1; 2195 i > 0 && (ni->ni_rates.rs_rates[i] & IEEE80211_RATE_VAL) > 72; 2196 i--); 2197 ni->ni_txrate = i; 2198 2199 usb_callout(sc->sc_amrr_ch, hz, rum_amrr_timeout, sc); 2200 } 2201 2202 Static void 2203 rum_amrr_timeout(void *arg) 2204 { 2205 struct rum_softc *sc = arg; 2206 usb_device_request_t req; 2207 int s; 2208 2209 s = splusb(); 2210 2211 /* 2212 * Asynchronously read statistic registers (cleared by read). 2213 */ 2214 req.bmRequestType = UT_READ_VENDOR_DEVICE; 2215 req.bRequest = RT2573_READ_MULTI_MAC; 2216 USETW(req.wValue, 0); 2217 USETW(req.wIndex, RT2573_STA_CSR0); 2218 USETW(req.wLength, sizeof sc->sta); 2219 2220 usbd_setup_default_xfer(sc->amrr_xfer, sc->sc_udev, sc, 2221 USBD_DEFAULT_TIMEOUT, &req, sc->sta, sizeof sc->sta, 0, 2222 rum_amrr_update); 2223 (void)usbd_transfer(sc->amrr_xfer); 2224 2225 splx(s); 2226 } 2227 2228 Static void 2229 rum_amrr_update(usbd_xfer_handle xfer, usbd_private_handle priv, 2230 usbd_status status) 2231 { 2232 struct rum_softc *sc = (struct rum_softc *)priv; 2233 struct ifnet *ifp = sc->sc_ic.ic_ifp; 2234 2235 if (status != USBD_NORMAL_COMPLETION) { 2236 printf("%s: could not retrieve Tx statistics - cancelling " 2237 "automatic rate control\n", USBDEVNAME(sc->sc_dev)); 2238 return; 2239 } 2240 2241 /* count TX retry-fail as Tx errors */ 2242 ifp->if_oerrors += le32toh(sc->sta[5]) >> 16; 2243 2244 sc->amn.amn_retrycnt = 2245 (le32toh(sc->sta[4]) >> 16) + /* TX one-retry ok count */ 2246 (le32toh(sc->sta[5]) & 0xffff) + /* TX more-retry ok count */ 2247 (le32toh(sc->sta[5]) >> 16); /* TX retry-fail count */ 2248 2249 sc->amn.amn_txcnt = 2250 sc->amn.amn_retrycnt + 2251 (le32toh(sc->sta[4]) & 0xffff); /* TX no-retry ok count */ 2252 2253 ieee80211_amrr_choose(&sc->amrr, sc->sc_ic.ic_bss, &sc->amn); 2254 2255 usb_callout(sc->sc_amrr_ch, hz, rum_amrr_timeout, sc); 2256 } 2257 2258 int 2259 rum_activate(device_ptr_t self, enum devact act) 2260 { 2261 switch (act) { 2262 case DVACT_ACTIVATE: 2263 return EOPNOTSUPP; 2264 2265 case DVACT_DEACTIVATE: 2266 /*if_deactivate(&sc->sc_ic.ic_if);*/ 2267 break; 2268 } 2269 2270 return 0; 2271 } 2272