Jesse Keating 2f82dda
This patch is not upstream yet...
Jesse Keating 2f82dda
Jesse Keating 2f82dda
From 171e0b730fd471b8df0d138daf382b8f6835fb18 Mon Sep 17 00:00:00 2001
Jesse Keating 2f82dda
From: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Jesse Keating 2f82dda
Date: Thu, 4 Mar 2010 13:38:58 -0800
Jesse Keating 2f82dda
Subject: [PATCH 14/17] iwlwifi: move plcp check to separated function
Jesse Keating 2f82dda
Jesse Keating 2f82dda
Move the plcp error checking into stand alone function and pointed by ops
Jesse Keating 2f82dda
to accommodate devices not needing this recovery.
Jesse Keating 2f82dda
Jesse Keating 2f82dda
Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
Jesse Keating 2f82dda
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Jesse Keating 2f82dda
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Jesse Keating 2f82dda
Jesse Keating 2f82dda
diff -up linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c
Jesse Keating 2f82dda
--- linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c.orig	2010-03-22 15:48:54.000000000 -0400
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-1000.c	2010-03-22 15:56:08.000000000 -0400
Jesse Keating 2f82dda
@@ -136,6 +136,7 @@ static struct iwl_lib_ops iwl1000_lib = 
Jesse Keating 2f82dda
 		.set_ct_kill = iwl1000_set_ct_threshold,
Jesse Keating 2f82dda
 	 },
Jesse Keating 2f82dda
 	.recover_from_tx_stall = iwl_bg_monitor_recover,
Jesse Keating 2f82dda
+	.recover_from_statistics = iwl_recover_from_statistics,
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 static struct iwl_ops iwl1000_ops = {
Jesse Keating 2f82dda
diff -up linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c
Jesse Keating 2f82dda
--- linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c.orig	2010-03-22 15:48:54.000000000 -0400
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-4965.c	2010-03-22 15:56:08.000000000 -0400
Jesse Keating 2f82dda
@@ -2340,6 +2340,7 @@ static struct iwl_lib_ops iwl4965_lib = 
Jesse Keating 2f82dda
 		.temperature = iwl4965_temperature_calib,
Jesse Keating 2f82dda
 		.set_ct_kill = iwl4965_set_ct_threshold,
Jesse Keating 2f82dda
 	},
