xref: /freebsd/sys/dev/isci/scil/sati_log_sense.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 the method definitions to translate
59f11c7f63SJim Harris *        SCSI Log Sense command based of the SATv2 spec.
60f11c7f63SJim Harris */
61f11c7f63SJim Harris 
62f11c7f63SJim Harris #if !defined(DISABLE_SATI_LOG_SENSE)
63f11c7f63SJim Harris 
64f11c7f63SJim Harris #include <dev/isci/scil/sati_log_sense.h>
65f11c7f63SJim Harris #include <dev/isci/scil/sati_callbacks.h>
66f11c7f63SJim Harris #include <dev/isci/scil/sati_util.h>
67f11c7f63SJim Harris 
68f11c7f63SJim Harris //******************************************************************************
69f11c7f63SJim Harris //* P R I V A T E   M E T H O D S
70f11c7f63SJim Harris //******************************************************************************
71f11c7f63SJim Harris 
72f11c7f63SJim Harris /**
73f11c7f63SJim Harris  * @brief This method constructs the SATI supported log page. This is a log
74f11c7f63SJim Harris  *        containing the page codes of all the SATI supported log pages.
75f11c7f63SJim Harris  *
76f11c7f63SJim Harris  * @return n/a
77f11c7f63SJim Harris  *
78f11c7f63SJim Harris  */
79f11c7f63SJim Harris static
sati_supported_log_page_construct(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io)80f11c7f63SJim Harris void sati_supported_log_page_construct(
81f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T  * sequence,
82f11c7f63SJim Harris    void                        * scsi_io
83f11c7f63SJim Harris )
84f11c7f63SJim Harris {
85f11c7f63SJim Harris    U32 next_byte;
86f11c7f63SJim Harris    //set SPF = 0 and PAGE_CODE = 0
87f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 0, 0x00);
88f11c7f63SJim Harris 
89f11c7f63SJim Harris    //set SUBPAGE_CODE = 0
90f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 1, 0x00);
91f11c7f63SJim Harris 
92f11c7f63SJim Harris    //set the Page Length to (n-3) or 2 because only two log pages are supported
93f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 2, 0x00);
94f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 3, 0x02);
95f11c7f63SJim Harris 
96f11c7f63SJim Harris    //specify the next byte to be set
97f11c7f63SJim Harris    next_byte = 4;
98f11c7f63SJim Harris 
99f11c7f63SJim Harris    if(sequence->device->capabilities & SATI_DEVICE_CAP_SMART_SUPPORT)
100f11c7f63SJim Harris    {
101f11c7f63SJim Harris       sati_set_data_byte(
102f11c7f63SJim Harris          sequence,
103f11c7f63SJim Harris          scsi_io,
104f11c7f63SJim Harris          next_byte,
105f11c7f63SJim Harris          SCSI_LOG_PAGE_INFORMATION_EXCEPTION
106f11c7f63SJim Harris       );
107f11c7f63SJim Harris       next_byte = 5;
108f11c7f63SJim Harris    }
109f11c7f63SJim Harris 
110f11c7f63SJim Harris    if(sequence->device->capabilities & SATI_DEVICE_CAP_SMART_SELF_TEST_SUPPORT)
111f11c7f63SJim Harris    {
112f11c7f63SJim Harris       sati_set_data_byte(
113f11c7f63SJim Harris          sequence,
114f11c7f63SJim Harris          scsi_io,
115f11c7f63SJim Harris          next_byte,
116f11c7f63SJim Harris          SCSI_LOG_PAGE_SELF_TEST
117f11c7f63SJim Harris       );
118f11c7f63SJim Harris    }
119f11c7f63SJim Harris }
120f11c7f63SJim Harris 
121f11c7f63SJim Harris /**
122f11c7f63SJim Harris  * @brief This method sets bytes 4-19 of the self-test log parameter to zero.
123f11c7f63SJim Harris  *
124f11c7f63SJim Harris  * @return n/a
125f11c7f63SJim Harris  *
126f11c7f63SJim Harris  */
127f11c7f63SJim Harris static
sati_set_parameters_to_zero(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io)128f11c7f63SJim Harris void sati_set_parameters_to_zero(
129f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T * sequence,
130f11c7f63SJim Harris    void                       * scsi_io
131f11c7f63SJim Harris )
132f11c7f63SJim Harris {
133f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 8, 0x00);   //log_parameter byte 4
134f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 9, 0x00);   //log_parameter byte 5
135f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 10, 0x00);  //log_parameter byte 6
136f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 11, 0x00);  //log_parameter byte 7
137f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 12, 0x00);  //log_parameter byte 8
138f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 13, 0x00);  //log_parameter byte 9
139f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 14, 0x00);  //log_parameter byte 10
140f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 15, 0x00);  //log_parameter byte 11
141f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 16, 0x00);  //log_parameter byte 12
142f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 17, 0x00);  //log_parameter byte 13
143f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 18, 0x00);  //log_parameter byte 14
144f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 19, 0x00);  //log_parameter byte 15
145f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 20, 0x00);  //log_parameter byte 16
146f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 21, 0x00);  //log_parameter byte 17
147f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 22, 0x00);  //log_parameter byte 18
148f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 23, 0x00);  //log_parameter byte 19
149f11c7f63SJim Harris }
150f11c7f63SJim Harris 
151f11c7f63SJim Harris /**
152f11c7f63SJim Harris  * @brief This method translates the ATA Extended SMART self-test log into
153f11c7f63SJim Harris  *        SCSI Sense Key, Additional Sense Code, and Additional Sense code
154f11c7f63SJim Harris  *        qualifiers based on the self test status byte in the appropriate
155f11c7f63SJim Harris  *        descriptor entry.
156f11c7f63SJim Harris  *
157f11c7f63SJim Harris  * @return n/a
158f11c7f63SJim Harris  *
159f11c7f63SJim Harris  */
160f11c7f63SJim Harris static
sati_translate_sense_values(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io,U8 self_test_status_byte)161f11c7f63SJim Harris void sati_translate_sense_values(
162f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T * sequence,
163f11c7f63SJim Harris    void                       * scsi_io,
164f11c7f63SJim Harris    U8                           self_test_status_byte
165f11c7f63SJim Harris )
166f11c7f63SJim Harris {
167f11c7f63SJim Harris    //byte 17
168f11c7f63SJim Harris    sati_set_data_byte(
169f11c7f63SJim Harris       sequence,
170f11c7f63SJim Harris       scsi_io,
171f11c7f63SJim Harris       21,
172f11c7f63SJim Harris       SCSI_DIAGNOSTIC_FAILURE_ON_COMPONENT
173f11c7f63SJim Harris    );
174f11c7f63SJim Harris 
175f11c7f63SJim Harris    switch(self_test_status_byte)
176f11c7f63SJim Harris    {
177f11c7f63SJim Harris       case 1:
178f11c7f63SJim Harris          //byte 16
179f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_ABORTED_COMMAND);
180f11c7f63SJim Harris 
181f11c7f63SJim Harris          //byte 18
182f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x81);
183f11c7f63SJim Harris          break;
184f11c7f63SJim Harris 
185f11c7f63SJim Harris       case 2:
186f11c7f63SJim Harris          //byte 16
187f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_ABORTED_COMMAND);
188f11c7f63SJim Harris 
189f11c7f63SJim Harris          //byte 18
190f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x82);
191f11c7f63SJim Harris          break;
192f11c7f63SJim Harris 
193f11c7f63SJim Harris       case 3:
194f11c7f63SJim Harris          //byte 16
195f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_ABORTED_COMMAND);
196f11c7f63SJim Harris 
197f11c7f63SJim Harris          //byte 18
198f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x83);
199f11c7f63SJim Harris          break;
200f11c7f63SJim Harris 
201f11c7f63SJim Harris       case 4:
202f11c7f63SJim Harris          //byte 16
203f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_HARDWARE_ERROR);
204f11c7f63SJim Harris 
205f11c7f63SJim Harris          //byte 18
206f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x84);
207f11c7f63SJim Harris          break;
208f11c7f63SJim Harris 
209f11c7f63SJim Harris       case 5:
210f11c7f63SJim Harris          //byte 16
211f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_HARDWARE_ERROR);
212f11c7f63SJim Harris 
213f11c7f63SJim Harris          //byte 18
214f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x85);
215f11c7f63SJim Harris          break;
216f11c7f63SJim Harris 
217f11c7f63SJim Harris       case 6:
218f11c7f63SJim Harris          //byte 16
219f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_HARDWARE_ERROR);
220f11c7f63SJim Harris 
221f11c7f63SJim Harris          //byte 18
222f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x86);
223f11c7f63SJim Harris          break;
224f11c7f63SJim Harris 
225f11c7f63SJim Harris       case 7:
226f11c7f63SJim Harris          //byte 16
227f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_MEDIUM_ERROR);
228f11c7f63SJim Harris 
229f11c7f63SJim Harris          //byte 18
230f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x87);
231f11c7f63SJim Harris          break;
232f11c7f63SJim Harris 
233f11c7f63SJim Harris       case 8:
234f11c7f63SJim Harris          //byte 16
235f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_HARDWARE_ERROR);
236f11c7f63SJim Harris 
237f11c7f63SJim Harris          //byte 18
238f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x88);
239f11c7f63SJim Harris          break;
240f11c7f63SJim Harris 
241f11c7f63SJim Harris       default:
242f11c7f63SJim Harris          //byte 16
243f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 20, SCSI_SENSE_NO_SENSE);
244f11c7f63SJim Harris          //byte 17
245f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 21, SCSI_ASC_NO_ADDITIONAL_SENSE);
246f11c7f63SJim Harris          //byte 18
247f11c7f63SJim Harris          sati_set_data_byte(sequence, scsi_io, 22, 0x00);
248f11c7f63SJim Harris          break;
249f11c7f63SJim Harris    }
250f11c7f63SJim Harris 
251f11c7f63SJim Harris }
252f11c7f63SJim Harris 
253f11c7f63SJim Harris /**
254f11c7f63SJim Harris  * @brief This method retrieves the correct self-test results by checking the
255f11c7f63SJim Harris  *        descriptor index in the extended SMART self-test log. The index is
256f11c7f63SJim Harris  *        used to determine the appropriate descriptor entry.
257f11c7f63SJim Harris  *
258f11c7f63SJim Harris  * @return n/a
259f11c7f63SJim Harris  *
260f11c7f63SJim Harris  */
261f11c7f63SJim Harris static
sati_get_self_test_results(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io,ATA_EXTENDED_SMART_SELF_TEST_LOG_T * ata_log)262f11c7f63SJim Harris void sati_get_self_test_results(
263f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T          * sequence,
264f11c7f63SJim Harris    void                                * scsi_io,
265f11c7f63SJim Harris    ATA_EXTENDED_SMART_SELF_TEST_LOG_T  * ata_log
266f11c7f63SJim Harris )
267f11c7f63SJim Harris {
268f11c7f63SJim Harris    U16 descriptor_index = *((U16 *)(&ata_log->self_test_descriptor_index[0]));
269f11c7f63SJim Harris 
270f11c7f63SJim Harris    /*
271f11c7f63SJim Harris     * SATv2 wants data from descriptor N where N is equal to
272f11c7f63SJim Harris     * (descriptor_index - parameter_code) + 1. Since parameter
273f11c7f63SJim Harris     * code is always 0x0001 just checking descriptor_index.
274f11c7f63SJim Harris     */
275f11c7f63SJim Harris 
276f11c7f63SJim Harris    if(descriptor_index <= 0)
277f11c7f63SJim Harris    {
278f11c7f63SJim Harris       sati_set_parameters_to_zero(sequence, scsi_io);
279f11c7f63SJim Harris    }
280f11c7f63SJim Harris    else
281f11c7f63SJim Harris    {
282f11c7f63SJim Harris       sati_set_data_byte(
283f11c7f63SJim Harris        sequence,
284f11c7f63SJim Harris        scsi_io,
285f11c7f63SJim Harris        8,
286f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.status_byte
287f11c7f63SJim Harris       );
288f11c7f63SJim Harris 
289f11c7f63SJim Harris       //Sef-test number unspecified per satv2
290f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 9, 0x00);
291f11c7f63SJim Harris       sati_set_data_byte(
292f11c7f63SJim Harris        sequence,
293f11c7f63SJim Harris        scsi_io,
294f11c7f63SJim Harris        10,
295f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.time_stamp_high
296f11c7f63SJim Harris       );
297f11c7f63SJim Harris 
298f11c7f63SJim Harris       sati_set_data_byte(
299f11c7f63SJim Harris        sequence,
300f11c7f63SJim Harris        scsi_io,
301f11c7f63SJim Harris        11,
302f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.time_stamp_low
303f11c7f63SJim Harris       );
304f11c7f63SJim Harris 
305f11c7f63SJim Harris       //set to zero because it's a 48bit address
306f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 12, 0x00);
307f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 13, 0x00);
308f11c7f63SJim Harris 
309f11c7f63SJim Harris       sati_set_data_byte(
310f11c7f63SJim Harris        sequence,
311f11c7f63SJim Harris        scsi_io,
312f11c7f63SJim Harris        14,
313f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.failing_lba_high_ext
314f11c7f63SJim Harris       );
315f11c7f63SJim Harris 
316f11c7f63SJim Harris       sati_set_data_byte(
317f11c7f63SJim Harris        sequence,
318f11c7f63SJim Harris        scsi_io,
319f11c7f63SJim Harris        15,
320f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.failing_lba_mid_ext
321f11c7f63SJim Harris       );
322f11c7f63SJim Harris 
323f11c7f63SJim Harris       sati_set_data_byte(
324f11c7f63SJim Harris        sequence,
325f11c7f63SJim Harris        scsi_io,
326f11c7f63SJim Harris        16,
327f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.failing_lba_low_ext
328f11c7f63SJim Harris       );
329f11c7f63SJim Harris 
330f11c7f63SJim Harris       sati_set_data_byte(
331f11c7f63SJim Harris        sequence,
332f11c7f63SJim Harris        scsi_io,
333f11c7f63SJim Harris        17,
334f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.failing_lba_high
335f11c7f63SJim Harris       );
336f11c7f63SJim Harris 
337f11c7f63SJim Harris       sati_set_data_byte(
338f11c7f63SJim Harris        sequence,
339f11c7f63SJim Harris        scsi_io,
340f11c7f63SJim Harris        18,
341f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.failing_lba_mid
342f11c7f63SJim Harris       );
343f11c7f63SJim Harris 
344f11c7f63SJim Harris       sati_set_data_byte(
345f11c7f63SJim Harris        sequence,
346f11c7f63SJim Harris        scsi_io,
347f11c7f63SJim Harris        19,
348f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.failing_lba_low
349f11c7f63SJim Harris       );
350f11c7f63SJim Harris 
351f11c7f63SJim Harris       sati_translate_sense_values(
352f11c7f63SJim Harris        sequence,
353f11c7f63SJim Harris        scsi_io,
354f11c7f63SJim Harris        ata_log->descriptor_entrys[descriptor_index].DESCRIPTOR_ENTRY.status_byte
355f11c7f63SJim Harris       );
356f11c7f63SJim Harris    }
357f11c7f63SJim Harris }
358f11c7f63SJim Harris 
359f11c7f63SJim Harris /**
360f11c7f63SJim Harris * @brief This method will construct the first eight bytes of the SCSI self test
361f11c7f63SJim Harris *        log page for both cases when SATI sends a ATA read log ext and a smart
362f11c7f63SJim Harris *        read log command.
363f11c7f63SJim Harris *
364f11c7f63SJim Harris * @return n/a
365f11c7f63SJim Harris *
366f11c7f63SJim Harris */
367f11c7f63SJim Harris static
sati_self_test_log_header_construct(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io)368f11c7f63SJim Harris void sati_self_test_log_header_construct(
369f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T  * sequence,
370f11c7f63SJim Harris    void                        * scsi_io
371f11c7f63SJim Harris )
372f11c7f63SJim Harris {
373f11c7f63SJim Harris    //PAGE CODE for Self-Test Log Page
374f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 0, 0x10);
375f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 1, 0x00);
376f11c7f63SJim Harris 
377f11c7f63SJim Harris    //PAGE LENGTH is 0x14 instead of 0x190, not returning 20/0x190 log perameters
378f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 2, 0x00);
379f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 3, 0x14);
380f11c7f63SJim Harris 
381f11c7f63SJim Harris    /*
382f11c7f63SJim Harris     * Log PARAMETER 0x0001
383f11c7f63SJim Harris     * Only sending one log parameter per self-test request.
384f11c7f63SJim Harris     */
385f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 4, 0x00);       //log_parameter byte 0
386f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 5, 0x01);       //log_parameter byte 1
387f11c7f63SJim Harris 
388f11c7f63SJim Harris    //Set to 0x03 per SATv2 spec
389f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 6, 0x03);       //log_parameter byte 2
390f11c7f63SJim Harris 
391f11c7f63SJim Harris    //Parameter Length set to 0x10 per SATv2 spec
392f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 7, 0x10);       //log_parameter byte 3
393f11c7f63SJim Harris }
394f11c7f63SJim Harris 
395f11c7f63SJim Harris /**
396f11c7f63SJim Harris  * @brief This method will construct the SCSI self test log page from
397453130d9SPedro F. Giffuni  *        the Extended SMART self-test log response received from the
398f11c7f63SJim Harris  *        ATA device. The response is from a ATA_Read_Log_EXT command
399f11c7f63SJim Harris  *        issued by SATI.
400f11c7f63SJim Harris  *
401f11c7f63SJim Harris  * @return n/a
402f11c7f63SJim Harris  *
403f11c7f63SJim Harris  */
404f11c7f63SJim Harris static
sati_extended_self_test_log_page_construct(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io,void * ata_data)405f11c7f63SJim Harris void sati_extended_self_test_log_page_construct(
406f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T  * sequence,
407f11c7f63SJim Harris    void                        * scsi_io,
408f11c7f63SJim Harris    void                        * ata_data
409f11c7f63SJim Harris )
410f11c7f63SJim Harris {
411f11c7f63SJim Harris    ATA_EXTENDED_SMART_SELF_TEST_LOG_T * ata_log =
412f11c7f63SJim Harris                   (ATA_EXTENDED_SMART_SELF_TEST_LOG_T*) ata_data;
413f11c7f63SJim Harris 
414f11c7f63SJim Harris    sati_self_test_log_header_construct(sequence, scsi_io);
415f11c7f63SJim Harris 
416f11c7f63SJim Harris    //bytes 4-19
417f11c7f63SJim Harris    if( (ata_log->self_test_descriptor_index[0] == 0) &&
418f11c7f63SJim Harris        (ata_log->self_test_descriptor_index[1] == 0))
419f11c7f63SJim Harris    {
420f11c7f63SJim Harris       sati_set_parameters_to_zero(sequence, scsi_io);
421f11c7f63SJim Harris    }
422f11c7f63SJim Harris    else
423f11c7f63SJim Harris    {
424f11c7f63SJim Harris       sati_get_self_test_results(sequence, scsi_io, ata_log);
425f11c7f63SJim Harris    }
426f11c7f63SJim Harris }
427f11c7f63SJim Harris 
428f11c7f63SJim Harris /**
429f11c7f63SJim Harris * @brief This method will construct the SCSI self test log page from
430453130d9SPedro F. Giffuni *        the SMART self-test log response received from the ATA device.
431f11c7f63SJim Harris *        The response is from a ATA_SMART_Read_Log command issued by SATI.
432f11c7f63SJim Harris *
433f11c7f63SJim Harris * @return n/a
434f11c7f63SJim Harris *
435f11c7f63SJim Harris */
436f11c7f63SJim Harris static
sati_self_test_log_page_construct(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io,void * ata_data)437f11c7f63SJim Harris void sati_self_test_log_page_construct(
438f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T  * sequence,
439f11c7f63SJim Harris    void                        * scsi_io,
440f11c7f63SJim Harris    void                        * ata_data
441f11c7f63SJim Harris )
442f11c7f63SJim Harris {
443f11c7f63SJim Harris    ATA_SMART_SELF_TEST_LOG_T * ata_log =
444f11c7f63SJim Harris                         (ATA_SMART_SELF_TEST_LOG_T*) ata_data;
445f11c7f63SJim Harris 
446f11c7f63SJim Harris    sati_self_test_log_header_construct(sequence, scsi_io);
447f11c7f63SJim Harris 
448f11c7f63SJim Harris    //first descriptor entry(index == 0) is always used because scsi_parameter_code == 1
449f11c7f63SJim Harris    sati_set_data_byte(
450f11c7f63SJim Harris       sequence,
451f11c7f63SJim Harris       scsi_io,
452f11c7f63SJim Harris       8,
453f11c7f63SJim Harris       ata_log->descriptor_entrys[0].SMART_DESCRIPTOR_ENTRY.status_byte
454f11c7f63SJim Harris    );
455f11c7f63SJim Harris 
456f11c7f63SJim Harris    //Sef-test number unspecified per satv2
457f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 9, 0x00);
458f11c7f63SJim Harris 
459f11c7f63SJim Harris    sati_set_data_byte(
460f11c7f63SJim Harris       sequence,
461f11c7f63SJim Harris       scsi_io,
462f11c7f63SJim Harris       10,
463f11c7f63SJim Harris       ata_log->descriptor_entrys[0].SMART_DESCRIPTOR_ENTRY.time_stamp_high
464f11c7f63SJim Harris    );
465f11c7f63SJim Harris 
466f11c7f63SJim Harris    sati_set_data_byte(
467f11c7f63SJim Harris       sequence,
468f11c7f63SJim Harris       scsi_io,
469f11c7f63SJim Harris       11,
470f11c7f63SJim Harris       ata_log->descriptor_entrys[0].SMART_DESCRIPTOR_ENTRY.time_stamp_low
471f11c7f63SJim Harris    );
472f11c7f63SJim Harris 
473f11c7f63SJim Harris    //set to zero because it's a 28bit address
474f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 12, 0x00);
475f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 13, 0x00);
476f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 14, 0x00);
477f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 15, 0x00);
478f11c7f63SJim Harris 
479f11c7f63SJim Harris    sati_set_data_byte(
480f11c7f63SJim Harris       sequence,
481f11c7f63SJim Harris       scsi_io,
482f11c7f63SJim Harris       16,
483f11c7f63SJim Harris       ata_log->descriptor_entrys[0].SMART_DESCRIPTOR_ENTRY.failing_lba_low_ext
484f11c7f63SJim Harris    );
485f11c7f63SJim Harris 
486f11c7f63SJim Harris    sati_set_data_byte(
487f11c7f63SJim Harris       sequence,
488f11c7f63SJim Harris       scsi_io,
489f11c7f63SJim Harris       17,
490f11c7f63SJim Harris       ata_log->descriptor_entrys[0].SMART_DESCRIPTOR_ENTRY.failing_lba_high
491f11c7f63SJim Harris    );
492f11c7f63SJim Harris 
493f11c7f63SJim Harris    sati_set_data_byte(
494f11c7f63SJim Harris       sequence,
495f11c7f63SJim Harris       scsi_io,
496f11c7f63SJim Harris       18,
497f11c7f63SJim Harris       ata_log->descriptor_entrys[0].SMART_DESCRIPTOR_ENTRY.failing_lba_mid
498f11c7f63SJim Harris    );
499f11c7f63SJim Harris 
500f11c7f63SJim Harris    sati_set_data_byte(
501f11c7f63SJim Harris       sequence,
502f11c7f63SJim Harris       scsi_io,
503f11c7f63SJim Harris       19,
504f11c7f63SJim Harris       ata_log->descriptor_entrys[0].SMART_DESCRIPTOR_ENTRY.failing_lba_low
505f11c7f63SJim Harris    );
506f11c7f63SJim Harris 
507f11c7f63SJim Harris    sati_translate_sense_values(
508f11c7f63SJim Harris       sequence,
509f11c7f63SJim Harris       scsi_io,
510f11c7f63SJim Harris       ata_log->descriptor_entrys[0].SMART_DESCRIPTOR_ENTRY.status_byte
511f11c7f63SJim Harris    );
512f11c7f63SJim Harris }
513f11c7f63SJim Harris 
514f11c7f63SJim Harris /**
515f11c7f63SJim Harris * @brief This method will construct the SCSI information exception log page from
516453130d9SPedro F. Giffuni *        the ATA SMART response received from the ATA device. The response is
517f11c7f63SJim Harris *         from a ATA SMART return status command issued by SATI.
518f11c7f63SJim Harris *
519f11c7f63SJim Harris * @return n/a
520f11c7f63SJim Harris *
521f11c7f63SJim Harris */
522f11c7f63SJim Harris static
sati_information_exception_log_page_contruct(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io,void * ata_io)523f11c7f63SJim Harris void sati_information_exception_log_page_contruct(
524f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T  * sequence,
525f11c7f63SJim Harris    void                        * scsi_io,
526f11c7f63SJim Harris    void                        * ata_io
527f11c7f63SJim Harris )
528f11c7f63SJim Harris {
529f11c7f63SJim Harris    U8 * register_fis = sati_cb_get_d2h_register_fis_address(ata_io);
530f11c7f63SJim Harris    U32 mid_register = sati_get_ata_lba_mid(register_fis);
531f11c7f63SJim Harris    U32 high_register = sati_get_ata_lba_high(register_fis);
532f11c7f63SJim Harris 
533f11c7f63SJim Harris    //Information Exception Page code
534f11c7f63SJim Harris    sati_set_data_byte(
535f11c7f63SJim Harris       sequence,
536f11c7f63SJim Harris       scsi_io,
537f11c7f63SJim Harris       0,
538f11c7f63SJim Harris       SCSI_LOG_PAGE_INFORMATION_EXCEPTION
539f11c7f63SJim Harris    );
540f11c7f63SJim Harris 
541f11c7f63SJim Harris    //Sub-page code
542f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 1, 0x00);
543f11c7f63SJim Harris 
544f11c7f63SJim Harris    //Page length of log parameters
545f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 2, 0x00);
546f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 3, 0x08);
547f11c7f63SJim Harris 
548f11c7f63SJim Harris    //parameter code
549f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 4, 0x00);
550f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 5, 0x00);
551f11c7f63SJim Harris 
552f11c7f63SJim Harris    //Format and Linking
553f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 6, 0x03);
554f11c7f63SJim Harris    //Parameter Length
555f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 7, 0x04);
556f11c7f63SJim Harris 
557f11c7f63SJim Harris    if(mid_register == ATA_MID_REGISTER_THRESHOLD_EXCEEDED
558f11c7f63SJim Harris       && high_register == ATA_HIGH_REGISTER_THRESHOLD_EXCEEDED)
559f11c7f63SJim Harris    {
560f11c7f63SJim Harris       sati_set_data_byte(
561f11c7f63SJim Harris          sequence,
562f11c7f63SJim Harris          scsi_io,
563f11c7f63SJim Harris          8,
564f11c7f63SJim Harris          SCSI_ASC_HARDWARE_IMPENDING_FAILURE
565f11c7f63SJim Harris       );
566f11c7f63SJim Harris 
567f11c7f63SJim Harris       sati_set_data_byte(
568f11c7f63SJim Harris          sequence,
569f11c7f63SJim Harris          scsi_io,
570f11c7f63SJim Harris          9,
571f11c7f63SJim Harris          SCSI_ASCQ_GENERAL_HARD_DRIVE_FAILURE
572f11c7f63SJim Harris       );
573f11c7f63SJim Harris    }
574f11c7f63SJim Harris    else
575f11c7f63SJim Harris    {
576f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 8, SCSI_ASC_NO_ADDITIONAL_SENSE);
577f11c7f63SJim Harris       sati_set_data_byte(sequence, scsi_io, 9, SCSI_ASCQ_NO_ADDITIONAL_SENSE);
578f11c7f63SJim Harris    }
579f11c7f63SJim Harris    //setting most recent temperature reading to 0xFF(not supported) for now.
580f11c7f63SJim Harris    sati_set_data_byte(sequence, scsi_io, 10, 0xFF);
581f11c7f63SJim Harris }
582f11c7f63SJim Harris 
583f11c7f63SJim Harris //******************************************************************************
584f11c7f63SJim Harris //* P U B L I C   M E T H O D S
585f11c7f63SJim Harris //******************************************************************************
586f11c7f63SJim Harris 
587f11c7f63SJim Harris /**
588f11c7f63SJim Harris  * @brief This method will translate the SCSI Log Sense command into ATA commands
589f11c7f63SJim Harris  *        specified by SATv2. ATA commands Read Log EXT and SMART Read Log will
590f11c7f63SJim Harris  *        be issued by this translation.
591f11c7f63SJim Harris  *
592f11c7f63SJim Harris  * @return SATI_STATUS Indicates if the command translation succeeded.
593f11c7f63SJim Harris  *
594f11c7f63SJim Harris  */
sati_log_sense_translate_command(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io,void * ata_io)595f11c7f63SJim Harris SATI_STATUS sati_log_sense_translate_command(
596f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T * sequence,
597f11c7f63SJim Harris    void                       * scsi_io,
598f11c7f63SJim Harris    void                       * ata_io
599f11c7f63SJim Harris )
600f11c7f63SJim Harris {
601f11c7f63SJim Harris    U8 * cdb = sati_cb_get_cdb_address(scsi_io);
602f11c7f63SJim Harris    SATI_STATUS status = SATI_FAILURE;
603f11c7f63SJim Harris 
604f11c7f63SJim Harris    if(SATI_LOG_SENSE_GET_PC_FIELD(cdb) == 1 &&
605f11c7f63SJim Harris       (sati_get_cdb_byte(cdb, 3) == 0))
606f11c7f63SJim Harris    {
607f11c7f63SJim Harris       sequence->allocation_length = (sati_get_cdb_byte(cdb, 7) << 8) |
608f11c7f63SJim Harris                                     (sati_get_cdb_byte(cdb, 8));
609f11c7f63SJim Harris 
610f11c7f63SJim Harris       switch(SATI_LOG_SENSE_GET_PAGE_CODE(cdb))
611f11c7f63SJim Harris       {
612f11c7f63SJim Harris          //Return Supported Log Pages log page
613f11c7f63SJim Harris          case SCSI_LOG_PAGE_SUPPORTED_PAGES :
614f11c7f63SJim Harris             sati_supported_log_page_construct(sequence, scsi_io);
615f11c7f63SJim Harris             sequence->type = SATI_SEQUENCE_LOG_SENSE_SUPPORTED_LOG_PAGE;
616f11c7f63SJim Harris             status = SATI_COMPLETE;
617f11c7f63SJim Harris             break;
618f11c7f63SJim Harris 
619f11c7f63SJim Harris          //Return Self-Test Results log page
620f11c7f63SJim Harris          case SCSI_LOG_PAGE_SELF_TEST :
621f11c7f63SJim Harris 
622f11c7f63SJim Harris             if((sequence->device->capabilities &
623f11c7f63SJim Harris                SATI_DEVICE_CAP_SMART_SELF_TEST_SUPPORT) == 0)
624f11c7f63SJim Harris             {
625f11c7f63SJim Harris                sati_scsi_sense_data_construct(
626f11c7f63SJim Harris                   sequence,
627f11c7f63SJim Harris                   scsi_io,
628f11c7f63SJim Harris                   SCSI_STATUS_CHECK_CONDITION,
629f11c7f63SJim Harris                   SCSI_SENSE_ILLEGAL_REQUEST,
630f11c7f63SJim Harris                   SCSI_ASC_INVALID_FIELD_IN_CDB,
631f11c7f63SJim Harris                   SCSI_ASCQ_INVALID_FIELD_IN_CDB
632f11c7f63SJim Harris                );
633f11c7f63SJim Harris                status = SATI_FAILURE_CHECK_RESPONSE_DATA;
634f11c7f63SJim Harris             }
635f11c7f63SJim Harris             else
636f11c7f63SJim Harris             {
637f11c7f63SJim Harris                //check if 48-bit Address feature set is supported
638f11c7f63SJim Harris                if((sequence->device->capabilities &
639f11c7f63SJim Harris                   SATI_DEVICE_CAP_48BIT_ENABLE))
640f11c7f63SJim Harris                {
641f11c7f63SJim Harris                   //ATA Read Log Ext with log address set to 0x07
642f11c7f63SJim Harris                   sati_ata_read_log_ext_construct(
643f11c7f63SJim Harris                                      ata_io,
644f11c7f63SJim Harris                                      sequence,
645f11c7f63SJim Harris                                      ATA_LOG_PAGE_EXTENDED_SMART_SELF_TEST,
646f11c7f63SJim Harris                                      sizeof(ATA_EXTENDED_SMART_SELF_TEST_LOG_T)
647f11c7f63SJim Harris                   );
648f11c7f63SJim Harris                   sequence->type =
649f11c7f63SJim Harris                             SATI_SEQUENCE_LOG_SENSE_EXTENDED_SELF_TEST_LOG_PAGE;
650f11c7f63SJim Harris                   status = SATI_SUCCESS;
651f11c7f63SJim Harris                }
652f11c7f63SJim Harris                else
653f11c7f63SJim Harris                {
654f11c7f63SJim Harris                   //ATA Smart Read Log with log address set to 0x06
655f11c7f63SJim Harris                   sati_ata_smart_read_log_construct(
656f11c7f63SJim Harris                                        ata_io,
657f11c7f63SJim Harris                                        sequence,
658f11c7f63SJim Harris                                        ATA_LOG_PAGE_SMART_SELF_TEST,
659f11c7f63SJim Harris                                        sizeof(ATA_SMART_SELF_TEST_LOG_T)
660f11c7f63SJim Harris                   );
661f11c7f63SJim Harris                   sequence->type = SATI_SEQUENCE_LOG_SENSE_SELF_TEST_LOG_PAGE;
662f11c7f63SJim Harris                   status = SATI_SUCCESS;
663f11c7f63SJim Harris                }
664f11c7f63SJim Harris             }
665f11c7f63SJim Harris             break;
666f11c7f63SJim Harris 
667f11c7f63SJim Harris          //Return Informational Exceptions log page
668f11c7f63SJim Harris          case SCSI_LOG_PAGE_INFORMATION_EXCEPTION :
669f11c7f63SJim Harris             if(sequence->device->capabilities & SATI_DEVICE_CAP_SMART_SUPPORT)
670f11c7f63SJim Harris             {
671f11c7f63SJim Harris                if(sequence->device->capabilities & SATI_DEVICE_CAP_SMART_ENABLE)
672f11c7f63SJim Harris                {
673f11c7f63SJim Harris                   sati_ata_smart_return_status_construct(
674f11c7f63SJim Harris                                        ata_io,
675f11c7f63SJim Harris                                        sequence,
676f11c7f63SJim Harris                                        ATA_SMART_SUB_CMD_RETURN_STATUS
677f11c7f63SJim Harris                   );
678f11c7f63SJim Harris                   sequence->type =
679f11c7f63SJim Harris                                 SATI_SEQUENCE_LOG_SENSE_INFO_EXCEPTION_LOG_PAGE;
680f11c7f63SJim Harris                   status = SATI_SUCCESS;
681f11c7f63SJim Harris                }
682f11c7f63SJim Harris                else
683f11c7f63SJim Harris                {
684f11c7f63SJim Harris                   sati_scsi_sense_data_construct(
685f11c7f63SJim Harris                      sequence,
686f11c7f63SJim Harris                      scsi_io,
687f11c7f63SJim Harris                      SCSI_STATUS_CHECK_CONDITION,
688f11c7f63SJim Harris                      SCSI_SENSE_ABORTED_COMMAND,
689f11c7f63SJim Harris                      SCSI_ASC_ATA_DEVICE_FEATURE_NOT_ENABLED,
690f11c7f63SJim Harris                      SCSI_ASCQ_ATA_DEVICE_FEATURE_NOT_ENABLED
691f11c7f63SJim Harris                   );
692f11c7f63SJim Harris 
693f11c7f63SJim Harris                   status = SATI_FAILURE_CHECK_RESPONSE_DATA;
694f11c7f63SJim Harris                }
695f11c7f63SJim Harris             }
696f11c7f63SJim Harris             else
697f11c7f63SJim Harris             {
698f11c7f63SJim Harris                sati_scsi_sense_data_construct(
699f11c7f63SJim Harris                   sequence,
700f11c7f63SJim Harris                   scsi_io,
701f11c7f63SJim Harris                   SCSI_STATUS_CHECK_CONDITION,
702f11c7f63SJim Harris                   SCSI_SENSE_ILLEGAL_REQUEST,
703f11c7f63SJim Harris                   SCSI_ASC_INVALID_FIELD_IN_CDB,
704f11c7f63SJim Harris                   SCSI_ASCQ_INVALID_FIELD_IN_CDB
705f11c7f63SJim Harris                );
706f11c7f63SJim Harris 
707f11c7f63SJim Harris                status = SATI_FAILURE_CHECK_RESPONSE_DATA;
708f11c7f63SJim Harris             }
709f11c7f63SJim Harris             break;
710f11c7f63SJim Harris          default :
711f11c7f63SJim Harris             //UNSPECIFIED SATv2r9
712f11c7f63SJim Harris             sati_scsi_sense_data_construct(
713f11c7f63SJim Harris                sequence,
714f11c7f63SJim Harris                scsi_io,
715f11c7f63SJim Harris                SCSI_STATUS_CHECK_CONDITION,
716f11c7f63SJim Harris                SCSI_SENSE_ILLEGAL_REQUEST,
717f11c7f63SJim Harris                SCSI_ASC_NO_ADDITIONAL_SENSE ,
718f11c7f63SJim Harris                SCSI_ASCQ_NO_ADDITIONAL_SENSE
719f11c7f63SJim Harris             );
720f11c7f63SJim Harris             status = SATI_FAILURE_CHECK_RESPONSE_DATA;
721f11c7f63SJim Harris             break;
722f11c7f63SJim Harris       }
723f11c7f63SJim Harris    }
724f11c7f63SJim Harris    return status;
725f11c7f63SJim Harris }
726f11c7f63SJim Harris 
727f11c7f63SJim Harris /**
728f11c7f63SJim Harris  * @brief This method will translate the response to the SATI Log Sense
729f11c7f63SJim Harris  *        translation. ATA command responses will be translated into the
730f11c7f63SJim Harris  *        correct SCSI log pages to be returned by SATI.
731f11c7f63SJim Harris  *
732f11c7f63SJim Harris  * @return SATI_STATUS Indicates if the response translation succeeded.
733f11c7f63SJim Harris  *
734f11c7f63SJim Harris  */
sati_log_sense_translate_response(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io,void * ata_io)735f11c7f63SJim Harris SATI_STATUS sati_log_sense_translate_response(
736f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T * sequence,
737f11c7f63SJim Harris    void                       * scsi_io,
738f11c7f63SJim Harris    void                       * ata_io
739f11c7f63SJim Harris )
740f11c7f63SJim Harris {
741f11c7f63SJim Harris    U8 * register_fis = sati_cb_get_d2h_register_fis_address(ata_io);
742f11c7f63SJim Harris    SATI_STATUS status = SATI_FAILURE;
743f11c7f63SJim Harris 
744f11c7f63SJim Harris    if(sati_get_ata_status(register_fis) & ATA_STATUS_REG_ERROR_BIT)
745f11c7f63SJim Harris    {
746f11c7f63SJim Harris       sati_scsi_sense_data_construct(
747f11c7f63SJim Harris          sequence,
748f11c7f63SJim Harris          scsi_io,
749f11c7f63SJim Harris          SCSI_STATUS_CHECK_CONDITION,
750f11c7f63SJim Harris          SCSI_SENSE_ABORTED_COMMAND,
751f11c7f63SJim Harris          SCSI_ASC_NO_ADDITIONAL_SENSE ,
752f11c7f63SJim Harris          SCSI_ASCQ_NO_ADDITIONAL_SENSE
753f11c7f63SJim Harris       );
754f11c7f63SJim Harris       status = SATI_FAILURE_CHECK_RESPONSE_DATA;
755f11c7f63SJim Harris    }
756f11c7f63SJim Harris    else
757f11c7f63SJim Harris    {
758f11c7f63SJim Harris 
759f11c7f63SJim Harris       void * ata_data = sati_cb_get_ata_data_address(ata_io);
760f11c7f63SJim Harris 
761f11c7f63SJim Harris       if(ata_data == NULL)
762f11c7f63SJim Harris       {
763f11c7f63SJim Harris          return SATI_FAILURE;
764f11c7f63SJim Harris       }
765f11c7f63SJim Harris 
766f11c7f63SJim Harris       switch(sequence->type)
767f11c7f63SJim Harris       {
768f11c7f63SJim Harris          case SATI_SEQUENCE_LOG_SENSE_EXTENDED_SELF_TEST_LOG_PAGE:
769f11c7f63SJim Harris             sati_extended_self_test_log_page_construct(
770f11c7f63SJim Harris                                  sequence, scsi_io, ata_data
771f11c7f63SJim Harris             );
772f11c7f63SJim Harris 
773f11c7f63SJim Harris             status = SATI_COMPLETE;
774f11c7f63SJim Harris             break;
775f11c7f63SJim Harris 
776f11c7f63SJim Harris          case SATI_SEQUENCE_LOG_SENSE_SELF_TEST_LOG_PAGE:
777f11c7f63SJim Harris             sati_self_test_log_page_construct(sequence, scsi_io, ata_data);
778f11c7f63SJim Harris             status = SATI_COMPLETE;
779f11c7f63SJim Harris             break;
780f11c7f63SJim Harris 
781f11c7f63SJim Harris          case SATI_SEQUENCE_LOG_SENSE_INFO_EXCEPTION_LOG_PAGE:
782f11c7f63SJim Harris             //This function needs a d->h register fis, not ata data
783f11c7f63SJim Harris             sati_information_exception_log_page_contruct(
784f11c7f63SJim Harris                                  sequence, scsi_io, ata_io
785f11c7f63SJim Harris             );
786f11c7f63SJim Harris 
787f11c7f63SJim Harris             status = SATI_COMPLETE;
788f11c7f63SJim Harris             break;
789f11c7f63SJim Harris 
790f11c7f63SJim Harris          default:
791f11c7f63SJim Harris             sati_scsi_sense_data_construct(
792f11c7f63SJim Harris                sequence,
793f11c7f63SJim Harris                scsi_io,
794f11c7f63SJim Harris                SCSI_STATUS_CHECK_CONDITION,
795f11c7f63SJim Harris                SCSI_SENSE_ABORTED_COMMAND,
796f11c7f63SJim Harris                SCSI_ASC_NO_ADDITIONAL_SENSE ,
797f11c7f63SJim Harris                SCSI_ASCQ_NO_ADDITIONAL_SENSE
798f11c7f63SJim Harris             );
799f11c7f63SJim Harris             status = SATI_FAILURE_CHECK_RESPONSE_DATA;
800f11c7f63SJim Harris             break;
801f11c7f63SJim Harris       }
802f11c7f63SJim Harris    }
803f11c7f63SJim Harris    return status;
804f11c7f63SJim Harris }
805f11c7f63SJim Harris 
806f11c7f63SJim Harris #endif // !defined(DISABLE_SATI_LOG_SENSE)
807f11c7f63SJim Harris 
808