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 --- |