Commit a37c2c79 authored by Sujith's avatar Sujith Committed by John W. Linville

ath9k: Use bitfields to store tid's state in a single variable

Signed-off-by: default avatarSujith <Sujith.Manoharan@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 102e0572
...@@ -447,6 +447,10 @@ struct ath_txq { ...@@ -447,6 +447,10 @@ struct ath_txq {
struct list_head axq_acq; struct list_head axq_acq;
}; };
#define AGGR_CLEANUP BIT(1)
#define AGGR_ADDBA_COMPLETE BIT(2)
#define AGGR_ADDBA_PROGRESS BIT(3)
/* per TID aggregate tx state for a destination */ /* per TID aggregate tx state for a destination */
struct ath_atx_tid { struct ath_atx_tid {
struct list_head list; /* round-robin tid entry */ struct list_head list; /* round-robin tid entry */
...@@ -462,9 +466,7 @@ struct ath_atx_tid { ...@@ -462,9 +466,7 @@ struct ath_atx_tid {
int baw_tail; /* next unused tx buffer slot */ int baw_tail; /* next unused tx buffer slot */
int sched; int sched;
int paused; int paused;
int cleanup_inprogress; u8 state;
u32 addba_exchangecomplete:1;
int32_t addba_exchangeinprogress;
int addba_exchangeattempts; int addba_exchangeattempts;
}; };
......
...@@ -1909,8 +1909,8 @@ static void ath_tx_aggr_resp(struct ath_softc *sc, ...@@ -1909,8 +1909,8 @@ static void ath_tx_aggr_resp(struct ath_softc *sc,
state = si->ampdu_mlme.tid_state_tx[tidno]; state = si->ampdu_mlme.tid_state_tx[tidno];
if (state & HT_ADDBA_RECEIVED_MSK) { if (state & HT_ADDBA_RECEIVED_MSK) {
txtid->addba_exchangecomplete = 1; txtid->state |= AGGR_ADDBA_COMPLETE;
txtid->addba_exchangeinprogress = 0; txtid->state &= ~AGGR_ADDBA_PROGRESS;
txtid->baw_size = buffersize; txtid->baw_size = buffersize;
DPRINTF(sc, ATH_DBG_AGGR, DPRINTF(sc, ATH_DBG_AGGR,
......
...@@ -125,13 +125,13 @@ static int ath_tx_findindex(const struct ath9k_rate_table *rt, int rate) ...@@ -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, static int ath_aggr_query(struct ath_softc *sc, struct ath_node *an, u8 tidno)
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, ...@@ -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, ...@@ -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, ...@@ -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) if (!(txtid->state & AGGR_ADDBA_COMPLETE)) {
return AGGR_EXCHANGE_DONE; if (!(txtid->state & AGGR_ADDBA_PROGRESS) &&
if (txtid->cleanup_inprogress)
return AGGR_CLEANUP_PROGRESS;
if (txtid->addba_exchangeinprogress)
return AGGR_EXCHANGE_PROGRESS;
if (!txtid->addba_exchangecomplete) {
if (!txtid->addba_exchangeinprogress &&
(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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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->state &= ~AGGR_ADDBA_COMPLETE;
tid->addba_exchangeinprogress = 0; tid->state &= ~AGGR_ADDBA_PROGRESS;
tid->addba_exchangeattempts = 0; tid->addba_exchangeattempts = 0;
} }
/* /*
...@@ -2596,9 +2587,9 @@ void ath_tx_node_cleanup(struct ath_softc *sc, struct ath_node *an) ...@@ -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;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment