Deleted Added
full compact
if_rum.c (288504) if_rum.c (288531)
1/* $FreeBSD: head/sys/dev/usb/wlan/if_rum.c 288504 2015-10-02 15:30:37Z adrian $ */
1/* $FreeBSD: head/sys/dev/usb/wlan/if_rum.c 288531 2015-10-03 05:44:05Z adrian $ */
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/usb/wlan/if_rum.c 288504 2015-10-02 15:30:37Z adrian $");
22__FBSDID("$FreeBSD: head/sys/dev/usb/wlan/if_rum.c 288531 2015-10-03 05:44:05Z adrian $");
23
24/*-
25 * Ralink Technology RT2501USB/RT2601USB chipset driver
26 * http://www.ralinktech.com.tw/
27 */
28
29#include <sys/param.h>
30#include <sys/sockio.h>

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

81#ifdef USB_DEBUG
82static int rum_debug = 0;
83
84static SYSCTL_NODE(_hw_usb, OID_AUTO, rum, CTLFLAG_RW, 0, "USB rum");
85SYSCTL_INT(_hw_usb_rum, OID_AUTO, debug, CTLFLAG_RWTUN, &rum_debug, 0,
86 "Debug level");
87#endif
88
23
24/*-
25 * Ralink Technology RT2501USB/RT2601USB chipset driver
26 * http://www.ralinktech.com.tw/
27 */
28
29#include <sys/param.h>
30#include <sys/sockio.h>

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

