diff options
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/xmit.c')
| -rw-r--r-- | drivers/net/wireless/ath/ath9k/xmit.c | 10 | 
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 378bd70256b..741918a2027 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c @@ -312,6 +312,7 @@ static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc)  	}  	bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list); +	bf->bf_next = NULL;  	list_del(&bf->list);  	spin_unlock_bh(&sc->tx.txbuflock); @@ -393,7 +394,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  	u16 seq_st = 0, acked_cnt = 0, txfail_cnt = 0, seq_first;  	u32 ba[WME_BA_BMP_SIZE >> 5];  	int isaggr, txfail, txpending, sendbar = 0, needreset = 0, nbad = 0; -	bool rc_update = true; +	bool rc_update = true, isba;  	struct ieee80211_tx_rate rates[4];  	struct ath_frame_info *fi;  	int nframes; @@ -437,13 +438,17 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,  	tidno = ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;  	tid = ATH_AN_2_TID(an, tidno);  	seq_first = tid->seq_start; +	isba = ts->ts_flags & ATH9K_TX_BA;  	/*  	 * The hardware occasionally sends a tx status for the wrong TID.  	 * In this case, the BA status cannot be considered valid and all  	 * subframes need to be retransmitted +	 * +	 * Only BlockAcks have a TID and therefore normal Acks cannot be +	 * checked  	 */ -	if (tidno != ts->tid) +	if (isba && tidno != ts->tid)  		txok = false;  	isaggr = bf_isaggr(bf); @@ -1774,6 +1779,7 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,  	list_add_tail(&bf->list, &bf_head);  	bf->bf_state.bf_type = 0; +	bf->bf_next = NULL;  	bf->bf_lastbf = bf;  	ath_tx_fill_desc(sc, bf, txq, fi->framelen);  	ath_tx_txqaddbuf(sc, txq, &bf_head, false);  |