Commit 549c41e0 authored by Felipe Balbi's avatar Felipe Balbi Committed by Greg Kroah-Hartman

usb: gadget: workaround storage command size issues

Try to workaround issues with bad SCSI implementations
by ignoring the command size error.
Signed-off-by: default avatarFelipe Balbi <felipe.balbi@nokia.com>
Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 8296345a
...@@ -2676,11 +2676,24 @@ static int check_command(struct fsg_dev *fsg, int cmnd_size, ...@@ -2676,11 +2676,24 @@ static int check_command(struct fsg_dev *fsg, int cmnd_size,
/* Verify the length of the command itself */ /* Verify the length of the command itself */
if (cmnd_size != fsg->cmnd_size) { if (cmnd_size != fsg->cmnd_size) {
/* Special case workaround: MS-Windows issues REQUEST SENSE /* Special case workaround: There are plenty of buggy SCSI
* with cbw->Length == 12 (it should be 6). */ * implementations. Many have issues with cbw->Length
if (fsg->cmnd[0] == SC_REQUEST_SENSE && fsg->cmnd_size == 12) * field passing a wrong command size. For those cases we
* always try to work around the problem by using the length
* sent by the host side provided it is at least as large
* as the correct command length.
* Examples of such cases would be MS-Windows, which issues
* REQUEST SENSE with cbw->Length == 12 where it should
* be 6, and xbox360 issuing INQUIRY, TEST UNIT READY and
* REQUEST SENSE with cbw->Length == 10 where it should
* be 6 as well.
*/
if (cmnd_size <= fsg->cmnd_size) {
DBG(fsg, "%s is buggy! Expected length %d "
"but we got %d\n", name,
cmnd_size, fsg->cmnd_size);
cmnd_size = fsg->cmnd_size; cmnd_size = fsg->cmnd_size;
else { } else {
fsg->phase_error = 1; fsg->phase_error = 1;
return -EINVAL; return -EINVAL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment