On Wed, 2008-04-16 at 19:30 +0200, Rafael J. Wysocki wrote: > On Tuesday, 18 of March 2008, Shaohua Li wrote: > > > > On Mon, 2008-03-17 at 17:26 +0100, Rafael J. Wysocki wrote: > > > On Monday, 17 of March 2008, Shaohua Li wrote: > > > > > > > > On Fri, 2008-03-14 at 22:03 +0100, Rafael J. Wysocki wrote: > > > > > On Friday, 14 of March 2008, Jesse Barnes wrote: > > > > > > On Friday, March 14, 2008 7:37 am Rafael J. Wysocki wrote: > > > > > > > On Friday, 14 of March 2008, Shaohua Li wrote: > > > > > > > > On Thu, 2008-03-13 at 21:44 -0700, Greg KH wrote: > > > > > > > > > On Fri, Mar 14, 2008 at 11:49:09AM +0800, Shaohua Li wrote: > > > > > > > > > > diff --git a/include/linux/pci.h b/include/linux/pci.h > > > > > > > > > > index 9010f54..821ad02 100644 > > > > > > > > > > --- a/include/linux/pci.h > > > > > > > > > > +++ b/include/linux/pci.h > > > > > > > > > > @@ -1016,6 +1016,8 @@ enum pci_fixup_pass { > > > > > > > > > > pci_fixup_final, /* Final phase of device fixups */ > > > > > > > > > > pci_fixup_enable, /* pci_enable_device() time */ > > > > > > > > > > pci_fixup_resume, /* pci_enable_device() time */ > > > > > > > > > > + pci_fixup_suspend, > > > > > > > > > > + pci_fixup_resume_later, > > > > > > > > > > > > > > > > > > Please document when these quirks are run. > > > > > > > > > > > > > > > > will do if you think the method is correct. > > > > > > > > > > > > > > > > > And why "_later"? What's wrong with the normal resume time? > > > > > > > > > > > > > > > > pci_fixup_resume is called in pci_device_resume_earily(), which is > > > > > > > > called with interrupt disable, so I added a new one which is called at > > > > > > > > pci_device_resume(), this routine is called with interrupt enabled. > > > > > > > > > > > > > > Is the pci_fixup_resume thing used at all? If it is, how can I check who > > > > > > > uses it? > > > > > > > > > > > > Oh good catch, it looks like it's unused at this point (at least there's no > > > > > > DECLARE_PCI_FIXUP_SUSPEND macro in pci.h), it was probably just put there for > > > > > > completeness. > > > > > > > > > > It seems to be used only in quirks.c . > > > > > > > > > > I'd prefer to rename the existing one to pci_fixup_resume_noirq and define a > > > > > new one called pci_fixup_resume to be used by pci_device_resume(). > > > > > > > > > > Also, it would be worth checking if all of the existing resume quirks need to > > > > > be run with interrupts disabled. > > > > As far as I checked, only this one need interrupt enabled. > > > > > > Still, do all of the others _require_ interrupts to be disabled? > > No, they don't need interrupt disabled, but be called in .resume_early, > > which will disable interrupt. > > > > > > Introducing > > > > pci_fixup_resume_noirq and move the quirk to .resume is feasible in the > > > > case, but it's not quite good to me. The quirk is to make smbus > > > > controller not hide and then smbus can be resumed, the order is > > > > important. If the quirk is called in .resume, that means smbus > > > > controller can't have a .resume_early. The quirk is a FIXUP_HEADER, it > > > > really should be called early, eg in .resume_early. > > > > > > I meant "move all of the other quirks that need to run with interrupts > > > disabled to pci_fixup_resume_noirq, leave those that may run with interrups > > > enabled within pci_fixup_resume and add yours to pci_fixup_resume". > > Just change the name? then I'd prefer use pci_fixup_resume and > > pci_fixup_resume_early. > > > > Some quirks should be called with interrupt disabled, we can't directly > > call them in .resume_early. Also the patch introduces > > pci_fixup_resume_early and pci_fixup_suspend, which matches current > > device core callbacks (.suspend/.resume_early). > > > > TBD: Somebody knows why we need quirk resume should double check if a > > quirk should be called in resume or resume_early. I changed some per my > > understanding, but can't make sure I fixed all. > > What is the current status of this patch. Would you like it to be merged as is > or are you going to modify it? If no objection, I'd like it to be merged. Thanks, Shaohua > > Signed-off-by: Shaohua Li <shaohua.li@xxxxxxxxx> > > diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c > > index e571c72..59307d6 100644 > > --- a/drivers/pci/pci-driver.c > > +++ b/drivers/pci/pci-driver.c > > @@ -289,6 +289,9 @@ static int pci_device_suspend(struct device * dev, pm_message_t state) > > if (pci_dev->current_state == PCI_D0) > > pci_dev->current_state = PCI_UNKNOWN; > > } > > + > > + pci_fixup_device(pci_fixup_suspend, pci_dev); > > + > > return i; > > } > > > > @@ -334,6 +337,7 @@ static int pci_device_resume(struct device * dev) > > error = drv->resume(pci_dev); > > else > > error = pci_default_resume(pci_dev); > > + pci_fixup_device(pci_fixup_resume, pci_dev); > > return error; > > } > > > > @@ -343,7 +347,7 @@ static int pci_device_resume_early(struct device * dev) > > struct pci_dev * pci_dev = to_pci_dev(dev); > > struct pci_driver * drv = pci_dev->driver; > > > > - pci_fixup_device(pci_fixup_resume, pci_dev); > > + pci_fixup_device(pci_fixup_resume_early, pci_dev); > > > > if (drv && drv->resume_early) > > error = drv->resume_early(pci_dev); > > diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c > > index e9a333d..21e9cdb 100644 > > --- a/drivers/pci/quirks.c > > +++ b/drivers/pci/quirks.c > > @@ -556,7 +556,7 @@ static void quirk_via_ioapic(struct pci_dev *dev) > > pci_write_config_byte (dev, 0x58, tmp); > > } > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic); > > > > /* > > * VIA 8237: Some BIOSs don't set the 'Bypass APIC De-Assert Message' Bit. > > @@ -576,7 +576,7 @@ static void quirk_via_vt8237_bypass_apic_deassert(struct pci_dev *dev) > > } > > } > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_vt8237_bypass_apic_deassert); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_vt8237_bypass_apic_deassert); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_vt8237_bypass_apic_deassert); > > > > /* > > * The AMD io apic can hang the box when an apic irq is masked. > > @@ -622,7 +622,7 @@ static void quirk_amd_8131_ioapic(struct pci_dev *dev) > > } > > } > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_BRIDGE, quirk_amd_8131_ioapic); > > #endif /* CONFIG_X86_IO_APIC */ > > > > /* > > @@ -774,7 +774,7 @@ static void quirk_cardbus_legacy(struct pci_dev *dev) > > pci_write_config_dword(dev, PCI_CB_LEGACY_MODE_BASE, 0); > > } > > DECLARE_PCI_FIXUP_FINAL(PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy); > > -DECLARE_PCI_FIXUP_RESUME(PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy); > > > > /* > > * Following the PCI ordering rules is optional on the AMD762. I'm not > > @@ -797,7 +797,7 @@ static void quirk_amd_ordering(struct pci_dev *dev) > > } > > } > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering); > > > > /* > > * DreamWorks provided workaround for Dunord I-3000 problem > > @@ -865,7 +865,7 @@ static void quirk_disable_pxb(struct pci_dev *pdev) > > } > > } > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, quirk_disable_pxb); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, quirk_disable_pxb); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, quirk_disable_pxb); > > > > static void __devinit quirk_amd_ide_mode(struct pci_dev *pdev) > > { > > @@ -885,9 +885,9 @@ static void __devinit quirk_amd_ide_mode(struct pci_dev *pdev) > > } > > } > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP600_SATA, quirk_amd_ide_mode); > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP700_SATA, quirk_amd_ide_mode); > > > > /* > > * Serverworks CSB5 IDE does not fully support native mode > > @@ -1092,31 +1092,61 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asu > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc); > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc); > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, asus_hides_smbus_lpc); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, asus_hides_smbus_lpc); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_0, asus_hides_smbus_lpc); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801CA_12, asus_hides_smbus_lpc); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, asus_hides_smbus_lpc); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801EB_0, asus_hides_smbus_lpc); > > > > -static void asus_hides_smbus_lpc_ich6(struct pci_dev *dev) > > +/* It appears we just have one such device. If not, we have a warning */ > > +static void __iomem *asus_rcba_base; > > +static void asus_hides_smbus_lpc_ich6_suspend(struct pci_dev *dev) > > { > > - u32 val, rcba; > > - void __iomem *base; > > + u32 rcba; > > > > if (likely(!asus_hides_smbus)) > > return; > > + WARN_ON(asus_rcba_base); > > + > > pci_read_config_dword(dev, 0xF0, &rcba); > > - base = ioremap_nocache(rcba & 0xFFFFC000, 0x4000); /* use bits 31:14, 16 kB aligned */ > > - if (base == NULL) return; > > - val=readl(base + 0x3418); /* read the Function Disable register, dword mode only */ > > - writel(val & 0xFFFFFFF7, base + 0x3418); /* enable the SMBus device */ > > - iounmap(base); > > + /* use bits 31:14, 16 kB aligned */ > > + asus_rcba_base = ioremap_nocache(rcba & 0xFFFFC000, 0x4000); > > + if (asus_rcba_base == NULL) > > + return; > > +} > > + > > +static void asus_hides_smbus_lpc_ich6_resume_early(struct pci_dev *dev) > > +{ > > + u32 val; > > + > > + if (likely(!asus_hides_smbus || !asus_rcba_base)) > > + return; > > + /* read the Function Disable register, dword mode only */ > > + val = readl(asus_rcba_base + 0x3418); > > + writel(val & 0xFFFFFFF7, asus_rcba_base + 0x3418); /* enable the SMBus device */ > > +} > > + > > +static void asus_hides_smbus_lpc_ich6_resume(struct pci_dev *dev) > > +{ > > + if (likely(!asus_hides_smbus || !asus_rcba_base)) > > + return; > > + iounmap(asus_rcba_base); > > + asus_rcba_base = NULL; > > dev_info(&dev->dev, "Enabled ICH6/i801 SMBus device\n"); > > } > > + > > +static void asus_hides_smbus_lpc_ich6(struct pci_dev *dev) > > +{ > > + asus_hides_smbus_lpc_ich6_suspend(dev); > > + asus_hides_smbus_lpc_ich6_resume_early(dev); > > + asus_hides_smbus_lpc_ich6_resume(dev); > > +} > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_hides_smbus_lpc_ich6); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_hides_smbus_lpc_ich6); > > +DECLARE_PCI_FIXUP_SUSPEND(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_hides_smbus_lpc_ich6_suspend); > > +DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_hides_smbus_lpc_ich6_resume); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_ICH6_1, asus_hides_smbus_lpc_ich6_resume_early); > > > > /* > > * SiS 96x south bridge: BIOS typically hides SMBus device... > > @@ -1134,10 +1164,10 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_961, quirk_sis_96x_ > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_smbus); > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus); > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_961, quirk_sis_96x_smbus); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_smbus); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_961, quirk_sis_96x_smbus); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_962, quirk_sis_96x_smbus); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_963, quirk_sis_96x_smbus); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC, quirk_sis_96x_smbus); > > > > /* > > * ... This is further complicated by the fact that some SiS96x south > > @@ -1171,7 +1201,7 @@ static void quirk_sis_503(struct pci_dev *dev) > > quirk_sis_96x_smbus(dev); > > } > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503, quirk_sis_503); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503, quirk_sis_503); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503, quirk_sis_503); > > > > > > /* > > @@ -1204,7 +1234,7 @@ static void asus_hides_ac97_lpc(struct pci_dev *dev) > > } > > } > > DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, asus_hides_ac97_lpc); > > > > #if defined(CONFIG_ATA) || defined(CONFIG_ATA_MODULE) > > > > @@ -1269,12 +1299,12 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, qui > > DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata); > > DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata); > > DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, quirk_jmicron_ata); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB360, quirk_jmicron_ata); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, quirk_jmicron_ata); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, quirk_jmicron_ata); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, quirk_jmicron_ata); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, quirk_jmicron_ata); > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, quirk_jmicron_ata); > > > > #endif > > > > @@ -1521,6 +1551,10 @@ extern struct pci_fixup __start_pci_fixups_enable[]; > > extern struct pci_fixup __end_pci_fixups_enable[]; > > extern struct pci_fixup __start_pci_fixups_resume[]; > > extern struct pci_fixup __end_pci_fixups_resume[]; > > +extern struct pci_fixup __start_pci_fixups_resume_early[]; > > +extern struct pci_fixup __end_pci_fixups_resume_early[]; > > +extern struct pci_fixup __start_pci_fixups_suspend[]; > > +extern struct pci_fixup __end_pci_fixups_suspend[]; > > > > > > void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev) > > @@ -1553,6 +1587,16 @@ void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev) > > end = __end_pci_fixups_resume; > > break; > > > > + case pci_fixup_resume_early: > > + start = __start_pci_fixups_resume_early; > > + end = __end_pci_fixups_resume_early; > > + break; > > + > > + case pci_fixup_suspend: > > + start = __start_pci_fixups_suspend; > > + end = __end_pci_fixups_suspend; > > + break; > > + > > default: > > /* stupid compiler warning, you would think with an enum... */ > > return; > > @@ -1629,7 +1673,7 @@ static void quirk_nvidia_ck804_pcie_aer_ext_cap(struct pci_dev *dev) > > } > > DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, > > quirk_nvidia_ck804_pcie_aer_ext_cap); > > -DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, > > +DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_CK804_PCIE, > > quirk_nvidia_ck804_pcie_aer_ext_cap); > > > > static void __devinit quirk_via_cx700_pci_parking_caching(struct pci_dev *dev) > > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h > > index f054778..cf108a3 100644 > > --- a/include/asm-generic/vmlinux.lds.h > > +++ b/include/asm-generic/vmlinux.lds.h > > @@ -84,6 +84,12 @@ > > VMLINUX_SYMBOL(__start_pci_fixups_resume) = .; \ > > *(.pci_fixup_resume) \ > > VMLINUX_SYMBOL(__end_pci_fixups_resume) = .; \ > > + VMLINUX_SYMBOL(__start_pci_fixups_resume_early) = .; \ > > + *(.pci_fixup_resume_early) \ > > + VMLINUX_SYMBOL(__end_pci_fixups_resume_early) = .; \ > > + VMLINUX_SYMBOL(__start_pci_fixups_suspend) = .; \ > > + *(.pci_fixup_suspend) \ > > + VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \ > > } \ > > \ > > /* RapidIO route ops */ \ > > diff --git a/include/linux/pci.h b/include/linux/pci.h > > index b7e4b63..ec68b45 100644 > > --- a/include/linux/pci.h > > +++ b/include/linux/pci.h > > @@ -1015,7 +1015,9 @@ enum pci_fixup_pass { > > pci_fixup_header, /* After reading configuration header */ > > pci_fixup_final, /* Final phase of device fixups */ > > pci_fixup_enable, /* pci_enable_device() time */ > > - pci_fixup_resume, /* pci_enable_device() time */ > > + pci_fixup_resume, /* pci_device_resume() */ > > + pci_fixup_suspend, /* pci_device_suspend */ > > + pci_fixup_resume_early, /* pci_device_resume_early() */ > > }; > > > > /* Anonymous variables would be nice... */ > > @@ -1037,6 +1039,12 @@ enum pci_fixup_pass { > > #define DECLARE_PCI_FIXUP_RESUME(vendor, device, hook) \ > > DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume, \ > > resume##vendor##device##hook, vendor, device, hook) > > +#define DECLARE_PCI_FIXUP_RESUME_EARLY(vendor, device, hook) \ > > + DECLARE_PCI_FIXUP_SECTION(.pci_fixup_resume_early, \ > > + resume_early##vendor##device##hook, vendor, device, hook) > > +#define DECLARE_PCI_FIXUP_SUSPEND(vendor, device, hook) \ > > + DECLARE_PCI_FIXUP_SECTION(.pci_fixup_suspend, \ > > + suspend##vendor##device##hook, vendor, device, hook) > > > > > > void pci_fixup_device(enum pci_fixup_pass pass, struct pci_dev *dev); > > > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html > > > > > > > -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html