Deleted Added
full compact
if_rum.c (188418) if_rum.c (188419)
1/* $FreeBSD: head/sys/dev/usb2/wlan/if_rum2.c 188418 2009-02-09 22:14:38Z thompsa $ */
1/* $FreeBSD: head/sys/dev/usb2/wlan/if_rum2.c 188419 2009-02-09 22:18:11Z thompsa $ */
2
3/*-
4 * Copyright (c) 2005-2007 Damien Bergamini <damien.bergamini@free.fr>
5 * Copyright (c) 2006 Niall O'Higgins <niallo@openbsd.org>
6 * Copyright (c) 2007-2008 Hans Petter Selasky <hselasky@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

--- 4 unchanged lines hidden (view full) ---

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>
2
3/*-
4 * Copyright (c) 2005-2007 Damien Bergamini <damien.bergamini@free.fr>
5 * Copyright (c) 2006 Niall O'Higgins <niallo@openbsd.org>
6 * Copyright (c) 2007-2008 Hans Petter Selasky <hselasky@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

--- 4 unchanged lines hidden (view full) ---

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: head/sys/dev/usb2/wlan/if_rum2.c 188418 2009-02-09 22:14:38Z thompsa $");
22__FBSDID("$FreeBSD: head/sys/dev/usb2/wlan/if_rum2.c 188419 2009-02-09 22:18:11Z thompsa $");
23
24/*-
25 * Ralink Technology RT2501USB/RT2601USB chipset driver
26 * http://www.ralinktech.com.tw/
27 */
28
29#include <dev/usb2/include/usb2_devid.h>
30#include <dev/usb2/include/usb2_standard.h>

--- 18 unchanged lines hidden (view full) ---

49#if USB_DEBUG
50static int rum_debug = 0;
51
52SYSCTL_NODE(_hw_usb2, OID_AUTO, rum, CTLFLAG_RW, 0, "USB rum");
53SYSCTL_INT(_hw_usb2_rum, OID_AUTO, debug, CTLFLAG_RW, &rum_debug, 0,
54 "Debug level");
55#endif
56
23
24/*-
25 * Ralink Technology RT2501USB/RT2601USB chipset driver
26 * http://www.ralinktech.com.tw/
27 */
28
29#include <dev/usb2/include/usb2_devid.h>
30#include <dev/usb2/include/usb2_standard.h>

--- 18 unchanged lines hidden (view full) ---

49#if USB_DEBUG
50static int rum_debug = 0;
51
52SYSCTL_NODE(_hw_usb2, OID_AUTO, rum, CTLFLAG_RW, 0, "USB rum");
53SYSCTL_INT(_hw_usb2_rum, OID_AUTO, debug, CTLFLAG_RW, &rum_debug, 0,
54 "Debug level");
55#endif
56
57#define rum_do_request(sc,req,data) \
58 usb2_do_request_proc((sc)->sc_udev, &(sc)->sc_tq, req, data, 0, NULL, 5000)
59
57static const struct usb2_device_id rum_devs[] = {
58 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_HWU54DM) },
59 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_2) },
60 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_3) },
61 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_4) },
62 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_WUG2700) },
63 { USB_VP(USB_VENDOR_AMIT, USB_PRODUCT_AMIT_CGWLUSB2GO) },
64 { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2573_1) },

--- 46 unchanged lines hidden (view full) ---

111
112static device_probe_t rum_match;
113static device_attach_t rum_attach;
114static device_detach_t rum_detach;
115
116static usb2_callback_t rum_bulk_read_callback;
117static usb2_callback_t rum_bulk_write_callback;
118
60static const struct usb2_device_id rum_devs[] = {
61 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_HWU54DM) },
62 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_2) },
63 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_3) },
64 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_RT2573_4) },
65 { USB_VP(USB_VENDOR_ABOCOM, USB_PRODUCT_ABOCOM_WUG2700) },
66 { USB_VP(USB_VENDOR_AMIT, USB_PRODUCT_AMIT_CGWLUSB2GO) },
67 { USB_VP(USB_VENDOR_ASUS, USB_PRODUCT_ASUS_RT2573_1) },

--- 46 unchanged lines hidden (view full) ---

114
115static device_probe_t rum_match;
116static device_attach_t rum_attach;
117static device_detach_t rum_detach;
118
119static usb2_callback_t rum_bulk_read_callback;
120static usb2_callback_t rum_bulk_write_callback;
121
122static usb2_proc_callback_t rum_attach_post;
119static usb2_proc_callback_t rum_task;
120static usb2_proc_callback_t rum_scantask;
121static usb2_proc_callback_t rum_promisctask;
122static usb2_proc_callback_t rum_amrr_task;
123static usb2_proc_callback_t rum_task;
124static usb2_proc_callback_t rum_scantask;
125static usb2_proc_callback_t rum_promisctask;
126static usb2_proc_callback_t rum_amrr_task;
127static usb2_proc_callback_t rum_init_task;
128static usb2_proc_callback_t rum_stop_task;
123
124static struct ieee80211vap *rum_vap_create(struct ieee80211com *,
125 const char name[IFNAMSIZ], int unit, int opmode,
126 int flags, const uint8_t bssid[IEEE80211_ADDR_LEN],
127 const uint8_t mac[IEEE80211_ADDR_LEN]);
128static void rum_vap_delete(struct ieee80211vap *);
129static void rum_tx_free(struct rum_tx_data *, int);
129
130static struct ieee80211vap *rum_vap_create(struct ieee80211com *,
131 const char name[IFNAMSIZ], int unit, int opmode,
132 int flags, const uint8_t bssid[IEEE80211_ADDR_LEN],
133 const uint8_t mac[IEEE80211_ADDR_LEN]);
134static void rum_vap_delete(struct ieee80211vap *);
135static void rum_tx_free(struct rum_tx_data *, int);
130static int rum_alloc_tx_list(struct rum_softc *);
131static void rum_free_tx_list(struct rum_softc *);
136static void rum_setup_tx_list(struct rum_softc *);
137static void rum_unsetup_tx_list(struct rum_softc *);
132static int rum_newstate(struct ieee80211vap *,
133 enum ieee80211_state, int);
134static void rum_setup_tx_desc(struct rum_softc *,
135 struct rum_tx_desc *, uint32_t, uint16_t, int,
136 int);
137static int rum_tx_mgt(struct rum_softc *, struct mbuf *,
138 struct ieee80211_node *);
139static int rum_tx_raw(struct rum_softc *, struct mbuf *,

--- 24 unchanged lines hidden (view full) ---

164 struct ieee80211_channel *);
165static void rum_enable_tsf_sync(struct rum_softc *);
166static void rum_update_slot(struct ifnet *);
167static void rum_set_bssid(struct rum_softc *, const uint8_t *);
168static void rum_set_macaddr(struct rum_softc *, const uint8_t *);
169static const char *rum_get_rf(int);
170static void rum_read_eeprom(struct rum_softc *);
171static int rum_bbp_init(struct rum_softc *);
138static int rum_newstate(struct ieee80211vap *,
139 enum ieee80211_state, int);
140static void rum_setup_tx_desc(struct rum_softc *,
141 struct rum_tx_desc *, uint32_t, uint16_t, int,
142 int);
143static int rum_tx_mgt(struct rum_softc *, struct mbuf *,
144 struct ieee80211_node *);
145static int rum_tx_raw(struct rum_softc *, struct mbuf *,

--- 24 unchanged lines hidden (view full) ---

170 struct ieee80211_channel *);
171static void rum_enable_tsf_sync(struct rum_softc *);
172static void rum_update_slot(struct ifnet *);
173static void rum_set_bssid(struct rum_softc *, const uint8_t *);
174static void rum_set_macaddr(struct rum_softc *, const uint8_t *);
175static const char *rum_get_rf(int);
176static void rum_read_eeprom(struct rum_softc *);
177static int rum_bbp_init(struct rum_softc *);
172static void rum_init_locked(struct rum_softc *);
173static void rum_init(void *);
178static void rum_init(void *);
174static void rum_stop(void *);
175static int rum_load_microcode(struct rum_softc *, const u_char *,
176 size_t);
177static int rum_prepare_beacon(struct rum_softc *,
178 struct ieee80211vap *);
179static int rum_raw_xmit(struct ieee80211_node *, struct mbuf *,
180 const struct ieee80211_bpf_params *);
181static struct ieee80211_node *rum_node_alloc(struct ieee80211vap *,
182 const uint8_t mac[IEEE80211_ADDR_LEN]);

