Message ID | iwlwifi.20210331121101.5b807533b0c0.I07b58a5c9238f75413a91198452ba1268ee79425@changeid |
---|---|
State | New |
Headers | show |
Series | iwlwifi: updates intended for v5.13 2021-03-31 | expand |
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 --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++) {