On Sun, 28 Nov 2004, David Brownell wrote:

> Hi Alan,

Hi!

> On Sunday 28 November 2004 08:30, Alan Stern wrote:
> > 
> > I suspect that root-hub polling shouldn't be controlled by flags within
> > the hcd structure.  The state transitions are under the control of the
> > driver, so it would be wrong to make the core responsible for following
> > those transitions and adjusting the polling to match.  
> 
> It works today though ... why wouldn't a flag "use root hub timer"
> suffice?

Suppose the flag was clear so the timer wasn't running, but then the 
driver decides that it wants to start polling.  Setting a flag won't be 
enough to start the timer...

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.


> >      Instead we can add 
> > some new core routines:
> > 
> >     usb_hcd_enable_rh_polling(),
> >     usb_hcd_disable_rh_polling(),
> >     usb_hcd_disable_rh_polling_sync().
> > 
> > (The last is intended for when the HC is suspended and we need to be sure 
> > no poll requests will arrive while the registers are inaccessible.)
> 
> I really don't see a need for that variant.  If polling is
> disabled, it's disabled -- and if registers aren't available,
> it had better be disabled!  Note that those routines imply
> the existence of a flag.  (Except for the "no registers" one!)
> 
> Having a functional API to enable/disable the polling would
> be fine, if the calls were accessible in_irq().

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.


> > To go along with this, the following HC states are appropriate for UHCI:
> > 
> >     HCD_STATE_STOPPED,
> >     HCD_STATE_RUNNING,
> >     HCD_STATE_RH_SUSPENDED,
> >     HCD_STATE_CORE_SUSPENDED,
> >     HCD_STATE_HC_SUSPENDED,
> >     HCD_STATE_DEAD.
> > 
> > Along with those states there needs to be an IN_TRANSIT modifier, 
> > because controllers take some time to change their state (for instance, a 
> > controller won't stop from a RUNNING state until the current transaction 
> > has completed).  There also needs to be a spinlock to protect the state.
> 
> The existing model has a TRANSIENT flag, and at one time there was
> a locking framework.  The (re)initialization sequences probably need
> as much work as anything else though.
> 
>  
> > Is this outline appropriate for other HCs as well as UHCI?  Should it
> > replace the collection of states you have already set up in the hcd
> > structure?  Or should it remain in the private uhci_hcd structure?
> 
> If you really need them -- then internal to UHCI.  But I don't see
> why you should need new states ... CORE_SUSPENDED would imply
> that root_dev->state == USB_STATE_SUSPENDED, RH_SUSPENDED should
> be invisible to usbcore, and I think RUNNING and DEAD are clear
> matches for the existing RUNNING and HALT.

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,

        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.

You are correct that RH_SUSPENDED should be invisible to usbcore.  Since
drivers will need to know about it, and thought the hcd structure might 
be a good common place to store it.  But never mind, I'll make all this 
stuff private to uhci-hcd.

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

Reply via email to