Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 193812
b: refs/heads/master
c: fa8f130
h: refs/heads/master
v: v3
  • Loading branch information
Wey-Yi Guy authored and Reinette Chatre committed Mar 19, 2010
1 parent 170747b commit 11c7ef7
Show file tree
Hide file tree
Showing 7 changed files with 86 additions and 41 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d5a0ffa3eaf9e898f25a925813f1a723be7808f8
refs/heads/master: fa8f130c504223d25c116b3d23787f465dfb1317
3 changes: 2 additions & 1 deletion trunk/drivers/net/wireless/iwlwifi/iwl-1000.c
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ 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,
.check_plcp_health = iwl_good_plcp_health,
.check_ack_health = iwl_good_ack_health,
};

static const struct iwl_ops iwl1000_ops = {
Expand Down
2 changes: 1 addition & 1 deletion trunk/drivers/net/wireless/iwlwifi/iwl-4965.c
Original file line number Diff line number Diff line change
Expand Up @@ -2221,7 +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,
.check_plcp_health = iwl_good_plcp_health,
};

static const struct iwl_ops iwl4965_ops = {
Expand Down
6 changes: 4 additions & 2 deletions trunk/drivers/net/wireless/iwlwifi/iwl-5000.c
Original file line number Diff line number Diff line change
Expand Up @@ -1500,7 +1500,8 @@ 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,
.check_plcp_health = iwl_good_plcp_health,
.check_ack_health = iwl_good_ack_health,
};

static struct iwl_lib_ops iwl5150_lib = {
Expand Down Expand Up @@ -1556,7 +1557,8 @@ 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,
.check_plcp_health = iwl_good_plcp_health,
.check_ack_health = iwl_good_ack_health,
};

static const struct iwl_ops iwl5000_ops = {
Expand Down
6 changes: 4 additions & 2 deletions trunk/drivers/net/wireless/iwlwifi/iwl-6000.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@ 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,
.check_plcp_health = iwl_good_plcp_health,
.check_ack_health = iwl_good_ack_health,
};

static const struct iwl_ops iwl6000_ops = {
Expand Down Expand Up @@ -346,7 +347,8 @@ 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,
.check_plcp_health = iwl_good_plcp_health,
.check_ack_health = iwl_good_ack_health,
};

static const struct iwl_ops iwl6050_ops = {
Expand Down
11 changes: 8 additions & 3 deletions trunk/drivers/net/wireless/iwlwifi/iwl-core.h
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,11 @@ 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,
/* check for plcp health */
bool (*check_plcp_health)(struct iwl_priv *priv,
struct iwl_rx_packet *pkt);
/* check for ack health */
bool (*check_ack_health)(struct iwl_priv *priv,
struct iwl_rx_packet *pkt);
};

Expand Down Expand Up @@ -437,7 +440,9 @@ 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,
bool iwl_good_plcp_health(struct iwl_priv *priv,
struct iwl_rx_packet *pkt);
bool iwl_good_ack_health(struct iwl_priv *priv,
struct iwl_rx_packet *pkt);
void iwl_rx_statistics(struct iwl_priv *priv,
struct iwl_rx_mem_buffer *rxb);
Expand Down
97 changes: 66 additions & 31 deletions trunk/drivers/net/wireless/iwlwifi/iwl-rx.c
Original file line number Diff line number Diff line change
Expand Up @@ -621,24 +621,18 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv,
#define BA_TIMEOUT_CNT (5)
#define BA_TIMEOUT_MAX (16)

