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