Re: 2.6.13-mm2

Daniel Ritz
2005-09-28T20:05:47Z

On Friday 23 September 2005 18.52, Rafael J. Wysocki wrote:
> Hi,
>
> [sorry for the delay]

[same :]

>
> On Sunday, 18 of September 2005 23:49, Daniel Ritz wrote:
> ]--snip--[
> > >
> > > BTW, please have a look at:
> > > http://bugzilla.kernel.org/show_bug.cgi?id=4416#c36
> > > and
> > > http://bugzilla.kernel.org/show_bug.cgi?id=4416#c37
> > >
> >
> > interesting. i'd say we get interrupt storms from usb which then hurt when
> > yenta has it's handler installed but usb has not. usb/hcd-pci.c frees the
> > irq on suspend...so it may be enough not to do that (survives suspend-to-ram
> > and suspend-to-disk here. yes, restore too :)
> >
> > could you give that a tree w/o any free_irq-patches for yenta and co?
>
> I've tried and it apparently works provided that _none_ of the IRQ-sharing
> devices drops the IRQ on suspend.

ok. i didn't look too close, but i think ohci-hcd does not fully disable interrupts
in it's suspend callback...needs a closer look. cc:ing linux-usb-devel...

>
> I think that's the whole point: Either all of the devices should drop/request
> IRQs on suspend/resume, or none of them should do this. IMHO we need to
> chose one of these options and call it "the right way" or there always
> will be problems with this.
>

cc:ing linus since he seems to have a strong opinion about that free_irq-in-suspend
thing...not doing it for USB fixes the problem for both cases: APM suspend and ACPI
suspend...

> Greetings,
> Rafael

rgds
-daniel

>
>
> > diff --git a/drivers/usb/core/hcd-pci.c b/drivers/usb/core/hcd-pci.c
> > --- a/drivers/usb/core/hcd-pci.c
> > +++ b/drivers/usb/core/hcd-pci.c
> > @@ -242,7 +242,9 @@ int usb_hcd_pci_suspend (struct pci_dev
> > case HC_STATE_SUSPENDED:
> > /* no DMA or IRQs except when HC is active */
> > if (dev->current_state == PCI_D0) {
> > +#if 0
> > free_irq (hcd->irq, hcd);
> > +#endif
> > pci_save_state (dev);
> > pci_disable_device (dev);
> > }
> > @@ -374,6 +376,7 @@ int usb_hcd_pci_resume (struct pci_dev *
> >
> > hcd->state = HC_STATE_RESUMING;
> > hcd->saw_irq = 0;
> > +#if 0
> > retval = request_irq (dev->irq, usb_hcd_irq, SA_SHIRQ,
> > hcd->irq_descr, hcd);
> > if (retval < 0) {
> > @@ -382,6 +385,7 @@ int usb_hcd_pci_resume (struct pci_dev *
> > usb_hc_died (hcd);
> > return retval;
> > }
> > +#endif
> >
> > retval = hcd->driver->resume (hcd);
> > if (!HC_IS_RUNNING (hcd->state)) {
> >
> >
>