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