• Alan Stern's avatar
    usb-storage: handle a skipped data phase · e074cc2a
    Alan Stern authored
    commit 93c9bf4d 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: default avatarAlan Stern <stern@rowland.harvard.edu>
    CC: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
    Tested-by: default avatarPaul Osmialowski <newchief@king.net.pl>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    e074cc2a
transport.c 43.2 KB