On Thu, 9 Aug 2007, Zephaniah E. Hull wrote:

> I'll try to keep this making sense, but I'm going to have to reply to
> things slightly out of order.

Thanks for the detailed reply.

> On Thu, Aug 09, 2007 at 11:27:02AM -0400, Alan Stern wrote:
> > On Thu, 9 Aug 2007, Zephaniah E. Hull wrote:
> > 
> > > OHCI isn't coming back on the OLPC after resume.
> > > 
> > > After a bit of testing, the problem seems to have come down to two points.
> > > 
> > > The first is that ohci_pci_resume is not forcing the root hub to be 
> > > resumed
> > > properly, that's a fairly trivial and obviously correct patch.
> > 
> > Can you be more specific?  What exactly goes wrong?
> 
> The first problem is pretty noticeable, ohci_rh_resume never gets called.
> 
> The chain roughly goes usb_resume_both -> usb_resume_device ->
> generic_resume (some indirection here) -> hcd_bus_resume ->
> ohci_rh_resume (some indirection here too).
> 
> usb_resume_device has an interesting check, if udev->state !=
> USB_STATE_SUSPENED or if udev->reset_resume is false, then it silently
---------------------^

That's an &&, not an ||.  Unless somehow it got changed in your version 
of the code...

> decides not to pass things down the chain, without a failure. (Note that
> udev is usb_device, the joy of confusing naming.)
> 
> This is quite possibly a bug,

It certainly would be a bug if somebody changed it from "and" to "or".  
Is that the cause of your problem?

>  since a few lines down in the same
> function it checks for a quirk, USB_QUIRK_RESET_RESUME, and sets
> reset_resume to 1 if it's there.  This code has no impact, since it's
> never reached if reset_resume isn't already 1.

Go back and look at the routine again.  Maybe you just misread the 
first test.


> > > The second is trickier, ohci_rh_resume is getting called in a state that 
> > > it
> > > thinks is an indication that it's coming back from a SUSPEND where it did 
> > > not
> > > lose power.
> > 
> > You mean ohci->regs->control doesn't contain OHCI_USB_RESET in the 
> > appropriate bits?  What does it contain?  And why?
> 
> ohci->hc_control & OHCI_CTRL_HCFS == OHCI_USB_SUSPEND, and I honestly
> don't have the foggiest clue how or why it has that after coming back
> from the chip being powered off.
> 
> My best guess is that somewhere else in the resume path we're resetting
> it, but that's only a guess and I have no idea why anything would do
> that.

Nothing should.  You might want to add a debugging printk to
ohci_pci_resume() or prepare_for_handover() to see what the value is at
the start of the resume.  Maybe the firmware sets it incorrectly before 
the driver does anything.

> Infact, grepping through the source tree, the only thing setting
> OHCI_USB_SUSPEND is ohci_rh_suspend, which would have happened prior to
> turning off the device.
> 
> My guess is that something is blindly restoring from ohci->hc_control
> without first reading in the value.

Maybe, but nothing capable of doing that should get called before 
ohci_rh_resume().

Alan Stern


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to