diff options
author | Reinette Chatre <reinette.chatre@intel.com> | 2010-02-23 17:02:52 -0500 |
---|---|---|
committer | Reinette Chatre <reinette.chatre@intel.com> | 2010-02-23 17:02:52 -0500 |
commit | ab9bdc34d68dafc6fea0ba733231f1c9696ce9c4 (patch) | |
tree | 594f6df57abaae7e4f5c07a841d0603dcb2be1fb /drivers/net/wireless | |
parent | 4a6967b88af02eebeedfbb91bc09160750225bb5 (diff) |
Revert "iwlwifi: Monitor and recover the aggregation TX flow failure"
This reverts commit 1db5950f1d0b82e07371b211a48317b8972da063.
The goal of "iwlwifi: Monitor and recover the aggregation TX flow failure"
is to first detect when data transmission stalls and then to recover from
this situation with a reset of the radio or the firmware, depending on how
bad the transmission failures are.
Unfortunately we have found that this change causes excessive resets with
its current detection algorithm. It also performs its recovery action when
none is really needed, like when we are not associated.
Revert this change until the issues have been addressed.
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-rx.c | 46 |
3 files changed, 1 insertions, 62 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index c5b724eaf306..1fac015efc19 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2941,21 +2941,10 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw, | |||
2941 | return ret; | 2941 | return ret; |
2942 | case IEEE80211_AMPDU_TX_START: | 2942 | case IEEE80211_AMPDU_TX_START: |
2943 | IWL_DEBUG_HT(priv, "start Tx\n"); | 2943 | IWL_DEBUG_HT(priv, "start Tx\n"); |
2944 | ret = iwl_tx_agg_start(priv, sta->addr, tid, ssn); | 2944 | return iwl_tx_agg_start(priv, sta->addr, tid, ssn); |
2945 | if (ret == 0) { | ||
2946 | priv->agg_tids_count++; | ||
2947 | IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n", | ||
2948 | priv->agg_tids_count); | ||
2949 | } | ||
2950 | return ret; | ||
2951 | case IEEE80211_AMPDU_TX_STOP: | 2945 | case IEEE80211_AMPDU_TX_STOP: |
2952 | IWL_DEBUG_HT(priv, "stop Tx\n"); | 2946 | IWL_DEBUG_HT(priv, "stop Tx\n"); |
2953 | ret = iwl_tx_agg_stop(priv, sta->addr, tid); | 2947 | ret = iwl_tx_agg_stop(priv, sta->addr, tid); |
2954 | if ((ret == 0) && (priv->agg_tids_count > 0)) { | ||
2955 | priv->agg_tids_count--; | ||
2956 | IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n", | ||
2957 | priv->agg_tids_count); | ||
2958 | } | ||
2959 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 2948 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
2960 | return 0; | 2949 | return 0; |
2961 | else | 2950 | else |
@@ -3376,7 +3365,6 @@ static int iwl_init_drv(struct iwl_priv *priv) | |||
3376 | priv->iw_mode = NL80211_IFTYPE_STATION; | 3365 | priv->iw_mode = NL80211_IFTYPE_STATION; |
3377 | priv->current_ht_config.smps = IEEE80211_SMPS_STATIC; | 3366 | priv->current_ht_config.smps = IEEE80211_SMPS_STATIC; |
3378 | priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; | 3367 | priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; |
3379 | priv->agg_tids_count = 0; | ||
3380 | 3368 | ||
3381 | /* initialize force reset */ | 3369 | /* initialize force reset */ |
3382 | priv->force_reset[IWL_RF_RESET].reset_duration = | 3370 | priv->force_reset[IWL_RF_RESET].reset_duration = |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 7914d65a5a55..ab891b958042 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -1084,9 +1084,6 @@ struct iwl_priv { | |||
1084 | /* storing the jiffies when the plcp error rate is received */ | 1084 | /* storing the jiffies when the plcp error rate is received */ |
1085 | unsigned long plcp_jiffies; | 1085 | unsigned long plcp_jiffies; |
1086 | 1086 | ||
1087 | /* reporting the number of tids has AGG on. 0 means no AGGREGATION */ | ||
1088 | u8 agg_tids_count; | ||
1089 | |||
1090 | /* force reset */ | 1087 | /* force reset */ |
1091 | struct iwl_force_reset force_reset[IWL_MAX_FORCE_RESET]; | 1088 | struct iwl_force_reset force_reset[IWL_MAX_FORCE_RESET]; |
1092 | 1089 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index fed554accedc..aba8f4c20c1b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
@@ -616,11 +616,6 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv, | |||
616 | 616 | ||
617 | #define REG_RECALIB_PERIOD (60) | 617 | #define REG_RECALIB_PERIOD (60) |
618 | 618 | ||
619 | /* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */ | ||
620 | #define ACK_CNT_RATIO (50) | ||
621 | #define BA_TIMEOUT_CNT (5) | ||
622 | #define BA_TIMEOUT_MAX (16) | ||
623 | |||
624 | #define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n" | 619 | #define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n" |
625 | void iwl_rx_statistics(struct iwl_priv *priv, | 620 | void iwl_rx_statistics(struct iwl_priv *priv, |
626 | struct iwl_rx_mem_buffer *rxb) | 621 | struct iwl_rx_mem_buffer *rxb) |
@@ -630,9 +625,6 @@ void iwl_rx_statistics(struct iwl_priv *priv, | |||
630 | int combined_plcp_delta; | 625 | int combined_plcp_delta; |
631 | unsigned int plcp_msec; | 626 | unsigned int plcp_msec; |
632 | unsigned long plcp_received_jiffies; | 627 | unsigned long plcp_received_jiffies; |
633 | int actual_ack_cnt_delta; | ||
634 | int expected_ack_cnt_delta; | ||
635 | int ba_timeout_delta; | ||
636 | 628 | ||
637 | IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n", | 629 | IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n", |
638 | (int)sizeof(priv->statistics), | 630 | (int)sizeof(priv->statistics), |
@@ -647,44 +639,6 @@ void iwl_rx_statistics(struct iwl_priv *priv, | |||
647 | #ifdef CONFIG_IWLWIFI_DEBUG | 639 | #ifdef CONFIG_IWLWIFI_DEBUG |
648 | iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats); | 640 | iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats); |
649 | #endif | 641 | #endif |
650 | actual_ack_cnt_delta = le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) - | ||
651 | le32_to_cpu(priv->statistics.tx.actual_ack_cnt); | ||
652 | expected_ack_cnt_delta = le32_to_cpu( | ||
653 | pkt->u.stats.tx.expected_ack_cnt) - | ||
654 | le32_to_cpu(priv->statistics.tx.expected_ack_cnt); | ||
655 | ba_timeout_delta = le32_to_cpu( | ||
656 | pkt->u.stats.tx.agg.ba_timeout) - | ||
657 | le32_to_cpu(priv->statistics.tx.agg.ba_timeout); | ||
658 | if ((priv->agg_tids_count > 0) && | ||
659 | (expected_ack_cnt_delta > 0) && | ||
660 | (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta) < | ||
661 | ACK_CNT_RATIO) && | ||
662 | (ba_timeout_delta > BA_TIMEOUT_CNT)) { | ||
663 | IWL_DEBUG_RADIO(priv, | ||
664 | "actual_ack_cnt delta = %d, expected_ack_cnt = %d\n", | ||
665 | actual_ack_cnt_delta, expected_ack_cnt_delta); | ||
666 | |||
667 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
668 | IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n", | ||
669 | priv->delta_statistics.tx.rx_detected_cnt); | ||
670 | IWL_DEBUG_RADIO(priv, | ||
671 | "ack_or_ba_timeout_collision delta = %d\n", | ||
672 | priv->delta_statistics.tx.ack_or_ba_timeout_collision); | ||
673 | #endif | ||
674 | IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n", | ||
675 | ba_timeout_delta); | ||
676 | if ((actual_ack_cnt_delta == 0) && | ||
677 | (ba_timeout_delta >= | ||
678 | BA_TIMEOUT_MAX)) { | ||
679 | IWL_DEBUG_RADIO(priv, | ||
680 | "call iwl_force_reset(IWL_FW_RESET)\n"); | ||
681 | iwl_force_reset(priv, IWL_FW_RESET); | ||
682 | } else { | ||
683 | IWL_DEBUG_RADIO(priv, | ||
684 | "call iwl_force_reset(IWL_RF_RESET)\n"); | ||
685 | iwl_force_reset(priv, IWL_RF_RESET); | ||
686 | } | ||
687 | } | ||
688 | /* | 642 | /* |
689 | * check for plcp_err and trigger radio reset if it exceeds | 643 | * check for plcp_err and trigger radio reset if it exceeds |
690 | * the plcp error threshold plcp_delta. | 644 | * the plcp error threshold plcp_delta. |