mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-03 22:44:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
From: Michal Kazior <michal.kazior@tieto.com>
 | 
						|
Date: Tue, 17 May 2016 14:47:01 +0200
 | 
						|
Subject: [PATCH] ath10k: disable wake_tx_queue for older devices
 | 
						|
 | 
						|
Some setups suffer performance regressions with
 | 
						|
current wake_tx_queue implementation.
 | 
						|
 | 
						|
Signed-off-by: Michal Kazior <michal.kazior@tieto.com>
 | 
						|
---
 | 
						|
 | 
						|
--- a/drivers/net/wireless/ath/ath10k/core.h
 | 
						|
+++ b/drivers/net/wireless/ath/ath10k/core.h
 | 
						|
@@ -667,6 +667,7 @@ struct ath10k_fw_components {
 | 
						|
 struct ath10k {
 | 
						|
 	struct ath_common ath_common;
 | 
						|
 	struct ieee80211_hw *hw;
 | 
						|
+	struct ieee80211_ops *ops;
 | 
						|
 	struct device *dev;
 | 
						|
 	u8 mac_addr[ETH_ALEN];
 | 
						|
 
 | 
						|
--- a/drivers/net/wireless/ath/ath10k/mac.c
 | 
						|
+++ b/drivers/net/wireless/ath/ath10k/mac.c
 | 
						|
@@ -7497,21 +7497,32 @@ static const struct ieee80211_channel at
 | 
						|
 struct ath10k *ath10k_mac_create(size_t priv_size)
 | 
						|
 {
 | 
						|
 	struct ieee80211_hw *hw;
 | 
						|
+	struct ieee80211_ops *ops;
 | 
						|
 	struct ath10k *ar;
 | 
						|
 
 | 
						|
-	hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, &ath10k_ops);
 | 
						|
-	if (!hw)
 | 
						|
+	ops = kmemdup(&ath10k_ops, sizeof(ath10k_ops), GFP_KERNEL);
 | 
						|
+	if (!ops)
 | 
						|
+		return NULL;
 | 
						|
+
 | 
						|
+	hw = ieee80211_alloc_hw(sizeof(struct ath10k) + priv_size, ops);
 | 
						|
+	if (!hw) {
 | 
						|
+		kfree(ops);
 | 
						|
 		return NULL;
 | 
						|
+	}
 | 
						|
 
 | 
						|
 	ar = hw->priv;
 | 
						|
 	ar->hw = hw;
 | 
						|
+	ar->ops = ops;
 | 
						|
 
 | 
						|
 	return ar;
 | 
						|
 }
 | 
						|
 
 | 
						|
 void ath10k_mac_destroy(struct ath10k *ar)
 | 
						|
 {
 | 
						|
+	struct ieee80211_ops *ops = ar->ops;
 | 
						|
+
 | 
						|
 	ieee80211_free_hw(ar->hw);
 | 
						|
+	kfree(ops);
 | 
						|
 }
 | 
						|
 
 | 
						|
 static const struct ieee80211_iface_limit ath10k_if_limits[] = {
 | 
						|
@@ -7945,6 +7956,15 @@ int ath10k_mac_register(struct ath10k *a
 | 
						|
 			ath10k_warn(ar, "failed to initialise DFS pattern detector\n");
 | 
						|
 	}
 | 
						|
 
 | 
						|
+	/* Current wake_tx_queue implementation imposes a significant
 | 
						|
+	 * performance penalty in some setups. The tx scheduling code needs
 | 
						|
+	 * more work anyway so disable the wake_tx_queue unless firmware
 | 
						|
+	 * supports the pull-push mechanism.
 | 
						|
+	 */
 | 
						|
+	if (!test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
 | 
						|
+		      ar->running_fw->fw_file.fw_features))
 | 
						|
+		ar->ops->wake_tx_queue = NULL;
 | 
						|
+
 | 
						|
 	ret = ath_regd_init(&ar->ath_common.regulatory, ar->hw->wiphy,
 | 
						|
 			    ath10k_reg_notifier);
 | 
						|
 	if (ret) {
 |