diff mbox series

[01/15] wifi: iwlwifi: pcie: rescan bus if no parent

Message ID 20230913145231.f7795a1ccdab.I2b84810a743469a1bcabf3628262cf54311593f4@changeid (mailing list archive)
State Accepted
Delegated to: Johannes Berg
Headers show
Series wifi: iwlwifi: updates - 2023-09-13 | expand

Commit Message

Greenman, Gregory Sept. 13, 2023, 11:56 a.m. UTC
From: Johannes Berg <johannes.berg@intel.com>

If the bus has no parent due to the topology, platform level device
reset (PLDR) 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>
---
 drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

Comments

Johannes Berg Sept. 13, 2023, 12:37 p.m. UTC | #1
On Wed, 2023-09-13 at 14:56 +0300, gregory.greenman@intel.com wrote:
> From: Johannes Berg <johannes.berg@intel.com>
> 
> If the bus has no parent due to the topology, platform level device
> reset (PLDR) wouldn't work.

I learned later that this description is really pretty much wrong - it
shouldn't really reference PLDR at all, that's not what's going on
here. It should be talking about just the rescanning not working, or so,
that's the only part here that matters.

Anyway, I can fix it when I commit it, just wanted to state it in public
and not just silently do it.

johannes
diff mbox series

Patch

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index a9e00a2cd9ba..51012435e39b 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -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);