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

ath9k: Remove ath_tx_aggr_resp()

Accessing mac80211's internal state machine is wrong.
Will add resumption of a TID in a later patch.
Signed-off-by: default avatarSujith <Sujith.Manoharan@atheros.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 05a1e2d1
...@@ -588,14 +588,6 @@ enum ATH_AGGR_STATUS { ...@@ -588,14 +588,6 @@ enum ATH_AGGR_STATUS {
ATH_AGGR_8K_LIMITED, ATH_AGGR_8K_LIMITED,
}; };
enum ATH_AGGR_CHECK {
AGGR_NOT_REQUIRED,
AGGR_REQUIRED,
AGGR_CLEANUP_PROGRESS,
AGGR_EXCHANGE_PROGRESS,
AGGR_EXCHANGE_DONE
};
struct aggr_rifs_param { struct aggr_rifs_param {
int param_max_frames; int param_max_frames;
int param_max_len; int param_max_len;
...@@ -621,8 +613,7 @@ struct ath_node { ...@@ -621,8 +613,7 @@ struct ath_node {
void ath_tx_resume_tid(struct ath_softc *sc, void ath_tx_resume_tid(struct ath_softc *sc,
struct ath_atx_tid *tid); struct ath_atx_tid *tid);
enum ATH_AGGR_CHECK ath_tx_aggr_check(struct ath_softc *sc, bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno);
struct ath_node *an, u8 tidno);
void ath_tx_aggr_teardown(struct ath_softc *sc, void ath_tx_aggr_teardown(struct ath_softc *sc,
struct ath_node *an, u8 tidno); struct ath_node *an, u8 tidno);
void ath_rx_aggr_teardown(struct ath_softc *sc, void ath_rx_aggr_teardown(struct ath_softc *sc,
......
...@@ -1879,49 +1879,6 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband, ...@@ -1879,49 +1879,6 @@ static void ath_tx_status(void *priv, struct ieee80211_supported_band *sband,
tx_info->control.vif = NULL; tx_info->control.vif = NULL;
} }
static void ath_tx_aggr_resp(struct ath_softc *sc,
struct ieee80211_supported_band *sband,
struct ieee80211_sta *sta,
struct ath_node *an,
u8 tidno)
{
struct ath_atx_tid *txtid;
u16 buffersize = 0;
int state;
struct sta_info *si;
if (!(sc->sc_flags & SC_OP_TXAGGR))
return;
txtid = ATH_AN_2_TID(an, tidno);
if (!txtid->paused)
return;
/*
* XXX: This is entirely busted, we aren't supposed to
* access the sta from here because it's internal
* to mac80211, and looking at the state without
* locking is wrong too.
*/
si = container_of(sta, struct sta_info, sta);
buffersize = IEEE80211_MIN_AMPDU_BUF <<
sband->ht_cap.ampdu_factor; /* FIXME */
state = si->ampdu_mlme.tid_state_tx[tidno];
if (state & HT_ADDBA_RECEIVED_MSK) {
txtid->state |= AGGR_ADDBA_COMPLETE;
txtid->state &= ~AGGR_ADDBA_PROGRESS;
txtid->baw_size = buffersize;
DPRINTF(sc, ATH_DBG_AGGR,
"%s: Resuming tid, buffersize: %d\n",
__func__,
buffersize);
ath_tx_resume_tid(sc, txtid);
}
}
static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
struct ieee80211_tx_rate_control *txrc) struct ieee80211_tx_rate_control *txrc)
{ {
...@@ -1934,7 +1891,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, ...@@ -1934,7 +1891,7 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
struct ath_rate_node *ath_rc_priv = priv_sta; struct ath_rate_node *ath_rc_priv = priv_sta;
struct ath_node *an; struct ath_node *an;
struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);
int is_probe = FALSE, chk, ret; int is_probe = FALSE;
s8 lowest_idx; s8 lowest_idx;
__le16 fc = hdr->frame_control; __le16 fc = hdr->frame_control;
u8 *qc, tid; u8 *qc, tid;
...@@ -1981,26 +1938,10 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, ...@@ -1981,26 +1938,10 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
if (ieee80211_is_data_qos(fc)) { if (ieee80211_is_data_qos(fc)) {
qc = ieee80211_get_qos_ctl(hdr); qc = ieee80211_get_qos_ctl(hdr);
tid = qc[0] & 0xf; tid = qc[0] & 0xf;
an = (struct ath_node *)sta->drv_priv; an = (struct ath_node *)sta->drv_priv;
chk = ath_tx_aggr_check(sc, an, tid); if(ath_tx_aggr_check(sc, an, tid))
if (chk == AGGR_REQUIRED) { ieee80211_start_tx_ba_session(hw, hdr->addr1, tid);
ret = ieee80211_start_tx_ba_session(hw,
hdr->addr1, tid);
if (ret)
DPRINTF(sc, ATH_DBG_AGGR,
"%s: Unable to start tx "
"aggr for: %pM\n",
__func__,
hdr->addr1);
else
DPRINTF(sc, ATH_DBG_AGGR,
"%s: Started tx aggr for: %pM\n",
__func__,
hdr->addr1);
} else if (chk == AGGR_EXCHANGE_PROGRESS)
ath_tx_aggr_resp(sc, sband, sta, an, tid);
} }
} }
} }
......
...@@ -2322,28 +2322,24 @@ u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum) ...@@ -2322,28 +2322,24 @@ u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum)
return sc->sc_txq[qnum].axq_aggr_depth; return sc->sc_txq[qnum].axq_aggr_depth;
} }
/* Check if an ADDBA is required. A valid node must be passed. */ bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno)
enum ATH_AGGR_CHECK ath_tx_aggr_check(struct ath_softc *sc,
struct ath_node *an,
u8 tidno)
{ {
struct ath_atx_tid *txtid; struct ath_atx_tid *txtid;
if (!(sc->sc_flags & SC_OP_TXAGGR)) if (!(sc->sc_flags & SC_OP_TXAGGR))
return AGGR_NOT_REQUIRED; return false;
/* ADDBA exchange must be completed before sending aggregates */
txtid = ATH_AN_2_TID(an, tidno); txtid = ATH_AN_2_TID(an, tidno);
if (!(txtid->state & AGGR_ADDBA_COMPLETE)) { if (!(txtid->state & AGGR_ADDBA_COMPLETE)) {
if (!(txtid->state & AGGR_ADDBA_PROGRESS) && 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 true;
} }
} }
return AGGR_NOT_REQUIRED; return false;
} }
/* Start TX aggregation */ /* Start TX aggregation */
......
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