On Wed, Aug 19, 2009 at 07:58:11PM +0800, Matthew Garrett wrote: > On Wed, Aug 19, 2009 at 03:24:19PM +0800, Shaohua Li wrote: > > > +static inline void npme_enable_pme(struct pci_dev *pdev, bool enable) > > +{ > > + int pos; > > + u16 rtctl; > > + > > + pos = pci_find_capability(pdev, PCI_CAP_ID_EXP); > > + > > + pci_read_config_word(pdev, pos + PCI_EXP_RTCTL, &rtctl); > > + if (!enable) > > + rtctl &= ~PCI_EXP_RTCTL_PMEIE; > > + else > > + rtctl |= PCI_EXP_RTCTL_PMEIE; > > + pci_write_config_word(pdev, pos + PCI_EXP_RTCTL, rtctl); > > +} > > This seems to duplicate the existing pci_pme_active() function? No, these registers are completely different. pci_pme_active is to handle the PM capability regiser. This routine is to handle the PCI express capability. > > +static inline void npme_clear_pme(struct pci_dev *pdev) > > +{ > > + int pos; > > + u32 rtsta; > > + > > + pos = pci_find_capability(pdev, PCI_CAP_ID_EXP); > > + > > + pci_read_config_dword(pdev, pos + PCI_EXP_RTSTA, &rtsta); > > + rtsta |= PCI_EXP_RTSTA_PME; > > + pci_write_config_dword(pdev, pos + PCI_EXP_RTSTA, rtsta); > > +} > > Ditto. Ditto. > > +static bool npme_pme_target(struct pci_dev *target) > > +{ > > + bool ret = false; > > + if (target->dev.bus->pm && target->dev.bus->pm->wakeup_event) > > + ret = target->dev.bus->pm->wakeup_event(&target->dev); > > + return ret; > > +} > > Is there any situation in which we wouldn't want to just perform a > runtime resume of the device here? The devices pcie-to-pci bridge can send wakeup event, but the event might use root port or the bridge pci id, so can't directly send the event to the device. Surely we can move the logic in my patch 3 here if we don't want to duplicate code, and then we can directly perform a runtime resume for target devices. Thanks, Shaohua _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm