iwlwifi: pcie: handle pcim_iomap_table() failures better
authorJohannes Berg <johannes.berg@intel.com>
Sat, 12 Jun 2021 11:32:39 +0000 (14:32 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Tue, 22 Jun 2021 12:11:12 +0000 (15:11 +0300)
pcim_iomap_table() might return NULL, so we shouldn't unconditionally
dereference the return value by taking the [0] entry.

Handle this better by checking for NULL first, and then separately
checking if the [0] entry is NULL.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210612142637.9aa4f0e3574a.I458b283f203d5f927f00be1bfbd4b8ebf11c5ae4@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/pcie/trans.c

index 239bc17..1009e3d 100644 (file)
@@ -3413,6 +3413,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
        struct iwl_trans *trans;
        int ret, addr_size;
        const struct iwl_trans_ops *ops = &trans_ops_pcie_gen2;
+       void __iomem * const *table;
 
        if (!cfg_trans->gen2)
                ops = &trans_ops_pcie;
@@ -3485,9 +3486,16 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
                goto out_no_pci;
        }
 
-       trans_pcie->hw_base = pcim_iomap_table(pdev)[0];
-       if (!trans_pcie->hw_base) {
+       table = pcim_iomap_table(pdev);
+       if (!table) {
                dev_err(&pdev->dev, "pcim_iomap_table failed\n");
+               ret = -ENOMEM;
+               goto out_no_pci;
+       }
+
+       trans_pcie->hw_base = table[0];
+       if (!trans_pcie->hw_base) {
+               dev_err(&pdev->dev, "couldn't find IO mem in first BAR\n");
                ret = -ENODEV;
                goto out_no_pci;
        }