Parcourir la source

ath9k: add some more fixes to AP handling of buffered frames for powersave clients

SVN-Revision: 28344
Felix Fietkau il y a 14 ans
Parent
commit
e477159e40

+ 33 - 3
package/mac80211/patches/572-ath9k_fix_tx_retry.patch

@@ -1,11 +1,41 @@
 --- a/drivers/net/wireless/ath/ath9k/xmit.c
 +++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -484,7 +484,7 @@ static void ath_tx_complete_aggr(struct 
+@@ -387,7 +387,6 @@ static void ath_tx_complete_aggr(struct 
+ 	struct ath_frame_info *fi;
+ 	int nframes;
+ 	u8 tidno;
+-	bool clear_filter;
+ 	int i, retries;
+ 
+ 	skb = bf->bf_mpdu;
+@@ -484,12 +483,10 @@ static void ath_tx_complete_aggr(struct 
  				 */
  				txfail = 1;
  			} else if (fi->retries < ATH_MAX_SW_RETRIES) {
 -				if (!(ts->ts_status & ATH9K_TXERR_FILT) ||
-+				if (!(ts->ts_status & ATH9K_TXERR_FILT) &&
- 				    !an->sleeping)
+-				    !an->sleeping)
++				if (txok || !an->sleeping)
  					ath_tx_set_retry(sc, txq, bf->bf_mpdu,
  							 retries);
+ 
+-				clear_filter = true;
+ 				txpending = 1;
+ 			} else {
+ 				txfail = 1;
+@@ -568,11 +565,13 @@ static void ath_tx_complete_aggr(struct 
+ 			ieee80211_sta_set_tim(sta);
+ 
+ 		spin_lock_bh(&txq->axq_lock);
+-		if (clear_filter)
+-			tid->ac->clear_ps_filter = true;
+ 		skb_queue_splice(&bf_pending, &tid->buf_q);
+-		if (!an->sleeping)
++		if (!an->sleeping) {
+ 			ath_tx_queue_tid(txq, tid);
++
++			if (ts->ts_status & ATH9K_TXERR_FILT)
++				tid->ac->clear_ps_filter = true;
++		}
+ 		spin_unlock_bh(&txq->axq_lock);
+ 	}
+ 

+ 7 - 7
package/mac80211/patches/573-ath9k_fix_tx_flush_bar.patch

@@ -14,24 +14,24 @@
  #define ATH9K_TX_PWRMGMT           0x02
 --- a/drivers/net/wireless/ath/ath9k/xmit.c
 +++ b/drivers/net/wireless/ath/ath9k/xmit.c
-@@ -389,6 +389,7 @@ static void ath_tx_complete_aggr(struct 
+@@ -388,6 +388,7 @@ static void ath_tx_complete_aggr(struct 
+ 	int nframes;
  	u8 tidno;
- 	bool clear_filter;
  	int i, retries;
 +	bool flush = !!(ts->ts_status & ATH9K_TX_FLUSH);
  
  	skb = bf->bf_mpdu;
  	hdr = (struct ieee80211_hdr *)skb->data;
-@@ -483,6 +484,8 @@ static void ath_tx_complete_aggr(struct 
+@@ -482,6 +483,8 @@ static void ath_tx_complete_aggr(struct 
  				 * the un-acked sub-frames
  				 */
  				txfail = 1;
 +			} else if (flush) {
 +				txpending = 1;
  			} else if (fi->retries < ATH_MAX_SW_RETRIES) {
- 				if (!(ts->ts_status & ATH9K_TXERR_FILT) &&
- 				    !an->sleeping)
-@@ -543,7 +546,8 @@ static void ath_tx_complete_aggr(struct 
+ 				if (txok || !an->sleeping)
+ 					ath_tx_set_retry(sc, txq, bf->bf_mpdu,
+@@ -540,7 +543,8 @@ static void ath_tx_complete_aggr(struct 
  
  						ath_tx_complete_buf(sc, bf, txq,
  								    &bf_head,
@@ -41,7 +41,7 @@
  								    sta);
  						break;
  					}
-@@ -1447,6 +1451,7 @@ static void ath_drain_txq_list(struct at
+@@ -1446,6 +1450,7 @@ static void ath_drain_txq_list(struct at
  	struct ath_tx_status ts;
  
  	memset(&ts, 0, sizeof(ts));