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