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