linux/drivers/usb/storage
Alan Stern 2db5726475 usb-storage: handle a skipped data phase
commit 93c9bf4d18 upstream.

Sometimes mass-storage devices using the Bulk-only transport will
mistakenly skip the data phase of a command.  Rather than sending the
data expected by the host or sending a zero-length packet, they go
directly to the status phase and send the CSW.

This causes problems for usb-storage, for obvious reasons.  The driver
will interpret the CSW as a short data transfer and will wait to
receive a CSW.  The device won't have anything left to send, so the
command eventually times out.

The SCSI layer doesn't retry commands after they time out (this is a
relatively recent change).  Therefore we should do our best to detect
a skipped data phase and handle it promptly.

This patch adds code to do that.  If usb-storage receives a short
13-byte data transfer from the device, and if the first four bytes of
the data match the CSW signature, the driver will set the residue to
the full transfer length and interpret the data as a CSW.

This fixes Bugzilla #86611.

Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
CC: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
Tested-by: Paul Osmialowski <newchief@king.net.pl>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2014-11-14 09:00:07 -08:00
..
alauda.c usb: storage: alauda: initialize variables directly 2013-05-16 17:48:28 -07:00
cypress_atacb.c usb-storage: CY7C68300A chips do not support Cypress ATACB 2013-04-23 10:08:13 -07:00
datafab.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
debug.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
debug.h usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
ene_ub6250.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
freecom.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
initializers.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
initializers.h USB: storage: fix Huawei mode switching regression 2013-03-07 12:23:17 +08:00
isd200.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
jumpshot.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
karma.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
Kconfig usb-storage: enable multi-LUN scanning when needed 2014-02-04 12:59:15 -08:00
Makefile usb: remove libusual 2012-09-05 17:21:36 -07:00
onetouch.c usb: delete non-required instances of include <linux/init.h> 2014-01-08 15:01:39 -08:00
option_ms.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
option_ms.h USB: unusual dev for Option N.V. ZeroCD modems 2009-01-07 10:00:09 -08:00
protocol.c USB: storage: fix compile warning 2013-12-09 23:45:39 -08:00
protocol.h USB: usb-storage: merge ATAPI and QIC-157 protocol routines 2009-01-07 09:59:57 -08:00
realtek_cr.c USB: usb-stor: realtek_cr: Fix compile error 2013-05-16 17:28:27 -07:00
scsiglue.c usb-storage: enable multi-LUN scanning when needed 2014-02-04 12:59:15 -08:00
scsiglue.h USB: remove CVS keywords 2008-07-21 15:15:55 -07:00
sddr09.c usb: storage: sddr09: initialize variables directly 2013-05-16 17:48:28 -07:00
sddr55.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
shuttle_usbat.c usb: storage: shuttle_usbat: fix discs being detected twice 2014-06-07 10:28:15 -07:00
sierra_ms.c usb: storage: Convert US_DEBUGP to usb_stor_dbg 2013-04-19 11:46:50 -07:00
sierra_ms.h USB Storage Sierra: TRU-Install feature update 2008-08-13 17:32:51 -07:00
transport.c usb-storage: handle a skipped data phase 2014-11-14 09:00:07 -08:00
transport.h usb/storage: a couple defines from drivers/usb/storage/transport.h to include/linux/usb/storage.h 2012-02-28 11:05:18 -08:00
uas.c usb-uas: set max_lun and max_channel 2013-01-25 09:56:54 -08:00
unusual_alauda.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_cypress.h usb-storage: restrict bcdDevice range for Super Top in Cypress ATACB 2014-02-04 12:59:14 -08:00
unusual_datafab.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_devs.h USB: storage: Add quirks for Entrega/Xircom USB to SCSI converters 2014-10-05 14:52:15 -07:00
unusual_ene_ub6250.h Staging: Merge ENE UB6250 SD card codes from keucr to drivers/usb/storage 2011-03-07 13:40:59 -08:00
unusual_freecom.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_isd200.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_jumpshot.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_karma.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_onetouch.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_realtek.h usb-storage: fix up the unusual_realtek device list 2011-05-17 11:56:28 -07:00
unusual_sddr09.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_sddr55.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
unusual_usbat.h USB: storage: Use USB_ prefix instead of US_ prefix 2010-10-22 10:21:49 -07:00
usb.c usb: delete non-required instances of include <linux/init.h> 2014-01-08 15:01:39 -08:00
usb.h usb-storage: fix freezing of the scanning thread 2012-02-21 16:29:15 -08:00
usual-tables.c USB: storage: Define a new macro for USB storage match rules 2013-02-04 10:40:16 -08:00