#define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n"
/*
* This function checks for plcp error, ACK count ratios, aggregated BA
* timeout retries.
* - When the ACK count ratio is 0 and aggregated BA timeout retries is
* exceeding the BA_TIMEOUT_MAX, it will recover the failure by resetting
* the firmware.
* - When the plcp error is exceeding the thresholds, it will reset the radio
* to improve the throughput.
/**
* iwl_good_ack_health - checks for ACK count ratios, BA timeout retries.
*
* When the ACK count ratio is 0 and aggregated BA timeout retries exceeding
* the BA_TIMEOUT_MAX, reload firmware and bring system back to normal
* operation state.
*/
void iwl_recover_from_statistics(struct iwl_priv *priv,
struct iwl_rx_packet *pkt)
bool iwl_good_ack_health(struct iwl_priv *priv,
struct iwl_rx_packet *pkt)
{
int combined_plcp_delta;
unsigned int plcp_msec;
unsigned long plcp_received_jiffies;
int actual_ack_cnt_delta;
int expected_ack_cnt_delta;
bool rc = true;
int actual_ack_cnt_delta, expected_ack_cnt_delta;
int ba_timeout_delta;

actual_ack_cnt_delta =
Expand Down Expand Up @@ -669,13 +663,27 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
#endif
IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n",
ba_timeout_delta);
if ((actual_ack_cnt_delta == 0) &&
(ba_timeout_delta >= BA_TIMEOUT_MAX)) {
IWL_DEBUG_RADIO(priv,
"call iwl_force_reset(IWL_FW_RESET)\n");
iwl_force_reset(priv, IWL_FW_RESET);
}
if (!actual_ack_cnt_delta &&
(ba_timeout_delta >= BA_TIMEOUT_MAX))
rc = false;
}
return rc;
}
EXPORT_SYMBOL(iwl_good_ack_health);

/**
* iwl_good_plcp_health - checks for plcp error.
*
* When the plcp error is exceeding the thresholds, reset the radio
* to improve the throughput.
*/
bool iwl_good_plcp_health(struct iwl_priv *priv,
struct iwl_rx_packet *pkt)
{
bool rc = true;
int combined_plcp_delta;
unsigned int plcp_msec;
unsigned long plcp_received_jiffies;

/*
* check for plcp_err and trigger radio reset if it exceeds
Expand Down Expand Up @@ -710,23 +718,51 @@ void iwl_recover_from_statistics(struct iwl_priv *priv,
* combined_plcp_delta,
* plcp_msec
*/
IWL_DEBUG_RADIO(priv, PLCP_MSG,
IWL_DEBUG_RADIO(priv, "plcp_err exceeded %u, "
"%u, %u, %u, %u, %d, %u mSecs\n",
priv->cfg->plcp_delta_threshold,
le32_to_cpu(pkt->u.stats.rx.ofdm.plcp_err),
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),
combined_plcp_delta, plcp_msec);
/*
* Reset the RF radio due to the high plcp
* error rate
*/
iwl_force_reset(priv, IWL_RF_RESET);
rc = false;
}
}
return rc;
}
EXPORT_SYMBOL(iwl_good_plcp_health);

static void iwl_recover_from_statistics(struct iwl_priv *priv,
struct iwl_rx_packet *pkt)
{
if (test_bit(STATUS_EXIT_PENDING, &priv->status))
return;
if (iwl_is_associated(priv)) {
if (priv->cfg->ops->lib->check_ack_health) {
if (!priv->cfg->ops->lib->check_ack_health(
priv, pkt)) {
/*
* low ack count detected
* restart Firmware
*/
IWL_ERR(priv, "low ack count detected, "
"restart firmware\n");
iwl_force_reset(priv, IWL_FW_RESET);
}
} else if (priv->cfg->ops->lib->check_plcp_health) {
if (!priv->cfg->ops->lib->check_plcp_health(
priv, pkt)) {
/*
* high plcp error detected
* reset Radio
*/
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)
Expand All @@ -748,8 +784,7 @@ void iwl_rx_statistics(struct iwl_priv *priv,
#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);
iwl_recover_from_statistics(priv, pkt);

memcpy(&priv->statistics, &pkt->u.stats, sizeof(priv->statistics));

Expand Down

0 comments on commit 11c7ef7

Please sign in to comment.