52 lines
1.6 KiB
Diff
52 lines
1.6 KiB
Diff
|
--- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
|
||
|
@@ -287,6 +287,7 @@ static int ar9002_hw_proc_txdesc(struct
|
||
|
ts->ts_shortretry = MS(ads->ds_txstatus1, AR_RTSFailCnt);
|
||
|
ts->ts_longretry = MS(ads->ds_txstatus1, AR_DataFailCnt);
|
||
|
ts->ts_virtcol = MS(ads->ds_txstatus1, AR_VirtRetryCnt);
|
||
|
+ ts->tid = MS(ads->ds_txstatus9, AR_TxTid);
|
||
|
ts->ts_antenna = 0;
|
||
|
|
||
|
return 0;
|
||
|
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.h
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.h
|
||
|
@@ -33,9 +33,6 @@
|
||
|
#define AR_TxDescId_S 16
|
||
|
#define AR_TxPtrChkSum 0x0000ffff
|
||
|
|
||
|
-#define AR_TxTid 0xf0000000
|
||
|
-#define AR_TxTid_S 28
|
||
|
-
|
||
|
#define AR_LowRxChain 0x00004000
|
||
|
|
||
|
#define AR_Not_Sounding 0x20000000
|
||
|
--- a/drivers/net/wireless/ath/ath9k/mac.h
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/mac.h
|
||
|
@@ -485,6 +485,9 @@ struct ar5416_desc {
|
||
|
#define AR_TxRSSICombined 0xff000000
|
||
|
#define AR_TxRSSICombined_S 24
|
||
|
|
||
|
+#define AR_TxTid 0xf0000000
|
||
|
+#define AR_TxTid_S 28
|
||
|
+
|
||
|
#define AR_TxEVM0 ds_txstatus5
|
||
|
#define AR_TxEVM1 ds_txstatus6
|
||
|
#define AR_TxEVM2 ds_txstatus7
|
||
|
--- a/drivers/net/wireless/ath/ath9k/xmit.c
|
||
|
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
|
||
|
@@ -355,6 +355,14 @@ static void ath_tx_complete_aggr(struct
|
||
|
an = (struct ath_node *)sta->drv_priv;
|
||
|
tid = ATH_AN_2_TID(an, bf->bf_tidno);
|
||
|
|
||
|
+ /*
|
||
|
+ * 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
|
||
|
+ */
|
||
|
+ if (bf->bf_tidno != ts->tid)
|
||
|
+ txok = false;
|
||
|
+
|
||
|
isaggr = bf_isaggr(bf);
|
||
|
memset(ba, 0, WME_BA_BMP_SIZE >> 3);
|
||
|
|