On Fri, Aug 16, 2019 at 07:50:40PM +0300, Sergey Miroshnichenko wrote: > The PCI_COMMAND_IO and PCI_COMMAND_MEMORY bits of the bridge must be > updated not only when enabling the bridge for the first time, but also if a > hotplugged device requests these types of resources. Yeah, this assumption that pci_is_enabled() means PCI_COMMAND_IO and PCI_COMMAND_MEMORY are set correctly even though we may now need *different* settings than when we incremented pdev->enable_cnt is quite broken. > Originally these bits were set by the pci_enable_device_flags() only, which > exits early if the bridge is already pci_is_enabled(). So if the bridge was > empty initially (an edge case), then hotplugged devices fail to IO/MEM. > > Signed-off-by: Sergey Miroshnichenko <s.miroshnichenko@xxxxxxxxx> > --- > drivers/pci/pci.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c > index e7f8c354e644..61d951766087 100644 > --- a/drivers/pci/pci.c > +++ b/drivers/pci/pci.c > @@ -1652,6 +1652,14 @@ static void pci_enable_bridge(struct pci_dev *dev) > pci_enable_bridge(bridge); > > if (pci_is_enabled(dev)) { > + int i, bars = 0; > + > + for (i = PCI_BRIDGE_RESOURCES; i < DEVICE_COUNT_RESOURCE; i++) { > + if (dev->resource[i].flags & (IORESOURCE_MEM | IORESOURCE_IO)) > + bars |= (1 << i); > + } > + do_pci_enable_device(dev, bars); > + > if (!dev->is_busmaster) > pci_set_master(dev); > mutex_unlock(&dev->enable_mutex); > -- > 2.21.0 >