1f11c7f63SJim Harris /*-
2718cf2ccSPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3718cf2ccSPedro 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  *
59f11c7f63SJim Harris  * @brief This file contains the method implementations required to
60f11c7f63SJim Harris  *        translate the SCSI abort task set command.
61f11c7f63SJim Harris  */
62f11c7f63SJim Harris 
63f11c7f63SJim Harris #if !defined(DISABLE_SATI_TASK_MANAGEMENT)
64f11c7f63SJim Harris 
65f11c7f63SJim Harris #include <dev/isci/scil/sati_abort_task_set.h>
66f11c7f63SJim Harris #include <dev/isci/scil/sati_callbacks.h>
67f11c7f63SJim Harris #include <dev/isci/scil/sati_util.h>
68f11c7f63SJim Harris #include <dev/isci/scil/sati.h>
69f11c7f63SJim Harris #include <dev/isci/scil/intel_ata.h>
70f11c7f63SJim Harris #include <dev/isci/scil/intel_scsi.h>
71f11c7f63SJim Harris #include <dev/isci/scil/intel_sat.h>
72f11c7f63SJim Harris 
73f11c7f63SJim Harris //******************************************************************************
74f11c7f63SJim Harris //* P U B L I C   M E T H O D S
75f11c7f63SJim Harris //******************************************************************************
76f11c7f63SJim Harris 
77f11c7f63SJim Harris #if !defined(DISABLE_SATI_ABORT_TASK_SET)
78f11c7f63SJim Harris 
79f11c7f63SJim Harris /**
80f11c7f63SJim Harris  * @brief This method will translate the abort task set SCSI task request into an
81f11c7f63SJim Harris  *        ATA READ LOG EXT command. For more information on the parameters
82f11c7f63SJim Harris  *        passed to this method, please reference sati_translate_command().
83f11c7f63SJim Harris  *
84f11c7f63SJim Harris  * @return Indicate if the command translation succeeded.
85f11c7f63SJim Harris  * @retval SCI_SUCCESS This is returned if the command translation was
86f11c7f63SJim Harris  *         successful.
87f11c7f63SJim Harris  */
sati_abort_task_set_translate_command(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * scsi_io,void * ata_io)88f11c7f63SJim Harris SATI_STATUS sati_abort_task_set_translate_command(
89f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T * sequence,
90f11c7f63SJim Harris    void                       * scsi_io,
91f11c7f63SJim Harris    void                       * ata_io
92f11c7f63SJim Harris )
93f11c7f63SJim Harris {
94f11c7f63SJim Harris    U8 * register_fis;
95f11c7f63SJim Harris 
96f11c7f63SJim Harris    //ATA Read Log Ext with log address set to 0x10
97f11c7f63SJim Harris    sati_ata_read_log_ext_construct(
98f11c7f63SJim Harris       ata_io,
99f11c7f63SJim Harris       sequence,
100f11c7f63SJim Harris       ATA_LOG_PAGE_NCQ_ERROR,
101f11c7f63SJim Harris       sizeof(ATA_NCQ_COMMAND_ERROR_LOG_T)
102f11c7f63SJim Harris    );
103f11c7f63SJim Harris 
104f11c7f63SJim Harris    register_fis = sati_cb_get_h2d_register_fis_address(ata_io);
105f11c7f63SJim Harris    sati_set_sata_command_flag(register_fis);
106f11c7f63SJim Harris 
107f11c7f63SJim Harris    sequence->type                = SATI_SEQUENCE_ABORT_TASK_SET;
108f11c7f63SJim Harris    sequence->state               = SATI_SEQUENCE_STATE_AWAIT_RESPONSE;
109f11c7f63SJim Harris 
110f11c7f63SJim Harris    return SATI_SUCCESS;
111f11c7f63SJim Harris }
112f11c7f63SJim Harris 
sati_abort_task_set_translate_data(SATI_TRANSLATOR_SEQUENCE_T * sequence,void * ata_input_data,void * scsi_task)113f11c7f63SJim Harris SATI_STATUS sati_abort_task_set_translate_data(
114f11c7f63SJim Harris    SATI_TRANSLATOR_SEQUENCE_T * sequence,
115f11c7f63SJim Harris    void                       * ata_input_data,
116f11c7f63SJim Harris    void                       * scsi_task
117f11c7f63SJim Harris )
118f11c7f63SJim Harris {
119f11c7f63SJim Harris    ATA_NCQ_COMMAND_ERROR_LOG_T * log =
120f11c7f63SJim Harris       (ATA_NCQ_COMMAND_ERROR_LOG_T *)ata_input_data;
121f11c7f63SJim Harris    U8 tag_index;
122f11c7f63SJim Harris 
123f11c7f63SJim Harris    sequence->state = SATI_SEQUENCE_STATE_TRANSLATE_DATA;
124f11c7f63SJim Harris 
125f11c7f63SJim Harris    for (tag_index = 0; tag_index < 32; tag_index++)
126f11c7f63SJim Harris    {
127f11c7f63SJim Harris       void *        matching_command;
1280f2a8452SJim Harris       SCI_IO_STATUS completion_status;
129f11c7f63SJim Harris       sati_cb_device_get_request_by_ncq_tag(
130f11c7f63SJim Harris          scsi_task,
131f11c7f63SJim Harris          tag_index,
132f11c7f63SJim Harris          matching_command
133f11c7f63SJim Harris       );
134f11c7f63SJim Harris 
135f11c7f63SJim Harris       if (matching_command != NULL)
136f11c7f63SJim Harris       {
137f11c7f63SJim Harris          if (
138f11c7f63SJim Harris               (log->ncq_tag == tag_index) &&
139f11c7f63SJim Harris               (log->nq == 0) // nq==1 means a non-queued command
140f11c7f63SJim Harris                              //  caused this failure
141f11c7f63SJim Harris             )
142f11c7f63SJim Harris          {
143f11c7f63SJim Harris             sati_translate_error(sequence, matching_command, log->error);
1440f2a8452SJim Harris             completion_status = SCI_IO_FAILURE_RESPONSE_VALID;
145f11c7f63SJim Harris 
146f11c7f63SJim Harris             if(sequence->state == SATI_SEQUENCE_STATE_READ_ERROR)
147f11c7f63SJim Harris             {
148f11c7f63SJim Harris                //Uncorrectable read error, return additional sense data
149f11c7f63SJim Harris                sati_scsi_read_ncq_error_sense_construct(
150f11c7f63SJim Harris                   sequence,
151f11c7f63SJim Harris                   matching_command,
152f11c7f63SJim Harris                   ata_input_data,
153f11c7f63SJim Harris                   SCSI_STATUS_CHECK_CONDITION,
154f11c7f63SJim Harris                   SCSI_SENSE_MEDIUM_ERROR,
155f11c7f63SJim Harris                   SCSI_ASC_UNRECOVERED_READ_ERROR,
156f11c7f63SJim Harris                   SCSI_ASCQ_UNRECOVERED_READ_ERROR
157f11c7f63SJim Harris                );
158f11c7f63SJim Harris             }
159f11c7f63SJim Harris          }
160f11c7f63SJim Harris          else
161f11c7f63SJim Harris          {
1620f2a8452SJim Harris             completion_status = SCI_IO_FAILURE_TERMINATED;
163f11c7f63SJim Harris          }
164f11c7f63SJim Harris 
165f11c7f63SJim Harris          sati_cb_io_request_complete(matching_command, completion_status);
166f11c7f63SJim Harris       }
167f11c7f63SJim Harris    }
168f11c7f63SJim Harris 
169f11c7f63SJim Harris    sequence->state = SATI_SEQUENCE_STATE_FINAL;
170f11c7f63SJim Harris 
171f11c7f63SJim Harris    return SATI_COMPLETE;
172f11c7f63SJim Harris }
173f11c7f63SJim Harris 
174f11c7f63SJim Harris #endif // !defined(DISABLE_SATI_ABORT_TASK_SET)
175f11c7f63SJim Harris 
176f11c7f63SJim Harris #endif // !defined(DISABLE_SATI_TASK_MANAGEMENT)
177f11c7f63SJim Harris 
178