aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-agn.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c25
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h14
3 files changed, 33 insertions, 12 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
index 52b6beb371fe..c5b724eaf306 100644
--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
+++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
@@ -3378,6 +3378,12 @@ static int iwl_init_drv(struct iwl_priv *priv)
3378 priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; 3378 priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF;
3379 priv->agg_tids_count = 0; 3379 priv->agg_tids_count = 0;
3380 3380
3381 /* initialize force reset */
3382 priv->force_reset[IWL_RF_RESET].reset_duration =
3383 IWL_DELAY_NEXT_FORCE_RF_RESET;
3384 priv->force_reset[IWL_FW_RESET].reset_duration =
3385 IWL_DELAY_NEXT_FORCE_FW_RELOAD;
3386
3381 /* Choose which receivers/antennas to use */ 3387 /* Choose which receivers/antennas to use */
3382 if (priv->cfg->ops->hcmd->set_rxon_chain) 3388 if (priv->cfg->ops->hcmd->set_rxon_chain)
3383 priv->cfg->ops->hcmd->set_rxon_chain(priv); 3389 priv->cfg->ops->hcmd->set_rxon_chain(priv);
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index bd56827b8fef..55252a692de7 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -3357,22 +3357,30 @@ static void iwl_force_rf_reset(struct iwl_priv *priv)
3357 return; 3357 return;
3358} 3358}
3359 3359
3360#define IWL_DELAY_NEXT_FORCE_RESET (HZ*3)
3361 3360
3362int iwl_force_reset(struct iwl_priv *priv, int mode) 3361int iwl_force_reset(struct iwl_priv *priv, int mode)
3363{ 3362{
3363 struct iwl_force_reset *force_reset;
3364
3364 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) 3365 if (test_bit(STATUS_EXIT_PENDING, &priv->status))
3365 return -EINVAL; 3366 return -EINVAL;
3366 3367
3367 if (priv->last_force_reset_jiffies && 3368 if (mode >= IWL_MAX_FORCE_RESET) {
3368 time_after(priv->last_force_reset_jiffies + 3369 IWL_DEBUG_INFO(priv, "invalid reset request.\n");
3369 IWL_DELAY_NEXT_FORCE_RESET, jiffies)) { 3370 return -EINVAL;
3371 }
3372 force_reset = &priv->force_reset[mode];
3373 force_reset->reset_request_count++;
3374 if (force_reset->last_force_reset_jiffies &&
3375 time_after(force_reset->last_force_reset_jiffies +
3376 force_reset->reset_duration, jiffies)) {
3370 IWL_DEBUG_INFO(priv, "force reset rejected\n"); 3377 IWL_DEBUG_INFO(priv, "force reset rejected\n");
3378 force_reset->reset_reject_count++;
3371 return -EAGAIN; 3379 return -EAGAIN;
3372 } 3380 }
3373 3381 force_reset->reset_success_count++;
3382 force_reset->last_force_reset_jiffies = jiffies;
3374 IWL_DEBUG_INFO(priv, "perform force reset (%d)\n", mode); 3383 IWL_DEBUG_INFO(priv, "perform force reset (%d)\n", mode);
3375
3376 switch (mode) { 3384 switch (mode) {
3377 case IWL_RF_RESET: 3385 case IWL_RF_RESET:
3378 iwl_force_rf_reset(priv); 3386 iwl_force_rf_reset(priv);
@@ -3389,12 +3397,7 @@ int iwl_force_reset(struct iwl_priv *priv, int mode)
3389 clear_bit(STATUS_READY, &priv->status); 3397 clear_bit(STATUS_READY, &priv->status);
3390 queue_work(priv->workqueue, &priv->restart); 3398 queue_work(priv->workqueue, &priv->restart);
3391 break; 3399 break;
3392 default:
3393 IWL_DEBUG_INFO(priv, "invalid reset request.\n");
3394 return -EINVAL;
3395 } 3400 }
3396 priv->last_force_reset_jiffies = jiffies;
3397
3398 return 0; 3401 return 0;
3399} 3402}
3400 3403
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index 021c68658718..7914d65a5a55 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1036,9 +1036,21 @@ struct iwl_event_log {
1036#define IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF (200) 1036#define IWL_MAX_PLCP_ERR_EXT_LONG_THRESHOLD_DEF (200)
1037#define IWL_MAX_PLCP_ERR_THRESHOLD_MAX (255) 1037#define IWL_MAX_PLCP_ERR_THRESHOLD_MAX (255)
1038 1038
1039#define IWL_DELAY_NEXT_FORCE_RF_RESET (HZ*3)
1040#define IWL_DELAY_NEXT_FORCE_FW_RELOAD (HZ*5)
1041
1039enum iwl_reset { 1042enum iwl_reset {
1040 IWL_RF_RESET = 0, 1043 IWL_RF_RESET = 0,
1041 IWL_FW_RESET, 1044 IWL_FW_RESET,
1045 IWL_MAX_FORCE_RESET,
1046};
1047
1048struct iwl_force_reset {
1049 int reset_request_count;
1050 int reset_success_count;
1051 int reset_reject_count;
1052 unsigned long reset_duration;
1053 unsigned long last_force_reset_jiffies;
1042}; 1054};
1043 1055
1044struct iwl_priv { 1056struct iwl_priv {
@@ -1076,7 +1088,7 @@ struct iwl_priv {
1076 u8 agg_tids_count; 1088 u8 agg_tids_count;
1077 1089
1078 /* force reset */ 1090 /* force reset */
1079 unsigned long last_force_reset_jiffies; 1091 struct iwl_force_reset force_reset[IWL_MAX_FORCE_RESET];
1080 1092
1081 /* we allocate array of iwl4965_channel_info for NIC's valid channels. 1093 /* we allocate array of iwl4965_channel_info for NIC's valid channels.
1082 * Access via channel # using indirect index array */ 1094 * Access via channel # using indirect index array */