Commit bb729f75 authored by Paolo Bonzini's avatar Paolo Bonzini
Browse files

scsi: introduce scsi_cdb_length and scsi_data_cdb_length

parent 12ca76fc
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -801,26 +801,39 @@ static int ata_passthrough_16_xfer_size(SCSIDevice *dev, uint8_t *buf)
    return xfer * unit;
}

static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
uint32_t scsi_data_cdb_length(uint8_t *buf)
{
    if ((buf[0] >> 5) == 0 && buf[4] == 0) {
        return 256;
    } else {
        return scsi_cdb_length(buf);
    }
}

uint32_t scsi_cdb_length(uint8_t *buf)
{
    switch (buf[0] >> 5) {
    case 0:
        cmd->xfer = buf[4];
        return buf[4];
        break;
    case 1:
    case 2:
        cmd->xfer = lduw_be_p(&buf[7]);
        return lduw_be_p(&buf[7]);
        break;
    case 4:
        cmd->xfer = ldl_be_p(&buf[10]) & 0xffffffffULL;
        return ldl_be_p(&buf[10]) & 0xffffffffULL;
        break;
    case 5:
        cmd->xfer = ldl_be_p(&buf[6]) & 0xffffffffULL;
        return ldl_be_p(&buf[6]) & 0xffffffffULL;
        break;
    default:
        return -1;
    }
}

static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
{
    cmd->xfer = scsi_cdb_length(buf);
    switch (buf[0]) {
    case TEST_UNIT_READY:
    case REWIND:
+2 −0
Original line number Diff line number Diff line
@@ -218,6 +218,8 @@ extern const struct SCSISense sense_code_WRITE_PROTECTED;

#define SENSE_CODE(x) sense_code_ ## x

uint32_t scsi_data_cdb_length(uint8_t *buf);
uint32_t scsi_cdb_length(uint8_t *buf);
int scsi_sense_valid(SCSISense sense);
int scsi_build_sense(uint8_t *in_buf, int in_len,
                     uint8_t *buf, int len, bool fixed);