iwlwifi: move plcp check to separated function
authorWey-Yi Guy <wey-yi.w.guy@intel.com>
Thu, 4 Mar 2010 21:38:58 +0000 (13:38 -0800)
committerReinette Chatre <reinette.chatre@intel.com>
Fri, 19 Mar 2010 20:41:25 +0000 (13:41 -0700)
Move the plcp error checking into stand alone function and pointed by ops
to accommodate devices not needing this recovery.

Signed-off-by: Trieu 'Andrew' Nguyen <trieux.t.nguyen@intel.com>
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
drivers/net/wireless/iwlwifi/iwl-1000.c
drivers/net/wireless/iwlwifi/iwl-4965.c
drivers/net/wireless/iwlwifi/iwl-5000.c
drivers/net/wireless/iwlwifi/iwl-6000.c
drivers/net/wireless/iwlwifi/iwl-core.h
drivers/net/wireless/iwlwifi/iwl-rx.c

index 5a9cb70..c6d6a0c 100644 (file)
@@ -213,6 +213,7 @@ static struct iwl_lib_ops iwl1000_lib = {
         },
        .add_bcast_station = iwl_add_bcast_station,
        .recover_from_tx_stall = iwl_bg_monitor_recover,
+       .recover_from_statistics = iwl_recover_from_statistics,
 };
 
 static const struct iwl_ops iwl1000_ops = {
index acca89a..5efd60a 100644 (file)
@@ -2221,6 +2221,7 @@ static struct iwl_lib_ops iwl4965_lib = {
                .set_ct_kill = iwl4965_set_ct_threshold,
        },
        .add_bcast_station = iwl_add_bcast_station,
+       .recover_from_statistics = iwl_recover_from_statistics,
 };
 
 static const struct iwl_ops iwl4965_ops = {
index a01b3c5..75f2a51 100644 (file)
@@ -1500,6 +1500,7 @@ struct iwl_lib_ops iwl5000_lib = {
         },
        .add_bcast_station = iwl_add_bcast_station,
        .recover_from_tx_stall = iwl_bg_monitor_recover,
+       .recover_from_statistics = iwl_recover_from_statistics,
 };
 
 static struct iwl_lib_ops iwl5150_lib = {
@@ -1555,6 +1556,7 @@ static struct iwl_lib_ops iwl5150_lib = {
         },
        .add_bcast_station = iwl_add_bcast_station,
        .recover_from_tx_stall = iwl_bg_monitor_recover,
+       .recover_from_statistics = iwl_recover_from_statistics,
 };
 
 static const struct iwl_ops iwl5000_ops = {
index 4fbc38c..b1f0e5c 100644 (file)
@@ -279,6 +279,7 @@ static struct iwl_lib_ops iwl6000_lib = {
         },
        .add_bcast_station = iwl_add_bcast_station,
        .recover_from_tx_stall = iwl_bg_monitor_recover,
+       .recover_from_statistics = iwl_recover_from_statistics,
 };
 
 static const struct iwl_ops iwl6000_ops = {
@@ -345,6 +346,7 @@ static struct iwl_lib_ops iwl6050_lib = {
         },
        .add_bcast_station = iwl_add_bcast_station,
        .recover_from_tx_stall = iwl_bg_monitor_recover,
+       .recover_from_statistics = iwl_recover_from_statistics,
 };
 
 static const struct iwl_ops iwl6050_ops = {
index c4cd1de..4251afb 100644 (file)
@@ -193,6 +193,9 @@ struct iwl_lib_ops {
        void (*add_bcast_station)(struct iwl_priv *priv);
        /* recover from tx queue stall */
        void (*recover_from_tx_stall)(unsigned long data);
+       /* recover from errors showed in statistics */
+       void (*recover_from_statistics)(struct iwl_priv *priv,
+                                       struct iwl_rx_packet *pkt);
 };
 
 struct iwl_led_ops {
@@ -434,6 +437,8 @@ void iwl_rx_missed_beacon_notif(struct iwl_priv *priv,
                               struct iwl_rx_mem_buffer *rxb);
 void iwl_rx_spectrum_measure_notif(struct iwl_priv *priv,
                                          struct iwl_rx_mem_buffer *rxb);
+void iwl_recover_from_statistics(struct iwl_priv *priv,
+                                struct iwl_rx_packet *pkt);
 void iwl_rx_statistics(struct iwl_priv *priv,
                              struct iwl_rx_mem_buffer *rxb);
 void iwl_reply_statistics(struct iwl_priv *priv,
index 8116aa0..d368b8d 100644 (file)
@@ -617,28 +617,18 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
 #define REG_RECALIB_PERIOD (60)
 
 #define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
-void iwl_rx_statistics(struct iwl_priv *priv,
-                             struct iwl_rx_mem_buffer *rxb)
+/*
+ * This function checks for plcp error.
+ * - When the plcp error is exceeding the thresholds, it will reset the radio
+ * to improve the throughput.
+ */
+void iwl_recover_from_statistics(struct iwl_priv *priv,
+                                  struct iwl_rx_packet *pkt)
 {
-       int change;
-       struct iwl_rx_packet *pkt = rxb_addr(rxb);
        int combined_plcp_delta;
        unsigned int plcp_msec;
        unsigned long plcp_received_jiffies;
 
-       IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
-                    (int)sizeof(priv->statistics),
-                    le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
-
-       change = ((priv->statistics.general.temperature !=
-                  pkt->u.stats.general.temperature) ||
-                 ((priv->statistics.flag &
-                   STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
-                  (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
-
-#ifdef CONFIG_IWLWIFI_DEBUG
-       iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
-#endif
        /*
         * check for plcp_err and trigger radio reset if it exceeds
         * the plcp error threshold plcp_delta.
@@ -659,11 +649,11 @@ void iwl_rx_statistics(struct iwl_priv *priv,
                        le32_to_cpu(priv->statistics.rx.ofdm_ht.plcp_err));
 
                if ((combined_plcp_delta > 0) &&
-                       ((combined_plcp_delta * 100) / plcp_msec) >
+                   ((combined_plcp_delta * 100) / plcp_msec) >
                        priv->cfg->plcp_delta_threshold) {
                        /*
-                        * if plcp_err exceed the threshold, the following
-                        * data is printed in csv format:
+                        * if plcp_err exceed the threshold,
+                        * the following data is printed in csv format:
                         *    Text: plcp_err exceeded %d,
                         *    Received ofdm.plcp_err,
                         *    Current ofdm.plcp_err,
@@ -678,9 +668,8 @@ void iwl_rx_statistics(struct iwl_priv *priv,
                                le32_to_cpu(priv->statistics.rx.ofdm.plcp_err),
                                le32_to_cpu(pkt->u.stats.rx.ofdm_ht.plcp_err),
                                le32_to_cpu(
-                                       priv->statistics.rx.ofdm_ht.plcp_err),
+                                 priv->statistics.rx.ofdm_ht.plcp_err),
                                combined_plcp_delta, plcp_msec);
-
                        /*
                         * Reset the RF radio due to the high plcp
                         * error rate
@@ -688,6 +677,31 @@ void iwl_rx_statistics(struct iwl_priv *priv,
                        iwl_force_reset(priv, IWL_RF_RESET);
                }
        }
+}
+EXPORT_SYMBOL(iwl_recover_from_statistics);
+
+void iwl_rx_statistics(struct iwl_priv *priv,
+                             struct iwl_rx_mem_buffer *rxb)
+{
+       int change;
+       struct iwl_rx_packet *pkt = rxb_addr(rxb);
+
+
+       IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n",
+                    (int)sizeof(priv->statistics),
+                    le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK);
+
+       change = ((priv->statistics.general.temperature !=
+                  pkt->u.stats.general.temperature) ||
+                 ((priv->statistics.flag &
+                   STATISTICS_REPLY_FLG_HT40_MODE_MSK) !=
+                  (pkt->u.stats.flag & STATISTICS_REPLY_FLG_HT40_MODE_MSK)));
+
+#ifdef CONFIG_IWLWIFI_DEBUG
+       iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats);
+#endif
+       if (priv->cfg->ops->lib->recover_from_statistics)
+               priv->cfg->ops->lib->recover_from_statistics(priv, pkt);
 
        memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));