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_SDS_REMOTE_DEVICE_H_ 55230557Sjimharris#define _SCIC_SDS_REMOTE_DEVICE_H_ 56230557Sjimharris 57230557Sjimharris/** 58230557Sjimharris * @file 59230557Sjimharris * 60230557Sjimharris * @brief This file contains the structures, constants, and prototypes for the 61230557Sjimharris * SCIC_SDS_REMOTE_DEVICE object. 62230557Sjimharris */ 63230557Sjimharris 64230557Sjimharris#ifdef __cplusplus 65230557Sjimharrisextern "C" { 66230557Sjimharris#endif // __cplusplus 67230557Sjimharris 68230557Sjimharris#include <dev/isci/scil/intel_sas.h> 69230557Sjimharris#include <dev/isci/scil/sci_base_remote_device.h> 70230557Sjimharris#include <dev/isci/scil/sci_base_request.h> 71230557Sjimharris#include <dev/isci/scil/sci_base_state_machine_logger.h> 72230557Sjimharris#include <dev/isci/scil/scu_remote_node_context.h> 73230557Sjimharris#include <dev/isci/scil/scic_sds_remote_node_context.h> 74230557Sjimharris 75230557Sjimharrisstruct SCIC_SDS_CONTROLLER; 76230557Sjimharrisstruct SCIC_SDS_PORT; 77230557Sjimharrisstruct SCIC_SDS_REQUEST; 78230557Sjimharrisstruct SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER; 79230557Sjimharris 80230557Sjimharris/** 81230557Sjimharris * @enum SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATES 82230557Sjimharris * 83230557Sjimharris * This is the enumeration of the ready substates for the 84230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 85230557Sjimharris */ 86230557Sjimharrisenum SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATES 87230557Sjimharris{ 88230557Sjimharris /** 89230557Sjimharris * This is the initial state for the remote device ready substate. 90230557Sjimharris */ 91230557Sjimharris SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATE_INITIAL, 92230557Sjimharris 93230557Sjimharris /** 94230557Sjimharris * This is the ready operational substate for the remote device. This is the 95230557Sjimharris * normal operational state for a remote device. 96230557Sjimharris */ 97230557Sjimharris SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATE_OPERATIONAL, 98230557Sjimharris 99230557Sjimharris /** 100230557Sjimharris * This is the suspended state for the remote device. This is the state that 101230557Sjimharris * the device is placed in when a RNC suspend is received by the SCU hardware. 102230557Sjimharris */ 103230557Sjimharris SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATE_SUSPENDED, 104230557Sjimharris 105230557Sjimharris /** 106230557Sjimharris * This is the final state that the device is placed in before a change to the 107230557Sjimharris * base state machine. 108230557Sjimharris */ 109230557Sjimharris SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATE_FINAL, 110230557Sjimharris 111230557Sjimharris SCIC_SDS_SSP_REMOTE_DEVICE_READY_MAX_SUBSTATES 112230557Sjimharris}; 113230557Sjimharris 114230557Sjimharris/** 115230557Sjimharris * @enum SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATES 116230557Sjimharris * 117230557Sjimharris * This is the enumeration for the SCIC_SDS_REMOTE_DEVICE ready substates for 118230557Sjimharris * the STP remote device. 119230557Sjimharris */ 120230557Sjimharrisenum SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATES 121230557Sjimharris{ 122230557Sjimharris /** 123230557Sjimharris * This is the idle substate for the stp remote device. When there are no 124240521Seadler * active IO for the device it is in this state. 125230557Sjimharris */ 126230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE, 127230557Sjimharris 128230557Sjimharris /** 129230557Sjimharris * This is the command state for for the STP remote device. This state is 130230557Sjimharris * entered when the device is processing a non-NCQ command. The device object 131230557Sjimharris * will fail any new start IO requests until this command is complete. 132230557Sjimharris */ 133230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_CMD, 134230557Sjimharris 135230557Sjimharris /** 136230557Sjimharris * This is the NCQ state for the STP remote device. This state is entered 137230557Sjimharris * when the device is processing an NCQ reuqest. It will remain in this state 138230557Sjimharris * so long as there is one or more NCQ requests being processed. 139230557Sjimharris */ 140230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ, 141230557Sjimharris 142230557Sjimharris /** 143230557Sjimharris * This is the NCQ error state for the STP remote device. This state is 144230557Sjimharris * entered when an SDB error FIS is received by the device object while in the 145230557Sjimharris * NCQ state. The device object will only accept a READ LOG command while in 146230557Sjimharris * this state. 147230557Sjimharris */ 148230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ_ERROR, 149230557Sjimharris 150230557Sjimharris#if !defined(DISABLE_ATAPI) 151230557Sjimharris /** 152230557Sjimharris * This is the ATAPI error state for the STP ATAPI remote device. This state is 153230557Sjimharris * entered when ATAPI device sends error status FIS without data while the device 154230557Sjimharris * object is in CMD state. A suspension event is expected in this state. The device 155230557Sjimharris * object will resume right away. 156230557Sjimharris */ 157230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_ATAPI_ERROR, 158230557Sjimharris#endif 159230557Sjimharris 160230557Sjimharris /** 161230557Sjimharris * This is the READY substate indicates the device is waiting for the RESET task 162230557Sjimharris * coming to be recovered from certain hardware specific error. 163230557Sjimharris */ 164230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_AWAIT_RESET, 165230557Sjimharris 166230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_MAX_SUBSTATES 167230557Sjimharris}; 168230557Sjimharris 169230557Sjimharris 170230557Sjimharris/** 171230557Sjimharris * @enum SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATES 172230557Sjimharris * 173230557Sjimharris * This is the enumeration of the ready substates for the SMP REMOTE DEVICE. 174230557Sjimharris */ 175230557Sjimharris 176230557Sjimharrisenum SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATES 177230557Sjimharris{ 178230557Sjimharris /** 179230557Sjimharris * This is the ready operational substate for the remote device. This is the 180230557Sjimharris * normal operational state for a remote device. 181230557Sjimharris */ 182230557Sjimharris SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE, 183230557Sjimharris 184230557Sjimharris /** 185230557Sjimharris * This is the suspended state for the remote device. This is the state that 186230557Sjimharris * the device is placed in when a RNC suspend is received by the SCU hardware. 187230557Sjimharris */ 188230557Sjimharris SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_CMD, 189230557Sjimharris 190230557Sjimharris SCIC_SDS_SMP_REMOTE_DEVICE_READY_MAX_SUBSTATES 191230557Sjimharris}; 192230557Sjimharris 193230557Sjimharris 194230557Sjimharris 195230557Sjimharris 196230557Sjimharris/** 197230557Sjimharris * @struct SCIC_SDS_REMOTE_DEVICE 198230557Sjimharris * 199230557Sjimharris * @brief This structure contains the data for an SCU implementation of 200230557Sjimharris * the SCU Core device data. 201230557Sjimharris */ 202230557Sjimharristypedef struct SCIC_SDS_REMOTE_DEVICE 203230557Sjimharris{ 204230557Sjimharris /** 205230557Sjimharris * This field is the common base for all remote device objects. 206230557Sjimharris */ 207230557Sjimharris SCI_BASE_REMOTE_DEVICE_T parent; 208230557Sjimharris 209230557Sjimharris /** 210230557Sjimharris * This field is the programmed device port width. This value is written to 211230557Sjimharris * the RCN data structure to tell the SCU how many open connections this 212230557Sjimharris * device can have. 213230557Sjimharris */ 214230557Sjimharris U32 device_port_width; 215230557Sjimharris 216230557Sjimharris /** 217230557Sjimharris * This field is the programmed connection rate for this remote device. It is 218230557Sjimharris * used to program the TC with the maximum allowed connection rate. 219230557Sjimharris */ 220230557Sjimharris SCI_SAS_LINK_RATE connection_rate; 221230557Sjimharris 222230557Sjimharris /** 223230557Sjimharris * This field contains the allowed target protocols for this remote device. 224230557Sjimharris */ 225230557Sjimharris SMP_DISCOVER_RESPONSE_PROTOCOLS_T target_protocols; 226230557Sjimharris 227230557Sjimharris /** 228230557Sjimharris * This field contains the device SAS address. 229230557Sjimharris */ 230230557Sjimharris SCI_SAS_ADDRESS_T device_address; 231230557Sjimharris 232230557Sjimharris /** 233230557Sjimharris * This filed is assinged the value of TRUE if the device is directly attached 234230557Sjimharris * to the port. 235230557Sjimharris */ 236230557Sjimharris BOOL is_direct_attached; 237230557Sjimharris 238230557Sjimharris#if !defined(DISABLE_ATAPI) 239230557Sjimharris /** 240230557Sjimharris * This filed is assinged the value of TRUE if the device is an ATAPI device. 241230557Sjimharris */ 242230557Sjimharris BOOL is_atapi; 243230557Sjimharris#endif 244230557Sjimharris 245230557Sjimharris /** 246230557Sjimharris * This filed contains a pointer back to the port to which this device is 247230557Sjimharris * assigned. 248230557Sjimharris */ 249230557Sjimharris struct SCIC_SDS_PORT *owning_port; 250230557Sjimharris 251230557Sjimharris /** 252230557Sjimharris * This field contains the SCU silicon remote node context specific 253230557Sjimharris * information. 254230557Sjimharris */ 255230557Sjimharris struct SCIC_SDS_REMOTE_NODE_CONTEXT * rnc; 256230557Sjimharris 257230557Sjimharris /** 258230557Sjimharris * This field contains the stated request count for the remote device. The 259230557Sjimharris * device can not reach the SCI_BASE_REMOTE_DEVICE_STATE_STOPPED until all 260230557Sjimharris * requests are complete and the rnc_posted value is FALSE. 261230557Sjimharris */ 262230557Sjimharris U32 started_request_count; 263230557Sjimharris 264230557Sjimharris /** 265230557Sjimharris * This field contains a pointer to the working request object. It is only 266230557Sjimharris * used only for SATA requests since the unsolicited frames we get from the 267230557Sjimharris * hardware have no Tag value to look up the io request object. 268230557Sjimharris */ 269230557Sjimharris struct SCIC_SDS_REQUEST * working_request; 270230557Sjimharris 271230557Sjimharris /** 272230557Sjimharris * This field contains the reason for the remote device going not_ready. It is 273230557Sjimharris * assigned in the state handlers and used in the state transition. 274230557Sjimharris */ 275230557Sjimharris U32 not_ready_reason; 276230557Sjimharris 277230557Sjimharris /** 278230557Sjimharris * This field is TRUE if this remote device has an initialzied ready substate 279230557Sjimharris * machine. SSP devices do not have a ready substate machine and STP devices 280230557Sjimharris * have a ready substate machine. 281230557Sjimharris */ 282230557Sjimharris BOOL has_ready_substate_machine; 283230557Sjimharris 284230557Sjimharris /** 285230557Sjimharris * This field contains the state machine for the ready substate machine for 286230557Sjimharris * this SCIC_SDS_REMOTE_DEVICE object. 287230557Sjimharris */ 288230557Sjimharris SCI_BASE_STATE_MACHINE_T ready_substate_machine; 289230557Sjimharris 290230557Sjimharris /** 291230557Sjimharris * This field maintains the set of state handlers for the remote device 292230557Sjimharris * object. These are changed each time the remote device enters a new state. 293230557Sjimharris */ 294230557Sjimharris struct SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER *state_handlers; 295230557Sjimharris 296230557Sjimharris #ifdef SCI_LOGGING 297230557Sjimharris /** 298230557Sjimharris * This field conatins the ready substate machine logger. The logger will 299230557Sjimharris * emit a message each time the ready substate machine changes state. 300230557Sjimharris */ 301230557Sjimharris SCI_BASE_STATE_MACHINE_LOGGER_T ready_substate_machine_logger; 302230557Sjimharris #endif 303230557Sjimharris 304230557Sjimharris} SCIC_SDS_REMOTE_DEVICE_T; 305230557Sjimharris 306230557Sjimharris 307230557Sjimharristypedef SCI_STATUS (*SCIC_SDS_REMOTE_DEVICE_HANDLER_T)( 308230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device); 309230557Sjimharris 310230557Sjimharristypedef SCI_STATUS (*SCIC_SDS_REMOTE_DEVICE_SUSPEND_HANDLER_T)( 311230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 312230557Sjimharris U32 suspend_type); 313230557Sjimharris 314230557Sjimharristypedef SCI_STATUS (*SCIC_SDS_REMOTE_DEVICE_RESUME_HANDLER_T)( 315230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device); 316230557Sjimharris 317230557Sjimharristypedef SCI_STATUS (*SCIC_SDS_REMOTE_DEVICE_FRAME_HANDLER_T)( 318230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 319230557Sjimharris U32 frame_index); 320230557Sjimharris 321230557Sjimharristypedef SCI_STATUS (*SCIC_SDS_REMOTE_DEVICE_EVENT_HANDLER_T)( 322230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 323230557Sjimharris U32 event_code); 324230557Sjimharris 325230557Sjimharristypedef void (*SCIC_SDS_REMOTE_DEVICE_READY_NOT_READY_HANDLER_T)( 326230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device); 327230557Sjimharris 328230557Sjimharris/** 329230557Sjimharris * @struct SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER 330230557Sjimharris * @brief This structure conains the state handlers that are needed to 331230557Sjimharris * process requests for the SCU remote device objects. 332230557Sjimharris */ 333230557Sjimharristypedef struct SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER 334230557Sjimharris{ 335230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_HANDLER_T parent; 336230557Sjimharris 337230557Sjimharris SCIC_SDS_REMOTE_DEVICE_SUSPEND_HANDLER_T suspend_handler; 338230557Sjimharris SCIC_SDS_REMOTE_DEVICE_RESUME_HANDLER_T resume_handler; 339230557Sjimharris 340230557Sjimharris SCIC_SDS_REMOTE_DEVICE_EVENT_HANDLER_T event_handler; 341230557Sjimharris SCIC_SDS_REMOTE_DEVICE_FRAME_HANDLER_T frame_handler; 342230557Sjimharris 343230557Sjimharris} SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER_T; 344230557Sjimharris 345230557Sjimharris 346230557Sjimharrisextern SCI_BASE_STATE_T scic_sds_remote_device_state_table[]; 347230557Sjimharrisextern SCI_BASE_STATE_T scic_sds_ssp_remote_device_ready_substate_table[]; 348230557Sjimharrisextern SCI_BASE_STATE_T scic_sds_stp_remote_device_ready_substate_table[]; 349230557Sjimharrisextern SCI_BASE_STATE_T scic_sds_smp_remote_device_ready_substate_table[]; 350230557Sjimharris 351230557Sjimharrisextern SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER_T 352230557Sjimharris scic_sds_remote_device_state_handler_table[]; 353230557Sjimharrisextern SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER_T 354230557Sjimharris scic_sds_ssp_remote_device_ready_substate_handler_table[]; 355230557Sjimharrisextern SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER_T 356230557Sjimharris scic_sds_stp_remote_device_ready_substate_handler_table[]; 357230557Sjimharrisextern SCIC_SDS_REMOTE_DEVICE_STATE_HANDLER_T 358230557Sjimharris scic_sds_smp_remote_device_ready_substate_handler_table[]; 359230557Sjimharris 360230557Sjimharris/** 361230557Sjimharris * This macro incrments the request count for this device 362230557Sjimharris */ 363230557Sjimharris#define scic_sds_remote_device_increment_request_count(this_device) \ 364230557Sjimharris ((this_device)->started_request_count++) 365230557Sjimharris 366230557Sjimharris/** 367230557Sjimharris * This macro decrements the request count for this device. This count 368230557Sjimharris * will never decrment past 0. 369230557Sjimharris */ 370230557Sjimharris#define scic_sds_remote_device_decrement_request_count(this_device) \ 371230557Sjimharris ((this_device)->started_request_count > 0 ? \ 372230557Sjimharris (this_device)->started_request_count-- : 0) 373230557Sjimharris 374230557Sjimharris/** 375230557Sjimharris * This is a helper macro to return the current device request count. 376230557Sjimharris */ 377230557Sjimharris#define scic_sds_remote_device_get_request_count(this_device) \ 378230557Sjimharris ((this_device)->started_request_count) 379230557Sjimharris 380230557Sjimharris/** 381230557Sjimharris * This macro returns the owning port of this remote device obejct. 382230557Sjimharris */ 383230557Sjimharris#define scic_sds_remote_device_get_port(this_device) \ 384230557Sjimharris ((this_device)->owning_port) 385230557Sjimharris 386230557Sjimharris/** 387230557Sjimharris * This macro returns the controller object that contains this device 388230557Sjimharris * object 389230557Sjimharris */ 390230557Sjimharris#define scic_sds_remote_device_get_controller(this_device) \ 391230557Sjimharris scic_sds_port_get_controller(scic_sds_remote_device_get_port(this_device)) 392230557Sjimharris 393230557Sjimharris/** 394230557Sjimharris * This macro sets the remote device state handlers pointer and is set on 395230557Sjimharris * entry to each device state. 396230557Sjimharris */ 397230557Sjimharris#define scic_sds_remote_device_set_state_handlers(this_device, handlers) \ 398230557Sjimharris ((this_device)->state_handlers = (handlers)) 399230557Sjimharris 400230557Sjimharris/** 401230557Sjimharris * This macro returns the base sate machine object for the remote device. 402230557Sjimharris */ 403230557Sjimharris#define scic_sds_remote_device_get_base_state_machine(this_device) \ 404230557Sjimharris (&(this_device)->parent.state_machine) 405230557Sjimharris 406230557Sjimharris/** 407230557Sjimharris * This macro returns the remote device ready substate machine 408230557Sjimharris */ 409230557Sjimharris#define scic_sds_remote_device_get_ready_substate_machine(this_device) \ 410230557Sjimharris (&(this_device)->ready_substate_machine) 411230557Sjimharris 412230557Sjimharris/** 413230557Sjimharris * This macro returns the owning port of this device 414230557Sjimharris */ 415230557Sjimharris#define scic_sds_remote_device_get_port(this_device) \ 416230557Sjimharris ((this_device)->owning_port) 417230557Sjimharris 418230557Sjimharris/** 419230557Sjimharris * This macro returns the remote device sequence value 420230557Sjimharris */ 421230557Sjimharris#define scic_sds_remote_device_get_sequence(this_device) \ 422230557Sjimharris ( \ 423230557Sjimharris scic_sds_remote_device_get_controller(this_device)->\ 424230557Sjimharris remote_device_sequence[(this_device)->rnc->remote_node_index] \ 425230557Sjimharris ) 426230557Sjimharris 427230557Sjimharris/** 428230557Sjimharris * This macro returns the controllers protocol engine group 429230557Sjimharris */ 430230557Sjimharris#define scic_sds_remote_device_get_controller_peg(this_device) \ 431230557Sjimharris ( \ 432230557Sjimharris scic_sds_controller_get_protocol_engine_group( \ 433230557Sjimharris scic_sds_port_get_controller( \ 434230557Sjimharris scic_sds_remote_device_get_port(this_device) \ 435230557Sjimharris ) \ 436230557Sjimharris ) \ 437230557Sjimharris ) 438230557Sjimharris 439230557Sjimharris/** 440230557Sjimharris * This macro returns the port index for the devices owning port 441230557Sjimharris */ 442230557Sjimharris#define scic_sds_remote_device_get_port_index(this_device) \ 443230557Sjimharris (scic_sds_port_get_index(scic_sds_remote_device_get_port(this_device))) 444230557Sjimharris 445230557Sjimharris/** 446230557Sjimharris * This macro returns the remote node index for this device object 447230557Sjimharris */ 448230557Sjimharris#define scic_sds_remote_device_get_index(this_device) \ 449230557Sjimharris ((this_device)->rnc->remote_node_index) 450230557Sjimharris 451230557Sjimharris/** 452230557Sjimharris * This macro builds a remote device context for the SCU post request 453230557Sjimharris * operation 454230557Sjimharris */ 455230557Sjimharris#define scic_sds_remote_device_build_command_context(device, command) \ 456230557Sjimharris ( (command) \ 457230557Sjimharris | ((U32)(scic_sds_remote_device_get_controller_peg((device))) << SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT)\ 458230557Sjimharris | ((U32)(scic_sds_remote_device_get_port_index((device))) << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT) \ 459230557Sjimharris | (scic_sds_remote_device_get_index((device))) \ 460230557Sjimharris ) 461230557Sjimharris 462230557Sjimharris/** 463230557Sjimharris * This macro makes the working request assingment for the remote device 464230557Sjimharris * object. To clear the working request use this macro with a NULL request 465230557Sjimharris * object. 466230557Sjimharris */ 467230557Sjimharris#define scic_sds_remote_device_set_working_request(device, request) \ 468230557Sjimharris ((device)->working_request = (request)) 469230557Sjimharris 470230557Sjimharris// --------------------------------------------------------------------------- 471230557Sjimharris 472230557SjimharrisU32 scic_sds_remote_device_get_min_timer_count(void); 473230557Sjimharris 474230557SjimharrisU32 scic_sds_remote_device_get_max_timer_count(void); 475230557Sjimharris 476230557SjimharrisSCI_STATUS scic_sds_remote_device_frame_handler( 477230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 478230557Sjimharris U32 frame_index 479230557Sjimharris); 480230557Sjimharris 481230557SjimharrisSCI_STATUS scic_sds_remote_device_event_handler( 482230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 483230557Sjimharris U32 event_code 484230557Sjimharris); 485230557Sjimharris 486230557SjimharrisSCI_STATUS scic_sds_remote_device_start_io( 487230557Sjimharris struct SCIC_SDS_CONTROLLER *controller, 488230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 489230557Sjimharris struct SCIC_SDS_REQUEST *io_request 490230557Sjimharris); 491230557Sjimharris 492230557SjimharrisSCI_STATUS scic_sds_remote_device_complete_io( 493230557Sjimharris struct SCIC_SDS_CONTROLLER *controller, 494230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 495230557Sjimharris struct SCIC_SDS_REQUEST *io_request 496230557Sjimharris); 497230557Sjimharris 498230557SjimharrisSCI_STATUS scic_sds_remote_device_resume( 499230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 500230557Sjimharris); 501230557Sjimharris 502230557SjimharrisSCI_STATUS scic_sds_remote_device_suspend( 503230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 504230557Sjimharris U32 suspend_type 505230557Sjimharris); 506230557Sjimharris 507230557SjimharrisSCI_STATUS scic_sds_remote_device_start_task( 508230557Sjimharris struct SCIC_SDS_CONTROLLER *controller, 509230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 510230557Sjimharris struct SCIC_SDS_REQUEST *io_request 511230557Sjimharris); 512230557Sjimharris 513230557Sjimharrisvoid scic_sds_remote_device_post_request( 514230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device, 515230557Sjimharris U32 request 516230557Sjimharris); 517230557Sjimharris 518230557Sjimharris#if !defined(DISABLE_ATAPI) 519230557SjimharrisBOOL scic_sds_remote_device_is_atapi( 520230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 521230557Sjimharris); 522230557Sjimharris#else // !defined(DISABLE_ATAPI) 523230557Sjimharris#define scic_sds_remote_device_is_atapi(this_device) FALSE 524230557Sjimharris#endif // !defined(DISABLE_ATAPI) 525230557Sjimharris 526230557Sjimharris// --------------------------------------------------------------------------- 527230557Sjimharris 528230557Sjimharris#ifdef SCI_LOGGING 529230557Sjimharrisvoid scic_sds_remote_device_initialize_state_logging( 530230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 531230557Sjimharris); 532230557Sjimharris 533230557Sjimharrisvoid scic_sds_remote_device_deinitialize_state_logging( 534230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 535230557Sjimharris); 536230557Sjimharris#else // SCI_LOGGING 537230557Sjimharris#define scic_sds_remote_device_initialize_state_logging(x) 538230557Sjimharris#define scic_sds_remote_device_deinitialize_state_logging(x) 539230557Sjimharris#endif // SCI_LOGGING 540230557Sjimharris 541230557Sjimharris// --------------------------------------------------------------------------- 542230557Sjimharris 543230557Sjimharrisvoid scic_sds_remote_device_start_request( 544230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device, 545230557Sjimharris struct SCIC_SDS_REQUEST * the_request, 546230557Sjimharris SCI_STATUS status 547230557Sjimharris); 548230557Sjimharris 549230557Sjimharrisvoid scic_sds_remote_device_continue_request( 550230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device 551230557Sjimharris); 552230557Sjimharris 553230557SjimharrisSCI_STATUS scic_sds_remote_device_default_start_handler( 554230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *this_device 555230557Sjimharris); 556230557Sjimharris 557230557SjimharrisSCI_STATUS scic_sds_remote_device_default_stop_handler( 558230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *this_device 559230557Sjimharris); 560230557Sjimharris 561230557SjimharrisSCI_STATUS scic_sds_remote_device_default_fail_handler( 562230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *this_device 563230557Sjimharris); 564230557Sjimharris 565230557SjimharrisSCI_STATUS scic_sds_remote_device_default_destruct_handler( 566230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *this_device 567230557Sjimharris); 568230557Sjimharris 569230557SjimharrisSCI_STATUS scic_sds_remote_device_default_reset_handler( 570230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 571230557Sjimharris); 572230557Sjimharris 573230557SjimharrisSCI_STATUS scic_sds_remote_device_default_reset_complete_handler( 574230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 575230557Sjimharris); 576230557Sjimharris 577230557SjimharrisSCI_STATUS scic_sds_remote_device_default_start_request_handler( 578230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 579230557Sjimharris SCI_BASE_REQUEST_T *request 580230557Sjimharris); 581230557Sjimharris 582230557SjimharrisSCI_STATUS scic_sds_remote_device_default_complete_request_handler( 583230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 584230557Sjimharris SCI_BASE_REQUEST_T *request 585230557Sjimharris); 586230557Sjimharris 587230557SjimharrisSCI_STATUS scic_sds_remote_device_default_continue_request_handler( 588230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 589230557Sjimharris SCI_BASE_REQUEST_T *request 590230557Sjimharris); 591230557Sjimharris 592230557SjimharrisSCI_STATUS scic_sds_remote_device_default_suspend_handler( 593230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 594230557Sjimharris U32 suspend_type 595230557Sjimharris); 596230557Sjimharris 597230557SjimharrisSCI_STATUS scic_sds_remote_device_default_resume_handler( 598230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 599230557Sjimharris); 600230557Sjimharris 601230557SjimharrisSCI_STATUS scic_sds_remote_device_default_event_handler( 602230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 603230557Sjimharris U32 event_code 604230557Sjimharris); 605230557Sjimharris 606230557SjimharrisSCI_STATUS scic_sds_remote_device_default_frame_handler( 607230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 608230557Sjimharris U32 frame_index 609230557Sjimharris); 610230557Sjimharris 611230557Sjimharris// --------------------------------------------------------------------------- 612230557Sjimharris 613230557SjimharrisSCI_STATUS scic_sds_remote_device_ready_state_stop_handler( 614230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 615230557Sjimharris); 616230557Sjimharris 617230557SjimharrisSCI_STATUS scic_sds_remote_device_ready_state_reset_handler( 618230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 619230557Sjimharris); 620230557Sjimharris 621230557SjimharrisSCI_STATUS scic_sds_remote_device_general_frame_handler( 622230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 623230557Sjimharris U32 frame_index 624230557Sjimharris); 625230557Sjimharris 626230557SjimharrisSCI_STATUS scic_sds_remote_device_general_event_handler( 627230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 628230557Sjimharris U32 event_code 629230557Sjimharris); 630230557Sjimharris 631230557SjimharrisSCI_STATUS scic_sds_ssp_remote_device_ready_suspended_substate_resume_handler( 632230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 633230557Sjimharris); 634230557Sjimharris 635230557Sjimharris// --------------------------------------------------------------------------- 636230557Sjimharris 637230557Sjimharrisvoid scic_sds_remote_device_get_info_from_smp_discover_response( 638230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device, 639230557Sjimharris SMP_RESPONSE_DISCOVER_T * discover_response 640230557Sjimharris); 641230557Sjimharris 642230557Sjimharris#ifdef __cplusplus 643230557Sjimharris} 644230557Sjimharris#endif // __cplusplus 645230557Sjimharris 646230557Sjimharris#endif // _SCIC_SDS_REMOTE_DEVICE_H_ 647