--- 203 unchanged lines hidden (view full) ---

386 return (usb2_lookup_id_by_uaa(rum_devs, sizeof(rum_devs), uaa));
387}
388
389static int
390rum_attach(device_t self)
391{
392 struct usb2_attach_arg *uaa = device_get_ivars(self);
393 struct rum_softc *sc = device_get_softc(self);
179static int rum_load_microcode(struct rum_softc *, const u_char *,
180 size_t);
181static int rum_prepare_beacon(struct rum_softc *,
182 struct ieee80211vap *);
183static int rum_raw_xmit(struct ieee80211_node *, struct mbuf *,
184 const struct ieee80211_bpf_params *);
185static struct ieee80211_node *rum_node_alloc(struct ieee80211vap *,
186 const uint8_t mac[IEEE80211_ADDR_LEN]);

--- 203 unchanged lines hidden (view full) ---

390 return (usb2_lookup_id_by_uaa(rum_devs, sizeof(rum_devs), uaa));
391}
392
393static int
394rum_attach(device_t self)
395{
396 struct usb2_attach_arg *uaa = device_get_ivars(self);
397 struct rum_softc *sc = device_get_softc(self);
394 struct ieee80211com *ic;
395 struct ifnet *ifp;
396 const uint8_t *ucode = NULL;
397 uint8_t bands, iface_index;
398 uint32_t tmp;
399 int error, ntries, size;
398 uint8_t iface_index;
399 int error;
400
401 device_set_usb2_desc(self);
402 sc->sc_udev = uaa->device;
403 sc->sc_dev = self;
404
405 mtx_init(&sc->sc_mtx, device_get_nameunit(self),
406 MTX_NETWORK_LOCK, MTX_DEF);
407

--- 7 unchanged lines hidden (view full) ---

415 }
416 error = usb2_proc_create(&sc->sc_tq, &sc->sc_mtx,
417 device_get_nameunit(self), USB_PRI_MED);
418 if (error) {
419 device_printf(self, "could not setup config thread!\n");
420 goto detach;
421 }
422
400
401 device_set_usb2_desc(self);
402 sc->sc_udev = uaa->device;
403 sc->sc_dev = self;
404
405 mtx_init(&sc->sc_mtx, device_get_nameunit(self),
406 MTX_NETWORK_LOCK, MTX_DEF);
407

--- 7 unchanged lines hidden (view full) ---

