1/*-
2 * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3 *
4 * This file is provided under a dual BSD/GPLv2 license.  When using or
5 * redistributing this file, you may do so under either license.
6 *
7 * GPL LICENSE SUMMARY
8 *
9 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as
13 * published by the Free Software Foundation.
14 *
15 * This program is distributed in the hope that it will be useful, but
16 * WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18 * General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23 * The full GNU General Public License is included in this distribution
24 * in the file called LICENSE.GPL.
25 *
26 * BSD LICENSE
27 *
28 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29 * All rights reserved.
30 *
31 * Redistribution and use in source and binary forms, with or without
32 * modification, are permitted provided that the following conditions
33 * are met:
34 *
35 *   * Redistributions of source code must retain the above copyright
36 *     notice, this list of conditions and the following disclaimer.
37 *   * Redistributions in binary form must reproduce the above copyright
38 *     notice, this list of conditions and the following disclaimer in
39 *     the documentation and/or other materials provided with the
40 *     distribution.
41 *
42 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53 *
54 * $FreeBSD$
55 */
56#ifndef _SCIC_SDS_STP_REQUEST_T_
57#define _SCIC_SDS_STP_REQUEST_T_
58
59#ifdef __cplusplus
60extern "C" {
61#endif // __cplusplus
62
63#include <dev/isci/scil/intel_sata.h>
64#include <dev/isci/scil/sci_types.h>
65#include <dev/isci/scil/scic_sds_request.h>
66
67/**
68 * @struct
69 *
70 * @brief This structure represents the additional information that is
71 *        required to handle SATA PIO requests.
72 */
73typedef struct SCIC_SDS_STP_REQUEST
74{
75   SCIC_SDS_REQUEST_T parent;
76
77   SATA_FIS_REG_D2H_T d2h_reg_fis;
78
79   union
80   {
81      U32 ncq;
82
83      U32 udma;
84
85      struct
86      {
87         /**
88          * Total transfer for the entire PIO request recorded at request construction
89          * time.
90          *
91          * @todo Should we just decrement this value for each byte of data transitted
92          *       or received to elemenate the current_transfer_bytes field?
93          */
94         U32 total_transfer_bytes;
95
96         /**
97          * Total number of bytes received/transmitted in data frames since the start
98          * of the IO request.  At the end of the IO request this should equal the
99          * total_transfer_bytes.
100          */
101         U32 current_transfer_bytes;
102
103         /**
104          * The number of bytes requested in the in the PIO setup.
105          */
106         U32 pio_transfer_bytes;
107
108         /**
109          * PIO Setup ending status value to tell us if we need to wait for another FIS
110          * or if the transfer is complete. On the receipt of a D2H FIS this will be
111          * the status field of that FIS.
112          */
113         U8  ending_status;
114
115         /**
116          * On receipt of a D2H FIS this will be the ending error field if the
117          * ending_status has the SATA_STATUS_ERR bit set.
118          */
119         U8  ending_error;
120
121         /**
122          * Protocol Type. This is filled in by core during IO Request construction type.
123          */
124         U8  sat_protocol;
125
126         /**
127         * This field keeps track of sgl pair to be retrieved from OS memory for processing.
128         */
129         U8  sgl_pair_index;
130
131         struct
132         {
133            SCU_SGL_ELEMENT_PAIR_T * sgl_pair;
134            U8                       sgl_set;
135            U32                      sgl_offset;
136         } request_current;
137      } pio;
138
139      struct
140      {
141         /**
142          * The number of bytes requested in the PIO setup before CDB data frame.
143          */
144         U32 device_preferred_cdb_length;
145      } packet;
146   } type;
147
148} SCIC_SDS_STP_REQUEST_T;
149
150/**
151 * @enum SCIC_SDS_STP_REQUEST_STARTED_UDMA_SUBSTATES
152 *
153 * @brief This enumeration depicts the various sub-states associated with
154 *        a SATA/STP UDMA protocol operation.
155 */
156enum SCIC_SDS_STP_REQUEST_STARTED_UDMA_SUBSTATES
157{
158   SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_TC_COMPLETION_SUBSTATE,
159   SCIC_SDS_STP_REQUEST_STARTED_UDMA_AWAIT_D2H_REG_FIS_SUBSTATE,
160
161   SCIC_SDS_STP_REQUEST_STARTED_UDMA_MAX_SUBSTATES
162};
163
164/**
165 * @enum SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_SUBSTATES
166 *
167 * @brief This enumeration depicts the various sub-states associated with
168 *        a SATA/STP non-data protocol operation.
169 */
170enum SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_SUBSTATES
171{
172   SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_H2D_COMPLETION_SUBSTATE,
173   SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_AWAIT_D2H_SUBSTATE,
174   SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_MAX_SUBSTATES
175};
176
177/**
178 * @enum SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_SUBSTATES
179 *
180 * @brief THis enumeration depicts the various sub-states associated with a
181 *        SATA/STP soft reset operation.
182 */
183enum SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_SUBSTATES
184{
185   SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_ASSERTED_COMPLETION_SUBSTATE,
186   SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_H2D_DIAGNOSTIC_COMPLETION_SUBSTATE,
187   SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_AWAIT_D2H_RESPONSE_FRAME_SUBSTATE,
188
189   SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_MAX_SUBSTATES
190};
191
192extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
193   scic_sds_stp_request_started_udma_substate_handler_table
194      [SCIC_SDS_STP_REQUEST_STARTED_UDMA_MAX_SUBSTATES];
195
196extern SCI_BASE_STATE_T
197   scic_sds_stp_request_started_udma_substate_table
198      [SCIC_SDS_STP_REQUEST_STARTED_UDMA_MAX_SUBSTATES];
199
200extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
201   scic_sds_stp_request_started_non_data_substate_handler_table
202      [SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_MAX_SUBSTATES];
203
204extern SCI_BASE_STATE_T
205   scic_sds_stp_request_started_non_data_substate_table
206      [SCIC_SDS_STP_REQUEST_STARTED_NON_DATA_MAX_SUBSTATES];
207
208
209extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
210   scic_sds_stp_request_started_soft_reset_substate_handler_table
211      [SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_MAX_SUBSTATES];
212
213extern SCI_BASE_STATE_T
214   scic_sds_stp_request_started_soft_reset_substate_table
215      [SCIC_SDS_STP_REQUEST_STARTED_SOFT_RESET_MAX_SUBSTATES];
216
217// ---------------------------------------------------------------------------
218
219U32 scic_sds_stp_request_get_object_size(void);
220
221U32 scic_sds_stp_task_request_get_object_size(void);
222
223void scu_sata_reqeust_construct_task_context(
224   SCIC_SDS_REQUEST_T * this_request,
225   SCU_TASK_CONTEXT_T * task_context
226);
227
228void scic_sds_stp_non_ncq_request_construct(
229   SCIC_SDS_REQUEST_T *this_request
230);
231
232SCI_STATUS scic_sds_stp_pio_request_construct(
233   SCIC_SDS_REQUEST_T  * scic_io_request,
234   U8                    sat_protocol,
235   BOOL                  copy_rx_frame
236);
237
238SCI_STATUS scic_sds_stp_pio_request_construct_pass_through (
239   SCIC_SDS_REQUEST_T  * scic_io_request,
240   SCIC_STP_PASSTHRU_REQUEST_CALLBACKS_T *passthru_cb
241);
242
243SCI_STATUS scic_sds_stp_udma_request_construct(
244   SCIC_SDS_REQUEST_T * this_request,
245   U32 transfer_length,
246   SCI_IO_REQUEST_DATA_DIRECTION data_direction
247);
248
249SCI_STATUS scic_sds_stp_non_data_request_construct(
250   SCIC_SDS_REQUEST_T * this_request
251);
252
253SCI_STATUS scic_sds_stp_soft_reset_request_construct(
254   SCIC_SDS_REQUEST_T * this_request
255);
256
257SCI_STATUS scic_sds_stp_ncq_request_construct(
258   SCIC_SDS_REQUEST_T * this_request,
259   U32 transfer_length,
260   SCI_IO_REQUEST_DATA_DIRECTION data_direction
261);
262
263void scu_stp_raw_request_construct_task_context(
264   SCIC_SDS_STP_REQUEST_T * this_request,
265   SCU_TASK_CONTEXT_T     * task_context
266
267);
268
269SCI_STATUS scic_sds_io_request_construct_sata(
270   SCIC_SDS_REQUEST_T          * this_request,
271   U8                            sat_protocol,
272   U32                           transfer_length,
273   SCI_IO_REQUEST_DATA_DIRECTION data_direction,
274   BOOL                          copy_rx_frame,
275   BOOL                          do_translate_sgl
276);
277
278#ifdef __cplusplus
279}
280#endif // __cplusplus
281
282#endif // _SCIC_SDS_STP_REQUEST_T_
283