1230557Sjimharris/*- 2230557Sjimharris * This file is provided under a dual BSD/GPLv2 license. When using or 3230557Sjimharris * redistributing this file, you may do so under either license. 4230557Sjimharris * 5230557Sjimharris * GPL LICENSE SUMMARY 6230557Sjimharris * 7230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 8230557Sjimharris * 9230557Sjimharris * This program is free software; you can redistribute it and/or modify 10230557Sjimharris * it under the terms of version 2 of the GNU General Public License as 11230557Sjimharris * published by the Free Software Foundation. 12230557Sjimharris * 13230557Sjimharris * This program is distributed in the hope that it will be useful, but 14230557Sjimharris * WITHOUT ANY WARRANTY; without even the implied warranty of 15230557Sjimharris * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16230557Sjimharris * General Public License for more details. 17230557Sjimharris * 18230557Sjimharris * You should have received a copy of the GNU General Public License 19230557Sjimharris * along with this program; if not, write to the Free Software 20230557Sjimharris * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 21230557Sjimharris * The full GNU General Public License is included in this distribution 22230557Sjimharris * in the file called LICENSE.GPL. 23230557Sjimharris * 24230557Sjimharris * BSD LICENSE 25230557Sjimharris * 26230557Sjimharris * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 27230557Sjimharris * All rights reserved. 28230557Sjimharris * 29230557Sjimharris * Redistribution and use in source and binary forms, with or without 30230557Sjimharris * modification, are permitted provided that the following conditions 31230557Sjimharris * are met: 32230557Sjimharris * 33230557Sjimharris * * Redistributions of source code must retain the above copyright 34230557Sjimharris * notice, this list of conditions and the following disclaimer. 35230557Sjimharris * * Redistributions in binary form must reproduce the above copyright 36230557Sjimharris * notice, this list of conditions and the following disclaimer in 37230557Sjimharris * the documentation and/or other materials provided with the 38230557Sjimharris * distribution. 39230557Sjimharris * 40230557Sjimharris * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 41230557Sjimharris * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 42230557Sjimharris * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 43230557Sjimharris * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 44230557Sjimharris * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45230557Sjimharris * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 46230557Sjimharris * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 47230557Sjimharris * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 48230557Sjimharris * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 49230557Sjimharris * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 50230557Sjimharris * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 51230557Sjimharris * 52230557Sjimharris * $FreeBSD$ 53230557Sjimharris */ 54230557Sjimharris#ifndef _SCIC_CONTROLLER_H_ 55230557Sjimharris#define _SCIC_CONTROLLER_H_ 56230557Sjimharris 57230557Sjimharris/** 58230557Sjimharris * @file 59230557Sjimharris * 60230557Sjimharris * @brief This file contains all of the interface methods that can be called 61230557Sjimharris * by an SCIC user on a controller object. 62230557Sjimharris */ 63230557Sjimharris 64230557Sjimharris#ifdef __cplusplus 65230557Sjimharrisextern "C" { 66230557Sjimharris#endif // __cplusplus 67230557Sjimharris 68230557Sjimharris#include <dev/isci/scil/sci_types.h> 69230557Sjimharris#include <dev/isci/scil/sci_status.h> 70230557Sjimharris#include <dev/isci/scil/sci_controller.h> 71230557Sjimharris#include <dev/isci/scil/scic_config_parameters.h> 72230557Sjimharris 73230557Sjimharris/** 74230557Sjimharris * @enum 75230557Sjimharris * 76230557Sjimharris * Allowed PORT configuration modes 77230557Sjimharris * 78230557Sjimharris * APC Automatic PORT configuration mode is defined by the OEM configuration 79230557Sjimharris * parameters providing no PHY_MASK parameters for any PORT. i.e. There are 80230557Sjimharris * no phys assigned to any of the ports at start. 81230557Sjimharris * 82230557Sjimharris * MPC Manual PORT configuration mode is defined by the OEM configuration 83230557Sjimharris * parameters providing a PHY_MASK value for any PORT. It is assumed that 84230557Sjimharris * any PORT with no PHY_MASK is an invalid port and not all PHYs must be 85230557Sjimharris * assigned. A PORT_PHY mask that assigns just a single PHY to a port and no 86230557Sjimharris * other PHYs being assigned is sufficient to declare manual PORT configuration. 87230557Sjimharris */ 88230557Sjimharrisenum SCIC_PORT_CONFIGURATION_MODE 89230557Sjimharris{ 90230557Sjimharris SCIC_PORT_MANUAL_CONFIGURATION_MODE, 91230557Sjimharris SCIC_PORT_AUTOMATIC_CONFIGURATION_MODE 92230557Sjimharris}; 93230557Sjimharris 94230557Sjimharris/** 95230557Sjimharris * @enum _SCIC_INTERRUPT_TYPE 96230557Sjimharris * 97230557Sjimharris * @brief This enumeration depicts the various types of interrupts that 98230557Sjimharris * are potentially supported by a SCI Core implementation. 99230557Sjimharris */ 100230557Sjimharristypedef enum _SCIC_INTERRUPT_TYPE 101230557Sjimharris{ 102230557Sjimharris SCIC_LEGACY_LINE_INTERRUPT_TYPE, 103230557Sjimharris SCIC_MSIX_INTERRUPT_TYPE, 104230557Sjimharris 105230557Sjimharris /** 106230557Sjimharris * This enumeration value indicates the use of polling. 107230557Sjimharris */ 108230557Sjimharris SCIC_NO_INTERRUPTS 109230557Sjimharris 110230557Sjimharris} SCIC_INTERRUPT_TYPE; 111230557Sjimharris 112230557Sjimharris/** 113230557Sjimharris * @typedef SCIC_CONTROLLER_INTERRUPT_HANDLER 114230557Sjimharris * 115230557Sjimharris * @brief This method is called by the SCI user in order to have the SCI 116230557Sjimharris * implementation handle the interrupt. This method performs 117230557Sjimharris * minimal processing to allow for streamlined interrupt time usage. 118230557Sjimharris * @note 119230557Sjimharris * TRUE: returned if there is an interrupt to process and it was 120230557Sjimharris * processed. 121230557Sjimharris * FALSE: returned if no interrupt was processed. 122230557Sjimharris * 123230557Sjimharris */ 124230557Sjimharristypedef BOOL (*SCIC_CONTROLLER_INTERRUPT_HANDLER)( 125230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 126230557Sjimharris); 127230557Sjimharris 128230557Sjimharris/** 129230557Sjimharris * @brief This method is called by the SCI user to process completions 130230557Sjimharris * generated as a result of a previously handled interrupt. This 131230557Sjimharris * method will result in the completion of IO requests and handling 132230557Sjimharris * of other controller generated events. This method should be 133230557Sjimharris * called some time after the interrupt handler. 134230557Sjimharris * 135230557Sjimharris * @note Most, if not all, of the user callback APIs are invoked from within 136230557Sjimharris * this API. As a result, the user should be cognizent of the operating 137230557Sjimharris * level at which they invoke this API. 138230557Sjimharris * 139230557Sjimharris */ 140230557Sjimharristypedef void (*SCIC_CONTROLLER_COMPLETION_HANDLER)( 141230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 142230557Sjimharris); 143230557Sjimharris 144230557Sjimharris/** 145230557Sjimharris * @struct SCIC_CONTROLLER_HANDLER_METHODS 146230557Sjimharris * 147230557Sjimharris * @brief This structure contains an interrupt handler and completion 148230557Sjimharris * handler function pointers. 149230557Sjimharris */ 150230557Sjimharristypedef struct SCIC_CONTROLLER_HANDLER_METHODS 151230557Sjimharris{ 152230557Sjimharris SCIC_CONTROLLER_INTERRUPT_HANDLER interrupt_handler; 153230557Sjimharris SCIC_CONTROLLER_COMPLETION_HANDLER completion_handler; 154230557Sjimharris 155230557Sjimharris} SCIC_CONTROLLER_HANDLER_METHODS_T; 156230557Sjimharris 157230557Sjimharris/** 158230557Sjimharris * @brief This method will attempt to construct a controller object 159230557Sjimharris * utilizing the supplied parameter information. 160230557Sjimharris * 161230557Sjimharris * @param[in] library This parameter specifies the handle to the library 162230557Sjimharris * object associated with the controller being constructed. 163230557Sjimharris * @param[in] controller This parameter specifies the controller to be 164230557Sjimharris * constructed. 165230557Sjimharris * @param[in] user_object This parameter is a reference to the SCIL users 166230557Sjimharris * controller object and will be used to associate with the core 167230557Sjimharris * controller. 168230557Sjimharris * 169230557Sjimharris * @return Indicate if the controller was successfully constructed or if 170230557Sjimharris * it failed in some way. 171230557Sjimharris * @retval SCI_SUCCESS This value is returned if the controller was 172230557Sjimharris * successfully constructed. 173230557Sjimharris * @retval SCI_WARNING_TIMER_CONFLICT This value is returned if the 174230557Sjimharris * interrupt coalescence timer may cause SAS compliance issues 175230557Sjimharris * for SMP Target mode response processing. 176230557Sjimharris * @retval SCI_FAILURE_UNSUPPORTED_CONTROLLER_TYPE This value is returned if 177230557Sjimharris * the controller does not support the supplied type. 178230557Sjimharris * @retval SCI_FAILURE_UNSUPPORTED_INIT_DATA_VERSION This value is returned 179230557Sjimharris * if the controller does not support the supplied initialization 180230557Sjimharris * data version. 181230557Sjimharris */ 182230557SjimharrisSCI_STATUS scic_controller_construct( 183230557Sjimharris SCI_LIBRARY_HANDLE_T library, 184230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 185230557Sjimharris void * user_object 186230557Sjimharris); 187230557Sjimharris 188230557Sjimharris/** 189230557Sjimharris * @brief This method will enable all controller interrupts. 190230557Sjimharris * 191230557Sjimharris * @param[in] controller This parameter specifies the controller for which 192230557Sjimharris * to enable interrupts. 193230557Sjimharris * 194230557Sjimharris * @return none 195230557Sjimharris */ 196230557Sjimharrisvoid scic_controller_enable_interrupts( 197230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 198230557Sjimharris); 199230557Sjimharris 200230557Sjimharris/** 201230557Sjimharris * @brief This method will disable all controller interrupts. 202230557Sjimharris * 203230557Sjimharris * @param[in] controller This parameter specifies the controller for which 204230557Sjimharris * to disable interrupts. 205230557Sjimharris * 206230557Sjimharris * @return none 207230557Sjimharris */ 208230557Sjimharrisvoid scic_controller_disable_interrupts( 209230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 210230557Sjimharris); 211230557Sjimharris 212230557Sjimharris/** 213230557Sjimharris * @brief This method will return provide function pointers for the 214230557Sjimharris * interrupt handler and completion handler. The interrupt handler 215230557Sjimharris * is expected to be invoked at interrupt time. The completion 216230557Sjimharris * handler is scheduled to run as a result of the interrupt handler. 217230557Sjimharris * The completion handler performs the bulk work for processing 218230557Sjimharris * silicon events. 219230557Sjimharris * 220230557Sjimharris * @param[in] interrupt_type This parameter informs the core which type 221230557Sjimharris * of interrupt/completion methods are being requested. These 222230557Sjimharris * are the types: SCIC_LEGACY_LINE_INTERRUPT_TYPE, 223230557Sjimharris * SCIC_MSIX_INTERRUPT_TYPE, SCIC_NO_INTERRUPTS (POLLING) 224230557Sjimharris * @param[in] message_count This parameter informs the core the 225230557Sjimharris * number of MSI-X messages to be utilized. This parameter must 226230557Sjimharris * be 0 when requesting legacy line based handlers. 227230557Sjimharris * @param[in] handler_methods The caller provides a pointer to a buffer of 228230557Sjimharris * type SCIC_CONTROLLER_HANDLER_METHODS_T. The size depends on 229230557Sjimharris * the combination of the interrupt_type and message_count input 230230557Sjimharris * parameters: 231230557Sjimharris * SCIC_LEGACY_LINE_INTERRUPT_TYPE: 232230557Sjimharris * - size = sizeof(SCIC_CONTROLLER_HANDLER_METHODS_T) 233230557Sjimharris * SCIC_MSIX_INTERRUPT_TYPE: 234230557Sjimharris * - size = message_count*sizeof(SCIC_CONTROLLER_HANDLER_METHODS_T) 235230557Sjimharris * @param[out] handler_methods SCIC fills out the caller's buffer with the 236230557Sjimharris * appropriate interrupt and completion handlers based on the info 237230557Sjimharris * provided in the interrupt_type and message_count input 238230557Sjimharris * parameters. For SCIC_LEGACY_LINE_INTERRUPT_TYPE, the buffer 239230557Sjimharris * receives a single SCIC_CONTROLLER_HANDLER_METHODS_T element 240230557Sjimharris * regardless that the message_count parameter is zero. 241230557Sjimharris * For SCIC_MSIX_INTERRUPT_TYPE, the buffer receives an array of 242230557Sjimharris * elements of type SCIC_CONTROLLER_HANDLER_METHODS_T where the 243230557Sjimharris * array size is equivalent to the message_count parameter. The 244230557Sjimharris * array is zero-relative where entry zero corresponds to 245230557Sjimharris * message-vector zero, entry one corresponds to message-vector one, 246230557Sjimharris * and so forth. 247230557Sjimharris * 248230557Sjimharris * @return Indicate if the handler retrieval operation was successful. 249230557Sjimharris * @retval SCI_SUCCESS This value is returned if retrieval succeeded. 250230557Sjimharris * @retval SCI_FAILURE_UNSUPPORTED_MESSAGE_COUNT This value is returned 251230557Sjimharris * if the user supplied an unsupported number of MSI-X messages. 252230557Sjimharris * For legacy line interrupts the only valid value is 0. 253230557Sjimharris */ 254230557SjimharrisSCI_STATUS scic_controller_get_handler_methods( 255230557Sjimharris SCIC_INTERRUPT_TYPE interrupt_type, 256230557Sjimharris U16 message_count, 257230557Sjimharris SCIC_CONTROLLER_HANDLER_METHODS_T * handler_methods 258230557Sjimharris); 259230557Sjimharris 260230557Sjimharris/** 261230557Sjimharris * @brief This method will initialize the controller hardware managed by 262230557Sjimharris * the supplied core controller object. This method will bring the 263230557Sjimharris * physical controller hardware out of reset and enable the core to 264230557Sjimharris * determine the capabilities of the hardware being managed. Thus, 265230557Sjimharris * the core controller can determine it's exact physical (DMA capable) 266230557Sjimharris * memory requirements. 267230557Sjimharris * 268230557Sjimharris * @pre The SCI Core user must have called scic_controller_construct() 269230557Sjimharris * on the supplied controller object previously. 270230557Sjimharris * 271230557Sjimharris * @param[in] controller This parameter specifies the controller to be 272230557Sjimharris * initialized. 273230557Sjimharris * 274230557Sjimharris * @return Indicate if the controller was successfully initialized or if 275230557Sjimharris * it failed in some way. 276230557Sjimharris * @retval SCI_SUCCESS This value is returned if the controller hardware 277230557Sjimharris * was successfully initialized. 278230557Sjimharris */ 279230557SjimharrisSCI_STATUS scic_controller_initialize( 280230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 281230557Sjimharris); 282230557Sjimharris 283230557Sjimharris/** 284230557Sjimharris * @brief This method returns the suggested scic_controller_start() 285230557Sjimharris * timeout amount. The user is free to use any timeout value, 286230557Sjimharris * but this method provides the suggested minimum start timeout 287230557Sjimharris * value. The returned value is based upon empirical information 288230557Sjimharris * determined as a result of interoperability testing. 289230557Sjimharris * 290230557Sjimharris * @param[in] controller the handle to the controller object for which 291230557Sjimharris * to return the suggested start timeout. 292230557Sjimharris * 293230557Sjimharris * @return This method returns the number of milliseconds for the 294230557Sjimharris * suggested start operation timeout. 295230557Sjimharris */ 296230557SjimharrisU32 scic_controller_get_suggested_start_timeout( 297230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 298230557Sjimharris); 299230557Sjimharris 300230557Sjimharris/** 301230557Sjimharris * @brief This method will start the supplied core controller. This method 302230557Sjimharris * will start the staggered spin up operation. The SCI User completion 303230557Sjimharris * callback is called when the following conditions are met: 304230557Sjimharris * -# the return status of this method is SCI_SUCCESS. 305230557Sjimharris * -# after all of the phys have successfully started or been given 306230557Sjimharris * the opportunity to start. 307230557Sjimharris * 308230557Sjimharris * @pre The SCI Core user must have filled in the physical memory 309230557Sjimharris * descriptor structure via the 310230557Sjimharris * sci_controller_get_memory_descriptor_list() method. 311230557Sjimharris * @pre The SCI Core user must have invoked the scic_controller_initialize() 312230557Sjimharris * method prior to invoking this method. 313230557Sjimharris * 314230557Sjimharris * @pre The controller must be in the INITIALIZED or STARTED state. 315230557Sjimharris * 316230557Sjimharris * @param[in] controller the handle to the controller object to start. 317230557Sjimharris * @param[in] timeout This parameter specifies the number of milliseconds 318230557Sjimharris * in which the start operation should complete. 319230557Sjimharris * 320230557Sjimharris * @return Indicate if the controller start method succeeded or failed in 321230557Sjimharris * some way. 322230557Sjimharris * @retval SCI_SUCCESS if the start operation succeeded. 323230557Sjimharris * @retval SCI_WARNING_ALREADY_IN_STATE if the controller is already in 324230557Sjimharris * the STARTED state. 325230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE if the controller is not either in 326230557Sjimharris * the INITIALIZED or STARTED states. 327230557Sjimharris * @retval SCI_FAILURE_INVALID_MEMORY_DESCRIPTOR if there are 328230557Sjimharris * inconsistent or invalid values in the supplied 329230557Sjimharris * SCI_PHYSICAL_MEMORY_DESCRIPTOR array. 330230557Sjimharris */ 331230557SjimharrisSCI_STATUS scic_controller_start( 332230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 333230557Sjimharris U32 timeout 334230557Sjimharris); 335230557Sjimharris 336230557Sjimharris/** 337230557Sjimharris * @brief This method will stop an individual controller object.This method 338230557Sjimharris * will invoke the associated user callback upon completion. The 339230557Sjimharris * completion callback is called when the following conditions are met: 340230557Sjimharris * -# the method return status is SCI_SUCCESS. 341230557Sjimharris * -# the controller has been quiesced. 342230557Sjimharris * This method will ensure that all IO requests are quiesced, phys 343230557Sjimharris * are stopped, and all additional operation by the hardware is halted. 344230557Sjimharris * 345230557Sjimharris * @pre The controller must be in the STARTED or STOPPED state. 346230557Sjimharris * 347230557Sjimharris * @param[in] controller the handle to the controller object to stop. 348230557Sjimharris * @param[in] timeout This parameter specifies the number of milliseconds 349230557Sjimharris * in which the stop operation should complete. 350230557Sjimharris * 351230557Sjimharris * @return Indicate if the controller stop method succeeded or failed in 352230557Sjimharris * some way. 353230557Sjimharris * @retval SCI_SUCCESS if the stop operation successfully began. 354230557Sjimharris * @retval SCI_WARNING_ALREADY_IN_STATE if the controller is already in 355230557Sjimharris * the STOPPED state. 356230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE if the controller is not either in 357230557Sjimharris * the STARTED or STOPPED states. 358230557Sjimharris */ 359230557SjimharrisSCI_STATUS scic_controller_stop( 360230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 361230557Sjimharris U32 timeout 362230557Sjimharris); 363230557Sjimharris 364230557Sjimharris/** 365230557Sjimharris * @brief This method will reset the supplied core controller regardless of 366230557Sjimharris * the state of said controller. This operation is considered 367230557Sjimharris * destructive. In other words, all current operations are wiped 368230557Sjimharris * out. No IO completions for outstanding devices occur. Outstanding 369230557Sjimharris * IO requests are not aborted or completed at the actual remote 370230557Sjimharris * device. 371230557Sjimharris * 372230557Sjimharris * @param[in] controller the handle to the controller object to reset. 373230557Sjimharris * 374230557Sjimharris * @return Indicate if the controller reset method succeeded or failed in 375230557Sjimharris * some way. 376230557Sjimharris * @retval SCI_SUCCESS if the reset operation successfully started. 377230557Sjimharris * @retval SCI_FATAL_ERROR if the controller reset operation is unable to 378230557Sjimharris * complete. 379230557Sjimharris */ 380230557SjimharrisSCI_STATUS scic_controller_reset( 381230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 382230557Sjimharris); 383230557Sjimharris 384230557Sjimharris/** 385230557Sjimharris * @brief This method is called by the SCI user to send/start an IO request. 386230557Sjimharris * If the method invocation is successful, then the IO request has 387230557Sjimharris * been queued to the hardware for processing. 388230557Sjimharris * 389230557Sjimharris * @warning 390230557Sjimharris * - IO tags are a protected resource. It is incumbent upon the 391230557Sjimharris * SCI Core user to ensure that each of the methods that may 392230557Sjimharris * allocate or free available IO tags are handled in a mutually 393230557Sjimharris * exclusive manner. This method is one of said methods requiring 394230557Sjimharris * proper critical code section protection (e.g. semaphore, 395230557Sjimharris * spin-lock, etc.). 396230557Sjimharris * - For SATA, the user is required to manage NCQ tags. As a 397230557Sjimharris * result, it is expected the user will have set the NCQ tag 398230557Sjimharris * field in the host to device register FIS prior to calling 399230557Sjimharris * this method. There is also a requirement for the user 400230557Sjimharris * to call scic_stp_io_set_ncq_tag() prior to invoking the 401230557Sjimharris * scic_controller_start_io() method. 402230557Sjimharris * 403230557Sjimharris * @param[in] controller the handle to the controller object for which 404230557Sjimharris * to start an IO request. 405230557Sjimharris * @param[in] remote_device the handle to the remote device object for which 406230557Sjimharris * to start an IO request. 407230557Sjimharris * @param[in] io_request the handle to the io request object to start. 408230557Sjimharris * @param[in] io_tag This parameter specifies a previously allocated IO tag 409230557Sjimharris * that the user desires to be utilized for this request. 410230557Sjimharris * This parameter is optional. The user is allowed to supply 411230557Sjimharris * SCI_CONTROLLER_INVALID_IO_TAG as the value for this parameter. 412230557Sjimharris * @see scic_controller_allocate_tag() for more information 413230557Sjimharris * on allocating a tag. 414230557Sjimharris * 415230557Sjimharris * @return Indicate if the controller successfully started the IO request. 416230557Sjimharris * @retval SCI_IO_SUCCESS if the IO request was successfully started. 417230557Sjimharris * 418230557Sjimharris * @todo Determine the failure situations and return values. 419230557Sjimharris */ 420230557SjimharrisSCI_IO_STATUS scic_controller_start_io( 421230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 422230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 423230557Sjimharris SCI_IO_REQUEST_HANDLE_T io_request, 424230557Sjimharris U16 io_tag 425230557Sjimharris); 426230557Sjimharris 427230557Sjimharris#if !defined(DISABLE_TASK_MANAGEMENT) 428230557Sjimharris 429230557Sjimharris/** 430230557Sjimharris * @brief This method is called by the SCIC user to send/start a framework 431230557Sjimharris * task management request. 432230557Sjimharris * 433230557Sjimharris * @warning 434230557Sjimharris * - IO tags are a protected resource. It is incumbent upon the 435230557Sjimharris * SCI Core user to ensure that each of the methods that may 436230557Sjimharris * allocate or free available IO tags are handled in a mutually 437230557Sjimharris * exclusive manner. This method is one of said methods requiring 438230557Sjimharris * proper critical code section protection (e.g. semaphore, 439230557Sjimharris * spin-lock, etc.). 440230557Sjimharris * - The user must synchronize this task with completion queue 441230557Sjimharris * processing. If they are not synchronized then it is possible 442230557Sjimharris * for the io requests that are being managed by the task request 443230557Sjimharris * can complete before starting the task request. 444230557Sjimharris * 445230557Sjimharris * @param[in] controller the handle to the controller object for which 446230557Sjimharris * to start the task management request. 447230557Sjimharris * @param[in] remote_device the handle to the remote device object for which 448230557Sjimharris * to start the task management request. 449230557Sjimharris * @param[in] task_request the handle to the task request object to start. 450230557Sjimharris * @param[in] io_tag This parameter specifies a previously allocated IO tag 451230557Sjimharris * that the user desires to be utilized for this request. Note 452230557Sjimharris * this not the io_tag of the request being managed. It is to 453230557Sjimharris * be utilized for the task request itself. 454230557Sjimharris * This parameter is optional. The user is allowed to supply 455230557Sjimharris * SCI_CONTROLLER_INVALID_IO_TAG as the value for this parameter. 456230557Sjimharris * @see scic_controller_allocate_tag() for more information 457230557Sjimharris * on allocating a tag. 458230557Sjimharris * 459230557Sjimharris * @return Indicate if the controller successfully started the IO request. 460230557Sjimharris * @retval SCI_TASK_SUCCESS if the task request was successfully started. 461230557Sjimharris * @retval SCI_TASK_FAILURE_REQUIRES_SCSI_ABORT This value is returned if 462230557Sjimharris * there is/are task(s) outstanding that require termination or 463230557Sjimharris * completion before this request can succeed. 464230557Sjimharris */ 465230557SjimharrisSCI_TASK_STATUS scic_controller_start_task( 466230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 467230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 468230557Sjimharris SCI_TASK_REQUEST_HANDLE_T task_request, 469230557Sjimharris U16 io_tag 470230557Sjimharris); 471230557Sjimharris 472230557Sjimharris/** 473230557Sjimharris * @brief This method will perform core specific completion operations for 474230557Sjimharris * task management request. After this method is invoked, the user should 475230557Sjimharris * consider the task request as invalid until it is properly reused 476230557Sjimharris * (i.e. re-constructed). 477230557Sjimharris * 478230557Sjimharris * @param[in] controller The handle to the controller object for which 479230557Sjimharris * to complete the task management request. 480230557Sjimharris * @param[in] remote_device The handle to the remote device object for which 481230557Sjimharris * to complete the task management request. 482230557Sjimharris * @param[in] task_request the handle to the task management request object 483230557Sjimharris * to complete. 484230557Sjimharris * 485230557Sjimharris * @return Indicate if the controller successfully completed the task 486230557Sjimharris * management request. 487230557Sjimharris * @retval SCI_SUCCESS if the completion process was successful. 488230557Sjimharris */ 489230557SjimharrisSCI_STATUS scic_controller_complete_task( 490230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 491230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 492230557Sjimharris SCI_TASK_REQUEST_HANDLE_T task_request 493230557Sjimharris); 494230557Sjimharris 495230557Sjimharris#else // !defined(DISABLE_TASK_MANAGEMENT) 496230557Sjimharris 497230557Sjimharris#define scic_controller_start_task(controller, dev, task, tag) SCI_TASK_FAILURE 498230557Sjimharris#define scic_controller_complete_task(controller, dev, task) SCI_FAILURE 499230557Sjimharris 500230557Sjimharris#endif // !defined(DISABLE_TASK_MANAGEMENT) 501230557Sjimharris 502230557Sjimharris/** 503230557Sjimharris * @brief This method is called by the SCI Core user to terminate an ongoing 504230557Sjimharris * (i.e. started) core IO request. This does not abort the IO request 505230557Sjimharris * at the target, but rather removes the IO request from the host 506230557Sjimharris * controller. 507230557Sjimharris * 508230557Sjimharris * @param[in] controller the handle to the controller object for which 509230557Sjimharris * to terminate a request. 510230557Sjimharris * @param[in] remote_device the handle to the remote device object for which 511230557Sjimharris * to terminate a request. 512230557Sjimharris * @param[in] request the handle to the io or task management request 513230557Sjimharris * object to terminate. 514230557Sjimharris * 515230557Sjimharris * @return Indicate if the controller successfully began the terminate process 516230557Sjimharris * for the IO request. 517230557Sjimharris * @retval SCI_SUCCESS if the terminate process was successfully started for 518230557Sjimharris * the request. 519230557Sjimharris * 520230557Sjimharris * @todo Determine the failure situations and return values. 521230557Sjimharris */ 522230557SjimharrisSCI_STATUS scic_controller_terminate_request( 523230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 524230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 525230557Sjimharris SCI_IO_REQUEST_HANDLE_T request 526230557Sjimharris); 527230557Sjimharris 528230557Sjimharris/** 529230557Sjimharris * @brief This method will perform core specific completion operations for 530230557Sjimharris * an IO request. After this method is invoked, the user should 531230557Sjimharris * consider the IO request as invalid until it is properly reused 532230557Sjimharris * (i.e. re-constructed). 533230557Sjimharris * 534230557Sjimharris * @warning 535230557Sjimharris * - IO tags are a protected resource. It is incumbent upon the 536230557Sjimharris * SCI Core user to ensure that each of the methods that may 537230557Sjimharris * allocate or free available IO tags are handled in a mutually 538230557Sjimharris * exclusive manner. This method is one of said methods requiring 539230557Sjimharris * proper critical code section protection (e.g. semaphore, 540230557Sjimharris * spin-lock, etc.). 541230557Sjimharris * - If the IO tag for a request was allocated, by the SCI Core user, 542230557Sjimharris * using the scic_controller_allocate_io_tag() method, then it is 543230557Sjimharris * the responsibility of the caller to invoke the 544230557Sjimharris * scic_controller_free_io_tag() method to free the tag (i.e. this 545230557Sjimharris * method will not free the IO tag). 546230557Sjimharris * 547230557Sjimharris * @param[in] controller The handle to the controller object for which 548230557Sjimharris * to complete the IO request. 549230557Sjimharris * @param[in] remote_device The handle to the remote device object for which 550230557Sjimharris * to complete the IO request. 551230557Sjimharris * @param[in] io_request the handle to the io request object to complete. 552230557Sjimharris * 553230557Sjimharris * @return Indicate if the controller successfully completed the IO request. 554230557Sjimharris * @retval SCI_SUCCESS if the completion process was successful. 555230557Sjimharris */ 556230557SjimharrisSCI_STATUS scic_controller_complete_io( 557230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 558230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 559230557Sjimharris SCI_IO_REQUEST_HANDLE_T io_request 560230557Sjimharris); 561230557Sjimharris 562230557Sjimharris 563230557Sjimharris/** 564230557Sjimharris * @brief This method simply provides the user with a unique handle for a 565230557Sjimharris * given SAS/SATA core port index. 566230557Sjimharris * 567230557Sjimharris * @param[in] controller This parameter represents the handle to the 568230557Sjimharris * controller object from which to retrieve a port (SAS or 569230557Sjimharris * SATA) handle. 570230557Sjimharris * @param[in] port_index This parameter specifies the port index in 571230557Sjimharris * the controller for which to retrieve the port handle. 572230557Sjimharris * 0 <= port_index < maximum number of phys. 573230557Sjimharris * @param[out] port_handle This parameter specifies the retrieved port handle 574230557Sjimharris * to be provided to the caller. 575230557Sjimharris * 576230557Sjimharris * @return Indicate if the retrieval of the port handle was successful. 577230557Sjimharris * @retval SCI_SUCCESS This value is returned if the retrieval was successful. 578230557Sjimharris * @retval SCI_FAILURE_INVALID_PORT This value is returned if the supplied 579230557Sjimharris * port id is not in the supported range. 580230557Sjimharris */ 581230557SjimharrisSCI_STATUS scic_controller_get_port_handle( 582230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 583230557Sjimharris U8 port_index, 584230557Sjimharris SCI_PORT_HANDLE_T * port_handle 585230557Sjimharris); 586230557Sjimharris 587230557Sjimharris/** 588230557Sjimharris * @brief This method simply provides the user with a unique handle for a 589230557Sjimharris * given SAS/SATA phy index/identifier. 590230557Sjimharris * 591230557Sjimharris * @param[in] controller This parameter represents the handle to the 592230557Sjimharris * controller object from which to retrieve a phy (SAS or 593230557Sjimharris * SATA) handle. 594230557Sjimharris * @param[in] phy_index This parameter specifies the phy index in 595230557Sjimharris * the controller for which to retrieve the phy handle. 596230557Sjimharris * 0 <= phy_index < maximum number of phys. 597230557Sjimharris * @param[out] phy_handle This parameter specifies the retrieved phy handle 598230557Sjimharris * to be provided to the caller. 599230557Sjimharris * 600230557Sjimharris * @return Indicate if the retrieval of the phy handle was successful. 601230557Sjimharris * @retval SCI_SUCCESS This value is returned if the retrieval was successful. 602230557Sjimharris * @retval SCI_FAILURE_INVALID_PHY This value is returned if the supplied phy 603230557Sjimharris * id is not in the supported range. 604230557Sjimharris */ 605230557SjimharrisSCI_STATUS scic_controller_get_phy_handle( 606230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 607230557Sjimharris U8 phy_index, 608230557Sjimharris SCI_PHY_HANDLE_T * phy_handle 609230557Sjimharris); 610230557Sjimharris 611230557Sjimharris/** 612230557Sjimharris * @brief This method will allocate a tag from the pool of free IO tags. 613230557Sjimharris * Direct allocation of IO tags by the SCI Core user is optional. 614230557Sjimharris * The scic_controller_start_io() method will allocate an IO 615230557Sjimharris * tag if this method is not utilized and the tag is not 616230557Sjimharris * supplied to the IO construct routine. Direct allocation of IO tags 617230557Sjimharris * may provide additional performance improvements in environments 618230557Sjimharris * capable of supporting this usage model. Additionally, direct 619230557Sjimharris * allocation of IO tags also provides additional flexibility to the 620230557Sjimharris * SCI Core user. Specifically, the user may retain IO tags across 621230557Sjimharris * the lives of multiple IO requests. 622230557Sjimharris * 623230557Sjimharris * @warning IO tags are a protected resource. It is incumbent upon the 624230557Sjimharris * SCI Core user to ensure that each of the methods that may 625230557Sjimharris * allocate or free available IO tags are handled in a mutually 626230557Sjimharris * exclusive manner. This method is one of said methods requiring 627230557Sjimharris * proper critical code section protection (e.g. semaphore, 628230557Sjimharris * spin-lock, etc.). 629230557Sjimharris * 630230557Sjimharris * @param[in] controller the handle to the controller object for which to 631230557Sjimharris * allocate the tag. 632230557Sjimharris * 633230557Sjimharris * @return An unsigned integer representing an available IO tag. 634230557Sjimharris * @retval SCI_CONTROLLER_INVALID_IO_TAG This value is returned if there 635230557Sjimharris * are no currently available tags to be allocated. 636230557Sjimharris * @retval All return other values indicate a legitimate tag. 637230557Sjimharris */ 638230557SjimharrisU16 scic_controller_allocate_io_tag( 639230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 640230557Sjimharris); 641230557Sjimharris 642230557Sjimharris/** 643230557Sjimharris * @brief This method will free an IO tag to the pool of free IO tags. 644230557Sjimharris * This method provides the SCI Core user more flexibility with 645230557Sjimharris * regards to IO tags. The user may desire to keep an IO tag after 646230557Sjimharris * an IO request has completed, because they plan on re-using the 647230557Sjimharris * tag for a subsequent IO request. This method is only legal if 648230557Sjimharris * the tag was allocated via scic_controller_allocate_io_tag(). 649230557Sjimharris * 650230557Sjimharris * @warning 651230557Sjimharris * - IO tags are a protected resource. It is incumbent upon the 652230557Sjimharris * SCI Core user to ensure that each of the methods that may 653230557Sjimharris * allocate or free available IO tags are handled in a mutually 654230557Sjimharris * exclusive manner. This method is one of said methods requiring 655230557Sjimharris * proper critical code section protection (e.g. semaphore, 656230557Sjimharris * spin-lock, etc.). 657230557Sjimharris * - If the IO tag for a request was allocated, by the SCI Core user, 658230557Sjimharris * using the scic_controller_allocate_io_tag() method, then it is 659230557Sjimharris * the responsibility of the caller to invoke this method to free 660230557Sjimharris * the tag. 661230557Sjimharris * 662230557Sjimharris * @param[in] controller This parameter specifies the handle to the 663230557Sjimharris * controller object for which to free/return the tag. 664230557Sjimharris * @param[in] io_tag This parameter represents the tag to be freed to the 665230557Sjimharris * pool of available tags. 666230557Sjimharris * 667230557Sjimharris * @return This method returns an indication of whether the tag was 668230557Sjimharris * successfully put back (freed) to the pool of available tags. 669230557Sjimharris * @retval SCI_SUCCESS This return value indicates the tag was successfully 670230557Sjimharris * placed into the pool of available IO tags. 671230557Sjimharris * @retval SCI_FAILURE_INVALID_IO_TAG This value is returned if the supplied 672230557Sjimharris * tag is not a valid IO tag value. 673230557Sjimharris */ 674230557SjimharrisSCI_STATUS scic_controller_free_io_tag( 675230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 676230557Sjimharris U16 io_tag 677230557Sjimharris); 678230557Sjimharris 679230557Sjimharris/** 680230557Sjimharris * @brief This method returns the size of the core's scratch RAM. 681230557Sjimharris * 682230557Sjimharris * @return Size of the scratch RAM in dwords. 683230557Sjimharris */ 684230557SjimharrisU32 scic_controller_get_scratch_ram_size( 685230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 686230557Sjimharris); 687230557Sjimharris 688230557Sjimharris/** 689230557Sjimharris * @brief This method allows the user to read a U32 from the core's 690230557Sjimharris * scratch RAM. 691230557Sjimharris * 692230557Sjimharris * @param[in] controller This parameter represents the handle to the 693230557Sjimharris * controller object for which to read scratch RAM. 694230557Sjimharris * @param[in] offset The offset (in dwords) into the scratch RAM. 695230557Sjimharris * @param[out] value The location where the read value should be stored. 696230557Sjimharris * 697230557Sjimharris * @return Indicate if the user specified a valid offset into the 698230557Sjimharris * scratch RAM. 699230557Sjimharris * @retval SCI_SUCCESS The scratch RAM was successfully read. 700230557Sjimharris * @retval SCI_FAILURE_INVALID_PARAMETER_VALUE The user specified an 701230557Sjimharris * invalid offset. 702230557Sjimharris */ 703230557SjimharrisSCI_STATUS scic_controller_read_scratch_ram_dword( 704230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 705230557Sjimharris U32 offset, 706230557Sjimharris U32 * value 707230557Sjimharris); 708230557Sjimharris 709230557Sjimharris/** 710230557Sjimharris * @brief This method allows the user to write a U32 to the core's 711230557Sjimharris * scratch RAM. 712230557Sjimharris * 713230557Sjimharris * @param[in] controller This parameter represents the handle to the 714230557Sjimharris * controller object for which to write scratch RAM. 715230557Sjimharris * @param[in] offset The offset (in dwords) into the scratch RAM. 716230557Sjimharris * @param[out] value The value to be written to scratch RAM. 717230557Sjimharris * 718230557Sjimharris * @return Indicate if the user specified a valid offset into the 719230557Sjimharris * scratch RAM. 720230557Sjimharris * @retval SCI_SUCCESS The scratch RAM was successfully written. 721230557Sjimharris * @retval SCI_FAILURE_INVALID_PARAMETER_VALUE The user specified an 722230557Sjimharris * invalid offset. 723230557Sjimharris */ 724230557SjimharrisSCI_STATUS scic_controller_write_scratch_ram_dword( 725230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 726230557Sjimharris U32 offset, 727230557Sjimharris U32 value 728230557Sjimharris); 729230557Sjimharris 730230557Sjimharris/** 731230557Sjimharris * @brief This method allows the user to configure the SCI core into 732230557Sjimharris * either a performance mode or a memory savings mode. 733230557Sjimharris * 734230557Sjimharris * @param[in] controller This parameter represents the handle to the 735230557Sjimharris * controller object for which to update the operating 736230557Sjimharris * mode. 737230557Sjimharris * @param[in] mode This parameter specifies the new mode for the 738230557Sjimharris * controller. 739230557Sjimharris * 740230557Sjimharris * @return Indicate if the user successfully change the operating mode 741230557Sjimharris * of the controller. 742230557Sjimharris * @retval SCI_SUCCESS The user successfully updated the mode. 743230557Sjimharris */ 744230557SjimharrisSCI_STATUS scic_controller_set_mode( 745230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 746230557Sjimharris SCI_CONTROLLER_MODE mode 747230557Sjimharris); 748230557Sjimharris 749230557Sjimharris 750230557Sjimharris#if !defined(DISABLE_INTERRUPTS) 751230557Sjimharris/** 752230557Sjimharris * @brief This method allows the user to configure the interrupt coalescence. 753230557Sjimharris * 754230557Sjimharris * @param[in] controller This parameter represents the handle to the 755230557Sjimharris * controller object for which its interrupt coalesce register 756230557Sjimharris * is overridden. 757230557Sjimharris * 758230557Sjimharris * @param[in] coalesce_number Used to control the number of entries in the 759230557Sjimharris * Completion Queue before an interrupt is generated. If the 760230557Sjimharris * number of entries exceed this number, an interrupt will be 761230557Sjimharris * generated. The valid range of the input is [0, 256]. 762230557Sjimharris * A setting of 0 results in coalescing being disabled. 763230557Sjimharris * @param[in] coalesce_timeout Timeout value in microseconds. The valid range 764230557Sjimharris * of the input is [0, 2700000] . A setting of 0 is allowed and 765230557Sjimharris * results in no interrupt coalescing timeout. 766230557Sjimharris * 767230557Sjimharris * @return Indicate if the user successfully set the interrupt coalesce parameters. 768230557Sjimharris * @retval SCI_SUCCESS The user successfully updated the interrutp coalescence. 769230557Sjimharris * @retval SCI_FAILURE_INVALID_PARAMETER_VALUE The user input value is out of range. 770230557Sjimharris */ 771230557SjimharrisSCI_STATUS scic_controller_set_interrupt_coalescence( 772230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 773230557Sjimharris U32 coalesce_number, 774230557Sjimharris U32 coalesce_timeout 775230557Sjimharris); 776230557Sjimharris 777230557Sjimharris/** 778230557Sjimharris * @brief This method retrieves the interrupt coalescing values 779230557Sjimharris * 780230557Sjimharris * @param[in] controller This parameter specifies the controller for 781230557Sjimharris * which its interrupt coalescing number is read. 782230557Sjimharris * 783230557Sjimharris * @param[out] coalesce_number, interrupt coalescing number read from controller. 784230557Sjimharris * 785230557Sjimharris * @param[out] coalesce_timeout, timeout value in microseconds. 786230557Sjimharris * 787230557Sjimharris * @return None 788230557Sjimharris */ 789230557Sjimharrisvoid scic_controller_get_interrupt_coalescence( 790230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 791230557Sjimharris U32 * coalesce_number, 792230557Sjimharris U32 * coalesce_timeout 793230557Sjimharris); 794230557Sjimharris#else // !defined(DISABLE_INTERRUPTS) 795230557Sjimharris#define scic_controller_set_interrupt_coalescence(controller, num, timeout) \ 796230557Sjimharris SCI_FAILURE 797230557Sjimharris#define scic_controller_get_interrupt_coalescence(controller, num, timeout) 798230557Sjimharris#endif // !defined(DISABLE_INTERRUPTS) 799230557Sjimharris 800230557Sjimharris 801230557Sjimharris/** 802230557Sjimharris * @brief This method suspend the controller, reinitialize RAMs, then resume 803230557Sjimharris * the controller. 804230557Sjimharris * 805230557Sjimharris * @param[in] controller This parameter specifies the controller which is transitioning. 806230557Sjimharris * 807230557Sjimharris * @param[in] restrict_completions This parameter specifies whether the controller should 808230557Sjimharris * ignore completion processing for non-fastpath events. This will cause 809230557Sjimharris * the completions to be thrown away. 810230557Sjimharris * 811230557Sjimharris * @return SCI_STATUS The status of controller transition. 812230557Sjimharris */ 813230557SjimharrisSCI_STATUS scic_controller_transition( 814230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 815230557Sjimharris BOOL restrict_completions 816230557Sjimharris); 817230557Sjimharris 818230557Sjimharris 819230557Sjimharris/** 820230557Sjimharris * @brief This method suspends the controller. 821230557Sjimharris * 822230557Sjimharris * @param[in] controller This parameter specifies the controller which is to be suspended. 823230557Sjimharris * 824230557Sjimharris * @return SCI_STATUS The status of controller suspend. 825230557Sjimharris */ 826230557SjimharrisSCI_STATUS scic_controller_suspend( 827230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 828230557Sjimharris); 829230557Sjimharris 830230557Sjimharris/** 831230557Sjimharris * @brief This method resumes the controller. 832230557Sjimharris * 833230557Sjimharris * @param[in] controller This parameter specifies the controller which is to be resumed. 834230557Sjimharris * 835230557Sjimharris * @return SCI_STATUS The status of controller resume. 836230557Sjimharris */ 837230557SjimharrisSCI_STATUS scic_controller_resume( 838230557Sjimharris SCI_CONTROLLER_HANDLE_T controller 839230557Sjimharris); 840230557Sjimharris 841230557SjimharrisSCI_STATUS scic_controller_get_max_ports( 842230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 843230557Sjimharris U8 * count 844230557Sjimharris); 845230557Sjimharris 846230557SjimharrisSCI_STATUS scic_controller_get_max_phys( 847230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 848230557Sjimharris U8 * count 849230557Sjimharris); 850230557Sjimharris 851230557Sjimharris#ifdef __cplusplus 852230557Sjimharris} 853230557Sjimharris#endif // __cplusplus 854230557Sjimharris 855230557Sjimharris#endif // _SCIC_CONTROLLER_H_ 856230557Sjimharris 857