if_rsu.c (288051) | if_rsu.c (288052) |
---|---|
1/* $OpenBSD: if_rsu.c,v 1.17 2013/04/15 09:23:01 mglocker Exp $ */ 2 3/*- 4 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18#include <sys/cdefs.h> | 1/* $OpenBSD: if_rsu.c,v 1.17 2013/04/15 09:23:01 mglocker Exp $ */ 2 3/*- 4 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18#include <sys/cdefs.h> |
19__FBSDID("$FreeBSD: head/sys/dev/usb/wlan/if_rsu.c 288051 2015-09-21 02:12:01Z adrian $"); | 19__FBSDID("$FreeBSD: head/sys/dev/usb/wlan/if_rsu.c 288052 2015-09-21 02:30:22Z adrian $"); |
20 21/* 22 * Driver for Realtek RTL8188SU/RTL8191SU/RTL8192SU. 23 * 24 * TODO: 25 * o 11n support 26 * o h/w crypto 27 * o hostap / ibss / mesh --- 157 unchanged lines hidden (view full) --- 185static uint8_t rsu_read_1(struct rsu_softc *, uint16_t); 186static uint16_t rsu_read_2(struct rsu_softc *, uint16_t); 187static uint32_t rsu_read_4(struct rsu_softc *, uint16_t); 188static int rsu_fw_iocmd(struct rsu_softc *, uint32_t); 189static uint8_t rsu_efuse_read_1(struct rsu_softc *, uint16_t); 190static int rsu_read_rom(struct rsu_softc *); 191static int rsu_fw_cmd(struct rsu_softc *, uint8_t, void *, int); 192static void rsu_calib_task(void *, int); | 20 21/* 22 * Driver for Realtek RTL8188SU/RTL8191SU/RTL8192SU. 23 * 24 * TODO: 25 * o 11n support 26 * o h/w crypto 27 * o hostap / ibss / mesh --- 157 unchanged lines hidden (view full) --- 185static uint8_t rsu_read_1(struct rsu_softc *, uint16_t); 186static uint16_t rsu_read_2(struct rsu_softc *, uint16_t); 187static uint32_t rsu_read_4(struct rsu_softc *, uint16_t); 188static int rsu_fw_iocmd(struct rsu_softc *, uint32_t); 189static uint8_t rsu_efuse_read_1(struct rsu_softc *, uint16_t); 190static int rsu_read_rom(struct rsu_softc *); 191static int rsu_fw_cmd(struct rsu_softc *, uint8_t, void *, int); 192static void rsu_calib_task(void *, int); |
193static void rsu_tx_task(void *, int); |
|
193static int rsu_newstate(struct ieee80211vap *, enum ieee80211_state, int); 194#ifdef notyet 195static void rsu_set_key(struct rsu_softc *, const struct ieee80211_key *); 196static void rsu_delete_key(struct rsu_softc *, const struct ieee80211_key *); 197#endif 198static int rsu_site_survey(struct rsu_softc *, struct ieee80211vap *); 199static int rsu_join_bss(struct rsu_softc *, struct ieee80211_node *); 200static int rsu_disconnect(struct rsu_softc *); --- 11 unchanged lines hidden (view full) --- 212static void rsu_txeof(struct usb_xfer *, struct rsu_data *); 213static int rsu_raw_xmit(struct ieee80211_node *, struct mbuf *, 214 const struct ieee80211_bpf_params *); 215static void rsu_init(struct rsu_softc *); 216static int rsu_tx_start(struct rsu_softc *, struct ieee80211_node *, 217 struct mbuf *, struct rsu_data *); 218static int rsu_transmit(struct ieee80211com *, struct mbuf *); 219static void rsu_start(struct rsu_softc *); | 194static int rsu_newstate(struct ieee80211vap *, enum ieee80211_state, int); 195#ifdef notyet 196static void rsu_set_key(struct rsu_softc *, const struct ieee80211_key *); 197static void rsu_delete_key(struct rsu_softc *, const struct ieee80211_key *); 198#endif 199static int rsu_site_survey(struct rsu_softc *, struct ieee80211vap *); 200static int rsu_join_bss(struct rsu_softc *, struct ieee80211_node *); 201static int rsu_disconnect(struct rsu_softc *); --- 11 unchanged lines hidden (view full) --- 213static void rsu_txeof(struct usb_xfer *, struct rsu_data *); 214static int rsu_raw_xmit(struct ieee80211_node *, struct mbuf *, 215 const struct ieee80211_bpf_params *); 216static void rsu_init(struct rsu_softc *); 217static int rsu_tx_start(struct rsu_softc *, struct ieee80211_node *, 218 struct mbuf *, struct rsu_data *); 219static int rsu_transmit(struct ieee80211com *, struct mbuf *); 220static void rsu_start(struct rsu_softc *); |
221static void _rsu_start(struct rsu_softc *); |
|
220static void rsu_parent(struct ieee80211com *); 221static void rsu_stop(struct rsu_softc *); 222static void rsu_ms_delay(struct rsu_softc *, int); 223 224static device_method_t rsu_methods[] = { 225 DEVMETHOD(device_probe, rsu_match), 226 DEVMETHOD(device_attach, rsu_attach), 227 DEVMETHOD(device_detach, rsu_detach), --- 146 unchanged lines hidden (view full) --- 374 "the driver currently only supports 4-endpoint devices\n"); 375 return (ENXIO); 376 } 377 378 mtx_init(&sc->sc_mtx, device_get_nameunit(self), MTX_NETWORK_LOCK, 379 MTX_DEF); 380 TIMEOUT_TASK_INIT(taskqueue_thread, &sc->calib_task, 0, 381 rsu_calib_task, sc); | 222static void rsu_parent(struct ieee80211com *); 223static void rsu_stop(struct rsu_softc *); 224static void rsu_ms_delay(struct rsu_softc *, int); 225 226static device_method_t rsu_methods[] = { 227 DEVMETHOD(device_probe, rsu_match), 228 DEVMETHOD(device_attach, rsu_attach), 229 DEVMETHOD(device_detach, rsu_detach), --- 146 unchanged lines hidden (view full) --- 376 "the driver currently only supports 4-endpoint devices\n"); 377 return (ENXIO); 378 } 379 380 mtx_init(&sc->sc_mtx, device_get_nameunit(self), MTX_NETWORK_LOCK, 381 MTX_DEF); 382 TIMEOUT_TASK_INIT(taskqueue_thread, &sc->calib_task, 0, 383 rsu_calib_task, sc); |
384 TASK_INIT(&sc->tx_task, 0, rsu_tx_task, sc); |
|
382 mbufq_init(&sc->sc_snd, ifqmaxlen); 383 384 /* Allocate Tx/Rx buffers. */ 385 error = rsu_alloc_rx_list(sc); 386 if (error != 0) { 387 device_printf(sc->sc_dev, "could not allocate Rx buffers\n"); 388 goto fail_usb; 389 } --- 118 unchanged lines hidden (view full) --- 508 rsu_stop(sc); 509 RSU_UNLOCK(sc); 510 usbd_transfer_unsetup(sc->sc_xfer, RSU_N_TRANSFER); 511 512 /* Frames are freed; detach from net80211 */ 513 ieee80211_ifdetach(ic); 514 515 taskqueue_drain_timeout(taskqueue_thread, &sc->calib_task); | 385 mbufq_init(&sc->sc_snd, ifqmaxlen); 386 387 /* Allocate Tx/Rx buffers. */ 388 error = rsu_alloc_rx_list(sc); 389 if (error != 0) { 390 device_printf(sc->sc_dev, "could not allocate Rx buffers\n"); 391 goto fail_usb; 392 } --- 118 unchanged lines hidden (view full) --- 511 rsu_stop(sc); 512 RSU_UNLOCK(sc); 513 usbd_transfer_unsetup(sc->sc_xfer, RSU_N_TRANSFER); 514 515 /* Frames are freed; detach from net80211 */ 516 ieee80211_ifdetach(ic); 517 518 taskqueue_drain_timeout(taskqueue_thread, &sc->calib_task); |
519 taskqueue_drain(taskqueue_thread, &sc->tx_task); |
|
516 517 /* Free Tx/Rx buffers. */ 518 rsu_free_tx_list(sc); 519 rsu_free_rx_list(sc); 520 521 mtx_destroy(&sc->sc_mtx); 522 523 return (0); --- 497 unchanged lines hidden (view full) --- 1021 RSU_DPRINTF(sc, RSU_DEBUG_CALIB, "%s: RSSI=%d%%\n", 1022 __func__, reg >> 4); 1023 } 1024 if (sc->sc_calibrating) 1025 taskqueue_enqueue_timeout(taskqueue_thread, &sc->calib_task, hz); 1026 RSU_UNLOCK(sc); 1027} 1028 | 520 521 /* Free Tx/Rx buffers. */ 522 rsu_free_tx_list(sc); 523 rsu_free_rx_list(sc); 524 525 mtx_destroy(&sc->sc_mtx); 526 527 return (0); --- 497 unchanged lines hidden (view full) --- 1025 RSU_DPRINTF(sc, RSU_DEBUG_CALIB, "%s: RSSI=%d%%\n", 1026 __func__, reg >> 4); 1027 } 1028 if (sc->sc_calibrating) 1029 taskqueue_enqueue_timeout(taskqueue_thread, &sc->calib_task, hz); 1030 RSU_UNLOCK(sc); 1031} 1032 |
1033static void 1034rsu_tx_task(void *arg, int pending __unused) 1035{ 1036 struct rsu_softc *sc = arg; 1037 1038 RSU_LOCK(sc); 1039 _rsu_start(sc); 1040 RSU_UNLOCK(sc); 1041} 1042 |
|
1029static int 1030rsu_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) 1031{ 1032 struct rsu_vap *uvp = RSU_VAP(vap); 1033 struct ieee80211com *ic = vap->iv_ic; 1034 struct rsu_softc *sc = ic->ic_softc; 1035 struct ieee80211_node *ni; 1036 struct ieee80211_rateset *rs; --- 8 unchanged lines hidden (view full) --- 1045 1046 IEEE80211_UNLOCK(ic); 1047 if (ostate == IEEE80211_S_RUN) { 1048 RSU_LOCK(sc); 1049 /* Stop calibration. */ 1050 sc->sc_calibrating = 0; 1051 RSU_UNLOCK(sc); 1052 taskqueue_drain_timeout(taskqueue_thread, &sc->calib_task); | 1043static int 1044rsu_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg) 1045{ 1046 struct rsu_vap *uvp = RSU_VAP(vap); 1047 struct ieee80211com *ic = vap->iv_ic; 1048 struct rsu_softc *sc = ic->ic_softc; 1049 struct ieee80211_node *ni; 1050 struct ieee80211_rateset *rs; --- 8 unchanged lines hidden (view full) --- 1059 1060 IEEE80211_UNLOCK(ic); 1061 if (ostate == IEEE80211_S_RUN) { 1062 RSU_LOCK(sc); 1063 /* Stop calibration. */ 1064 sc->sc_calibrating = 0; 1065 RSU_UNLOCK(sc); 1066 taskqueue_drain_timeout(taskqueue_thread, &sc->calib_task); |
1067 taskqueue_drain(taskqueue_thread, &sc->tx_task); |
|
1053 /* Disassociate from our current BSS. */ 1054 RSU_LOCK(sc); 1055 rsu_disconnect(sc); 1056 } else 1057 RSU_LOCK(sc); 1058 switch (nstate) { 1059 case IEEE80211_S_INIT: 1060 break; --- 772 unchanged lines hidden (view full) --- 1833 } 1834 break; 1835 } 1836} 1837 1838static void 1839rsu_bulk_tx_callback_be_bk(struct usb_xfer *xfer, usb_error_t error) 1840{ | 1068 /* Disassociate from our current BSS. */ 1069 RSU_LOCK(sc); 1070 rsu_disconnect(sc); 1071 } else 1072 RSU_LOCK(sc); 1073 switch (nstate) { 1074 case IEEE80211_S_INIT: 1075 break; --- 772 unchanged lines hidden (view full) --- 1848 } 1849 break; 1850 } 1851} 1852 1853static void 1854rsu_bulk_tx_callback_be_bk(struct usb_xfer *xfer, usb_error_t error) 1855{ |
1856 struct rsu_softc *sc = usbd_xfer_softc(xfer); 1857 |
|
1841 rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_BE_BK); | 1858 rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_BE_BK); |
1859 1860 /* This kicks the TX taskqueue */ 1861 rsu_start(sc); |
|
1842} 1843 1844static void 1845rsu_bulk_tx_callback_vi_vo(struct usb_xfer *xfer, usb_error_t error) 1846{ | 1862} 1863 1864static void 1865rsu_bulk_tx_callback_vi_vo(struct usb_xfer *xfer, usb_error_t error) 1866{ |
1867 struct rsu_softc *sc = usbd_xfer_softc(xfer); 1868 |
|
1847 rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_VI_VO); | 1869 rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_VI_VO); |
1870 1871 /* This kicks the TX taskqueue */ 1872 rsu_start(sc); |
|
1848} 1849 1850static void 1851rsu_bulk_tx_callback_h2c(struct usb_xfer *xfer, usb_error_t error) 1852{ | 1873} 1874 1875static void 1876rsu_bulk_tx_callback_h2c(struct usb_xfer *xfer, usb_error_t error) 1877{ |
1878 struct rsu_softc *sc = usbd_xfer_softc(xfer); 1879 |
|
1853 rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_H2C); | 1880 rsu_bulk_tx_callback_sub(xfer, error, RSU_BULK_TX_H2C); |
1881 1882 /* This kicks the TX taskqueue */ 1883 rsu_start(sc); |
|
1854} 1855 1856static int 1857rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni, 1858 struct mbuf *m0, struct rsu_data *data) 1859{ 1860 struct ieee80211com *ic = &sc->sc_ic; 1861 struct ieee80211vap *vap = ni->ni_vap; --- 141 unchanged lines hidden (view full) --- 2003 if (error) { 2004 RSU_DPRINTF(sc, RSU_DEBUG_TX, 2005 "%s: mbufq_enable: failed (%d)\n", 2006 __func__, 2007 error); 2008 RSU_UNLOCK(sc); 2009 return (error); 2010 } | 1884} 1885 1886static int 1887rsu_tx_start(struct rsu_softc *sc, struct ieee80211_node *ni, 1888 struct mbuf *m0, struct rsu_data *data) 1889{ 1890 struct ieee80211com *ic = &sc->sc_ic; 1891 struct ieee80211vap *vap = ni->ni_vap; --- 141 unchanged lines hidden (view full) --- 2033 if (error) { 2034 RSU_DPRINTF(sc, RSU_DEBUG_TX, 2035 "%s: mbufq_enable: failed (%d)\n", 2036 __func__, 2037 error); 2038 RSU_UNLOCK(sc); 2039 return (error); 2040 } |
2011 rsu_start(sc); | |
2012 RSU_UNLOCK(sc); 2013 | 2041 RSU_UNLOCK(sc); 2042 |
2043 /* This kicks the TX taskqueue */ 2044 rsu_start(sc); 2045 |
|
2014 return (0); 2015} 2016 2017static void 2018rsu_drain_mbufq(struct rsu_softc *sc) 2019{ 2020 struct mbuf *m; 2021 struct ieee80211_node *ni; 2022 2023 RSU_ASSERT_LOCKED(sc); 2024 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { 2025 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; 2026 m->m_pkthdr.rcvif = NULL; 2027 ieee80211_free_node(ni); 2028 m_freem(m); 2029 } 2030} 2031 2032static void | 2046 return (0); 2047} 2048 2049static void 2050rsu_drain_mbufq(struct rsu_softc *sc) 2051{ 2052 struct mbuf *m; 2053 struct ieee80211_node *ni; 2054 2055 RSU_ASSERT_LOCKED(sc); 2056 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { 2057 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif; 2058 m->m_pkthdr.rcvif = NULL; 2059 ieee80211_free_node(ni); 2060 m_freem(m); 2061 } 2062} 2063 2064static void |
2033rsu_start(struct rsu_softc *sc) | 2065_rsu_start(struct rsu_softc *sc) |
2034{ 2035 struct ieee80211_node *ni; 2036 struct rsu_data *bf; 2037 struct mbuf *m; 2038 2039 RSU_ASSERT_LOCKED(sc); 2040 2041 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { --- 16 unchanged lines hidden (view full) --- 2058 rsu_freebuf(sc, bf); 2059 ieee80211_free_node(ni); 2060 break; 2061 } 2062 } 2063} 2064 2065static void | 2066{ 2067 struct ieee80211_node *ni; 2068 struct rsu_data *bf; 2069 struct mbuf *m; 2070 2071 RSU_ASSERT_LOCKED(sc); 2072 2073 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) { --- 16 unchanged lines hidden (view full) --- 2090 rsu_freebuf(sc, bf); 2091 ieee80211_free_node(ni); 2092 break; 2093 } 2094 } 2095} 2096 2097static void |
2098rsu_start(struct rsu_softc *sc) 2099{ 2100 2101 taskqueue_enqueue(taskqueue_thread, &sc->tx_task); 2102} 2103 2104static void |
|
2066rsu_parent(struct ieee80211com *ic) 2067{ 2068 struct rsu_softc *sc = ic->ic_softc; 2069 int startall = 0; 2070 2071 RSU_LOCK(sc); 2072 if (ic->ic_nrunning > 0) { 2073 if (!sc->sc_running) { --- 605 unchanged lines hidden (view full) --- 2679static void 2680rsu_stop(struct rsu_softc *sc) 2681{ 2682 int i; 2683 2684 sc->sc_running = 0; 2685 sc->sc_calibrating = 0; 2686 taskqueue_cancel_timeout(taskqueue_thread, &sc->calib_task, NULL); | 2105rsu_parent(struct ieee80211com *ic) 2106{ 2107 struct rsu_softc *sc = ic->ic_softc; 2108 int startall = 0; 2109 2110 RSU_LOCK(sc); 2111 if (ic->ic_nrunning > 0) { 2112 if (!sc->sc_running) { --- 605 unchanged lines hidden (view full) --- 2718static void 2719rsu_stop(struct rsu_softc *sc) 2720{ 2721 int i; 2722 2723 sc->sc_running = 0; 2724 sc->sc_calibrating = 0; 2725 taskqueue_cancel_timeout(taskqueue_thread, &sc->calib_task, NULL); |
2726 taskqueue_cancel(taskqueue_thread, &sc->tx_task, NULL); |
|
2687 2688 /* Power off adapter. */ 2689 rsu_power_off(sc); 2690 2691 for (i = 0; i < RSU_N_TRANSFER; i++) 2692 usbd_transfer_stop(sc->sc_xfer[i]); 2693 2694 /* Ensure the mbuf queue is drained */ --- 14 unchanged lines hidden --- | 2727 2728 /* Power off adapter. */ 2729 rsu_power_off(sc); 2730 2731 for (i = 0; i < RSU_N_TRANSFER; i++) 2732 usbd_transfer_stop(sc->sc_xfer[i]); 2733 2734 /* Ensure the mbuf queue is drained */ --- 14 unchanged lines hidden --- |