From patchwork Thu Jun 14 13:55:28 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [4/5] scsi: Fix transfer length for READ POSITION commands. Date: Thu, 14 Jun 2012 03:55:28 -0000 From: Christian Borntraeger X-Patchwork-Id: 164935 Message-Id: <1339682129-1497-5-git-send-email-borntraeger@de.ibm.com> To: pbonzini@redhat.com Cc: stefanha@gmail.com, Christian Hoff , qemu-devel@nongnu.org, Christian Borntraeger From: Christian Hoff The transfer length depends on the specific service action code, as defined in the SCSI stream commands spec section 7.7. Up to now only the extended form was supported. Signed-off-by: Christian Hoff Signed-off-by: Christian Borntraeger --- hw/scsi-bus.c | 16 +++++++++++++++- hw/scsi-defs.h | 8 ++++++++ 2 files changed, 23 insertions(+), 1 deletions(-) diff --git a/hw/scsi-bus.c b/hw/scsi-bus.c index a93d3da..9854321 100644 --- a/hw/scsi-bus.c +++ b/hw/scsi-bus.c @@ -839,7 +839,21 @@ static int scsi_req_stream_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *bu cmd->xfer = buf[13] | (buf[12] << 8); break; case READ_POSITION: - cmd->xfer = buf[8] | (buf[7] << 8); + switch (buf[1] & 0x1f) /* operation code */ { + case SHORT_FORM_BLOCK_ID: + case SHORT_FORM_VENDOR_SPECIFIC: + cmd->xfer = 20; + break; + case LONG_FORM: + cmd->xfer = 32; + break; + case EXTENDED_FORM: + cmd->xfer = buf[8] | (buf[7] << 8); + break; + default: + return -1; + } + break; case FORMAT_UNIT: cmd->xfer = buf[4] | (buf[3] << 8); diff --git a/hw/scsi-defs.h b/hw/scsi-defs.h index 2c40855..57d0866 100644 --- a/hw/scsi-defs.h +++ b/hw/scsi-defs.h @@ -144,6 +144,14 @@ #define SAI_READ_CAPACITY_16 0x10 /* + * READ POSITION service action codes + */ +#define SHORT_FORM_BLOCK_ID 0x00 +#define SHORT_FORM_VENDOR_SPECIFIC 0x01 +#define LONG_FORM 0x06 +#define EXTENDED_FORM 0x08 + +/* * SAM Status codes */