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