415 }
416 error = usb2_proc_create(&sc->sc_tq, &sc->sc_mtx,
417 device_get_nameunit(self), USB_PRI_MED);
418 if (error) {
419 device_printf(self, "could not setup config thread!\n");
420 goto detach;
421 }
422
423 ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
424 if (ifp == NULL) {
425 device_printf(sc->sc_dev, "can not if_alloc()\n");
426 goto detach;
427 }
428 ic = ifp->if_l2com;
429
423 /* fork rest of the attach code */
430 RUM_LOCK(sc);
424 RUM_LOCK(sc);
425 rum_queue_command(sc, rum_attach_post,
426 &sc->sc_synctask[0].hdr,
427 &sc->sc_synctask[1].hdr);
428 RUM_UNLOCK(sc);
429 return (0);
430
431detach:
432 rum_detach(self);
433 return (ENXIO); /* failure */
434}
435
436static void
437rum_attach_post(struct usb2_proc_msg *pm)
438{
439 struct rum_task *task = (struct rum_task *)pm;
440 struct rum_softc *sc = task->sc;
441 struct ifnet *ifp;
442 struct ieee80211com *ic;
443 unsigned int ntries;
444 int error;
445 uint32_t tmp;
446 uint8_t bands;
447
431 /* retrieve RT2573 rev. no */
448 /* retrieve RT2573 rev. no */
432 for (ntries = 0; ntries < 1000; ntries++) {
449 for (ntries = 0; ntries != 1000; ntries++) {
433 if ((tmp = rum_read(sc, RT2573_MAC_CSR0)) != 0)
434 break;
450 if ((tmp = rum_read(sc, RT2573_MAC_CSR0)) != 0)
451 break;
435 DELAY(1000);
452 usb2_pause_mtx(&sc->sc_mtx, hz / 1000);
436 }
437 if (ntries == 1000) {
453 }
454 if (ntries == 1000) {
438 device_printf(self, "timeout waiting for chip to settle\n");
439 RUM_UNLOCK(sc);
440 goto detach;
455 device_printf(sc->sc_dev, "timeout waiting for chip to settle\n");
456 return;
441 }
442
443 /* retrieve MAC address and various other things from EEPROM */
444 rum_read_eeprom(sc);
445
457 }
458
459 /* retrieve MAC address and various other things from EEPROM */
460 rum_read_eeprom(sc);
461
446 device_printf(self, "MAC/BBP RT2573 (rev 0x%05x), RF %s\n",
462 device_printf(sc->sc_dev, "MAC/BBP RT2573 (rev 0x%05x), RF %s\n",
447 tmp, rum_get_rf(sc->rf_rev));
448
463 tmp, rum_get_rf(sc->rf_rev));
464
449 ucode = rt2573_ucode;
450 size = sizeof rt2573_ucode;
451 error = rum_load_microcode(sc, ucode, size);
465 error = rum_load_microcode(sc, rt2573_ucode, sizeof(rt2573_ucode));
452 if (error != 0) {
466 if (error != 0) {
453 device_printf(self, "could not load 8051 microcode\n");
454 RUM_UNLOCK(sc);
467 RUM_UNLOCK(sc);
455 goto detach;
468 device_printf(sc->sc_dev, "could not load 8051 microcode\n");
469 return;
456 }
457 RUM_UNLOCK(sc);
458
470 }
471 RUM_UNLOCK(sc);
472
473 ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
474 if (ifp == NULL) {
475 device_printf(sc->sc_dev, "can not if_alloc()\n");
476 RUM_LOCK(sc);
477 return;
478 }
479 ic = ifp->if_l2com;
480
459 ifp->if_softc = sc;
460 if_initname(ifp, "rum", device_get_unit(sc->sc_dev));
461 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
462 ifp->if_init = rum_init;
463 ifp->if_ioctl = rum_ioctl;
464 ifp->if_start = rum_start;
465 IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
466 ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
467 IFQ_SET_READY(&ifp->if_snd);
468
469 ic->ic_ifp = ifp;
470 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
481 ifp->if_softc = sc;
482 if_initname(ifp, "rum", device_get_unit(sc->sc_dev));
483 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
484 ifp->if_init = rum_init;
485 ifp->if_ioctl = rum_ioctl;
486 ifp->if_start = rum_start;
487 IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
488 ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN;
489 IFQ_SET_READY(&ifp->if_snd);
490
491 ic->ic_ifp = ifp;
492 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
493 IEEE80211_ADDR_COPY(ic->ic_myaddr, sc->sc_bssid);
471
472 /* set device capabilities */
473 ic->ic_caps =
474 IEEE80211_C_STA /* station mode supported */
475 | IEEE80211_C_IBSS /* IBSS mode supported */
476 | IEEE80211_C_MONITOR /* monitor mode supported */
477 | IEEE80211_C_HOSTAP /* HostAp mode supported */
478 | IEEE80211_C_TXPMGT /* tx power management */

--- 32 unchanged lines hidden (view full) ---

511
512 sc->sc_txtap_len = sizeof sc->sc_txtap;
513 sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
514 sc->sc_txtap.wt_ihdr.it_present = htole32(RT2573_TX_RADIOTAP_PRESENT);
515
516 if (bootverbose)
517 ieee80211_announce(ic);
518
494
495 /* set device capabilities */
496 ic->ic_caps =
497 IEEE80211_C_STA /* station mode supported */
498 | IEEE80211_C_IBSS /* IBSS mode supported */
499 | IEEE80211_C_MONITOR /* monitor mode supported */
500 | IEEE80211_C_HOSTAP /* HostAp mode supported */
501 | IEEE80211_C_TXPMGT /* tx power management */

--- 32 unchanged lines hidden (view full) ---

534
535 sc->sc_txtap_len = sizeof sc->sc_txtap;
536 sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
537 sc->sc_txtap.wt_ihdr.it_present = htole32(RT2573_TX_RADIOTAP_PRESENT);
538
539 if (bootverbose)
540 ieee80211_announce(ic);
541
519 return 0;
520detach:
521 rum_detach(self);
522 return (ENXIO); /* failure */
542 RUM_LOCK(sc);
523}
524
525static int
526rum_detach(device_t self)
527{
528 struct rum_softc *sc = device_get_softc(self);
529 struct ifnet *ifp = sc->sc_ifp;
530 struct ieee80211com *ic = ifp->if_l2com;
531
543}
544
545static int
546rum_detach(device_t self)
547{
548 struct rum_softc *sc = device_get_softc(self);
549 struct ifnet *ifp = sc->sc_ifp;
550 struct ieee80211com *ic = ifp->if_l2com;
551
532 RUM_LOCK(sc);
533 sc->sc_flags |= RUM_FLAG_DETACH;
534 rum_stop(sc);
535 RUM_UNLOCK(sc);
552 /* wait for any post attach or other command to complete */
553 usb2_proc_drain(&sc->sc_tq);
536
554
537 /* stop all USB transfers first */
555 /* stop all USB transfers */
538 usb2_transfer_unsetup(sc->sc_xfer, RUM_N_TRANSFER);
539 usb2_proc_free(&sc->sc_tq);
540
556 usb2_transfer_unsetup(sc->sc_xfer, RUM_N_TRANSFER);
557 usb2_proc_free(&sc->sc_tq);
558
559 /* free TX list, if any */
560 RUM_LOCK(sc);
561 rum_unsetup_tx_list(sc);
562 RUM_UNLOCK(sc);
563
541 if (ifp) {
542 bpfdetach(ifp);
543 ieee80211_ifdetach(ic);
544 if_free(ifp);
545 }
564 if (ifp) {
565 bpfdetach(ifp);
566 ieee80211_ifdetach(ic);
567 if_free(ifp);
568 }
569
546 mtx_destroy(&sc->sc_mtx);
547
548 return (0);
549}
550
551static struct ieee80211vap *
552rum_vap_create(struct ieee80211com *ic,
553 const char name[IFNAMSIZ], int unit, int opmode, int flags,

--- 31 unchanged lines hidden (view full) ---

585 ic->ic_opmode = opmode;
586 return vap;
587}
588
589static void
590rum_vap_delete(struct ieee80211vap *vap)
591{
592 struct rum_vap *rvp = RUM_VAP(vap);
570 mtx_destroy(&sc->sc_mtx);
571
572 return (0);
573}
574
575static struct ieee80211vap *
576rum_vap_create(struct ieee80211com *ic,
577 const char name[IFNAMSIZ], int unit, int opmode, int flags,

--- 31 unchanged lines hidden (view full) ---

609 ic->ic_opmode = opmode;
610 return vap;
611}
612
613static void
614rum_vap_delete(struct ieee80211vap *vap)
615{
616 struct rum_vap *rvp = RUM_VAP(vap);
593 struct rum_softc *sc = rvp->sc;
594
617
595 RUM_LOCK(sc);
596 usb2_callout_stop(&rvp->amrr_ch);
597 RUM_UNLOCK(sc);
618 usb2_callout_drain(&rvp->amrr_ch);
598 ieee80211_amrr_cleanup(&rvp->amrr);
599 ieee80211_vap_detach(vap);
600 free(rvp, M_80211_VAP);
601}
602
603static void
604rum_tx_free(struct rum_tx_data *data, int txerr)
605{

--- 8 unchanged lines hidden (view full) ---

614
615 ieee80211_free_node(data->ni);
616 data->ni = NULL;
617 }
618 STAILQ_INSERT_TAIL(&sc->tx_free, data, next);
619 sc->tx_nfree++;
620}
621
619 ieee80211_amrr_cleanup(&rvp->amrr);
620 ieee80211_vap_detach(vap);
621 free(rvp, M_80211_VAP);
622}
623
624static void
625rum_tx_free(struct rum_tx_data *data, int txerr)
626{

--- 8 unchanged lines hidden (view full) ---

635
636 ieee80211_free_node(data->ni);
637 data->ni = NULL;
638 }
639 STAILQ_INSERT_TAIL(&sc->tx_free, data, next);
640 sc->tx_nfree++;
641}
642
622static int
623rum_alloc_tx_list(struct rum_softc *sc)
643static void
644rum_setup_tx_list(struct rum_softc *sc)
624{
625 struct rum_tx_data *data;
626 int i;
627
645{
646 struct rum_tx_data *data;
647 int i;
648
628 sc->tx_data = malloc(sizeof(struct rum_tx_data) * RUM_TX_LIST_COUNT,
629 M_USB, M_NOWAIT|M_ZERO);
630 if (sc->tx_data == NULL)
631 return (ENOMEM);
632
633 sc->tx_nfree = 0;
634 STAILQ_INIT(&sc->tx_q);
635 STAILQ_INIT(&sc->tx_free);
636
637 for (i = 0; i < RUM_TX_LIST_COUNT; i++) {
638 data = &sc->tx_data[i];
639
640 data->sc = sc;
641 STAILQ_INSERT_TAIL(&sc->tx_free, data, next);
642 sc->tx_nfree++;
643 }
649 sc->tx_nfree = 0;
650 STAILQ_INIT(&sc->tx_q);
651 STAILQ_INIT(&sc->tx_free);
652
653 for (i = 0; i < RUM_TX_LIST_COUNT; i++) {
654 data = &sc->tx_data[i];
655
656 data->sc = sc;
657 STAILQ_INSERT_TAIL(&sc->tx_free, data, next);
658 sc->tx_nfree++;
659 }
644 return 0;
645}
646
647static void
660}
661
662static void
648rum_free_tx_list(struct rum_softc *sc)
663rum_unsetup_tx_list(struct rum_softc *sc)
649{
650 struct rum_tx_data *data;
651 int i;
652
664{
665 struct rum_tx_data *data;
666 int i;
667
653 if (sc->tx_data == NULL)
654 return;
668 /* make sure any subsequent use of the queues will fail */
669 sc->tx_nfree = 0;
670 STAILQ_INIT(&sc->tx_q);
671 STAILQ_INIT(&sc->tx_free);
655
672
673 /* free up all node references and mbufs */
656 for (i = 0; i < RUM_TX_LIST_COUNT; i++) {
657 data = &sc->tx_data[i];
658
659 if (data->m != NULL) {
660 m_freem(data->m);
661 data->m = NULL;
662 }
663 if (data->ni != NULL) {
664 ieee80211_free_node(data->ni);
665 data->ni = NULL;
666 }
667 }
674 for (i = 0; i < RUM_TX_LIST_COUNT; i++) {
675 data = &sc->tx_data[i];
676
677 if (data->m != NULL) {
678 m_freem(data->m);
679 data->m = NULL;
680 }
681 if (data->ni != NULL) {
682 ieee80211_free_node(data->ni);
683 data->ni = NULL;
684 }
685 }
668 free(sc->tx_data, M_USB);
669 sc->tx_data = NULL;
670}
671
672static void
673rum_task(struct usb2_proc_msg *pm)
674{
675 struct rum_task *task = (struct rum_task *)pm;
676 struct rum_softc *sc = task->sc;
677 struct ifnet *ifp = sc->sc_ifp;
678 struct ieee80211com *ic = ifp->if_l2com;
679 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
680 struct rum_vap *rvp = RUM_VAP(vap);
681 const struct ieee80211_txparam *tp;
682 enum ieee80211_state ostate;
683 struct ieee80211_node *ni;
684 uint32_t tmp;
685
686}
687
688static void
689rum_task(struct usb2_proc_msg *pm)
690{
691 struct rum_task *task = (struct rum_task *)pm;
692 struct rum_softc *sc = task->sc;
693 struct ifnet *ifp = sc->sc_ifp;
694 struct ieee80211com *ic = ifp->if_l2com;
695 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
696 struct rum_vap *rvp = RUM_VAP(vap);
697 const struct ieee80211_txparam *tp;
698 enum ieee80211_state ostate;
699 struct ieee80211_node *ni;
700 uint32_t tmp;
701
686 if (sc->sc_flags & RUM_FLAG_DETACH)
687 return;
688
689 ostate = vap->iv_state;
690
691 switch (sc->sc_state) {
692 case IEEE80211_S_INIT:
693 if (ostate == IEEE80211_S_RUN) {
694 /* abort TSF synchronization */
695 tmp = rum_read(sc, RT2573_TXRX_CSR9);
696 rum_write(sc, RT2573_TXRX_CSR9, tmp & ~0x00ffffff);
697 }
698 break;
699
700 case IEEE80211_S_RUN:
701 ni = vap->iv_bss;
702
703 if (vap->iv_opmode != IEEE80211_M_MONITOR) {
704 rum_update_slot(ic->ic_ifp);
705 rum_enable_mrr(sc);
706 rum_set_txpreamble(sc);
707 rum_set_basicrates(sc);
702 ostate = vap->iv_state;
703
704 switch (sc->sc_state) {
705 case IEEE80211_S_INIT:
706 if (ostate == IEEE80211_S_RUN) {
707 /* abort TSF synchronization */
708 tmp = rum_read(sc, RT2573_TXRX_CSR9);
709 rum_write(sc, RT2573_TXRX_CSR9, tmp & ~0x00ffffff);
710 }
711 break;
712
713 case IEEE80211_S_RUN:
714 ni = vap->iv_bss;
715
716 if (vap->iv_opmode != IEEE80211_M_MONITOR) {
717 rum_update_slot(ic->ic_ifp);
718 rum_enable_mrr(sc);
719 rum_set_txpreamble(sc);
720 rum_set_basicrates(sc);
708 rum_set_bssid(sc, ni->ni_bssid);
721 IEEE80211_ADDR_COPY(sc->sc_bssid, ni->ni_bssid);
722 rum_set_bssid(sc, sc->sc_bssid);
709 }
710
711 if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
712 vap->iv_opmode == IEEE80211_M_IBSS)
713 rum_prepare_beacon(sc, vap);
714
715 if (vap->iv_opmode != IEEE80211_M_MONITOR)
716 rum_enable_tsf_sync(sc);

--- 51 unchanged lines hidden (view full) ---

768rum_bulk_write_callback(struct usb2_xfer *xfer)
769{
770 struct rum_softc *sc = xfer->priv_sc;
771 struct ifnet *ifp = sc->sc_ifp;
772 struct ieee80211com *ic = ifp->if_l2com;
773 struct ieee80211_channel *c = ic->ic_curchan;
774 struct rum_tx_data *data;
775 struct mbuf *m;
723 }
724
725 if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
726 vap->iv_opmode == IEEE80211_M_IBSS)
727 rum_prepare_beacon(sc, vap);
728
729 if (vap->iv_opmode != IEEE80211_M_MONITOR)
730 rum_enable_tsf_sync(sc);

--- 51 unchanged lines hidden (view full) ---

782rum_bulk_write_callback(struct usb2_xfer *xfer)
783{
784 struct rum_softc *sc = xfer->priv_sc;
785 struct ifnet *ifp = sc->sc_ifp;
786 struct ieee80211com *ic = ifp->if_l2com;
787 struct ieee80211_channel *c = ic->ic_curchan;
788 struct rum_tx_data *data;
789 struct mbuf *m;
776 int len;
790 unsigned int len;
777
778 switch (USB_GET_STATE(xfer)) {
779 case USB_ST_TRANSFERRED:
780 DPRINTFN(11, "transfer complete, %d bytes\n", xfer->actlen);
781
782 /* free resources */
783 data = xfer->priv_fifo;
784 rum_tx_free(data, 0);
785 xfer->priv_fifo = NULL;
786
787 ifp->if_opackets++;
788 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
789
790 /* FALLTHROUGH */
791 case USB_ST_SETUP:
792tr_setup:
791
792 switch (USB_GET_STATE(xfer)) {
793 case USB_ST_TRANSFERRED:
794 DPRINTFN(11, "transfer complete, %d bytes\n", xfer->actlen);
795
796 /* free resources */
797 data = xfer->priv_fifo;
798 rum_tx_free(data, 0);
799 xfer->priv_fifo = NULL;
800
801 ifp->if_opackets++;
802 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
803
804 /* FALLTHROUGH */
805 case USB_ST_SETUP:
806tr_setup:
793#if 0
794 if (sc->sc_flags & RUM_FLAG_WAIT_COMMAND) {
795 /*
796 * don't send anything while a command is pending !
797 */
798 break;
799 }
800#endif
801
802 data = STAILQ_FIRST(&sc->tx_q);
803 if (data) {
804 STAILQ_REMOVE_HEAD(&sc->tx_q, next);
805 m = data->m;
806
807 if (m->m_pkthdr.len > (MCLBYTES + RT2573_TX_DESC_SIZE)) {
808 DPRINTFN(0, "data overflow, %u bytes\n",
809 m->m_pkthdr.len);

--- 30 unchanged lines hidden (view full) ---

840 usb2_start_hardware(xfer);
841 }
842 break;
843
844 default: /* Error */
845 DPRINTFN(11, "transfer error, %s\n",
846 usb2_errstr(xfer->error));
847
807 data = STAILQ_FIRST(&sc->tx_q);
808 if (data) {
809 STAILQ_REMOVE_HEAD(&sc->tx_q, next);
810 m = data->m;
811
812 if (m->m_pkthdr.len > (MCLBYTES + RT2573_TX_DESC_SIZE)) {
813 DPRINTFN(0, "data overflow, %u bytes\n",
814 m->m_pkthdr.len);

--- 30 unchanged lines hidden (view full) ---

845 usb2_start_hardware(xfer);
846 }
847 break;
848
849 default: /* Error */
850 DPRINTFN(11, "transfer error, %s\n",
851 usb2_errstr(xfer->error));
852
853 ifp->if_oerrors++;
854 data = xfer->priv_fifo;
855 if (data != NULL) {
856 rum_tx_free(data, xfer->error);
857 xfer->priv_fifo = NULL;
858 }
859
848 if (xfer->error == USB_ERR_STALLED) {
849 /* try to clear stall first */
850 xfer->flags.stall_pipe = 1;
851 goto tr_setup;
852 }
853 if (xfer->error == USB_ERR_TIMEOUT)
854 device_printf(sc->sc_dev, "device timeout\n");
860 if (xfer->error == USB_ERR_STALLED) {
861 /* try to clear stall first */
862 xfer->flags.stall_pipe = 1;
863 goto tr_setup;
864 }
865 if (xfer->error == USB_ERR_TIMEOUT)
866 device_printf(sc->sc_dev, "device timeout\n");
855
856 ifp->if_oerrors++;
857 data = xfer->priv_fifo;
858 if (data != NULL) {
859 rum_tx_free(data, xfer->error);
860 xfer->priv_fifo = NULL;
861 }
862 break;
863 }
864}
865
866static void
867rum_bulk_read_callback(struct usb2_xfer *xfer)
868{
869 struct rum_softc *sc = xfer->priv_sc;
870 struct ifnet *ifp = sc->sc_ifp;
871 struct ieee80211com *ic = ifp->if_l2com;
872 struct ieee80211_node *ni;
873 struct mbuf *m = NULL;
874 uint32_t flags;
875 uint8_t rssi = 0;
867 break;
868 }
869}
870
871static void
872rum_bulk_read_callback(struct usb2_xfer *xfer)
873{
874 struct rum_softc *sc = xfer->priv_sc;
875 struct ifnet *ifp = sc->sc_ifp;
876 struct ieee80211com *ic = ifp->if_l2com;
877 struct ieee80211_node *ni;
878 struct mbuf *m = NULL;
879 uint32_t flags;
880 uint8_t rssi = 0;
876 int len;
881 unsigned int len;
877
878 switch (USB_GET_STATE(xfer)) {
879 case USB_ST_TRANSFERRED:
880
881 DPRINTFN(15, "rx done, actlen=%d\n", xfer->actlen);
882
883 len = xfer->actlen;
884 if (len < RT2573_RX_DESC_SIZE + IEEE80211_MIN_LEN) {

--- 75 unchanged lines hidden (view full) ---

960
961 default: /* Error */
962 if (xfer->error != USB_ERR_CANCELLED) {
963 /* try to clear stall first */
964 xfer->flags.stall_pipe = 1;
965 goto tr_setup;
966 }
967 return;
882
883 switch (USB_GET_STATE(xfer)) {
884 case USB_ST_TRANSFERRED:
885
886 DPRINTFN(15, "rx done, actlen=%d\n", xfer->actlen);
887
888 len = xfer->actlen;
889 if (len < RT2573_RX_DESC_SIZE + IEEE80211_MIN_LEN) {

--- 75 unchanged lines hidden (view full) ---

965
966 default: /* Error */
967 if (xfer->error != USB_ERR_CANCELLED) {
968 /* try to clear stall first */
969 xfer->flags.stall_pipe = 1;
970 goto tr_setup;
971 }
972 return;
968
969 }
970}
971
972static uint8_t
973rum_plcp_signal(int rate)
974{
975 switch (rate) {
976 /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */

--- 351 unchanged lines hidden (view full) ---

1328 struct ifreq *ifr = (struct ifreq *) data;
1329 int error = 0, startall = 0;
1330
1331 switch (cmd) {
1332 case SIOCSIFFLAGS:
1333 RUM_LOCK(sc);
1334 if (ifp->if_flags & IFF_UP) {
1335 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
973 }
974}
975
976static uint8_t
977rum_plcp_signal(int rate)
978{
979 switch (rate) {
980 /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */

--- 351 unchanged lines hidden (view full) ---

1332 struct ifreq *ifr = (struct ifreq *) data;
1333 int error = 0, startall = 0;
1334
1335 switch (cmd) {
1336 case SIOCSIFFLAGS:
1337 RUM_LOCK(sc);
1338 if (ifp->if_flags & IFF_UP) {
1339 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
1336 rum_init_locked(sc);
1340 rum_queue_command(sc, rum_init_task,
1341 &sc->sc_synctask[0].hdr,
1342 &sc->sc_synctask[1].hdr);
1337 startall = 1;
1338 } else
1339 rum_queue_command(sc, rum_promisctask,
1340 &sc->sc_promisctask[0].hdr,
1341 &sc->sc_promisctask[1].hdr);
1342 } else {
1343 startall = 1;
1344 } else
1345 rum_queue_command(sc, rum_promisctask,
1346 &sc->sc_promisctask[0].hdr,
1347 &sc->sc_promisctask[1].hdr);
1348 } else {
1343 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1344 rum_stop(sc);
1349 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1350 rum_queue_command(sc, rum_stop_task,
1351 &sc->sc_synctask[0].hdr,
1352 &sc->sc_synctask[1].hdr);
1353 }
1345 }
1346 RUM_UNLOCK(sc);
1347 if (startall)
1348 ieee80211_start_all(ic);
1349 break;
1350 case SIOCGIFMEDIA:
1351 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
1352 break;

--- 14 unchanged lines hidden (view full) ---

1367 usb2_error_t error;
1368
1369 req.bmRequestType = UT_READ_VENDOR_DEVICE;
1370 req.bRequest = RT2573_READ_EEPROM;
1371 USETW(req.wValue, 0);
1372 USETW(req.wIndex, addr);
1373 USETW(req.wLength, len);
1374
1354 }
1355 RUM_UNLOCK(sc);
1356 if (startall)
1357 ieee80211_start_all(ic);
1358 break;
1359 case SIOCGIFMEDIA:
1360 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
1361 break;

--- 14 unchanged lines hidden (view full) ---

1376 usb2_error_t error;
1377
1378 req.bmRequestType = UT_READ_VENDOR_DEVICE;
1379 req.bRequest = RT2573_READ_EEPROM;
1380 USETW(req.wValue, 0);
1381 USETW(req.wIndex, addr);
1382 USETW(req.wLength, len);
1383
1375 error = usb2_do_request(sc->sc_udev, &sc->sc_mtx, &req, buf);
1384 error = rum_do_request(sc, &req, buf);
1376 if (error != 0) {
1377 device_printf(sc->sc_dev, "could not read EEPROM: %s\n",
1378 usb2_errstr(error));
1379 }
1380}
1381
1382static uint32_t
1383rum_read(struct rum_softc *sc, uint16_t reg)

--- 12 unchanged lines hidden (view full) ---

1396 usb2_error_t error;
1397
1398 req.bmRequestType = UT_READ_VENDOR_DEVICE;
1399 req.bRequest = RT2573_READ_MULTI_MAC;
1400 USETW(req.wValue, 0);
1401 USETW(req.wIndex, reg);
1402 USETW(req.wLength, len);
1403
1385 if (error != 0) {
1386 device_printf(sc->sc_dev, "could not read EEPROM: %s\n",
1387 usb2_errstr(error));
1388 }
1389}
1390
1391static uint32_t
1392rum_read(struct rum_softc *sc, uint16_t reg)

--- 12 unchanged lines hidden (view full) ---

1405 usb2_error_t error;
1406
1407 req.bmRequestType = UT_READ_VENDOR_DEVICE;
1408 req.bRequest = RT2573_READ_MULTI_MAC;
1409 USETW(req.wValue, 0);
1410 USETW(req.wIndex, reg);
1411 USETW(req.wLength, len);
1412
1404 error = usb2_do_request(sc->sc_udev, &sc->sc_mtx, &req, buf);
1413 error = rum_do_request(sc, &req, buf);
1405 if (error != 0) {
1406 device_printf(sc->sc_dev,
1407 "could not multi read MAC register: %s\n",
1408 usb2_errstr(error));
1409 }
1410}
1411
1412static void

--- 11 unchanged lines hidden (view full) ---

1424 usb2_error_t error;
1425
1426 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1427 req.bRequest = RT2573_WRITE_MULTI_MAC;
1428 USETW(req.wValue, 0);
1429 USETW(req.wIndex, reg);
1430 USETW(req.wLength, len);
1431
1414 if (error != 0) {
1415 device_printf(sc->sc_dev,
1416 "could not multi read MAC register: %s\n",
1417 usb2_errstr(error));
1418 }
1419}
1420
1421static void

--- 11 unchanged lines hidden (view full) ---

1433 usb2_error_t error;
1434
1435 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1436 req.bRequest = RT2573_WRITE_MULTI_MAC;
1437 USETW(req.wValue, 0);
1438 USETW(req.wIndex, reg);
1439 USETW(req.wLength, len);
1440
1432 error = usb2_do_request(sc->sc_udev, &sc->sc_mtx, &req, buf);
1441 error = rum_do_request(sc, &req, buf);
1433 if (error != 0) {
1434 device_printf(sc->sc_dev,
1435 "could not multi write MAC register: %s\n",
1436 usb2_errstr(error));
1437 }
1438}
1439
1440static void

--- 341 unchanged lines hidden (view full) ---

1782static void
1783rum_promisctask(struct usb2_proc_msg *pm)
1784{
1785 struct rum_task *task = (struct rum_task *)pm;
1786 struct rum_softc *sc = task->sc;
1787 struct ifnet *ifp = sc->sc_ifp;
1788 uint32_t tmp;
1789
1442 if (error != 0) {
1443 device_printf(sc->sc_dev,
1444 "could not multi write MAC register: %s\n",
1445 usb2_errstr(error));
1446 }
1447}
1448
1449static void

--- 341 unchanged lines hidden (view full) ---

1791static void
1792rum_promisctask(struct usb2_proc_msg *pm)
1793{
1794 struct rum_task *task = (struct rum_task *)pm;
1795 struct rum_softc *sc = task->sc;
1796 struct ifnet *ifp = sc->sc_ifp;
1797 uint32_t tmp;
1798
1790 if (sc->sc_flags & RUM_FLAG_DETACH)
1791 return;
1792
1793 tmp = rum_read(sc, RT2573_TXRX_CSR0);
1794
1795 tmp &= ~RT2573_DROP_NOT_TO_ME;
1796 if (!(ifp->if_flags & IFF_PROMISC))
1797 tmp |= RT2573_DROP_NOT_TO_ME;
1798
1799 rum_write(sc, RT2573_TXRX_CSR0, tmp);
1800

--- 11 unchanged lines hidden (view full) ---

1812 case RT2573_RF_5226: return "RT5226";
1813 default: return "unknown";
1814 }
1815}
1816
1817static void
1818rum_read_eeprom(struct rum_softc *sc)
1819{
1799 tmp = rum_read(sc, RT2573_TXRX_CSR0);
1800
1801 tmp &= ~RT2573_DROP_NOT_TO_ME;
1802 if (!(ifp->if_flags & IFF_PROMISC))
1803 tmp |= RT2573_DROP_NOT_TO_ME;
1804
1805 rum_write(sc, RT2573_TXRX_CSR0, tmp);
1806

--- 11 unchanged lines hidden (view full) ---

1818 case RT2573_RF_5226: return "RT5226";
1819 default: return "unknown";
1820 }
1821}
1822
1823static void
1824rum_read_eeprom(struct rum_softc *sc)
1825{
1820 struct ifnet *ifp = sc->sc_ifp;
1821 struct ieee80211com *ic = ifp->if_l2com;
1822 uint16_t val;
1823#ifdef RUM_DEBUG
1824 int i;
1825#endif
1826
1827 /* read MAC address */
1826 uint16_t val;
1827#ifdef RUM_DEBUG
1828 int i;
1829#endif
1830
1831 /* read MAC address */
1828 rum_eeprom_read(sc, RT2573_EEPROM_ADDRESS, ic->ic_myaddr, 6);
1832 rum_eeprom_read(sc, RT2573_EEPROM_ADDRESS, sc->sc_bssid, 6);
1829
1830 rum_eeprom_read(sc, RT2573_EEPROM_ANTENNA, &val, 2);
1831 val = le16toh(val);
1832 sc->rf_rev = (val >> 11) & 0x1f;
1833 sc->hw_radio = (val >> 10) & 0x1;
1834 sc->rx_ant = (val >> 4) & 0x3;
1835 sc->tx_ant = (val >> 2) & 0x3;
1836 sc->nb_ant = val & 0x3;

--- 91 unchanged lines hidden (view full) ---

1928 rum_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val);
1929 }
1930
1931 return 0;
1932#undef N
1933}
1934
1935static void
1833
1834 rum_eeprom_read(sc, RT2573_EEPROM_ANTENNA, &val, 2);
1835 val = le16toh(val);
1836 sc->rf_rev = (val >> 11) & 0x1f;
1837 sc->hw_radio = (val >> 10) & 0x1;
1838 sc->rx_ant = (val >> 4) & 0x3;
1839 sc->tx_ant = (val >> 2) & 0x3;
1840 sc->nb_ant = val & 0x3;

