Revision 40723a99 hw/scsi-bus.c
b/hw/scsi-bus.c | ||
---|---|---|
770 | 770 |
case SET_CD_SPEED: |
771 | 771 |
case SET_LIMITS: |
772 | 772 |
case WRITE_LONG_10: |
773 |
case MOVE_MEDIUM: |
|
774 | 773 |
case UPDATE_BLOCK: |
775 | 774 |
case RESERVE_TRACK: |
776 | 775 |
case SET_READ_AHEAD: |
... | ... | |
914 | 913 |
return 0; |
915 | 914 |
} |
916 | 915 |
|
916 |
static int scsi_req_medium_changer_length(SCSICommand *cmd, SCSIDevice *dev, uint8_t *buf) |
|
917 |
{ |
|
918 |
switch (buf[0]) { |
|
919 |
/* medium changer commands */ |
|
920 |
case EXCHANGE_MEDIUM: |
|
921 |
case INITIALIZE_ELEMENT_STATUS: |
|
922 |
case INITIALIZE_ELEMENT_STATUS_WITH_RANGE: |
|
923 |
case MOVE_MEDIUM: |
|
924 |
case POSITION_TO_ELEMENT: |
|
925 |
cmd->xfer = 0; |
|
926 |
break; |
|
927 |
case READ_ELEMENT_STATUS: |
|
928 |
cmd->xfer = buf[9] | (buf[8] << 8) | (buf[7] << 16); |
|
929 |
break; |
|
930 |
|
|
931 |
/* generic commands */ |
|
932 |
default: |
|
933 |
return scsi_req_length(cmd, dev, buf); |
|
934 |
} |
|
935 |
return 0; |
|
936 |
} |
|
937 |
|
|
938 |
|
|
917 | 939 |
static void scsi_cmd_xfer_mode(SCSICommand *cmd) |
918 | 940 |
{ |
919 | 941 |
if (!cmd->xfer) { |
... | ... | |
1011 | 1033 |
return -1; |
1012 | 1034 |
} |
1013 | 1035 |
|
1014 |
if (dev->type == TYPE_TAPE) { |
|
1036 |
switch (dev->type) { |
|
1037 |
case TYPE_TAPE: |
|
1015 | 1038 |
rc = scsi_req_stream_length(cmd, dev, buf); |
1016 |
} else { |
|
1039 |
break; |
|
1040 |
case TYPE_MEDIUM_CHANGER: |
|
1041 |
rc = scsi_req_medium_changer_length(cmd, dev, buf); |
|
1042 |
break; |
|
1043 |
default: |
|
1017 | 1044 |
rc = scsi_req_length(cmd, dev, buf); |
1045 |
break; |
|
1018 | 1046 |
} |
1047 |
|
|
1019 | 1048 |
if (rc != 0) |
1020 | 1049 |
return rc; |
1021 | 1050 |
|
... | ... | |
1193 | 1222 |
[ REQUEST_SENSE ] = "REQUEST_SENSE", |
1194 | 1223 |
[ FORMAT_UNIT ] = "FORMAT_UNIT", |
1195 | 1224 |
[ READ_BLOCK_LIMITS ] = "READ_BLOCK_LIMITS", |
1196 |
[ REASSIGN_BLOCKS ] = "REASSIGN_BLOCKS", |
|
1225 |
[ REASSIGN_BLOCKS ] = "REASSIGN_BLOCKS/INITIALIZE ELEMENT STATUS", |
|
1226 |
/* LOAD_UNLOAD and INITIALIZE_ELEMENT_STATUS use the same operation code */ |
|
1197 | 1227 |
[ READ_6 ] = "READ_6", |
1198 | 1228 |
[ WRITE_6 ] = "WRITE_6", |
1199 | 1229 |
[ SET_CAPACITY ] = "SET_CAPACITY", |
... | ... | |
1218 | 1248 |
[ READ_CAPACITY_10 ] = "READ_CAPACITY_10", |
1219 | 1249 |
[ READ_10 ] = "READ_10", |
1220 | 1250 |
[ WRITE_10 ] = "WRITE_10", |
1221 |
[ SEEK_10 ] = "SEEK_10", |
|
1251 |
[ SEEK_10 ] = "SEEK_10/POSITION_TO_ELEMENT", |
|
1252 |
/* SEEK_10 and POSITION_TO_ELEMENT use the same operation code */ |
|
1222 | 1253 |
[ WRITE_VERIFY_10 ] = "WRITE_VERIFY_10", |
1223 | 1254 |
[ VERIFY_10 ] = "VERIFY_10", |
1224 | 1255 |
[ SEARCH_HIGH ] = "SEARCH_HIGH", |
... | ... | |
1229 | 1260 |
/* READ_POSITION and PRE_FETCH use the same operation code */ |
1230 | 1261 |
[ SYNCHRONIZE_CACHE ] = "SYNCHRONIZE_CACHE", |
1231 | 1262 |
[ LOCK_UNLOCK_CACHE ] = "LOCK_UNLOCK_CACHE", |
1232 |
[ READ_DEFECT_DATA ] = "READ_DEFECT_DATA", |
|
1263 |
[ READ_DEFECT_DATA ] = "READ_DEFECT_DATA/INITIALIZE_ELEMENT_STATUS_WITH_RANGE", |
|
1264 |
/* READ_DEFECT_DATA and INITIALIZE_ELEMENT_STATUS_WITH_RANGE use the same operation code */ |
|
1233 | 1265 |
[ MEDIUM_SCAN ] = "MEDIUM_SCAN", |
1234 | 1266 |
[ COMPARE ] = "COMPARE", |
1235 | 1267 |
[ COPY_VERIFY ] = "COPY_VERIFY", |
... | ... | |
1274 | 1306 |
[ REPORT_LUNS ] = "REPORT_LUNS", |
1275 | 1307 |
[ BLANK ] = "BLANK", |
1276 | 1308 |
[ MOVE_MEDIUM ] = "MOVE_MEDIUM", |
1309 |
[ EXCHANGE_MEDIUM ] = "EXCHANGE MEDIUM", |
|
1277 | 1310 |
[ LOAD_UNLOAD ] = "LOAD_UNLOAD", |
1278 | 1311 |
[ READ_12 ] = "READ_12", |
1279 | 1312 |
[ WRITE_12 ] = "WRITE_12", |
Also available in: Unified diff