several people reported this bug to be causing drop out issues Signed-off-by: John Crispin <john@phrozen.org>
		
			
				
	
	
		
			42 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: Felix Fietkau <nbd@nbd.name>
 | 
						|
Date: Sun, 23 Jul 2017 14:58:22 +0200
 | 
						|
Subject: [PATCH] ath9k: fix more-data flag for buffered multicast
 | 
						|
 packets
 | 
						|
 | 
						|
The flag needs to be cleared for the last packet in the list, not the
 | 
						|
first one. Fixes some issues with multicast packet loss for powersave
 | 
						|
clients connected to an ath9k AP.
 | 
						|
 | 
						|
Signed-off-by: Felix Fietkau <nbd@nbd.name>
 | 
						|
---
 | 
						|
 | 
						|
--- a/drivers/net/wireless/ath/ath9k/xmit.c
 | 
						|
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
 | 
						|
@@ -2436,7 +2436,6 @@ void ath_tx_cabq(struct ieee80211_hw *hw
 | 
						|
 		.txq = sc->beacon.cabq
 | 
						|
 	};
 | 
						|
 	struct ath_tx_info info = {};
 | 
						|
-	struct ieee80211_hdr *hdr;
 | 
						|
 	struct ath_buf *bf_tail = NULL;
 | 
						|
 	struct ath_buf *bf;
 | 
						|
 	LIST_HEAD(bf_q);
 | 
						|
@@ -2480,15 +2479,10 @@ void ath_tx_cabq(struct ieee80211_hw *hw
 | 
						|
 	if (list_empty(&bf_q))
 | 
						|
 		return;
 | 
						|
 
 | 
						|
-	bf = list_first_entry(&bf_q, struct ath_buf, list);
 | 
						|
-	hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data;
 | 
						|
-
 | 
						|
-	if (hdr->frame_control & cpu_to_le16(IEEE80211_FCTL_MOREDATA)) {
 | 
						|
-		hdr->frame_control &= ~cpu_to_le16(IEEE80211_FCTL_MOREDATA);
 | 
						|
-		dma_sync_single_for_device(sc->dev, bf->bf_buf_addr,
 | 
						|
-			sizeof(*hdr), DMA_TO_DEVICE);
 | 
						|
-	}
 | 
						|
+	bf = list_last_entry(&bf_q, struct ath_buf, list);
 | 
						|
+	ath9k_set_moredata(sc, bf, false);
 | 
						|
 
 | 
						|
+	bf = list_first_entry(&bf_q, struct ath_buf, list);
 | 
						|
 	ath_txq_lock(sc, txctl.txq);
 | 
						|
 	ath_tx_fill_desc(sc, bf, txctl.txq, 0);
 | 
						|
 	ath_tx_txqaddbuf(sc, txctl.txq, &bf_q, false);
 |