From: Christian Hoff <christian.h...@de.ibm.com> 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 <christian.h...@de.ibm.com> Signed-off-by: Christian Borntraeger <borntrae...@de.ibm.com> --- 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 */ -- 1.7.0.4