--- 91 unchanged lines hidden (view full) ---

1932 rum_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val);
1933 }
1934
1935 return 0;
1936#undef N
1937}
1938
1939static void
1936rum_init_locked(struct rum_softc *sc)
1940rum_init_task(struct usb2_proc_msg *pm)
1937{
1938#define N(a) (sizeof (a) / sizeof ((a)[0]))
1941{
1942#define N(a) (sizeof (a) / sizeof ((a)[0]))
1943 struct rum_task *task = (struct rum_task *)pm;
1944 struct rum_softc *sc = task->sc;
1939 struct ifnet *ifp = sc->sc_ifp;
1940 struct ieee80211com *ic = ifp->if_l2com;
1941 uint32_t tmp;
1942 usb2_error_t error;
1943 int i, ntries;
1944
1945 RUM_LOCK_ASSERT(sc, MA_OWNED);
1946
1945 struct ifnet *ifp = sc->sc_ifp;
1946 struct ieee80211com *ic = ifp->if_l2com;
1947 uint32_t tmp;
1948 usb2_error_t error;
1949 int i, ntries;
1950
1951 RUM_LOCK_ASSERT(sc, MA_OWNED);
1952
1947 if (sc->sc_flags & RUM_FLAG_DETACH)
1948 return;
1953 rum_stop_task(pm);
1949
1954
1950 rum_stop(sc);
1951
1952 /* initialize MAC registers to default values */
1953 for (i = 0; i < N(rum_def_mac); i++)
1954 rum_write(sc, rum_def_mac[i].reg, rum_def_mac[i].val);
1955
1956 /* set host ready */
1957 rum_write(sc, RT2573_MAC_CSR1, 3);
1958 rum_write(sc, RT2573_MAC_CSR1, 0);
1959

--- 25 unchanged lines hidden (view full) ---

1985 rum_set_macaddr(sc, ic->ic_myaddr);
1986
1987 /* initialize ASIC */
1988 rum_write(sc, RT2573_MAC_CSR1, 4);
1989
1990 /*
1991 * Allocate Tx and Rx xfer queues.
1992 */
1955 /* initialize MAC registers to default values */
1956 for (i = 0; i < N(rum_def_mac); i++)
1957 rum_write(sc, rum_def_mac[i].reg, rum_def_mac[i].val);
1958
1959 /* set host ready */
1960 rum_write(sc, RT2573_MAC_CSR1, 3);
1961 rum_write(sc, RT2573_MAC_CSR1, 0);
1962

--- 25 unchanged lines hidden (view full) ---

1988 rum_set_macaddr(sc, ic->ic_myaddr);
1989
1990 /* initialize ASIC */
1991 rum_write(sc, RT2573_MAC_CSR1, 4);
1992
1993 /*
1994 * Allocate Tx and Rx xfer queues.
1995 */
1993 error = rum_alloc_tx_list(sc);
1994 if (error != 0) {
1995 device_printf(sc->sc_dev, "could not allocate Tx list\n");
1996 goto fail;
1997 }
1996 rum_setup_tx_list(sc);
1998
1999 /* update Rx filter */
2000 tmp = rum_read(sc, RT2573_TXRX_CSR0) & 0xffff;
2001
2002 tmp |= RT2573_DROP_PHY_ERROR | RT2573_DROP_CRC_ERROR;
2003 if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2004 tmp |= RT2573_DROP_CTL | RT2573_DROP_VER_ERROR |
2005 RT2573_DROP_ACKCTS;

--- 4 unchanged lines hidden (view full) ---

2010 }
2011 rum_write(sc, RT2573_TXRX_CSR0, tmp);
2012
2013 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2014 ifp->if_drv_flags |= IFF_DRV_RUNNING;
2015 usb2_transfer_start(sc->sc_xfer[RUM_BULK_RD]);
2016 return;
2017
1997
1998 /* update Rx filter */
1999 tmp = rum_read(sc, RT2573_TXRX_CSR0) & 0xffff;
2000
2001 tmp |= RT2573_DROP_PHY_ERROR | RT2573_DROP_CRC_ERROR;
2002 if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2003 tmp |= RT2573_DROP_CTL | RT2573_DROP_VER_ERROR |
2004 RT2573_DROP_ACKCTS;

--- 4 unchanged lines hidden (view full) ---

2009 }
2010 rum_write(sc, RT2573_TXRX_CSR0, tmp);
2011
2012 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2013 ifp->if_drv_flags |= IFF_DRV_RUNNING;
2014 usb2_transfer_start(sc->sc_xfer[RUM_BULK_RD]);
2015 return;
2016
2018fail: rum_stop(sc);
2017fail: rum_stop_task(pm);
2019#undef N
2020}
2021
2022static void
2023rum_init(void *priv)
2024{
2025 struct rum_softc *sc = priv;
2026 struct ifnet *ifp = sc->sc_ifp;
2027 struct ieee80211com *ic = ifp->if_l2com;
2028
2029 RUM_LOCK(sc);
2018#undef N
2019}
2020
2021static void
2022rum_init(void *priv)
2023{
2024 struct rum_softc *sc = priv;
2025 struct ifnet *ifp = sc->sc_ifp;
2026 struct ieee80211com *ic = ifp->if_l2com;
2027
2028 RUM_LOCK(sc);
2030 rum_init_locked(sc);
2029 rum_queue_command(sc, rum_init_task,
2030 &sc->sc_synctask[0].hdr,
2031 &sc->sc_synctask[1].hdr);
2031 RUM_UNLOCK(sc);
2032
2033 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2034 ieee80211_start_all(ic); /* start all vap's */
2035}
2036
2037static void
2032 RUM_UNLOCK(sc);
2033
2034 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
2035 ieee80211_start_all(ic); /* start all vap's */
2036}
2037
2038static void
2038rum_stop(void *priv)
2039rum_stop_task(struct usb2_proc_msg *pm)
2039{
2040{
2040 struct rum_softc *sc = priv;
2041 struct rum_task *task = (struct rum_task *)pm;
2042 struct rum_softc *sc = task->sc;
2041 struct ifnet *ifp = sc->sc_ifp;
2042 uint32_t tmp;
2043
2044 RUM_LOCK_ASSERT(sc, MA_OWNED);
2045
2046 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2047
2043 struct ifnet *ifp = sc->sc_ifp;
2044 uint32_t tmp;
2045
2046 RUM_LOCK_ASSERT(sc, MA_OWNED);
2047
2048 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
2049
2050 RUM_UNLOCK(sc);
2051
2048 /*
2052 /*
2049 * stop all the transfers, if not already stopped:
2053 * Drain the USB transfers, if not already drained:
2050 */
2054 */
2051 usb2_transfer_stop(sc->sc_xfer[RUM_BULK_WR]);
2052 usb2_transfer_stop(sc->sc_xfer[RUM_BULK_RD]);
2055 usb2_transfer_drain(sc->sc_xfer[RUM_BULK_WR]);
2056 usb2_transfer_drain(sc->sc_xfer[RUM_BULK_RD]);
2053
2057
2054 rum_free_tx_list(sc);
2058 RUM_LOCK(sc);
2055
2059
2056 /* Stop now if the device has vanished */
2057 if (sc->sc_flags & RUM_FLAG_DETACH)
2058 return;
2060 rum_unsetup_tx_list(sc);
2059
2060 /* disable Rx */
2061 tmp = rum_read(sc, RT2573_TXRX_CSR0);
2062 rum_write(sc, RT2573_TXRX_CSR0, tmp | RT2573_DISABLE_RX);
2063
2064 /* reset ASIC */
2065 rum_write(sc, RT2573_MAC_CSR1, 3);
2066 rum_write(sc, RT2573_MAC_CSR1, 0);

--- 11 unchanged lines hidden (view full) ---

2078 rum_write(sc, reg, UGETDW(ucode));
2079
2080 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2081 req.bRequest = RT2573_MCU_CNTL;
2082 USETW(req.wValue, RT2573_MCU_RUN);
2083 USETW(req.wIndex, 0);
2084 USETW(req.wLength, 0);
2085
2061
2062 /* disable Rx */
2063 tmp = rum_read(sc, RT2573_TXRX_CSR0);
2064 rum_write(sc, RT2573_TXRX_CSR0, tmp | RT2573_DISABLE_RX);
2065
2066 /* reset ASIC */
2067 rum_write(sc, RT2573_MAC_CSR1, 3);
2068 rum_write(sc, RT2573_MAC_CSR1, 0);

--- 11 unchanged lines hidden (view full) ---

2080 rum_write(sc, reg, UGETDW(ucode));
2081
2082 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2083 req.bRequest = RT2573_MCU_CNTL;
2084 USETW(req.wValue, RT2573_MCU_RUN);
2085 USETW(req.wIndex, 0);
2086 USETW(req.wLength, 0);
2087
2086 error = usb2_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL);
2088 error = rum_do_request(sc, &req, NULL);
2087 if (error != 0) {
2088 device_printf(sc->sc_dev, "could not run firmware: %s\n",
2089 usb2_errstr(error));
2090 }
2091 return error;
2092}
2093
2094static int

