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