forked from Minki/linux
USB: add check to detect host controller hardware removal
This patch (as1391) fixes a problem that can occur when USB host controller hardware is hot-unplugged. If no interrupts are generated by the unplug then the HCD may not realize that the controller is gone, and the subsequent unbind may hang waiting for interrupts that never arrive. The solution (for PCI-based controllers) is to call the HCD's interrupt handler at the start of usb_hcd_pci_remove(). If the hardware is gone, the handler will realize this when it tries to read the controller's status register. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
6d88e67925
commit
c548795abe
@ -292,6 +292,14 @@ void usb_hcd_pci_remove(struct pci_dev *dev)
|
||||
if (!hcd)
|
||||
return;
|
||||
|
||||
/* Fake an interrupt request in order to give the driver a chance
|
||||
* to test whether the controller hardware has been removed (e.g.,
|
||||
* cardbus physical eject).
|
||||
*/
|
||||
local_irq_disable();
|
||||
usb_hcd_irq(0, hcd);
|
||||
local_irq_enable();
|
||||
|
||||
usb_remove_hcd(hcd);
|
||||
if (hcd->driver->flags & HCD_MEMORY) {
|
||||
iounmap(hcd->regs);
|
||||
|
Loading…
Reference in New Issue
Block a user