--- 191 unchanged lines hidden (view full) ---

2286
2287static void
2288rum_scantask(struct usb2_proc_msg *pm)
2289{
2290 struct rum_task *task = (struct rum_task *)pm;
2291 struct rum_softc *sc = task->sc;
2292 struct ifnet *ifp = sc->sc_ifp;
2293 struct ieee80211com *ic = ifp->if_l2com;
2089 if (error != 0) {
2090 device_printf(sc->sc_dev, "could not run firmware: %s\n",
2091 usb2_errstr(error));
2092 }
2093 return error;
2094}
2095
2096static int

--- 191 unchanged lines hidden (view full) ---

2288
2289static void
2290rum_scantask(struct usb2_proc_msg *pm)
2291{
2292 struct rum_task *task = (struct rum_task *)pm;
2293 struct rum_softc *sc = task->sc;
2294 struct ifnet *ifp = sc->sc_ifp;
2295 struct ieee80211com *ic = ifp->if_l2com;
2294 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2295 uint32_t tmp;
2296
2297 RUM_LOCK_ASSERT(sc, MA_OWNED);
2298
2296 uint32_t tmp;
2297
2298 RUM_LOCK_ASSERT(sc, MA_OWNED);
2299
2299 if (sc->sc_flags & RUM_FLAG_DETACH)
2300 return;
2301
2302 switch (sc->sc_scan_action) {
2303 case RUM_SCAN_START:
2304 /* abort TSF synchronization */
2305 tmp = rum_read(sc, RT2573_TXRX_CSR9);
2306 rum_write(sc, RT2573_TXRX_CSR9, tmp & ~0x00ffffff);
2307 rum_set_bssid(sc, ifp->if_broadcastaddr);
2308 break;
2309
2300 switch (sc->sc_scan_action) {
2301 case RUM_SCAN_START:
2302 /* abort TSF synchronization */
2303 tmp = rum_read(sc, RT2573_TXRX_CSR9);
2304 rum_write(sc, RT2573_TXRX_CSR9, tmp & ~0x00ffffff);
2305 rum_set_bssid(sc, ifp->if_broadcastaddr);
2306 break;
2307
2310 case RUM_SCAN_END:
2311 rum_enable_tsf_sync(sc);
2312 /* XXX keep local copy */
2313 rum_set_bssid(sc, vap->iv_bss->ni_bssid);
2314 break;
2315
2316 case RUM_SET_CHANNEL:
2317 rum_set_chan(sc, ic->ic_curchan);
2318 break;
2319
2308 case RUM_SET_CHANNEL:
2309 rum_set_chan(sc, ic->ic_curchan);
2310 break;
2311
2320 default:
2321 panic("unknown scan action %d\n", sc->sc_scan_action);
2322 /* NEVER REACHED */
2312 default: /* RUM_SCAN_END */
2313 rum_enable_tsf_sync(sc);
2314 rum_set_bssid(sc, sc->sc_bssid);
2323 break;
2324 }
2325}
2326
2327static int
2328rum_get_rssi(struct rum_softc *sc, uint8_t raw)
2329{
2330 struct ifnet *ifp = sc->sc_ifp;

--- 59 unchanged lines hidden (view full) ---

2390 */
2391 task = (struct rum_task *)
2392 usb2_proc_msignal(&sc->sc_tq, t0, t1);
2393
2394 /* Setup callback and softc pointers */
2395 task->hdr.pm_callback = fn;
2396 task->sc = sc;
2397
2315 break;
2316 }
2317}
2318
2319static int
2320rum_get_rssi(struct rum_softc *sc, uint8_t raw)
2321{
2322 struct ifnet *ifp = sc->sc_ifp;

--- 59 unchanged lines hidden (view full) ---

2382 */
2383 task = (struct rum_task *)
2384 usb2_proc_msignal(&sc->sc_tq, t0, t1);
2385
2386 /* Setup callback and softc pointers */
2387 task->hdr.pm_callback = fn;
2388 task->sc = sc;
2389
2390 /*
2391 * Init and stop must be synchronous!
2392 */
2393 if ((fn == rum_init_task) || (fn == rum_stop_task))
2394 usb2_proc_mwait(&sc->sc_tq, t0, t1);
2398}
2399
2400static device_method_t rum_methods[] = {
2401 /* Device interface */
2402 DEVMETHOD(device_probe, rum_match),
2403 DEVMETHOD(device_attach, rum_attach),
2404 DEVMETHOD(device_detach, rum_detach),
2405

--- 12 unchanged lines hidden ---
2395}
2396
2397static device_method_t rum_methods[] = {
2398 /* Device interface */
2399 DEVMETHOD(device_probe, rum_match),
2400 DEVMETHOD(device_attach, rum_attach),
2401 DEVMETHOD(device_detach, rum_detach),
2402

--- 12 unchanged lines hidden ---