| From 501fd9895c1d7d8161ed56698ae2fccb10ef14f5 Mon Sep 17 00:00:00 2001 |
| From: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| Date: Thu, 8 May 2014 12:15:22 +0300 |
| Subject: iwlwifi: pcie: try to get ownership several times |
| |
| From: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| |
| commit 501fd9895c1d7d8161ed56698ae2fccb10ef14f5 upstream. |
| |
| Some races with the hardware can happen when we take |
| ownership of the device. Don't give up after the first try. |
| |
| Reviewed-by: Johannes Berg <johannes.berg@intel.com> |
| Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/wireless/iwlwifi/pcie/trans.c | 30 ++++++++++++++++++------------ |
| 1 file changed, 18 insertions(+), 12 deletions(-) |
| |
| --- a/drivers/net/wireless/iwlwifi/pcie/trans.c |
| +++ b/drivers/net/wireless/iwlwifi/pcie/trans.c |
| @@ -339,6 +339,7 @@ static int iwl_pcie_prepare_card_hw(stru |
| { |
| int ret; |
| int t = 0; |
| + int iter; |
| |
| IWL_DEBUG_INFO(trans, "iwl_trans_prepare_card_hw enter\n"); |
| |
| @@ -347,18 +348,23 @@ static int iwl_pcie_prepare_card_hw(stru |
| if (ret >= 0) |
| return 0; |
| |
| - /* If HW is not ready, prepare the conditions to check again */ |
| - iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG, |
| - CSR_HW_IF_CONFIG_REG_PREPARE); |
| - |
| - do { |
| - ret = iwl_pcie_set_hw_ready(trans); |
| - if (ret >= 0) |
| - return 0; |
| - |
| - usleep_range(200, 1000); |
| - t += 200; |
| - } while (t < 150000); |
| + for (iter = 0; iter < 10; iter++) { |
| + /* If HW is not ready, prepare the conditions to check again */ |
| + iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG, |
| + CSR_HW_IF_CONFIG_REG_PREPARE); |
| + |
| + do { |
| + ret = iwl_pcie_set_hw_ready(trans); |
| + if (ret >= 0) |
| + return 0; |
| + |
| + usleep_range(200, 1000); |
| + t += 200; |
| + } while (t < 150000); |
| + msleep(25); |
| + } |
| + |
| + IWL_DEBUG_INFO(trans, "got NIC after %d iterations\n", iter); |
| |
| return ret; |
| } |