linux/drivers/usb/core
Alan Stern 6d88e67925 USB: don't stop root-hub status polls too soon
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: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2010-08-10 14:35:33 -07:00
..
buffer.c USB: make hcd.h public (drivers dependency) 2010-05-20 13:21:30 -07:00
config.c USB: remove the usb_host_ss_ep_comp structure 2010-05-20 13:21:40 -07:00
devices.c USB: devices: fix Coding Styles 2010-05-20 13:21:38 -07:00
devio.c USB: make hcd.h public (drivers dependency) 2010-05-20 13:21:30 -07:00
driver.c USB: obey the sysfs power/wakeup setting 2010-06-30 08:16:06 -07:00
endpoint.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
file.c include cleanup: Update gfp.h and slab.h includes to prepare for breaking implicit slab.h inclusion from percpu.h 2010-03-30 22:02:32 +09:00
generic.c USB: make hcd.h public (drivers dependency) 2010-05-20 13:21:30 -07:00
hcd-pci.c USB: make hcd.h public (drivers dependency) 2010-05-20 13:21:30 -07:00
hcd.c USB: don't stop root-hub status polls too soon 2010-08-10 14:35:33 -07:00
hub.c USB: Fix USB3.0 Port Speed Downgrade after port reset 2010-07-26 12:00:58 -07:00
inode.c USB: make hcd.h public (drivers dependency) 2010-05-20 13:21:30 -07:00
Kconfig USB: fix build on OMAPs if CONFIG_PM_RUNTIME is not set 2010-04-30 09:25:11 -07:00
Makefile USB: add the usbfs devices file to debugfs 2009-06-15 21:44:43 -07:00
message.c USB: fix oops in usb_sg_init() 2010-06-30 08:16:06 -07:00
notify.c
otg_whitelist.h
quirks.c USB: add quirk for Broadcom BT dongle 2010-07-26 12:00:58 -07:00
sysfs.c sysfs: add struct file* to bin_attr callbacks 2010-05-21 09:37:31 -07:00
urb.c USB: Add a usb_pipe_endpoint() convenience function 2010-05-20 13:21:41 -07:00
usb.c drivers/base: Convert dev->sem to mutex 2010-05-21 09:37:30 -07:00
usb.h USB: convert to the runtime PM framework 2010-03-02 14:54:12 -08:00