Revision bb729f75 hw/scsi-bus.c

b/hw/scsi-bus.c
801 801
    return xfer * unit;
802 802
}
803 803

  
804
static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
804
uint32_t scsi_data_cdb_length(uint8_t *buf)
805
{
806
    if ((buf[0] >> 5) == 0 && buf[4] == 0) {
807
        return 256;
808
    } else {
809
        return scsi_cdb_length(buf);
810
    }
811
}
812

  
813
uint32_t scsi_cdb_length(uint8_t *buf)
805 814
{
806 815
    switch (buf[0] >> 5) {
807 816
    case 0:
808
        cmd->xfer = buf[4];
817
        return buf[4];
809 818
        break;
810 819
    case 1:
811 820
    case 2:
812
        cmd->xfer = lduw_be_p(&buf[7]);
821
        return lduw_be_p(&buf[7]);
813 822
        break;
814 823
    case 4:
815
        cmd->xfer = ldl_be_p(&buf[10]) & 0xffffffffULL;
824
        return ldl_be_p(&buf[10]) & 0xffffffffULL;
816 825
        break;
817 826
    case 5:
818
        cmd->xfer = ldl_be_p(&buf[6]) & 0xffffffffULL;
827
        return ldl_be_p(&buf[6]) & 0xffffffffULL;
819 828
        break;
820 829
    default:
821 830
        return -1;
822 831
    }
832
}
823 833

  
834
static int scsi_req_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf)
835
{
836
    cmd->xfer = scsi_cdb_length(buf);
824 837
    switch (buf[0]) {
825 838
    case TEST_UNIT_READY:
826 839
    case REWIND:

Also available in: Unified diff