From 964649e3d3633acb73c6a982543b962d9ed87df3 Mon Sep 17 00:00:00 2001 From: Alexander Egorenkov Date: Sun, 21 Mar 2010 14:49:44 +0100 Subject: [PATCH] Hook ic_addba_response and ic_addba_stop functions in order to be able to count active A-MPDU Tx sessions properly; Use ieee80211_anyhdrsize/ieee80211_anyhdrspace instead of ieee80211_hdrsize/ieee80211_hdrspace because of control frames (e.g. BAR); Added send BAR function; Added A-MPDU Rx session counter --- rt2870.c | 461 ++++++++++++++++++++++++++++++++++++++++++--------------- rt2870_softc.h | 8 + 2 files changed, 351 insertions(+), 118 deletions(-) diff --git a/rt2870.c b/rt2870.c index 3ac29f9..a561226 100644 --- a/rt2870.c +++ b/rt2870.c @@ -59,8 +59,6 @@ #define RT2870_NOISE_FLOOR -95 -#define RT2870_AID2WCID(aid) ((aid) & 0xff) - #define RT2870_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22) #define RT2870_ACK_SIZE 14 @@ -185,6 +183,16 @@ static void rt2870_recv_action(struct ieee80211_node *ni, static int rt2870_send_action(struct ieee80211_node *ni, int category, int action, uint16_t args[4]); +static int rt2870_addba_response(struct ieee80211_node *ni, + struct ieee80211_tx_ampdu *tap, + int status, int baparamset, int batimeout); + +static void rt2870_addba_stop(struct ieee80211_node *ni, + struct ieee80211_tx_ampdu *tap); + +static int rt2870_send_bar(struct ieee80211_node *ni, + struct ieee80211_tx_ampdu *tap, ieee80211_seq seqno); + static void rt2870_amrr_update_iter_func(void *arg, struct ieee80211_node *ni); static void rt2870_periodic(void *arg); @@ -257,6 +265,12 @@ static void rt2870_asic_update_beacon(struct rt2870_softc *sc); static void rt2870_asic_clear_keytables(struct rt2870_softc *sc); +static void rt2870_asic_add_ba_session(struct rt2870_softc *sc, + uint8_t wcid, int tid); + +static void rt2870_asic_del_ba_session(struct rt2870_softc *sc, + uint8_t wcid, int tid); + static int rt2870_beacon_alloc(struct rt2870_softc *sc); static uint8_t rt2870_rxrate(struct rt2870_rxwi *rxwi); @@ -690,6 +704,12 @@ static int rt2870_attach(device_t dev) sc->send_action = ic->ic_send_action; ic->ic_send_action = rt2870_send_action; + sc->addba_response = ic->ic_addba_response; + ic->ic_addba_response = rt2870_addba_response; + + sc->addba_stop = ic->ic_addba_stop; + ic->ic_addba_stop = rt2870_addba_stop; + /* override Rx A-MPDU factor */ ic->ic_ampdu_rxmax = IEEE80211_HTCAP_MAXRXAMPDU_32K; @@ -702,6 +722,8 @@ static int rt2870_attach(device_t dev) ic->ic_flags_ext |= IEEE80211_FEXT_SWBMISS; + ic->ic_max_aid = RT2870_SOFTC_STAID_COUNT; + rt2870_amrr_init(&sc->amrr, ic, sc->ntxpath, RT2870_AMRR_MIN_SUCCESS_THRESHOLD, @@ -2176,8 +2198,10 @@ static void rt2870_node_cleanup(struct ieee80211_node *ni) struct rt2870_softc *sc; struct ieee80211com *ic; struct ifnet *ifp; + struct ieee80211_rx_ampdu *rx_ampdu; struct rt2870_softc_node *rni; struct rt2870_cmd_argv_nodecleanup cmd_argv; + int i; ic = ni->ni_ic; ifp = ic->ic_ifp; @@ -2195,6 +2219,20 @@ static void rt2870_node_cleanup(struct ieee80211_node *ni) rni->staid = 0; + for (i = 0; i < WME_NUM_TID; i++) + { + rx_ampdu = &ni->ni_rx_ampdu[i]; + + if (rx_ampdu->rxa_flags & IEEE80211_AGGR_XCHGPEND) + { + if (sc->rx_ampdu_sessions > 0) + sc->rx_ampdu_sessions--; + else + printf("%s: number of A-MPDU Rx sessions cannot be negative\n", + device_get_nameunit(sc->dev)); + } + } + rt2870_do_async(sc, rt2870_node_cleanup_cb, &cmd_argv, sizeof(struct rt2870_cmd_argv_nodecleanup)); } @@ -2211,152 +2249,309 @@ static void rt2870_recv_action(struct ieee80211_node *ni, struct rt2870_softc *sc; struct ieee80211com *ic; struct ifnet *ifp; + struct ieee80211_rx_ampdu *rx_ampdu; + struct rt2870_softc_node *rni; const struct ieee80211_action *ia; - struct ieee80211_tx_ampdu *tx_ampdu; - uint16_t associd, status, baparamset; + uint16_t baparamset; + int tid; uint8_t wcid; - int tid, bufsize, ac; - uint32_t tmp; ic = ni->ni_ic; ifp = ic->ic_ifp; sc = ifp->if_softc; + rni = (struct rt2870_softc_node *) ni; ia = (const struct ieee80211_action *) frm; + if (ia->ia_category == IEEE80211_ACTION_CAT_BA) + { + switch (ia->ia_action) + { + /* IEEE80211_ACTION_BA_DELBA */ + case IEEE80211_ACTION_BA_DELBA: + baparamset = LE_READ_2(frm + 2); + tid = RT2870_MS(baparamset, IEEE80211_BAPS_TID); + rx_ampdu = &ni->ni_rx_ampdu[tid]; + wcid = rni->staid; + + RT2870_DPRINTF(sc, RT2870_DEBUG_BA, + "%s: received DELBA request: associd=0x%04x, staid=0x%02x, tid=%d\n", + device_get_nameunit(sc->dev), ni->ni_associd, rni->staid, tid); + + if (rni->staid != 0) + { + rt2870_asic_del_ba_session(sc, wcid, tid); + + if (rx_ampdu->rxa_flags & IEEE80211_AGGR_XCHGPEND) + { + if (sc->rx_ampdu_sessions > 0) + sc->rx_ampdu_sessions--; + else + printf("%s: number of A-MPDU Rx sessions cannot be negative\n", + device_get_nameunit(sc->dev)); + } + } + break; + } + } + sc->recv_action(ni, frm, efrm); +} - if (ia->ia_category != IEEE80211_ACTION_CAT_BA) - return; +/* + * rt2870_send_action + */ +static int rt2870_send_action(struct ieee80211_node *ni, + int category, int action, uint16_t args[4]) +{ + struct rt2870_softc *sc; + struct ieee80211com *ic; + struct ifnet *ifp; + struct ieee80211_rx_ampdu *rx_ampdu; + struct rt2870_softc_node *rni; + uint16_t status, baparamset; + uint8_t wcid; + int tid, bufsize; + + ic = ni->ni_ic; + ifp = ic->ic_ifp; + sc = ifp->if_softc; + rni = (struct rt2870_softc_node *) ni; - associd = (ni != NULL) ? ni->ni_associd : 0; - wcid = RT2870_AID2WCID(associd); + wcid = rni->staid; - switch (ia->ia_action) + if (category == IEEE80211_ACTION_CAT_BA) { - /* IEEE80211_ACTION_BA_ADDBA_REQUEST */ - case IEEE80211_ACTION_BA_ADDBA_REQUEST: - baparamset = LE_READ_2(frm + 3); - tid = RT2870_MS(baparamset, IEEE80211_BAPS_TID); - bufsize = RT2870_MS(baparamset, IEEE80211_BAPS_BUFSIZ); + switch (action) + { + /* IEEE80211_ACTION_BA_ADDBA_RESPONSE */ + case IEEE80211_ACTION_BA_ADDBA_RESPONSE: + status = args[1]; + baparamset = args[2]; + tid = RT2870_MS(baparamset, IEEE80211_BAPS_TID); + bufsize = RT2870_MS(baparamset, IEEE80211_BAPS_BUFSIZ); + rx_ampdu = &ni->ni_rx_ampdu[tid]; + + RT2870_DPRINTF(sc, RT2870_DEBUG_BA, + "%s: sending ADDBA response: associd=0x%04x, staid=0x%02x, status=%d, tid=%d, bufsize=%d\n", + device_get_nameunit(sc->dev), ni->ni_associd, rni->staid, status, tid, bufsize); + + if (status == IEEE80211_STATUS_SUCCESS) + { + rt2870_asic_add_ba_session(sc, wcid, tid); - RT2870_DPRINTF(sc, RT2870_DEBUG_BA, - "%s: received ADDBA request: associd=0x%04x, tid=%d, bufsize=%d\n", - device_get_nameunit(sc->dev), associd, tid, bufsize); + sc->rx_ampdu_sessions++; + } + break; - tmp = rt2870_io_mac_read(sc, RT2870_REG_WCID(wcid) + 4); + /* IEEE80211_ACTION_BA_DELBA */ + case IEEE80211_ACTION_BA_DELBA: + baparamset = RT2870_SM(args[0], IEEE80211_DELBAPS_TID) | args[1]; + tid = RT2870_MS(baparamset, IEEE80211_DELBAPS_TID); + rx_ampdu = &ni->ni_rx_ampdu[tid]; - tmp |= (0x10000 << tid); + RT2870_DPRINTF(sc, RT2870_DEBUG_BA, + "%s: sending DELBA request: associd=0x%04x, staid=0x%02x, tid=%d\n", + device_get_nameunit(sc->dev), ni->ni_associd, rni->staid, tid); - rt2870_io_mac_write(sc, RT2870_REG_WCID(wcid) + 4, tmp); - break; + if (RT2870_MS(baparamset, IEEE80211_DELBAPS_INIT) != IEEE80211_DELBAPS_INIT) + { + rt2870_asic_del_ba_session(sc, wcid, tid); + + if (rx_ampdu->rxa_flags & IEEE80211_AGGR_XCHGPEND) + { + if (sc->rx_ampdu_sessions > 0) + sc->rx_ampdu_sessions--; + else + printf("%s: number of A-MPDU Rx sessions cannot be negative\n", + device_get_nameunit(sc->dev)); + } + } + break; + } + } - /* IEEE80211_ACTION_BA_ADDBA_RESPONSE */ - case IEEE80211_ACTION_BA_ADDBA_RESPONSE: - status = LE_READ_2(frm + 3); - baparamset = LE_READ_2(frm + 4); - tid = RT2870_MS(baparamset, IEEE80211_BAPS_TID); - bufsize = RT2870_MS(baparamset, IEEE80211_BAPS_BUFSIZ); - ac = TID_TO_WME_AC(tid); - tx_ampdu = &ni->ni_tx_ampdu[ac]; + return sc->send_action(ni, category, action, args); +} - RT2870_DPRINTF(sc, RT2870_DEBUG_BA, - "%s: received ADDBA response: associd=0x%04x, status=%d, tid=%d, bufsize=%d\n", - device_get_nameunit(sc->dev), associd, status, tid, bufsize); +/* + * rt2870_addba_response + */ +static int rt2870_addba_response(struct ieee80211_node *ni, + struct ieee80211_tx_ampdu *tap, + int status, int baparamset, int batimeout) +{ + struct rt2870_softc *sc; + struct ieee80211com *ic; + struct ifnet *ifp; + struct rt2870_softc_node *rni; + ieee80211_seq seqno; + int ret, tid, old_bufsize, new_bufsize; - if (sc->mac_rev >= 0x28720200) - { - if (tx_ampdu->txa_wnd > 13) - tx_ampdu->txa_wnd = 13; - } + ic = ni->ni_ic; + ifp = ic->ic_ifp; + sc = ifp->if_softc; + rni = (struct rt2870_softc_node *) ni; + + tid = RT2870_MS(baparamset, IEEE80211_BAPS_TID); + old_bufsize = RT2870_MS(baparamset, IEEE80211_BAPS_BUFSIZ); + new_bufsize = old_bufsize; + + if (status == IEEE80211_STATUS_SUCCESS) + { + if (sc->mac_rev >= 0x28830300) + { + if (sc->mac_rev >= 0x30700200) + new_bufsize = 13; else - { - if (tx_ampdu->txa_wnd > 7) - tx_ampdu->txa_wnd = 7; - } + new_bufsize = 31; + } + else if (sc->mac_rev >= 0x28720200) + { + new_bufsize = 13; + } + else + { + new_bufsize = 7; + } - if (status == IEEE80211_STATUS_SUCCESS) - { - sc->tx_ampdu_sessions++; + if (old_bufsize > new_bufsize) + { + baparamset &= ~IEEE80211_BAPS_BUFSIZ; + baparamset = RT2870_SM(new_bufsize, IEEE80211_BAPS_BUFSIZ); + } + + if (!(tap->txa_flags & IEEE80211_AGGR_RUNNING)) + { + sc->tx_ampdu_sessions++; + if (sc->tx_ampdu_sessions == 1) rt2870_asic_updateprot(sc); - } - break; + } + } - /* IEEE80211_ACTION_BA_DELBA */ - case IEEE80211_ACTION_BA_DELBA: - baparamset = LE_READ_2(frm + 2); - tid = RT2870_MS(baparamset, IEEE80211_BAPS_TID); + RT2870_DPRINTF(sc, RT2870_DEBUG_BA, + "%s: received ADDBA response: associd=0x%04x, staid=0x%02x, status=%d, tid=%d, " + "old bufsize=%d, new bufsize=%d\n", + device_get_nameunit(sc->dev), ni->ni_associd, rni->staid, status, tid, + old_bufsize, new_bufsize); - RT2870_DPRINTF(sc, RT2870_DEBUG_BA, - "%s: received DELBA request: associd=0x%04x, tid=%d\n", - device_get_nameunit(sc->dev), associd, tid); + ret = sc->addba_response(ni, tap, status, baparamset, batimeout); - tmp = rt2870_io_mac_read(sc, RT2870_REG_WCID(wcid) + 4); + if (status == IEEE80211_STATUS_SUCCESS) + { + seqno = ni->ni_txseqs[tid]; - tmp &= ~(0x10000 << tid); + rt2870_send_bar(ni, tap, seqno); + } - rt2870_io_mac_write(sc, RT2870_REG_WCID(wcid) + 4, tmp); - break; + return ret; +} + +/* + * rt2870_addba_stop + */ +static void rt2870_addba_stop(struct ieee80211_node *ni, + struct ieee80211_tx_ampdu *tap) +{ + struct rt2870_softc *sc; + struct ieee80211com *ic; + struct ifnet *ifp; + struct rt2870_softc_node *rni; + int tid; + + ic = ni->ni_ic; + ifp = ic->ic_ifp; + sc = ifp->if_softc; + rni = (struct rt2870_softc_node *) ni; + + tid = WME_AC_TO_TID(tap->txa_ac); + + RT2870_DPRINTF(sc, RT2870_DEBUG_BA, + "%s: stopping A-MPDU Tx: associd=0x%04x, staid=0x%02x, tid=%d\n", + device_get_nameunit(sc->dev), ni->ni_associd, rni->staid, tid); + + if (tap->txa_flags & IEEE80211_AGGR_RUNNING) + { + if (sc->tx_ampdu_sessions > 0) + { + sc->tx_ampdu_sessions--; + + if (sc->tx_ampdu_sessions == 0) + rt2870_asic_updateprot(sc); + } + else + { + printf("%s: number of A-MPDU Tx sessions cannot be negative\n", + device_get_nameunit(sc->dev)); + } } + + sc->addba_stop(ni, tap); } /* - * rt2870_send_action + * rt2870_send_bar */ -static int rt2870_send_action(struct ieee80211_node *ni, - int category, int action, uint16_t args[4]) +static int rt2870_send_bar(struct ieee80211_node *ni, + struct ieee80211_tx_ampdu *tap, ieee80211_seq seqno) { struct rt2870_softc *sc; struct ieee80211com *ic; struct ifnet *ifp; - uint16_t associd, baparamset; - uint8_t wcid; - int ret, tid; - uint32_t tmp; + struct ieee80211_frame_bar *bar; + struct rt2870_softc_node *rni; + struct mbuf *m; + uint16_t barctl, barseqctl; + uint8_t *frm; + int tid; ic = ni->ni_ic; ifp = ic->ic_ifp; sc = ifp->if_softc; + rni = (struct rt2870_softc_node *) ni; - ret = sc->send_action(ni, category, action, args); + if (!(tap->txa_flags & IEEE80211_AGGR_RUNNING)) + return EINVAL; - if (category != IEEE80211_ACTION_CAT_BA) - return ret; + m = ieee80211_getmgtframe(&frm, ic->ic_headroom, sizeof(struct ieee80211_frame_bar)); + if (m == NULL) + return ENOMEM; - associd = (ni != NULL) ? ni->ni_associd : 0; - wcid = RT2870_AID2WCID(associd); + bar = mtod(m, struct ieee80211_frame_bar *); - switch (action) - { - /* IEEE80211_ACTION_BA_DELBA */ - case IEEE80211_ACTION_BA_DELBA: - baparamset = RT2870_SM(args[0], IEEE80211_DELBAPS_TID) | args[1]; + bar->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL | IEEE80211_FC0_SUBTYPE_BAR; + bar->i_fc[1] = 0; - tid = RT2870_MS(baparamset, IEEE80211_DELBAPS_TID); + IEEE80211_ADDR_COPY(bar->i_ra, ni->ni_macaddr); + IEEE80211_ADDR_COPY(bar->i_ta, ic->ic_myaddr); - RT2870_DPRINTF(sc, RT2870_DEBUG_BA, - "%s: sending DELBA request: associd=0x%04x, tid=%d\n", - device_get_nameunit(sc->dev), associd, tid); + tid = WME_AC_TO_TID(tap->txa_ac); - if (RT2870_MS(baparamset, IEEE80211_DELBAPS_INIT) != IEEE80211_DELBAPS_INIT) - { - tmp = rt2870_io_mac_read(sc, RT2870_REG_WCID(wcid) + 4); + barctl = (tap->txa_flags & IEEE80211_AGGR_IMMEDIATE ? 0 : IEEE80211_BAR_NOACK) | + IEEE80211_BAR_COMP | + RT2870_SM(tid, IEEE80211_BAR_TID); + barseqctl = RT2870_SM(seqno, IEEE80211_BASEQ_START); - tmp &= ~(0x10000 << tid); + bar->i_ctl = htole16(barctl); + bar->i_seq = htole16(barseqctl); - rt2870_io_mac_write(sc, RT2870_REG_WCID(wcid) + 4, tmp); - } - else - { - sc->tx_ampdu_sessions--; + m->m_pkthdr.len = m->m_len = sizeof(struct ieee80211_frame_bar); + m->m_pkthdr.rcvif = (void *) ni; - rt2870_asic_updateprot(sc); - } - break; - } + tap->txa_start = seqno; - return ret; + ieee80211_ref_node(ni); + + RT2870_DPRINTF(sc, RT2870_DEBUG_BA, + "%s: sending BAR: associd=0x%04x, staid=0x%02x, tid=%d, seqno=%d\n", + device_get_nameunit(sc->dev), ni->ni_associd, rni->staid, tid, seqno); + + IF_ENQUEUE(&ic->ic_mgtq, m); + + if_start(ifp); + + return 0; } /* @@ -2366,29 +2561,31 @@ static void rt2870_amrr_update_iter_func(void *arg, struct ieee80211_node *ni) { struct rt2870_softc *sc; struct ieee80211com *ic; + struct rt2870_softc_node *rni; uint8_t wcid; sc = arg; ic = &sc->ic; + rni = (struct rt2870_softc_node *) ni; /* only associated stations */ - if (ni->ni_associd != 0) + if (rni->staid != 0) { - wcid = RT2870_AID2WCID(ni->ni_associd); + wcid = rni->staid; RT2870_DPRINTF(sc, RT2870_DEBUG_RATE, - "%s: AMRR node: wcid=0x%02x, txcnt=%d, success=%d, retrycnt=%d\n", + "%s: AMRR node: staid=0x%02x, txcnt=%d, success=%d, retrycnt=%d\n", device_get_nameunit(sc->dev), - wcid, sc->amrr_node[wcid].txcnt, sc->amrr_node[wcid].success, sc->amrr_node[wcid].retrycnt); + rni->staid, sc->amrr_node[wcid].txcnt, sc->amrr_node[wcid].success, sc->amrr_node[wcid].retrycnt); rt2870_amrr_choose(ni, &sc->amrr_node[wcid]); RT2870_DPRINTF(sc, RT2870_DEBUG_RATE, - "%s:%s node Tx rate: associd=0x%04x, rate=0x%02x, max rate=0x%02x\n", + "%s:%s node Tx rate: associd=0x%04x, staid=0x%02x, rate=0x%02x, max rate=0x%02x\n", device_get_nameunit(sc->dev), (ni->ni_flags & IEEE80211_NODE_HT) ? " HT" : "", - ni->ni_associd, + ni->ni_associd, rni->staid, (ni->ni_flags & IEEE80211_NODE_HT) ? (ni->ni_htrates.rs_rates[ni->ni_txrate] | IEEE80211_RATE_MCS) : (ni->ni_rates.rs_rates[ni->ni_txrate] & IEEE80211_RATE_VAL), @@ -3739,6 +3936,36 @@ static void rt2870_asic_clear_keytables(struct rt2870_softc *sc) } /* + * rt2870_asic_add_ba_session + */ +static void rt2870_asic_add_ba_session(struct rt2870_softc *sc, + uint8_t wcid, int tid) +{ + uint32_t tmp; + + tmp = rt2870_io_mac_read(sc, RT2870_REG_WCID(wcid) + 4); + + tmp |= (0x10000 << tid); + + rt2870_io_mac_write(sc, RT2870_REG_WCID(wcid) + 4, tmp); +} + +/* + * rt2860_asic_del_ba_session + */ +static void rt2870_asic_del_ba_session(struct rt2870_softc *sc, + uint8_t wcid, int tid) +{ + uint32_t tmp; + + tmp = rt2870_io_mac_read(sc, RT2870_REG_WCID(wcid) + 4); + + tmp &= ~(0x10000 << tid); + + rt2870_io_mac_write(sc, RT2870_REG_WCID(wcid) + 4, tmp); +} + +/* * rt2870_beacon_alloc */ static int rt2870_beacon_alloc(struct rt2870_softc *sc) @@ -4249,6 +4476,7 @@ static int rt2870_tx_frame(struct rt2870_softc *sc, struct mbuf *m, struct ieee80211_node *ni, int qid) { struct ieee80211com *ic; + struct rt2870_softc_node *rni; struct rt2870_softc_tx_ring *ring; struct rt2870_softc_tx_data *data; struct rt2870_txinfo *txinfo; @@ -4262,6 +4490,7 @@ static int rt2870_tx_frame(struct rt2870_softc *sc, int hasqos, ac, ampdu, mimops, ackrate; ic = &sc->ic; + rni = (struct rt2870_softc_node *) ni; ring = &sc->tx_ring[qid]; data = STAILQ_FIRST(&ring->inactive); @@ -4330,13 +4559,15 @@ static int rt2870_tx_frame(struct rt2870_softc *sc, else mcs = rt2870_rate2mcs(rate); - wcid = (type == IEEE80211_FC0_TYPE_DATA) ? - RT2870_AID2WCID(ni->ni_associd) : 0xff; + if (type == IEEE80211_FC0_TYPE_DATA) + wcid = !IEEE80211_IS_MULTICAST(wh->i_addr1) ? rni->staid : RT2870_WCID_MCAST; + else + wcid = RT2870_WCID_RESERVED; /* calculate MPDU length without padding */ - hdrsize = ieee80211_hdrsize(wh); - hdrspace = ieee80211_hdrspace(ic, wh); + hdrsize = ieee80211_anyhdrsize(wh); + hdrspace = ieee80211_anyhdrspace(ic, wh); mpdu_len = m->m_pkthdr.len - hdrspace + hdrsize; memset(txwi, 0, sizeof(struct rt2870_txwi)); @@ -5026,11 +5257,8 @@ static void rt2870_update_stats(struct rt2870_softc *sc) { struct ifnet *ifp; struct ieee80211com *ic; - struct ieee80211_node *ni; uint32_t stacnt[3]; int beacons, noretryok, retryok, failed, underflows, zerolen; - uint16_t associd; - uint8_t wcid; ifp = sc->ifp; ic = &sc->ic; @@ -5070,17 +5298,6 @@ static void rt2870_update_stats(struct rt2870_softc *sc) sc->tx_failed += failed; sc->tx_underflows += underflows; sc->tx_zerolen += zerolen; - - if (ic->ic_opmode == IEEE80211_M_STA && ic->ic_state == IEEE80211_S_RUN) - { - ni = ic->ic_bss; - - associd = (ni != NULL) ? ni->ni_associd : 0; - wcid = RT2870_AID2WCID(associd); - - rt2870_amrr_tx_update(&sc->amrr_node[wcid], - noretryok + retryok + failed, noretryok + retryok, retryok + failed); - } } /* @@ -5692,6 +5909,10 @@ static void rt2870_sysctl_attach(struct rt2870_softc *sc) "Tx MPDU with zero density"); SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, + "tx_ampdu_sessions", CTLFLAG_RD, &sc->tx_ampdu_sessions, 0, + "Tx A-MPDU sessions"); + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, "rx_packets", CTLFLAG_RD, &sc->rx_packets, 0, "Rx packets"); @@ -5704,6 +5925,10 @@ static void rt2870_sysctl_attach(struct rt2870_softc *sc) "Rx MPDU with zero density"); SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, + "rx_ampdu_sessions", CTLFLAG_RD, &sc->rx_ampdu_sessions, 0, + "Rx A-MPDU sessions"); + + SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(stats), OID_AUTO, "rx_amsdu", CTLFLAG_RD, &sc->rx_amsdu, 0, "Rx A-MSDU"); diff --git a/rt2870_softc.h b/rt2870_softc.h index fd215ee..ccd45d7 100644 --- a/rt2870_softc.h +++ b/rt2870_softc.h @@ -234,6 +234,13 @@ struct rt2870_softc int (*send_action)(struct ieee80211_node *ni, int category, int action, uint16_t args[4]); + int (*addba_response)(struct ieee80211_node *ni, + struct ieee80211_tx_ampdu *tap, + int status, int baparamset, int batimeout); + + void (*addba_stop)(struct ieee80211_node *ni, + struct ieee80211_tx_ampdu *tap); + uint32_t mac_rev; uint16_t eeprom_rev; uint8_t rf_rev; @@ -363,6 +370,7 @@ struct rt2870_softc unsigned long rx_packets; unsigned long rx_ampdu; unsigned long rx_mpdu_zero_density; + unsigned long rx_ampdu_sessions; unsigned long rx_amsdu; unsigned long rx_crc_errors; unsigned long rx_phy_errors; -- 2.11.4.GIT