xref: /freebsd/sys/dev/isci/scil/scic_sds_request.h (revision 718cf2ccb9956613756ab15d7a0e28f2c8e91cab)
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  * $FreeBSD$
55f11c7f63SJim Harris  */
56f11c7f63SJim Harris #ifndef _SCIC_SDS_IO_REQUEST_H_
57f11c7f63SJim Harris #define _SCIC_SDS_IO_REQUEST_H_
58f11c7f63SJim Harris 
59f11c7f63SJim Harris /**
60f11c7f63SJim Harris  * @file
61f11c7f63SJim Harris  *
62f11c7f63SJim Harris  * @brief This file contains the structures, constants and prototypes for the
63f11c7f63SJim Harris  *        SCIC_SDS_IO_REQUEST object.
64f11c7f63SJim Harris  */
65f11c7f63SJim Harris 
66f11c7f63SJim Harris #ifdef __cplusplus
67f11c7f63SJim Harris extern "C" {
68f11c7f63SJim Harris #endif // __cplusplus
69f11c7f63SJim Harris 
705d16b897SJim Harris #include <sys/param.h>
715d16b897SJim Harris 
72f11c7f63SJim Harris #include <dev/isci/scil/scic_io_request.h>
73f11c7f63SJim Harris 
74f11c7f63SJim Harris #include <dev/isci/scil/sci_base_request.h>
75f11c7f63SJim Harris #include <dev/isci/scil/sci_base_state_machine_logger.h>
76f11c7f63SJim Harris #include <dev/isci/scil/scu_task_context.h>
77f11c7f63SJim Harris #include <dev/isci/scil/intel_sas.h>
78f11c7f63SJim Harris 
79f11c7f63SJim Harris struct SCIC_SDS_CONTROLLER;
80f11c7f63SJim Harris struct SCIC_SDS_REMOTE_DEVICE;
81f11c7f63SJim Harris struct SCIC_SDS_IO_REQUEST_STATE_HANDLER;
82f11c7f63SJim Harris 
83f11c7f63SJim Harris /**
84f11c7f63SJim Harris  * @enum _SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATES
85f11c7f63SJim Harris  *
86f11c7f63SJim Harris  * @brief This enumeration depicts all of the substates for a task
87f11c7f63SJim Harris  *        management request to be performed in the STARTED super-state.
88f11c7f63SJim Harris  */
89f11c7f63SJim Harris typedef enum _SCIC_SDS_RAW_REQUEST_STARTED_TASK_MGMT_SUBSTATES
90f11c7f63SJim Harris {
91f11c7f63SJim Harris    /**
92f11c7f63SJim Harris     * The AWAIT_TC_COMPLETION sub-state indicates that the started raw
93f11c7f63SJim Harris     * task management request is waiting for the transmission of the
94f11c7f63SJim Harris     * initial frame (i.e. command, task, etc.).
95f11c7f63SJim Harris     */
96f11c7f63SJim Harris    SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATE_AWAIT_TC_COMPLETION,
97f11c7f63SJim Harris 
98f11c7f63SJim Harris    /**
99f11c7f63SJim Harris     * This sub-state indicates that the started task management request
100f11c7f63SJim Harris     * is waiting for the reception of an unsolicited frame
101f11c7f63SJim Harris     * (i.e. response IU).
102f11c7f63SJim Harris     */
103f11c7f63SJim Harris    SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATE_AWAIT_TC_RESPONSE,
104f11c7f63SJim Harris 
105f11c7f63SJim Harris    SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_MAX_SUBSTATES
106f11c7f63SJim Harris 
107f11c7f63SJim Harris } SCIC_SDS_RAW_REQUEST_STARTED_TASK_MGMT_SUBSTATES;
108f11c7f63SJim Harris 
109f11c7f63SJim Harris 
110f11c7f63SJim Harris /**
111f11c7f63SJim Harris  * @enum _SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATES
112f11c7f63SJim Harris  *
113f11c7f63SJim Harris  * @brief This enumeration depicts all of the substates for a SMP
114f11c7f63SJim Harris  *        request to be performed in the STARTED super-state.
115f11c7f63SJim Harris  */
116f11c7f63SJim Harris typedef enum _SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATES
117f11c7f63SJim Harris {
118f11c7f63SJim Harris    /**
119f11c7f63SJim Harris     * This sub-state indicates that the started task management request
120f11c7f63SJim Harris     * is waiting for the reception of an unsolicited frame
121f11c7f63SJim Harris     * (i.e. response IU).
122f11c7f63SJim Harris     */
123f11c7f63SJim Harris    SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATE_AWAIT_RESPONSE,
124f11c7f63SJim Harris 
125f11c7f63SJim Harris    /**
126f11c7f63SJim Harris     * The AWAIT_TC_COMPLETION sub-state indicates that the started SMP request is
127f11c7f63SJim Harris     * waiting for the transmission of the initial frame (i.e. command, task, etc.).
128f11c7f63SJim Harris     */
129f11c7f63SJim Harris    SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATE_AWAIT_TC_COMPLETION,
130f11c7f63SJim Harris 
131f11c7f63SJim Harris    SCIC_SDS_SMP_REQUEST_STARTED_MAX_SUBSTATES
132f11c7f63SJim Harris 
133f11c7f63SJim Harris } SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATES;
134f11c7f63SJim Harris 
135f11c7f63SJim Harris /**
136f11c7f63SJim Harris  * @struct SCIC_SDS_IO_REQUEST
137f11c7f63SJim Harris  *
138f11c7f63SJim Harris  * @brief This structure contains or references all of the data necessary
139f11c7f63SJim Harris  *        to process a task management or normal IO request.
140f11c7f63SJim Harris  */
141f11c7f63SJim Harris typedef struct SCIC_SDS_REQUEST
142f11c7f63SJim Harris {
143f11c7f63SJim Harris    /**
144f11c7f63SJim Harris     * This field indictes the parent object of the request.
145f11c7f63SJim Harris     */
146f11c7f63SJim Harris    SCI_BASE_REQUEST_T parent;
147f11c7f63SJim Harris 
148f11c7f63SJim Harris    void *user_request;
149f11c7f63SJim Harris 
150f11c7f63SJim Harris    /**
151f11c7f63SJim Harris     * This field simply points to the controller to which this IO request
152f11c7f63SJim Harris     * is associated.
153f11c7f63SJim Harris     */
154f11c7f63SJim Harris    struct SCIC_SDS_CONTROLLER    *owning_controller;
155f11c7f63SJim Harris 
156f11c7f63SJim Harris    /**
157f11c7f63SJim Harris     * This field simply points to the remote device to which this IO request
158f11c7f63SJim Harris     * is associated.
159f11c7f63SJim Harris     */
160f11c7f63SJim Harris    struct SCIC_SDS_REMOTE_DEVICE *target_device;
161f11c7f63SJim Harris 
162f11c7f63SJim Harris    /**
163f11c7f63SJim Harris     * This field is utilized to determine if the SCI user is managing
164f11c7f63SJim Harris     * the IO tag for this request or if the core is managing it.
165f11c7f63SJim Harris     */
166f11c7f63SJim Harris    BOOL was_tag_assigned_by_user;
167f11c7f63SJim Harris 
168f11c7f63SJim Harris    /**
169f11c7f63SJim Harris     * This field indicates the IO tag for this request.  The IO tag is
170f11c7f63SJim Harris     * comprised of the task_index and a sequence count. The sequence count
171f11c7f63SJim Harris     * is utilized to help identify tasks from one life to another.
172f11c7f63SJim Harris     */
173f11c7f63SJim Harris    U16 io_tag;
174f11c7f63SJim Harris 
175f11c7f63SJim Harris    /**
176f11c7f63SJim Harris    * This field specifies the sat protocol being utilized for this
177f11c7f63SJim Harris    * IO request, such as SAT_PROTOCOL_PIO_DATA_IN, SAT_PROTOCOL_FPDMA etc.
178f11c7f63SJim Harris    */
179f11c7f63SJim Harris    U8 sat_protocol;
180f11c7f63SJim Harris 
181f11c7f63SJim Harris    /**
182f11c7f63SJim Harris     * This field specifies the protocol being utilized for this
183f11c7f63SJim Harris     * IO request.
184f11c7f63SJim Harris     */
185f11c7f63SJim Harris    SCIC_TRANSPORT_PROTOCOL protocol;
186f11c7f63SJim Harris 
187f11c7f63SJim Harris    /**
188f11c7f63SJim Harris     * This field indicates the completion status taken from the SCUs
189f11c7f63SJim Harris     * completion code.  It indicates the completion result for the SCU hardware.
190f11c7f63SJim Harris     */
191f11c7f63SJim Harris    U32 scu_status;
192f11c7f63SJim Harris 
193f11c7f63SJim Harris    /**
194f11c7f63SJim Harris     * This field indicates the completion status returned to the SCI user.  It
195f11c7f63SJim Harris     * indicates the users view of the io request completion.
196f11c7f63SJim Harris     */
197f11c7f63SJim Harris    U32 sci_status;
198f11c7f63SJim Harris 
199f11c7f63SJim Harris    /**
200f11c7f63SJim Harris     * This field contains the value to be utilized when posting (e.g. Post_TC,
201f11c7f63SJim Harris     * Post_TC_Abort) this request to the silicon.
202f11c7f63SJim Harris     */
203f11c7f63SJim Harris    U32 post_context;
204f11c7f63SJim Harris 
205f11c7f63SJim Harris    void                   *command_buffer;
206f11c7f63SJim Harris    void                   *response_buffer;
207f11c7f63SJim Harris    SCU_TASK_CONTEXT_T     *task_context_buffer;
208f11c7f63SJim Harris    SCU_SGL_ELEMENT_PAIR_T *sgl_element_pair_buffer;
209f11c7f63SJim Harris 
210f11c7f63SJim Harris    /**
211f11c7f63SJim Harris     * This field indicates if this request is a task management request or
212f11c7f63SJim Harris     * normal IO request.
213f11c7f63SJim Harris     */
214f11c7f63SJim Harris    BOOL is_task_management_request;
215f11c7f63SJim Harris 
216f11c7f63SJim Harris    /**
217f11c7f63SJim Harris     * This field indicates that this request contains an initialized started
218f11c7f63SJim Harris     * substate machine.
219f11c7f63SJim Harris     */
220f11c7f63SJim Harris    BOOL has_started_substate_machine;
221f11c7f63SJim Harris 
222f11c7f63SJim Harris    /**
223f11c7f63SJim Harris     * This field is a pointer to the stored rx frame data.  It is used in STP
224f11c7f63SJim Harris     * internal requests and SMP response frames.  If this field is non-NULL the
225f11c7f63SJim Harris     * saved frame must be released on IO request completion.
226f11c7f63SJim Harris     *
227f11c7f63SJim Harris     * @todo In the future do we want to keep a list of RX frame buffers?
228f11c7f63SJim Harris     */
229f11c7f63SJim Harris    U32 saved_rx_frame_index;
230f11c7f63SJim Harris 
231f11c7f63SJim Harris    /**
232f11c7f63SJim Harris     * This field specifies the data necessary to manage the sub-state
233f11c7f63SJim Harris     * machine executed while in the SCI_BASE_REQUEST_STATE_STARTED state.
234f11c7f63SJim Harris     */
235f11c7f63SJim Harris    SCI_BASE_STATE_MACHINE_T started_substate_machine;
236f11c7f63SJim Harris 
237f11c7f63SJim Harris    /**
238f11c7f63SJim Harris     * This field specifies the current state handlers in place for this
239f11c7f63SJim Harris     * IO Request object.  This field is updated each time the request
240f11c7f63SJim Harris     * changes state.
241f11c7f63SJim Harris     */
242f11c7f63SJim Harris    struct SCIC_SDS_IO_REQUEST_STATE_HANDLER *state_handlers;
243f11c7f63SJim Harris 
244f11c7f63SJim Harris    #ifdef SCI_LOGGING
245f11c7f63SJim Harris    /**
246f11c7f63SJim Harris     * This field is the observer of the started subsate machine
247f11c7f63SJim Harris     */
248f11c7f63SJim Harris    SCI_BASE_STATE_MACHINE_LOGGER_T started_substate_machine_logger;
249f11c7f63SJim Harris    #endif
250f11c7f63SJim Harris 
251f11c7f63SJim Harris    /**
252f11c7f63SJim Harris     * This field in the recorded device sequence for the io request.  This is
253f11c7f63SJim Harris     * recorded during the build operation and is compared in the start
254f11c7f63SJim Harris     * operation.  If the sequence is different then there was a change of
255f11c7f63SJim Harris     * devices from the build to start operations.
256f11c7f63SJim Harris     */
257f11c7f63SJim Harris    U8  device_sequence;
258f11c7f63SJim Harris 
259f11c7f63SJim Harris } SCIC_SDS_REQUEST_T;
260f11c7f63SJim Harris 
261f11c7f63SJim Harris 
262f11c7f63SJim Harris typedef SCI_STATUS (*SCIC_SDS_IO_REQUEST_FRAME_HANDLER_T)(
263f11c7f63SJim Harris                          SCIC_SDS_REQUEST_T * this_request,
264f11c7f63SJim Harris                          U32                  frame_index);
265f11c7f63SJim Harris 
266f11c7f63SJim Harris typedef SCI_STATUS (*SCIC_SDS_IO_REQUEST_EVENT_HANDLER_T)(
267f11c7f63SJim Harris                          SCIC_SDS_REQUEST_T * this_request,
268f11c7f63SJim Harris                          U32                  event_code);
269f11c7f63SJim Harris 
270f11c7f63SJim Harris typedef SCI_STATUS (*SCIC_SDS_IO_REQUEST_TASK_COMPLETION_HANDLER_T)(
271f11c7f63SJim Harris                          SCIC_SDS_REQUEST_T * this_request,
272f11c7f63SJim Harris                          U32                  completion_code);
273f11c7f63SJim Harris 
274f11c7f63SJim Harris /**
275f11c7f63SJim Harris  * @struct SCIC_SDS_IO_REQUEST_STATE_HANDLER
276f11c7f63SJim Harris  *
277f11c7f63SJim Harris  * @brief This is the SDS core definition of the state handlers.
278f11c7f63SJim Harris  */
279f11c7f63SJim Harris typedef struct SCIC_SDS_IO_REQUEST_STATE_HANDLER
280f11c7f63SJim Harris {
281f11c7f63SJim Harris    SCI_BASE_REQUEST_STATE_HANDLER_T parent;
282f11c7f63SJim Harris 
283f11c7f63SJim Harris    SCIC_SDS_IO_REQUEST_TASK_COMPLETION_HANDLER_T  tc_completion_handler;
284f11c7f63SJim Harris    SCIC_SDS_IO_REQUEST_EVENT_HANDLER_T            event_handler;
285f11c7f63SJim Harris    SCIC_SDS_IO_REQUEST_FRAME_HANDLER_T            frame_handler;
286f11c7f63SJim Harris 
287f11c7f63SJim Harris } SCIC_SDS_IO_REQUEST_STATE_HANDLER_T;
288f11c7f63SJim Harris 
289f11c7f63SJim Harris extern SCI_BASE_STATE_T scic_sds_request_state_table[];
290f11c7f63SJim Harris extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
291f11c7f63SJim Harris        scic_sds_request_state_handler_table[];
292f11c7f63SJim Harris 
293f11c7f63SJim Harris extern SCI_BASE_STATE_T scic_sds_io_request_started_task_mgmt_substate_table[];
294f11c7f63SJim Harris extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
295f11c7f63SJim Harris        scic_sds_ssp_task_request_started_substate_handler_table[];
296f11c7f63SJim Harris 
297f11c7f63SJim Harris extern SCI_BASE_STATE_T scic_sds_smp_request_started_substate_table[];
298f11c7f63SJim Harris extern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T
299f11c7f63SJim Harris        scic_sds_smp_request_started_substate_handler_table[];
300f11c7f63SJim Harris 
301f11c7f63SJim Harris /**
302f11c7f63SJim Harris  * This macro returns the maximum number of SGL element paris that we will
303f11c7f63SJim Harris  * support in a single IO request.
304f11c7f63SJim Harris  */
305f11c7f63SJim Harris #define SCU_MAX_SGL_ELEMENT_PAIRS ((SCU_IO_REQUEST_SGE_COUNT + 1) / 2)
306f11c7f63SJim Harris 
307f11c7f63SJim Harris /**
308f11c7f63SJim Harris  * This macro will return the controller for this io request object
309f11c7f63SJim Harris  */
310f11c7f63SJim Harris #define scic_sds_request_get_controller(this_request) \
311f11c7f63SJim Harris    ((this_request)->owning_controller)
312f11c7f63SJim Harris 
313f11c7f63SJim Harris /**
314f11c7f63SJim Harris  * This macro will return the device for this io request object
315f11c7f63SJim Harris  */
316f11c7f63SJim Harris #define scic_sds_request_get_device(this_request) \
317f11c7f63SJim Harris    ((this_request)->target_device)
318f11c7f63SJim Harris 
319f11c7f63SJim Harris /**
320f11c7f63SJim Harris  * This macro will return the port for this io request object
321f11c7f63SJim Harris  */
322f11c7f63SJim Harris #define scic_sds_request_get_port(this_request) \
323f11c7f63SJim Harris    scic_sds_remote_device_get_port(scic_sds_request_get_device(this_request))
324f11c7f63SJim Harris 
325f11c7f63SJim Harris /**
326f11c7f63SJim Harris  * This macro returns the constructed post context result for the io
327f11c7f63SJim Harris  * request.
328f11c7f63SJim Harris  */
329f11c7f63SJim Harris #define scic_sds_request_get_post_context(this_request) \
330f11c7f63SJim Harris    ((this_request)->post_context)
331f11c7f63SJim Harris 
332f11c7f63SJim Harris /**
333f11c7f63SJim Harris  * This is a helper macro to return the os handle for this request object.
334f11c7f63SJim Harris  */
335f11c7f63SJim Harris #define scic_sds_request_get_task_context(request) \
336f11c7f63SJim Harris    ((request)->task_context_buffer)
337f11c7f63SJim Harris 
338f11c7f63SJim Harris #define scic_sds_request_align_task_context_buffer(address) \
339f11c7f63SJim Harris    ((SCU_TASK_CONTEXT_T *)( \
340f11c7f63SJim Harris        (((POINTER_UINT)(address)) + (CACHE_LINE_SIZE - 1)) \
341f11c7f63SJim Harris      & ~(CACHE_LINE_SIZE - 1) \
342f11c7f63SJim Harris    ))
343f11c7f63SJim Harris 
344f11c7f63SJim Harris /**
345f11c7f63SJim Harris  * This macro will align the memory address so that it is correct for the SCU
346f11c7f63SJim Harris  * hardware to DMA the SGL element pairs.
347f11c7f63SJim Harris  */
348f11c7f63SJim Harris #define scic_sds_request_align_sgl_element_buffer(address) \
349f11c7f63SJim Harris    ((SCU_SGL_ELEMENT_PAIR_T *)( \
350f11c7f63SJim Harris      ((char *)(address)) \
351f11c7f63SJim Harris    + ( \
352f11c7f63SJim Harris          ((~(POINTER_UINT)(address)) + 1) \
353f11c7f63SJim Harris        & (sizeof(SCU_SGL_ELEMENT_PAIR_T) - 1) \
354f11c7f63SJim Harris      ) \
355f11c7f63SJim Harris    ))
356f11c7f63SJim Harris 
357f11c7f63SJim Harris /**
358f11c7f63SJim Harris  * This macro will set the scu hardware status and sci request completion
359f11c7f63SJim Harris  * status for an io request.
360f11c7f63SJim Harris  */
361f11c7f63SJim Harris #define scic_sds_request_set_status(request, scu_status_code, sci_status_code) \
362f11c7f63SJim Harris { \
363f11c7f63SJim Harris    (request)->scu_status = (scu_status_code); \
364f11c7f63SJim Harris    (request)->sci_status = (sci_status_code); \
365f11c7f63SJim Harris }
366f11c7f63SJim Harris 
367f11c7f63SJim Harris #define scic_sds_request_complete(a_request) \
368f11c7f63SJim Harris    ((a_request)->state_handlers->parent.complete_handler(&(a_request)->parent))
369f11c7f63SJim Harris 
370f11c7f63SJim Harris U32 scic_sds_request_get_min_timer_count(void);
371f11c7f63SJim Harris 
372f11c7f63SJim Harris U32 scic_sds_request_get_max_timer_count(void);
373f11c7f63SJim Harris 
374f11c7f63SJim Harris 
375f11c7f63SJim Harris /**
376f11c7f63SJim Harris  * This macro invokes the core state task completion handler for the
377f11c7f63SJim Harris  * SCIC_SDS_IO_REQUEST_T object.
378f11c7f63SJim Harris  */
379f11c7f63SJim Harris #define scic_sds_io_request_tc_completion(this_request, completion_code) \
380f11c7f63SJim Harris { \
381f11c7f63SJim Harris    if (this_request->parent.state_machine.current_state_id  \
382f11c7f63SJim Harris           == SCI_BASE_REQUEST_STATE_STARTED \
383f11c7f63SJim Harris        && this_request->has_started_substate_machine \
384f11c7f63SJim Harris           == FALSE) \
385f11c7f63SJim Harris       scic_sds_request_started_state_tc_completion_handler(this_request, completion_code); \
386f11c7f63SJim Harris    else \
387f11c7f63SJim Harris       this_request->state_handlers->tc_completion_handler(this_request, completion_code); \
388f11c7f63SJim Harris }
389f11c7f63SJim Harris 
390f11c7f63SJim Harris /**
391f11c7f63SJim Harris  * This macro zeros the hardware SGL element data
392f11c7f63SJim Harris  */
393f11c7f63SJim Harris #define SCU_SGL_ZERO(scu_sge) \
394f11c7f63SJim Harris { \
395f11c7f63SJim Harris    (scu_sge).length = 0; \
396f11c7f63SJim Harris    (scu_sge).address_lower = 0; \
397f11c7f63SJim Harris    (scu_sge).address_upper = 0; \
398f11c7f63SJim Harris    (scu_sge).address_modifier = 0; \
399f11c7f63SJim Harris }
400f11c7f63SJim Harris 
401f11c7f63SJim Harris /**
402f11c7f63SJim Harris  * This macro copys the SGL Element data from the host os to the hardware SGL
403f11c7f63SJim Harris  * elment data
404f11c7f63SJim Harris  */
405f11c7f63SJim Harris #define SCU_SGL_COPY(os_handle, scu_sge, os_sge) \
406f11c7f63SJim Harris { \
407f11c7f63SJim Harris    (scu_sge).length = \
408f11c7f63SJim Harris       scic_cb_sge_get_length_field(os_handle, os_sge); \
409f11c7f63SJim Harris    (scu_sge).address_upper = \
410f11c7f63SJim Harris       sci_cb_physical_address_upper(scic_cb_sge_get_address_field(os_handle, os_sge)); \
411f11c7f63SJim Harris    (scu_sge).address_lower = \
412f11c7f63SJim Harris       sci_cb_physical_address_lower(scic_cb_sge_get_address_field(os_handle, os_sge)); \
413f11c7f63SJim Harris    (scu_sge).address_modifier = 0; \
414f11c7f63SJim Harris }
415f11c7f63SJim Harris 
416f11c7f63SJim Harris //*****************************************************************************
417f11c7f63SJim Harris //* CORE REQUEST PROTOTYPES
418f11c7f63SJim Harris //*****************************************************************************
419f11c7f63SJim Harris 
420f11c7f63SJim Harris SCU_SGL_ELEMENT_PAIR_T *scic_sds_request_get_sgl_element_pair(
421f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request,
422f11c7f63SJim Harris    U32                 sgl_pair_index
423f11c7f63SJim Harris );
424f11c7f63SJim Harris 
425f11c7f63SJim Harris void scic_sds_request_build_sgl(
426f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
427f11c7f63SJim Harris );
428f11c7f63SJim Harris 
429f11c7f63SJim Harris void scic_sds_ssp_io_request_assign_buffers(
430f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
431f11c7f63SJim Harris );
432f11c7f63SJim Harris 
433f11c7f63SJim Harris void scic_sds_ssp_task_request_assign_buffers(
434f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
435f11c7f63SJim Harris );
436f11c7f63SJim Harris 
437f11c7f63SJim Harris void scic_sds_stp_request_assign_buffers(
438f11c7f63SJim Harris    SCIC_SDS_REQUEST_T * this_request
439f11c7f63SJim Harris );
440f11c7f63SJim Harris 
441f11c7f63SJim Harris void scic_sds_smp_request_assign_buffers(
442f11c7f63SJim Harris    SCIC_SDS_REQUEST_T * this_request
443f11c7f63SJim Harris );
444f11c7f63SJim Harris 
445f11c7f63SJim Harris // ---------------------------------------------------------------------------
446f11c7f63SJim Harris 
447f11c7f63SJim Harris SCI_STATUS scic_sds_request_start(
448f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
449f11c7f63SJim Harris );
450f11c7f63SJim Harris 
451f11c7f63SJim Harris SCI_STATUS scic_sds_io_request_terminate(
452f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
453f11c7f63SJim Harris );
454f11c7f63SJim Harris 
455f11c7f63SJim Harris SCI_STATUS scic_sds_io_request_complete(
456f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
457f11c7f63SJim Harris );
458f11c7f63SJim Harris 
459f11c7f63SJim Harris void scic_sds_io_request_copy_response(
460f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
461f11c7f63SJim Harris );
462f11c7f63SJim Harris 
463f11c7f63SJim Harris SCI_STATUS scic_sds_io_request_event_handler(
464f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request,
465f11c7f63SJim Harris    U32                    event_code
466f11c7f63SJim Harris );
467f11c7f63SJim Harris 
468f11c7f63SJim Harris SCI_STATUS scic_sds_io_request_frame_handler(
469f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request,
470f11c7f63SJim Harris    U32                    frame_index
471f11c7f63SJim Harris );
472f11c7f63SJim Harris 
473f11c7f63SJim Harris SCI_STATUS scic_sds_task_request_complete(
474f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
475f11c7f63SJim Harris );
476f11c7f63SJim Harris 
477f11c7f63SJim Harris SCI_STATUS scic_sds_task_request_terminate(
478f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
479f11c7f63SJim Harris );
480f11c7f63SJim Harris 
481f11c7f63SJim Harris #ifdef SCI_LOGGING
482f11c7f63SJim Harris void scic_sds_request_initialize_state_logging(
483f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
484f11c7f63SJim Harris );
485f11c7f63SJim Harris 
486f11c7f63SJim Harris void scic_sds_request_deinitialize_state_logging(
487f11c7f63SJim Harris    SCIC_SDS_REQUEST_T *this_request
488f11c7f63SJim Harris );
489f11c7f63SJim Harris #else // SCI_LOGGING
490f11c7f63SJim Harris #define scic_sds_request_initialize_state_logging(x)
491f11c7f63SJim Harris #define scic_sds_request_deinitialize_state_logging(x)
492f11c7f63SJim Harris #endif // SCI_LOGGING
493f11c7f63SJim Harris 
494f11c7f63SJim Harris //*****************************************************************************
495f11c7f63SJim Harris //* DEFAULT STATE HANDLERS
496f11c7f63SJim Harris //*****************************************************************************
497f11c7f63SJim Harris 
498f11c7f63SJim Harris SCI_STATUS scic_sds_request_default_start_handler(
499f11c7f63SJim Harris    SCI_BASE_REQUEST_T *this_request
500f11c7f63SJim Harris );
501f11c7f63SJim Harris 
502f11c7f63SJim Harris SCI_STATUS scic_sds_request_default_abort_handler(
503f11c7f63SJim Harris    SCI_BASE_REQUEST_T *this_request
504f11c7f63SJim Harris );
505f11c7f63SJim Harris 
506f11c7f63SJim Harris SCI_STATUS scic_sds_request_default_complete_handler(
507f11c7f63SJim Harris    SCI_BASE_REQUEST_T *this_request
508f11c7f63SJim Harris );
509f11c7f63SJim Harris 
510f11c7f63SJim Harris SCI_STATUS scic_sds_request_default_destruct_handler(
511f11c7f63SJim Harris    SCI_BASE_REQUEST_T *this_request
512f11c7f63SJim Harris );
513f11c7f63SJim Harris 
514f11c7f63SJim Harris SCI_STATUS scic_sds_request_default_tc_completion_handler(
515f11c7f63SJim Harris    SCIC_SDS_REQUEST_T * this_request,
516f11c7f63SJim Harris    U32                  completion_code
517f11c7f63SJim Harris );
518f11c7f63SJim Harris 
519f11c7f63SJim Harris SCI_STATUS scic_sds_request_default_event_handler(
520f11c7f63SJim Harris    SCIC_SDS_REQUEST_T * this_request,
521f11c7f63SJim Harris    U32                  event_code
522f11c7f63SJim Harris );
523f11c7f63SJim Harris 
524f11c7f63SJim Harris SCI_STATUS scic_sds_request_default_frame_handler(
525f11c7f63SJim Harris    SCIC_SDS_REQUEST_T * this_request,
526f11c7f63SJim Harris    U32                  frame_index
527f11c7f63SJim Harris );
528f11c7f63SJim Harris 
529f11c7f63SJim Harris //*****************************************************************************
530f11c7f63SJim Harris //* STARTED STATE HANDLERS
531f11c7f63SJim Harris //*****************************************************************************
532f11c7f63SJim Harris 
533f11c7f63SJim Harris SCI_STATUS scic_sds_request_started_state_abort_handler(
534f11c7f63SJim Harris    SCI_BASE_REQUEST_T *this_request
535f11c7f63SJim Harris );
536f11c7f63SJim Harris 
537f11c7f63SJim Harris SCI_STATUS scic_sds_request_started_state_tc_completion_handler(
538f11c7f63SJim Harris    SCIC_SDS_REQUEST_T * this_request,
539f11c7f63SJim Harris    U32                  completion_code
540f11c7f63SJim Harris );
541f11c7f63SJim Harris 
542f11c7f63SJim Harris #ifdef __cplusplus
543f11c7f63SJim Harris }
544f11c7f63SJim Harris #endif // __cplusplus
545f11c7f63SJim Harris 
546f11c7f63SJim Harris #endif // _SCIC_SDS_IO_REQUEST_H_
547