|
@@ -125,13 +125,13 @@ static int ath_tx_findindex(const struct ath9k_rate_table *rt, int rate)
|
|
|
|
|
|
/* Check if it's okay to send out aggregates */
|
|
/* Check if it's okay to send out aggregates */
|
|
|
|
|
|
-static int ath_aggr_query(struct ath_softc *sc,
|
|
|
|
- struct ath_node *an, u8 tidno)
|
|
|
|
|
|
+static int ath_aggr_query(struct ath_softc *sc, struct ath_node *an, u8 tidno)
|
|
{
|
|
{
|
|
struct ath_atx_tid *tid;
|
|
struct ath_atx_tid *tid;
|
|
tid = ATH_AN_2_TID(an, tidno);
|
|
tid = ATH_AN_2_TID(an, tidno);
|
|
|
|
|
|
- if (tid->addba_exchangecomplete || tid->addba_exchangeinprogress)
|
|
|
|
|
|
+ if (tid->state & AGGR_ADDBA_COMPLETE ||
|
|
|
|
+ tid->state & AGGR_ADDBA_PROGRESS)
|
|
return 1;
|
|
return 1;
|
|
else
|
|
else
|
|
return 0;
|
|
return 0;
|
|
@@ -886,7 +886,7 @@ static void ath_tx_complete_aggr_rifs(struct ath_softc *sc,
|
|
/* transmit completion */
|
|
/* transmit completion */
|
|
} else {
|
|
} else {
|
|
|
|
|
|
- if (!tid->cleanup_inprogress &&
|
|
|
|
|
|
+ if (!(tid->state & AGGR_CLEANUP) &&
|
|
ds->ds_txstat.ts_flags != ATH9K_TX_SW_ABORTED) {
|
|
ds->ds_txstat.ts_flags != ATH9K_TX_SW_ABORTED) {
|
|
if (bf->bf_retries < ATH_MAX_SW_RETRIES) {
|
|
if (bf->bf_retries < ATH_MAX_SW_RETRIES) {
|
|
ath_tx_set_retry(sc, bf);
|
|
ath_tx_set_retry(sc, bf);
|
|
@@ -1014,16 +1014,16 @@ static void ath_tx_complete_aggr_rifs(struct ath_softc *sc,
|
|
bf = bf_next;
|
|
bf = bf_next;
|
|
}
|
|
}
|
|
|
|
|
|
- if (tid->cleanup_inprogress) {
|
|
|
|
|
|
+ if (tid->state & AGGR_CLEANUP) {
|
|
/* check to see if we're done with cleaning the h/w queue */
|
|
/* check to see if we're done with cleaning the h/w queue */
|
|
spin_lock_bh(&txq->axq_lock);
|
|
spin_lock_bh(&txq->axq_lock);
|
|
|
|
|
|
if (tid->baw_head == tid->baw_tail) {
|
|
if (tid->baw_head == tid->baw_tail) {
|
|
- tid->addba_exchangecomplete = 0;
|
|
|
|
|
|
+ tid->state &= ~AGGR_ADDBA_COMPLETE;
|
|
tid->addba_exchangeattempts = 0;
|
|
tid->addba_exchangeattempts = 0;
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
|
|
|
|
- tid->cleanup_inprogress = false;
|
|
|
|
|
|
+ tid->state &= ~AGGR_CLEANUP;
|
|
|
|
|
|
/* send buffered frames as singles */
|
|
/* send buffered frames as singles */
|
|
ath_tx_flush_tid(sc, tid);
|
|
ath_tx_flush_tid(sc, tid);
|
|
@@ -2335,17 +2335,8 @@ enum ATH_AGGR_CHECK ath_tx_aggr_check(struct ath_softc *sc,
|
|
/* ADDBA exchange must be completed before sending aggregates */
|
|
/* ADDBA exchange must be completed before sending aggregates */
|
|
txtid = ATH_AN_2_TID(an, tidno);
|
|
txtid = ATH_AN_2_TID(an, tidno);
|
|
|
|
|
|
- if (txtid->addba_exchangecomplete)
|
|
|
|
- return AGGR_EXCHANGE_DONE;
|
|
|
|
-
|
|
|
|
- if (txtid->cleanup_inprogress)
|
|
|
|
- return AGGR_CLEANUP_PROGRESS;
|
|
|
|
-
|
|
|
|
- if (txtid->addba_exchangeinprogress)
|
|
|
|
- return AGGR_EXCHANGE_PROGRESS;
|
|
|
|
-
|
|
|
|
- if (!txtid->addba_exchangecomplete) {
|
|
|
|
- if (!txtid->addba_exchangeinprogress &&
|
|
|
|
|
|
+ if (!(txtid->state & AGGR_ADDBA_COMPLETE)) {
|
|
|
|
+ if (!(txtid->state & AGGR_ADDBA_PROGRESS) &&
|
|
(txtid->addba_exchangeattempts < ADDBA_EXCHANGE_ATTEMPTS)) {
|
|
(txtid->addba_exchangeattempts < ADDBA_EXCHANGE_ATTEMPTS)) {
|
|
txtid->addba_exchangeattempts++;
|
|
txtid->addba_exchangeattempts++;
|
|
return AGGR_REQUIRED;
|
|
return AGGR_REQUIRED;
|
|
@@ -2367,7 +2358,7 @@ int ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta,
|
|
|
|
|
|
if (sc->sc_flags & SC_OP_TXAGGR) {
|
|
if (sc->sc_flags & SC_OP_TXAGGR) {
|
|
txtid = ATH_AN_2_TID(an, tid);
|
|
txtid = ATH_AN_2_TID(an, tid);
|
|
- txtid->addba_exchangeinprogress = 1;
|
|
|
|
|
|
+ txtid->state |= AGGR_ADDBA_PROGRESS;
|
|
ath_tx_pause_tid(sc, txtid);
|
|
ath_tx_pause_tid(sc, txtid);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2401,10 +2392,10 @@ void ath_tx_aggr_teardown(struct ath_softc *sc, struct ath_node *an, u8 tid)
|
|
|
|
|
|
DPRINTF(sc, ATH_DBG_AGGR, "%s: teardown TX aggregation\n", __func__);
|
|
DPRINTF(sc, ATH_DBG_AGGR, "%s: teardown TX aggregation\n", __func__);
|
|
|
|
|
|
- if (txtid->cleanup_inprogress) /* cleanup is in progress */
|
|
|
|
|
|
+ if (txtid->state & AGGR_CLEANUP) /* cleanup is in progress */
|
|
return;
|
|
return;
|
|
|
|
|
|
- if (!txtid->addba_exchangecomplete) {
|
|
|
|
|
|
+ if (!(txtid->state & AGGR_ADDBA_COMPLETE)) {
|
|
txtid->addba_exchangeattempts = 0;
|
|
txtid->addba_exchangeattempts = 0;
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
@@ -2434,9 +2425,9 @@ void ath_tx_aggr_teardown(struct ath_softc *sc, struct ath_node *an, u8 tid)
|
|
|
|
|
|
if (txtid->baw_head != txtid->baw_tail) {
|
|
if (txtid->baw_head != txtid->baw_tail) {
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
- txtid->cleanup_inprogress = true;
|
|
|
|
|
|
+ txtid->state |= AGGR_CLEANUP;
|
|
} else {
|
|
} else {
|
|
- txtid->addba_exchangecomplete = 0;
|
|
|
|
|
|
+ txtid->state &= ~AGGR_ADDBA_COMPLETE;
|
|
txtid->addba_exchangeattempts = 0;
|
|
txtid->addba_exchangeattempts = 0;
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
spin_unlock_bh(&txq->axq_lock);
|
|
ath_tx_flush_tid(sc, txtid);
|
|
ath_tx_flush_tid(sc, txtid);
|
|
@@ -2527,16 +2518,16 @@ void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an)
|
|
tid->baw_head = tid->baw_tail = 0;
|
|
tid->baw_head = tid->baw_tail = 0;
|
|
tid->sched = false;
|
|
tid->sched = false;
|
|
tid->paused = false;
|
|
tid->paused = false;
|
|
- tid->cleanup_inprogress = false;
|
|
|
|
|
|
+ tid->state &= ~AGGR_CLEANUP;
|
|
INIT_LIST_HEAD(&tid->buf_q);
|
|
INIT_LIST_HEAD(&tid->buf_q);
|
|
|
|
|
|
acno = TID_TO_WME_AC(tidno);
|
|
acno = TID_TO_WME_AC(tidno);
|
|
tid->ac = &an->an_aggr.tx.ac[acno];
|
|
tid->ac = &an->an_aggr.tx.ac[acno];
|
|
|
|
|
|
/* ADDBA state */
|
|
/* ADDBA state */
|
|
- tid->addba_exchangecomplete = 0;
|
|
|
|
- tid->addba_exchangeinprogress = 0;
|
|
|
|
- tid->addba_exchangeattempts = 0;
|
|
|
|
|
|
+ tid->state &= ~AGGR_ADDBA_COMPLETE;
|
|
|
|
+ tid->state &= ~AGGR_ADDBA_PROGRESS;
|
|
|
|
+ tid->addba_exchangeattempts = 0;
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
@@ -2596,9 +2587,9 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an)
|
|
list_del(&tid->list);
|
|
list_del(&tid->list);
|
|
tid->sched = false;
|
|
tid->sched = false;
|
|
ath_tid_drain(sc, txq, tid);
|
|
ath_tid_drain(sc, txq, tid);
|
|
- tid->addba_exchangecomplete = 0;
|
|
|
|
|
|
+ tid->state &= ~AGGR_ADDBA_COMPLETE;
|
|
tid->addba_exchangeattempts = 0;
|
|
tid->addba_exchangeattempts = 0;
|
|
- tid->cleanup_inprogress = false;
|
|
|
|
|
|
+ tid->state &= ~AGGR_CLEANUP;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|