Jesse Keating 2f82dda
+	.recover_from_statistics = iwl_recover_from_statistics,
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 static struct iwl_ops iwl4965_ops = {
Jesse Keating 2f82dda
diff -up linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c
Jesse Keating 2f82dda
--- linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c.orig	2010-03-22 15:48:54.000000000 -0400
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-5000.c	2010-03-22 15:56:08.000000000 -0400
Jesse Keating 2f82dda
@@ -1580,6 +1580,7 @@ struct iwl_lib_ops iwl5000_lib = {
Jesse Keating 2f82dda
 		.set_ct_kill = iwl5000_set_ct_threshold,
Jesse Keating 2f82dda
 	 },
Jesse Keating 2f82dda
 	.recover_from_tx_stall = iwl_bg_monitor_recover,
Jesse Keating 2f82dda
+	.recover_from_statistics = iwl_recover_from_statistics,
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 static struct iwl_lib_ops iwl5150_lib = {
Jesse Keating 2f82dda
@@ -1633,6 +1634,7 @@ static struct iwl_lib_ops iwl5150_lib = 
Jesse Keating 2f82dda
 		.set_ct_kill = iwl5150_set_ct_threshold,
Jesse Keating 2f82dda
 	 },
Jesse Keating 2f82dda
 	.recover_from_tx_stall = iwl_bg_monitor_recover,
Jesse Keating 2f82dda
+	.recover_from_statistics = iwl_recover_from_statistics,
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 struct iwl_ops iwl5000_ops = {
Jesse Keating 2f82dda
diff -up linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c
Jesse Keating 2f82dda
--- linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c.orig	2010-03-22 15:51:12.000000000 -0400
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-6000.c	2010-03-22 15:56:08.000000000 -0400
Jesse Keating 2f82dda
@@ -138,6 +138,7 @@ static struct iwl_lib_ops iwl6000_lib = 
Jesse Keating 2f82dda
 		.set_ct_kill = iwl6000_set_ct_threshold,
Jesse Keating 2f82dda
 	 },
Jesse Keating 2f82dda
 	.recover_from_tx_stall = iwl_bg_monitor_recover,
Jesse Keating 2f82dda
+	.recover_from_statistics = iwl_recover_from_statistics,
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 static struct iwl_hcmd_utils_ops iwl6000_hcmd_utils = {
Jesse Keating 2f82dda
diff -up linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-core.h
Jesse Keating 2f82dda
--- linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-core.h.orig	2010-03-22 15:48:54.000000000 -0400
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-core.h	2010-03-22 15:56:08.000000000 -0400
Jesse Keating 2f82dda
@@ -185,6 +185,9 @@ struct iwl_lib_ops {
Jesse Keating 2f82dda
 	struct iwl_temp_ops temp_ops;
Jesse Keating 2f82dda
 	/* recover from tx queue stall */
Jesse Keating 2f82dda
 	void (*recover_from_tx_stall)(unsigned long data);
Jesse Keating 2f82dda
+	/* recover from errors showed in statistics */
Jesse Keating 2f82dda
+	void (*recover_from_statistics)(struct iwl_priv *priv,
Jesse Keating 2f82dda
+					struct iwl_rx_packet *pkt);
Jesse Keating 2f82dda
 };
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 struct iwl_ops {
Jesse Keating 2f82dda
@@ -398,6 +401,8 @@ int iwl_tx_queue_reclaim(struct iwl_priv
Jesse Keating 2f82dda
 /* Handlers */
Jesse Keating 2f82dda
 void iwl_rx_missed_beacon_notif(struct iwl_priv *priv,
Jesse Keating 2f82dda
 			       struct iwl_rx_mem_buffer *rxb);
Jesse Keating 2f82dda
+void iwl_recover_from_statistics(struct iwl_priv *priv,
Jesse Keating 2f82dda
+				 struct iwl_rx_packet *pkt);
Jesse Keating 2f82dda
 void iwl_rx_statistics(struct iwl_priv *priv,
Jesse Keating 2f82dda
 			      struct iwl_rx_mem_buffer *rxb);
Jesse Keating 2f82dda
 void iwl_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb);
Jesse Keating 2f82dda
diff -up linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c
Jesse Keating 2f82dda
--- linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c.orig	2010-03-22 15:24:28.000000000 -0400
Jesse Keating 2f82dda
+++ linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-rx.c	2010-03-22 16:02:35.000000000 -0400
Jesse Keating 2f82dda
@@ -551,25 +551,18 @@ static void iwl_rx_calc_noise(struct iwl
Jesse Keating 2f82dda
 #define REG_RECALIB_PERIOD (60)
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 #define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
Jesse Keating 2f82dda
-void iwl_rx_statistics(struct iwl_priv *priv,
Jesse Keating 2f82dda
-			      struct iwl_rx_mem_buffer *rxb)
Jesse Keating 2f82dda
+/*
Jesse Keating 2f82dda
+ * This function checks for plcp error.
Jesse Keating 2f82dda
+ * - When the plcp error is exceeding the thresholds, it will reset the radio
Jesse Keating 2f82dda
+ * to improve the throughput.
Jesse Keating 2f82dda
+ */
Jesse Keating 2f82dda
+void iwl_recover_from_statistics(struct iwl_priv *priv,
Jesse Keating 2f82dda
+					struct iwl_rx_packet *pkt)
Jesse Keating 2f82dda
 {
Jesse Keating 2f82dda
-	int change;
Jesse Keating 2f82dda
-	struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
Jesse Keating 2f82dda
 	int combined_plcp_delta;
Jesse Keating 2f82dda
 	unsigned int plcp_msec;
Jesse Keating 2f82dda
 	unsigned long plcp_received_jiffies;
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
-	IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
Jesse Keating 2f82dda
-		     (int)sizeof(priv->statistics),
Jesse Keating 2f82dda
-		     le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
Jesse Keating 2f82dda
-
Jesse Keating 2f82dda
-	change = ((priv->statistics.general.temperature !=
Jesse Keating 2f82dda
-		   pkt->u.stats.general.temperature) ||
Jesse Keating 2f82dda
-		  ((priv->statistics.flag &
Jesse Keating 2f82dda
-		    STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
Jesse Keating 2f82dda
-		   (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
Jesse Keating 2f82dda
-
Jesse Keating 2f82dda
 	/*
Jesse Keating 2f82dda
 	 * check for plcp_err and trigger radio reset if it exceeds
Jesse Keating 2f82dda
 	 * the plcp error threshold plcp_delta.
Jesse Keating 2f82dda
@@ -590,11 +583,11 @@ void iwl_rx_statistics(struct iwl_priv *
Jesse Keating 2f82dda
 			le32_to_cpu(priv->statistics.rx.ofdm_ht.plcp_err));
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 		if ((combined_plcp_delta > 0) &&
Jesse Keating 2f82dda
-			((combined_plcp_delta * 100) / plcp_msec) >
Jesse Keating 2f82dda
+		    ((combined_plcp_delta * 100) / plcp_msec) >
Jesse Keating 2f82dda
 			priv->cfg->plcp_delta_threshold) {
Jesse Keating 2f82dda
 			/*
Jesse Keating 2f82dda
-			 * if plcp_err exceed the threshold, the following
Jesse Keating 2f82dda
-			 * data is printed in csv format:
Jesse Keating 2f82dda
+			 * if plcp_err exceed the threshold,
Jesse Keating 2f82dda
+			 * the following data is printed in csv format:
Jesse Keating 2f82dda
 			 *    Text: plcp_err exceeded %d,
Jesse Keating 2f82dda
 			 *    Received ofdm.plcp_err,
Jesse Keating 2f82dda
 			 *    Current ofdm.plcp_err,
Jesse Keating 2f82dda
@@ -609,9 +602,8 @@ void iwl_rx_statistics(struct iwl_priv *
Jesse Keating 2f82dda
 				le32_to_cpu(priv->statistics.rx.ofdm.plcp_err),
Jesse Keating 2f82dda
 				le32_to_cpu(pkt->u.stats.rx.ofdm_ht.plcp_err),
Jesse Keating 2f82dda
 				le32_to_cpu(
Jesse Keating 2f82dda
-					priv->statistics.rx.ofdm_ht.plcp_err),
Jesse Keating 2f82dda
+				  priv->statistics.rx.ofdm_ht.plcp_err),
Jesse Keating 2f82dda
 				combined_plcp_delta, plcp_msec);
Jesse Keating 2f82dda
-
Jesse Keating 2f82dda
 			/*
Jesse Keating 2f82dda
 			 * Reset the RF radio due to the high plcp
Jesse Keating 2f82dda
 			 * error rate
Jesse Keating 2f82dda
@@ -619,6 +611,28 @@ void iwl_rx_statistics(struct iwl_priv *
Jesse Keating 2f82dda
 			iwl_force_reset(priv, IWL_RF_RESET);
Jesse Keating 2f82dda
 		}
Jesse Keating 2f82dda
 	}
Jesse Keating 2f82dda
+}
Jesse Keating 2f82dda
+EXPORT_SYMBOL(iwl_recover_from_statistics);
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
+void iwl_rx_statistics(struct iwl_priv *priv,
Jesse Keating 2f82dda
+			      struct iwl_rx_mem_buffer *rxb)
Jesse Keating 2f82dda
+{
Jesse Keating 2f82dda
+	int change;
Jesse Keating 2f82dda
+	struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
+	IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
Jesse Keating 2f82dda
+		     (int)sizeof(priv->statistics),
Jesse Keating 2f82dda
+		     le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
+	change = ((priv->statistics.general.temperature !=
Jesse Keating 2f82dda
+		   pkt->u.stats.general.temperature) ||
Jesse Keating 2f82dda
+		  ((priv->statistics.flag &
Jesse Keating 2f82dda
+		    STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
Jesse Keating 2f82dda
+		   (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
Jesse Keating 2f82dda
+
Jesse Keating 2f82dda
+	if (priv->cfg->ops->lib->recover_from_statistics)
Jesse Keating 2f82dda
+		priv->cfg->ops->lib->recover_from_statistics(priv, pkt);
Jesse Keating 2f82dda
 
Jesse Keating 2f82dda
 	memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));
Jesse Keating 2f82dda