From owner-svn-src-all@FreeBSD.ORG Sun Apr 15 20:29:40 2012 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id CA940106564A; Sun, 15 Apr 2012 20:29:40 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id B42F88FC18; Sun, 15 Apr 2012 20:29:40 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q3FKTeqj000564; Sun, 15 Apr 2012 20:29:40 GMT (envelope-from adrian@svn.freebsd.org) Received: (from adrian@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q3FKTeAk000552; Sun, 15 Apr 2012 20:29:40 GMT (envelope-from adrian@svn.freebsd.org) Message-Id: <201204152029.q3FKTeAk000552@svn.freebsd.org> From: Adrian Chadd Date: Sun, 15 Apr 2012 20:29:40 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r234324 - in head/sys: dev/ath dev/iwn dev/mwl net80211 X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 Apr 2012 20:29:40 -0000 Author: adrian Date: Sun Apr 15 20:29:39 2012 New Revision: 234324 URL: http://svn.freebsd.org/changeset/base/234324 Log: Migrate the net80211 TX aggregation state to be from per-AC to per-TID. TODO: * Test mwl(4) more thoroughly! Reviewed by: bschmidt (for iwn) Modified: head/sys/dev/ath/if_ath_tx.c head/sys/dev/iwn/if_iwn.c head/sys/dev/mwl/if_mwl.c head/sys/dev/mwl/if_mwlvar.h head/sys/net80211/ieee80211_ddb.c head/sys/net80211/ieee80211_ht.c head/sys/net80211/ieee80211_ht.h head/sys/net80211/ieee80211_node.h head/sys/net80211/ieee80211_output.c head/sys/net80211/ieee80211_superg.c Modified: head/sys/dev/ath/if_ath_tx.c ============================================================================== --- head/sys/dev/ath/if_ath_tx.c Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/dev/ath/if_ath_tx.c Sun Apr 15 20:29:39 2012 (r234324) @@ -4214,14 +4214,11 @@ ath_tx_get_tx_tid(struct ath_node *an, i { struct ieee80211_node *ni = &an->an_node; struct ieee80211_tx_ampdu *tap; - int ac; if (tid == IEEE80211_NONQOS_TID) return NULL; - ac = TID_TO_WME_AC(tid); - - tap = &ni->ni_tx_ampdu[ac]; + tap = &ni->ni_tx_ampdu[tid]; return tap; } @@ -4279,7 +4276,7 @@ ath_addba_request(struct ieee80211_node int dialogtoken, int baparamset, int batimeout) { struct ath_softc *sc = ni->ni_ic->ic_ifp->if_softc; - int tid = WME_AC_TO_TID(tap->txa_ac); + int tid = tap->txa_tid; struct ath_node *an = ATH_NODE(ni); struct ath_tid *atid = &an->an_tid[tid]; @@ -4346,7 +4343,7 @@ ath_addba_response(struct ieee80211_node int status, int code, int batimeout) { struct ath_softc *sc = ni->ni_ic->ic_ifp->if_softc; - int tid = WME_AC_TO_TID(tap->txa_ac); + int tid = tap->txa_tid; struct ath_node *an = ATH_NODE(ni); struct ath_tid *atid = &an->an_tid[tid]; int r; @@ -4387,7 +4384,7 @@ void ath_addba_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap) { struct ath_softc *sc = ni->ni_ic->ic_ifp->if_softc; - int tid = WME_AC_TO_TID(tap->txa_ac); + int tid = tap->txa_tid; struct ath_node *an = ATH_NODE(ni); struct ath_tid *atid = &an->an_tid[tid]; @@ -4424,7 +4421,7 @@ ath_bar_response(struct ieee80211_node * int status) { struct ath_softc *sc = ni->ni_ic->ic_ifp->if_softc; - int tid = WME_AC_TO_TID(tap->txa_ac); + int tid = tap->txa_tid; struct ath_node *an = ATH_NODE(ni); struct ath_tid *atid = &an->an_tid[tid]; int attempts = tap->txa_attempts; @@ -4457,7 +4454,7 @@ ath_addba_response_timeout(struct ieee80 struct ieee80211_tx_ampdu *tap) { struct ath_softc *sc = ni->ni_ic->ic_ifp->if_softc; - int tid = WME_AC_TO_TID(tap->txa_ac); + int tid = tap->txa_tid; struct ath_node *an = ATH_NODE(ni); struct ath_tid *atid = &an->an_tid[tid]; Modified: head/sys/dev/iwn/if_iwn.c ============================================================================== --- head/sys/dev/iwn/if_iwn.c Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/dev/iwn/if_iwn.c Sun Apr 15 20:29:39 2012 (r234324) @@ -2445,7 +2445,7 @@ iwn_rx_compressed_ba(struct iwn_softc *s txq = &sc->txq[le16toh(ba->qid)]; tap = sc->qid2tap[le16toh(ba->qid)]; - tid = WME_AC_TO_TID(tap->txa_ac); + tid = tap->txa_tid; ni = tap->txa_ni; wn = (void *)ni; @@ -2804,7 +2804,7 @@ iwn_ampdu_tx_done(struct iwn_softc *sc, } tap = sc->qid2tap[qid]; if (tap != NULL) { - tid = WME_AC_TO_TID(tap->txa_ac); + tid = tap->txa_tid; wn = (void *)tap->txa_ni; wn->agg[tid].bitmap = bitmap; wn->agg[tid].startidx = start; @@ -5585,7 +5585,7 @@ iwn_addba_response(struct ieee80211_node { struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; int qid = *(int *)tap->txa_private; - uint8_t tid = WME_AC_TO_TID(tap->txa_ac); + uint8_t tid = tap->txa_tid; int ret; if (code == IEEE80211_STATUS_SUCCESS) { @@ -5609,7 +5609,7 @@ static int iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni, uint8_t tid) { - struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[TID_TO_WME_AC(tid)]; + struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[tid]; struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; struct iwn_node *wn = (void *)ni; @@ -5642,7 +5642,7 @@ iwn_ampdu_tx_stop(struct ieee80211_node { struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc; struct iwn_ops *ops = &sc->ops; - uint8_t tid = WME_AC_TO_TID(tap->txa_ac); + uint8_t tid = tap->txa_tid; int qid; if (tap->txa_private == NULL) Modified: head/sys/dev/mwl/if_mwl.c ============================================================================== --- head/sys/dev/mwl/if_mwl.c Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/dev/mwl/if_mwl.c Sun Apr 15 20:29:39 2012 (r234324) @@ -3739,7 +3739,7 @@ mwl_addba_request(struct ieee80211_node /* NB: no held reference to ni */ sp = mwl_hal_bastream_alloc(MWL_VAP(vap)->mv_hvap, (baparamset & IEEE80211_BAPS_POLICY_IMMEDIATE) != 0, - ni->ni_macaddr, WME_AC_TO_TID(tap->txa_ac), ni->ni_htparam, + ni->ni_macaddr, tap->txa_tid, ni->ni_htparam, ni, tap); if (sp == NULL) { /* @@ -3776,8 +3776,8 @@ mwl_addba_response(struct ieee80211_node if (bas == NULL) { /* XXX should not happen */ DPRINTF(sc, MWL_DEBUG_AMPDU, - "%s: no BA stream allocated, AC %d\n", - __func__, tap->txa_ac); + "%s: no BA stream allocated, TID %d\n", + __func__, tap->txa_tid); sc->sc_stats.mst_addba_nostream++; return 0; } @@ -3805,18 +3805,18 @@ mwl_addba_response(struct ieee80211_node tap->txa_private = NULL; DPRINTF(sc, MWL_DEBUG_AMPDU, - "%s: create failed, error %d, bufsiz %d AC %d " + "%s: create failed, error %d, bufsiz %d TID %d " "htparam 0x%x\n", __func__, error, bufsiz, - tap->txa_ac, ni->ni_htparam); + tap->txa_tid, ni->ni_htparam); sc->sc_stats.mst_bacreate_failed++; return 0; } /* NB: cache txq to avoid ptr indirect */ - mwl_bastream_setup(bas, tap->txa_ac, bas->bastream->txq); + mwl_bastream_setup(bas, tap->txa_tid, bas->bastream->txq); DPRINTF(sc, MWL_DEBUG_AMPDU, - "%s: bastream %p assigned to txq %d AC %d bufsiz %d " + "%s: bastream %p assigned to txq %d TID %d bufsiz %d " "htparam 0x%x\n", __func__, bas->bastream, - bas->txq, tap->txa_ac, bufsiz, ni->ni_htparam); + bas->txq, tap->txa_tid, bufsiz, ni->ni_htparam); } else { /* * Other side NAK'd us; return the resources. Modified: head/sys/dev/mwl/if_mwlvar.h ============================================================================== --- head/sys/dev/mwl/if_mwlvar.h Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/dev/mwl/if_mwlvar.h Sun Apr 15 20:29:39 2012 (r234324) @@ -187,10 +187,10 @@ struct mwl_bastate { }; static __inline__ void -mwl_bastream_setup(struct mwl_bastate *bas, int ac, int txq) +mwl_bastream_setup(struct mwl_bastate *bas, int tid, int txq) { bas->txq = txq; - bas->qos = htole16(WME_AC_TO_TID(ac) | IEEE80211_QOS_ACKPOLICY_BA); + bas->qos = htole16(tid | IEEE80211_QOS_ACKPOLICY_BA); } static __inline__ void Modified: head/sys/net80211/ieee80211_ddb.c ============================================================================== --- head/sys/net80211/ieee80211_ddb.c Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/net80211/ieee80211_ddb.c Sun Apr 15 20:29:39 2012 (r234324) @@ -202,7 +202,7 @@ _db_show_txampdu(const char *sep, int ix { db_printf("%stxampdu[%d]: %p flags %b %s\n", sep, ix, tap, tap->txa_flags, IEEE80211_AGGR_BITS, - ieee80211_wme_acnames[tap->txa_ac]); + ieee80211_wme_acnames[TID_TO_WME_AC(tap->txa_tid)]); db_printf("%s token %u lastsample %d pkts %d avgpps %d qbytes %d qframes %d\n", sep, tap->txa_token, tap->txa_lastsample, tap->txa_pkts, tap->txa_avgpps, tap->txa_qbytes, tap->txa_qframes); @@ -293,7 +293,7 @@ _db_show_sta(const struct ieee80211_node ni->ni_htopmode, ni->ni_htstbc, ni->ni_chw); /* XXX ampdu state */ - for (i = 0; i < WME_NUM_AC; i++) + for (i = 0; i < WME_NUM_TID; i++) if (ni->ni_tx_ampdu[i].txa_flags & IEEE80211_AGGR_SETUP) _db_show_txampdu("\t", i, &ni->ni_tx_ampdu[i]); for (i = 0; i < WME_NUM_TID; i++) Modified: head/sys/net80211/ieee80211_ht.c ============================================================================== --- head/sys/net80211/ieee80211_ht.c Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/net80211/ieee80211_ht.c Sun Apr 15 20:29:39 2012 (r234324) @@ -1023,7 +1023,7 @@ void ieee80211_ht_node_init(struct ieee80211_node *ni) { struct ieee80211_tx_ampdu *tap; - int ac; + int tid; if (ni->ni_flags & IEEE80211_NODE_HT) { /* @@ -1033,9 +1033,9 @@ ieee80211_ht_node_init(struct ieee80211_ */ ieee80211_ht_node_cleanup(ni); } - for (ac = 0; ac < WME_NUM_AC; ac++) { - tap = &ni->ni_tx_ampdu[ac]; - tap->txa_ac = ac; + for (tid = 0; tid < WME_NUM_TID; tid++) { + tap = &ni->ni_tx_ampdu[tid]; + tap->txa_tid = tid; tap->txa_ni = ni; /* NB: further initialization deferred */ } @@ -1055,7 +1055,7 @@ ieee80211_ht_node_cleanup(struct ieee802 KASSERT(ni->ni_flags & IEEE80211_NODE_HT, ("not an HT node")); /* XXX optimize this */ - for (i = 0; i < WME_NUM_AC; i++) { + for (i = 0; i < WME_NUM_TID; i++) { struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[i]; if (tap->txa_flags & IEEE80211_AGGR_SETUP) ampdu_tx_stop(tap); @@ -1160,7 +1160,7 @@ ieee80211_ht_wds_init(struct ieee80211_n { struct ieee80211vap *vap = ni->ni_vap; struct ieee80211_tx_ampdu *tap; - int ac; + int tid; KASSERT(vap->iv_flags_ht & IEEE80211_FHT_HT, ("no HT requested")); @@ -1198,9 +1198,9 @@ ieee80211_ht_wds_init(struct ieee80211_n ni->ni_htopmode = 0; /* XXX need protection state */ ni->ni_htstbc = 0; /* XXX need info */ - for (ac = 0; ac < WME_NUM_AC; ac++) { - tap = &ni->ni_tx_ampdu[ac]; - tap->txa_ac = ac; + for (tid = 0; tid < WME_NUM_TID; tid++) { + tap = &ni->ni_tx_ampdu[tid]; + tap->txa_tid = tid; } /* NB: AMPDU tx/rx governed by IEEE80211_FHT_AMPDU_{TX,RX} */ ni->ni_flags |= IEEE80211_NODE_HT | IEEE80211_NODE_AMPDU; @@ -1685,7 +1685,8 @@ ampdu_tx_stop(struct ieee80211_tx_ampdu struct ieee80211com *ic = ni->ni_ic; KASSERT(tap->txa_flags & IEEE80211_AGGR_SETUP, - ("txa_flags 0x%x ac %d", tap->txa_flags, tap->txa_ac)); + ("txa_flags 0x%x tid %d ac %d", tap->txa_flags, tap->txa_tid, + TID_TO_WME_AC(tap->txa_tid))); /* * Stop BA stream if setup so driver has a chance @@ -1898,7 +1899,7 @@ ht_recv_action_ba_addba_response(struct struct ieee80211_tx_ampdu *tap; uint8_t dialogtoken, policy; uint16_t baparamset, batimeout, code; - int tid, ac, bufsiz; + int tid, bufsiz; dialogtoken = frm[2]; code = LE_READ_2(frm+3); @@ -1908,8 +1909,7 @@ ht_recv_action_ba_addba_response(struct policy = MS(baparamset, IEEE80211_BAPS_POLICY); batimeout = LE_READ_2(frm+7); - ac = TID_TO_WME_AC(tid); - tap = &ni->ni_tx_ampdu[ac]; + tap = &ni->ni_tx_ampdu[tid]; if ((tap->txa_flags & IEEE80211_AGGR_XCHGPEND) == 0) { IEEE80211_DISCARD_MAC(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, @@ -1972,7 +1972,7 @@ ht_recv_action_ba_delba(struct ieee80211 struct ieee80211_rx_ampdu *rap; struct ieee80211_tx_ampdu *tap; uint16_t baparamset, code; - int tid, ac; + int tid; baparamset = LE_READ_2(frm+2); code = LE_READ_2(frm+4); @@ -1985,8 +1985,7 @@ ht_recv_action_ba_delba(struct ieee80211 MS(baparamset, IEEE80211_DELBAPS_INIT), code); if ((baparamset & IEEE80211_DELBAPS_INIT) == 0) { - ac = TID_TO_WME_AC(tid); - tap = &ni->ni_tx_ampdu[ac]; + tap = &ni->ni_tx_ampdu[tid]; ic->ic_addba_stop(ni, tap); } else { rap = &ni->ni_rx_ampdu[tid]; @@ -2058,7 +2057,8 @@ ieee80211_ampdu_enable(struct ieee80211_ { struct ieee80211vap *vap = ni->ni_vap; - if (tap->txa_avgpps < vap->iv_ampdu_mintraffic[tap->txa_ac]) + if (tap->txa_avgpps < + vap->iv_ampdu_mintraffic[TID_TO_WME_AC(tap->txa_tid)]) return 0; /* XXX check rssi? */ if (tap->txa_attempts >= ieee80211_addba_maxtries && @@ -2071,8 +2071,9 @@ ieee80211_ampdu_enable(struct ieee80211_ return 0; } IEEE80211_NOTE(vap, IEEE80211_MSG_11N, ni, - "enable AMPDU on %s, avgpps %d pkts %d", - ieee80211_wme_acnames[tap->txa_ac], tap->txa_avgpps, tap->txa_pkts); + "enable AMPDU on tid %d (%s), avgpps %d pkts %d", + tap->txa_tid, ieee80211_wme_acnames[TID_TO_WME_AC(tap->txa_tid)], + tap->txa_avgpps, tap->txa_pkts); return 1; } @@ -2099,7 +2100,7 @@ ieee80211_ampdu_request(struct ieee80211 tap->txa_flags &= ~IEEE80211_AGGR_NAK; dialogtoken = (tokens+1) % 63; /* XXX */ - tid = WME_AC_TO_TID(tap->txa_ac); + tid = tap->txa_tid; tap->txa_start = ni->ni_txseqs[tid]; args[0] = dialogtoken; @@ -2113,8 +2114,8 @@ ieee80211_ampdu_request(struct ieee80211 if (!ic->ic_addba_request(ni, tap, dialogtoken, args[2], args[3])) { /* unable to setup state, don't make request */ IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, - ni, "%s: could not setup BA stream for AC %d", - __func__, tap->txa_ac); + ni, "%s: could not setup BA stream for TID %d AC %d", + __func__, tap->txa_tid, TID_TO_WME_AC(tap->txa_tid)); /* defer next try so we don't slam the driver with requests */ tap->txa_attempts = ieee80211_addba_maxtries; /* NB: check in case driver wants to override */ @@ -2147,20 +2148,20 @@ ieee80211_ampdu_stop(struct ieee80211_no tap->txa_flags &= ~IEEE80211_AGGR_BARPEND; if (IEEE80211_AMPDU_RUNNING(tap)) { IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, - ni, "%s: stop BA stream for AC %d (reason %d)", - __func__, tap->txa_ac, reason); + ni, "%s: stop BA stream for TID %d (reason %d)", + __func__, tap->txa_tid, reason); vap->iv_stats.is_ampdu_stop++; ic->ic_addba_stop(ni, tap); - args[0] = WME_AC_TO_TID(tap->txa_ac); + args[0] = tap->txa_tid; args[1] = IEEE80211_DELBAPS_INIT; args[2] = reason; /* XXX reason code */ ic->ic_send_action(ni, IEEE80211_ACTION_CAT_BA, IEEE80211_ACTION_BA_DELBA, args); } else { IEEE80211_NOTE(vap, IEEE80211_MSG_ACTION | IEEE80211_MSG_11N, - ni, "%s: BA stream for AC %d not running (reason %d)", - __func__, tap->txa_ac, reason); + ni, "%s: BA stream for TID %d not running (reason %d)", + __func__, tap->txa_tid, reason); vap->iv_stats.is_ampdu_stop_failed++; } } @@ -2176,7 +2177,7 @@ bar_timeout(void *arg) IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni, "%s: tid %u flags 0x%x attempts %d", __func__, - tap->txa_ac, tap->txa_flags, tap->txa_attempts); + tap->txa_tid, tap->txa_flags, tap->txa_attempts); /* guard against race with bar_tx_complete */ if ((tap->txa_flags & IEEE80211_AGGR_BARPEND) == 0) @@ -2210,7 +2211,7 @@ bar_tx_complete(struct ieee80211_node *n IEEE80211_NOTE(ni->ni_vap, IEEE80211_MSG_11N, ni, "%s: tid %u flags 0x%x pending %d status %d", - __func__, tap->txa_ac, tap->txa_flags, + __func__, tap->txa_tid, tap->txa_flags, callout_pending(&tap->txa_timer), status); ni->ni_vap->iv_stats.is_ampdu_bar_tx++; @@ -2237,7 +2238,7 @@ ieee80211_bar_response(struct ieee80211_ tap->txa_start, IEEE80211_SEQ_ADD(tap->txa_start, tap->txa_wnd-1), tap->txa_qframes, tap->txa_seqpending, - WME_AC_TO_TID(tap->txa_ac)); + tap->txa_tid); /* NB: timer already stopped in bar_tx_complete */ tap->txa_start = tap->txa_seqpending; @@ -2292,7 +2293,7 @@ ieee80211_send_bar(struct ieee80211_node IEEE80211_ADDR_COPY(bar->i_ra, ni->ni_macaddr); IEEE80211_ADDR_COPY(bar->i_ta, vap->iv_myaddr); - tid = WME_AC_TO_TID(tap->txa_ac); + tid = tap->txa_tid; barctl = (tap->txa_flags & IEEE80211_AGGR_IMMEDIATE ? 0 : IEEE80211_BAR_NOACK) | IEEE80211_BAR_COMP Modified: head/sys/net80211/ieee80211_ht.h ============================================================================== --- head/sys/net80211/ieee80211_ht.h Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/net80211/ieee80211_ht.h Sun Apr 15 20:29:39 2012 (r234324) @@ -44,7 +44,7 @@ struct ieee80211_tx_ampdu { #define IEEE80211_AGGR_SETUP 0x0008 /* deferred state setup */ #define IEEE80211_AGGR_NAK 0x0010 /* peer NAK'd ADDBA request */ #define IEEE80211_AGGR_BARPEND 0x0020 /* BAR response pending */ - uint8_t txa_ac; + uint8_t txa_tid; uint8_t txa_token; /* dialog token */ int txa_lastsample; /* ticks @ last traffic sample */ int txa_pkts; /* packets over last sample interval */ Modified: head/sys/net80211/ieee80211_node.h ============================================================================== --- head/sys/net80211/ieee80211_node.h Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/net80211/ieee80211_node.h Sun Apr 15 20:29:39 2012 (r234324) @@ -214,7 +214,7 @@ struct ieee80211_node { uint8_t ni_htstbc; /* HT */ uint8_t ni_chw; /* negotiated channel width */ struct ieee80211_htrateset ni_htrates; /* negotiated ht rate set */ - struct ieee80211_tx_ampdu ni_tx_ampdu[WME_NUM_AC]; + struct ieee80211_tx_ampdu ni_tx_ampdu[WME_NUM_TID]; struct ieee80211_rx_ampdu ni_rx_ampdu[WME_NUM_TID]; /* others */ Modified: head/sys/net80211/ieee80211_output.c ============================================================================== --- head/sys/net80211/ieee80211_output.c Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/net80211/ieee80211_output.c Sun Apr 15 20:29:39 2012 (r234324) @@ -323,8 +323,8 @@ ieee80211_start(struct ifnet *ifp) if ((ni->ni_flags & IEEE80211_NODE_AMPDU_TX) && (vap->iv_flags_ht & IEEE80211_FHT_AMPDU_TX) && (m->m_flags & M_EAPOL) == 0) { - const int ac = M_WME_GETAC(m); - struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[ac]; + int tid = WME_AC_TO_TID(M_WME_GETAC(m)); + struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[tid]; ieee80211_txampdu_count_packet(tap); if (IEEE80211_AMPDU_RUNNING(tap)) { @@ -589,7 +589,7 @@ ieee80211_send_setup( } *(uint16_t *)&wh->i_dur[0] = 0; - tap = &ni->ni_tx_ampdu[TID_TO_WME_AC(tid)]; + tap = &ni->ni_tx_ampdu[tid]; if (tid != IEEE80211_NONQOS_TID && IEEE80211_AMPDU_RUNNING(tap)) m->m_flags |= M_AMPDU_MPDU; else { Modified: head/sys/net80211/ieee80211_superg.c ============================================================================== --- head/sys/net80211/ieee80211_superg.c Sun Apr 15 19:54:22 2012 (r234323) +++ head/sys/net80211/ieee80211_superg.c Sun Apr 15 20:29:39 2012 (r234324) @@ -562,9 +562,11 @@ ieee80211_ff_age(struct ieee80211com *ic IEEE80211_LOCK(ic); head = sq->head; 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 */ ni = (struct ieee80211_node *) m->m_pkthdr.rcvif; - tap = &ni->ni_tx_ampdu[M_WME_GETAC(m)]; + tap = &ni->ni_tx_ampdu[tid]; KASSERT(tap->txa_private == m, ("staging queue empty")); tap->txa_private = NULL; @@ -670,7 +672,7 @@ ieee80211_ff_check(struct ieee80211_node * be aggregated with other types of frames when encryption is on? */ IEEE80211_LOCK(ic); - tap = &ni->ni_tx_ampdu[pri]; + tap = &ni->ni_tx_ampdu[WME_AC_TO_TID(pri)]; mstaged = tap->txa_private; /* NB: we reuse AMPDU state */ ieee80211_txampdu_count_packet(tap); @@ -783,12 +785,14 @@ ieee80211_ff_node_cleanup(struct ieee802 struct ieee80211_superg *sg = ic->ic_superg; struct ieee80211_tx_ampdu *tap; struct mbuf *m, *head; - int ac; + int tid; IEEE80211_LOCK(ic); head = NULL; - for (ac = 0; ac < WME_NUM_AC; ac++) { - tap = &ni->ni_tx_ampdu[ac]; + 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; if (m != NULL) { tap->txa_private = NULL;