On Mon, 29 Nov 2004, David Brownell wrote: > > And don't say this should never happen! Intel UHCI controllers send IRQs > > for port-change events when the controller is suspended, but not when it > > is running. > > But clearly, UHCI can't use such a solution!
If you mean UHCI can't use a static flag, yes, I agree. But it can use a scheme in which it explicitly calls mod_timer and del_timer. > > Come to think of it, since the timer itself is directly accessible in the > > hcd structure, we don't need these API calls at all. The driver can > > simply call mod_timer, del_timer, and del_timer_sync. > > That might be a better solution all around; though I'm not > currently clear on when they'd be called. The biggest question in my mind is whether the core should start the timer by default when the root hub is registered. I suppose that could be controlled by a simple flag. Otherwise, for UHCI at least, things aren't too difficult: Stop the timer when entering any of the root-hub-suspended states, if IRQs work (they don't with the Genesys GL880S!); Synchronously stop the timer when entering the HC suspended state; Start the timer on other state transitions. > > It's a problem of synchronization. root_hub->state doesn't get changed to > > USB_STATE_SUSPENDED at the right time (i.e., while holding the spinlock I > > described above). I'm concerned about races occurring during the actual > > transitions, because there are at least three independent pathways for > > changing the state: > > > > HCD root-hub autosuspend triggered by an HCD-private timer, > > ... or maybe the one provided by usbcore ... That would work too, if the HCD used polling. > > HCD root-hub autoresume because of non-zero status during > > rh status check (triggered by poll timer or IRQ), and > > > > usbcore suspend/resume running in process context with the > > root hub locked. > > If all the hcd->state changes are spinlocked by the HCD, then usbcore > can ignore the issues. Yes. Usbcore should pretty much ignore the issues anyway. > > You are correct that RH_SUSPENDED should be invisible to usbcore. Since > > drivers will need to know about it, > > Why is that? The driver has to act differently depending on whether it's in the root-hub-suspended state (i.e., HCD autosuspend) or usbcore-suspended state. When hub_status_data() indicates an event has occurred, in the first case the HCD has to resume the root hub transparently, and in the second it has to ask khubd to call usb_resume_device for the root hub. The second case can be handled automatically by usbcore, but the HCD still has to distinguish the two cases. > > be a good common place to store it. But never mind, I'll make all this > > stuff private to uhci-hcd. > > OHCI has a formal state model (reused by, of all things, > the isp1x6x chips) that's likewise not known to usbcore. So there's a good precedent. Alan Stern ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://productguide.itmanagersjournal.com/ _______________________________________________ [EMAIL PROTECTED] To unsubscribe, use the last form field at: https://lists.sourceforge.net/lists/listinfo/linux-usb-devel