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