Re: [RFC] fix asus_hides_smbus_lpc_ich6() for resume

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux