[..]
> If the hub driver is unbound, then the system won't be able to use the
> hub very well.  In particular, connect changes won't be detected.  On
> the other hand, devices that were plugged into the hub may still be
> electronically accessible.  The cleanest way to handle this is to
> disable all the in-use ports and call usb_disconnect() for their

No, disconnect() must not differentiate between soft and hard unplug.
Just disconnect() the children.

> children.  However, it's a little questionable how we can do this.
> Once a driver's disconnect() is called, the driver isn't supposed to
> communicate with the device any more.  By a quirk of the
> implementation we don't enforce this restriction for endpoint 0, which
> is all the hub driver needs for disabling all the ports.  Relying on
> such quirks generally isn't a good idea, although this could
> reasonably be considered a special case.

If you feel that the hub driver needs to be special cased at all,
then disallow soft disconnect entirely for hubs. That's the cleanest
thing to do.
 
> Of course, we can't disable the ports if the hub is suspended.  I
> think the only way to deal with this complication is to check
> initially whether a device is suspended, and if it is, disallow
> unbinding or configuration changes.  That's for all devices, not just

config changes, definitely yes. Unbinding, no.

> hubs.  As an additional complication, we _can't_ disallow unbinding
> when a driver is being unloaded.  We have to let it unbind from its
> interface -- even though we won't be able to set the interface back to
> altsetting 0 afterwards.  (Luckily this part of the problem doesn't
> affect the hub driver; it can't be unloaded unless all the usb_devices
> are already gone.)

Isn't a driver that's not switching to altsetting 0 in its suspend() buggy?

> As a related matter, we also should disallow probing of interfaces on
> suspended devices.  This won't be difficult, but it means a
> newly-loaded driver might not be able to bind to all the interfaces it
> should control.  I think that's unavoidable.

Yes.

> Now let's discuss error recovery.  First, consider what sorts of
> errors might occur.  One that the hub driver already checks for is 10
> or more consecutive failures of the status interrupt URB (period is
> 256 ms).  Another, highly critical sort of error (not currently
> handled) is failure of a hub to disable a port upon request.  Finally,

Retry, reset, power down. If need be, recursively.
Not that it is a high priority.

> although not an error in the hub itself, is the possibility of rapid
> repeated cycling of the connection status of a port -- as might happen
> with a device that fails during initial probing, drops its connection,
> re-establishes it, and repeats...
> 
> Errors of the first two sorts are best dealt with by resetting the
> hub.  Should the user be given a chance to do something first?  And if
> so, what could the user do?  Unplugging the hub seems to be the only
> course of action, and that's even more drastic than resetting.

Yes.

> The code that resets hubs for error recovery isn't working now;
> usb_reset_device() won't accept a hub as an argument.  The issue, of
> course, is that when the hub is reset so are all its ports.  Thus it's
> necessary to call usb_disconect() for all the child devices before
> resetting the hub.
> 
> (In principle we could get around this.  If there were an addition to the 
> API for usb_drivers, a notification function for warning about impending 
> resets, then we could simply notify all the children's drivers.  But there 
> isn't such an API, and it's not likely to arrive during 2.6.)

There is. Suspend() and resume().

[..] 
> Then there's always the possibility that the reset will itself fail.
> The only ways this can happen are if the hub is suspended or
> unplugged, or if we can't determine which port it plugs into in the
> parent.  That last possibility is a "This can't happen" sort of thing,
> so I will ignore it.  Failing to reset a hub that is unplugged is
> understandable, of course.  What about failure to reset a suspended

The attempt should not be tried. It should fail.
But hubs can develop malfunctions. Reset can fail.
It can even fail with ENOMEM.

        Regards
                Oliver


-------------------------------------------------------
This SF.Net email sponsored by Black Hat Briefings & Training.
Attend Black Hat Briefings & Training, Las Vegas July 24-29 - 
digital self defense, top technical experts, no vendor pitches, 
unmatched networking opportunities. Visit www.blackhat.com
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to