Skip to content

Commit 9eb4454

Browse files
Sarah SharpSebastian Andrzej Siewior
authored andcommitted
UAS: Use unique tags on non-streams devices.
UAS can work with either USB 3.0 devices that support bulk streams, or USB 2.0 devices that do not support bulk streams. When we're working with a non-streams device, we need to be able to uniquely identify a SCSI command with a tag in the IU. Devices will barf and abort all queued commands if they find a duplicate tag. uas_queuecommand_lck() sets cmdinfo->stream to zero if the device doesn't support streams, which is later passed into uas_alloc_cmd_urb() as the variable stream. This means the UAS driver was setting the tag in all commands to zero for non-stream devices. So the UAS driver won't currently work with USB 2.0 devices. Use the SCSI command tag instead of the stream ID for the command IU tag. We have to add one to the SCSI command tag because SCSI tags are zero-based, but stream IDs are one-based, and the command tag must match the stream ID that we're queueing the data IUs for. Untagged SCSI commands use stream ID 1. Signed-off-by: Sarah Sharp <[email protected]> Cc: Matthew Wilcox <[email protected]> Signed-off-by: Sebastian Andrzej Siewior <[email protected]>
1 parent ea9da1c commit 9eb4454

File tree

1 file changed

+4
-1
lines changed

1 file changed

+4
-1
lines changed

drivers/usb/storage/uas.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -343,7 +343,10 @@ static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp,
343343
goto free;
344344

345345
iu->iu_id = IU_ID_COMMAND;
346-
iu->tag = cpu_to_be16(stream_id);
346+
if (blk_rq_tagged(cmnd->request))
347+
iu->tag = cpu_to_be16(cmnd->request->tag + 1);
348+
else
349+
iu->tag = cpu_to_be16(1);
347350
iu->prio_attr = UAS_SIMPLE_TAG;
348351
iu->len = len;
349352
int_to_scsilun(sdev->lun, &iu->lun);

0 commit comments

Comments
 (0)