xref: /freebsd/sys/dev/isci/scil/sati.c (revision b9f654b163bce26de79705e77b872427c9f2afa1)
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 }
1249