diff options
author | Hans de Goede <hdegoede@redhat.com> | 2014-09-13 12:26:31 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-09-23 21:42:10 -0700 |
commit | e0620001e4e318d85ebf43a95eec15fae26ed706 (patch) | |
tree | 5e2cf98a193f99d3de3c7a5ddc52ea0e4c292963 /drivers | |
parent | b7b5d11fae766ee0e92821df2694c41f15f98954 (diff) | |
download | linux-e0620001e4e318d85ebf43a95eec15fae26ed706.tar.gz linux-e0620001e4e318d85ebf43a95eec15fae26ed706.tar.bz2 linux-e0620001e4e318d85ebf43a95eec15fae26ed706.zip |
uas: Add uas_get_tag() helper function
Factor out the mapping of scsi-tags -> uas-tags/stream-ids to a helper function
so that there is a single place where this "magic" happens.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/usb/storage/uas.c | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index 50d2d85e1051..3debefbd858f 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c @@ -259,13 +259,29 @@ static void uas_sense_old(struct urb *urb, struct scsi_cmnd *cmnd) cmnd->result = sense_iu->status; } +/* + * scsi-tags go from 0 - (nr_tags - 1), uas tags need to match stream-ids, + * which go from 1 - nr_streams. And we use 1 for untagged commands. + */ +static int uas_get_tag(struct scsi_cmnd *cmnd) +{ + int tag; + + if (blk_rq_tagged(cmnd->request)) + tag = cmnd->request->tag + 2; + else + tag = 1; + + return tag; +} + static void uas_log_cmd_state(struct scsi_cmnd *cmnd, const char *caller) { struct uas_cmd_info *ci = (void *)&cmnd->SCp; scmd_printk(KERN_INFO, cmnd, "%s %p tag %d, inflight:" "%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n", - caller, cmnd, cmnd->request->tag, + caller, cmnd, uas_get_tag(cmnd), (ci->state & SUBMIT_STATUS_URB) ? " s-st" : "", (ci->state & ALLOC_DATA_IN_URB) ? " a-in" : "", (ci->state & SUBMIT_DATA_IN_URB) ? " s-in" : "", @@ -516,10 +532,7 @@ static struct urb *uas_alloc_cmd_urb(struct uas_dev_info *devinfo, gfp_t gfp, goto free; iu->iu_id = IU_ID_COMMAND; - if (blk_rq_tagged(cmnd->request)) - iu->tag = cpu_to_be16(cmnd->request->tag + 2); - else - iu->tag = cpu_to_be16(1); + iu->tag = cpu_to_be16(uas_get_tag(cmnd)); iu->prio_attr = UAS_SIMPLE_TAG; iu->len = len; int_to_scsilun(sdev->lun, &iu->lun); @@ -690,17 +703,13 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd, memset(cmdinfo, 0, sizeof(*cmdinfo)); - if (blk_rq_tagged(cmnd->request)) { - cmdinfo->stream = cmnd->request->tag + 2; - } else { + if (!blk_rq_tagged(cmnd->request)) devinfo->cmnd = cmnd; - cmdinfo->stream = 1; - } cmnd->scsi_done = done; - cmdinfo->state = SUBMIT_STATUS_URB | - ALLOC_CMD_URB | SUBMIT_CMD_URB; + cmdinfo->stream = uas_get_tag(cmnd); + cmdinfo->state = SUBMIT_STATUS_URB | ALLOC_CMD_URB | SUBMIT_CMD_URB; switch (cmnd->sc_data_direction) { case DMA_FROM_DEVICE: |