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 53230557Sjimharris#include <sys/cdefs.h> 54230557Sjimharris__FBSDID("$FreeBSD: releng/10.3/sys/dev/isci/scil/scic_sds_remote_device.c 231136 2012-02-07 17:43:58Z jimharris $"); 55230557Sjimharris 56230557Sjimharris/** 57230557Sjimharris * @file 58230557Sjimharris * 59230557Sjimharris * @brief This file contains the implementation of remote device, it's 60230557Sjimharris * methods and state machine. 61230557Sjimharris */ 62230557Sjimharris 63230557Sjimharris#include <dev/isci/scil/intel_sas.h> 64230557Sjimharris#include <dev/isci/scil/sci_util.h> 65230557Sjimharris#include <dev/isci/scil/scic_port.h> 66230557Sjimharris#include <dev/isci/scil/scic_phy.h> 67230557Sjimharris#include <dev/isci/scil/scic_remote_device.h> 68230557Sjimharris#include <dev/isci/scil/scic_sds_port.h> 69230557Sjimharris#include <dev/isci/scil/scic_sds_phy.h> 70230557Sjimharris#include <dev/isci/scil/scic_sds_remote_device.h> 71230557Sjimharris#include <dev/isci/scil/scic_sds_request.h> 72230557Sjimharris#include <dev/isci/scil/scic_sds_controller.h> 73230557Sjimharris#include <dev/isci/scil/scic_sds_logger.h> 74230557Sjimharris#include <dev/isci/scil/scic_user_callback.h> 75230557Sjimharris#include <dev/isci/scil/scic_controller.h> 76230557Sjimharris#include <dev/isci/scil/scic_sds_logger.h> 77230557Sjimharris#include <dev/isci/scil/scic_sds_remote_node_context.h> 78230557Sjimharris#include <dev/isci/scil/scu_event_codes.h> 79230557Sjimharris 80230557Sjimharris#define SCIC_SDS_REMOTE_DEVICE_RESET_TIMEOUT (1000) 81230557Sjimharris 82230557Sjimharris//***************************************************************************** 83230557Sjimharris//* CORE REMOTE DEVICE PUBLIC METHODS 84230557Sjimharris//***************************************************************************** 85230557Sjimharris 86230557SjimharrisU32 scic_remote_device_get_object_size(void) 87230557Sjimharris{ 88230557Sjimharris return sizeof(SCIC_SDS_REMOTE_DEVICE_T) 89230557Sjimharris + sizeof(SCIC_SDS_REMOTE_NODE_CONTEXT_T); 90230557Sjimharris} 91230557Sjimharris 92230557Sjimharris// --------------------------------------------------------------------------- 93230557Sjimharris 94230557Sjimharrisvoid scic_remote_device_construct( 95230557Sjimharris SCI_PORT_HANDLE_T port, 96230557Sjimharris void * remote_device_memory, 97230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T * new_remote_device_handle 98230557Sjimharris) 99230557Sjimharris{ 100230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T*) 101230557Sjimharris remote_device_memory; 102230557Sjimharris SCIC_SDS_PORT_T *the_port = (SCIC_SDS_PORT_T*) port; 103230557Sjimharris 104230557Sjimharris SCIC_LOG_TRACE(( 105230557Sjimharris sci_base_object_get_logger(the_port), 106230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 107230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 108230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 109230557Sjimharris "scic_remote_device_construct(0x%x, 0x%x, 0x%x) enter\n", 110230557Sjimharris port, remote_device_memory, new_remote_device_handle 111230557Sjimharris )); 112230557Sjimharris 113230557Sjimharris memset(remote_device_memory, 0, sizeof(SCIC_SDS_REMOTE_DEVICE_T)); 114230557Sjimharris 115230557Sjimharris *new_remote_device_handle = this_device; 116230557Sjimharris this_device->owning_port = the_port; 117230557Sjimharris this_device->started_request_count = 0; 118230557Sjimharris this_device->rnc = (SCIC_SDS_REMOTE_NODE_CONTEXT_T *) 119230557Sjimharris ((char *)this_device + sizeof(SCIC_SDS_REMOTE_DEVICE_T)); 120230557Sjimharris 121230557Sjimharris sci_base_remote_device_construct( 122230557Sjimharris &this_device->parent, 123230557Sjimharris sci_base_object_get_logger(the_port), 124230557Sjimharris scic_sds_remote_device_state_table 125230557Sjimharris ); 126230557Sjimharris 127230557Sjimharris scic_sds_remote_node_context_construct( 128230557Sjimharris this_device, 129230557Sjimharris this_device->rnc, 130230557Sjimharris SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX 131230557Sjimharris ); 132230557Sjimharris 133230557Sjimharris sci_object_set_association(this_device->rnc, this_device); 134230557Sjimharris 135230557Sjimharris scic_sds_remote_device_initialize_state_logging(this_device); 136230557Sjimharris} 137230557Sjimharris 138230557Sjimharris// --------------------------------------------------------------------------- 139230557Sjimharris 140230557SjimharrisSCI_STATUS scic_remote_device_da_construct( 141230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device 142230557Sjimharris) 143230557Sjimharris{ 144230557Sjimharris SCI_STATUS status; 145230557Sjimharris U16 remote_node_index; 146230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T*) 147230557Sjimharris remote_device; 148230557Sjimharris SCI_SAS_IDENTIFY_ADDRESS_FRAME_PROTOCOLS_T protocols; 149230557Sjimharris SCIC_PORT_PROPERTIES_T properties; 150230557Sjimharris 151230557Sjimharris SCIC_LOG_TRACE(( 152230557Sjimharris sci_base_object_get_logger(this_device->owning_port), 153230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 154230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 155230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 156230557Sjimharris "scic_remote_device_da_construct(0x%x) enter\n", 157230557Sjimharris remote_device 158230557Sjimharris )); 159230557Sjimharris 160230557Sjimharris // This information is request to determine how many remote node context 161230557Sjimharris // entries will be needed to store the remote node. 162230557Sjimharris scic_sds_port_get_attached_protocols(this_device->owning_port,&protocols); 163230557Sjimharris this_device->target_protocols.u.all = protocols.u.all; 164230557Sjimharris this_device->is_direct_attached = TRUE; 165230557Sjimharris#if !defined(DISABLE_ATAPI) 166230557Sjimharris this_device->is_atapi = scic_sds_remote_device_is_atapi(this_device); 167230557Sjimharris#endif 168230557Sjimharris 169230557Sjimharris scic_port_get_properties(this_device->owning_port, &properties); 170230557Sjimharris //Get accurate port width from port's phy mask for a DA device. 171230557Sjimharris SCI_GET_BITS_SET_COUNT(properties.phy_mask, this_device->device_port_width); 172230557Sjimharris 173230557Sjimharris status = scic_sds_controller_allocate_remote_node_context( 174230557Sjimharris this_device->owning_port->owning_controller, 175230557Sjimharris this_device, 176230557Sjimharris &remote_node_index 177230557Sjimharris ); 178230557Sjimharris 179230557Sjimharris if (status == SCI_SUCCESS) 180230557Sjimharris { 181230557Sjimharris scic_sds_remote_node_context_set_remote_node_index( 182230557Sjimharris this_device->rnc, remote_node_index 183230557Sjimharris ); 184230557Sjimharris 185230557Sjimharris scic_sds_port_get_attached_sas_address( 186230557Sjimharris this_device->owning_port, &this_device->device_address 187230557Sjimharris ); 188230557Sjimharris 189230557Sjimharris if (this_device->target_protocols.u.bits.attached_ssp_target) 190230557Sjimharris { 191230557Sjimharris this_device->has_ready_substate_machine = FALSE; 192230557Sjimharris } 193230557Sjimharris else if (this_device->target_protocols.u.bits.attached_stp_target) 194230557Sjimharris { 195230557Sjimharris this_device->has_ready_substate_machine = TRUE; 196230557Sjimharris 197230557Sjimharris sci_base_state_machine_construct( 198230557Sjimharris &this_device->ready_substate_machine, 199230557Sjimharris &this_device->parent.parent, 200230557Sjimharris scic_sds_stp_remote_device_ready_substate_table, 201230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE 202230557Sjimharris ); 203230557Sjimharris } 204230557Sjimharris else if (this_device->target_protocols.u.bits.attached_smp_target) 205230557Sjimharris { 206230557Sjimharris this_device->has_ready_substate_machine = TRUE; 207230557Sjimharris 208230557Sjimharris //add the SMP ready substate machine construction here 209230557Sjimharris sci_base_state_machine_construct( 210230557Sjimharris &this_device->ready_substate_machine, 211230557Sjimharris &this_device->parent.parent, 212230557Sjimharris scic_sds_smp_remote_device_ready_substate_table, 213230557Sjimharris SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE 214230557Sjimharris ); 215230557Sjimharris } 216230557Sjimharris 217230557Sjimharris this_device->connection_rate = scic_sds_port_get_max_allowed_speed( 218230557Sjimharris this_device->owning_port 219230557Sjimharris ); 220230557Sjimharris 221230557Sjimharris /// @todo Should I assign the port width by reading all of the phys on the port? 222230557Sjimharris this_device->device_port_width = 1; 223230557Sjimharris } 224230557Sjimharris 225230557Sjimharris return status; 226230557Sjimharris} 227230557Sjimharris 228230557Sjimharris 229230557Sjimharris// --------------------------------------------------------------------------- 230230557Sjimharris 231230557Sjimharrisvoid scic_sds_remote_device_get_info_from_smp_discover_response( 232230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device, 233230557Sjimharris SMP_RESPONSE_DISCOVER_T * discover_response 234230557Sjimharris) 235230557Sjimharris{ 236230557Sjimharris // decode discover_response to set sas_address to this_device. 237230557Sjimharris this_device->device_address.high = 238230557Sjimharris discover_response->attached_sas_address.high; 239230557Sjimharris 240230557Sjimharris this_device->device_address.low = 241230557Sjimharris discover_response->attached_sas_address.low; 242230557Sjimharris 243230557Sjimharris this_device->target_protocols.u.all = discover_response->protocols.u.all; 244230557Sjimharris} 245230557Sjimharris 246230557Sjimharris 247230557Sjimharris// --------------------------------------------------------------------------- 248230557Sjimharris 249230557SjimharrisSCI_STATUS scic_remote_device_ea_construct( 250230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 251230557Sjimharris SMP_RESPONSE_DISCOVER_T * discover_response 252230557Sjimharris) 253230557Sjimharris{ 254230557Sjimharris SCI_STATUS status; 255230557Sjimharris 256230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 257230557Sjimharris SCIC_SDS_CONTROLLER_T *the_controller; 258230557Sjimharris 259230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 260230557Sjimharris 261230557Sjimharris SCIC_LOG_TRACE(( 262230557Sjimharris sci_base_object_get_logger(this_device->owning_port), 263230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 264230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 265230557Sjimharris "scic_remote_device_ea_sas_construct0x%x, 0x%x) enter\n", 266230557Sjimharris remote_device, discover_response 267230557Sjimharris )); 268230557Sjimharris 269230557Sjimharris the_controller = scic_sds_port_get_controller(this_device->owning_port); 270230557Sjimharris 271230557Sjimharris scic_sds_remote_device_get_info_from_smp_discover_response( 272230557Sjimharris this_device, discover_response 273230557Sjimharris ); 274230557Sjimharris 275230557Sjimharris status = scic_sds_controller_allocate_remote_node_context( 276230557Sjimharris the_controller, 277230557Sjimharris this_device, 278230557Sjimharris &this_device->rnc->remote_node_index 279230557Sjimharris ); 280230557Sjimharris 281230557Sjimharris if (status == SCI_SUCCESS) 282230557Sjimharris { 283230557Sjimharris if (this_device->target_protocols.u.bits.attached_ssp_target) 284230557Sjimharris { 285230557Sjimharris this_device->has_ready_substate_machine = FALSE; 286230557Sjimharris } 287230557Sjimharris else if (this_device->target_protocols.u.bits.attached_smp_target) 288230557Sjimharris { 289230557Sjimharris this_device->has_ready_substate_machine = TRUE; 290230557Sjimharris 291230557Sjimharris //add the SMP ready substate machine construction here 292230557Sjimharris sci_base_state_machine_construct( 293230557Sjimharris &this_device->ready_substate_machine, 294230557Sjimharris &this_device->parent.parent, 295230557Sjimharris scic_sds_smp_remote_device_ready_substate_table, 296230557Sjimharris SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_IDLE 297230557Sjimharris ); 298230557Sjimharris } 299230557Sjimharris else if (this_device->target_protocols.u.bits.attached_stp_target) 300230557Sjimharris { 301230557Sjimharris this_device->has_ready_substate_machine = TRUE; 302230557Sjimharris 303230557Sjimharris sci_base_state_machine_construct( 304230557Sjimharris &this_device->ready_substate_machine, 305230557Sjimharris &this_device->parent.parent, 306230557Sjimharris scic_sds_stp_remote_device_ready_substate_table, 307230557Sjimharris SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_IDLE 308230557Sjimharris ); 309230557Sjimharris } 310230557Sjimharris 311230557Sjimharris // For SAS-2 the physical link rate is actually a logical link 312230557Sjimharris // rate that incorporates multiplexing. The SCU doesn't 313230557Sjimharris // incorporate multiplexing and for the purposes of the 314230557Sjimharris // connection the logical link rate is that same as the 315230557Sjimharris // physical. Furthermore, the SAS-2 and SAS-1.1 fields overlay 316230557Sjimharris // one another, so this code works for both situations. 317230557Sjimharris this_device->connection_rate = MIN( 318230557Sjimharris scic_sds_port_get_max_allowed_speed( this_device->owning_port), 319230557Sjimharris discover_response->u2.sas1_1.negotiated_physical_link_rate 320230557Sjimharris ); 321230557Sjimharris 322230557Sjimharris /// @todo Should I assign the port width by reading all of the phys on the port? 323230557Sjimharris this_device->device_port_width = 1; 324230557Sjimharris } 325230557Sjimharris 326230557Sjimharris return status; 327230557Sjimharris} 328230557Sjimharris 329230557Sjimharris// --------------------------------------------------------------------------- 330230557Sjimharris 331230557SjimharrisSCI_STATUS scic_remote_device_destruct( 332230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device 333230557Sjimharris) 334230557Sjimharris{ 335230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 336230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 337230557Sjimharris 338230557Sjimharris SCIC_LOG_TRACE(( 339230557Sjimharris sci_base_object_get_logger(this_device), 340230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 341230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 342230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 343230557Sjimharris "scic_remote_device_destruct(0x%x) enter\n", 344230557Sjimharris remote_device 345230557Sjimharris )); 346230557Sjimharris 347230557Sjimharris return this_device->state_handlers->parent.destruct_handler(&this_device->parent); 348230557Sjimharris} 349230557Sjimharris 350230557Sjimharris// --------------------------------------------------------------------------- 351230557Sjimharris 352230557Sjimharris#if !defined(DISABLE_WIDE_PORTED_TARGETS) 353230557Sjimharris 354230557SjimharrisSCI_STATUS scic_remote_device_set_port_width( 355230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 356230557Sjimharris U8 new_port_width 357230557Sjimharris) 358230557Sjimharris{ 359230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 360230557Sjimharris 361230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 362230557Sjimharris 363230557Sjimharris SCIC_LOG_TRACE(( 364230557Sjimharris sci_base_object_get_logger(this_device), 365230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 366230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 367230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 368230557Sjimharris "scic_remote_device_set_port_width(0x%x, 0x%x) enter\n", 369230557Sjimharris remote_device, new_port_width 370230557Sjimharris )); 371230557Sjimharris 372230557Sjimharris if(new_port_width != 0) 373230557Sjimharris { 374230557Sjimharris this_device->device_port_width = new_port_width; 375230557Sjimharris 376230557Sjimharris return SCI_SUCCESS; 377230557Sjimharris } 378230557Sjimharris else 379230557Sjimharris return SCI_FAILURE; 380230557Sjimharris} 381230557Sjimharris 382230557Sjimharris// --------------------------------------------------------------------------- 383230557Sjimharris 384230557SjimharrisU8 scic_remote_device_get_port_width( 385230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device 386230557Sjimharris) 387230557Sjimharris{ 388230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 389230557Sjimharris 390230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 391230557Sjimharris 392230557Sjimharris SCIC_LOG_TRACE(( 393230557Sjimharris sci_base_object_get_logger(this_device), 394230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 395230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 396230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 397230557Sjimharris "scic_remote_device_get_port_width(0x%x) enter\n", 398230557Sjimharris remote_device 399230557Sjimharris )); 400230557Sjimharris 401230557Sjimharris return (U8)this_device->device_port_width; 402230557Sjimharris} 403230557Sjimharris 404230557Sjimharris#endif // !defined(DISABLE_WIDE_PORTED_TARGETS) 405230557Sjimharris 406230557Sjimharris// --------------------------------------------------------------------------- 407230557Sjimharris 408230557SjimharrisSCI_STATUS scic_remote_device_start( 409230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 410230557Sjimharris U32 timeout 411230557Sjimharris) 412230557Sjimharris{ 413230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 414230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 415230557Sjimharris 416230557Sjimharris SCIC_LOG_TRACE(( 417230557Sjimharris sci_base_object_get_logger(this_device), 418230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 419230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 420230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 421230557Sjimharris "scic_remote_device_start(0x%x, 0x%x) enter\n", 422230557Sjimharris remote_device, timeout 423230557Sjimharris )); 424230557Sjimharris 425230557Sjimharris return this_device->state_handlers->parent.start_handler(&this_device->parent); 426230557Sjimharris} 427230557Sjimharris 428230557Sjimharris// --------------------------------------------------------------------------- 429230557Sjimharris 430230557SjimharrisSCI_STATUS scic_remote_device_stop( 431230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 432230557Sjimharris U32 timeout 433230557Sjimharris) 434230557Sjimharris{ 435230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 436230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 437230557Sjimharris 438230557Sjimharris SCIC_LOG_TRACE(( 439230557Sjimharris sci_base_object_get_logger(this_device), 440230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 441230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 442230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 443230557Sjimharris "scic_remote_device_stop(0x%x, 0x%x) enter\n", 444230557Sjimharris remote_device, timeout 445230557Sjimharris )); 446230557Sjimharris 447230557Sjimharris return this_device->state_handlers->parent.stop_handler(&this_device->parent); 448230557Sjimharris} 449230557Sjimharris 450230557Sjimharris/** 451230557Sjimharris * This method invokes the remote device reset handler. 452230557Sjimharris * 453230557Sjimharris * @param[in] this_device The remote device for which the reset is being 454230557Sjimharris * requested. 455230557Sjimharris * 456230557Sjimharris * @return SCI_STATUS 457230557Sjimharris */ 458230557SjimharrisSCI_STATUS scic_remote_device_reset( 459230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device 460230557Sjimharris) 461230557Sjimharris{ 462230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 463230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 464230557Sjimharris 465230557Sjimharris SCIC_LOG_TRACE(( 466230557Sjimharris sci_base_object_get_logger(this_device), 467230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 468230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 469230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 470230557Sjimharris "scic_remote_device_reset(0x%x) enter\n", 471230557Sjimharris remote_device 472230557Sjimharris )); 473230557Sjimharris 474230557Sjimharris return this_device->state_handlers->parent.reset_handler(&this_device->parent); 475230557Sjimharris} 476230557Sjimharris 477230557Sjimharris/** 478230557Sjimharris * This method invokes the remote device reset handler. 479230557Sjimharris * 480230557Sjimharris * @param[in] this_device The remote device for which the reset is being 481230557Sjimharris * requested. 482230557Sjimharris * 483230557Sjimharris * @return SCI_STATUS 484230557Sjimharris */ 485230557SjimharrisSCI_STATUS scic_remote_device_reset_complete( 486230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device 487230557Sjimharris) 488230557Sjimharris{ 489230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 490230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 491230557Sjimharris 492230557Sjimharris SCIC_LOG_TRACE(( 493230557Sjimharris sci_base_object_get_logger(this_device), 494230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 495230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 496230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 497230557Sjimharris "scic_remote_device_reset_complete(0x%x) enter\n", 498230557Sjimharris remote_device 499230557Sjimharris )); 500230557Sjimharris 501230557Sjimharris return this_device->state_handlers->parent.reset_complete_handler(&this_device->parent); 502230557Sjimharris} 503230557Sjimharris 504230557Sjimharris/** 505230557Sjimharris * This method invokes the remote device reset handler. 506230557Sjimharris * 507230557Sjimharris * @param[in] this_device The remote device for which the reset is being 508230557Sjimharris * requested. 509230557Sjimharris * 510230557Sjimharris * @return SCI_STATUS 511230557Sjimharris */ 512230557SjimharrisU32 scic_remote_device_get_suggested_reset_timeout( 513230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device 514230557Sjimharris) 515230557Sjimharris{ 516230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 517230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 518230557Sjimharris 519230557Sjimharris SCIC_LOG_TRACE(( 520230557Sjimharris sci_base_object_get_logger(this_device), 521230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 522230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 523230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 524230557Sjimharris "scic_remote_device_get_suggested_reset_timeout(0x%x) enter\n", 525230557Sjimharris remote_device 526230557Sjimharris )); 527230557Sjimharris 528230557Sjimharris if (this_device->target_protocols.u.bits.attached_stp_target) 529230557Sjimharris { 530230557Sjimharris return SCIC_SDS_SIGNATURE_FIS_TIMEOUT; 531230557Sjimharris } 532230557Sjimharris 533230557Sjimharris return SCIC_SDS_REMOTE_DEVICE_RESET_TIMEOUT; 534230557Sjimharris} 535230557Sjimharris 536230557Sjimharris// --------------------------------------------------------------------------- 537230557Sjimharris 538230557SjimharrisSCI_STATUS scic_remote_device_set_max_connection_rate( 539230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 540230557Sjimharris SCI_SAS_LINK_RATE connection_rate 541230557Sjimharris) 542230557Sjimharris{ 543230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 544230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 545230557Sjimharris 546230557Sjimharris SCIC_LOG_TRACE(( 547230557Sjimharris sci_base_object_get_logger(this_device), 548230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 549230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 550230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 551230557Sjimharris "scic_remote_device_set_max_connection_rate(0x%x, 0x%x) enter\n", 552230557Sjimharris remote_device, connection_rate 553230557Sjimharris )); 554230557Sjimharris 555230557Sjimharris this_device->connection_rate = connection_rate; 556230557Sjimharris 557230557Sjimharris return SCI_SUCCESS; 558230557Sjimharris} 559230557Sjimharris 560230557Sjimharris// --------------------------------------------------------------------------- 561230557Sjimharris 562230557SjimharrisSCI_SAS_LINK_RATE scic_remote_device_get_connection_rate( 563230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device 564230557Sjimharris) 565230557Sjimharris{ 566230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 567230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 568230557Sjimharris 569230557Sjimharris SCIC_LOG_TRACE(( 570230557Sjimharris sci_base_object_get_logger(this_device), 571230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 572230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 573230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 574230557Sjimharris "scic_remote_device_get_connection_rate(0x%x) enter\n", 575230557Sjimharris remote_device 576230557Sjimharris )); 577230557Sjimharris 578230557Sjimharris return this_device->connection_rate; 579230557Sjimharris} 580230557Sjimharris 581230557Sjimharris// --------------------------------------------------------------------------- 582230557Sjimharris 583230557Sjimharrisvoid scic_remote_device_get_protocols( 584230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 585230557Sjimharris SMP_DISCOVER_RESPONSE_PROTOCOLS_T * protocols 586230557Sjimharris) 587230557Sjimharris{ 588230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *) 589230557Sjimharris remote_device; 590230557Sjimharris 591230557Sjimharris SCIC_LOG_TRACE(( 592230557Sjimharris sci_base_object_get_logger(this_device), 593230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 594230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 595230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 596230557Sjimharris "scic_remote_device_get_protocols(0x%x) enter\n", 597230557Sjimharris remote_device 598230557Sjimharris )); 599230557Sjimharris 600230557Sjimharris protocols->u.all = this_device->target_protocols.u.all; 601230557Sjimharris} 602230557Sjimharris 603230557Sjimharris// --------------------------------------------------------------------------- 604230557Sjimharris 605230557Sjimharrisvoid scic_remote_device_get_sas_address( 606230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 607230557Sjimharris SCI_SAS_ADDRESS_T * sas_address 608230557Sjimharris) 609230557Sjimharris{ 610230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device; 611230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)remote_device; 612230557Sjimharris 613230557Sjimharris SCIC_LOG_TRACE(( 614230557Sjimharris sci_base_object_get_logger(this_device), 615230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 616230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET | 617230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET, 618230557Sjimharris "scic_remote_device_get_sas_address(0x%x, 0x%x) enter\n", 619230557Sjimharris remote_device, sas_address 620230557Sjimharris )); 621230557Sjimharris 622230557Sjimharris sas_address->low = this_device->device_address.low; 623230557Sjimharris sas_address->high = this_device->device_address.high; 624230557Sjimharris} 625230557Sjimharris 626230557Sjimharris// --------------------------------------------------------------------------- 627230557Sjimharris#if !defined(DISABLE_ATAPI) 628230557SjimharrisBOOL scic_remote_device_is_atapi( 629230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T device_handle 630230557Sjimharris) 631230557Sjimharris{ 632230557Sjimharris return ((SCIC_SDS_REMOTE_DEVICE_T *)device_handle)->is_atapi; 633230557Sjimharris} 634230557Sjimharris#endif 635230557Sjimharris 636230557Sjimharris 637230557Sjimharris//***************************************************************************** 638230557Sjimharris//* SCU DRIVER STANDARD (SDS) REMOTE DEVICE IMPLEMENTATIONS 639230557Sjimharris//***************************************************************************** 640230557Sjimharris 641230557Sjimharris/** 642230557Sjimharris * Remote device timer requirements 643230557Sjimharris */ 644230557Sjimharris#define SCIC_SDS_REMOTE_DEVICE_MINIMUM_TIMER_COUNT (0) 645230557Sjimharris#define SCIC_SDS_REMOTE_DEVICE_MAXIMUM_TIMER_COUNT (SCI_MAX_REMOTE_DEVICES) 646230557Sjimharris 647230557Sjimharris/** 648230557Sjimharris * @brief This method returns the minimum number of timers required for all 649230557Sjimharris * remote devices. 650230557Sjimharris * 651230557Sjimharris * @return U32 652230557Sjimharris */ 653230557SjimharrisU32 scic_sds_remote_device_get_min_timer_count(void) 654230557Sjimharris{ 655230557Sjimharris return SCIC_SDS_REMOTE_DEVICE_MINIMUM_TIMER_COUNT; 656230557Sjimharris} 657230557Sjimharris 658230557Sjimharris/** 659230557Sjimharris * @brief This method returns the maximum number of timers requried for all 660230557Sjimharris * remote devices. 661230557Sjimharris * 662230557Sjimharris * @return U32 663230557Sjimharris */ 664230557SjimharrisU32 scic_sds_remote_device_get_max_timer_count(void) 665230557Sjimharris{ 666230557Sjimharris return SCIC_SDS_REMOTE_DEVICE_MAXIMUM_TIMER_COUNT; 667230557Sjimharris} 668230557Sjimharris 669230557Sjimharris// --------------------------------------------------------------------------- 670230557Sjimharris 671230557Sjimharris#ifdef SCI_LOGGING 672230557Sjimharris/** 673230557Sjimharris * This method will enable and turn on state transition logging for the remote 674230557Sjimharris * device object. 675230557Sjimharris * 676230557Sjimharris * @param[in] this_device The device for which state transition logging is to 677230557Sjimharris * be enabled. 678230557Sjimharris * 679230557Sjimharris * @return Nothing 680230557Sjimharris */ 681230557Sjimharrisvoid scic_sds_remote_device_initialize_state_logging( 682230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 683230557Sjimharris) 684230557Sjimharris{ 685230557Sjimharris sci_base_state_machine_logger_initialize( 686230557Sjimharris &this_device->parent.state_machine_logger, 687230557Sjimharris &this_device->parent.state_machine, 688230557Sjimharris &this_device->parent.parent, 689230557Sjimharris scic_cb_logger_log_states, 690230557Sjimharris "SCIC_SDS_REMOTE_DEVICE_T", "base state machine", 691230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 692230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 693230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET 694230557Sjimharris ); 695230557Sjimharris 696230557Sjimharris if (this_device->has_ready_substate_machine) 697230557Sjimharris { 698230557Sjimharris sci_base_state_machine_logger_initialize( 699230557Sjimharris &this_device->ready_substate_machine_logger, 700230557Sjimharris &this_device->ready_substate_machine, 701230557Sjimharris &this_device->parent.parent, 702230557Sjimharris scic_cb_logger_log_states, 703230557Sjimharris "SCIC_SDS_REMOTE_DEVICE_T", "ready substate machine", 704230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 705230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 706230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET 707230557Sjimharris ); 708230557Sjimharris } 709230557Sjimharris} 710230557Sjimharris 711230557Sjimharris/** 712230557Sjimharris * This method will stop the state machine logging for this object and should 713230557Sjimharris * be called before the object is destroyed. 714230557Sjimharris * 715230557Sjimharris * @param[in] this_device The device on which to stop logging state 716230557Sjimharris * transitions. 717230557Sjimharris * 718230557Sjimharris * @return Nothing 719230557Sjimharris */ 720230557Sjimharrisvoid scic_sds_remote_device_deinitialize_state_logging( 721230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 722230557Sjimharris) 723230557Sjimharris{ 724230557Sjimharris sci_base_state_machine_logger_deinitialize( 725230557Sjimharris &this_device->parent.state_machine_logger, 726230557Sjimharris &this_device->parent.state_machine 727230557Sjimharris ); 728230557Sjimharris 729230557Sjimharris if (this_device->has_ready_substate_machine) 730230557Sjimharris { 731230557Sjimharris sci_base_state_machine_logger_deinitialize( 732230557Sjimharris &this_device->ready_substate_machine_logger, 733230557Sjimharris &this_device->ready_substate_machine 734230557Sjimharris ); 735230557Sjimharris } 736230557Sjimharris} 737230557Sjimharris#endif 738230557Sjimharris 739230557Sjimharris/** 740230557Sjimharris * This method invokes the remote device suspend state handler. 741230557Sjimharris * 742230557Sjimharris * @param[in] this_device The remote device for which the suspend is being 743230557Sjimharris * requested. 744230557Sjimharris * 745230557Sjimharris * @return SCI_STATUS 746230557Sjimharris */ 747230557SjimharrisSCI_STATUS scic_sds_remote_device_suspend( 748230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 749230557Sjimharris U32 suspend_type 750230557Sjimharris) 751230557Sjimharris{ 752230557Sjimharris return this_device->state_handlers->suspend_handler(this_device, suspend_type); 753230557Sjimharris} 754230557Sjimharris 755230557Sjimharris/** 756230557Sjimharris * This method invokes the remote device resume state handler. 757230557Sjimharris * 758230557Sjimharris * @param[in] this_device The remote device for which the resume is being 759230557Sjimharris * requested. 760230557Sjimharris * 761230557Sjimharris * @return SCI_STATUS 762230557Sjimharris */ 763230557SjimharrisSCI_STATUS scic_sds_remote_device_resume( 764230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 765230557Sjimharris) 766230557Sjimharris{ 767230557Sjimharris return this_device->state_handlers->resume_handler(this_device); 768230557Sjimharris} 769230557Sjimharris 770230557Sjimharris/** 771230557Sjimharris * This method invokes the frame handler for the remote device state machine 772230557Sjimharris * 773230557Sjimharris * @param[in] this_device The remote device for which the event handling is 774230557Sjimharris * being requested. 775230557Sjimharris * @param[in] frame_index This is the frame index that is being processed. 776230557Sjimharris * 777230557Sjimharris * @return SCI_STATUS 778230557Sjimharris */ 779230557SjimharrisSCI_STATUS scic_sds_remote_device_frame_handler( 780230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 781230557Sjimharris U32 frame_index 782230557Sjimharris) 783230557Sjimharris{ 784230557Sjimharris return this_device->state_handlers->frame_handler(this_device, frame_index); 785230557Sjimharris} 786230557Sjimharris 787230557Sjimharris/** 788230557Sjimharris * This method invokes the remote device event handler. 789230557Sjimharris * 790230557Sjimharris * @param[in] this_device The remote device for which the event handling is 791230557Sjimharris * being requested. 792230557Sjimharris * @param[in] event_code This is the event code that is to be processed. 793230557Sjimharris * 794230557Sjimharris * @return SCI_STATUS 795230557Sjimharris */ 796230557SjimharrisSCI_STATUS scic_sds_remote_device_event_handler( 797230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 798230557Sjimharris U32 event_code 799230557Sjimharris) 800230557Sjimharris{ 801230557Sjimharris return this_device->state_handlers->event_handler(this_device, event_code); 802230557Sjimharris} 803230557Sjimharris 804230557Sjimharris/** 805230557Sjimharris * This method invokes the remote device start io handler. 806230557Sjimharris * 807230557Sjimharris * @param[in] controller The controller that is starting the io request. 808230557Sjimharris * @param[in] this_device The remote device for which the start io handling is 809230557Sjimharris * being requested. 810230557Sjimharris * @param[in] io_request The io request that is being started. 811230557Sjimharris * 812230557Sjimharris * @return SCI_STATUS 813230557Sjimharris */ 814230557SjimharrisSCI_STATUS scic_sds_remote_device_start_io( 815230557Sjimharris SCIC_SDS_CONTROLLER_T *controller, 816230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 817230557Sjimharris SCIC_SDS_REQUEST_T *io_request 818230557Sjimharris) 819230557Sjimharris{ 820230557Sjimharris return this_device->state_handlers->parent.start_io_handler( 821230557Sjimharris &this_device->parent, &io_request->parent); 822230557Sjimharris} 823230557Sjimharris 824230557Sjimharris/** 825230557Sjimharris * This method invokes the remote device complete io handler. 826230557Sjimharris * 827230557Sjimharris * @param[in] controller The controller that is completing the io request. 828230557Sjimharris * @param[in] this_device The remote device for which the complete io handling 829230557Sjimharris * is being requested. 830230557Sjimharris * @param[in] io_request The io request that is being completed. 831230557Sjimharris * 832230557Sjimharris * @return SCI_STATUS 833230557Sjimharris */ 834230557SjimharrisSCI_STATUS scic_sds_remote_device_complete_io( 835230557Sjimharris SCIC_SDS_CONTROLLER_T *controller, 836230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 837230557Sjimharris SCIC_SDS_REQUEST_T *io_request 838230557Sjimharris) 839230557Sjimharris{ 840230557Sjimharris return this_device->state_handlers->parent.complete_io_handler( 841230557Sjimharris &this_device->parent, &io_request->parent); 842230557Sjimharris} 843230557Sjimharris 844230557Sjimharris/** 845230557Sjimharris * This method invokes the remote device start task handler. 846230557Sjimharris * 847230557Sjimharris * @param[in] controller The controller that is starting the task request. 848230557Sjimharris * @param[in] this_device The remote device for which the start task handling 849230557Sjimharris * is being requested. 850230557Sjimharris * @param[in] io_request The task request that is being started. 851230557Sjimharris * 852230557Sjimharris * @return SCI_STATUS 853230557Sjimharris */ 854230557SjimharrisSCI_STATUS scic_sds_remote_device_start_task( 855230557Sjimharris SCIC_SDS_CONTROLLER_T *controller, 856230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 857230557Sjimharris SCIC_SDS_REQUEST_T *io_request 858230557Sjimharris) 859230557Sjimharris{ 860230557Sjimharris return this_device->state_handlers->parent.start_task_handler( 861230557Sjimharris &this_device->parent, &io_request->parent); 862230557Sjimharris} 863230557Sjimharris 864230557Sjimharris/** 865230557Sjimharris * This method takes the request and bulids an appropriate SCU context for the 866230557Sjimharris * request and then requests the controller to post the request. 867230557Sjimharris * 868230557Sjimharris * @param[in] this_device 869230557Sjimharris * @param[in] request 870230557Sjimharris * 871230557Sjimharris * @return none 872230557Sjimharris */ 873230557Sjimharrisvoid scic_sds_remote_device_post_request( 874230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device, 875230557Sjimharris U32 request 876230557Sjimharris) 877230557Sjimharris{ 878230557Sjimharris U32 context; 879230557Sjimharris 880230557Sjimharris context = scic_sds_remote_device_build_command_context(this_device, request); 881230557Sjimharris 882230557Sjimharris scic_sds_controller_post_request( 883230557Sjimharris scic_sds_remote_device_get_controller(this_device), 884230557Sjimharris context 885230557Sjimharris ); 886230557Sjimharris} 887230557Sjimharris 888230557Sjimharris#if !defined(DISABLE_ATAPI) 889230557Sjimharris/** 890230557Sjimharris * This method check the signature fis of a stp device to decide whether 891230557Sjimharris * a device is atapi or not. 892230557Sjimharris * 893230557Sjimharris * @param[in] this_device The device to be checked. 894230557Sjimharris * 895230557Sjimharris * @return TRUE if a device is atapi device. False if a device is not atapi. 896230557Sjimharris */ 897230557SjimharrisBOOL scic_sds_remote_device_is_atapi( 898230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device 899230557Sjimharris) 900230557Sjimharris{ 901230557Sjimharris if (!this_device->target_protocols.u.bits.attached_stp_target) 902230557Sjimharris return FALSE; 903230557Sjimharris else if (this_device->is_direct_attached) 904230557Sjimharris { 905230557Sjimharris SCIC_SDS_PHY_T * phy; 906230557Sjimharris SCIC_SATA_PHY_PROPERTIES_T properties; 907230557Sjimharris SATA_FIS_REG_D2H_T * signature_fis; 908230557Sjimharris phy = scic_sds_port_get_a_connected_phy(this_device->owning_port); 909230557Sjimharris scic_sata_phy_get_properties(phy, &properties); 910230557Sjimharris 911230557Sjimharris //decode the signature fis. 912230557Sjimharris signature_fis = &(properties.signature_fis); 913230557Sjimharris 914230557Sjimharris if ( (signature_fis->sector_count == 0x01) 915230557Sjimharris && (signature_fis->lba_low == 0x01) 916230557Sjimharris && (signature_fis->lba_mid == 0x14) 917230557Sjimharris && (signature_fis->lba_high == 0xEB) 918230557Sjimharris && ( (signature_fis->device & 0x5F) == 0x00) 919230557Sjimharris ) 920230557Sjimharris { 921230557Sjimharris // An ATA device supporting the PACKET command set. 922230557Sjimharris return TRUE; 923230557Sjimharris } 924230557Sjimharris else 925230557Sjimharris return FALSE; 926230557Sjimharris } 927230557Sjimharris else 928230557Sjimharris { 929230557Sjimharris //Expander supported ATAPI device is not currently supported. 930230557Sjimharris return FALSE; 931230557Sjimharris } 932230557Sjimharris} 933230557Sjimharris 934230557Sjimharris#endif // !defined(DISABLE_ATAPI) 935230557Sjimharris 936230557Sjimharris//****************************************************************************** 937230557Sjimharris//* REMOTE DEVICE STATE MACHINE 938230557Sjimharris//****************************************************************************** 939230557Sjimharris 940230557Sjimharris/** 941230557Sjimharris * This method is called once the remote node context is ready to be 942230557Sjimharris * freed. The remote device can now report that its stop operation is 943230557Sjimharris * complete. 944230557Sjimharris * 945230557Sjimharris * @param[in] user_parameter This is cast to a remote device object. 946230557Sjimharris * 947230557Sjimharris * @return none 948230557Sjimharris */ 949230557Sjimharrisstatic 950230557Sjimharrisvoid scic_sds_cb_remote_device_rnc_destruct_complete( 951230557Sjimharris void * user_parameter 952230557Sjimharris) 953230557Sjimharris{ 954230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device; 955230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)user_parameter; 956230557Sjimharris 957230557Sjimharris ASSERT(this_device->started_request_count == 0); 958230557Sjimharris 959230557Sjimharris sci_base_state_machine_change_state( 960230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device), 961230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPED 962230557Sjimharris ); 963230557Sjimharris} 964230557Sjimharris 965230557Sjimharris/** 966230557Sjimharris * This method is called once the remote node context has transisitioned to a 967230557Sjimharris * ready state. This is the indication that the remote device object can also 968230557Sjimharris * transition to ready. 969230557Sjimharris * 970230557Sjimharris * @param[in] user_parameter This is cast to a remote device object. 971230557Sjimharris * 972230557Sjimharris * @return none 973230557Sjimharris */ 974230557Sjimharrisstatic 975230557Sjimharrisvoid scic_sds_remote_device_resume_complete_handler( 976230557Sjimharris void * user_parameter 977230557Sjimharris) 978230557Sjimharris{ 979230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device; 980230557Sjimharris this_device = (SCIC_SDS_REMOTE_DEVICE_T *)user_parameter; 981230557Sjimharris 982230557Sjimharris if ( 983230557Sjimharris sci_base_state_machine_get_state(&this_device->parent.state_machine) 984230557Sjimharris != SCI_BASE_REMOTE_DEVICE_STATE_READY 985230557Sjimharris ) 986230557Sjimharris { 987230557Sjimharris sci_base_state_machine_change_state( 988230557Sjimharris &this_device->parent.state_machine, 989230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_READY 990230557Sjimharris ); 991230557Sjimharris } 992230557Sjimharris} 993230557Sjimharris 994230557Sjimharris/** 995230557Sjimharris * This method will perform the STP request start processing common 996230557Sjimharris * to IO requests and task requests of all types. 997230557Sjimharris * 998230557Sjimharris * @param[in] device This parameter specifies the device for which the 999230557Sjimharris * request is being started. 1000230557Sjimharris * @param[in] request This parameter specifies the request being started. 1001230557Sjimharris * @param[in] status This parameter specifies the current start operation 1002230557Sjimharris * status. 1003230557Sjimharris * 1004230557Sjimharris * @return none 1005230557Sjimharris */ 1006230557Sjimharrisvoid scic_sds_remote_device_start_request( 1007230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device, 1008230557Sjimharris SCIC_SDS_REQUEST_T * the_request, 1009230557Sjimharris SCI_STATUS status 1010230557Sjimharris) 1011230557Sjimharris{ 1012230557Sjimharris // We still have a fault in starting the io complete it on the port 1013230557Sjimharris if (status == SCI_SUCCESS) 1014230557Sjimharris scic_sds_remote_device_increment_request_count(this_device); 1015230557Sjimharris else 1016230557Sjimharris { 1017230557Sjimharris this_device->owning_port->state_handlers->complete_io_handler( 1018230557Sjimharris this_device->owning_port, this_device, the_request 1019230557Sjimharris ); 1020230557Sjimharris } 1021230557Sjimharris} 1022230557Sjimharris 1023230557Sjimharris 1024230557Sjimharris/** 1025230557Sjimharris * This method will continue to post tc for a STP request. This method usually 1026230557Sjimharris * serves as a callback when RNC gets resumed during a task management sequence. 1027230557Sjimharris * 1028230557Sjimharris * @param[in] request This parameter specifies the request being continued. 1029230557Sjimharris * 1030230557Sjimharris * @return none 1031230557Sjimharris */ 1032230557Sjimharrisvoid scic_sds_remote_device_continue_request( 1033230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device 1034230557Sjimharris) 1035230557Sjimharris{ 1036230557Sjimharris // we need to check if this request is still valid to continue. 1037230557Sjimharris if (this_device->working_request != NULL) 1038230557Sjimharris { 1039230557Sjimharris SCIC_SDS_REQUEST_T * this_request = this_device->working_request; 1040230557Sjimharris 1041230557Sjimharris this_request->owning_controller->state_handlers->parent.continue_io_handler( 1042230557Sjimharris &this_request->owning_controller->parent, 1043230557Sjimharris &this_request->target_device->parent, 1044230557Sjimharris &this_request->parent 1045230557Sjimharris ); 1046230557Sjimharris } 1047230557Sjimharris} 1048230557Sjimharris 1049230557Sjimharris/** 1050230557Sjimharris * @brief This method will terminate all of the IO requests in the 1051230557Sjimharris * controllers IO request table that were targeted for this 1052230557Sjimharris * device. 1053230557Sjimharris * 1054230557Sjimharris * @param[in] this_device This parameter specifies the remote device 1055230557Sjimharris * for which to attempt to terminate all requests. 1056230557Sjimharris * 1057230557Sjimharris * @return This method returns an indication as to whether all requests 1058230557Sjimharris * were successfully terminated. If a single request fails to 1059230557Sjimharris * be terminated, then this method will return the failure. 1060230557Sjimharris */ 1061230557Sjimharrisstatic 1062230557SjimharrisSCI_STATUS scic_sds_remote_device_terminate_requests( 1063230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 1064230557Sjimharris) 1065230557Sjimharris{ 1066230557Sjimharris return scic_sds_terminate_reqests( 1067230557Sjimharris this_device->owning_port->owning_controller, 1068230557Sjimharris this_device, 1069230557Sjimharris NULL); 1070230557Sjimharris} 1071230557Sjimharris 1072230557Sjimharris//***************************************************************************** 1073230557Sjimharris//* DEFAULT STATE HANDLERS 1074230557Sjimharris//***************************************************************************** 1075230557Sjimharris 1076230557Sjimharris/** 1077230557Sjimharris * This method is the default start handler. It logs a warning and returns a 1078230557Sjimharris * failure. 1079230557Sjimharris * 1080230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1081230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1082230557Sjimharris * 1083230557Sjimharris * @return SCI_STATUS 1084230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1085230557Sjimharris */ 1086230557SjimharrisSCI_STATUS scic_sds_remote_device_default_start_handler( 1087230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1088230557Sjimharris) 1089230557Sjimharris{ 1090230557Sjimharris SCIC_LOG_WARNING(( 1091230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1092230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1093230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1094230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1095230557Sjimharris "SCIC Remote Device requested to start while in wrong state %d\n", 1096230557Sjimharris sci_base_state_machine_get_state( 1097230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1098230557Sjimharris )); 1099230557Sjimharris 1100230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1101230557Sjimharris} 1102230557Sjimharris 1103230557Sjimharris/** 1104230557Sjimharris * This method is the default stop handler. It logs a warning and returns a 1105230557Sjimharris * failure. 1106230557Sjimharris * 1107230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1108230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1109230557Sjimharris * 1110230557Sjimharris * @return SCI_STATUS 1111230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1112230557Sjimharris */ 1113230557SjimharrisSCI_STATUS scic_sds_remote_device_default_stop_handler( 1114230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1115230557Sjimharris) 1116230557Sjimharris{ 1117230557Sjimharris SCIC_LOG_WARNING(( 1118230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1119230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1120230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1121230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1122230557Sjimharris "SCIC Remote Device requested to stop while in wrong state %d\n", 1123230557Sjimharris sci_base_state_machine_get_state( 1124230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1125230557Sjimharris )); 1126230557Sjimharris 1127230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1128230557Sjimharris} 1129230557Sjimharris 1130230557Sjimharris/** 1131230557Sjimharris * This method is the default fail handler. It logs a warning and returns a 1132230557Sjimharris * failure. 1133230557Sjimharris * 1134230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1135230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1136230557Sjimharris * 1137230557Sjimharris * @return SCI_STATUS 1138230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1139230557Sjimharris */ 1140230557SjimharrisSCI_STATUS scic_sds_remote_device_default_fail_handler( 1141230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1142230557Sjimharris) 1143230557Sjimharris{ 1144230557Sjimharris SCIC_LOG_WARNING(( 1145230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1146230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1147230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1148230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1149230557Sjimharris "SCIC Remote Device requested to fail while in wrong state %d\n", 1150230557Sjimharris sci_base_state_machine_get_state( 1151230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1152230557Sjimharris )); 1153230557Sjimharris 1154230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1155230557Sjimharris} 1156230557Sjimharris 1157230557Sjimharris/** 1158230557Sjimharris * This method is the default destruct handler. It logs a warning and returns 1159230557Sjimharris * a failure. 1160230557Sjimharris * 1161230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1162230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1163230557Sjimharris * 1164230557Sjimharris * @return SCI_STATUS 1165230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1166230557Sjimharris */ 1167230557SjimharrisSCI_STATUS scic_sds_remote_device_default_destruct_handler( 1168230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1169230557Sjimharris) 1170230557Sjimharris{ 1171230557Sjimharris SCIC_LOG_WARNING(( 1172230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1173230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1174230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1175230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1176230557Sjimharris "SCIC Remote Device requested to destroy while in wrong state %d\n", 1177230557Sjimharris sci_base_state_machine_get_state( 1178230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1179230557Sjimharris )); 1180230557Sjimharris 1181230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1182230557Sjimharris} 1183230557Sjimharris 1184230557Sjimharris/** 1185230557Sjimharris * This method is the default reset handler. It logs a warning and returns a 1186230557Sjimharris * failure. 1187230557Sjimharris * 1188230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1189230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1190230557Sjimharris * 1191230557Sjimharris * @return SCI_STATUS 1192230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1193230557Sjimharris */ 1194230557SjimharrisSCI_STATUS scic_sds_remote_device_default_reset_handler( 1195230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1196230557Sjimharris) 1197230557Sjimharris{ 1198230557Sjimharris SCIC_LOG_WARNING(( 1199230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1200230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1201230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1202230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1203230557Sjimharris "SCIC Remote Device requested to reset while in wrong state %d\n", 1204230557Sjimharris sci_base_state_machine_get_state( 1205230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1206230557Sjimharris )); 1207230557Sjimharris 1208230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1209230557Sjimharris} 1210230557Sjimharris 1211230557Sjimharris/** 1212230557Sjimharris * This method is the default reset complete handler. It logs a warning and 1213230557Sjimharris * returns a failure. 1214230557Sjimharris * 1215230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1216230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1217230557Sjimharris * 1218230557Sjimharris * @return SCI_STATUS 1219230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1220230557Sjimharris */ 1221230557SjimharrisSCI_STATUS scic_sds_remote_device_default_reset_complete_handler( 1222230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1223230557Sjimharris) 1224230557Sjimharris{ 1225230557Sjimharris SCIC_LOG_WARNING(( 1226230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1227230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1228230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1229230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1230230557Sjimharris "SCIC Remote Device requested to complete reset while in wrong state %d\n", 1231230557Sjimharris sci_base_state_machine_get_state( 1232230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1233230557Sjimharris )); 1234230557Sjimharris 1235230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1236230557Sjimharris} 1237230557Sjimharris 1238230557Sjimharris/** 1239230557Sjimharris * This method is the default suspend handler. It logs a warning and returns 1240230557Sjimharris * a failure. 1241230557Sjimharris * 1242230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1243230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1244230557Sjimharris * 1245230557Sjimharris * @return SCI_STATUS 1246230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1247230557Sjimharris */ 1248230557SjimharrisSCI_STATUS scic_sds_remote_device_default_suspend_handler( 1249230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 1250230557Sjimharris U32 suspend_type 1251230557Sjimharris) 1252230557Sjimharris{ 1253230557Sjimharris SCIC_LOG_WARNING(( 1254230557Sjimharris sci_base_object_get_logger(this_device), 1255230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1256230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1257230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1258230557Sjimharris "SCIC Remote Device 0x%x requested to suspend %d while in wrong state %d\n", 1259230557Sjimharris this_device, suspend_type, 1260230557Sjimharris sci_base_state_machine_get_state( 1261230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device)) 1262230557Sjimharris )); 1263230557Sjimharris 1264230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1265230557Sjimharris} 1266230557Sjimharris 1267230557Sjimharris/** 1268230557Sjimharris * This method is the default resume handler. It logs a warning and returns a 1269230557Sjimharris * failure. 1270230557Sjimharris * 1271230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1272230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1273230557Sjimharris * 1274230557Sjimharris * @return SCI_STATUS 1275230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1276230557Sjimharris */ 1277230557SjimharrisSCI_STATUS scic_sds_remote_device_default_resume_handler( 1278230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 1279230557Sjimharris) 1280230557Sjimharris{ 1281230557Sjimharris SCIC_LOG_WARNING(( 1282230557Sjimharris sci_base_object_get_logger(this_device), 1283230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1284230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1285230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1286230557Sjimharris "SCIC Remote Device requested to resume while in wrong state %d\n", 1287230557Sjimharris sci_base_state_machine_get_state( 1288230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device)) 1289230557Sjimharris )); 1290230557Sjimharris 1291230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1292230557Sjimharris} 1293230557Sjimharris 1294230557Sjimharris#if defined(SCI_LOGGING) 1295230557Sjimharris/** 1296230557Sjimharris * This is a private method for emitting log messages related to events reported 1297230557Sjimharris * to the remote device from the controller object. 1298230557Sjimharris * 1299230557Sjimharris * @param [in] this_device This is the device object that is receiving the 1300230557Sjimharris * event. 1301230557Sjimharris * @param [in] event_code The event code to process. 1302230557Sjimharris * 1303230557Sjimharris * @return None 1304230557Sjimharris */ 1305230557Sjimharrisstatic void scic_sds_emit_event_log_message( 1306230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device, 1307230557Sjimharris U32 event_code, 1308230557Sjimharris char * message_guts, 1309230557Sjimharris BOOL ready_state 1310230557Sjimharris ) 1311230557Sjimharris{ 1312230557Sjimharris SCIC_LOG_WARNING(( 1313230557Sjimharris sci_base_object_get_logger(this_device), 1314230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1315230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1316230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1317230557Sjimharris "SCIC Remote device 0x%x (state %d) received %s %x while in the %sready %s%d\n", 1318230557Sjimharris this_device, 1319230557Sjimharris sci_base_state_machine_get_state( 1320230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device)), 1321230557Sjimharris message_guts, event_code, 1322230557Sjimharris (ready_state) 1323230557Sjimharris ? "" 1324230557Sjimharris : "not ", 1325230557Sjimharris (this_device->has_ready_substate_machine) 1326230557Sjimharris ? "substate " 1327230557Sjimharris : "", 1328230557Sjimharris (this_device->has_ready_substate_machine) 1329230557Sjimharris ? sci_base_state_machine_get_state(&this_device->ready_substate_machine) 1330230557Sjimharris : 0 1331230557Sjimharris )); 1332230557Sjimharris} 1333230557Sjimharris#else // defined(SCI_LOGGING) 1334230557Sjimharris#define scic_sds_emit_event_log_message(device, event_code, message, state) 1335230557Sjimharris#endif // defined(SCI_LOGGING) 1336230557Sjimharris 1337230557Sjimharris/** 1338230557Sjimharris * This method is the default event handler. It will call the RNC state 1339230557Sjimharris * machine handler for any RNC events otherwise it will log a warning and 1340230557Sjimharris * returns a failure. 1341230557Sjimharris * 1342230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1343230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1344230557Sjimharris * @param[in] event_code The event code that the SCIC_SDS_CONTROLLER wants the 1345230557Sjimharris * device object to process. 1346230557Sjimharris * 1347230557Sjimharris * @return SCI_STATUS 1348230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1349230557Sjimharris */ 1350230557Sjimharrisstatic 1351230557SjimharrisSCI_STATUS scic_sds_remote_device_core_event_handler( 1352230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 1353230557Sjimharris U32 event_code, 1354230557Sjimharris BOOL is_ready_state 1355230557Sjimharris) 1356230557Sjimharris{ 1357230557Sjimharris SCI_STATUS status; 1358230557Sjimharris 1359230557Sjimharris switch (scu_get_event_type(event_code)) 1360230557Sjimharris { 1361230557Sjimharris case SCU_EVENT_TYPE_RNC_OPS_MISC: 1362230557Sjimharris case SCU_EVENT_TYPE_RNC_SUSPEND_TX: 1363230557Sjimharris case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX: 1364230557Sjimharris status = scic_sds_remote_node_context_event_handler(this_device->rnc, event_code); 1365230557Sjimharris break; 1366230557Sjimharris case SCU_EVENT_TYPE_PTX_SCHEDULE_EVENT: 1367230557Sjimharris 1368230557Sjimharris if( scu_get_event_code(event_code) == SCU_EVENT_IT_NEXUS_TIMEOUT ) 1369230557Sjimharris { 1370230557Sjimharris status = SCI_SUCCESS; 1371230557Sjimharris 1372230557Sjimharris // Suspend the associated RNC 1373230557Sjimharris scic_sds_remote_node_context_suspend( this_device->rnc, 1374230557Sjimharris SCI_SOFTWARE_SUSPENSION, 1375230557Sjimharris NULL, NULL ); 1376230557Sjimharris 1377230557Sjimharris scic_sds_emit_event_log_message( 1378230557Sjimharris this_device, event_code, 1379230557Sjimharris (is_ready_state) 1380230557Sjimharris ? "I_T_Nexus_Timeout event" 1381230557Sjimharris : "I_T_Nexus_Timeout event in wrong state", 1382230557Sjimharris is_ready_state ); 1383230557Sjimharris 1384230557Sjimharris break; 1385230557Sjimharris } 1386230557Sjimharris // Else, fall through and treat as unhandled... 1387230557Sjimharris 1388230557Sjimharris default: 1389230557Sjimharris scic_sds_emit_event_log_message( this_device, event_code, 1390230557Sjimharris (is_ready_state) 1391230557Sjimharris ? "unexpected event" 1392230557Sjimharris : "unexpected event in wrong state", 1393230557Sjimharris is_ready_state ); 1394230557Sjimharris status = SCI_FAILURE_INVALID_STATE; 1395230557Sjimharris break; 1396230557Sjimharris } 1397230557Sjimharris 1398230557Sjimharris return status; 1399230557Sjimharris} 1400230557Sjimharris/** 1401230557Sjimharris * This method is the default event handler. It will call the RNC state 1402230557Sjimharris * machine handler for any RNC events otherwise it will log a warning and 1403230557Sjimharris * returns a failure. 1404230557Sjimharris * 1405230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1406230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1407230557Sjimharris * @param[in] event_code The event code that the SCIC_SDS_CONTROLLER wants the 1408230557Sjimharris * device object to process. 1409230557Sjimharris * 1410230557Sjimharris * @return SCI_STATUS 1411230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1412230557Sjimharris */ 1413230557SjimharrisSCI_STATUS scic_sds_remote_device_default_event_handler( 1414230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 1415230557Sjimharris U32 event_code 1416230557Sjimharris) 1417230557Sjimharris{ 1418230557Sjimharris return scic_sds_remote_device_core_event_handler( this_device, 1419230557Sjimharris event_code, 1420230557Sjimharris FALSE ); 1421230557Sjimharris} 1422230557Sjimharris 1423230557Sjimharris/** 1424230557Sjimharris * This method is the default unsolicited frame handler. It logs a warning, 1425230557Sjimharris * releases the frame and returns a failure. 1426230557Sjimharris * 1427230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1428230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1429230557Sjimharris * @param[in] frame_index The frame index for which the SCIC_SDS_CONTROLLER 1430230557Sjimharris * wants this device object to process. 1431230557Sjimharris * 1432230557Sjimharris * @return SCI_STATUS 1433230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1434230557Sjimharris */ 1435230557SjimharrisSCI_STATUS scic_sds_remote_device_default_frame_handler( 1436230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 1437230557Sjimharris U32 frame_index 1438230557Sjimharris) 1439230557Sjimharris{ 1440230557Sjimharris SCIC_LOG_WARNING(( 1441230557Sjimharris sci_base_object_get_logger(this_device), 1442230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1443230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1444230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1445230557Sjimharris "SCIC Remote Device requested to handle frame %x while in wrong state %d\n", 1446230557Sjimharris frame_index, 1447230557Sjimharris sci_base_state_machine_get_state(&this_device->parent.state_machine) 1448230557Sjimharris )); 1449230557Sjimharris 1450230557Sjimharris // Return the frame back to the controller 1451230557Sjimharris scic_sds_controller_release_frame( 1452230557Sjimharris scic_sds_remote_device_get_controller(this_device), frame_index 1453230557Sjimharris ); 1454230557Sjimharris 1455230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1456230557Sjimharris} 1457230557Sjimharris 1458230557Sjimharris/** 1459230557Sjimharris * This method is the default start io handler. It logs a warning and returns 1460230557Sjimharris * a failure. 1461230557Sjimharris * 1462230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1463230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1464230557Sjimharris * @param[in] request The SCI_BASE_REQUEST which is then cast into a 1465230557Sjimharris * SCIC_SDS_IO_REQUEST to start. 1466230557Sjimharris * 1467230557Sjimharris * @return SCI_STATUS 1468230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1469230557Sjimharris */ 1470230557SjimharrisSCI_STATUS scic_sds_remote_device_default_start_request_handler( 1471230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 1472230557Sjimharris SCI_BASE_REQUEST_T *request 1473230557Sjimharris) 1474230557Sjimharris{ 1475230557Sjimharris SCIC_LOG_WARNING(( 1476230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1477230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1478230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1479230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1480230557Sjimharris "SCIC Remote Device requested to start io request %x while in wrong state %d\n", 1481230557Sjimharris request, 1482230557Sjimharris sci_base_state_machine_get_state( 1483230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1484230557Sjimharris )); 1485230557Sjimharris 1486230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1487230557Sjimharris} 1488230557Sjimharris 1489230557Sjimharris/** 1490230557Sjimharris * This method is the default complete io handler. It logs a warning and 1491230557Sjimharris * returns a failure. 1492230557Sjimharris * 1493230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1494230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1495230557Sjimharris * @param[in] request The SCI_BASE_REQUEST which is then cast into a 1496230557Sjimharris * SCIC_SDS_IO_REQUEST to complete. 1497230557Sjimharris * 1498230557Sjimharris * 1499230557Sjimharris * @return SCI_STATUS 1500230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1501230557Sjimharris */ 1502230557SjimharrisSCI_STATUS scic_sds_remote_device_default_complete_request_handler( 1503230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 1504230557Sjimharris SCI_BASE_REQUEST_T *request 1505230557Sjimharris) 1506230557Sjimharris{ 1507230557Sjimharris SCIC_LOG_WARNING(( 1508230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1509230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1510230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1511230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1512230557Sjimharris "SCIC Remote Device requested to complete io_request %x while in wrong state %d\n", 1513230557Sjimharris request, 1514230557Sjimharris sci_base_state_machine_get_state( 1515230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1516230557Sjimharris )); 1517230557Sjimharris 1518230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1519230557Sjimharris} 1520230557Sjimharris 1521230557Sjimharris/** 1522230557Sjimharris * This method is the default continue io handler. It logs a warning and 1523230557Sjimharris * returns a failure. 1524230557Sjimharris * 1525230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1526230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1527230557Sjimharris * @param[in] request The SCI_BASE_REQUEST which is then cast into a 1528230557Sjimharris * SCIC_SDS_IO_REQUEST to continue. 1529230557Sjimharris * 1530230557Sjimharris * @return SCI_STATUS 1531230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1532230557Sjimharris */ 1533230557SjimharrisSCI_STATUS scic_sds_remote_device_default_continue_request_handler( 1534230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 1535230557Sjimharris SCI_BASE_REQUEST_T *request 1536230557Sjimharris) 1537230557Sjimharris{ 1538230557Sjimharris SCIC_LOG_WARNING(( 1539230557Sjimharris sci_base_object_get_logger((SCIC_SDS_REMOTE_DEVICE_T *)device), 1540230557Sjimharris SCIC_LOG_OBJECT_SSP_REMOTE_TARGET | 1541230557Sjimharris SCIC_LOG_OBJECT_SMP_REMOTE_TARGET | 1542230557Sjimharris SCIC_LOG_OBJECT_STP_REMOTE_TARGET, 1543230557Sjimharris "SCIC Remote Device requested to continue io request %x while in wrong state %d\n", 1544230557Sjimharris request, 1545230557Sjimharris sci_base_state_machine_get_state( 1546230557Sjimharris scic_sds_remote_device_get_base_state_machine((SCIC_SDS_REMOTE_DEVICE_T *)device)) 1547230557Sjimharris )); 1548230557Sjimharris 1549230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1550230557Sjimharris} 1551230557Sjimharris 1552230557Sjimharris/** 1553230557Sjimharris * This method is the general suspend handler. 1554230557Sjimharris * 1555230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1556230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1557230557Sjimharris * 1558230557Sjimharris * @return SCI_STATUS 1559230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1560230557Sjimharris */ 1561230557Sjimharrisstatic 1562230557SjimharrisSCI_STATUS scic_sds_remote_device_general_suspend_handler( 1563230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 1564230557Sjimharris U32 suspend_type 1565230557Sjimharris) 1566230557Sjimharris{ 1567230557Sjimharris return scic_sds_remote_node_context_suspend(this_device->rnc, suspend_type, NULL, NULL); 1568230557Sjimharris} 1569230557Sjimharris 1570230557Sjimharris/** 1571230557Sjimharris * This method is the general suspend handler. It logs a warning and returns 1572230557Sjimharris * a failure. 1573230557Sjimharris * 1574230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1575230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1576230557Sjimharris * 1577230557Sjimharris * @return SCI_STATUS 1578230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1579230557Sjimharris */ 1580230557Sjimharrisstatic 1581230557SjimharrisSCI_STATUS scic_sds_remote_device_general_resume_handler( 1582230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device 1583230557Sjimharris) 1584230557Sjimharris{ 1585230557Sjimharris return scic_sds_remote_node_context_resume(this_device->rnc, NULL, NULL); 1586230557Sjimharris} 1587230557Sjimharris 1588230557Sjimharris//***************************************************************************** 1589230557Sjimharris//* NORMAL STATE HANDLERS 1590230557Sjimharris//***************************************************************************** 1591230557Sjimharris 1592230557Sjimharris/** 1593230557Sjimharris * This method is a general ssp frame handler. In most cases the device 1594230557Sjimharris * object needs to route the unsolicited frame processing to the io request 1595230557Sjimharris * object. This method decodes the tag for the io request object and routes 1596230557Sjimharris * the unsolicited frame to that object. 1597230557Sjimharris * 1598230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is then cast into a 1599230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1600230557Sjimharris * @param[in] frame_index The frame index for which the SCIC_SDS_CONTROLLER 1601230557Sjimharris * wants this device object to process. 1602230557Sjimharris * 1603230557Sjimharris * @return SCI_STATUS 1604230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE 1605230557Sjimharris */ 1606230557SjimharrisSCI_STATUS scic_sds_remote_device_general_frame_handler( 1607230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device, 1608230557Sjimharris U32 frame_index 1609230557Sjimharris) 1610230557Sjimharris{ 1611230557Sjimharris SCI_STATUS result; 1612230557Sjimharris SCI_SSP_FRAME_HEADER_T *frame_header; 1613230557Sjimharris SCIC_SDS_REQUEST_T *io_request; 1614230557Sjimharris 1615230557Sjimharris result = scic_sds_unsolicited_frame_control_get_header( 1616230557Sjimharris &(scic_sds_remote_device_get_controller(this_device)->uf_control), 1617230557Sjimharris frame_index, 1618230557Sjimharris (void **)&frame_header 1619230557Sjimharris ); 1620230557Sjimharris 1621230557Sjimharris if (SCI_SUCCESS == result) 1622230557Sjimharris { 1623230557Sjimharris io_request = scic_sds_controller_get_io_request_from_tag( 1624230557Sjimharris scic_sds_remote_device_get_controller(this_device), frame_header->tag); 1625230557Sjimharris 1626230557Sjimharris if ( (io_request == SCI_INVALID_HANDLE) 1627230557Sjimharris || (io_request->target_device != this_device) ) 1628230557Sjimharris { 1629230557Sjimharris // We could not map this tag to a valid IO request 1630230557Sjimharris // Just toss the frame and continue 1631230557Sjimharris scic_sds_controller_release_frame( 1632230557Sjimharris scic_sds_remote_device_get_controller(this_device), frame_index 1633230557Sjimharris ); 1634230557Sjimharris } 1635230557Sjimharris else 1636230557Sjimharris { 1637230557Sjimharris // The IO request is now in charge of releasing the frame 1638230557Sjimharris result = io_request->state_handlers->frame_handler( 1639230557Sjimharris io_request, frame_index); 1640230557Sjimharris } 1641230557Sjimharris } 1642230557Sjimharris 1643230557Sjimharris return result; 1644230557Sjimharris} 1645230557Sjimharris 1646230557Sjimharris/** 1647230557Sjimharris * This is a common method for handling events reported to the remote device 1648230557Sjimharris * from the controller object. 1649230557Sjimharris * 1650230557Sjimharris * @param [in] this_device This is the device object that is receiving the 1651230557Sjimharris * event. 1652230557Sjimharris * @param [in] event_code The event code to process. 1653230557Sjimharris * 1654230557Sjimharris * @return SCI_STATUS 1655230557Sjimharris */ 1656230557SjimharrisSCI_STATUS scic_sds_remote_device_general_event_handler( 1657230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device, 1658230557Sjimharris U32 event_code 1659230557Sjimharris) 1660230557Sjimharris{ 1661230557Sjimharris return scic_sds_remote_device_core_event_handler( this_device, 1662230557Sjimharris event_code, 1663230557Sjimharris TRUE ); 1664230557Sjimharris} 1665230557Sjimharris 1666230557Sjimharris//***************************************************************************** 1667230557Sjimharris//* STOPPED STATE HANDLERS 1668230557Sjimharris//***************************************************************************** 1669230557Sjimharris 1670230557Sjimharris/** 1671230557Sjimharris * This method takes the SCIC_SDS_REMOTE_DEVICE from a stopped state and 1672230557Sjimharris * attempts to start it. The RNC buffer for the device is constructed and 1673230557Sjimharris * the device state machine is transitioned to the 1674230557Sjimharris * SCIC_BASE_REMOTE_DEVICE_STATE_STARTING. 1675230557Sjimharris * 1676230557Sjimharris * @param[in] device 1677230557Sjimharris * 1678230557Sjimharris * @return SCI_STATUS 1679230557Sjimharris * @retval SCI_SUCCESS if there is an RNC buffer available to construct the 1680230557Sjimharris * remote device. 1681230557Sjimharris * @retval SCI_FAILURE_INSUFFICIENT_RESOURCES if there is no RNC buffer 1682230557Sjimharris * available in which to construct the remote device. 1683230557Sjimharris */ 1684230557Sjimharrisstatic 1685230557SjimharrisSCI_STATUS scic_sds_remote_device_stopped_state_start_handler( 1686230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1687230557Sjimharris) 1688230557Sjimharris{ 1689230557Sjimharris SCI_STATUS status; 1690230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 1691230557Sjimharris 1692230557Sjimharris status = scic_sds_remote_node_context_resume( 1693230557Sjimharris this_device->rnc, 1694230557Sjimharris scic_sds_remote_device_resume_complete_handler, 1695230557Sjimharris this_device 1696230557Sjimharris ); 1697230557Sjimharris 1698230557Sjimharris if (status == SCI_SUCCESS) 1699230557Sjimharris { 1700230557Sjimharris sci_base_state_machine_change_state( 1701230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device), 1702230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STARTING 1703230557Sjimharris ); 1704230557Sjimharris } 1705230557Sjimharris 1706230557Sjimharris return status; 1707230557Sjimharris} 1708230557Sjimharris 1709230557Sjimharris/** 1710230557Sjimharris * This method will stop a SCIC_SDS_REMOTE_DEVICE that is already in a stopped 1711230557Sjimharris * state. This is not considered an error since the device is already 1712230557Sjimharris * stopped. 1713230557Sjimharris * 1714230557Sjimharris * @param[in] this_device The SCI_BASE_REMOTE_DEVICE which is cast into a 1715230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1716230557Sjimharris * 1717230557Sjimharris * @return SCI_STATUS 1718230557Sjimharris * @retval SCI_SUCCESS 1719230557Sjimharris */ 1720230557Sjimharrisstatic 1721230557SjimharrisSCI_STATUS scic_sds_remote_device_stopped_state_stop_handler( 1722230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *this_device 1723230557Sjimharris) 1724230557Sjimharris{ 1725230557Sjimharris return SCI_SUCCESS; 1726230557Sjimharris} 1727230557Sjimharris 1728230557Sjimharris/** 1729230557Sjimharris * This method will destruct a SCIC_SDS_REMOTE_DEVICE that is in a stopped 1730230557Sjimharris * state. This is the only state from which a destruct request will succeed. 1731230557Sjimharris * The RNi for this SCIC_SDS_REMOTE_DEVICE is returned to the free pool and 1732230557Sjimharris * the device object transitions to the SCI_BASE_REMOTE_DEVICE_STATE_FINAL. 1733230557Sjimharris * 1734230557Sjimharris * @param[in] this_device The SCI_BASE_REMOTE_DEVICE which is cast into a 1735230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 1736230557Sjimharris * 1737230557Sjimharris * @return SCI_STATUS 1738230557Sjimharris * @retval SCI_SUCCESS 1739230557Sjimharris */ 1740230557Sjimharrisstatic 1741230557SjimharrisSCI_STATUS scic_sds_remote_device_stopped_state_destruct_handler( 1742230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1743230557Sjimharris) 1744230557Sjimharris{ 1745230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 1746230557Sjimharris 1747230557Sjimharris SCIC_SDS_CONTROLLER_T * the_controller = 1748230557Sjimharris scic_sds_remote_device_get_controller(this_device); 1749230557Sjimharris 1750230557Sjimharris the_controller->remote_device_sequence[this_device->rnc->remote_node_index]++; 1751230557Sjimharris 1752230557Sjimharris scic_sds_controller_free_remote_node_context( 1753230557Sjimharris the_controller, 1754230557Sjimharris this_device, 1755230557Sjimharris this_device->rnc->remote_node_index 1756230557Sjimharris ); 1757230557Sjimharris 1758230557Sjimharris scic_sds_remote_node_context_set_remote_node_index( 1759230557Sjimharris this_device->rnc, 1760230557Sjimharris SCIC_SDS_REMOTE_NODE_CONTEXT_INVALID_INDEX 1761230557Sjimharris ); 1762230557Sjimharris 1763230557Sjimharris sci_base_state_machine_change_state( 1764230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device), 1765230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_FINAL 1766230557Sjimharris ); 1767230557Sjimharris 1768230557Sjimharris scic_sds_remote_device_deinitialize_state_logging(this_device); 1769230557Sjimharris 1770230557Sjimharris return SCI_SUCCESS; 1771230557Sjimharris} 1772230557Sjimharris 1773230557Sjimharris//***************************************************************************** 1774230557Sjimharris//* STARTING STATE HANDLERS 1775230557Sjimharris//***************************************************************************** 1776230557Sjimharris 1777230557Sjimharrisstatic 1778230557SjimharrisSCI_STATUS scic_sds_remote_device_starting_state_stop_handler( 1779230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1780230557Sjimharris) 1781230557Sjimharris{ 1782230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 1783230557Sjimharris 1784230557Sjimharris /* 1785230557Sjimharris * This device has not yet started so there had better be no IO requests 1786230557Sjimharris */ 1787230557Sjimharris ASSERT(this_device->started_request_count == 0); 1788230557Sjimharris 1789230557Sjimharris /* 1790230557Sjimharris * Destroy the remote node context 1791230557Sjimharris */ 1792230557Sjimharris scic_sds_remote_node_context_destruct( 1793230557Sjimharris this_device->rnc, 1794230557Sjimharris scic_sds_cb_remote_device_rnc_destruct_complete, 1795230557Sjimharris this_device 1796230557Sjimharris ); 1797230557Sjimharris 1798230557Sjimharris /* 1799230557Sjimharris * Transition to the stopping state and wait for the remote node to 1800230557Sjimharris * complete being posted and invalidated. 1801230557Sjimharris */ 1802230557Sjimharris sci_base_state_machine_change_state( 1803230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device), 1804230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPING 1805230557Sjimharris ); 1806230557Sjimharris 1807230557Sjimharris return SCI_SUCCESS; 1808230557Sjimharris} 1809230557Sjimharris 1810230557Sjimharris//***************************************************************************** 1811230557Sjimharris//* INITIALIZING STATE HANDLERS 1812230557Sjimharris//***************************************************************************** 1813230557Sjimharris 1814230557Sjimharris/* There is nothing to do here for SSP devices */ 1815230557Sjimharris 1816230557Sjimharris//***************************************************************************** 1817230557Sjimharris//* READY STATE HANDLERS 1818230557Sjimharris//***************************************************************************** 1819230557Sjimharris 1820230557Sjimharris/** 1821230557Sjimharris * This method is the default stop handler for the SCIC_SDS_REMOTE_DEVICE 1822230557Sjimharris * ready substate machine. It will stop the current substate machine and 1823230557Sjimharris * transition the base state machine to SCI_BASE_REMOTE_DEVICE_STATE_STOPPING. 1824230557Sjimharris * 1825230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE object which is cast to a 1826230557Sjimharris * SCIC_SDS_REMOTE_DEVICE object. 1827230557Sjimharris * 1828230557Sjimharris * @return SCI_STATUS 1829230557Sjimharris * @retval SCI_SUCCESS 1830230557Sjimharris */ 1831230557SjimharrisSCI_STATUS scic_sds_remote_device_ready_state_stop_handler( 1832230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1833230557Sjimharris) 1834230557Sjimharris{ 1835230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 1836230557Sjimharris SCI_STATUS status = SCI_SUCCESS; 1837230557Sjimharris 1838230557Sjimharris // Request the parent state machine to transition to the stopping state 1839230557Sjimharris sci_base_state_machine_change_state( 1840230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device), 1841230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPING 1842230557Sjimharris ); 1843230557Sjimharris 1844230557Sjimharris if (this_device->started_request_count == 0) 1845230557Sjimharris { 1846230557Sjimharris scic_sds_remote_node_context_destruct( 1847230557Sjimharris this_device->rnc, 1848230557Sjimharris scic_sds_cb_remote_device_rnc_destruct_complete, 1849230557Sjimharris this_device 1850230557Sjimharris ); 1851230557Sjimharris } 1852230557Sjimharris else 1853230557Sjimharris status = scic_sds_remote_device_terminate_requests(this_device); 1854230557Sjimharris 1855230557Sjimharris return status; 1856230557Sjimharris} 1857230557Sjimharris 1858230557Sjimharris/** 1859230557Sjimharris * This is the ready state device reset handler 1860230557Sjimharris * 1861230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE object which is cast to a 1862230557Sjimharris * SCIC_SDS_REMOTE_DEVICE object. 1863230557Sjimharris * 1864230557Sjimharris * @return SCI_STATUS 1865230557Sjimharris */ 1866230557SjimharrisSCI_STATUS scic_sds_remote_device_ready_state_reset_handler( 1867230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 1868230557Sjimharris) 1869230557Sjimharris{ 1870230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 1871230557Sjimharris 1872230557Sjimharris // Request the parent state machine to transition to the stopping state 1873230557Sjimharris sci_base_state_machine_change_state( 1874230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device), 1875230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_RESETTING 1876230557Sjimharris ); 1877230557Sjimharris 1878230557Sjimharris return SCI_SUCCESS; 1879230557Sjimharris} 1880230557Sjimharris 1881230557Sjimharris/** 1882230557Sjimharris * This method will attempt to start a task request for this device object. 1883230557Sjimharris * The remote device object will issue the start request for the task and if 1884230557Sjimharris * successful it will start the request for the port object then increment its 1885230557Sjimharris * own requet count. 1886230557Sjimharris * 1887230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is cast to a 1888230557Sjimharris * SCIC_SDS_REMOTE_DEVICE for which the request is to be started. 1889230557Sjimharris * @param[in] request The SCI_BASE_REQUEST which is cast to a 1890230557Sjimharris * SCIC_SDS_IO_REQUEST that is to be started. 1891230557Sjimharris * 1892230557Sjimharris * @return SCI_STATUS 1893230557Sjimharris * @retval SCI_SUCCESS if the task request is started for this device object. 1894230557Sjimharris * @retval SCI_FAILURE_INSUFFICIENT_RESOURCES if the io request object could 1895230557Sjimharris * not get the resources to start. 1896230557Sjimharris */ 1897230557Sjimharrisstatic 1898230557SjimharrisSCI_STATUS scic_sds_remote_device_ready_state_start_task_handler( 1899230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 1900230557Sjimharris SCI_BASE_REQUEST_T *request 1901230557Sjimharris) 1902230557Sjimharris{ 1903230557Sjimharris SCI_STATUS result; 1904230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 1905230557Sjimharris SCIC_SDS_REQUEST_T *task_request = (SCIC_SDS_REQUEST_T *)request; 1906230557Sjimharris 1907230557Sjimharris // See if the port is in a state where we can start the IO request 1908230557Sjimharris result = scic_sds_port_start_io( 1909230557Sjimharris scic_sds_remote_device_get_port(this_device), this_device, task_request); 1910230557Sjimharris 1911230557Sjimharris if (result == SCI_SUCCESS) 1912230557Sjimharris { 1913230557Sjimharris result = scic_sds_remote_node_context_start_task( 1914230557Sjimharris this_device->rnc, task_request 1915230557Sjimharris ); 1916230557Sjimharris 1917230557Sjimharris if (result == SCI_SUCCESS) 1918230557Sjimharris { 1919230557Sjimharris result = scic_sds_request_start(task_request); 1920230557Sjimharris } 1921230557Sjimharris 1922230557Sjimharris scic_sds_remote_device_start_request(this_device, task_request, result); 1923230557Sjimharris } 1924230557Sjimharris 1925230557Sjimharris return result; 1926230557Sjimharris} 1927230557Sjimharris 1928230557Sjimharris/** 1929230557Sjimharris * This method will attempt to start an io request for this device object. The 1930230557Sjimharris * remote device object will issue the start request for the io and if 1931230557Sjimharris * successful it will start the request for the port object then increment its 1932230557Sjimharris * own requet count. 1933230557Sjimharris * 1934230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is cast to a 1935230557Sjimharris * SCIC_SDS_REMOTE_DEVICE for which the request is to be started. 1936230557Sjimharris * @param[in] request The SCI_BASE_REQUEST which is cast to a 1937230557Sjimharris * SCIC_SDS_IO_REQUEST that is to be started. 1938230557Sjimharris * 1939230557Sjimharris * @return SCI_STATUS 1940230557Sjimharris * @retval SCI_SUCCESS if the io request is started for this device object. 1941230557Sjimharris * @retval SCI_FAILURE_INSUFFICIENT_RESOURCES if the io request object could 1942230557Sjimharris * not get the resources to start. 1943230557Sjimharris */ 1944230557Sjimharrisstatic 1945230557SjimharrisSCI_STATUS scic_sds_remote_device_ready_state_start_io_handler( 1946230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 1947230557Sjimharris SCI_BASE_REQUEST_T *request 1948230557Sjimharris) 1949230557Sjimharris{ 1950230557Sjimharris SCI_STATUS result; 1951230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 1952230557Sjimharris SCIC_SDS_REQUEST_T *io_request = (SCIC_SDS_REQUEST_T *)request; 1953230557Sjimharris 1954230557Sjimharris // See if the port is in a state where we can start the IO request 1955230557Sjimharris result = scic_sds_port_start_io( 1956230557Sjimharris scic_sds_remote_device_get_port(this_device), this_device, io_request); 1957230557Sjimharris 1958230557Sjimharris if (result == SCI_SUCCESS) 1959230557Sjimharris { 1960230557Sjimharris result = scic_sds_remote_node_context_start_io( 1961230557Sjimharris this_device->rnc, io_request 1962230557Sjimharris ); 1963230557Sjimharris 1964230557Sjimharris if (result == SCI_SUCCESS) 1965230557Sjimharris { 1966230557Sjimharris result = scic_sds_request_start(io_request); 1967230557Sjimharris } 1968230557Sjimharris 1969230557Sjimharris scic_sds_remote_device_start_request(this_device, io_request, result); 1970230557Sjimharris } 1971230557Sjimharris 1972230557Sjimharris return result; 1973230557Sjimharris} 1974230557Sjimharris 1975230557Sjimharris/** 1976230557Sjimharris * This method will complete the request for the remote device object. The 1977230557Sjimharris * method will call the completion handler for the request object and if 1978230557Sjimharris * successful it will complete the request on the port object then decrement 1979230557Sjimharris * its own started_request_count. 1980230557Sjimharris * 1981230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is cast to a 1982230557Sjimharris * SCIC_SDS_REMOTE_DEVICE for which the request is to be completed. 1983230557Sjimharris * @param[in] request The SCI_BASE_REQUEST which is cast to a 1984230557Sjimharris * SCIC_SDS_IO_REQUEST that is to be completed. 1985230557Sjimharris * 1986230557Sjimharris * @return SCI_STATUS 1987230557Sjimharris */ 1988230557Sjimharrisstatic 1989230557SjimharrisSCI_STATUS scic_sds_remote_device_ready_state_complete_request_handler( 1990230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 1991230557Sjimharris SCI_BASE_REQUEST_T *request 1992230557Sjimharris) 1993230557Sjimharris{ 1994230557Sjimharris SCI_STATUS result; 1995230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 1996230557Sjimharris SCIC_SDS_REQUEST_T *the_request = (SCIC_SDS_REQUEST_T *)request; 1997230557Sjimharris 1998230557Sjimharris result = scic_sds_request_complete(the_request); 1999230557Sjimharris 2000230557Sjimharris if (result == SCI_SUCCESS) 2001230557Sjimharris { 2002230557Sjimharris // See if the port is in a state where we can start the IO request 2003230557Sjimharris result = scic_sds_port_complete_io( 2004230557Sjimharris scic_sds_remote_device_get_port(this_device), this_device, the_request); 2005230557Sjimharris 2006230557Sjimharris if (result == SCI_SUCCESS) 2007230557Sjimharris { 2008230557Sjimharris scic_sds_remote_device_decrement_request_count(this_device); 2009230557Sjimharris } 2010230557Sjimharris } 2011230557Sjimharris 2012230557Sjimharris return result; 2013230557Sjimharris} 2014230557Sjimharris 2015230557Sjimharris//***************************************************************************** 2016230557Sjimharris//* STOPPING STATE HANDLERS 2017230557Sjimharris//***************************************************************************** 2018230557Sjimharris 2019230557Sjimharris/** 2020230557Sjimharris * This method will stop a SCIC_SDS_REMOTE_DEVICE that is already in the 2021230557Sjimharris * SCI_BASE_REMOTE_DEVICE_STATE_STOPPING state. This is not considered an 2022230557Sjimharris * error since we allow a stop request on a device that is alreay stopping or 2023230557Sjimharris * stopped. 2024230557Sjimharris * 2025230557Sjimharris * @param[in] this_device The SCI_BASE_REMOTE_DEVICE which is cast into a 2026230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2027230557Sjimharris * 2028230557Sjimharris * @return SCI_STATUS 2029230557Sjimharris * @retval SCI_SUCCESS 2030230557Sjimharris */ 2031230557Sjimharrisstatic 2032230557SjimharrisSCI_STATUS scic_sds_remote_device_stopping_state_stop_handler( 2033230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device 2034230557Sjimharris) 2035230557Sjimharris{ 2036230557Sjimharris // All requests should have been terminated, but if there is an 2037230557Sjimharris // attempt to stop a device already in the stopping state, then 2038230557Sjimharris // try again to terminate. 2039230557Sjimharris return scic_sds_remote_device_terminate_requests( 2040230557Sjimharris (SCIC_SDS_REMOTE_DEVICE_T*)device); 2041230557Sjimharris} 2042230557Sjimharris 2043230557Sjimharris 2044230557Sjimharris/** 2045230557Sjimharris * This method completes requests for this SCIC_SDS_REMOTE_DEVICE while it is 2046230557Sjimharris * in the SCI_BASE_REMOTE_DEVICE_STATE_STOPPING state. This method calls the 2047230557Sjimharris * complete method for the request object and if that is successful the port 2048230557Sjimharris * object is called to complete the task request. Then the device object 2049230557Sjimharris * itself completes the task request. If SCIC_SDS_REMOTE_DEVICE 2050230557Sjimharris * started_request_count goes to 0 and the invalidate RNC request has 2051230557Sjimharris * completed the device object can transition to the 2052230557Sjimharris * SCI_BASE_REMOTE_DEVICE_STATE_STOPPED. 2053230557Sjimharris * 2054230557Sjimharris * @param[in] device The device object for which the request is completing. 2055230557Sjimharris * @param[in] request The task request that is being completed. 2056230557Sjimharris * 2057230557Sjimharris * @return SCI_STATUS 2058230557Sjimharris */ 2059230557Sjimharrisstatic 2060230557SjimharrisSCI_STATUS scic_sds_remote_device_stopping_state_complete_request_handler( 2061230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 2062230557Sjimharris SCI_BASE_REQUEST_T *request 2063230557Sjimharris) 2064230557Sjimharris{ 2065230557Sjimharris SCI_STATUS status = SCI_SUCCESS; 2066230557Sjimharris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)request; 2067230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 2068230557Sjimharris 2069230557Sjimharris status = scic_sds_request_complete(this_request); 2070230557Sjimharris if (status == SCI_SUCCESS) 2071230557Sjimharris { 2072230557Sjimharris status = scic_sds_port_complete_io( 2073230557Sjimharris scic_sds_remote_device_get_port(this_device), 2074230557Sjimharris this_device, 2075230557Sjimharris this_request 2076230557Sjimharris ); 2077230557Sjimharris 2078230557Sjimharris if (status == SCI_SUCCESS) 2079230557Sjimharris { 2080230557Sjimharris scic_sds_remote_device_decrement_request_count(this_device); 2081230557Sjimharris 2082230557Sjimharris if (scic_sds_remote_device_get_request_count(this_device) == 0) 2083230557Sjimharris { 2084230557Sjimharris scic_sds_remote_node_context_destruct( 2085230557Sjimharris this_device->rnc, 2086230557Sjimharris scic_sds_cb_remote_device_rnc_destruct_complete, 2087230557Sjimharris this_device 2088230557Sjimharris ); 2089230557Sjimharris } 2090230557Sjimharris } 2091230557Sjimharris } 2092230557Sjimharris 2093230557Sjimharris return status; 2094230557Sjimharris} 2095230557Sjimharris 2096230557Sjimharris//***************************************************************************** 2097230557Sjimharris//* RESETTING STATE HANDLERS 2098230557Sjimharris//***************************************************************************** 2099230557Sjimharris 2100230557Sjimharris/** 2101230557Sjimharris * This method will complete the reset operation when the device is in the 2102230557Sjimharris * resetting state. 2103230557Sjimharris * 2104230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is to be cast into a 2105230557Sjimharris * SCIC_SDS_REMOTE_DEVICE object. 2106230557Sjimharris * 2107230557Sjimharris * @return SCI_STATUS 2108230557Sjimharris */ 2109230557Sjimharrisstatic 2110230557SjimharrisSCI_STATUS scic_sds_remote_device_resetting_state_reset_complete_handler( 2111230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * device 2112230557Sjimharris) 2113230557Sjimharris{ 2114230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 2115230557Sjimharris 2116230557Sjimharris sci_base_state_machine_change_state( 2117230557Sjimharris &this_device->parent.state_machine, 2118230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_READY 2119230557Sjimharris ); 2120230557Sjimharris 2121230557Sjimharris return SCI_SUCCESS; 2122230557Sjimharris} 2123230557Sjimharris 2124230557Sjimharris/** 2125230557Sjimharris * This method will stop the remote device while in the resetting state. 2126230557Sjimharris * 2127230557Sjimharris * @param[in] device The SCI_BASE_REMOTE_DEVICE which is to be cast into a 2128230557Sjimharris * SCIC_SDS_REMOTE_DEVICE object. 2129230557Sjimharris * 2130230557Sjimharris * @return SCI_STATUS 2131230557Sjimharris */ 2132230557Sjimharrisstatic 2133230557SjimharrisSCI_STATUS scic_sds_remote_device_resetting_state_stop_handler( 2134230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * device 2135230557Sjimharris) 2136230557Sjimharris{ 2137230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 2138230557Sjimharris 2139230557Sjimharris sci_base_state_machine_change_state( 2140230557Sjimharris &this_device->parent.state_machine, 2141230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPING 2142230557Sjimharris ); 2143230557Sjimharris 2144230557Sjimharris return SCI_SUCCESS; 2145230557Sjimharris} 2146230557Sjimharris 2147230557Sjimharris/** 2148230557Sjimharris * This method completes requests for this SCIC_SDS_REMOTE_DEVICE while it is 2149230557Sjimharris * in the SCI_BASE_REMOTE_DEVICE_STATE_RESETTING state. This method calls the 2150230557Sjimharris * complete method for the request object and if that is successful the port 2151230557Sjimharris * object is called to complete the task request. Then the device object 2152230557Sjimharris * itself completes the task request. 2153230557Sjimharris * 2154230557Sjimharris * @param[in] device The device object for which the request is completing. 2155230557Sjimharris * @param[in] request The task request that is being completed. 2156230557Sjimharris * 2157230557Sjimharris * @return SCI_STATUS 2158230557Sjimharris */ 2159230557Sjimharrisstatic 2160230557SjimharrisSCI_STATUS scic_sds_remote_device_resetting_state_complete_request_handler( 2161230557Sjimharris SCI_BASE_REMOTE_DEVICE_T *device, 2162230557Sjimharris SCI_BASE_REQUEST_T *request 2163230557Sjimharris) 2164230557Sjimharris{ 2165230557Sjimharris SCI_STATUS status = SCI_SUCCESS; 2166230557Sjimharris SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *)request; 2167230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)device; 2168230557Sjimharris 2169230557Sjimharris status = scic_sds_request_complete(this_request); 2170230557Sjimharris 2171230557Sjimharris if (status == SCI_SUCCESS) 2172230557Sjimharris { 2173230557Sjimharris status = scic_sds_port_complete_io( 2174230557Sjimharris scic_sds_remote_device_get_port(this_device), this_device, this_request); 2175230557Sjimharris 2176230557Sjimharris if (status == SCI_SUCCESS) 2177230557Sjimharris { 2178230557Sjimharris scic_sds_remote_device_decrement_request_count(this_device); 2179230557Sjimharris } 2180230557Sjimharris } 2181230557Sjimharris 2182230557Sjimharris return status; 2183230557Sjimharris} 2184230557Sjimharris 2185230557Sjimharris//***************************************************************************** 2186230557Sjimharris//* FAILED STATE HANDLERS 2187230557Sjimharris//***************************************************************************** 2188230557Sjimharris 2189230557SjimharrisSCIC_SDS_REMOTE_DEVICE_STATE_HANDLER_T 2190230557Sjimharris scic_sds_remote_device_state_handler_table[SCI_BASE_REMOTE_DEVICE_MAX_STATES] = 2191230557Sjimharris{ 2192230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_INITIAL 2193230557Sjimharris { 2194230557Sjimharris { 2195230557Sjimharris scic_sds_remote_device_default_start_handler, 2196230557Sjimharris scic_sds_remote_device_default_stop_handler, 2197230557Sjimharris scic_sds_remote_device_default_fail_handler, 2198230557Sjimharris scic_sds_remote_device_default_destruct_handler, 2199230557Sjimharris scic_sds_remote_device_default_reset_handler, 2200230557Sjimharris scic_sds_remote_device_default_reset_complete_handler, 2201230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2202230557Sjimharris scic_sds_remote_device_default_complete_request_handler, 2203230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2204230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2205230557Sjimharris scic_sds_remote_device_default_complete_request_handler 2206230557Sjimharris }, 2207230557Sjimharris scic_sds_remote_device_default_suspend_handler, 2208230557Sjimharris scic_sds_remote_device_default_resume_handler, 2209230557Sjimharris scic_sds_remote_device_default_event_handler, 2210230557Sjimharris scic_sds_remote_device_default_frame_handler 2211230557Sjimharris }, 2212230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_STOPPED 2213230557Sjimharris { 2214230557Sjimharris { 2215230557Sjimharris scic_sds_remote_device_stopped_state_start_handler, 2216230557Sjimharris scic_sds_remote_device_stopped_state_stop_handler, 2217230557Sjimharris scic_sds_remote_device_default_fail_handler, 2218230557Sjimharris scic_sds_remote_device_stopped_state_destruct_handler, 2219230557Sjimharris scic_sds_remote_device_default_reset_handler, 2220230557Sjimharris scic_sds_remote_device_default_reset_complete_handler, 2221230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2222230557Sjimharris scic_sds_remote_device_default_complete_request_handler, 2223230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2224230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2225230557Sjimharris scic_sds_remote_device_default_complete_request_handler 2226230557Sjimharris }, 2227230557Sjimharris scic_sds_remote_device_default_suspend_handler, 2228230557Sjimharris scic_sds_remote_device_default_resume_handler, 2229230557Sjimharris scic_sds_remote_device_default_event_handler, 2230230557Sjimharris scic_sds_remote_device_default_frame_handler 2231230557Sjimharris }, 2232230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_STARTING 2233230557Sjimharris { 2234230557Sjimharris { 2235230557Sjimharris scic_sds_remote_device_default_start_handler, 2236230557Sjimharris scic_sds_remote_device_starting_state_stop_handler, 2237230557Sjimharris scic_sds_remote_device_default_fail_handler, 2238230557Sjimharris scic_sds_remote_device_default_destruct_handler, 2239230557Sjimharris scic_sds_remote_device_default_reset_handler, 2240230557Sjimharris scic_sds_remote_device_default_reset_complete_handler, 2241230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2242230557Sjimharris scic_sds_remote_device_default_complete_request_handler, 2243230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2244230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2245230557Sjimharris scic_sds_remote_device_default_complete_request_handler 2246230557Sjimharris }, 2247230557Sjimharris scic_sds_remote_device_default_suspend_handler, 2248230557Sjimharris scic_sds_remote_device_default_resume_handler, 2249230557Sjimharris scic_sds_remote_device_general_event_handler, 2250230557Sjimharris scic_sds_remote_device_default_frame_handler 2251230557Sjimharris }, 2252230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_READY 2253230557Sjimharris { 2254230557Sjimharris { 2255230557Sjimharris scic_sds_remote_device_default_start_handler, 2256230557Sjimharris scic_sds_remote_device_ready_state_stop_handler, 2257230557Sjimharris scic_sds_remote_device_default_fail_handler, 2258230557Sjimharris scic_sds_remote_device_default_destruct_handler, 2259230557Sjimharris scic_sds_remote_device_ready_state_reset_handler, 2260230557Sjimharris scic_sds_remote_device_default_reset_complete_handler, 2261230557Sjimharris scic_sds_remote_device_ready_state_start_io_handler, 2262230557Sjimharris scic_sds_remote_device_ready_state_complete_request_handler, 2263230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2264230557Sjimharris scic_sds_remote_device_ready_state_start_task_handler, 2265230557Sjimharris scic_sds_remote_device_ready_state_complete_request_handler 2266230557Sjimharris }, 2267230557Sjimharris scic_sds_remote_device_general_suspend_handler, 2268230557Sjimharris scic_sds_remote_device_general_resume_handler, 2269230557Sjimharris scic_sds_remote_device_general_event_handler, 2270230557Sjimharris scic_sds_remote_device_general_frame_handler, 2271230557Sjimharris }, 2272230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_STOPPING 2273230557Sjimharris { 2274230557Sjimharris { 2275230557Sjimharris scic_sds_remote_device_default_start_handler, 2276230557Sjimharris scic_sds_remote_device_stopping_state_stop_handler, 2277230557Sjimharris scic_sds_remote_device_default_fail_handler, 2278230557Sjimharris scic_sds_remote_device_default_destruct_handler, 2279230557Sjimharris scic_sds_remote_device_default_reset_handler, 2280230557Sjimharris scic_sds_remote_device_default_reset_complete_handler, 2281230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2282230557Sjimharris scic_sds_remote_device_stopping_state_complete_request_handler, 2283230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2284230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2285230557Sjimharris scic_sds_remote_device_stopping_state_complete_request_handler 2286230557Sjimharris }, 2287230557Sjimharris scic_sds_remote_device_default_suspend_handler, 2288230557Sjimharris scic_sds_remote_device_default_resume_handler, 2289230557Sjimharris scic_sds_remote_device_general_event_handler, 2290230557Sjimharris scic_sds_remote_device_general_frame_handler 2291230557Sjimharris }, 2292230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_FAILED 2293230557Sjimharris { 2294230557Sjimharris { 2295230557Sjimharris scic_sds_remote_device_default_start_handler, 2296230557Sjimharris scic_sds_remote_device_default_stop_handler, 2297230557Sjimharris scic_sds_remote_device_default_fail_handler, 2298230557Sjimharris scic_sds_remote_device_default_destruct_handler, 2299230557Sjimharris scic_sds_remote_device_default_reset_handler, 2300230557Sjimharris scic_sds_remote_device_default_reset_complete_handler, 2301230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2302230557Sjimharris scic_sds_remote_device_default_complete_request_handler, 2303230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2304230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2305230557Sjimharris scic_sds_remote_device_default_complete_request_handler 2306230557Sjimharris }, 2307230557Sjimharris scic_sds_remote_device_default_suspend_handler, 2308230557Sjimharris scic_sds_remote_device_default_resume_handler, 2309230557Sjimharris scic_sds_remote_device_default_event_handler, 2310230557Sjimharris scic_sds_remote_device_general_frame_handler 2311230557Sjimharris }, 2312230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_RESETTING 2313230557Sjimharris { 2314230557Sjimharris { 2315230557Sjimharris scic_sds_remote_device_default_start_handler, 2316230557Sjimharris scic_sds_remote_device_resetting_state_stop_handler, 2317230557Sjimharris scic_sds_remote_device_default_fail_handler, 2318230557Sjimharris scic_sds_remote_device_default_destruct_handler, 2319230557Sjimharris scic_sds_remote_device_default_reset_handler, 2320230557Sjimharris scic_sds_remote_device_resetting_state_reset_complete_handler, 2321230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2322230557Sjimharris scic_sds_remote_device_resetting_state_complete_request_handler, 2323230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2324230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2325230557Sjimharris scic_sds_remote_device_resetting_state_complete_request_handler 2326230557Sjimharris }, 2327230557Sjimharris scic_sds_remote_device_default_suspend_handler, 2328230557Sjimharris scic_sds_remote_device_default_resume_handler, 2329230557Sjimharris scic_sds_remote_device_default_event_handler, 2330230557Sjimharris scic_sds_remote_device_general_frame_handler 2331230557Sjimharris }, 2332230557Sjimharris#if !defined(DISABLE_WIDE_PORTED_TARGETS) 2333230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_UPDATING_PORT_WIDTH - unused by SCIC 2334230557Sjimharris { 2335230557Sjimharris { 2336230557Sjimharris scic_sds_remote_device_default_start_handler, 2337230557Sjimharris scic_sds_remote_device_default_stop_handler, 2338230557Sjimharris scic_sds_remote_device_default_fail_handler, 2339230557Sjimharris scic_sds_remote_device_default_destruct_handler, 2340230557Sjimharris scic_sds_remote_device_default_reset_handler, 2341230557Sjimharris scic_sds_remote_device_default_reset_complete_handler, 2342230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2343230557Sjimharris scic_sds_remote_device_default_complete_request_handler, 2344230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2345230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2346230557Sjimharris scic_sds_remote_device_default_complete_request_handler 2347230557Sjimharris }, 2348230557Sjimharris scic_sds_remote_device_default_suspend_handler, 2349230557Sjimharris scic_sds_remote_device_default_resume_handler, 2350230557Sjimharris scic_sds_remote_device_default_event_handler, 2351230557Sjimharris scic_sds_remote_device_default_frame_handler 2352230557Sjimharris }, 2353230557Sjimharris#endif 2354230557Sjimharris // SCI_BASE_REMOTE_DEVICE_STATE_FINAL 2355230557Sjimharris { 2356230557Sjimharris { 2357230557Sjimharris scic_sds_remote_device_default_start_handler, 2358230557Sjimharris scic_sds_remote_device_default_stop_handler, 2359230557Sjimharris scic_sds_remote_device_default_fail_handler, 2360230557Sjimharris scic_sds_remote_device_default_destruct_handler, 2361230557Sjimharris scic_sds_remote_device_default_reset_handler, 2362230557Sjimharris scic_sds_remote_device_default_reset_complete_handler, 2363230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2364230557Sjimharris scic_sds_remote_device_default_complete_request_handler, 2365230557Sjimharris scic_sds_remote_device_default_continue_request_handler, 2366230557Sjimharris scic_sds_remote_device_default_start_request_handler, 2367230557Sjimharris scic_sds_remote_device_default_complete_request_handler 2368230557Sjimharris }, 2369230557Sjimharris scic_sds_remote_device_default_suspend_handler, 2370230557Sjimharris scic_sds_remote_device_default_resume_handler, 2371230557Sjimharris scic_sds_remote_device_default_event_handler, 2372230557Sjimharris scic_sds_remote_device_default_frame_handler 2373230557Sjimharris } 2374230557Sjimharris}; 2375230557Sjimharris 2376230557Sjimharris/** 2377230557Sjimharris * This is the enter method for the SCI_BASE_REMOTE_DEVICE_STATE_INITIAL it 2378230557Sjimharris * immediatly transitions the remote device object to the stopped state. 2379230557Sjimharris * 2380230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2381230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2382230557Sjimharris * 2383230557Sjimharris * @return none 2384230557Sjimharris */ 2385230557Sjimharrisstatic 2386230557Sjimharrisvoid scic_sds_remote_device_initial_state_enter( 2387230557Sjimharris SCI_BASE_OBJECT_T *object 2388230557Sjimharris) 2389230557Sjimharris{ 2390230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2391230557Sjimharris 2392230557Sjimharris SET_STATE_HANDLER( 2393230557Sjimharris this_device, 2394230557Sjimharris scic_sds_remote_device_state_handler_table, 2395230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_INITIAL 2396230557Sjimharris ); 2397230557Sjimharris 2398230557Sjimharris // Initial state is a transitional state to the stopped state 2399230557Sjimharris sci_base_state_machine_change_state( 2400230557Sjimharris scic_sds_remote_device_get_base_state_machine(this_device), 2401230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPED 2402230557Sjimharris ); 2403230557Sjimharris} 2404230557Sjimharris 2405230557Sjimharris/** 2406230557Sjimharris * This is the enter method for the SCI_BASE_REMOTE_DEVICE_STATE_INITIAL it 2407230557Sjimharris * sets the stopped state handlers and if this state is entered from the 2408230557Sjimharris * SCI_BASE_REMOTE_DEVICE_STATE_STOPPING then the SCI User is informed that 2409230557Sjimharris * the device stop is complete. 2410230557Sjimharris * 2411230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2412230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2413230557Sjimharris * 2414230557Sjimharris * @return none 2415230557Sjimharris */ 2416230557Sjimharrisstatic 2417230557Sjimharrisvoid scic_sds_remote_device_stopped_state_enter( 2418230557Sjimharris SCI_BASE_OBJECT_T *object 2419230557Sjimharris) 2420230557Sjimharris{ 2421230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2422230557Sjimharris 2423230557Sjimharris SET_STATE_HANDLER( 2424230557Sjimharris this_device, 2425230557Sjimharris scic_sds_remote_device_state_handler_table, 2426230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPED 2427230557Sjimharris ); 2428230557Sjimharris 2429230557Sjimharris // If we are entering from the stopping state let the SCI User know that 2430230557Sjimharris // the stop operation has completed. 2431230557Sjimharris if (this_device->parent.state_machine.previous_state_id 2432230557Sjimharris == SCI_BASE_REMOTE_DEVICE_STATE_STOPPING) 2433230557Sjimharris { 2434230557Sjimharris scic_cb_remote_device_stop_complete( 2435230557Sjimharris scic_sds_remote_device_get_controller(this_device), 2436230557Sjimharris this_device, 2437230557Sjimharris SCI_SUCCESS 2438230557Sjimharris ); 2439230557Sjimharris } 2440230557Sjimharris 2441230557Sjimharris scic_sds_controller_remote_device_stopped( 2442230557Sjimharris scic_sds_remote_device_get_controller(this_device), 2443230557Sjimharris this_device 2444230557Sjimharris ); 2445230557Sjimharris} 2446230557Sjimharris 2447230557Sjimharris/** 2448230557Sjimharris * This is the enter method for the SCI_BASE_REMOTE_DEVICE_STATE_STARTING it 2449230557Sjimharris * sets the starting state handlers, sets the device not ready, and posts the 2450230557Sjimharris * remote node context to the hardware. 2451230557Sjimharris * 2452230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2453230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2454230557Sjimharris * 2455230557Sjimharris * @return none 2456230557Sjimharris */ 2457230557Sjimharrisstatic 2458230557Sjimharrisvoid scic_sds_remote_device_starting_state_enter( 2459230557Sjimharris SCI_BASE_OBJECT_T *object 2460230557Sjimharris) 2461230557Sjimharris{ 2462230557Sjimharris SCIC_SDS_CONTROLLER_T * the_controller; 2463230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2464230557Sjimharris 2465230557Sjimharris the_controller = scic_sds_remote_device_get_controller(this_device); 2466230557Sjimharris 2467230557Sjimharris SET_STATE_HANDLER( 2468230557Sjimharris this_device, 2469230557Sjimharris scic_sds_remote_device_state_handler_table, 2470230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STARTING 2471230557Sjimharris ); 2472230557Sjimharris 2473230557Sjimharris scic_cb_remote_device_not_ready( 2474230557Sjimharris the_controller, 2475230557Sjimharris this_device, 2476230557Sjimharris SCIC_REMOTE_DEVICE_NOT_READY_START_REQUESTED 2477230557Sjimharris ); 2478230557Sjimharris} 2479230557Sjimharris 2480230557Sjimharris 2481230557Sjimharris/** 2482230557Sjimharris * This is the enter method for the SCI_BASE_REMOTE_DEVICE_STATE_READY it sets 2483230557Sjimharris * the ready state handlers, and starts the ready substate machine. 2484230557Sjimharris * 2485230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2486230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2487230557Sjimharris * 2488230557Sjimharris * @return none 2489230557Sjimharris */ 2490230557Sjimharrisstatic 2491230557Sjimharrisvoid scic_sds_remote_device_ready_state_enter( 2492230557Sjimharris SCI_BASE_OBJECT_T *object 2493230557Sjimharris) 2494230557Sjimharris{ 2495230557Sjimharris SCIC_SDS_CONTROLLER_T * the_controller; 2496230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2497230557Sjimharris 2498230557Sjimharris the_controller = scic_sds_remote_device_get_controller(this_device); 2499230557Sjimharris 2500230557Sjimharris SET_STATE_HANDLER( 2501230557Sjimharris this_device, 2502230557Sjimharris scic_sds_remote_device_state_handler_table, 2503230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_READY 2504230557Sjimharris ); 2505230557Sjimharris 2506230557Sjimharris /// @todo Check the device object for the proper return code for this 2507230557Sjimharris /// callback 2508230557Sjimharris scic_cb_remote_device_start_complete( 2509230557Sjimharris the_controller, this_device, SCI_SUCCESS 2510230557Sjimharris ); 2511230557Sjimharris 2512230557Sjimharris scic_sds_controller_remote_device_started( 2513230557Sjimharris the_controller, this_device 2514230557Sjimharris ); 2515230557Sjimharris 2516230557Sjimharris if (this_device->has_ready_substate_machine) 2517230557Sjimharris { 2518230557Sjimharris sci_base_state_machine_start(&this_device->ready_substate_machine); 2519230557Sjimharris } 2520230557Sjimharris else 2521230557Sjimharris { 2522230557Sjimharris scic_cb_remote_device_ready(the_controller, this_device); 2523230557Sjimharris } 2524230557Sjimharris} 2525230557Sjimharris 2526230557Sjimharris/** 2527230557Sjimharris * This is the exit method for the SCI_BASE_REMOTE_DEVICE_STATE_READY it does 2528230557Sjimharris * nothing. 2529230557Sjimharris * 2530230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2531230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2532230557Sjimharris * 2533230557Sjimharris * @return none 2534230557Sjimharris */ 2535230557Sjimharrisstatic 2536230557Sjimharrisvoid scic_sds_remote_device_ready_state_exit( 2537230557Sjimharris SCI_BASE_OBJECT_T *object 2538230557Sjimharris) 2539230557Sjimharris{ 2540230557Sjimharris SCIC_SDS_CONTROLLER_T * the_controller; 2541230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T * this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2542230557Sjimharris 2543230557Sjimharris the_controller = scic_sds_remote_device_get_controller(this_device); 2544230557Sjimharris 2545230557Sjimharris if (this_device->has_ready_substate_machine) 2546230557Sjimharris { 2547230557Sjimharris sci_base_state_machine_stop(&this_device->ready_substate_machine); 2548230557Sjimharris } 2549230557Sjimharris else 2550230557Sjimharris { 2551230557Sjimharris scic_cb_remote_device_not_ready( 2552230557Sjimharris the_controller, 2553230557Sjimharris this_device, 2554230557Sjimharris SCIC_REMOTE_DEVICE_NOT_READY_STOP_REQUESTED 2555230557Sjimharris ); 2556230557Sjimharris } 2557230557Sjimharris} 2558230557Sjimharris 2559230557Sjimharris/** 2560230557Sjimharris * This is the enter method for the SCI_BASE_REMOTE_DEVICE_STATE_STOPPING it 2561230557Sjimharris * sets the stopping state handlers and posts an RNC invalidate request to the 2562230557Sjimharris * SCU hardware. 2563230557Sjimharris * 2564230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2565230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2566230557Sjimharris * 2567230557Sjimharris * @return none 2568230557Sjimharris */ 2569230557Sjimharrisstatic 2570230557Sjimharrisvoid scic_sds_remote_device_stopping_state_enter( 2571230557Sjimharris SCI_BASE_OBJECT_T *object 2572230557Sjimharris) 2573230557Sjimharris{ 2574230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2575230557Sjimharris 2576230557Sjimharris SET_STATE_HANDLER( 2577230557Sjimharris this_device, 2578230557Sjimharris scic_sds_remote_device_state_handler_table, 2579230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPING 2580230557Sjimharris ); 2581230557Sjimharris} 2582230557Sjimharris 2583230557Sjimharris/** 2584230557Sjimharris * This is the enter method for the SCI_BASE_REMOTE_DEVICE_STATE_FAILED it 2585230557Sjimharris * sets the stopping state handlers. 2586230557Sjimharris * 2587230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2588230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2589230557Sjimharris * 2590230557Sjimharris * @return none 2591230557Sjimharris */ 2592230557Sjimharrisstatic 2593230557Sjimharrisvoid scic_sds_remote_device_failed_state_enter( 2594230557Sjimharris SCI_BASE_OBJECT_T *object 2595230557Sjimharris) 2596230557Sjimharris{ 2597230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2598230557Sjimharris 2599230557Sjimharris SET_STATE_HANDLER( 2600230557Sjimharris this_device, 2601230557Sjimharris scic_sds_remote_device_state_handler_table, 2602230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_FAILED 2603230557Sjimharris ); 2604230557Sjimharris} 2605230557Sjimharris 2606230557Sjimharris/** 2607230557Sjimharris * This is the enter method for the SCI_BASE_REMOTE_DEVICE_STATE_RESETTING it 2608230557Sjimharris * sets the resetting state handlers. 2609230557Sjimharris * 2610230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2611230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2612230557Sjimharris * 2613230557Sjimharris * @return none 2614230557Sjimharris */ 2615230557Sjimharrisstatic 2616230557Sjimharrisvoid scic_sds_remote_device_resetting_state_enter( 2617230557Sjimharris SCI_BASE_OBJECT_T *object 2618230557Sjimharris) 2619230557Sjimharris{ 2620230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2621230557Sjimharris 2622230557Sjimharris SET_STATE_HANDLER( 2623230557Sjimharris this_device, 2624230557Sjimharris scic_sds_remote_device_state_handler_table, 2625230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_RESETTING 2626230557Sjimharris ); 2627230557Sjimharris 2628230557Sjimharris scic_sds_remote_node_context_suspend( 2629230557Sjimharris this_device->rnc, SCI_SOFTWARE_SUSPENSION, NULL, NULL); 2630230557Sjimharris} 2631230557Sjimharris 2632230557Sjimharris/** 2633230557Sjimharris * This is the exit method for the SCI_BASE_REMOTE_DEVICE_STATE_RESETTING it 2634230557Sjimharris * does nothing. 2635230557Sjimharris * 2636230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2637230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2638230557Sjimharris * 2639230557Sjimharris * @return none 2640230557Sjimharris */ 2641230557Sjimharrisstatic 2642230557Sjimharrisvoid scic_sds_remote_device_resetting_state_exit( 2643230557Sjimharris SCI_BASE_OBJECT_T *object 2644230557Sjimharris) 2645230557Sjimharris{ 2646230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2647230557Sjimharris 2648230557Sjimharris scic_sds_remote_node_context_resume(this_device->rnc, NULL, NULL); 2649230557Sjimharris} 2650230557Sjimharris 2651230557Sjimharris/** 2652230557Sjimharris * This is the enter method for the SCI_BASE_REMOTE_DEVICE_STATE_FINAL it sets 2653230557Sjimharris * the final state handlers. 2654230557Sjimharris * 2655230557Sjimharris * @param[in] object This is the SCI_BASE_OBJECT that is cast into a 2656230557Sjimharris * SCIC_SDS_REMOTE_DEVICE. 2657230557Sjimharris * 2658230557Sjimharris * @return none 2659230557Sjimharris */ 2660230557Sjimharrisstatic 2661230557Sjimharrisvoid scic_sds_remote_device_final_state_enter( 2662230557Sjimharris SCI_BASE_OBJECT_T *object 2663230557Sjimharris) 2664230557Sjimharris{ 2665230557Sjimharris SCIC_SDS_REMOTE_DEVICE_T *this_device = (SCIC_SDS_REMOTE_DEVICE_T *)object; 2666230557Sjimharris 2667230557Sjimharris SET_STATE_HANDLER( 2668230557Sjimharris this_device, 2669230557Sjimharris scic_sds_remote_device_state_handler_table, 2670230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_FINAL 2671230557Sjimharris ); 2672230557Sjimharris} 2673230557Sjimharris 2674230557Sjimharris// --------------------------------------------------------------------------- 2675230557Sjimharris 2676230557SjimharrisSCI_BASE_STATE_T 2677230557Sjimharris scic_sds_remote_device_state_table[SCI_BASE_REMOTE_DEVICE_MAX_STATES] = 2678230557Sjimharris{ 2679230557Sjimharris { 2680230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_INITIAL, 2681230557Sjimharris scic_sds_remote_device_initial_state_enter, 2682230557Sjimharris NULL 2683230557Sjimharris }, 2684230557Sjimharris { 2685230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPED, 2686230557Sjimharris scic_sds_remote_device_stopped_state_enter, 2687230557Sjimharris NULL 2688230557Sjimharris }, 2689230557Sjimharris { 2690230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STARTING, 2691230557Sjimharris scic_sds_remote_device_starting_state_enter, 2692230557Sjimharris NULL 2693230557Sjimharris }, 2694230557Sjimharris { 2695230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_READY, 2696230557Sjimharris scic_sds_remote_device_ready_state_enter, 2697230557Sjimharris scic_sds_remote_device_ready_state_exit 2698230557Sjimharris }, 2699230557Sjimharris { 2700230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_STOPPING, 2701230557Sjimharris scic_sds_remote_device_stopping_state_enter, 2702230557Sjimharris NULL 2703230557Sjimharris }, 2704230557Sjimharris { 2705230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_FAILED, 2706230557Sjimharris scic_sds_remote_device_failed_state_enter, 2707230557Sjimharris NULL 2708230557Sjimharris }, 2709230557Sjimharris { 2710230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_RESETTING, 2711230557Sjimharris scic_sds_remote_device_resetting_state_enter, 2712230557Sjimharris scic_sds_remote_device_resetting_state_exit 2713230557Sjimharris }, 2714230557Sjimharris#if !defined(DISABLE_WIDE_PORTED_TARGETS) 2715230557Sjimharris { //Not used by SCIC 2716230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_UPDATING_PORT_WIDTH, 2717230557Sjimharris NULL, 2718230557Sjimharris NULL 2719230557Sjimharris }, 2720230557Sjimharris#endif //#if !defined(DISABLE_WIDE_PORTED_TARGETS) 2721230557Sjimharris { 2722230557Sjimharris SCI_BASE_REMOTE_DEVICE_STATE_FINAL, 2723230557Sjimharris scic_sds_remote_device_final_state_enter, 2724230557Sjimharris NULL 2725230557Sjimharris } 2726230557Sjimharris}; 2727230557Sjimharris 2728