diff mbox series

[05/12] iwlwifi: pcie: try to grab NIC access early

Message ID iwlwifi.20210331121101.5b807533b0c0.I07b58a5c9238f75413a91198452ba1268ee79425@changeid
State Superseded
Delegated to: Luca Coelho
Headers show
Series iwlwifi: updates intended for v5.13 2021-03-31 | expand

Commit Message

Luca Coelho March 31, 2021, 9:14 a.m. UTC
From: Johannes Berg <johannes.berg@intel.com>

Sometimes some NICs may fail to initialize, but if we have
such a scenario we may only see an alive timeout (i.e. the
firmware doesn't send us the alive message), and that will
only cause us to fail the interface up.

Try to once grab NIC access during device probe to ensure
we can properly talk to the hardware at all, and to do all
the potential workarounds in that function.

Since we now finish NIC init here, we can remove it from
the later potential read of the RF ID.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
---
 drivers/net/wireless/intel/iwlwifi/pcie/drv.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

Comments

Luca Coelho April 12, 2021, 10:22 a.m. UTC | #1
On Wed, 2021-03-31 at 12:14 +0300, Luca Coelho wrote:
> From: Johannes Berg <johannes.berg@intel.com>
> 
> Sometimes some NICs may fail to initialize, but if we have
> such a scenario we may only see an alive timeout (i.e. the
> firmware doesn't send us the alive message), and that will
> only cause us to fail the interface up.
> 
> Try to once grab NIC access during device probe to ensure
> we can properly talk to the hardware at all, and to do all
> the potential workarounds in that function.
> 
> Since we now finish NIC init here, we can remove it from
> the later potential read of the RF ID.
> 
> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
> ---

This patch is included in Emmanuel's iwlmei series, so I'll drop it
from this series.

--
Cheers,
Luca.
diff mbox series

Patch

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 8e3fc160e083..3186de93d769 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -1112,6 +1112,24 @@  static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 	trans_pcie = IWL_TRANS_GET_PCIE_TRANS(iwl_trans);
 
+	/*
+	 * Let's try to grab NIC access early here. Sometimes, NICs may
+	 * fail to initialize, and if that happens it's better if we see
+	 * issues early on (and can reprobe, per the logic inside), than
+	 * first trying to load the firmware etc. and potentially only
+	 * detecting any problems when the first interface is brought up.
+	 */
+	ret = iwl_finish_nic_init(iwl_trans, trans);
+	if (ret)
+		goto out_free_trans;
+	if (iwl_trans_grab_nic_access(iwl_trans)) {
+		/* all good */
+		iwl_trans_release_nic_access(iwl_trans);
+	} else {
+		ret = -EIO;
+		goto out_free_trans;
+	}
+
 	iwl_trans->hw_rf_id = iwl_read32(iwl_trans, CSR_HW_RF_ID);
 
 	for (i = 0; i < ARRAY_SIZE(iwl_dev_info_table); i++) {