| From c162d6a14000948569c70d1e2843a3aa4c5ecf5c Mon Sep 17 00:00:00 2001 |
| From: Alan Stern <stern@rowland.harvard.edu> |
| Date: Tue, 25 Oct 2011 10:50:58 -0400 |
| Subject: [PATCH] usb-storage: Accept 8020i-protocol commands longer than 12 |
| bytes |
| |
| commit 2f640bf4c94324aeaa1b6385c10aab8c5ad1e1cf upstream. |
| |
| The 8020i protocol (also 8070i and QIC-157) uses 12-byte commands; |
| shorter commands must be padded. Simon Detheridge reports that his |
| 3-TB USB disk drive claims to use the 8020i protocol (which is |
| normally meant for ATAPI devices like CD drives), and because of its |
| large size, the disk drive requires the use of 16-byte commands. |
| However the usb_stor_pad12_command() routine in usb-storage always |
| sets the command length to 12, making the drive impossible to use. |
| |
| Since the SFF-8020i specification allows for 16-byte commands in |
| future extensions, we may as well accept them. This patch (as1490) |
| changes usb_stor_pad12_command() to leave commands larger than 12 |
| bytes alone rather than truncating them. |
| |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| Tested-by: Simon Detheridge <simon@widgit.com> |
| CC: Matthew Dharm <mdharm-usb@one-eyed-alien.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| --- |
| drivers/usb/storage/protocol.c | 7 +++---- |
| 1 file changed, 3 insertions(+), 4 deletions(-) |
| |
| diff --git a/drivers/usb/storage/protocol.c b/drivers/usb/storage/protocol.c |
| index fc310f7..0fded39 100644 |
| --- a/drivers/usb/storage/protocol.c |
| +++ b/drivers/usb/storage/protocol.c |
| @@ -58,7 +58,9 @@ |
| |
| void usb_stor_pad12_command(struct scsi_cmnd *srb, struct us_data *us) |
| { |
| - /* Pad the SCSI command with zeros out to 12 bytes |
| + /* |
| + * Pad the SCSI command with zeros out to 12 bytes. If the |
| + * command already is 12 bytes or longer, leave it alone. |
| * |
| * NOTE: This only works because a scsi_cmnd struct field contains |
| * a unsigned char cmnd[16], so we know we have storage available |
| @@ -66,9 +68,6 @@ void usb_stor_pad12_command(struct scsi_cmnd *srb, struct us_data *us) |
| for (; srb->cmd_len<12; srb->cmd_len++) |
| srb->cmnd[srb->cmd_len] = 0; |
| |
| - /* set command length to 12 bytes */ |
| - srb->cmd_len = 12; |
| - |
| /* send the command to the transport layer */ |
| usb_stor_invoke_transport(srb, us); |
| } |
| -- |
| 1.7.12.rc1.1.gbce1580 |
| |