scic_sds_request.h revision 231134
1193323Sed/*- 2193323Sed * This file is provided under a dual BSD/GPLv2 license. When using or 3193323Sed * redistributing this file, you may do so under either license. 4193323Sed * 5193323Sed * GPL LICENSE SUMMARY 6193323Sed * 7193323Sed * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 8193323Sed * 9193323Sed * This program is free software; you can redistribute it and/or modify 10193323Sed * it under the terms of version 2 of the GNU General Public License as 11193323Sed * published by the Free Software Foundation. 12193323Sed * 13193323Sed * This program is distributed in the hope that it will be useful, but 14193323Sed * WITHOUT ANY WARRANTY; without even the implied warranty of 15193323Sed * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16193323Sed * General Public License for more details. 17193323Sed * 18193323Sed * You should have received a copy of the GNU General Public License 19193323Sed * along with this program; if not, write to the Free Software 20193323Sed * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21193323Sed * The full GNU General Public License is included in this distribution 22193323Sed * in the file called LICENSE.GPL. 23193323Sed * 24193323Sed * BSD LICENSE 25193323Sed * 26193323Sed * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 27193323Sed * All rights reserved. 28193323Sed * 29193323Sed * Redistribution and use in source and binary forms, with or without 30193323Sed * modification, are permitted provided that the following conditions 31193323Sed * are met: 32193323Sed * 33193323Sed * * Redistributions of source code must retain the above copyright 34193323Sed * notice, this list of conditions and the following disclaimer. 35198892Srdivacky * * Redistributions in binary form must reproduce the above copyright 36193323Sed * notice, this list of conditions and the following disclaimer in 37193323Sed * the documentation and/or other materials provided with the 38193323Sed * distribution. 39193323Sed * 40193323Sed * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 41193323Sed * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 42193323Sed * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 43193323Sed * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 44193323Sed * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45193323Sed * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46193323Sed * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 47193323Sed * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 48193323Sed * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 49193323Sed * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 50193323Sed * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51193323Sed * 52193323Sed * $FreeBSD$ 53193323Sed */ 54193323Sed#ifndef _SCIC_SDS_IO_REQUEST_H_ 55193323Sed#define _SCIC_SDS_IO_REQUEST_H_ 56193323Sed 57193323Sed/** 58193323Sed * @file 59193323Sed * 60193323Sed * @brief This file contains the structures, constants and prototypes for the 61193323Sed * SCIC_SDS_IO_REQUEST object. 62193323Sed */ 63193323Sed 64193323Sed#ifdef __cplusplus 65193323Sedextern "C" { 66193323Sed#endif // __cplusplus 67193323Sed 68193323Sed#include <dev/isci/scil/scic_io_request.h> 69193323Sed 70193323Sed#include <dev/isci/scil/sci_base_request.h> 71193323Sed#include <dev/isci/scil/sci_base_state_machine_logger.h> 72193323Sed#include <dev/isci/scil/scu_task_context.h> 73193323Sed#include <dev/isci/scil/intel_sas.h> 74193323Sed 75193323Sedstruct SCIC_SDS_CONTROLLER; 76193323Sedstruct SCIC_SDS_REMOTE_DEVICE; 77193323Sedstruct SCIC_SDS_IO_REQUEST_STATE_HANDLER; 78193323Sed 79193323Sed/** 80193323Sed * @enum _SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATES 81193323Sed * 82193323Sed * @brief This enumeration depicts all of the substates for a task 83193323Sed * management request to be performed in the STARTED super-state. 84193323Sed */ 85193323Sedtypedef enum _SCIC_SDS_RAW_REQUEST_STARTED_TASK_MGMT_SUBSTATES 86193323Sed{ 87193323Sed /** 88193323Sed * The AWAIT_TC_COMPLETION sub-state indicates that the started raw 89193323Sed * task management request is waiting for the transmission of the 90193323Sed * initial frame (i.e. command, task, etc.). 91193323Sed */ 92193323Sed SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATE_AWAIT_TC_COMPLETION, 93193323Sed 94193323Sed /** 95193323Sed * This sub-state indicates that the started task management request 96193323Sed * is waiting for the reception of an unsolicited frame 97193323Sed * (i.e. response IU). 98193323Sed */ 99193323Sed SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_SUBSTATE_AWAIT_TC_RESPONSE, 100193323Sed 101193323Sed SCIC_SDS_IO_REQUEST_STARTED_TASK_MGMT_MAX_SUBSTATES 102193323Sed 103193323Sed} SCIC_SDS_RAW_REQUEST_STARTED_TASK_MGMT_SUBSTATES; 104193323Sed 105193323Sed 106193323Sed/** 107193323Sed * @enum _SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATES 108193323Sed * 109198090Srdivacky * @brief This enumeration depicts all of the substates for a SMP 110198090Srdivacky * request to be performed in the STARTED super-state. 111198090Srdivacky */ 112193323Sedtypedef enum _SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATES 113193323Sed{ 114193323Sed /** 115193323Sed * This sub-state indicates that the started task management request 116193323Sed * is waiting for the reception of an unsolicited frame 117193323Sed * (i.e. response IU). 118193323Sed */ 119193323Sed SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATE_AWAIT_RESPONSE, 120193323Sed 121193323Sed /** 122193323Sed * The AWAIT_TC_COMPLETION sub-state indicates that the started SMP request is 123193323Sed * waiting for the transmission of the initial frame (i.e. command, task, etc.). 124193323Sed */ 125193323Sed SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATE_AWAIT_TC_COMPLETION, 126193323Sed 127193323Sed SCIC_SDS_SMP_REQUEST_STARTED_MAX_SUBSTATES 128193323Sed 129193323Sed} SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATES; 130193323Sed 131193323Sed/** 132193323Sed * @struct SCIC_SDS_IO_REQUEST 133193323Sed * 134193323Sed * @brief This structure contains or references all of the data necessary 135193323Sed * to process a task management or normal IO request. 136198090Srdivacky */ 137193323Sedtypedef struct SCIC_SDS_REQUEST 138193323Sed{ 139193323Sed /** 140193323Sed * This field indictes the parent object of the request. 141193323Sed */ 142193323Sed SCI_BASE_REQUEST_T parent; 143193323Sed 144193323Sed void *user_request; 145193323Sed 146193323Sed /** 147198090Srdivacky * This field simply points to the controller to which this IO request 148198090Srdivacky * is associated. 149193323Sed */ 150193323Sed struct SCIC_SDS_CONTROLLER *owning_controller; 151193323Sed 152193323Sed /** 153193323Sed * This field simply points to the remote device to which this IO request 154193323Sed * is associated. 155193323Sed */ 156193323Sed struct SCIC_SDS_REMOTE_DEVICE *target_device; 157193323Sed 158193323Sed /** 159193323Sed * This field is utilized to determine if the SCI user is managing 160193323Sed * the IO tag for this request or if the core is managing it. 161193323Sed */ 162193323Sed BOOL was_tag_assigned_by_user; 163193323Sed 164193323Sed /** 165193323Sed * This field indicates the IO tag for this request. The IO tag is 166193323Sed * comprised of the task_index and a sequence count. The sequence count 167193323Sed * is utilized to help identify tasks from one life to another. 168193323Sed */ 169193323Sed U16 io_tag; 170193323Sed 171193323Sed /** 172193323Sed * This field specifies the sat protocol being utilized for this 173193323Sed * IO request, such as SAT_PROTOCOL_PIO_DATA_IN, SAT_PROTOCOL_FPDMA etc. 174193323Sed */ 175193323Sed U8 sat_protocol; 176193323Sed 177193323Sed /** 178193323Sed * This field specifies the protocol being utilized for this 179193323Sed * IO request. 180193323Sed */ 181193323Sed SCIC_TRANSPORT_PROTOCOL protocol; 182193323Sed 183193323Sed /** 184193323Sed * This field indicates the completion status taken from the SCUs 185193323Sed * completion code. It indicates the completion result for the SCU hardware. 186193323Sed */ 187193323Sed U32 scu_status; 188193323Sed 189193323Sed /** 190193323Sed * This field indicates the completion status returned to the SCI user. It 191193323Sed * indicates the users view of the io request completion. 192193323Sed */ 193193323Sed U32 sci_status; 194193323Sed 195193323Sed /** 196193323Sed * This field contains the value to be utilized when posting (e.g. Post_TC, 197193323Sed * Post_TC_Abort) this request to the silicon. 198193323Sed */ 199193323Sed U32 post_context; 200193323Sed 201193323Sed void *command_buffer; 202193323Sed void *response_buffer; 203193323Sed SCU_TASK_CONTEXT_T *task_context_buffer; 204193323Sed SCU_SGL_ELEMENT_PAIR_T *sgl_element_pair_buffer; 205193323Sed 206193323Sed /** 207193323Sed * This field indicates if this request is a task management request or 208193323Sed * normal IO request. 209193323Sed */ 210193323Sed BOOL is_task_management_request; 211193323Sed 212193323Sed /** 213193323Sed * This field indicates that this request contains an initialized started 214193323Sed * substate machine. 215193323Sed */ 216193323Sed BOOL has_started_substate_machine; 217193323Sed 218193323Sed /** 219193323Sed * This field is a pointer to the stored rx frame data. It is used in STP 220193323Sed * internal requests and SMP response frames. If this field is non-NULL the 221193323Sed * saved frame must be released on IO request completion. 222193323Sed * 223193323Sed * @todo In the future do we want to keep a list of RX frame buffers? 224198090Srdivacky */ 225193323Sed U32 saved_rx_frame_index; 226193323Sed 227193323Sed /** 228198090Srdivacky * This field specifies the data necessary to manage the sub-state 229198090Srdivacky * machine executed while in the SCI_BASE_REQUEST_STATE_STARTED state. 230198090Srdivacky */ 231193323Sed SCI_BASE_STATE_MACHINE_T started_substate_machine; 232198090Srdivacky 233198090Srdivacky /** 234198090Srdivacky * This field specifies the current state handlers in place for this 235198090Srdivacky * IO Request object. This field is updated each time the request 236198090Srdivacky * changes state. 237198090Srdivacky */ 238198090Srdivacky struct SCIC_SDS_IO_REQUEST_STATE_HANDLER *state_handlers; 239198090Srdivacky 240198090Srdivacky #ifdef SCI_LOGGING 241198090Srdivacky /** 242198090Srdivacky * This field is the observer of the started subsate machine 243198090Srdivacky */ 244198090Srdivacky SCI_BASE_STATE_MACHINE_LOGGER_T started_substate_machine_logger; 245198090Srdivacky #endif 246198090Srdivacky 247198090Srdivacky /** 248198090Srdivacky * This field in the recorded device sequence for the io request. This is 249198090Srdivacky * recorded during the build operation and is compared in the start 250198090Srdivacky * operation. If the sequence is different then there was a change of 251193323Sed * devices from the build to start operations. 252193323Sed */ 253193323Sed U8 device_sequence; 254193323Sed 255198090Srdivacky} SCIC_SDS_REQUEST_T; 256198090Srdivacky 257198090Srdivacky 258198090Srdivackytypedef SCI_STATUS (*SCIC_SDS_IO_REQUEST_FRAME_HANDLER_T)( 259193323Sed SCIC_SDS_REQUEST_T * this_request, 260198090Srdivacky U32 frame_index); 261193323Sed 262193323Sedtypedef SCI_STATUS (*SCIC_SDS_IO_REQUEST_EVENT_HANDLER_T)( 263193323Sed SCIC_SDS_REQUEST_T * this_request, 264193323Sed U32 event_code); 265193323Sed 266193323Sedtypedef SCI_STATUS (*SCIC_SDS_IO_REQUEST_TASK_COMPLETION_HANDLER_T)( 267193323Sed SCIC_SDS_REQUEST_T * this_request, 268193323Sed U32 completion_code); 269193323Sed 270193323Sed/** 271193323Sed * @struct SCIC_SDS_IO_REQUEST_STATE_HANDLER 272193323Sed * 273193323Sed * @brief This is the SDS core definition of the state handlers. 274193323Sed */ 275193323Sedtypedef struct SCIC_SDS_IO_REQUEST_STATE_HANDLER 276193323Sed{ 277193323Sed SCI_BASE_REQUEST_STATE_HANDLER_T parent; 278193323Sed 279193323Sed SCIC_SDS_IO_REQUEST_TASK_COMPLETION_HANDLER_T tc_completion_handler; 280193323Sed SCIC_SDS_IO_REQUEST_EVENT_HANDLER_T event_handler; 281193323Sed SCIC_SDS_IO_REQUEST_FRAME_HANDLER_T frame_handler; 282193323Sed 283193323Sed} SCIC_SDS_IO_REQUEST_STATE_HANDLER_T; 284193323Sed 285193323Sedextern SCI_BASE_STATE_T scic_sds_request_state_table[]; 286193323Sedextern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T 287193323Sed scic_sds_request_state_handler_table[]; 288193323Sed 289193323Sedextern SCI_BASE_STATE_T scic_sds_io_request_started_task_mgmt_substate_table[]; 290193323Sedextern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T 291193323Sed scic_sds_ssp_task_request_started_substate_handler_table[]; 292193323Sed 293193323Sedextern SCI_BASE_STATE_T scic_sds_smp_request_started_substate_table[]; 294193323Sedextern SCIC_SDS_IO_REQUEST_STATE_HANDLER_T 295193323Sed scic_sds_smp_request_started_substate_handler_table[]; 296193323Sed 297193323Sed/** 298193323Sed * This macro returns the maximum number of SGL element paris that we will 299193323Sed * support in a single IO request. 300193323Sed */ 301193323Sed#define SCU_MAX_SGL_ELEMENT_PAIRS ((SCU_IO_REQUEST_SGE_COUNT + 1) / 2) 302193323Sed 303193323Sed/** 304193323Sed * This macro will return the controller for this io request object 305193323Sed */ 306193323Sed#define scic_sds_request_get_controller(this_request) \ 307193323Sed ((this_request)->owning_controller) 308193323Sed 309193323Sed/** 310193323Sed * This macro will return the device for this io request object 311193323Sed */ 312193323Sed#define scic_sds_request_get_device(this_request) \ 313193323Sed ((this_request)->target_device) 314193323Sed 315193323Sed/** 316193323Sed * This macro will return the port for this io request object 317193323Sed */ 318193323Sed#define scic_sds_request_get_port(this_request) \ 319193323Sed scic_sds_remote_device_get_port(scic_sds_request_get_device(this_request)) 320193323Sed 321193323Sed/** 322193323Sed * This macro returns the constructed post context result for the io 323193323Sed * request. 324193323Sed */ 325193323Sed#define scic_sds_request_get_post_context(this_request) \ 326193323Sed ((this_request)->post_context) 327193323Sed 328193323Sed/** 329193323Sed * This is a helper macro to return the os handle for this request object. 330193323Sed */ 331193323Sed#define scic_sds_request_get_task_context(request) \ 332193323Sed ((request)->task_context_buffer) 333193323Sed 334193323Sed#define CACHE_LINE_SIZE (64) 335198090Srdivacky#define scic_sds_request_align_task_context_buffer(address) \ 336193323Sed ((SCU_TASK_CONTEXT_T *)( \ 337193323Sed (((POINTER_UINT)(address)) + (CACHE_LINE_SIZE - 1)) \ 338193323Sed & ~(CACHE_LINE_SIZE - 1) \ 339193323Sed )) 340193323Sed 341193323Sed/** 342193323Sed * This macro will align the memory address so that it is correct for the SCU 343193323Sed * hardware to DMA the SGL element pairs. 344193323Sed */ 345193323Sed#define scic_sds_request_align_sgl_element_buffer(address) \ 346193323Sed ((SCU_SGL_ELEMENT_PAIR_T *)( \ 347193323Sed ((char *)(address)) \ 348193323Sed + ( \ 349193323Sed ((~(POINTER_UINT)(address)) + 1) \ 350193323Sed & (sizeof(SCU_SGL_ELEMENT_PAIR_T) - 1) \ 351193323Sed ) \ 352193323Sed )) 353193323Sed 354193323Sed/** 355193323Sed * This macro will set the scu hardware status and sci request completion 356193323Sed * status for an io request. 357193323Sed */ 358193323Sed#define scic_sds_request_set_status(request, scu_status_code, sci_status_code) \ 359193323Sed{ \ 360193323Sed (request)->scu_status = (scu_status_code); \ 361193323Sed (request)->sci_status = (sci_status_code); \ 362193323Sed} 363193323Sed 364193323Sed#define scic_sds_request_complete(a_request) \ 365193323Sed ((a_request)->state_handlers->parent.complete_handler(&(a_request)->parent)) 366193323Sed 367193323SedU32 scic_sds_request_get_min_timer_count(void); 368193323Sed 369193323SedU32 scic_sds_request_get_max_timer_count(void); 370193323Sed 371193323Sed 372193323Sed/** 373193323Sed * This macro invokes the core state task completion handler for the 374193323Sed * SCIC_SDS_IO_REQUEST_T object. 375198090Srdivacky */ 376198090Srdivacky#define scic_sds_io_request_tc_completion(this_request, completion_code) \ 377193323Sed{ \ 378193323Sed if (this_request->parent.state_machine.current_state_id \ 379193323Sed == SCI_BASE_REQUEST_STATE_STARTED \ 380193323Sed && this_request->has_started_substate_machine \ 381193323Sed == FALSE) \ 382193323Sed scic_sds_request_started_state_tc_completion_handler(this_request, completion_code); \ 383193323Sed else \ 384193323Sed this_request->state_handlers->tc_completion_handler(this_request, completion_code); \ 385193323Sed} 386193323Sed 387193323Sed/** 388193323Sed * This macro zeros the hardware SGL element data 389193323Sed */ 390193323Sed#define SCU_SGL_ZERO(scu_sge) \ 391193323Sed{ \ 392193323Sed (scu_sge).length = 0; \ 393193323Sed (scu_sge).address_lower = 0; \ 394193323Sed (scu_sge).address_upper = 0; \ 395193323Sed (scu_sge).address_modifier = 0; \ 396193323Sed} 397193323Sed 398193323Sed/** 399193323Sed * This macro copys the SGL Element data from the host os to the hardware SGL 400193323Sed * elment data 401193323Sed */ 402193323Sed#define SCU_SGL_COPY(os_handle, scu_sge, os_sge) \ 403193323Sed{ \ 404193323Sed (scu_sge).length = \ 405193323Sed scic_cb_sge_get_length_field(os_handle, os_sge); \ 406193323Sed (scu_sge).address_upper = \ 407193323Sed sci_cb_physical_address_upper(scic_cb_sge_get_address_field(os_handle, os_sge)); \ 408193323Sed (scu_sge).address_lower = \ 409193323Sed sci_cb_physical_address_lower(scic_cb_sge_get_address_field(os_handle, os_sge)); \ 410193323Sed (scu_sge).address_modifier = 0; \ 411193323Sed} 412193323Sed 413193323Sed//***************************************************************************** 414193323Sed//* CORE REQUEST PROTOTYPES 415193323Sed//***************************************************************************** 416 417SCU_SGL_ELEMENT_PAIR_T *scic_sds_request_get_sgl_element_pair( 418 SCIC_SDS_REQUEST_T *this_request, 419 U32 sgl_pair_index 420); 421 422void scic_sds_request_build_sgl( 423 SCIC_SDS_REQUEST_T *this_request 424); 425 426void scic_sds_ssp_io_request_assign_buffers( 427 SCIC_SDS_REQUEST_T *this_request 428); 429 430void scic_sds_ssp_task_request_assign_buffers( 431 SCIC_SDS_REQUEST_T *this_request 432); 433 434void scic_sds_stp_request_assign_buffers( 435 SCIC_SDS_REQUEST_T * this_request 436); 437 438void scic_sds_smp_request_assign_buffers( 439 SCIC_SDS_REQUEST_T * this_request 440); 441 442// --------------------------------------------------------------------------- 443 444SCI_STATUS scic_sds_request_start( 445 SCIC_SDS_REQUEST_T *this_request 446); 447 448SCI_STATUS scic_sds_io_request_terminate( 449 SCIC_SDS_REQUEST_T *this_request 450); 451 452SCI_STATUS scic_sds_io_request_complete( 453 SCIC_SDS_REQUEST_T *this_request 454); 455 456void scic_sds_io_request_copy_response( 457 SCIC_SDS_REQUEST_T *this_request 458); 459 460SCI_STATUS scic_sds_io_request_event_handler( 461 SCIC_SDS_REQUEST_T *this_request, 462 U32 event_code 463); 464 465SCI_STATUS scic_sds_io_request_frame_handler( 466 SCIC_SDS_REQUEST_T *this_request, 467 U32 frame_index 468); 469 470SCI_STATUS scic_sds_task_request_complete( 471 SCIC_SDS_REQUEST_T *this_request 472); 473 474SCI_STATUS scic_sds_task_request_terminate( 475 SCIC_SDS_REQUEST_T *this_request 476); 477 478#ifdef SCI_LOGGING 479void scic_sds_request_initialize_state_logging( 480 SCIC_SDS_REQUEST_T *this_request 481); 482 483void scic_sds_request_deinitialize_state_logging( 484 SCIC_SDS_REQUEST_T *this_request 485); 486#else // SCI_LOGGING 487#define scic_sds_request_initialize_state_logging(x) 488#define scic_sds_request_deinitialize_state_logging(x) 489#endif // SCI_LOGGING 490 491//***************************************************************************** 492//* DEFAULT STATE HANDLERS 493//***************************************************************************** 494 495SCI_STATUS scic_sds_request_default_start_handler( 496 SCI_BASE_REQUEST_T *this_request 497); 498 499SCI_STATUS scic_sds_request_default_abort_handler( 500 SCI_BASE_REQUEST_T *this_request 501); 502 503SCI_STATUS scic_sds_request_default_complete_handler( 504 SCI_BASE_REQUEST_T *this_request 505); 506 507SCI_STATUS scic_sds_request_default_destruct_handler( 508 SCI_BASE_REQUEST_T *this_request 509); 510 511SCI_STATUS scic_sds_request_default_tc_completion_handler( 512 SCIC_SDS_REQUEST_T * this_request, 513 U32 completion_code 514); 515 516SCI_STATUS scic_sds_request_default_event_handler( 517 SCIC_SDS_REQUEST_T * this_request, 518 U32 event_code 519); 520 521SCI_STATUS scic_sds_request_default_frame_handler( 522 SCIC_SDS_REQUEST_T * this_request, 523 U32 frame_index 524); 525 526//***************************************************************************** 527//* STARTED STATE HANDLERS 528//***************************************************************************** 529 530SCI_STATUS scic_sds_request_started_state_abort_handler( 531 SCI_BASE_REQUEST_T *this_request 532); 533 534SCI_STATUS scic_sds_request_started_state_tc_completion_handler( 535 SCIC_SDS_REQUEST_T * this_request, 536 U32 completion_code 537); 538 539#ifdef __cplusplus 540} 541#endif // __cplusplus 542 543#endif // _SCIC_SDS_IO_REQUEST_H_ 544