From owner-svn-src-user@freebsd.org Mon Sep 28 03:31:04 2015 Return-Path: Delivered-To: svn-src-user@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 4AE03A0A834 for ; Mon, 28 Sep 2015 03:31:04 +0000 (UTC) (envelope-from ngie@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 2F92C66C; Mon, 28 Sep 2015 03:31:04 +0000 (UTC) (envelope-from ngie@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.70]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id t8S3V4uZ044828; Mon, 28 Sep 2015 03:31:04 GMT (envelope-from ngie@FreeBSD.org) Received: (from ngie@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id t8S3V147044817; Mon, 28 Sep 2015 03:31:01 GMT (envelope-from ngie@FreeBSD.org) Message-Id: <201509280331.t8S3V147044817@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: ngie set sender to ngie@FreeBSD.org using -f From: Garrett Cooper Date: Mon, 28 Sep 2015 03:31:01 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r288329 - in user/ngie/more-tests/sys: dev/otus dev/usb/wlan net80211 X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 28 Sep 2015 03:31:04 -0000 Author: ngie Date: Mon Sep 28 03:31:01 2015 New Revision: 288329 URL: https://svnweb.freebsd.org/changeset/base/288329 Log: MFhead@r288328 Modified: user/ngie/more-tests/sys/dev/otus/if_otus.c user/ngie/more-tests/sys/dev/otus/if_otusreg.h user/ngie/more-tests/sys/dev/usb/wlan/if_rsu.c user/ngie/more-tests/sys/net80211/ieee80211_ht.c user/ngie/more-tests/sys/net80211/ieee80211_ht.h user/ngie/more-tests/sys/net80211/ieee80211_node.h user/ngie/more-tests/sys/net80211/ieee80211_output.c user/ngie/more-tests/sys/net80211/ieee80211_superg.c Directory Properties: user/ngie/more-tests/ (props changed) user/ngie/more-tests/etc/ (props changed) user/ngie/more-tests/sys/ (props changed) Modified: user/ngie/more-tests/sys/dev/otus/if_otus.c ============================================================================== --- user/ngie/more-tests/sys/dev/otus/if_otus.c Mon Sep 28 03:28:22 2015 (r288328) +++ user/ngie/more-tests/sys/dev/otus/if_otus.c Mon Sep 28 03:31:01 2015 (r288329) @@ -24,6 +24,8 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_wlan.h" + #include #include #include @@ -60,6 +62,9 @@ __FBSDID("$FreeBSD$"); #include #include #include +#ifdef IEEE80211_SUPPORT_SUPERG +#include +#endif #include #include @@ -340,6 +345,7 @@ otus_detach(device_t self) taskqueue_drain(taskqueue_thread, &sc->tx_task); taskqueue_drain(taskqueue_thread, &sc->wme_update_task); + otus_close_pipes(sc); #if 0 /* Wait for all queued asynchronous commands to complete. */ usb_rem_wait_task(sc->sc_udev, &sc->sc_task); @@ -348,7 +354,6 @@ otus_detach(device_t self) #endif ieee80211_ifdetach(ic); - otus_close_pipes(sc); mtx_destroy(&sc->sc_mtx); return 0; } @@ -949,9 +954,12 @@ fail: otus_close_pipes(sc); void otus_close_pipes(struct otus_softc *sc) { + + OTUS_LOCK(sc); otus_free_tx_cmd_list(sc); otus_free_tx_list(sc); otus_free_rx_list(sc); + OTUS_UNLOCK(sc); usbd_transfer_unsetup(sc->sc_xfer, OTUS_N_XFER); } @@ -1838,6 +1846,9 @@ tr_setup: } else (void)ieee80211_input_mimo_all(ic, m, NULL); } +#ifdef IEEE80211_SUPPORT_SUPERG + ieee80211_ff_age_all(ic, 100); +#endif OTUS_LOCK(sc); break; default: @@ -1866,6 +1877,14 @@ otus_txeof(struct usb_xfer *xfer, struct OTUS_LOCK_ASSERT(sc); + if (sc->sc_tx_n_active == 0) { + device_printf(sc->sc_dev, + "%s: completed but tx_active=0\n", + __func__); + } else { + sc->sc_tx_n_active--; + } + if (data->m) { /* XXX status? */ /* XXX we get TX status via the RX path.. */ @@ -1926,6 +1945,7 @@ tr_setup: if (data == NULL) { OTUS_DPRINTF(sc, OTUS_DEBUG_XMIT, "%s: empty pending queue sc %p\n", __func__, sc); + sc->sc_tx_n_active = 0; goto finish; } STAILQ_REMOVE_HEAD(&sc->sc_tx_pending[which], next); @@ -1934,6 +1954,7 @@ tr_setup: OTUS_DPRINTF(sc, OTUS_DEBUG_XMIT, "%s: submitting transfer %p\n", __func__, data); usbd_transfer_submit(xfer); + sc->sc_tx_n_active++; break; default: data = STAILQ_FIRST(&sc->sc_tx_active[which]); @@ -1952,6 +1973,22 @@ tr_setup: } finish: +#ifdef IEEE80211_SUPPORT_SUPERG + /* + * If the TX active queue drops below a certain + * threshold, ensure we age fast-frames out so they're + * transmitted. + */ + if (sc->sc_tx_n_active < 2) { + /* XXX ew - net80211 should defer this for us! */ + OTUS_UNLOCK(sc); + ieee80211_ff_flush(ic, WME_AC_VO); + ieee80211_ff_flush(ic, WME_AC_VI); + ieee80211_ff_flush(ic, WME_AC_BE); + ieee80211_ff_flush(ic, WME_AC_BK); + OTUS_LOCK(sc); + } +#endif /* Kick TX */ otus_tx_start(sc); } Modified: user/ngie/more-tests/sys/dev/otus/if_otusreg.h ============================================================================== --- user/ngie/more-tests/sys/dev/otus/if_otusreg.h Mon Sep 28 03:28:22 2015 (r288328) +++ user/ngie/more-tests/sys/dev/otus/if_otusreg.h Mon Sep 28 03:31:01 2015 (r288329) @@ -984,6 +984,10 @@ struct otus_softc { /* current noisefloor, from SET_FREQUENCY */ int sc_nf[OTUS_NUM_CHAINS]; + /* How many pending, active transmit frames */ + int sc_tx_n_pending; + int sc_tx_n_active; + const uint32_t *phy_vals; struct { Modified: user/ngie/more-tests/sys/dev/usb/wlan/if_rsu.c ============================================================================== --- user/ngie/more-tests/sys/dev/usb/wlan/if_rsu.c Mon Sep 28 03:28:22 2015 (r288328) +++ user/ngie/more-tests/sys/dev/usb/wlan/if_rsu.c Mon Sep 28 03:31:01 2015 (r288329) @@ -28,6 +28,8 @@ __FBSDID("$FreeBSD$"); * o power-save operation */ +#include "opt_wlan.h" + #include #include #include Modified: user/ngie/more-tests/sys/net80211/ieee80211_ht.c ============================================================================== --- user/ngie/more-tests/sys/net80211/ieee80211_ht.c Mon Sep 28 03:28:22 2015 (r288328) +++ user/ngie/more-tests/sys/net80211/ieee80211_ht.c Mon Sep 28 03:31:01 2015 (r288329) @@ -1081,7 +1081,7 @@ ieee80211_ht_node_init(struct ieee80211_ tap = &ni->ni_tx_ampdu[tid]; tap->txa_tid = tid; tap->txa_ni = ni; - tap->txa_lastsample = ticks; + ieee80211_txampdu_init_pps(tap); /* NB: further initialization deferred */ } ni->ni_flags |= IEEE80211_NODE_HT | IEEE80211_NODE_AMPDU; @@ -1251,7 +1251,7 @@ ieee80211_ht_wds_init(struct ieee80211_n for (tid = 0; tid < WME_NUM_TID; tid++) { tap = &ni->ni_tx_ampdu[tid]; tap->txa_tid = tid; - tap->txa_lastsample = ticks; + ieee80211_txampdu_init_pps(tap); } /* NB: AMPDU tx/rx governed by IEEE80211_FHT_AMPDU_{TX,RX} */ ni->ni_flags |= IEEE80211_NODE_HT | IEEE80211_NODE_AMPDU; @@ -1752,8 +1752,7 @@ ampdu_tx_stop(struct ieee80211_tx_ampdu /* * Reset packet estimate. */ - tap->txa_lastsample = ticks; - tap->txa_avgpps = 0; + ieee80211_txampdu_init_pps(tap); /* NB: clearing NAK means we may re-send ADDBA */ tap->txa_flags &= ~(IEEE80211_AGGR_SETUP | IEEE80211_AGGR_NAK); Modified: user/ngie/more-tests/sys/net80211/ieee80211_ht.h ============================================================================== --- user/ngie/more-tests/sys/net80211/ieee80211_ht.h Mon Sep 28 03:28:22 2015 (r288328) +++ user/ngie/more-tests/sys/net80211/ieee80211_ht.h Mon Sep 28 03:31:01 2015 (r288329) @@ -84,8 +84,19 @@ struct ieee80211_tx_ampdu { */ static __inline void +ieee80211_txampdu_init_pps(struct ieee80211_tx_ampdu *tap) +{ + /* + * Reset packet estimate. + */ + tap->txa_lastsample = ticks; + tap->txa_avgpps = 0; +} + +static __inline void ieee80211_txampdu_update_pps(struct ieee80211_tx_ampdu *tap) { + /* NB: scale factor of 2 was picked heuristically */ tap->txa_avgpps = ((tap->txa_avgpps << 2) - tap->txa_avgpps + tap->txa_pkts) >> 2; @@ -97,6 +108,7 @@ ieee80211_txampdu_update_pps(struct ieee static __inline void ieee80211_txampdu_count_packet(struct ieee80211_tx_ampdu *tap) { + /* XXX bound loop/do more crude estimate? */ while (ticks - tap->txa_lastsample >= hz) { ieee80211_txampdu_update_pps(tap); Modified: user/ngie/more-tests/sys/net80211/ieee80211_node.h ============================================================================== --- user/ngie/more-tests/sys/net80211/ieee80211_node.h Mon Sep 28 03:28:22 2015 (r288328) +++ user/ngie/more-tests/sys/net80211/ieee80211_node.h Mon Sep 28 03:31:01 2015 (r288329) @@ -219,6 +219,9 @@ struct ieee80211_node { struct ieee80211_tx_ampdu ni_tx_ampdu[WME_NUM_TID]; struct ieee80211_rx_ampdu ni_rx_ampdu[WME_NUM_TID]; + /* fast-frames state */ + struct mbuf * ni_tx_superg[WME_NUM_TID]; + /* others */ short ni_inact; /* inactivity mark count */ short ni_inact_reload;/* inactivity reload value */ Modified: user/ngie/more-tests/sys/net80211/ieee80211_output.c ============================================================================== --- user/ngie/more-tests/sys/net80211/ieee80211_output.c Mon Sep 28 03:28:22 2015 (r288328) +++ user/ngie/more-tests/sys/net80211/ieee80211_output.c Mon Sep 28 03:31:01 2015 (r288329) @@ -213,6 +213,22 @@ ieee80211_vap_pkt_send_dest(struct ieee8 } } + /* + * XXX If we aren't doing AMPDU TX then we /could/ do + * fast-frames encapsulation, however right now this + * output logic doesn't handle that case. + * + * So we'll be limited to "fast-frames" xmit for non-11n STA + * and "no fast frames" xmit for 11n STAs. + * It'd be nice to eventually test fast-frames out by + * gracefully falling from failing A-MPDU transmission + * (driver says no, fail to negotiate it with peer) to + * using fast-frames. + * + * Note: we can actually put A-MSDU's inside an A-MPDU, + * so hopefully we can figure out how to make that particular + * combination work right. + */ #ifdef IEEE80211_SUPPORT_SUPERG else if (IEEE80211_ATH_CAP(vap, ni, IEEE80211_NODE_FF)) { m = ieee80211_ff_check(ni, m); @@ -230,6 +246,11 @@ ieee80211_vap_pkt_send_dest(struct ieee8 */ IEEE80211_TX_LOCK(ic); + /* + * XXX make the encap and transmit code a separate function + * so things like the FF (and later A-MSDU) path can just call + * it for flushed frames. + */ if (__predict_true((vap->iv_caps & IEEE80211_C_8023ENCAP) == 0)) { /* * Encapsulate the packet in prep for transmission. Modified: user/ngie/more-tests/sys/net80211/ieee80211_superg.c ============================================================================== --- user/ngie/more-tests/sys/net80211/ieee80211_superg.c Mon Sep 28 03:28:22 2015 (r288328) +++ user/ngie/more-tests/sys/net80211/ieee80211_superg.c Mon Sep 28 03:31:01 2015 (r288329) @@ -530,7 +530,6 @@ ieee80211_ff_age(struct ieee80211com *ic { struct mbuf *m, *head; struct ieee80211_node *ni; - struct ieee80211_tx_ampdu *tap; #if 0 KASSERT(sq->head != NULL, ("stageq empty")); @@ -541,11 +540,10 @@ ieee80211_ff_age(struct ieee80211com *ic while ((m = sq->head) != NULL && M_AGE_GET(m) < quanta) { int tid = WME_AC_TO_TID(M_WME_GETAC(m)); - /* clear tap ref to frame */ + /* clear staging ref to frame */ ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; - tap = &ni->ni_tx_ampdu[tid]; - KASSERT(tap->txa_private == m, ("staging queue empty")); - tap->txa_private = NULL; + KASSERT(ni->ni_tx_superg[tid] == m, ("staging queue empty")); + ni->ni_tx_superg[tid] = NULL; sq->head = m->m_nextpkt; sq->depth--; @@ -658,7 +656,12 @@ ieee80211_ff_check(struct ieee80211_node */ IEEE80211_LOCK(ic); tap = &ni->ni_tx_ampdu[WME_AC_TO_TID(pri)]; - mstaged = tap->txa_private; /* NB: we reuse AMPDU state */ + mstaged = ni->ni_tx_superg[WME_AC_TO_TID(pri)]; + /* XXX NOTE: reusing packet counter state from A-MPDU */ + /* + * XXX NOTE: this means we're double-counting; it should just + * be done in ieee80211_output.c once for both superg and A-MPDU. + */ ieee80211_txampdu_count_packet(tap); /* @@ -676,6 +679,8 @@ ieee80211_ff_check(struct ieee80211_node * If there is no frame to combine with and the pps is * too low; then do not attempt to aggregate this frame. */ + IEEE80211_DPRINTF(vap, IEEE80211_MSG_SUPERG, + "%s: staged: %p; pps: %d\n", __func__, mstaged, ieee80211_txampdu_getpps(tap)); if (mstaged == NULL && ieee80211_txampdu_getpps(tap) < ieee80211_ffppsmin) { IEEE80211_UNLOCK(ic); @@ -698,7 +703,7 @@ ieee80211_ff_check(struct ieee80211_node "%s: txtime %u exceeds txop limit %u\n", __func__, txtime, limit); - tap->txa_private = NULL; + ni->ni_tx_superg[WME_AC_TO_TID(pri)] = NULL; if (mstaged != NULL) stageq_remove(ic, sq, mstaged); IEEE80211_UNLOCK(ic); @@ -721,7 +726,7 @@ ieee80211_ff_check(struct ieee80211_node * hold their node reference. */ if (mstaged != NULL) { - tap->txa_private = NULL; + ni->ni_tx_superg[WME_AC_TO_TID(pri)] = NULL; stageq_remove(ic, sq, mstaged); IEEE80211_UNLOCK(ic); @@ -739,9 +744,10 @@ ieee80211_ff_check(struct ieee80211_node mstaged->m_nextpkt = m; mstaged->m_flags |= M_FF; /* NB: mark for encap work */ } else { - KASSERT(tap->txa_private == NULL, - ("txa_private %p", tap->txa_private)); - tap->txa_private = m; + KASSERT(ni->ni_tx_superg[WME_AC_TO_TID(pri)]== NULL, + ("ni_tx_superg[]: %p", + ni->ni_tx_superg[WME_AC_TO_TID(pri)])); + ni->ni_tx_superg[WME_AC_TO_TID(pri)] = m; stageq_add(ic, sq, m); IEEE80211_UNLOCK(ic); @@ -769,7 +775,6 @@ ieee80211_ff_node_cleanup(struct ieee802 { struct ieee80211com *ic = ni->ni_ic; struct ieee80211_superg *sg = ic->ic_superg; - struct ieee80211_tx_ampdu *tap; struct mbuf *m, *next_m, *head; int tid; @@ -777,11 +782,16 @@ ieee80211_ff_node_cleanup(struct ieee802 head = NULL; for (tid = 0; tid < WME_NUM_TID; tid++) { int ac = TID_TO_WME_AC(tid); - - tap = &ni->ni_tx_ampdu[tid]; - m = tap->txa_private; + /* + * XXX Initialise the packet counter. + * + * This may be double-work for 11n stations; + * but without it we never setup things. + */ + ieee80211_txampdu_init_pps(&ni->ni_tx_ampdu[tid]); + m = ni->ni_tx_superg[tid]; if (m != NULL) { - tap->txa_private = NULL; + ni->ni_tx_superg[tid] = NULL; stageq_remove(ic, &sg->ff_stageq[ac], m); m->m_nextpkt = head; head = m;