diff options
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn-lib.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 29 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 1 |
3 files changed, 15 insertions, 18 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c index 8216e5ca918b..e202a40cbcb7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c | |||
@@ -2306,8 +2306,7 @@ int iwlagn_start_device(struct iwl_priv *priv) | |||
2306 | { | 2306 | { |
2307 | int ret; | 2307 | int ret; |
2308 | 2308 | ||
2309 | iwl_prepare_card_hw(priv); | 2309 | if (iwl_prepare_card_hw(priv)) { |
2310 | if (!priv->hw_ready) { | ||
2311 | IWL_WARN(priv, "Exit HW not ready\n"); | 2310 | IWL_WARN(priv, "Exit HW not ready\n"); |
2312 | return -EIO; | 2311 | return -EIO; |
2313 | } | 2312 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index f30735b656c0..a4f1009cb137 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2367,9 +2367,10 @@ static void iwl_down(struct iwl_priv *priv) | |||
2367 | 2367 | ||
2368 | #define HW_READY_TIMEOUT (50) | 2368 | #define HW_READY_TIMEOUT (50) |
2369 | 2369 | ||
2370 | /* Note: returns poll_bit return value, which is >= 0 if success */ | ||
2370 | static int iwl_set_hw_ready(struct iwl_priv *priv) | 2371 | static int iwl_set_hw_ready(struct iwl_priv *priv) |
2371 | { | 2372 | { |
2372 | int ret = 0; | 2373 | int ret; |
2373 | 2374 | ||
2374 | iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG, | 2375 | iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG, |
2375 | CSR_HW_IF_CONFIG_REG_BIT_NIC_READY); | 2376 | CSR_HW_IF_CONFIG_REG_BIT_NIC_READY); |
@@ -2379,25 +2380,21 @@ static int iwl_set_hw_ready(struct iwl_priv *priv) | |||
2379 | CSR_HW_IF_CONFIG_REG_BIT_NIC_READY, | 2380 | CSR_HW_IF_CONFIG_REG_BIT_NIC_READY, |
2380 | CSR_HW_IF_CONFIG_REG_BIT_NIC_READY, | 2381 | CSR_HW_IF_CONFIG_REG_BIT_NIC_READY, |
2381 | HW_READY_TIMEOUT); | 2382 | HW_READY_TIMEOUT); |
2382 | if (ret != -ETIMEDOUT) | ||
2383 | priv->hw_ready = true; | ||
2384 | else | ||
2385 | priv->hw_ready = false; | ||
2386 | 2383 | ||
2387 | IWL_DEBUG_INFO(priv, "hardware %s\n", | 2384 | IWL_DEBUG_INFO(priv, "hardware%s ready\n", ret < 0 ? " not" : ""); |
2388 | (priv->hw_ready == 1) ? "ready" : "not ready"); | ||
2389 | return ret; | 2385 | return ret; |
2390 | } | 2386 | } |
2391 | 2387 | ||
2388 | /* Note: returns standard 0/-ERROR code */ | ||
2392 | int iwl_prepare_card_hw(struct iwl_priv *priv) | 2389 | int iwl_prepare_card_hw(struct iwl_priv *priv) |
2393 | { | 2390 | { |
2394 | int ret = 0; | 2391 | int ret; |
2395 | 2392 | ||
2396 | IWL_DEBUG_INFO(priv, "iwl_prepare_card_hw enter\n"); | 2393 | IWL_DEBUG_INFO(priv, "iwl_prepare_card_hw enter\n"); |
2397 | 2394 | ||
2398 | ret = iwl_set_hw_ready(priv); | 2395 | ret = iwl_set_hw_ready(priv); |
2399 | if (priv->hw_ready) | 2396 | if (ret >= 0) |
2400 | return ret; | 2397 | return 0; |
2401 | 2398 | ||
2402 | /* If HW is not ready, prepare the conditions to check again */ | 2399 | /* If HW is not ready, prepare the conditions to check again */ |
2403 | iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG, | 2400 | iwl_set_bit(priv, CSR_HW_IF_CONFIG_REG, |
@@ -2407,10 +2404,13 @@ int iwl_prepare_card_hw(struct iwl_priv *priv) | |||
2407 | ~CSR_HW_IF_CONFIG_REG_BIT_NIC_PREPARE_DONE, | 2404 | ~CSR_HW_IF_CONFIG_REG_BIT_NIC_PREPARE_DONE, |
2408 | CSR_HW_IF_CONFIG_REG_BIT_NIC_PREPARE_DONE, 150000); | 2405 | CSR_HW_IF_CONFIG_REG_BIT_NIC_PREPARE_DONE, 150000); |
2409 | 2406 | ||
2410 | /* HW should be ready by now, check again. */ | 2407 | if (ret < 0) |
2411 | if (ret != -ETIMEDOUT) | 2408 | return ret; |
2412 | iwl_set_hw_ready(priv); | ||
2413 | 2409 | ||
2410 | /* HW should be ready by now, check again. */ | ||
2411 | ret = iwl_set_hw_ready(priv); | ||
2412 | if (ret >= 0) | ||
2413 | return 0; | ||
2414 | return ret; | 2414 | return ret; |
2415 | } | 2415 | } |
2416 | 2416 | ||
@@ -3741,8 +3741,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
3741 | * PCI Tx retries from interfering with C3 CPU state */ | 3741 | * PCI Tx retries from interfering with C3 CPU state */ |
3742 | pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00); | 3742 | pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00); |
3743 | 3743 | ||
3744 | iwl_prepare_card_hw(priv); | 3744 | if (iwl_prepare_card_hw(priv)) { |
3745 | if (!priv->hw_ready) { | ||
3746 | IWL_WARN(priv, "Failed, HW not ready\n"); | 3745 | IWL_WARN(priv, "Failed, HW not ready\n"); |
3747 | goto out_iounmap; | 3746 | goto out_iounmap; |
3748 | } | 3747 | } |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 857eb0e9e397..197fa742f79a 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -1503,7 +1503,6 @@ struct iwl_priv { | |||
1503 | struct timer_list statistics_periodic; | 1503 | struct timer_list statistics_periodic; |
1504 | struct timer_list ucode_trace; | 1504 | struct timer_list ucode_trace; |
1505 | struct timer_list watchdog; | 1505 | struct timer_list watchdog; |
1506 | bool hw_ready; | ||
1507 | 1506 | ||
1508 | struct iwl_event_log event_log; | 1507 | struct iwl_event_log event_log; |
1509 | 1508 | ||