81#ifdef USB_DEBUG
82static int rum_debug = 0;
83
84static SYSCTL_NODE(_hw_usb, OID_AUTO, rum, CTLFLAG_RW, 0, "USB rum");
85SYSCTL_INT(_hw_usb_rum, OID_AUTO, debug, CTLFLAG_RWTUN, &rum_debug, 0,
86 "Debug level");
87#endif
88
89#define N(a) ((int)(sizeof (a) / sizeof ((a)[0])))
90
91static const STRUCT_USB_HOST_ID rum_devs[] = {
92#define RUM_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
93 RUM_DEV(ABOCOM, HWU54DM),
94 RUM_DEV(ABOCOM, RT2573_2),
95 RUM_DEV(ABOCOM, RT2573_3),
96 RUM_DEV(ABOCOM, RT2573_4),
97 RUM_DEV(ABOCOM, WUG2700),
98 RUM_DEV(AMIT, CGWLUSB2GO),

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

527 rum_detach(self);
528 return (ENXIO); /* failure */
529}
530
531static int
532rum_detach(device_t self)
533{
534 struct rum_softc *sc = device_get_softc(self);
89static const STRUCT_USB_HOST_ID rum_devs[] = {
90#define RUM_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
91 RUM_DEV(ABOCOM, HWU54DM),
92 RUM_DEV(ABOCOM, RT2573_2),
93 RUM_DEV(ABOCOM, RT2573_3),
94 RUM_DEV(ABOCOM, RT2573_4),
95 RUM_DEV(ABOCOM, WUG2700),
96 RUM_DEV(AMIT, CGWLUSB2GO),

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

525 rum_detach(self);
526 return (ENXIO); /* failure */
527}
528
529static int
530rum_detach(device_t self)
531{
532 struct rum_softc *sc = device_get_softc(self);
533 struct ieee80211com *ic = &sc->sc_ic;
535
536 /* Prevent further ioctls */
537 RUM_LOCK(sc);
538 sc->sc_detached = 1;
539 RUM_UNLOCK(sc);
540
541 /* stop all USB transfers */
542 usbd_transfer_unsetup(sc->sc_xfer, RUM_N_TRANSFER);
543
544 /* free TX list, if any */
545 RUM_LOCK(sc);
546 rum_unsetup_tx_list(sc);
547 RUM_UNLOCK(sc);
548
534
535 /* Prevent further ioctls */
536 RUM_LOCK(sc);
537 sc->sc_detached = 1;
538 RUM_UNLOCK(sc);
539
540 /* stop all USB transfers */
541 usbd_transfer_unsetup(sc->sc_xfer, RUM_N_TRANSFER);
542
543 /* free TX list, if any */
544 RUM_LOCK(sc);
545 rum_unsetup_tx_list(sc);
546 RUM_UNLOCK(sc);
547
549 if (sc->sc_ic.ic_softc == sc)
550 ieee80211_ifdetach(&sc->sc_ic);
548 if (ic->ic_softc == sc)
549 ieee80211_ifdetach(ic);
551 mbufq_drain(&sc->sc_snd);
552 mtx_destroy(&sc->sc_mtx);
553 return (0);
554}
555
556static usb_error_t
557rum_do_request(struct rum_softc *sc,
558 struct usb_device_request *req, void *data)

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

1020static int
1021rum_sendprot(struct rum_softc *sc,
1022 const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
1023{
1024 struct ieee80211com *ic = ni->ni_ic;
1025 const struct ieee80211_frame *wh;
1026 struct rum_tx_data *data;
1027 struct mbuf *mprot;
550 mbufq_drain(&sc->sc_snd);
551 mtx_destroy(&sc->sc_mtx);
552 return (0);
553}
554
555static usb_error_t
556rum_do_request(struct rum_softc *sc,
557 struct usb_device_request *req, void *data)

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

1019static int
1020rum_sendprot(struct rum_softc *sc,
1021 const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
1022{
1023 struct ieee80211com *ic = ni->ni_ic;
1024 const struct ieee80211_frame *wh;
1025 struct rum_tx_data *data;
1026 struct mbuf *mprot;
1028 int protrate, ackrate, pktlen, flags, isshort;
1027 int protrate, pktlen, flags, isshort;
1029 uint16_t dur;
1030
1028 uint16_t dur;
1029
1031 RUM_LOCK_ASSERT(sc, MA_OWNED);
1030 RUM_LOCK_ASSERT(sc);
1032 KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
1033 ("protection %d", prot));
1034
1035 wh = mtod(m, const struct ieee80211_frame *);
1036 pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
1037
1038 protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
1031 KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
1032 ("protection %d", prot));
1033
1034 wh = mtod(m, const struct ieee80211_frame *);
1035 pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
1036
1037 protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
1039 ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
1040
1041 isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
1042 dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
1043 + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
1044 flags = RT2573_TX_MORE_FRAG;
1045 if (prot == IEEE80211_PROT_RTSCTS) {
1046 /* NB: CTS is the same size as an ACK */
1047 dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);

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

1076 struct ieee80211com *ic = &sc->sc_ic;
1077 struct rum_tx_data *data;
1078 struct ieee80211_frame *wh;
1079 const struct ieee80211_txparam *tp;
1080 struct ieee80211_key *k;
1081 uint32_t flags = 0;
1082 uint16_t dur;
1083
1038
1039 isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
1040 dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
1041 + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
1042 flags = RT2573_TX_MORE_FRAG;
1043 if (prot == IEEE80211_PROT_RTSCTS) {
1044 /* NB: CTS is the same size as an ACK */
1045 dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);

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

1074 struct ieee80211com *ic = &sc->sc_ic;
1075 struct rum_tx_data *data;
1076 struct ieee80211_frame *wh;
1077 const struct ieee80211_txparam *tp;
1078 struct ieee80211_key *k;
1079 uint32_t flags = 0;
1080 uint16_t dur;
1081
1084 RUM_LOCK_ASSERT(sc, MA_OWNED);
1082 RUM_LOCK_ASSERT(sc);
1085
1086 data = STAILQ_FIRST(&sc->tx_free);
1087 STAILQ_REMOVE_HEAD(&sc->tx_free, next);
1088 sc->tx_nfree--;
1089
1090 wh = mtod(m0, struct ieee80211_frame *);
1091 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
1092 k = ieee80211_crypto_encap(ni, m0);

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

1132rum_tx_raw(struct rum_softc *sc, struct mbuf *m0, struct ieee80211_node *ni,
1133 const struct ieee80211_bpf_params *params)
1134{
1135 struct ieee80211com *ic = ni->ni_ic;
1136 struct rum_tx_data *data;
1137 uint32_t flags;
1138 int rate, error;
1139
1083
1084 data = STAILQ_FIRST(&sc->tx_free);
1085 STAILQ_REMOVE_HEAD(&sc->tx_free, next);
1086 sc->tx_nfree--;
1087
1088 wh = mtod(m0, struct ieee80211_frame *);
1089 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
1090 k = ieee80211_crypto_encap(ni, m0);

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

1130rum_tx_raw(struct rum_softc *sc, struct mbuf *m0, struct ieee80211_node *ni,
1131 const struct ieee80211_bpf_params *params)
1132{
1133 struct ieee80211com *ic = ni->ni_ic;
1134 struct rum_tx_data *data;
1135 uint32_t flags;
1136 int rate, error;
1137
1140 RUM_LOCK_ASSERT(sc, MA_OWNED);
1138 RUM_LOCK_ASSERT(sc);
1141 KASSERT(params != NULL, ("no raw xmit params"));
1142
1143 rate = params->ibp_rate0;
1144 if (!ieee80211_isratevalid(ic->ic_rt, rate)) {
1145 m_freem(m0);
1146 return EINVAL;
1147 }
1148 flags = 0;

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

1188 struct rum_tx_data *data;
1189 struct ieee80211_frame *wh;
1190 const struct ieee80211_txparam *tp;
1191 struct ieee80211_key *k;
1192 uint32_t flags = 0;
1193 uint16_t dur;
1194 int error, rate;
1195
1139 KASSERT(params != NULL, ("no raw xmit params"));
1140
1141 rate = params->ibp_rate0;
1142 if (!ieee80211_isratevalid(ic->ic_rt, rate)) {
1143 m_freem(m0);
1144 return EINVAL;
1145 }
1146 flags = 0;

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

1186 struct rum_tx_data *data;
1187 struct ieee80211_frame *wh;
1188 const struct ieee80211_txparam *tp;
1189 struct ieee80211_key *k;
1190 uint32_t flags = 0;
1191 uint16_t dur;
1192 int error, rate;
1193
1196 RUM_LOCK_ASSERT(sc, MA_OWNED);
1194 RUM_LOCK_ASSERT(sc);
1197
1198 wh = mtod(m0, struct ieee80211_frame *);
1199
1200 tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
1201 if (IEEE80211_IS_MULTICAST(wh->i_addr1))
1202 rate = tp->mcastrate;
1203 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
1204 rate = tp->ucastrate;

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

1284}
1285
1286static void
1287rum_start(struct rum_softc *sc)
1288{
1289 struct ieee80211_node *ni;
1290 struct mbuf *m;
1291
1195
1196 wh = mtod(m0, struct ieee80211_frame *);
1197
1198 tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
1199 if (IEEE80211_IS_MULTICAST(wh->i_addr1))
1200 rate = tp->mcastrate;
1201 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
1202 rate = tp->ucastrate;

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

1282}
1283
1284static void
1285rum_start(struct rum_softc *sc)
1286{
1287 struct ieee80211_node *ni;
1288 struct mbuf *m;
1289
1292 RUM_LOCK_ASSERT(sc, MA_OWNED);
1290 RUM_LOCK_ASSERT(sc);
1293
1294 if (!sc->sc_running)
1295 return;
1296
1297 while (sc->tx_nfree >= RUM_TX_MINFREE &&
1298 (m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
1299 ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
1300 if (rum_tx_data(sc, m, ni) != 0) {

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

1839 }
1840 rum_setpromisc(sc);
1841 RUM_UNLOCK(sc);
1842}
1843
1844static void
1845rum_update_mcast(struct ieee80211com *ic)
1846{
1291
1292 if (!sc->sc_running)
1293 return;
1294
1295 while (sc->tx_nfree >= RUM_TX_MINFREE &&
1296 (m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
1297 ni = (struct ieee80211_node *) m->m_pkthdr.rcvif;
1298 if (rum_tx_data(sc, m, ni) != 0) {

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

1837 }
1838 rum_setpromisc(sc);
1839 RUM_UNLOCK(sc);
1840}
1841
1842static void
1843rum_update_mcast(struct ieee80211com *ic)
1844{
1847 static int warning_printed;
1848
1849 if (warning_printed == 0) {
1850 ic_printf(ic, "need to implement %s\n", __func__);
1851 warning_printed = 1;
1852 }
1845 /* Ignore. */
1853}
1854
1855static const char *
1856rum_get_rf(int rev)
1857{
1858 switch (rev) {
1859 case RT2573_RF_2527: return "RT2527 (MIMO XR)";
1860 case RT2573_RF_2528: return "RT2528";

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

1961 break;
1962 }
1963 if (ntries == 100) {
1964 device_printf(sc->sc_dev, "timeout waiting for BBP\n");
1965 return EIO;
1966 }
1967
1968 /* initialize BBP registers to default values */
1846}
1847
1848static const char *
1849rum_get_rf(int rev)
1850{
1851 switch (rev) {
1852 case RT2573_RF_2527: return "RT2527 (MIMO XR)";
1853 case RT2573_RF_2528: return "RT2528";

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

1954 break;
1955 }
1956 if (ntries == 100) {
1957 device_printf(sc->sc_dev, "timeout waiting for BBP\n");
1958 return EIO;
1959 }
1960
1961 /* initialize BBP registers to default values */
1969 for (i = 0; i < N(rum_def_bbp); i++)
1962 for (i = 0; i < nitems(rum_def_bbp); i++)
1970 rum_bbp_write(sc, rum_def_bbp[i].reg, rum_def_bbp[i].val);
1971
1972 /* write vendor-specific BBP values (from EEPROM) */
1973 for (i = 0; i < 16; i++) {
1974 if (sc->bbp_prom[i].reg == 0 || sc->bbp_prom[i].reg == 0xff)
1975 continue;
1976 rum_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val);
1977 }

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

1983rum_init(struct rum_softc *sc)
1984{
1985 struct ieee80211com *ic = &sc->sc_ic;
1986 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1987 uint32_t tmp;
1988 usb_error_t error;
1989 int i, ntries;
1990
1963 rum_bbp_write(sc, rum_def_bbp[i].reg, rum_def_bbp[i].val);
1964
1965 /* write vendor-specific BBP values (from EEPROM) */
1966 for (i = 0; i < 16; i++) {
1967 if (sc->bbp_prom[i].reg == 0 || sc->bbp_prom[i].reg == 0xff)
1968 continue;
1969 rum_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val);
1970 }

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

1976rum_init(struct rum_softc *sc)
1977{
1978 struct ieee80211com *ic = &sc->sc_ic;
1979 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1980 uint32_t tmp;
1981 usb_error_t error;
1982 int i, ntries;
1983
1991 RUM_LOCK_ASSERT(sc, MA_OWNED);
1984 RUM_LOCK_ASSERT(sc);
1992
1993 rum_stop(sc);
1994
1995 /* initialize MAC registers to default values */
1985
1986 rum_stop(sc);
1987
1988 /* initialize MAC registers to default values */
1996 for (i = 0; i < N(rum_def_mac); i++)
1989 for (i = 0; i < nitems(rum_def_mac); i++)
1997 rum_write(sc, rum_def_mac[i].reg, rum_def_mac[i].val);
1998
1999 /* set host ready */
1990 rum_write(sc, rum_def_mac[i].reg, rum_def_mac[i].val);
1991
1992 /* set host ready */
2000 rum_write(sc, RT2573_MAC_CSR1, 3);
1993 rum_write(sc, RT2573_MAC_CSR1, RT2573_RESET_ASIC | RT2573_RESET_BBP);
2001 rum_write(sc, RT2573_MAC_CSR1, 0);
2002
2003 /* wait for BBP/RF to wakeup */
2004 for (ntries = 0; ntries < 100; ntries++) {
2005 if (rum_read(sc, RT2573_MAC_CSR12) & 8)
2006 break;
2007 rum_write(sc, RT2573_MAC_CSR12, 4); /* force wakeup */
2008 if (rum_pause(sc, hz / 100))

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

2023 rum_set_chan(sc, ic->ic_curchan);
2024
2025 /* clear STA registers */
2026 rum_read_multi(sc, RT2573_STA_CSR0, sc->sta, sizeof sc->sta);
2027
2028 rum_set_macaddr(sc, vap ? vap->iv_myaddr : ic->ic_macaddr);
2029
2030 /* initialize ASIC */
1994 rum_write(sc, RT2573_MAC_CSR1, 0);
1995
1996 /* wait for BBP/RF to wakeup */
1997 for (ntries = 0; ntries < 100; ntries++) {
1998 if (rum_read(sc, RT2573_MAC_CSR12) & 8)
1999 break;
2000 rum_write(sc, RT2573_MAC_CSR12, 4); /* force wakeup */
2001 if (rum_pause(sc, hz / 100))

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

2016 rum_set_chan(sc, ic->ic_curchan);
2017
2018 /* clear STA registers */
2019 rum_read_multi(sc, RT2573_STA_CSR0, sc->sta, sizeof sc->sta);
2020
2021 rum_set_macaddr(sc, vap ? vap->iv_myaddr : ic->ic_macaddr);
2022
2023 /* initialize ASIC */
2031 rum_write(sc, RT2573_MAC_CSR1, 4);
2024 rum_write(sc, RT2573_MAC_CSR1, RT2573_HOST_READY);
2032
2033 /*
2034 * Allocate Tx and Rx xfer queues.
2035 */
2036 rum_setup_tx_list(sc);
2037
2038 /* update Rx filter */
2039 tmp = rum_read(sc, RT2573_TXRX_CSR0) & 0xffff;

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

2057fail: rum_stop(sc);
2058#undef N
2059}
2060
2061static void
2062rum_stop(struct rum_softc *sc)
2063{
2064
2025
2026 /*
2027 * Allocate Tx and Rx xfer queues.
2028 */
2029 rum_setup_tx_list(sc);
2030
2031 /* update Rx filter */
2032 tmp = rum_read(sc, RT2573_TXRX_CSR0) & 0xffff;

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

2050fail: rum_stop(sc);
2051#undef N
2052}
2053
2054static void
2055rum_stop(struct rum_softc *sc)
2056{
2057
2065 RUM_LOCK_ASSERT(sc, MA_OWNED);
2058 RUM_LOCK_ASSERT(sc);
2066
2067 sc->sc_running = 0;
2068
2069 RUM_UNLOCK(sc);
2070
2071 /*
2072 * Drain the USB transfers, if not already drained:
2073 */
2074 usbd_transfer_drain(sc->sc_xfer[RUM_BULK_WR]);
2075 usbd_transfer_drain(sc->sc_xfer[RUM_BULK_RD]);
2076
2077 RUM_LOCK(sc);
2078
2079 rum_unsetup_tx_list(sc);
2080
2081 /* disable Rx */
2082 rum_setbits(sc, RT2573_TXRX_CSR0, RT2573_DISABLE_RX);
2083
2084 /* reset ASIC */
2059
2060 sc->sc_running = 0;
2061
2062 RUM_UNLOCK(sc);
2063
2064 /*
2065 * Drain the USB transfers, if not already drained:
2066 */
2067 usbd_transfer_drain(sc->sc_xfer[RUM_BULK_WR]);
2068 usbd_transfer_drain(sc->sc_xfer[RUM_BULK_RD]);
2069
2070 RUM_LOCK(sc);
2071
2072 rum_unsetup_tx_list(sc);
2073
2074 /* disable Rx */
2075 rum_setbits(sc, RT2573_TXRX_CSR0, RT2573_DISABLE_RX);
2076
2077 /* reset ASIC */
2085 rum_write(sc, RT2573_MAC_CSR1, 3);
2078 rum_write(sc, RT2573_MAC_CSR1, RT2573_RESET_ASIC | RT2573_RESET_BBP);
2086 rum_write(sc, RT2573_MAC_CSR1, 0);
2087}
2088
2089static void
2090rum_load_microcode(struct rum_softc *sc, const uint8_t *ucode, size_t size)
2091{
2092 struct usb_device_request req;
2093 uint16_t reg = RT2573_MCU_CODE_BASE;

--- 268 unchanged lines hidden ---
2079 rum_write(sc, RT2573_MAC_CSR1, 0);
2080}
2081
2082static void
2083rum_load_microcode(struct rum_softc *sc, const uint8_t *ucode, size_t size)
2084{
2085 struct usb_device_request req;
2086 uint16_t reg = RT2573_MCU_CODE_BASE;

--- 268 unchanged lines hidden ---