2007/8/7, Rafael J. Wysocki <rjw@xxxxxxx>: > On Monday, 6 August 2007 17:50, Joonwoo Park wrote: > > 2007/8/6, Rafael J. Wysocki <rjw@xxxxxxx>: > > > On Monday, 6 August 2007 15:42, Joonwoo Park wrote: > > > > Hi. > > > > I think that the pci_set_power_state() has bug. > > > > The specification says that some delays is required. > > > > > > And they are in place, AFAICS (from drivers/pci/pci.c): > > > > > > /* Mandatory power management transition delays */ > > > /* see PCI PM 1.1 5.6.1 table 18 */ > > > if (state == PCI_D3hot || dev->current_state == PCI_D3hot) > > > msleep(pci_pm_d3_delay); > > > else if (state == PCI_D2 || dev->current_state == PCI_D2) > > > udelay(200); > > > > > > > The problem is occurred when state is 'PCI_D0', so those codes can't cover it. > > But pci pm specification 5.4.1 says that when programmed to D0 the > > equivalent of a warm reset, delay for the duration of the D3hot to D0 > > Uninitialized state > > transition (10ms) to pci signal drivers remain disabled is required. > > Section 5.4.1 of PCI PM 1.1. spec is about D3_hot. Specifically, it says > that if a device in D3_hot is programmed to D0, it performs the equivalent of > a warm reset. IOW, this is supposed to happen if the current state is D3_hot > and the targed state is D0, which is covered by the code snippet above. IMHO, it is seems to the spec says just *programmed to D0* not *programmed from D3hot to D0*. Actually, I got current_state UNKNOWN and state PCI_D0 after kexec's start new kernel with dual port 82546EB fiber ethernet card. > > Greetings, > Rafael > > > -- > "Premature optimization is the root of all evil." - Donald Knuth > Simon, this patch was checked with checkpatch.pl and fixed some fault. Signed-off-by: Joonwoo Park <joonwpark81@xxxxxxxxx> --- drivers/pci/pci.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 37c00f6..0f086d9 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -467,7 +467,8 @@ pci_set_power_state(struct pci_dev *dev, pci_power_t state) /* Mandatory power management transition delays */ /* see PCI PM 1.1 5.6.1 table 18 */ - if (state == PCI_D3hot || dev->current_state == PCI_D3hot) + if (state == PCI_D3hot || dev->current_state == PCI_D3hot || + state == PCI_D0) msleep(pci_pm_d3_delay); else if (state == PCI_D2 || dev->current_state == PCI_D2) udelay(200); - Best regards, Joonwoo Park. _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm