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