if_run.c (228494) | if_run.c (228508) |
---|---|
1/*- 2 * Copyright (c) 2008,2010 Damien Bergamini <damien.bergamini@free.fr> 3 * ported to FreeBSD by Akinori Furukoshi <moonlightakkiy@yahoo.ca> 4 * USB Consulting, Hans Petter Selasky <hselasky@freebsd.org> 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 19#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2008,2010 Damien Bergamini <damien.bergamini@free.fr> 3 * ported to FreeBSD by Akinori Furukoshi <moonlightakkiy@yahoo.ca> 4 * USB Consulting, Hans Petter Selasky <hselasky@freebsd.org> 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 19#include <sys/cdefs.h> |
20__FBSDID("$FreeBSD: head/sys/dev/usb/wlan/if_run.c 228494 2011-12-14 08:52:27Z hselasky $"); | 20__FBSDID("$FreeBSD: head/sys/dev/usb/wlan/if_run.c 228508 2011-12-14 22:14:05Z hselasky $"); |
21 22/*- 23 * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver. 24 * http://www.ralinktech.com/ 25 */ 26 27#include <sys/param.h> 28#include <sys/sockio.h> --- 2715 unchanged lines hidden (view full) --- 2744tr_setup: 2745 data = STAILQ_FIRST(&pq->tx_qh); 2746 if (data == NULL) 2747 break; 2748 2749 STAILQ_REMOVE_HEAD(&pq->tx_qh, next); 2750 2751 m = data->m; | 21 22/*- 23 * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver. 24 * http://www.ralinktech.com/ 25 */ 26 27#include <sys/param.h> 28#include <sys/sockio.h> --- 2715 unchanged lines hidden (view full) --- 2744tr_setup: 2745 data = STAILQ_FIRST(&pq->tx_qh); 2746 if (data == NULL) 2747 break; 2748 2749 STAILQ_REMOVE_HEAD(&pq->tx_qh, next); 2750 2751 m = data->m; |
2752 if (m->m_pkthdr.len > RUN_MAX_TXSZ) { | 2752 if ((m->m_pkthdr.len + 2753 sizeof(data->desc) + 3 + 8) > RUN_MAX_TXSZ) { |
2753 DPRINTF("data overflow, %u bytes\n", 2754 m->m_pkthdr.len); 2755 2756 ifp->if_oerrors++; 2757 2758 run_tx_free(pq, data, 1); 2759 2760 goto tr_setup; 2761 } 2762 2763 pc = usbd_xfer_get_frame(xfer, 0); 2764 size = sizeof(data->desc); 2765 usbd_copy_in(pc, 0, &data->desc, size); 2766 usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len); | 2754 DPRINTF("data overflow, %u bytes\n", 2755 m->m_pkthdr.len); 2756 2757 ifp->if_oerrors++; 2758 2759 run_tx_free(pq, data, 1); 2760 2761 goto tr_setup; 2762 } 2763 2764 pc = usbd_xfer_get_frame(xfer, 0); 2765 size = sizeof(data->desc); 2766 usbd_copy_in(pc, 0, &data->desc, size); 2767 usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len); |
2768 size += m->m_pkthdr.len; 2769 /* 2770 * Align end on a 4-byte boundary, pad 8 bytes (CRC + 2771 * 4-byte padding), and be sure to zero those trailing 2772 * bytes: 2773 */ 2774 usbd_frame_zero(pc, size, ((-size) & 3) + 8); 2775 size += ((-size) & 3) + 8; |
|
2767 2768 vap = data->ni->ni_vap; 2769 if (ieee80211_radiotap_active_vap(vap)) { 2770 struct run_tx_radiotap_header *tap = &sc->sc_txtap; 2771 struct rt2860_txwi *txwi = 2772 (struct rt2860_txwi *)(&data->desc + sizeof(struct rt2870_txd)); 2773 2774 tap->wt_flags = 0; 2775 tap->wt_rate = rt2860_rates[data->ridx].rate; 2776 tap->wt_chan_freq = htole16(vap->iv_bss->ni_chan->ic_freq); 2777 tap->wt_chan_flags = htole16(vap->iv_bss->ni_chan->ic_flags); 2778 tap->wt_hwqueue = index; 2779 if (le16toh(txwi->phy) & RT2860_PHY_SHPRE) 2780 tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; 2781 2782 ieee80211_radiotap_tx(vap, m); 2783 } 2784 | 2776 2777 vap = data->ni->ni_vap; 2778 if (ieee80211_radiotap_active_vap(vap)) { 2779 struct run_tx_radiotap_header *tap = &sc->sc_txtap; 2780 struct rt2860_txwi *txwi = 2781 (struct rt2860_txwi *)(&data->desc + sizeof(struct rt2870_txd)); 2782 2783 tap->wt_flags = 0; 2784 tap->wt_rate = rt2860_rates[data->ridx].rate; 2785 tap->wt_chan_freq = htole16(vap->iv_bss->ni_chan->ic_freq); 2786 tap->wt_chan_flags = htole16(vap->iv_bss->ni_chan->ic_flags); 2787 tap->wt_hwqueue = index; 2788 if (le16toh(txwi->phy) & RT2860_PHY_SHPRE) 2789 tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE; 2790 2791 ieee80211_radiotap_tx(vap, m); 2792 } 2793 |
2785 DPRINTFN(11, "sending frame len=%u @ index %d\n", 2786 m->m_pkthdr.len, index); | 2794 DPRINTFN(11, "sending frame len=%u/%u @ index %d\n", 2795 m->m_pkthdr.len, size, index); |
2787 | 2796 |
2788 usbd_xfer_set_frame_len(xfer, 0, size + m->m_pkthdr.len); | 2797 usbd_xfer_set_frame_len(xfer, 0, size); |
2789 usbd_xfer_set_priv(xfer, data); 2790 2791 usbd_transfer_submit(xfer); 2792 2793 RUN_UNLOCK(sc); 2794 run_start(ifp); 2795 RUN_LOCK(sc); 2796 --- 72 unchanged lines hidden (view full) --- 2869run_bulk_tx_callback5(struct usb_xfer *xfer, usb_error_t error) 2870{ 2871 run_bulk_tx_callbackN(xfer, error, 5); 2872} 2873 2874static void 2875run_set_tx_desc(struct run_softc *sc, struct run_tx_data *data) 2876{ | 2798 usbd_xfer_set_priv(xfer, data); 2799 2800 usbd_transfer_submit(xfer); 2801 2802 RUN_UNLOCK(sc); 2803 run_start(ifp); 2804 RUN_LOCK(sc); 2805 --- 72 unchanged lines hidden (view full) --- 2878run_bulk_tx_callback5(struct usb_xfer *xfer, usb_error_t error) 2879{ 2880 run_bulk_tx_callbackN(xfer, error, 5); 2881} 2882 2883static void 2884run_set_tx_desc(struct run_softc *sc, struct run_tx_data *data) 2885{ |
2877 static const uint8_t ztail[16]; | |
2878 struct mbuf *m = data->m; 2879 struct ieee80211com *ic = sc->sc_ifp->if_l2com; 2880 struct ieee80211vap *vap = data->ni->ni_vap; 2881 struct ieee80211_frame *wh; 2882 struct rt2870_txd *txd; 2883 struct rt2860_txwi *txwi; 2884 uint16_t xferlen; 2885 uint16_t mcs; --- 40 unchanged lines hidden (view full) --- 2926 ((ic->ic_flags & IEEE80211_F_USEPROT) && 2927 rt2860_rates[ridx].phy == IEEE80211_T_OFDM))) 2928 txwi->txop |= RT2860_TX_TXOP_HT; 2929 else 2930 txwi->txop |= RT2860_TX_TXOP_BACKOFF; 2931 2932 if (vap->iv_opmode != IEEE80211_M_STA && !IEEE80211_QOS_HAS_SEQ(wh)) 2933 txwi->xflags |= RT2860_TX_NSEQ; | 2886 struct mbuf *m = data->m; 2887 struct ieee80211com *ic = sc->sc_ifp->if_l2com; 2888 struct ieee80211vap *vap = data->ni->ni_vap; 2889 struct ieee80211_frame *wh; 2890 struct rt2870_txd *txd; 2891 struct rt2860_txwi *txwi; 2892 uint16_t xferlen; 2893 uint16_t mcs; --- 40 unchanged lines hidden (view full) --- 2934 ((ic->ic_flags & IEEE80211_F_USEPROT) && 2935 rt2860_rates[ridx].phy == IEEE80211_T_OFDM))) 2936 txwi->txop |= RT2860_TX_TXOP_HT; 2937 else 2938 txwi->txop |= RT2860_TX_TXOP_BACKOFF; 2939 2940 if (vap->iv_opmode != IEEE80211_M_STA && !IEEE80211_QOS_HAS_SEQ(wh)) 2941 txwi->xflags |= RT2860_TX_NSEQ; |
2934 2935 /* 2936 * Align end on a 4-byte boundary, pad 8 bytes (CRC + 4-byte padding), 2937 * and be sure to zero those trailing bytes. 2938 */ 2939 m_append(m, ((m->m_pkthdr.len + 3) & ~3) - m->m_pkthdr.len + 8, 2940 (c_caddr_t)ztail); | |
2941} 2942 2943/* This function must be called locked */ 2944static int 2945run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni) 2946{ 2947 struct ieee80211com *ic = sc->sc_ifp->if_l2com; 2948 struct ieee80211vap *vap = ni->ni_vap; --- 2014 unchanged lines hidden --- | 2942} 2943 2944/* This function must be called locked */ 2945static int 2946run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni) 2947{ 2948 struct ieee80211com *ic = sc->sc_ifp->if_l2com; 2949 struct ieee80211vap *vap = ni->ni_vap; --- 2014 unchanged lines hidden --- |