wifi: iwlwifi: pcie: rescan bus if no parent
authorJohannes Berg <johannes.berg@intel.com>
Wed, 13 Sep 2023 11:56:37 +0000 (14:56 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 13 Sep 2023 14:11:09 +0000 (16:11 +0200)
If the bus has no parent due to the topology, the device rescan
(after some kind of reset was detected) wouldn't work. On the
other hand, some platforms appear to require scanning the parent,
though it's not clear why.

However if there's no parent, then we skip the rescan, which isn't a
good idea. Change the code to go to the parent only if that exists,
and rescan the bus itself where it doesn't.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230913145231.f7795a1ccdab.I2b84810a743469a1bcabf3628262cf54311593f4@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/pcie/trans.c

index a9e00a2cd9ba1ec94c5c752489a4b043258771c7..51012435e39b5b082193d3ace87748a43eef323d 100644 (file)
@@ -2112,8 +2112,11 @@ static void iwl_trans_pcie_removal_wk(struct work_struct *wk)
        pci_lock_rescan_remove();
        pci_dev_put(pdev);
        pci_stop_and_remove_bus_device(pdev);
-       if (removal->rescan)
-               pci_rescan_bus(bus->parent);
+       if (removal->rescan && bus) {
+               if (bus->parent)
+                       bus = bus->parent;
+               pci_rescan_bus(bus);
+       }
        pci_unlock_rescan_remove();
 
        kfree(removal);