• Alan Stern's avatar
    USB: don't stop root-hub status polls too soon · 6d88e679
    Alan Stern authored
    This patch (as1390) fixes a problem that crops up when a UHCI host
    controller is unbound from uhci-hcd while there are still some active
    URBs.  The URBs have to be unlinked when the root hub is unregistered,
    and uhci-hcd relies upon root-hub status polls as part of its
    unlinking procedure.  But usb_hcd_poll_rh_status() won't make those
    status calls if hcd->rh_registered is clear, and the flag is cleared
    _before_ the unregistration takes place.
    
    Since hcd->rh_registered is used for other things and needs to be
    cleared early, the solution is to add a new flag (rh_pollable) and use
    it instead.  It gets cleared _after_ the root hub is unregistered.
    
    Now that the status polls don't end too soon, we have to make sure
    they also don't occur too late -- after the root hub's usb_device
    structure or the HCD's private structures are deallocated.  Therefore
    the patch adds usb_get_device() and usb_put_device() calls to protect
    the root hub structure, and it adds an extra del_timer_sync() to
    prevent the root-hub timer from causing an unexpected status poll.
    
    This additional complexity would not be needed if the HCD framework
    had provided separate stop() and release() callbacks instead of just
    stop().  This lack could be fixed at some future time (although it
    would require changes to every host controller driver); when that
    happens this patch won't be needed any more.
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    6d88e679
hcd.c 70.5 KB