linux/drivers/usb/dwc2
Gregory Herrero 2e84da6e34 usb: dwc2: host: kill remaining urbs using -ECONNRESET status
On a disconnect, dwc2 will kill all remaining urbs from qh list.
urbs are given back to hcd with -ETIMEDOUT status.
Some usb device driver, like mass storage, will unlink all urbs
using usb_hcd_unlink_urb when receiving a negative status different
from -ECONNRESET.
The following flow will then happen:
dwc2_hcd_disconnect()
-> dwc2_kill_all_urbs() try to kill first pending urb.
-> dwc2_host_complete(-ETIMEDOUT)
-> usb_hcd_giveback_urb(-ETIMEDOUT)
-> sg_complete()
-> usb_unlink_urb()
	-> usb_put_dev(urb->dev)
-> dwc2_kill_all_urbs() try to kill next pending urb.
-> dwc2_host_complete(-ETIMEDOUT)
-> usb_hcd_giveback_urb(-ETIMEDOUT)
-> NULL pointer dereferencing because urb->dev has been freed for all
urbs of this device.

The root cause of this NULL pointer is to call call usb_unlink_urb()
while we are killing all urbs. To avoid this return urb with
-ECONNRESET status

This issue usually happens while removing mass storage device during
transfer.

Signed-off-by: Gregory Herrero <gregory.herrero@intel.com>
Signed-off-by: Mian Yousaf Kaukab <yousaf.kaukab@intel.com>
Tested-by: Robert Baldyga <r.baldyga@samsung.com>
Tested-by: Dinh Nguyen <dinguyen@opensource.altera.com>
Tested-by: John Youn <johnyoun@synopsys.com>
Acked-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
2015-10-01 12:40:18 -05:00
..
core_intr.c usb: dwc2: host: ignore wakeup interrupt if hibernation supported 2015-10-01 12:40:16 -05:00
core.c usb: dwc2: host: clear pending interrupts prior hibernation 2015-10-01 12:40:17 -05:00
core.h usb: dwc2: host: add flag to reflect bus state 2015-10-01 12:40:15 -05:00
debug.h usb: dwc2: move debugfs code to a separate file 2015-04-29 15:18:25 -05:00
debugfs.c usb: dwc2: Use platform endianness when accessing registers 2015-09-27 10:54:31 -05:00
gadget.c usb: dwc2: Use platform endianness when accessing registers 2015-09-27 10:54:31 -05:00
hcd_ddma.c usb: dwc2: Use platform endianness when accessing registers 2015-09-27 10:54:31 -05:00
hcd_intr.c usb: dwc2: Use platform endianness when accessing registers 2015-09-27 10:54:31 -05:00
hcd_queue.c usb: dwc2: host: use correct frame number during qh init 2015-10-01 12:40:18 -05:00
hcd.c usb: dwc2: host: kill remaining urbs using -ECONNRESET status 2015-10-01 12:40:18 -05:00
hcd.h usb: dwc2: Use platform endianness when accessing registers 2015-09-27 10:54:31 -05:00
hw.h usb: dwc2: gadget: replace constants with defines 2015-01-30 10:34:11 -06:00
Kconfig usb: dwc2: remove dwc2_platform.ko 2015-04-29 15:20:11 -05:00
Makefile usb: dwc2: remove dwc2_platform.ko 2015-04-29 15:20:11 -05:00
pci.c usb: dwc2: pci: Add device mode to the dwc2-pci driver 2015-03-11 15:08:17 -05:00
platform.c usb: common: of_usb_get_dr_mode to usb_get_dr_mode 2015-09-27 10:54:31 -05:00