after hot remove a pcie deivce with pci_dn having pnp_php driver attached, pci rescan with echo 1 > /sys/bus/pci/rescan could fail with error message like: pci 0020:0e:00.0: BAR 0: assigned [mem 0x3fe801820000-0x3fe80182ffff 64bit] nvme nvme1: pci function 0020:0e:00.0 nvme 0020:0e:00.0 pci_enable_device() blocked, no PE assigned.
It appears that the pci_dn object is reused with only pe_number clobbered in the case. And a simple call to pnv_ioda_setup_dev_PE should get PE number back and solve the problem. Signed-off-by: Luming Yu <luming...@shingroup.cn> --- arch/powerpc/platforms/powernv/pci-ioda.c | 11 +- drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c | 215 ------------------ drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h | 46 ---- include/soc/arc/aux.h | 59 ----- 4 files changed, 9 insertions(+), 322 deletions(-) delete mode 100644 drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.c delete mode 100644 drivers/gpu/drm/nouveau/nvkm/subdev/i2c/aux.h delete mode 100644 include/soc/arc/aux.h diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 28fac4770073..9d7add79ee3d 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -2325,11 +2325,18 @@ static resource_size_t pnv_pci_default_alignment(void) static bool pnv_pci_enable_device_hook(struct pci_dev *dev) { struct pci_dn *pdn; + struct pnv_ioda_pe *pe; pdn = pci_get_pdn(dev); - if (!pdn || pdn->pe_number == IODA_INVALID_PE) { - pci_err(dev, "pci_enable_device() blocked, no PE assigned.\n"); + if (!pdn) return false; + + if (pdn->pe_number == IODA_INVALID_PE) { + pe = pnv_ioda_setup_dev_PE(dev); + if (!pe) { + pci_err(dev, "pci_enable_device() blocked, no PE assigned.\n"); + return false; + } } return true;