The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/isci/scil/sati.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
    3  *
    4  * This file is provided under a dual BSD/GPLv2 license.  When using or
    5  * redistributing this file, you may do so under either license.
    6  *
    7  * GPL LICENSE SUMMARY
    8  *
    9  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
   10  *
   11  * This program is free software; you can redistribute it and/or modify
   12  * it under the terms of version 2 of the GNU General Public License as
   13  * published by the Free Software Foundation.
   14  *
   15  * This program is distributed in the hope that it will be useful, but
   16  * WITHOUT ANY WARRANTY; without even the implied warranty of
   17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   18  * General Public License for more details.
   19  *
   20  * You should have received a copy of the GNU General Public License
   21  * along with this program; if not, write to the Free Software
   22  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
   23  * The full GNU General Public License is included in this distribution
   24  * in the file called LICENSE.GPL.
   25  *
   26  * BSD LICENSE
   27  *
   28  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
   29  * All rights reserved.
   30  *
   31  * Redistribution and use in source and binary forms, with or without
   32  * modification, are permitted provided that the following conditions
   33  * are met:
   34  *
   35  *   * Redistributions of source code must retain the above copyright
   36  *     notice, this list of conditions and the following disclaimer.
   37  *   * Redistributions in binary form must reproduce the above copyright
   38  *     notice, this list of conditions and the following disclaimer in
   39  *     the documentation and/or other materials provided with the
   40  *     distribution.
   41  *
   42  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   43  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   44  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   45  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   46  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   47  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   48  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   49  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   50  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   51  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   52  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   53  */
   54 
   55 #include <sys/cdefs.h>
   56 __FBSDID("$FreeBSD$");
   57 
   58 /**
   59  * @file
   60  * @brief This file contains all of the method implementations that
   61  *        can be utilized by a user to perform SCSI-to-ATA Translation.
   62  *        SATI adheres to the www.t10.org SAT specification.
   63  *
   64  * For situations where compliance is not observed, the SATI will
   65  * return an error indication (most likely INVALID FIELD IN CDB sense data).
   66  */
   67 
   68 #include <dev/isci/scil/sati.h>
   69 #include <dev/isci/scil/sati_callbacks.h>
   70 #include <dev/isci/scil/sati_util.h>
   71 #include <dev/isci/scil/sati_report_luns.h>
   72 #include <dev/isci/scil/sati_inquiry.h>
   73 #include <dev/isci/scil/sati_mode_sense_6.h>
   74 #include <dev/isci/scil/sati_mode_sense_10.h>
   75 #include <dev/isci/scil/sati_mode_select.h>
   76 #include <dev/isci/scil/sati_test_unit_ready.h>
   77 #include <dev/isci/scil/sati_read_capacity.h>
   78 #include <dev/isci/scil/sati_read.h>
   79 #include <dev/isci/scil/sati_write.h>
   80 #include <dev/isci/scil/sati_verify.h>
   81 #include <dev/isci/scil/sati_synchronize_cache.h>
   82 #include <dev/isci/scil/sati_lun_reset.h>
   83 #include <dev/isci/scil/sati_start_stop_unit.h>
   84 #include <dev/isci/scil/sati_request_sense.h>
   85 #include <dev/isci/scil/sati_write_long.h>
   86 #include <dev/isci/scil/sati_reassign_blocks.h>
   87 #include <dev/isci/scil/sati_log_sense.h>
   88 #include <dev/isci/scil/sati_abort_task_set.h>
   89 #include <dev/isci/scil/sati_unmap.h>
   90 #include <dev/isci/scil/sati_passthrough.h>
   91 #include <dev/isci/scil/sati_write_and_verify.h>
   92 #include <dev/isci/scil/sati_read_buffer.h>
   93 #include <dev/isci/scil/sati_write_buffer.h>
   94 #include <dev/isci/scil/intel_ata.h>
   95 #include <dev/isci/scil/intel_scsi.h>
   96 #include <dev/isci/scil/intel_sat.h>
   97 
   98 //******************************************************************************
   99 //* P R I V A T E   M E T H O D S
  100 //******************************************************************************
  101 
  102 /**
  103  * @brief This method performs the translation of ATA error register values
  104  *        into SCSI sense data.
  105  *        For more information on the parameter passed to this method please
  106  *        reference the sati_translate_response() method.
  107  *
  108  * @param[in] error This parameter specifies the contents of the ATA error
  109  *            register to be translated.
  110  *
  111  * @return none
  112  */
  113 void sati_translate_error(
  114    SATI_TRANSLATOR_SEQUENCE_T * sequence,
  115    void                       * scsi_io,
  116    U8                           error
  117 )
  118 {
  119    if (error & ATA_ERROR_REG_NO_MEDIA_BIT)
  120    {
  121       sati_scsi_sense_data_construct(
  122          sequence,
  123          scsi_io,
  124          SCSI_STATUS_CHECK_CONDITION,
  125          SCSI_SENSE_NOT_READY,
  126          SCSI_ASC_MEDIUM_NOT_PRESENT,
  127          SCSI_ASCQ_MEDIUM_NOT_PRESENT
  128       );
  129    }
  130    else if (error & ATA_ERROR_REG_MEDIA_CHANGE_BIT)
  131    {
  132       sati_scsi_sense_data_construct(
  133          sequence,
  134          scsi_io,
  135          SCSI_STATUS_CHECK_CONDITION,
  136          SCSI_SENSE_UNIT_ATTENTION,
  137          SCSI_ASC_NOT_READY_TO_READY_CHANGE,
  138          SCSI_ASCQ_NOT_READY_TO_READY_CHANGE
  139       );
  140    }
  141    else if (error & ATA_ERROR_REG_MEDIA_CHANGE_REQUEST_BIT)
  142    {
  143       sati_scsi_sense_data_construct(
  144          sequence,
  145          scsi_io,
  146          SCSI_STATUS_CHECK_CONDITION,
  147          SCSI_SENSE_UNIT_ATTENTION,
  148          SCSI_ASC_MEDIUM_REMOVAL_REQUEST,
  149          SCSI_ASCQ_MEDIUM_REMOVAL_REQUEST
  150       );
  151    }
  152    else if (error & ATA_ERROR_REG_ID_NOT_FOUND_BIT)
  153    {
  154       sati_scsi_sense_data_construct(
  155          sequence,
  156          scsi_io,
  157          SCSI_STATUS_CHECK_CONDITION,
  158          SCSI_SENSE_ILLEGAL_REQUEST,
  159          SCSI_ASC_LBA_OUT_OF_RANGE,
  160          SCSI_ASCQ_LBA_OUT_OF_RANGE
  161       );
  162    }
  163    else if (error & ATA_ERROR_REG_UNCORRECTABLE_BIT)
  164    {
  165       //Mark the Sequence state as a read error so more sense data
  166       //can be returned later
  167       sequence->state = SATI_SEQUENCE_STATE_READ_ERROR;
  168       sati_scsi_sense_data_construct(
  169          sequence,
  170          scsi_io,
  171          SCSI_STATUS_CHECK_CONDITION,
  172          SCSI_SENSE_MEDIUM_ERROR,
  173          SCSI_ASC_UNRECOVERED_READ_ERROR,
  174          SCSI_ASCQ_UNRECOVERED_READ_ERROR
  175       );
  176    }
  177    else if (  (sequence->data_direction == SATI_DATA_DIRECTION_OUT)
  178            && (error & ATA_ERROR_REG_WRITE_PROTECTED_BIT) )
  179    {
  180       sati_scsi_sense_data_construct(
  181          sequence,
  182          scsi_io,
  183          SCSI_STATUS_CHECK_CONDITION,
  184          SCSI_SENSE_DATA_PROTECT,
  185          SCSI_ASC_WRITE_PROTECTED,
  186          SCSI_ASCQ_WRITE_PROTECTED
  187       );
  188    }
  189    else if (error & ATA_ERROR_REG_ICRC_BIT)
  190    {
  191       sati_scsi_sense_data_construct(
  192          sequence,
  193          scsi_io,
  194          SCSI_STATUS_CHECK_CONDITION,
  195          SCSI_SENSE_ABORTED_COMMAND,
  196          SCSI_ASC_IU_CRC_ERROR_DETECTED,
  197          SCSI_ASCQ_IU_CRC_ERROR_DETECTED
  198       );
  199    }
  200    else // (error & ATA_ERROR_REG_ABORT_BIT)
  201    {
  202       // The ABORT bit has the lowest precedence of all errors.
  203       // As a result, it is at the bottom of the conditional
  204       // statement.
  205       sati_scsi_sense_data_construct(
  206          sequence,
  207          scsi_io,
  208          SCSI_STATUS_CHECK_CONDITION,
  209          SCSI_SENSE_ABORTED_COMMAND,
  210          SCSI_ASC_NO_ADDITIONAL_SENSE,
  211          SCSI_ASCQ_NO_ADDITIONAL_SENSE
  212       );
  213    }
  214 }
  215 
  216 /**
  217  * @brief This method translates the supplied ATA payload data into the
  218  *        corresponding SCSI data.  This is necessary for SCSI commands
  219  *        that have well-defined payload data associated with them (e.g.
  220  *        READ CAPACITY).
  221  *
  222  * @param[in]  sequence This parameter specifies the sequence
  223  *             data associated with the translation.
  224  * @param[in]  ata_io This parameter specifies the ATA payload
  225  *             buffer location and size to be translated.
  226  * @param[out] scsi_output_data This parameter specifies the SCSI payload
  227  *             memory area into which the translator is to write.
  228  *
  229  * @return none
  230  */
  231 static
  232 void sati_translate_data(
  233    SATI_TRANSLATOR_SEQUENCE_T * sequence,
  234    void                       * ata_input_data,
  235    void                       * scsi_io
  236 )
  237 {
  238    // Update the device capabilities in the odd/crazy event something changed.
  239    sati_device_update_capabilities(
  240       sequence->device, (ATA_IDENTIFY_DEVICE_DATA_T*) ata_input_data
  241    );
  242 
  243    // Look at the first byte to determine the SCSI command to translate.
  244    switch (sequence->type)
  245    {
  246 #if !defined(DISABLE_SATI_INQUIRY)
  247       case SATI_SEQUENCE_INQUIRY_STANDARD:
  248          sati_inquiry_standard_translate_data(
  249             sequence, ata_input_data, scsi_io
  250          );
  251       break;
  252 
  253       case SATI_SEQUENCE_INQUIRY_SERIAL_NUMBER:
  254          sati_inquiry_serial_number_translate_data(
  255             sequence, ata_input_data, scsi_io
  256          );
  257       break;
  258 
  259       case SATI_SEQUENCE_INQUIRY_DEVICE_ID:
  260          sati_inquiry_device_id_translate_data(
  261             sequence, ata_input_data, scsi_io
  262          );
  263       break;
  264 
  265       case SATI_SEQUENCE_INQUIRY_BLOCK_DEVICE:
  266          sati_inquiry_block_device_translate_data(
  267             sequence, ata_input_data, scsi_io
  268          );
  269       break;
  270 
  271       case SATI_SEQUENCE_INQUIRY_ATA_INFORMATION:
  272          sati_inquiry_ata_information_translate_data(
  273             sequence, ata_input_data, scsi_io
  274          );
  275       break;
  276 
  277 #endif // !defined(DISABLE_SATI_INQUIRY)
  278 
  279 #if !defined(DISABLE_SATI_READ_CAPACITY)
  280       case SATI_SEQUENCE_READ_CAPACITY_10:
  281          sati_read_capacity_10_translate_data(sequence, ata_input_data, scsi_io);
  282       break;
  283 
  284       case SATI_SEQUENCE_READ_CAPACITY_16:
  285          sati_read_capacity_16_translate_data(sequence, ata_input_data, scsi_io);
  286       break;
  287 #endif // !defined(DISABLE_SATI_READ_CAPACITY)
  288 
  289 #if !defined(DISABLE_SATI_MODE_SENSE)
  290       case SATI_SEQUENCE_MODE_SENSE_6_CACHING:
  291          sati_mode_sense_6_caching_translate_data(
  292             sequence, ata_input_data, scsi_io
  293          );
  294       break;
  295 
  296       case SATI_SEQUENCE_MODE_SENSE_6_INFORMATIONAL_EXCP_CONTROL:
  297          sati_mode_sense_6_informational_excp_control_translate_data(
  298             sequence, ata_input_data, scsi_io
  299          );
  300       break;
  301 
  302       case SATI_SEQUENCE_MODE_SENSE_6_READ_WRITE_ERROR:
  303          sati_mode_sense_6_read_write_error_translate_data(
  304             sequence, ata_input_data, scsi_io
  305          );
  306       break;
  307 
  308       case SATI_SEQUENCE_MODE_SENSE_6_DISCONNECT_RECONNECT:
  309          sati_mode_sense_6_disconnect_reconnect_translate_data(
  310             sequence, ata_input_data, scsi_io
  311          );
  312       break;
  313 
  314       case SATI_SEQUENCE_MODE_SENSE_6_CONTROL:
  315          sati_mode_sense_6_control_translate_data(
  316             sequence, ata_input_data, scsi_io
  317          );
  318       break;
  319 
  320       case SATI_SEQUENCE_MODE_SENSE_6_ALL_PAGES:
  321          sati_mode_sense_6_all_pages_translate_data(
  322             sequence, ata_input_data, scsi_io
  323          );
  324       break;
  325 
  326       case SATI_SEQUENCE_MODE_SENSE_6_POWER_CONDITION:
  327          sati_mode_sense_6_power_condition_translate_data(
  328             sequence, ata_input_data, scsi_io
  329          );
  330       break;
  331 
  332       case SATI_SEQUENCE_MODE_SENSE_10_POWER_CONDITION:
  333          sati_mode_sense_10_power_condition_translate_data(
  334             sequence, ata_input_data, scsi_io
  335          );
  336       break;
  337 
  338       case SATI_SEQUENCE_MODE_SENSE_10_CACHING:
  339          sati_mode_sense_10_caching_translate_data(
  340             sequence, ata_input_data, scsi_io
  341          );
  342       break;
  343 
  344       case SATI_SEQUENCE_MODE_SENSE_10_INFORMATIONAL_EXCP_CONTROL:
  345          sati_mode_sense_10_informational_excp_control_translate_data(
  346             sequence, ata_input_data, scsi_io
  347          );
  348       break;
  349 
  350       case SATI_SEQUENCE_MODE_SENSE_10_READ_WRITE_ERROR:
  351          sati_mode_sense_10_read_write_error_translate_data(
  352             sequence, ata_input_data, scsi_io
  353          );
  354       break;
  355 
  356       case SATI_SEQUENCE_MODE_SENSE_10_DISCONNECT_RECONNECT:
  357          sati_mode_sense_10_disconnect_reconnect_translate_data(
  358             sequence, ata_input_data, scsi_io
  359          );
  360       break;
  361 
  362       case SATI_SEQUENCE_MODE_SENSE_10_CONTROL:
  363          sati_mode_sense_10_control_translate_data(
  364             sequence, ata_input_data, scsi_io
  365          );
  366       break;
  367 
  368       case SATI_SEQUENCE_MODE_SENSE_10_ALL_PAGES:
  369          sati_mode_sense_10_all_pages_translate_data(
  370             sequence, ata_input_data, scsi_io
  371          );
  372       break;
  373 #endif // !defined(DISABLE_SATI_MODE_SENSE)
  374 
  375       default:
  376       break;
  377    }
  378 }
  379 
  380 //******************************************************************************
  381 //* P U B L I C   M E T H O D S
  382 //******************************************************************************
  383 
  384 SATI_STATUS sati_translate_command(
  385    SATI_TRANSLATOR_SEQUENCE_T * sequence,
  386    SATI_DEVICE_T              * sati_device,
  387    void                       * scsi_io,
  388    void                       * ata_io
  389 )
  390 {
  391    SATI_STATUS   status = SATI_FAILURE;
  392    U8          * cdb = sati_cb_get_cdb_address(scsi_io);
  393 
  394    //No sense response has been set for the translation sequence yet
  395    sequence->is_sense_response_set          = FALSE;
  396    // Default to no translation response required
  397    sequence->is_translate_response_required = FALSE;
  398    // Assign sati_device to sequence
  399    sequence->device  = sati_device;
  400 
  401    /**
  402     * Fail any I/O request with LUN != 0
  403     */
  404    if (sati_cb_get_lun(scsi_io) != 0)
  405    {
  406       sati_scsi_sense_data_construct(
  407          sequence,
  408          scsi_io,
  409          SCSI_STATUS_CHECK_CONDITION,
  410          SCSI_SENSE_ILLEGAL_REQUEST,
  411          SCSI_ASC_LOGICAL_UNIT_NOT_SUPPORTED,
  412          0
  413       );
  414       return SATI_FAILURE_CHECK_RESPONSE_DATA;
  415    }
  416 
  417    /**
  418     * SAT dictates:
  419     * - the NACA bit in the control byte (last byte) must be 0
  420     */
  421    if ( (sati_get_cdb_byte(cdb, sati_cb_get_cdb_length(scsi_io) - 1)
  422          & SCSI_CONTROL_BYTE_NACA_BIT_ENABLE))
  423    {
  424       sati_scsi_sense_data_construct(
  425          sequence,
  426          scsi_io,
  427          SCSI_STATUS_CHECK_CONDITION,
  428          SCSI_SENSE_ILLEGAL_REQUEST,
  429          SCSI_ASC_INVALID_FIELD_IN_CDB,
  430          SCSI_ASCQ_INVALID_FIELD_IN_CDB
  431       );
  432       return SATI_FAILURE_CHECK_RESPONSE_DATA;
  433    }
  434 
  435    /**
  436     * Per SAT "Error and sense reporting" section.  All subsequent IOs after
  437     * a device fault should receive INTERNAL TARGET FAILURE sense data.
  438     */
  439    if (sati_device->state == SATI_DEVICE_STATE_DEVICE_FAULT_OCCURRED)
  440    {
  441       sati_scsi_sense_data_construct(
  442          sequence,
  443          scsi_io,
  444          SCSI_STATUS_CHECK_CONDITION,
  445          SCSI_SENSE_HARDWARE_ERROR,
  446          SCSI_ASC_INTERNAL_TARGET_FAILURE,
  447          SCSI_ASCQ_INTERNAL_TARGET_FAILURE
  448       );
  449       return SATI_FAILURE_CHECK_RESPONSE_DATA;
  450    }
  451 
  452    if(sequence->state == SATI_SEQUENCE_STATE_INITIAL)
  453    {
  454       sequence->command_specific_data.scratch = 0;
  455       sequence->number_data_bytes_set = 0;
  456    }
  457 
  458 
  459 #ifdef SATI_TRANSPORT_SUPPORTS_SATA
  460    {
  461       U8 * register_fis = sati_cb_get_h2d_register_fis_address(ata_io);
  462       sati_set_sata_command_flag(register_fis);
  463       sati_set_sata_fis_type(register_fis, SATA_FIS_TYPE_REGH2D);
  464    }
  465 #endif // SATI_TRANSPORT_SUPPORTS_SATA
  466 
  467    // Look at the first byte to determine the SCSI command to translate.
  468    switch (sati_get_cdb_byte(cdb, 0))
  469    {
  470 #if !defined(DISABLE_SATI_REPORT_LUNS)
  471       case SCSI_REPORT_LUNS:
  472          status = sati_report_luns_translate_command(
  473                      sequence, scsi_io, ata_io
  474                   );
  475       break;
  476 #endif // !defined(DISABLE_SATI_REPORT_LUNS)
  477 
  478 #if !defined(DISABLE_SATI_INQUIRY)
  479       case SCSI_INQUIRY:
  480          status = sati_inquiry_translate_command(
  481                      sequence, scsi_io, ata_io
  482                   );
  483       break;
  484 #endif // !defined(DISABLE_SATI_INQUIRY)
  485 
  486 #if !defined(DISABLE_SATI_MODE_SENSE)
  487       case SCSI_MODE_SENSE_6:
  488          status = sati_mode_sense_6_translate_command(
  489                      sequence, scsi_io, ata_io
  490                   );
  491       break;
  492 
  493       case SCSI_MODE_SENSE_10:
  494          status = sati_mode_sense_10_translate_command(
  495                      sequence, scsi_io, ata_io
  496                   );
  497       break;
  498 #endif // !defined(DISABLE_SATI_MODE_SENSE)
  499 
  500 #if !defined(DISABLE_SATI_MODE_SELECT)
  501       case SCSI_MODE_SELECT_6:
  502          status = sati_mode_select_6_translate_command(
  503                      sequence, scsi_io, ata_io
  504                   );
  505       break;
  506 
  507       case SCSI_MODE_SELECT_10:
  508          status = sati_mode_select_10_translate_command(
  509                      sequence, scsi_io, ata_io
  510                   );
  511       break;
  512 #endif // !defined(DISABLE_SATI_MODE_SELECT)
  513 
  514 #if !defined(DISABLE_SATI_TEST_UNIT_READY)
  515       case SCSI_TEST_UNIT_READY:
  516          status = sati_test_unit_ready_translate_command(
  517                      sequence, scsi_io, ata_io
  518                   );
  519       break;
  520 #endif // !defined(DISABLE_SATI_TEST_UNIT_READY)
  521 
  522 #if !defined(DISABLE_SATI_READ_CAPACITY)
  523       case SCSI_READ_CAPACITY_10:
  524          status = sati_read_capacity_10_translate_command(
  525                      sequence, scsi_io, ata_io
  526                   );
  527       break;
  528 
  529       case SCSI_SERVICE_ACTION_IN_16:
  530          if ( (sati_get_cdb_byte(cdb, 1) & SCSI_SERVICE_ACTION_MASK)
  531               == SCSI_SERVICE_ACTION_IN_CODES_READ_CAPACITY_16)
  532             status = sati_read_capacity_16_translate_command(
  533                         sequence, scsi_io, ata_io
  534                      );
  535          else
  536             status = SATI_FAILURE_CHECK_RESPONSE_DATA;
  537       break;
  538 #endif // !defined(DISABLE_SATI_READ_CAPACITY)
  539 
  540 #if !defined(DISABLE_SATI_REQUEST_SENSE)
  541       case SCSI_REQUEST_SENSE:
  542          status = sati_request_sense_translate_command(
  543                      sequence, scsi_io, ata_io
  544                   );
  545       break;
  546 #endif // !defined(DISABLE_SATI_REQUEST_SENSE)
  547 
  548       case SCSI_READ_6:
  549          status = sati_read_6_translate_command(sequence, scsi_io, ata_io);
  550       break;
  551 
  552       case SCSI_READ_10:
  553          status = sati_read_10_translate_command(sequence, scsi_io, ata_io);
  554       break;
  555 
  556       case SCSI_READ_12:
  557          status = sati_read_12_translate_command(sequence, scsi_io, ata_io);
  558       break;
  559 
  560       case SCSI_READ_16:
  561          status = sati_read_16_translate_command(sequence, scsi_io, ata_io);
  562       break;
  563 
  564       case SCSI_WRITE_6:
  565          status = sati_write_6_translate_command(sequence, scsi_io, ata_io);
  566       break;
  567 
  568       case SCSI_WRITE_10:
  569          status = sati_write_10_translate_command(sequence, scsi_io, ata_io);
  570       break;
  571 
  572       case SCSI_WRITE_12:
  573          status = sati_write_12_translate_command(sequence, scsi_io, ata_io);
  574       break;
  575 
  576       case SCSI_WRITE_16:
  577          status = sati_write_16_translate_command(sequence, scsi_io, ata_io);
  578       break;
  579 
  580 #if !defined(DISABLE_SATI_VERIFY)
  581       case SCSI_VERIFY_10:
  582          status = sati_verify_10_translate_command(sequence, scsi_io, ata_io);
  583       break;
  584 
  585       case SCSI_VERIFY_12:
  586          status = sati_verify_12_translate_command(sequence, scsi_io, ata_io);
  587       break;
  588 
  589       case SCSI_VERIFY_16:
  590          status = sati_verify_16_translate_command(sequence, scsi_io, ata_io);
  591       break;
  592 #endif // !defined(DISABLE_SATI_VERIFY)
  593 
  594 #if    !defined(DISABLE_SATI_WRITE_AND_VERIFY)  \
  595    && !defined(DISABLE_SATI_VERIFY)        \
  596    && !defined(DISABLE_SATI_WRITE)
  597 
  598       case SCSI_WRITE_AND_VERIFY_10:
  599          status = sati_write_and_verify_10_translate_command(sequence, scsi_io, ata_io);
  600       break;
  601 
  602       case SCSI_WRITE_AND_VERIFY_12:
  603          status = sati_write_and_verify_12_translate_command(sequence, scsi_io, ata_io);
  604       break;
  605 
  606       case SCSI_WRITE_AND_VERIFY_16:
  607          status = sati_write_and_verify_16_translate_command(sequence, scsi_io, ata_io);
  608       break;
  609 #endif //    !defined(DISABLE_SATI_WRITE_AND_VERIFY)
  610       // && !defined(DISABLE_SATI_VERIFY)
  611       // && !defined(DISABLE_SATI_WRITE)
  612 
  613 #if !defined(DISABLE_SATI_REASSIGN_BLOCKS)
  614       case SCSI_REASSIGN_BLOCKS:
  615          status = sati_reassign_blocks_translate_command(sequence, scsi_io, ata_io);
  616       break;
  617 #endif // !defined(DISABLE_SATI_REASSIGN_BLOCKS)
  618 
  619 #if !defined(DISABLE_SATI_SYNCHRONIZE_CACHE)
  620       case SCSI_SYNCHRONIZE_CACHE_10:
  621       case SCSI_SYNCHRONIZE_CACHE_16:
  622          status = sati_synchronize_cache_translate_command(sequence, scsi_io, ata_io);
  623       break;
  624 #endif // !defined(DISABLE_SATI_SYNCHRONIZE_CACHE)
  625 
  626 #if !defined(DISABLE_SATI_START_STOP_UNIT)
  627       case SCSI_START_STOP_UNIT:
  628          status = sati_start_stop_unit_translate_command(
  629                      sequence, scsi_io, ata_io
  630                   );
  631       break;
  632 #endif // !defined(DISABLE_SATI_START_STOP_UNIT)
  633 
  634 #if !defined(DISABLE_SATI_WRITE_LONG)
  635       case SCSI_WRITE_LONG_10:
  636       case SCSI_WRITE_LONG_16:
  637          status = sati_write_long_translate_command(sequence, scsi_io, ata_io);
  638       break;
  639 #endif // !defined(DISABLE_SATI_WRITE_LONG)
  640 
  641 #if !defined(DISABLE_SATI_LOG_SENSE)
  642       case SCSI_LOG_SENSE:
  643          status = sati_log_sense_translate_command(sequence, scsi_io, ata_io);
  644       break;
  645 #endif // !defined(DISABLE_SATI_LOG_SENSE)
  646 
  647       case SCSI_PERSISTENT_RESERVE_IN:
  648       case SCSI_PERSISTENT_RESERVE_OUT:
  649          //These commands are not supported by SATI
  650          sati_scsi_sense_data_construct(
  651             sequence,
  652             scsi_io,
  653             SCSI_STATUS_CHECK_CONDITION,
  654             SCSI_SENSE_ILLEGAL_REQUEST,
  655             SCSI_ASC_INVALID_COMMAND_OPERATION_CODE,
  656             SCSI_ASCQ_INVALID_COMMAND_OPERATION_CODE
  657          );
  658          //returning status now to keep sense data set above
  659          return SATI_FAILURE_CHECK_RESPONSE_DATA;
  660       break;
  661 
  662 #if !defined(DISABLE_SATI_UNMAP)
  663       case SCSI_UNMAP:
  664          status = sati_unmap_translate_command(sequence, scsi_io, ata_io);
  665       break;
  666 #endif // !defined(DISABLE_SATI_UNMAP)
  667 
  668 #if !defined(DISABLE_SATI_ATA_PASSTHROUGH)
  669       case SCSI_ATA_PASSTHRU_12:
  670           status = sati_passthrough_12_translate_command(sequence, scsi_io, ata_io);
  671       break;
  672 
  673       case SCSI_ATA_PASSTHRU_16:
  674           status = sati_passthrough_16_translate_command(sequence, scsi_io, ata_io);
  675       break;
  676 
  677 #endif // !define(DISABLE_SATI_ATA_PASSTHRU)
  678 
  679 #if !defined(DISABLE_SATI_READ_BUFFER)
  680       case SCSI_READ_BUFFER:
  681          status = sati_read_buffer_translate_command(sequence, scsi_io, ata_io);
  682       break;
  683 #endif //!defined(DISABLE_SATI_READ_BUFFER)
  684 
  685 #if !defined(DISABLE_SATI_WRITE_BUFFER)
  686       case SCSI_WRITE_BUFFER:
  687          status = sati_write_buffer_translate_command(sequence, scsi_io, ata_io);
  688       break;
  689 #endif //!defined(DISABLE_SATI_WRITE_BUFFER)
  690       default:
  691          status = SATI_FAILURE_CHECK_RESPONSE_DATA;
  692       break;
  693    }
  694 
  695    if( (status == SATI_FAILURE_CHECK_RESPONSE_DATA) &&
  696        !(sequence->is_sense_response_set) )
  697    {
  698       sati_scsi_sense_data_construct(
  699          sequence,
  700          scsi_io,
  701          SCSI_STATUS_CHECK_CONDITION,
  702          SCSI_SENSE_ILLEGAL_REQUEST,
  703          SCSI_ASC_INVALID_FIELD_IN_CDB,
  704          SCSI_ASCQ_INVALID_FIELD_IN_CDB
  705       );
  706    }
  707    return status;
  708 }
  709 
  710 // -----------------------------------------------------------------------------
  711 
  712 #if !defined(DISABLE_SATI_TASK_MANAGEMENT)
  713 SATI_STATUS sati_translate_task_management(
  714    SATI_TRANSLATOR_SEQUENCE_T * sequence,
  715    SATI_DEVICE_T              * sati_device,
  716    void                       * scsi_task,
  717    void                       * ata_io
  718 )
  719 {
  720    SATI_STATUS status=SATI_FAILURE;
  721    U8 task_function = sati_cb_get_task_function(scsi_task);
  722 
  723    sequence->device = sati_device;
  724 
  725    switch (task_function)
  726    {
  727       /**
  728        * @todo We need to update the ABORT_TASK and ABORT_TASK_SET to be
  729        *       SAT compliant.
  730        */
  731       case SCSI_TASK_REQUEST_ABORT_TASK:
  732       case SCSI_TASK_REQUEST_LOGICAL_UNIT_RESET:
  733          status = sati_lun_reset_translate_command(sequence, scsi_task, ata_io);
  734       break;
  735 
  736       case SCSI_TASK_REQUEST_ABORT_TASK_SET:
  737 #if !defined(DISABLE_SATI_ABORT_TASK_SET)
  738          status = sati_abort_task_set_translate_command(sequence, scsi_task, ata_io);
  739 #else
  740          status = SATI_FAILURE;
  741 #endif
  742          break;
  743       default:
  744          status = SATI_FAILURE;
  745       break;
  746    }
  747 
  748    return status;
  749 }
  750 #endif // !defined(DISABLE_SATI_TASK_MANAGEMENT)
  751 
  752 // -----------------------------------------------------------------------------
  753 #if      !defined(DISABLE_SATI_INQUIRY)            \
  754       || !defined(DISABLE_SATI_READY_CAPACITY)     \
  755       || !defined(DISABLE_SATI_MODE_SENSE)         \
  756       || !defined(DISABLE_SATI_MODE_SELECT)        \
  757       || !defined(DISABLE_SATI_REASSIGN_BLOCKS)    \
  758       || !defined(DISABLE_SATI_START_STOP_UNIT)    \
  759       || !defined(DISABLE_SATI_REQUEST_SENSE)      \
  760       || !defined(DISABLE_SATI_WRITE_LONG)         \
  761       || !defined(DISABLE_SATI_LOG_SENSE)          \
  762       || !defined(DISABLE_SATI_UNMAP)
  763 
  764 static
  765 SATI_STATUS sati_check_data_io(
  766    SATI_TRANSLATOR_SEQUENCE_T * sequence
  767 )
  768 {
  769    if(sequence->state == SATI_SEQUENCE_STATE_INCOMPLETE)
  770    {
  771       return SATI_SEQUENCE_INCOMPLETE;
  772    }
  773    else if(sequence->number_data_bytes_set < sequence->allocation_length)
  774    {
  775       return SATI_COMPLETE_IO_DONE_EARLY;
  776    }
  777    else
  778    {
  779       return SATI_COMPLETE;
  780    }
  781 }
  782 #endif   //    !defined(DISABLE_SATI_INQUIRY)
  783          // || !defined(DISABLE_SATI_READY_CAPACITY)
  784          // || !defined(DISABLE_SATI_MODE_SENSE)
  785          // || !defined(DISABLE_SATI_MODE_SELECT)
  786          // || !defined(DISABLE_SATI_REASSIGN_BLOCKS)
  787          // || !defined(DISABLE_SATI_START_STOP_UNIT)
  788          // || !defined(DISABLE_SATI_REQUEST_SENSE)
  789          // || !defined(DISABLE_SATI_WRITE_LONG)
  790          // || !defined(DISABLE_SATI_LOG_SENSE)
  791          // || !defined(DISABLE_SATI_UNMAP)
  792 // -----------------------------------------------------------------------------
  793 SATI_STATUS sati_translate_command_response(
  794    SATI_TRANSLATOR_SEQUENCE_T * sequence,
  795    void                       * scsi_io,
  796    void                       * ata_io
  797 )
  798 {
  799    SATI_STATUS   status       = SATI_COMPLETE;
  800    U8          * register_fis = sati_cb_get_d2h_register_fis_address(ata_io);
  801    U8            ata_status;
  802 
  803    /**
  804     * If the device fault bit is set in the status register, then
  805     * set the sense data and return.
  806     */
  807    ata_status = (U8) sati_get_ata_status(register_fis);
  808    if (ata_status & ATA_STATUS_REG_DEVICE_FAULT_BIT)
  809    {
  810       sati_scsi_sense_data_construct(
  811          sequence,
  812          scsi_io,
  813          SCSI_STATUS_CHECK_CONDITION,
  814          SCSI_SENSE_HARDWARE_ERROR,
  815          SCSI_ASC_INTERNAL_TARGET_FAILURE,
  816          SCSI_ASCQ_INTERNAL_TARGET_FAILURE
  817       );
  818 
  819       sequence->device->state = SATI_DEVICE_STATE_DEVICE_FAULT_OCCURRED;
  820 
  821       // Make sure that the terminate sequence is called to allow
  822       // translation logic to perform any cleanup before the IO is completed.
  823       sati_sequence_terminate(sequence,
  824                               scsi_io,
  825                               ata_io);
  826 
  827       return SATI_FAILURE_CHECK_RESPONSE_DATA;
  828    }
  829 
  830    // Look at the sequence type to determine the response translation method
  831    // to invoke.
  832    switch (sequence->type)
  833    {
  834 #if !defined(DISABLE_SATI_TEST_UNIT_READY)
  835       case SATI_SEQUENCE_TEST_UNIT_READY:
  836          status = sati_test_unit_ready_translate_response(
  837                      sequence, scsi_io, ata_io
  838                   );
  839       break;
  840 #endif // !defined(DISABLE_SATI_TEST_UNIT_READY)
  841 
  842 #if    !defined(DISABLE_SATI_INQUIRY)        \
  843     || !defined(DISABLE_SATI_READY_CAPACITY) \
  844     || !defined(DISABLE_SATI_MODE_SENSE)
  845 
  846       case SATI_SEQUENCE_INQUIRY_EXECUTE_DEVICE_DIAG:
  847 
  848          if (ata_status & ATA_STATUS_REG_ERROR_BIT)
  849          {
  850             U8  error = (U8) sati_get_ata_error(register_fis);
  851             status    = SATI_FAILURE_CHECK_RESPONSE_DATA;
  852             sati_translate_error(sequence, scsi_io, error);
  853          }
  854          else
  855          {
  856             sati_inquiry_ata_information_finish_translation(
  857                sequence,
  858                scsi_io,
  859                ata_io
  860             );
  861             status = sati_check_data_io(sequence);
  862          }
  863       break;
  864 
  865       case SATI_SEQUENCE_INQUIRY_STANDARD:
  866       case SATI_SEQUENCE_INQUIRY_SUPPORTED_PAGES:
  867       case SATI_SEQUENCE_INQUIRY_SERIAL_NUMBER:
  868       case SATI_SEQUENCE_INQUIRY_BLOCK_DEVICE:
  869       case SATI_SEQUENCE_INQUIRY_ATA_INFORMATION:
  870       case SATI_SEQUENCE_INQUIRY_DEVICE_ID:
  871       case SATI_SEQUENCE_READ_CAPACITY_10:
  872       case SATI_SEQUENCE_READ_CAPACITY_16:
  873       case SATI_SEQUENCE_MODE_SENSE_6_CACHING:
  874       case SATI_SEQUENCE_MODE_SENSE_6_INFORMATIONAL_EXCP_CONTROL:
  875       case SATI_SEQUENCE_MODE_SENSE_6_READ_WRITE_ERROR:
  876       case SATI_SEQUENCE_MODE_SENSE_6_DISCONNECT_RECONNECT:
  877       case SATI_SEQUENCE_MODE_SENSE_6_CONTROL:
  878       case SATI_SEQUENCE_MODE_SENSE_6_POWER_CONDITION:
  879       case SATI_SEQUENCE_MODE_SENSE_6_ALL_PAGES:
  880       case SATI_SEQUENCE_MODE_SENSE_10_CACHING:
  881       case SATI_SEQUENCE_MODE_SENSE_10_INFORMATIONAL_EXCP_CONTROL:
  882       case SATI_SEQUENCE_MODE_SENSE_10_READ_WRITE_ERROR:
  883       case SATI_SEQUENCE_MODE_SENSE_10_CONTROL:
  884       case SATI_SEQUENCE_MODE_SENSE_10_POWER_CONDITION:
  885       case SATI_SEQUENCE_MODE_SENSE_10_DISCONNECT_RECONNECT:
  886       case SATI_SEQUENCE_MODE_SENSE_10_ALL_PAGES:
  887          // Did an error occur during the IO request?
  888          if (ata_status & ATA_STATUS_REG_ERROR_BIT)
  889          {
  890             U8  error = (U8) sati_get_ata_error(register_fis);
  891             status    = SATI_FAILURE_CHECK_RESPONSE_DATA;
  892             sati_translate_error(sequence, scsi_io, error);
  893          }
  894          else
  895          {
  896             void * ata_data = sati_cb_get_ata_data_address(ata_io);
  897 
  898             if(ata_data == NULL)
  899             {
  900                status = SATI_FAILURE;
  901             }
  902             else
  903             {
  904                sati_translate_data(sequence, ata_data, scsi_io);
  905                status = sati_check_data_io(sequence);
  906             }
  907          }
  908       break;
  909 #endif //    !defined(DISABLE_SATI_INQUIRY)
  910        // && !defined(DISABLE_SATI_READY_CAPACITY)
  911        // && !defined(DISABLE_SATI_MODE_SENSE)
  912 
  913 #if !defined(DISABLE_SATI_MODE_SELECT)
  914       case SATI_SEQUENCE_MODE_SELECT_MODE_PAGE_CACHING:
  915 
  916          status = sati_mode_select_translate_response(
  917             sequence, scsi_io, ata_io
  918                );
  919          if(status == SATI_COMPLETE)
  920          {
  921             status = sati_check_data_io(sequence);
  922          }
  923          break;
  924 
  925       case SATI_SEQUENCE_MODE_SELECT_MODE_POWER_CONDITION:
  926       case SATI_SEQUENCE_MODE_SELECT_MODE_INFORMATION_EXCEPT_CONTROL:
  927          // Did an error occur during the IO request?
  928          if (ata_status & ATA_STATUS_REG_ERROR_BIT)
  929          {
  930             U8  error = (U8) sati_get_ata_error(register_fis);
  931             status    = SATI_FAILURE_CHECK_RESPONSE_DATA;
  932             sati_translate_error(sequence, scsi_io, error);
  933          }
  934          else
  935          {
  936             status = sati_check_data_io(sequence);
  937          }
  938       break;
  939 #endif // !defined(DISABLE_SATI_MODE_SELECT)
  940 
  941 #if !defined(DISABLE_SATI_WRITE_AND_VERIFY)
  942       case SATI_SEQUENCE_WRITE_AND_VERIFY:
  943 
  944          if (ata_status & ATA_STATUS_REG_ERROR_BIT)
  945          {
  946             U8  error = (U8) sati_get_ata_error(register_fis);
  947             sati_translate_error(sequence, scsi_io, error);
  948 
  949             return SATI_FAILURE_CHECK_RESPONSE_DATA;
  950          }
  951          else
  952          {
  953             status = sati_write_and_verify_translate_response(
  954                         sequence,
  955                         scsi_io,
  956                         ata_io
  957                      );
  958          }
  959       break;
  960 #endif // !defined(DISABLE_SATI_WRITE_AND_VERIFY)
  961 
  962       case SATI_SEQUENCE_READ_6:
  963       case SATI_SEQUENCE_READ_10:
  964       case SATI_SEQUENCE_READ_12:
  965       case SATI_SEQUENCE_READ_16:
  966       case SATI_SEQUENCE_WRITE_6:
  967       case SATI_SEQUENCE_WRITE_10:
  968       case SATI_SEQUENCE_WRITE_12:
  969       case SATI_SEQUENCE_WRITE_16:
  970       case SATI_SEQUENCE_VERIFY_10:
  971       case SATI_SEQUENCE_VERIFY_12:
  972       case SATI_SEQUENCE_VERIFY_16:
  973       case SATI_SEQUENCE_SYNCHRONIZE_CACHE:
  974          if (ata_status & ATA_STATUS_REG_ERROR_BIT)
  975          {
  976             U8  error = (U8) sati_get_ata_error(register_fis);
  977             status    = SATI_FAILURE_CHECK_RESPONSE_DATA;
  978             sati_translate_error(sequence, scsi_io, error);
  979 
  980             if(sequence->state == SATI_SEQUENCE_STATE_READ_ERROR )
  981             {
  982                sati_scsi_read_error_sense_construct(
  983                   sequence,
  984                   scsi_io,
  985                   ata_io,
  986                   SCSI_STATUS_CHECK_CONDITION,
  987                   SCSI_SENSE_MEDIUM_ERROR,
  988                   SCSI_ASC_UNRECOVERED_READ_ERROR,
  989                   SCSI_ASCQ_UNRECOVERED_READ_ERROR
  990                );
  991                sequence->state = SATI_SEQUENCE_STATE_FINAL;
  992             }
  993          }
  994          else
  995          {
  996             // We haven't satisified the transfer count from the original
  997             // SCSI CDB.  As a result, we need to re-issue the command
  998             // with updated logical block address and transfer count.
  999             if (sequence->command_specific_data.scratch)
 1000             {
 1001                /** @todo update the contents of the CDB directly?  Should be
 1002                 *  done during previous command translation?
 1003                 */
 1004                status = SATI_SEQUENCE_INCOMPLETE;
 1005             }
 1006          }
 1007       break;
 1008 
 1009 #if !defined(DISABLE_SATI_READ_BUFFER)
 1010       case SATI_SEQUENCE_READ_BUFFER:
 1011          status = sati_read_buffer_translate_response(
 1012                      sequence, scsi_io, ata_io
 1013                   );
 1014 
 1015          if(status == SATI_COMPLETE)
 1016          {
 1017             status = sati_check_data_io(sequence);
 1018          }
 1019       break;
 1020 #endif //!defined(DISABLE_SATI_READ_BUFFER)
 1021 
 1022 #if !defined(DISABLE_SATI_WRITE_BUFFER)
 1023       case SATI_SEQUENCE_WRITE_BUFFER:
 1024       case SATI_SEQUENCE_WRITE_BUFFER_MICROCODE:
 1025          status = sati_write_buffer_translate_response(
 1026                      sequence, scsi_io, ata_io
 1027                   );
 1028       break;
 1029 #endif //!defined(DISABLE_SATI_WRITE_BUFFER)
 1030 
 1031 #if !defined(DISABLE_SATI_REASSIGN_BLOCKS)
 1032       case SATI_SEQUENCE_REASSIGN_BLOCKS:
 1033          status = sati_reassign_blocks_translate_response(
 1034                      sequence, scsi_io, ata_io
 1035                   );
 1036          if(status == SATI_COMPLETE)
 1037          {
 1038             status = sati_check_data_io(sequence);
 1039          }
 1040       break;
 1041 #endif // !defined(DISABLE_SATI_REASSIGN_BLOCKS)
 1042 
 1043 #if !defined(DISABLE_SATI_START_STOP_UNIT)
 1044       case SATI_SEQUENCE_START_STOP_UNIT:
 1045          status = sati_start_stop_unit_translate_response(
 1046                      sequence, scsi_io, ata_io
 1047                   );
 1048          if(status == SATI_COMPLETE)
 1049          {
 1050             status = sati_check_data_io(sequence);
 1051          }
 1052       break;
 1053 #endif // !defined(DISABLE_SATI_START_STOP_UNIT)
 1054 
 1055 #if !defined(DISABLE_SATI_REQUEST_SENSE)
 1056       case SATI_SEQUENCE_REQUEST_SENSE_SMART_RETURN_STATUS:
 1057       case SATI_SEQUENCE_REQUEST_SENSE_CHECK_POWER_MODE:
 1058          status = sati_request_sense_translate_response(
 1059                      sequence, scsi_io, ata_io
 1060                   );
 1061          if(status == SATI_COMPLETE)
 1062          {
 1063             status = sati_check_data_io(sequence);
 1064          }
 1065       break;
 1066 #endif // !defined(DISABLE_SATI_REQUEST_SENSE)
 1067 
 1068 #if !defined(DISABLE_SATI_WRITE_LONG)
 1069       case SATI_SEQUENCE_WRITE_LONG:
 1070          status = sati_write_long_translate_response(
 1071                      sequence, scsi_io, ata_io
 1072                   );
 1073          if(status == SATI_COMPLETE)
 1074          {
 1075             status = sati_check_data_io(sequence);
 1076          }
 1077       break;
 1078 #endif // !defined(DISABLE_SATI_WRITE_LONG)
 1079 
 1080 #if !defined(DISABLE_SATI_LOG_SENSE)
 1081       case SATI_SEQUENCE_LOG_SENSE_SUPPORTED_LOG_PAGE:
 1082       case SATI_SEQUENCE_LOG_SENSE_SELF_TEST_LOG_PAGE:
 1083       case SATI_SEQUENCE_LOG_SENSE_EXTENDED_SELF_TEST_LOG_PAGE:
 1084       case SATI_SEQUENCE_LOG_SENSE_INFO_EXCEPTION_LOG_PAGE:
 1085          status = sati_log_sense_translate_response(
 1086                      sequence, scsi_io, ata_io
 1087                   );
 1088          if(status == SATI_COMPLETE)
 1089          {
 1090             status = sati_check_data_io(sequence);
 1091          }
 1092       break;
 1093 #endif // !defined(DISABLE_SATI_LOG_SENSE)
 1094 
 1095 #if !defined(DISABLE_SATI_UNMAP)
 1096       case SATI_SEQUENCE_UNMAP:
 1097          status = sati_unmap_translate_response(
 1098                      sequence, scsi_io, ata_io
 1099                   );
 1100       break;
 1101 #endif // !defined(DISABLE_SATI_UNMAP)
 1102 
 1103 #if !defined(DISABLE_SATI_ATA_PASSTHROUGH)
 1104       case SATI_SEQUENCE_ATA_PASSTHROUGH_12:
 1105       case SATI_SEQUENCE_ATA_PASSTHROUGH_16:
 1106          status = sati_passthrough_translate_response(
 1107                      sequence, scsi_io, ata_io
 1108                   );
 1109       break;
 1110 #endif // !defined(DISABLE_SATI_ATA_PASSTHROUGH)
 1111 
 1112       default:
 1113          status = SATI_FAILURE_INVALID_SEQUENCE_TYPE;
 1114       break;
 1115    }
 1116 
 1117    return status;
 1118 }
 1119 
 1120 // -----------------------------------------------------------------------------
 1121 
 1122 #if !defined(DISABLE_SATI_TASK_MANAGEMENT)
 1123 SATI_STATUS sati_translate_task_response(
 1124    SATI_TRANSLATOR_SEQUENCE_T * sequence,
 1125    void                       * scsi_io,
 1126    void                       * ata_io
 1127 )
 1128 {
 1129    SATI_STATUS   status       = SATI_FAILURE_CHECK_RESPONSE_DATA;
 1130    U8          * register_fis = sati_cb_get_d2h_register_fis_address(ata_io);
 1131    U8            ata_status;
 1132 
 1133    /**
 1134     * If the device fault bit is set in the status register, then
 1135     * set the sense data and return.
 1136     */
 1137    ata_status = (U8) sati_get_ata_status(register_fis);
 1138    if (ata_status & ATA_STATUS_REG_DEVICE_FAULT_BIT)
 1139    {
 1140       sati_scsi_response_data_construct(
 1141          sequence,
 1142          scsi_io,
 1143          SCSI_TASK_MGMT_FUNC_FAILED
 1144       );
 1145       return SATI_FAILURE_CHECK_RESPONSE_DATA;
 1146    }
 1147 
 1148    // Look at the sequence type to determine the response translation method
 1149    // to invoke.
 1150    switch (sequence->type)
 1151    {
 1152       case SATI_SEQUENCE_LUN_RESET:
 1153          if (ata_status & ATA_STATUS_REG_ERROR_BIT)
 1154          {
 1155             sati_scsi_response_data_construct(
 1156                sequence, scsi_io, SCSI_TASK_MGMT_FUNC_FAILED);
 1157          }
 1158          else
 1159          {
 1160             sati_scsi_response_data_construct(
 1161                sequence, scsi_io, SCSI_TASK_MGMT_FUNC_COMPLETE);
 1162          }
 1163 
 1164          status = SATI_COMPLETE;
 1165       break;
 1166 
 1167 #if !defined(DISABLE_SATI_ABORT_TASK_SET)
 1168       case SATI_SEQUENCE_ABORT_TASK_SET:
 1169          if (ata_status & ATA_STATUS_REG_ERROR_BIT)
 1170          {
 1171             sati_scsi_response_data_construct(
 1172                sequence, scsi_io, SCSI_TASK_MGMT_FUNC_FAILED);
 1173          }
 1174          else
 1175          {
 1176             void * ata_data = sati_cb_get_ata_data_address(ata_io);
 1177 
 1178             if(ata_data == NULL)
 1179             {
 1180                status = SATI_FAILURE;
 1181             }
 1182             else
 1183             {
 1184                status = sati_abort_task_set_translate_data(
 1185                            sequence,
 1186                            ata_data,
 1187                            scsi_io
 1188                         );
 1189             }
 1190          }
 1191       break;
 1192 #endif // !defined(DISABLE_SATI_ABORT_TASK_SET)
 1193 
 1194       default:
 1195          status = SATI_FAILURE_INVALID_SEQUENCE_TYPE;
 1196       break;
 1197    }
 1198 
 1199    return status;
 1200 }
 1201 #endif // !defined(DISABLE_SATI_TASK_MANAGEMENT)
 1202 
 1203 #if !defined(ENABLE_MINIMUM_MEMORY_MODE)
 1204 U32 sati_get_sat_compliance_version(
 1205    void
 1206 )
 1207 {
 1208    return 2;  // Compliant with SAT-2.
 1209 }
 1210 
 1211 U32 sati_get_sat_compliance_version_revision(
 1212    void
 1213 )
 1214 {
 1215    return 7;  // Compliant with SAT-2 revision 7.
 1216 }
 1217 
 1218 #endif // !defined(ENABLE_MINIMUM_MEMORY_MODE)
 1219 
 1220 U16 sati_get_number_data_bytes_set(
 1221    SATI_TRANSLATOR_SEQUENCE_T * sequence
 1222 )
 1223 {
 1224    return sequence->number_data_bytes_set;
 1225 }
 1226 
 1227 void sati_sequence_construct(
 1228    SATI_TRANSLATOR_SEQUENCE_T * sequence
 1229 )
 1230 {
 1231    sequence->state = SATI_SEQUENCE_STATE_INITIAL;
 1232 }
 1233 
 1234 void sati_sequence_terminate(
 1235    SATI_TRANSLATOR_SEQUENCE_T * sequence,
 1236    void                       * scsi_io,
 1237    void                       * ata_io
 1238 )
 1239 {
 1240    // Decode the sequence type to determine how to handle the termination
 1241    // of the translation method.
 1242    switch (sequence->type)
 1243    {
 1244    case SATI_SEQUENCE_UNMAP:
 1245       sati_unmap_terminate(sequence,scsi_io,ata_io);
 1246    break;
 1247    }
 1248 }

Cache object: eedde4a41f0b3622a117232177d112c6


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.