/** * @brief This method performs all of the translation required for a * SCSI VERIFY 16 byte CDB. * This includes: * - logical block address translation * - transfer length (sector count) translation * - translation items common to all VERIFY CDB sizes. * For more information on the parameters passed to this method, * please reference sati_translate_command(). * * @return Indicate if the command translation was successful. * For more information on return values please reference * sati_move_set_sector_count(), sati_verify_translate_command() */ SATI_STATUS sati_verify_16_translate_command( SATI_TRANSLATOR_SEQUENCE_T * sequence, void * scsi_io, void * ata_io ) { SATI_STATUS status; U8 * cdb = sati_cb_get_cdb_address(scsi_io); U32 sector_count = (sati_get_cdb_byte(cdb, 10) << 24) | (sati_get_cdb_byte(cdb, 11) << 16) | (sati_get_cdb_byte(cdb, 12) << 8) | (sati_get_cdb_byte(cdb, 13)); if(sati_device_state_stopped(sequence, scsi_io)) { return SATI_FAILURE_CHECK_RESPONSE_DATA; } else { sequence->type = SATI_SEQUENCE_VERIFY_16; // Fill in the Logical Block Address field. status = sati_move_translate_64_bit_lba(sequence, scsi_io, ata_io); if (status != SATI_SUCCESS) return status; // Fill in the Sector Count fields. status = sati_move_set_sector_count(sequence,scsi_io,ata_io,sector_count,0); if (status != SATI_SUCCESS) return status; return sati_verify_translate_command(sequence, scsi_io, ata_io); } }
/** * @brief This method will translate the SCSI read 12 command into a * corresponding ATA read command. Depending upon the capabilities * supported by the target different ATA commands can be selected. * It ensures that all translation required for this command is * performed successfully. * For more information on the parameters passed to this method, * please reference sati_translate_command(). * * @return Indicate if the command translation succeeded. * @see sati_read_32_bit_lba_translate_command() for return values. */ SATI_STATUS sati_read_12_translate_command( SATI_TRANSLATOR_SEQUENCE_T * sequence, void * scsi_io, void * ata_io ) { U8 * cdb = sati_cb_get_cdb_address(scsi_io); U32 sector_count = (sati_get_cdb_byte(cdb, 6) << 24) | (sati_get_cdb_byte(cdb, 7) << 16) | (sati_get_cdb_byte(cdb, 8) << 8) | (sati_get_cdb_byte(cdb, 9)); if(sati_device_state_stopped(sequence, scsi_io)) { return SATI_FAILURE_CHECK_RESPONSE_DATA; } else { sequence->type = SATI_SEQUENCE_READ_12; return sati_read_32_bit_lba_translate_command( sequence, scsi_io, ata_io, sector_count, 11 ); } }
/** * @brief This method will translate the SCSI read command into a * corresponding ATA read 6 command. Depending upon the capabilities * supported by the target different ATA commands can be selected. * For more information on the parameters passed to this method, * please reference sati_translate_command(). * * @return Indicate if the command translation succeeded. * @retval SCI_SUCCESS This is returned if the command translation was * successful. * @retval SATI_FAILURE_CHECK_RESPONSE_DATA This value is returned if * sense data has been created as a result of something specified * in the CDB. */ SATI_STATUS sati_read_6_translate_command( SATI_TRANSLATOR_SEQUENCE_T * sequence, void * scsi_io, void * ata_io ) { if(sati_device_state_stopped(sequence, scsi_io)) { return SATI_FAILURE_CHECK_RESPONSE_DATA; } else { sequence->data_direction = SATI_DATA_DIRECTION_IN; sequence->type = SATI_SEQUENCE_READ_6; return sati_move_small_translate_command(sequence, scsi_io, ata_io); } }
/** * @brief This method will translate the SCSI read 16 command into a * corresponding ATA read command. Depending upon the capabilities * supported by the target different ATA commands can be selected. * It ensures that all translation required for this command is * performed successfully. * For more information on the parameters passed to this method, * please reference sati_translate_command(). * * @return Indicate if the command translation succeeded. * @see sati_read_large_translate_command(), sati_move_translate_64_bit_lba() * for additional return values. */ SATI_STATUS sati_read_16_translate_command( SATI_TRANSLATOR_SEQUENCE_T * sequence, void * scsi_io, void * ata_io ) { SATI_STATUS status; U8 device_head = 0; U8 * cdb = sati_cb_get_cdb_address(scsi_io); U32 sector_count = (sati_get_cdb_byte(cdb, 10) << 24) | (sati_get_cdb_byte(cdb, 11) << 16) | (sati_get_cdb_byte(cdb, 12) << 8) | (sati_get_cdb_byte(cdb, 13)); if(sati_device_state_stopped(sequence, scsi_io)) { return SATI_FAILURE_CHECK_RESPONSE_DATA; } else { sequence->type = SATI_SEQUENCE_READ_16; // Translate the sector count, write command register, and check various // other parts of the CDB. status = sati_read_large_translate_command( sequence, scsi_io, ata_io, sector_count, &device_head ); // Attempt to translate the 64-bit LBA field from the SCSI request // into the 48-bits of LBA in the ATA register FIS. if (status == SATI_SUCCESS) { sati_move_translate_command(sequence, scsi_io, ata_io, device_head); status = sati_move_translate_64_bit_lba(sequence, scsi_io, ata_io); } return status; } }