On Friday, December 14, 2012 10:52:11 AM Huang Ying wrote: > In > > http://www.mail-archive.com/linux-usb@xxxxxxxxxxxxxxx/msg07976.html > > Ulrich reported that his USB3 cardreader does not work reliably when > connected to the USB3 port. It turns out that USB3 controller failed > to be waken up when plugging in the USB3 cardreader. Further > experiment found that the USB3 host controller can only be waken up > via polling, while not via PME interrupt. But if the PCIe port that > the USB3 host controller is connected is suspended, we can not poll > the USB3 host controller because its config space is not accessible if > the PCIe port is put into low power state. > > To solve the issue, the PCIe port will not be suspended if any > subordinate device need PME polling. > > Reported-by: Ulrich Eckhardt <usb@xxxxxxxxxxxxxxx> > Signed-off-by: Huang Ying <ying.huang@xxxxxxxxx> > Tested-by: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx # 3.6+ > --- > drivers/pci/pcie/portdrv_pci.c | 18 +++++++++++++++++- > 1 file changed, 17 insertions(+), 1 deletion(-) > > --- a/drivers/pci/pcie/portdrv_pci.c > +++ b/drivers/pci/pcie/portdrv_pci.c > @@ -134,10 +134,26 @@ static int pcie_port_runtime_resume(stru > return 0; > } > > +static int pci_dev_pme_poll(struct pci_dev *pdev, void *data) > +{ > + int *pme_poll = data; > + *pme_poll = *pme_poll || pdev->pme_poll; I would write that as *pme_poll ||= pdev->pme_poll; It is not a big deal, though. > + return 0; > +} > + > static int pcie_port_runtime_idle(struct device *dev) > { > + struct pci_dev *pdev = to_pci_dev(dev); > + int pme_poll = false; > + > + /* > + * If any subordinate device needs pme poll, we should keep > + * the port in D0, because we need port in D0 to poll it. > + */ > + pci_walk_bus(pdev->subordinate, pci_dev_pme_poll, &pme_poll); > /* Delay for a short while to prevent too frequent suspend/resume */ > - pm_schedule_suspend(dev, 10); > + if (!pme_poll) > + pm_schedule_suspend(dev, 10); > return -EBUSY; > } > #else Acked-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> -- I speak only for myself. Rafael J. Wysocki, Intel Open Source Technology Center. -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html