[kernel/f16] Use "iwlwifi: don't mess up QoS counters with non-QoS frames" (rhbz 785561) Actually apply patch to

John W. Linville linville at fedoraproject.org
Wed Feb 1 21:02:08 UTC 2012


commit d35a7646d0df1201d0ade58a45b165c999eb5b6a
Author: John W. Linville <linville at tuxdriver.com>
Date:   Wed Feb 1 16:00:49 2012 -0500

    Use "iwlwifi: don't mess up QoS counters with non-QoS frames" (rhbz 785561)
    Actually apply patch to make integrated compat-wireless avoid taint...

 iwlwifi-bz785561.patch                             |   50 -----------
 ...-t-mess-up-QoS-counters-with-non-QoS-fram.patch |   89 ++++++++++++++++++++
 kernel.spec                                        |   10 ++-
 3 files changed, 97 insertions(+), 52 deletions(-)
---
diff --git a/iwlwifi-don-t-mess-up-QoS-counters-with-non-QoS-fram.patch b/iwlwifi-don-t-mess-up-QoS-counters-with-non-QoS-fram.patch
new file mode 100644
index 0000000..5be686b
--- /dev/null
+++ b/iwlwifi-don-t-mess-up-QoS-counters-with-non-QoS-fram.patch
@@ -0,0 +1,89 @@
+From 3d29dd9b5b160ba4542a9b8f869a220559e633a0 Mon Sep 17 00:00:00 2001
+From: Emmanuel Grumbach <emmanuel.grumbach at intel.com>
+Date: Wed, 1 Feb 2012 07:01:32 -0800
+Subject: [PATCH] iwlwifi: don't mess up QoS counters with non-QoS frames
+
+In my AMPDU rework, I rely on the sequence numbers of frames. But
+I didn't check that the frame has a valid tid before updating the
+tracking counters. As a result, the Tx queues were stalled. People
+who hit this bug saw that we simply didn't let any data out.
+
+This bug was introduced in 3.3.
+
+This patch fixes that and checks that the frame is a QoS frame before
+looking at its tid and changing the counters.
+
+Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach at intel.com>
+Signed-off-by: Wey-Yi Guy <wey-yi.w.guy at intel.com>
+Signed-off-by: John W. Linville <linville at tuxdriver.com>
+---
+ drivers/net/wireless/iwlwifi/iwl-agn-tx.c     |   12 +++++++++---
+ drivers/net/wireless/iwlwifi/iwl-commands.h   |    1 +
+ drivers/net/wireless/iwlwifi/iwl-trans-pcie.c |    1 +
+ 3 files changed, 11 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
+index 339e8d9..63bbc60 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c
+@@ -91,6 +91,7 @@ static void iwlagn_tx_cmd_build_basic(struct iwl_priv *priv,
+ 		tx_cmd->tid_tspec = qc[0] & 0xf;
+ 		tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK;
+ 	} else {
++		tx_cmd->tid_tspec = IWL_TID_NON_QOS;
+ 		if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)
+ 			tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK;
+ 		else
+@@ -808,6 +809,8 @@ static void iwl_rx_reply_tx_agg(struct iwl_priv *priv,
+ 	u32 status = le16_to_cpu(tx_resp->status.status);
+ 	int i;
+ 
++	WARN_ON(tid == IWL_TID_NON_QOS);
++
+ 	if (agg->wait_for_ba)
+ 		IWL_DEBUG_TX_REPLY(priv,
+ 			"got tx response w/o block-ack\n");
+@@ -1035,10 +1038,13 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb,
+ 		}
+ 
+ 		__skb_queue_head_init(&skbs);
+-		priv->tid_data[sta_id][tid].next_reclaimed = next_reclaimed;
+ 
+-		IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d",
+-					  next_reclaimed);
++		if (tid != IWL_TID_NON_QOS) {
++			priv->tid_data[sta_id][tid].next_reclaimed =
++				next_reclaimed;
++			IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d",
++						  next_reclaimed);
++		}
+ 
+ 		/*we can free until ssn % q.n_bd not inclusive */
+ 		WARN_ON(iwl_trans_reclaim(trans(priv), sta_id, tid, txq_id,
+diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
+index 265de39..f822ac4 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
++++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
+@@ -815,6 +815,7 @@ struct iwl_qosparam_cmd {
+ 
+ #define	IWL_INVALID_STATION 	255
+ #define IWL_MAX_TID_COUNT	8
++#define IWL_TID_NON_QOS IWL_MAX_TID_COUNT
+ 
+ #define STA_FLG_TX_RATE_MSK		cpu_to_le32(1 << 2)
+ #define STA_FLG_PWR_SAVE_MSK		cpu_to_le32(1 << 8)
+diff --git a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
+index 67d6e32..324d06d 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
++++ b/drivers/net/wireless/iwlwifi/iwl-trans-pcie.c
+@@ -1262,6 +1262,7 @@ static int iwl_trans_pcie_reclaim(struct iwl_trans *trans, int sta_id, int tid,
+ 	txq->time_stamp = jiffies;
+ 
+ 	if (unlikely(txq_id >= IWLAGN_FIRST_AMPDU_QUEUE &&
++		     tid != IWL_TID_NON_QOS &&
+ 		     txq_id != trans_pcie->agg_txq[sta_id][tid])) {
+ 		/*
+ 		 * FIXME: this is a uCode bug which need to be addressed,
+-- 
+1.7.4.4
+
diff --git a/kernel.spec b/kernel.spec
index 395bec4..3ce6711 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -828,7 +828,7 @@ Patch50107: mac80211-set-bss_conf.idle-when-vif-is-connected.patch
 Patch50108: iwlwifi-fix-PCI-E-transport-inta-race.patch
 
 Patch50200: ath9k-use-WARN_ON_ONCE-in-ath_rc_get_highest_rix.patch
-Patch50201: iwlwifi-bz785561.patch
+Patch50201: iwlwifi-don-t-mess-up-QoS-counters-with-non-QoS-fram.patch
 
 %endif
 
@@ -1584,6 +1584,8 @@ cd compat-wireless-%{cwversion}
 
 ApplyPatch compat-wireless-config-fixups.patch
 ApplyPatch compat-wireless-pr_fmt-warning-avoidance.patch
+ApplyPatch compat-wireless-integrated-build.patch
+
 ApplyPatch compat-wireless-rtl8192cu-Fix-WARNING-on-suspend-resume.patch
 
 # Pending upstream fixes
@@ -1598,7 +1600,7 @@ ApplyPatch iwlwifi-fix-PCI-E-transport-inta-race.patch
 
 ApplyPatch ath9k-use-WARN_ON_ONCE-in-ath_rc_get_highest_rix.patch
 
-ApplyPatch iwlwifi-bz785561.patch
+ApplyPatch iwlwifi-don-t-mess-up-QoS-counters-with-non-QoS-fram.patch
 
 cd ..
 
@@ -2305,6 +2307,10 @@ fi
 # and build.
 
 %changelog
+* Wed Feb  1 2012 John W. Linville <linville at redhat.com>
+- Use "iwlwifi: don't mess up QoS counters with non-QoS frames" (rhbz 785561)
+- Actually apply patch to make integrated compat-wireless avoid taint...
+
 * Tue Jan 31 2012 John W. Linville <linville at redhat.com>
 - Apply iwlwifi patch for TID issue (rhbz 785561)
 


More information about the scm-commits mailing list