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$"); 55230557Sjimharris 56230557Sjimharris/** 57230557Sjimharris * @file 58230557Sjimharris * 59230557Sjimharris * @brief This file contains all of the state handler routines for each 60230557Sjimharris * of the domain states defined by the SCI_BASE_DOMAIN state 61230557Sjimharris * machine. 62230557Sjimharris * @note 63230557Sjimharris * - The discover method must be synchronized with the 64230557Sjimharris * controller's completion handler. The OS specific driver 65230557Sjimharris * component is responsible for ensuring this occurs. If the 66230557Sjimharris * discovery method is called from within the call 67230557Sjimharris * tree of the completion routine, then no action is necessary. 68230557Sjimharris */ 69230557Sjimharris 70230557Sjimharris 71230557Sjimharris#include <dev/isci/scil/scic_port.h> 72230557Sjimharris#include <dev/isci/scil/scic_io_request.h> 73230557Sjimharris#include <dev/isci/scil/scif_sas_logger.h> 74230557Sjimharris#include <dev/isci/scil/scif_sas_domain.h> 75230557Sjimharris 76230557Sjimharris//****************************************************************************** 77230557Sjimharris//* P R O T E C T E D M E T H O D S 78230557Sjimharris//****************************************************************************** 79230557Sjimharris 80230557Sjimharris//****************************************************************************** 81230557Sjimharris//* S T A R T I N G H A N D L E R S 82230557Sjimharris//****************************************************************************** 83230557Sjimharris 84230557Sjimharrisstatic 85230557SjimharrisSCI_STATUS scif_sas_domain_starting_port_ready_handler( 86230557Sjimharris SCI_BASE_DOMAIN_T * domain 87230557Sjimharris) 88230557Sjimharris{ 89230557Sjimharris SCIF_LOG_TRACE(( 90230557Sjimharris sci_base_object_get_logger(domain), 91230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY, 92230557Sjimharris "scif_sas_domain_starting_port_ready_handler(0x%x) enter\n", 93230557Sjimharris domain 94230557Sjimharris )); 95230557Sjimharris 96230557Sjimharris // The domain was previously completely stopped. Now that the port is 97230557Sjimharris // ready we can transition the domain to the ready state. 98230557Sjimharris sci_base_state_machine_change_state( 99230557Sjimharris &domain->state_machine, SCI_BASE_DOMAIN_STATE_READY 100230557Sjimharris ); 101230557Sjimharris 102230557Sjimharris return SCI_SUCCESS; 103230557Sjimharris} 104230557Sjimharris 105230557Sjimharris//****************************************************************************** 106230557Sjimharris//* R E A D Y H A N D L E R S 107230557Sjimharris//****************************************************************************** 108230557Sjimharris 109230557Sjimharris/** 110230557Sjimharris * @brief This method provides READY state specific handling for 111230557Sjimharris * when a user attempts to discover a domain. 112230557Sjimharris * 113230557Sjimharris * @param[in] domain This parameter specifies the domain object 114230557Sjimharris * on which the user is attempting to perform a discover 115230557Sjimharris * operation. 116230557Sjimharris * 117230557Sjimharris * @return This method returns an indication of whether the discover operation 118230557Sjimharris * succeeded. 119230557Sjimharris * @retval SCI_SUCCESSS This value is returned when the discover operation 120230557Sjimharris * begins successfully. 121230557Sjimharris */ 122230557Sjimharrisstatic 123230557SjimharrisSCI_STATUS scif_sas_domain_ready_discover_handler( 124230557Sjimharris SCI_BASE_DOMAIN_T * domain, 125230557Sjimharris U32 op_timeout, 126230557Sjimharris U32 device_timeout 127230557Sjimharris) 128230557Sjimharris{ 129230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *)domain; 130230557Sjimharris 131230557Sjimharris SCIF_LOG_TRACE(( 132230557Sjimharris sci_base_object_get_logger(domain), 133230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY, 134230557Sjimharris "scif_sas_domain_ready_discover_handler(0x%x, 0x%x, 0x%x) enter\n", 135230557Sjimharris domain, op_timeout, device_timeout 136230557Sjimharris )); 137230557Sjimharris 138230557Sjimharris fw_domain->operation.timeout = op_timeout; 139230557Sjimharris fw_domain->operation.device_timeout = device_timeout; 140230557Sjimharris fw_domain->operation.status = SCI_SUCCESS; 141230557Sjimharris 142230557Sjimharris scif_cb_timer_start( 143230557Sjimharris fw_domain->controller, 144230557Sjimharris fw_domain->operation.timer, 145230557Sjimharris fw_domain->operation.timeout 146230557Sjimharris ); 147230557Sjimharris 148230557Sjimharris scif_sas_domain_transition_to_discovering_state(fw_domain); 149230557Sjimharris 150230557Sjimharris return fw_domain->operation.status; 151230557Sjimharris} 152230557Sjimharris 153230557Sjimharris/** 154230557Sjimharris * @brief This method provides READY state processing for reception of a 155230557Sjimharris * port NOT ready notification from the core. 156230557Sjimharris * 157230557Sjimharris * @param[in] domain This parameter specifies the domain object 158230557Sjimharris * on which the core port has just come ready. 159230557Sjimharris * 160230557Sjimharris * @return 161230557Sjimharris */ 162230557Sjimharrisstatic 163230557SjimharrisSCI_STATUS scif_sas_domain_ready_port_not_ready_handler( 164230557Sjimharris SCI_BASE_DOMAIN_T * domain, 165230557Sjimharris U32 reason_code 166230557Sjimharris) 167230557Sjimharris{ 168230557Sjimharris SCIF_LOG_TRACE(( 169230557Sjimharris sci_base_object_get_logger(domain), 170230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY, 171230557Sjimharris "scif_sas_domain_ready_port_not_ready_handler(0x%x, 0x%x) enter\n", 172230557Sjimharris domain, 173230557Sjimharris reason_code 174230557Sjimharris )); 175230557Sjimharris 176230557Sjimharris if (reason_code != SCIC_PORT_NOT_READY_HARD_RESET_REQUESTED) 177230557Sjimharris { 178230557Sjimharris // Change to the STOPPING state to cause existing request 179230557Sjimharris // completions to be terminated and devices removed. 180230557Sjimharris sci_base_state_machine_change_state( 181230557Sjimharris &domain->state_machine, SCI_BASE_DOMAIN_STATE_STOPPING 182230557Sjimharris ); 183230557Sjimharris } 184230557Sjimharris 185230557Sjimharris return SCI_SUCCESS; 186230557Sjimharris} 187230557Sjimharris 188230557Sjimharris/** 189230557Sjimharris * @brief This method provides READY state specific handling for 190230557Sjimharris * when a user attempts to start an IO request. 191230557Sjimharris * 192230557Sjimharris * @param[in] domain This parameter specifies the domain object 193230557Sjimharris * on which the user is attempting to perform a start IO 194230557Sjimharris * operation. 195230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 196230557Sjimharris * object on which the user is attempting to perform a start IO 197230557Sjimharris * operation. 198230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 199230557Sjimharris * being started. 200230557Sjimharris * 201230557Sjimharris * @return This method returns an indication of whether the start IO 202230557Sjimharris * operation succeeded. 203230557Sjimharris * @retval SCI_SUCCESS This value is returned when the start IO operation 204230557Sjimharris * begins successfully. 205230557Sjimharris */ 206230557Sjimharrisstatic 207230557SjimharrisSCI_STATUS scif_sas_domain_ready_start_io_handler( 208230557Sjimharris SCI_BASE_DOMAIN_T * domain, 209230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 210230557Sjimharris SCI_BASE_REQUEST_T * io_request 211230557Sjimharris) 212230557Sjimharris{ 213230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T*) domain; 214230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 215230557Sjimharris remote_device; 216230557Sjimharris SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T*) io_request; 217230557Sjimharris SCI_STATUS status; 218230557Sjimharris 219230557Sjimharris SCIF_LOG_TRACE(( 220230557Sjimharris sci_base_object_get_logger(domain), 221230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 222230557Sjimharris "scif_sas_domain_ready_start_io_handler(0x%x, 0x%x, 0x%x) enter\n", 223230557Sjimharris domain, remote_device, io_request 224230557Sjimharris )); 225230557Sjimharris 226230557Sjimharris status = fw_device->state_handlers->parent.start_io_handler( 227230557Sjimharris &fw_device->parent, &fw_request->parent 228230557Sjimharris ); 229230557Sjimharris 230230557Sjimharris if (status == SCI_SUCCESS) 231230557Sjimharris { 232230557Sjimharris // Add the IO to the list of outstanding requests on the domain. 233230557Sjimharris sci_fast_list_insert_tail( 234230557Sjimharris &fw_domain->request_list, &fw_request->list_element 235230557Sjimharris ); 236230557Sjimharris } 237230557Sjimharris 238230557Sjimharris return status; 239230557Sjimharris} 240230557Sjimharris 241230557Sjimharris/** 242230557Sjimharris * @brief This method provides READY state specific handling for 243230557Sjimharris * when a user attempts to complete an IO request. 244230557Sjimharris * 245230557Sjimharris * @param[in] domain This parameter specifies the domain object 246230557Sjimharris * on which the user is attempting to perform a complete IO 247230557Sjimharris * operation. 248230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 249230557Sjimharris * object on which the user is attempting to perform a complete 250230557Sjimharris * IO operation. 251230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 252230557Sjimharris * being completed. 253230557Sjimharris * 254230557Sjimharris * @return This method returns an indication of whether the complete IO 255230557Sjimharris * operation succeeded. 256230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation 257230557Sjimharris * is successful. 258230557Sjimharris */ 259230557Sjimharrisstatic 260230557SjimharrisSCI_STATUS scif_sas_domain_ready_complete_io_handler( 261230557Sjimharris SCI_BASE_DOMAIN_T * domain, 262230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 263230557Sjimharris SCI_BASE_REQUEST_T * io_request 264230557Sjimharris) 265230557Sjimharris{ 266230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 267230557Sjimharris remote_device; 268230557Sjimharris SCIF_SAS_REQUEST_T * fw_request= (SCIF_SAS_REQUEST_T*) io_request; 269230557Sjimharris 270230557Sjimharris SCIF_LOG_TRACE(( 271230557Sjimharris sci_base_object_get_logger(domain), 272230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 273230557Sjimharris "scif_sas_domain_ready_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n", 274230557Sjimharris domain, remote_device, io_request 275230557Sjimharris )); 276230557Sjimharris 277230557Sjimharris // Remove the IO from the list of outstanding requests on the domain. 278230557Sjimharris sci_fast_list_remove_element(&fw_request->list_element); 279230557Sjimharris 280230557Sjimharris return fw_device->state_handlers->parent.complete_io_handler( 281230557Sjimharris &fw_device->parent, &fw_request->parent 282230557Sjimharris ); 283230557Sjimharris} 284230557Sjimharris 285230557Sjimharris/** 286230557Sjimharris * @brief This method provides READY state specific handling for 287230557Sjimharris * when a user attempts to continue an IO request. 288230557Sjimharris * 289230557Sjimharris * @param[in] domain This parameter specifies the domain object 290230557Sjimharris * on which the user is attempting to perform a continue IO 291230557Sjimharris * operation. 292230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 293230557Sjimharris * object on which the user is attempting to perform a start IO 294230557Sjimharris * operation. 295230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 296230557Sjimharris * being started. 297230557Sjimharris * 298230557Sjimharris * @return This method returns an indication of whether the continue IO 299230557Sjimharris * operation succeeded. 300230557Sjimharris * @retval SCI_SUCCESS This value is returned when the continue IO operation 301230557Sjimharris * begins successfully. 302230557Sjimharris */ 303230557Sjimharrisstatic 304230557SjimharrisSCI_STATUS scif_sas_domain_ready_continue_io_handler( 305230557Sjimharris SCI_BASE_DOMAIN_T * domain, 306230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 307230557Sjimharris SCI_BASE_REQUEST_T * io_request 308230557Sjimharris) 309230557Sjimharris{ 310230557Sjimharris SCIF_LOG_TRACE(( 311230557Sjimharris sci_base_object_get_logger(domain), 312230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 313230557Sjimharris "scif_sas_domain_ready_continue_io_handler(0x%x, 0x%x, 0x%x) enter\n", 314230557Sjimharris domain, remote_device, io_request 315230557Sjimharris )); 316230557Sjimharris 317230557Sjimharris /// @todo fix return code handling. 318230557Sjimharris return SCI_FAILURE; 319230557Sjimharris} 320230557Sjimharris 321230557Sjimharris/** 322230557Sjimharris * @brief This method provides READY state specific handling for 323230557Sjimharris * when a user attempts to start a task request. 324230557Sjimharris * 325230557Sjimharris * @param[in] domain This parameter specifies the domain object 326230557Sjimharris * on which the user is attempting to perform a start task 327230557Sjimharris * operation. 328230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 329230557Sjimharris * object on which the user is attempting to perform a start IO 330230557Sjimharris * operation. 331230557Sjimharris * @param[in] task_request This parameter specifies the task request that 332230557Sjimharris * is being started. 333230557Sjimharris * 334230557Sjimharris * @return This method returns an indication of whether the start task 335230557Sjimharris * operation succeeded. 336230557Sjimharris * @retval SCI_SUCCESS This value is returned when the start task operation 337230557Sjimharris * begins successfully. 338230557Sjimharris */ 339230557Sjimharrisstatic 340230557SjimharrisSCI_STATUS scif_sas_domain_ready_start_task_handler( 341230557Sjimharris SCI_BASE_DOMAIN_T * domain, 342230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 343230557Sjimharris SCI_BASE_REQUEST_T * task_request 344230557Sjimharris) 345230557Sjimharris{ 346230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T*) domain; 347230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 348230557Sjimharris remote_device; 349230557Sjimharris SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T*) task_request; 350230557Sjimharris SCI_STATUS status; 351230557Sjimharris 352230557Sjimharris SCIF_LOG_TRACE(( 353230557Sjimharris sci_base_object_get_logger(domain), 354230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_TASK_MANAGEMENT, 355230557Sjimharris "scif_sas_domain_ready_start_task_handler(0x%x, 0x%x, 0x%x) enter\n", 356230557Sjimharris domain, remote_device, task_request 357230557Sjimharris )); 358230557Sjimharris 359230557Sjimharris status = fw_device->state_handlers->parent.start_task_handler( 360230557Sjimharris &fw_device->parent, &fw_request->parent 361230557Sjimharris ); 362230557Sjimharris 363230557Sjimharris if (status == SCI_SUCCESS) 364230557Sjimharris { 365230557Sjimharris // Add the task to the list of outstanding requests on the domain. 366230557Sjimharris sci_fast_list_insert_tail( 367230557Sjimharris &fw_domain->request_list, &fw_request->list_element 368230557Sjimharris ); 369230557Sjimharris } 370230557Sjimharris 371230557Sjimharris return status; 372230557Sjimharris} 373230557Sjimharris 374230557Sjimharris/** 375230557Sjimharris * @brief This method provides READY state specific handling for 376230557Sjimharris * when a user attempts to complete a task request. 377230557Sjimharris * 378230557Sjimharris * @param[in] domain This parameter specifies the domain object 379230557Sjimharris * on which the user is attempting to perform a complete task 380230557Sjimharris * operation. 381230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 382230557Sjimharris * object on which the user is attempting to perform a start IO 383230557Sjimharris * operation. 384230557Sjimharris * @param[in] task_request This parameter specifies the task request that 385230557Sjimharris * is being started. 386230557Sjimharris * 387230557Sjimharris * @return This method returns an indication of whether the complete task 388230557Sjimharris * operation succeeded. 389230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete task operation 390230557Sjimharris * begins successfully. 391230557Sjimharris */ 392230557Sjimharrisstatic 393230557SjimharrisSCI_STATUS scif_sas_domain_ready_complete_task_handler( 394230557Sjimharris SCI_BASE_DOMAIN_T * domain, 395230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 396230557Sjimharris SCI_BASE_REQUEST_T * task_request 397230557Sjimharris) 398230557Sjimharris{ 399230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 400230557Sjimharris remote_device; 401230557Sjimharris SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T*) task_request; 402230557Sjimharris 403230557Sjimharris SCIF_LOG_TRACE(( 404230557Sjimharris sci_base_object_get_logger(domain), 405230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_TASK_MANAGEMENT, 406230557Sjimharris "scif_sas_domain_ready_complete_task_handler(0x%x, 0x%x, 0x%x) enter\n", 407230557Sjimharris domain, remote_device, task_request 408230557Sjimharris )); 409230557Sjimharris 410230557Sjimharris // Remove the IO from the list of outstanding requests on the domain. 411230557Sjimharris sci_fast_list_remove_element(&fw_request->list_element); 412230557Sjimharris 413230557Sjimharris return fw_device->state_handlers->parent.complete_task_handler( 414230557Sjimharris &fw_device->parent, &fw_request->parent 415230557Sjimharris ); 416230557Sjimharris} 417230557Sjimharris 418230557Sjimharris 419230557Sjimharris/** 420230557Sjimharris * @brief This method provides READY state specific handling for when a user 421230557Sjimharris * attempts to start a high priority IO request. 422230557Sjimharris * 423230557Sjimharris * @param[in] domain This parameter specifies the domain object 424230557Sjimharris * on which the user is attempting to perform a start high priority 425230557Sjimharris * IO operation (which is exclusively for Phy Control hard reset). 426230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 427230557Sjimharris * object on which the user is attempting to perform a start 428230557Sjimharris * high priority IO operation. 429230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 430230557Sjimharris * being started. 431230557Sjimharris * 432230557Sjimharris * @return This method returns an indication of whether the start IO 433230557Sjimharris * operation succeeded. 434230557Sjimharris * @retval SCI_SUCCESS This value is returned when the start IO operation 435230557Sjimharris * begins successfully. 436230557Sjimharris */ 437230557Sjimharrisstatic 438230557SjimharrisSCI_STATUS scif_sas_domain_ready_start_high_priority_io_handler( 439230557Sjimharris SCI_BASE_DOMAIN_T * domain, 440230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 441230557Sjimharris SCI_BASE_REQUEST_T * io_request 442230557Sjimharris) 443230557Sjimharris{ 444230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T*) domain; 445230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 446230557Sjimharris remote_device; 447230557Sjimharris SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T*) io_request; 448230557Sjimharris SCI_STATUS status; 449230557Sjimharris 450230557Sjimharris SCIF_LOG_TRACE(( 451230557Sjimharris sci_base_object_get_logger(domain), 452230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 453230557Sjimharris "scif_sas_domain_ready_start_high_priority_request_handler(0x%x, 0x%x, 0x%x) enter\n", 454230557Sjimharris domain, remote_device, io_request 455230557Sjimharris )); 456230557Sjimharris 457230557Sjimharris status = fw_device->state_handlers->start_high_priority_io_handler( 458230557Sjimharris &fw_device->parent, &fw_request->parent 459230557Sjimharris ); 460230557Sjimharris 461230557Sjimharris if (status == SCI_SUCCESS) 462230557Sjimharris { 463230557Sjimharris // Add the IO to the list of outstanding requests on the domain. 464230557Sjimharris 465230557Sjimharris // When domain is in READY state, this high priority io is likely 466230557Sjimharris // a smp Phy Control or Discover request sent to parent device of 467230557Sjimharris // a target device, which is to be Target Reset. This high priority 468230557Sjimharris // IO's probably has already been added to the domain's list as a 469230557Sjimharris // SCIF_SAS_TASK_REQUEST. We need to check if it is already on the 470230557Sjimharris // list. 471230557Sjimharris 472230557Sjimharris if ( ! sci_fast_list_is_on_this_list( 473230557Sjimharris &fw_domain->request_list, &fw_request->list_element)) 474230557Sjimharris 475230557Sjimharris sci_fast_list_insert_tail( 476230557Sjimharris &fw_domain->request_list, &fw_request->list_element 477230557Sjimharris ); 478230557Sjimharris } 479230557Sjimharris 480230557Sjimharris return status; 481230557Sjimharris} 482230557Sjimharris 483230557Sjimharris 484230557Sjimharris/** 485230557Sjimharris * @brief This method provides READY state specific handling for 486230557Sjimharris * when a user attempts to complete an high priroity IO request. 487230557Sjimharris * 488230557Sjimharris * @param[in] domain This parameter specifies the domain object 489230557Sjimharris * on which the user is attempting to perform a complete high 490230557Sjimharris * priority IO operation (which is exclusively for Phy Control 491230557Sjimharris * hard reset). 492230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 493230557Sjimharris * object on which the user is attempting to perform a complete 494230557Sjimharris * IO operation. 495230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 496230557Sjimharris * being completed. 497230557Sjimharris * 498230557Sjimharris * @return This method returns an indication of whether the complete IO 499230557Sjimharris * operation succeeded. 500230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation 501230557Sjimharris * is successful. 502230557Sjimharris */ 503230557Sjimharrisstatic 504230557SjimharrisSCI_STATUS scif_sas_domain_ready_complete_high_priority_io_handler( 505230557Sjimharris SCI_BASE_DOMAIN_T * domain, 506230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 507230557Sjimharris SCI_BASE_REQUEST_T * io_request, 508230557Sjimharris void * response_data, 509230557Sjimharris SCI_IO_STATUS completion_status 510230557Sjimharris) 511230557Sjimharris{ 512230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 513230557Sjimharris remote_device; 514230557Sjimharris SCIF_SAS_REQUEST_T * fw_request= (SCIF_SAS_REQUEST_T*) io_request; 515230557Sjimharris 516230557Sjimharris SCIC_TRANSPORT_PROTOCOL protocol; 517230557Sjimharris 518230557Sjimharris SCIF_LOG_TRACE(( 519230557Sjimharris sci_base_object_get_logger(domain), 520230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 521230557Sjimharris "scif_sas_domain_ready_complete_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n", 522230557Sjimharris domain, remote_device, io_request, response_data 523230557Sjimharris )); 524230557Sjimharris 525230557Sjimharris protocol = scic_io_request_get_protocol(fw_request->core_object); 526230557Sjimharris 527230557Sjimharris // If the request is an SMP HARD/LINK RESET request, then the request 528230557Sjimharris // came through the task management path (partially). As a result, 529230557Sjimharris // the accounting for the request is managed in the task request 530230557Sjimharris // completion path. Thus, only change the domain request counter if 531230557Sjimharris // the request is not an SMP target reset of some sort. 532230557Sjimharris if ( 533230557Sjimharris (protocol != SCIC_SMP_PROTOCOL) 534230557Sjimharris || (fw_device->protocol_device.smp_device.current_activity != 535230557Sjimharris SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_TARGET_RESET) 536230557Sjimharris ) 537230557Sjimharris { 538230557Sjimharris sci_fast_list_remove_element(&fw_request->list_element); 539230557Sjimharris } 540230557Sjimharris 541230557Sjimharris return fw_device->state_handlers->complete_high_priority_io_handler( 542230557Sjimharris &fw_device->parent, &fw_request->parent, response_data, completion_status 543230557Sjimharris ); 544230557Sjimharris} 545230557Sjimharris 546230557Sjimharris//****************************************************************************** 547230557Sjimharris//* S T O P P I N G H A N D L E R S 548230557Sjimharris//****************************************************************************** 549230557Sjimharris 550230557Sjimharrisstatic 551230557SjimharrisSCI_STATUS scif_sas_domain_stopping_device_stop_complete_handler( 552230557Sjimharris SCI_BASE_DOMAIN_T * domain, 553230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device 554230557Sjimharris) 555230557Sjimharris{ 556230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *) domain; 557230557Sjimharris 558230557Sjimharris SCIF_LOG_TRACE(( 559230557Sjimharris sci_base_object_get_logger(domain), 560230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 561230557Sjimharris "scif_sas_domain_stopping_device_stop_complete_handler(0x%x, 0x%x) enter\n", 562230557Sjimharris domain, remote_device 563230557Sjimharris )); 564230557Sjimharris 565230557Sjimharris // Attempt to transition to the stopped state. 566230557Sjimharris scif_sas_domain_transition_to_stopped_state(fw_domain); 567230557Sjimharris 568230557Sjimharris return SCI_SUCCESS; 569230557Sjimharris} 570230557Sjimharris 571230557Sjimharris/** 572230557Sjimharris * @brief This method provides STOPPING state specific handling for 573230557Sjimharris * when a user attempts to complete an IO request. 574230557Sjimharris * 575230557Sjimharris * @param[in] domain This parameter specifies the domain object 576230557Sjimharris * on which the user is attempting to perform a complete IO 577230557Sjimharris * operation. 578230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 579230557Sjimharris * object on which the user is attempting to perform a complete 580230557Sjimharris * IO operation. 581230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 582230557Sjimharris * being completed. 583230557Sjimharris * 584230557Sjimharris * @return This method returns an indication of whether the complete IO 585230557Sjimharris * operation succeeded. 586230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation 587230557Sjimharris * is successful. 588230557Sjimharris */ 589230557Sjimharrisstatic 590230557SjimharrisSCI_STATUS scif_sas_domain_stopping_complete_io_handler( 591230557Sjimharris SCI_BASE_DOMAIN_T * domain, 592230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 593230557Sjimharris SCI_BASE_REQUEST_T * io_request 594230557Sjimharris) 595230557Sjimharris{ 596230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *) domain; 597230557Sjimharris SCI_STATUS status; 598230557Sjimharris 599230557Sjimharris SCIF_LOG_TRACE(( 600230557Sjimharris sci_base_object_get_logger(domain), 601230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 602230557Sjimharris "scif_sas_domain_stopping_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n", 603230557Sjimharris domain, remote_device, io_request 604230557Sjimharris )); 605230557Sjimharris 606230557Sjimharris status = scif_sas_domain_ready_complete_io_handler( 607230557Sjimharris domain, remote_device, io_request 608230557Sjimharris ); 609230557Sjimharris 610230557Sjimharris // Attempt to transition to the stopped state. 611230557Sjimharris scif_sas_domain_transition_to_stopped_state(fw_domain); 612230557Sjimharris 613230557Sjimharris return status; 614230557Sjimharris} 615230557Sjimharris 616230557Sjimharris 617230557Sjimharris/** 618230557Sjimharris * @brief This method provides STOPPING state specific handling for 619230557Sjimharris * when a user attempts to complete an IO request. 620230557Sjimharris * 621230557Sjimharris * @param[in] domain This parameter specifies the domain object 622230557Sjimharris * on which the user is attempting to perform a complete IO 623230557Sjimharris * operation. 624230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 625230557Sjimharris * object on which the user is attempting to perform a complete 626230557Sjimharris * IO operation. 627230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 628230557Sjimharris * being completed. 629230557Sjimharris * 630230557Sjimharris * @return This method returns an indication of whether the complete IO 631230557Sjimharris * operation succeeded. 632230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation 633230557Sjimharris * is successful. 634230557Sjimharris */ 635230557Sjimharrisstatic 636230557SjimharrisSCI_STATUS scif_sas_domain_stopping_complete_high_priority_io_handler( 637230557Sjimharris SCI_BASE_DOMAIN_T * domain, 638230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 639230557Sjimharris SCI_BASE_REQUEST_T * io_request, 640230557Sjimharris void * response_data, 641230557Sjimharris SCI_IO_STATUS completion_status 642230557Sjimharris) 643230557Sjimharris{ 644230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *) domain; 645230557Sjimharris SCI_STATUS status; 646230557Sjimharris 647230557Sjimharris SCIF_LOG_TRACE(( 648230557Sjimharris sci_base_object_get_logger(domain), 649230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 650230557Sjimharris "scif_sas_domain_stopping_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n", 651230557Sjimharris domain, remote_device, io_request 652230557Sjimharris )); 653230557Sjimharris 654230557Sjimharris status = scif_sas_domain_ready_complete_high_priority_io_handler( 655230557Sjimharris domain, remote_device, io_request, response_data, completion_status 656230557Sjimharris ); 657230557Sjimharris 658230557Sjimharris // Attempt to transition to the stopped state. 659230557Sjimharris scif_sas_domain_transition_to_stopped_state(fw_domain); 660230557Sjimharris 661230557Sjimharris return status; 662230557Sjimharris} 663230557Sjimharris 664230557Sjimharris 665230557Sjimharris/** 666230557Sjimharris * @brief This method provides STOPPING state specific handling for 667230557Sjimharris * when a user attempts to complete a task request. 668230557Sjimharris * 669230557Sjimharris * @param[in] domain This parameter specifies the domain object 670230557Sjimharris * on which the user is attempting to perform a complete task 671230557Sjimharris * operation. 672230557Sjimharris * 673230557Sjimharris * @return This method returns an indication of whether the complete task 674230557Sjimharris * operation succeeded. 675230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete task operation 676230557Sjimharris * begins successfully. 677230557Sjimharris */ 678230557Sjimharrisstatic 679230557SjimharrisSCI_STATUS scif_sas_domain_stopping_complete_task_handler( 680230557Sjimharris SCI_BASE_DOMAIN_T * domain, 681230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 682230557Sjimharris SCI_BASE_REQUEST_T * task_request 683230557Sjimharris) 684230557Sjimharris{ 685230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *) domain; 686230557Sjimharris SCI_STATUS status; 687230557Sjimharris 688230557Sjimharris SCIF_LOG_TRACE(( 689230557Sjimharris sci_base_object_get_logger(domain), 690230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_TASK_MANAGEMENT, 691230557Sjimharris "scif_sas_domain_stopping_complete_task_handler(0x%x, 0x%x, 0x%x) enter\n", 692230557Sjimharris domain, remote_device, task_request 693230557Sjimharris )); 694230557Sjimharris 695230557Sjimharris status = scif_sas_domain_ready_complete_task_handler( 696230557Sjimharris domain, remote_device, task_request 697230557Sjimharris ); 698230557Sjimharris 699230557Sjimharris // Attempt to transition to the stopped state. 700230557Sjimharris scif_sas_domain_transition_to_stopped_state(fw_domain); 701230557Sjimharris 702230557Sjimharris return SCI_SUCCESS; 703230557Sjimharris} 704230557Sjimharris 705230557Sjimharris//****************************************************************************** 706230557Sjimharris//* D I S C O V E R I N G H A N D L E R S 707230557Sjimharris//****************************************************************************** 708230557Sjimharris 709230557Sjimharris/** 710230557Sjimharris * @brief This method provides DISCOVERING state specific processing for 711230557Sjimharris * reception of a port NOT ready notification from the core. A port 712230557Sjimharris * NOT ready notification forces the discovery operation to complete 713230557Sjimharris * in error. Additionally, all IOs are aborted and devices removed. 714230557Sjimharris * 715230557Sjimharris * @param[in] domain This parameter specifies the domain object 716230557Sjimharris * for which the core port is no longer ready. 717230557Sjimharris * 718230557Sjimharris * @return 719230557Sjimharris */ 720230557Sjimharrisstatic 721230557SjimharrisSCI_STATUS scif_sas_domain_discovering_port_not_ready_handler( 722230557Sjimharris SCI_BASE_DOMAIN_T * domain, 723230557Sjimharris U32 reason_code 724230557Sjimharris) 725230557Sjimharris{ 726230557Sjimharris SCIF_LOG_TRACE(( 727230557Sjimharris sci_base_object_get_logger(domain), 728230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY, 729230557Sjimharris "scif_sas_domain_discovering_port_not_ready_handler(0x%x, 0x%x) enter\n", 730230557Sjimharris domain, 731230557Sjimharris reason_code 732230557Sjimharris )); 733230557Sjimharris 734230557Sjimharris // Change to the STOPPING state to cause existing request 735230557Sjimharris // completions to be terminated and devices removed. 736230557Sjimharris sci_base_state_machine_change_state( 737230557Sjimharris &domain->state_machine, SCI_BASE_DOMAIN_STATE_STOPPING 738230557Sjimharris ); 739230557Sjimharris 740230557Sjimharris return SCI_SUCCESS; 741230557Sjimharris} 742230557Sjimharris 743230557Sjimharrisstatic 744230557SjimharrisSCI_STATUS scif_sas_domain_discovering_device_start_complete_handler( 745230557Sjimharris SCI_BASE_DOMAIN_T * domain, 746230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device 747230557Sjimharris) 748230557Sjimharris{ 749230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *)domain; 750230557Sjimharris 751230557Sjimharris SCIF_LOG_TRACE(( 752230557Sjimharris sci_base_object_get_logger(domain), 753230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY, 754230557Sjimharris "scif_sas_domain_discovering_device_start_complete_handler(0x%x) enter\n", 755230557Sjimharris domain, remote_device 756230557Sjimharris )); 757230557Sjimharris 758230557Sjimharris //domain will decide what's next step. 759230557Sjimharris scif_sas_domain_continue_discover(fw_domain); 760230557Sjimharris 761230557Sjimharris return SCI_SUCCESS; 762230557Sjimharris} 763230557Sjimharris 764230557Sjimharris// --------------------------------------------------------------------------- 765230557Sjimharris 766230557Sjimharrisstatic 767230557SjimharrisSCI_STATUS scif_sas_domain_discovering_device_stop_complete_handler( 768230557Sjimharris SCI_BASE_DOMAIN_T * domain, 769230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device 770230557Sjimharris) 771230557Sjimharris{ 772230557Sjimharris SCIF_LOG_TRACE(( 773230557Sjimharris sci_base_object_get_logger(domain), 774230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY, 775230557Sjimharris "scif_sas_domain_discovering_device_stop_complete_handler(0x%x) enter\n", 776230557Sjimharris domain, remote_device 777230557Sjimharris )); 778230557Sjimharris 779230557Sjimharris return SCI_FAILURE; 780230557Sjimharris} 781230557Sjimharris 782230557Sjimharris 783230557Sjimharris/** 784230557Sjimharris * @brief This method provides DISCOVERING state specific handling for when a user 785230557Sjimharris * attempts to start a high priority IO request. 786230557Sjimharris * 787230557Sjimharris * @param[in] domain This parameter specifies the domain object 788230557Sjimharris * on which the user is attempting to perform a start IO 789230557Sjimharris * operation. 790230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 791230557Sjimharris * object on which the user is attempting to perform a start IO 792230557Sjimharris * operation. 793230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 794230557Sjimharris * being started. 795230557Sjimharris * 796230557Sjimharris * @return This method returns an indication of whether the start IO 797230557Sjimharris * operation succeeded. 798230557Sjimharris * @retval SCI_SUCCESS This value is returned when the start IO operation 799230557Sjimharris * begins successfully. 800230557Sjimharris */ 801230557Sjimharrisstatic 802230557SjimharrisSCI_STATUS scif_sas_domain_discovering_start_high_priority_io_handler( 803230557Sjimharris SCI_BASE_DOMAIN_T * domain, 804230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 805230557Sjimharris SCI_BASE_REQUEST_T * io_request 806230557Sjimharris) 807230557Sjimharris{ 808230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T*) domain; 809230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 810230557Sjimharris remote_device; 811230557Sjimharris SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T*) io_request; 812230557Sjimharris SCI_STATUS status; 813230557Sjimharris 814230557Sjimharris SCIF_LOG_TRACE(( 815230557Sjimharris sci_base_object_get_logger(domain), 816230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 817230557Sjimharris "scif_sas_domain_discovery_start_high_priority_request_handler(0x%x, 0x%x, 0x%x) enter\n", 818230557Sjimharris domain, remote_device, io_request 819230557Sjimharris )); 820230557Sjimharris 821230557Sjimharris status = fw_device->state_handlers->start_high_priority_io_handler( 822230557Sjimharris &fw_device->parent, &fw_request->parent 823230557Sjimharris ); 824230557Sjimharris 825230557Sjimharris if (status == SCI_SUCCESS) 826230557Sjimharris { 827230557Sjimharris // Add the IO to the list of outstanding requests on the domain. 828230557Sjimharris 829230557Sjimharris // It is possible this high priority IO's has already been added to 830230557Sjimharris // the domain's list as a SCIF_SAS_TASK_REQUEST. We need to check 831230557Sjimharris // if it is already on the list. 832230557Sjimharris if ( ! sci_fast_list_is_on_this_list( 833230557Sjimharris &fw_domain->request_list, &fw_request->list_element)) 834230557Sjimharris 835230557Sjimharris sci_fast_list_insert_tail( 836230557Sjimharris &fw_domain->request_list, &fw_request->list_element 837230557Sjimharris ); 838230557Sjimharris } 839230557Sjimharris 840230557Sjimharris return status; 841230557Sjimharris} 842230557Sjimharris 843230557Sjimharris 844230557Sjimharris/** 845230557Sjimharris * @brief This method provides DISCOVERING state specific handling for 846230557Sjimharris * when a user attempts to complete an IO request. User IOs are 847230557Sjimharris * allowed to be completed during discovery. 848230557Sjimharris * 849230557Sjimharris * @param[in] domain This parameter specifies the domain object 850230557Sjimharris * on which the user is attempting to perform a complete IO 851230557Sjimharris * operation. 852230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 853230557Sjimharris * object on which the user is attempting to perform a complete 854230557Sjimharris * IO operation. 855230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 856230557Sjimharris * being completed. 857230557Sjimharris * 858230557Sjimharris * @return This method returns an indication of whether the complete IO 859230557Sjimharris * operation succeeded. 860230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation 861230557Sjimharris * is successful. 862230557Sjimharris */ 863230557Sjimharrisstatic 864230557SjimharrisSCI_STATUS scif_sas_domain_discovering_complete_io_handler( 865230557Sjimharris SCI_BASE_DOMAIN_T * domain, 866230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 867230557Sjimharris SCI_BASE_REQUEST_T * io_request 868230557Sjimharris) 869230557Sjimharris{ 870230557Sjimharris SCIF_LOG_TRACE(( 871230557Sjimharris sci_base_object_get_logger(domain), 872230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 873230557Sjimharris "scif_sas_domain_discovering_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n", 874230557Sjimharris domain, remote_device, io_request 875230557Sjimharris )); 876230557Sjimharris 877230557Sjimharris return scif_sas_domain_ready_complete_io_handler( 878230557Sjimharris domain, remote_device, io_request 879230557Sjimharris ); 880230557Sjimharris} 881230557Sjimharris 882230557Sjimharris/** 883230557Sjimharris * @brief This method provides DISCOVERING state specific handling for 884230557Sjimharris * when a user attempts to complete an high priroity IO request. User 885230557Sjimharris * IOs are allowed to be completed during discovery. 886230557Sjimharris * 887230557Sjimharris * @param[in] domain This parameter specifies the domain object 888230557Sjimharris * on which the user is attempting to perform a complete IO 889230557Sjimharris * operation. 890230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 891230557Sjimharris * object on which the user is attempting to perform a complete 892230557Sjimharris * IO operation. 893230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 894230557Sjimharris * being completed. 895230557Sjimharris * 896230557Sjimharris * @return This method returns an indication of whether the complete IO 897230557Sjimharris * operation succeeded. 898230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete IO operation 899230557Sjimharris * is successful. 900230557Sjimharris */ 901230557Sjimharrisstatic 902230557SjimharrisSCI_STATUS scif_sas_domain_discovering_complete_high_priority_io_handler( 903230557Sjimharris SCI_BASE_DOMAIN_T * domain, 904230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 905230557Sjimharris SCI_BASE_REQUEST_T * io_request, 906230557Sjimharris void * response_data, 907230557Sjimharris SCI_IO_STATUS completion_status 908230557Sjimharris) 909230557Sjimharris{ 910230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 911230557Sjimharris remote_device; 912230557Sjimharris SCIF_SAS_REQUEST_T * fw_request= (SCIF_SAS_REQUEST_T*) io_request; 913230557Sjimharris 914230557Sjimharris SCIC_TRANSPORT_PROTOCOL protocol; 915230557Sjimharris 916230557Sjimharris SCIF_LOG_TRACE(( 917230557Sjimharris sci_base_object_get_logger(domain), 918230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 919230557Sjimharris "scif_sas_domain_discovering_complete_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n", 920230557Sjimharris domain, remote_device, io_request, response_data 921230557Sjimharris )); 922230557Sjimharris 923230557Sjimharris protocol = scic_io_request_get_protocol(fw_request->core_object); 924230557Sjimharris 925230557Sjimharris // Remove the IO from the list of outstanding requests on the domain. 926230557Sjimharris 927230557Sjimharris // If the request is an SMP HARD/LINK RESET request, then the request 928230557Sjimharris // came through the task management path (partially). As a result, 929230557Sjimharris // the accounting for the request is managed in the task request 930230557Sjimharris // completion path. Thus, only change the domain request counter if 931230557Sjimharris // the request is not an SMP target reset of some sort. 932230557Sjimharris if ( 933230557Sjimharris (protocol != SCIC_SMP_PROTOCOL) 934230557Sjimharris || (fw_device->protocol_device.smp_device.current_activity != 935230557Sjimharris SCIF_SAS_SMP_REMOTE_DEVICE_ACTIVITY_TARGET_RESET) 936230557Sjimharris ) 937230557Sjimharris { 938230557Sjimharris sci_fast_list_remove_element(&fw_request->list_element); 939230557Sjimharris } 940230557Sjimharris 941230557Sjimharris return fw_device->state_handlers->complete_high_priority_io_handler( 942230557Sjimharris &fw_device->parent, &fw_request->parent, response_data, completion_status 943230557Sjimharris ); 944230557Sjimharris} 945230557Sjimharris 946230557Sjimharris 947230557Sjimharris/** 948230557Sjimharris * @brief This method provides DISCOVERING state specific handling for 949230557Sjimharris * when the framework attempts to complete an IO request. Internal 950230557Sjimharris * Framework IOs allowed to be continued during discovery. 951230557Sjimharris * 952230557Sjimharris * @param[in] domain This parameter specifies the domain object 953230557Sjimharris * on which the user is attempting to perform a continue IO 954230557Sjimharris * operation. 955230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 956230557Sjimharris * object on which the user is attempting to perform a continue 957230557Sjimharris * IO operation. 958230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 959230557Sjimharris * being continued. 960230557Sjimharris * 961230557Sjimharris * @return This method returns an indication of whether the continue IO 962230557Sjimharris * operation succeeded. 963230557Sjimharris * @retval SCI_SUCCESS This value is returned when the continue IO operation 964230557Sjimharris * is successful. 965230557Sjimharris */ 966230557Sjimharrisstatic 967230557SjimharrisSCI_STATUS scif_sas_domain_discovering_continue_io_handler( 968230557Sjimharris SCI_BASE_DOMAIN_T * domain, 969230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 970230557Sjimharris SCI_BASE_REQUEST_T * io_request 971230557Sjimharris) 972230557Sjimharris{ 973230557Sjimharris SCIF_LOG_TRACE(( 974230557Sjimharris sci_base_object_get_logger(domain), 975230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_IO_REQUEST, 976230557Sjimharris "scif_sas_domain_discovering_continue_io_handler(0x%x, 0x%x, 0x%x) enter\n", 977230557Sjimharris domain, remote_device, io_request 978230557Sjimharris )); 979230557Sjimharris 980230557Sjimharris /// @todo fix return code handling. 981230557Sjimharris return SCI_FAILURE; 982230557Sjimharris} 983230557Sjimharris 984230557Sjimharris 985230557Sjimharris/** 986230557Sjimharris * @brief This method provides handling when a user attempts to start 987230557Sjimharris * a task on a domain in DISCOVER state, only hard reset is allowed. 988230557Sjimharris * 989230557Sjimharris * @param[in] domain This parameter specifies the domain object 990230557Sjimharris * on which the user is attempting to perform a start task 991230557Sjimharris * operation. 992230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 993230557Sjimharris * object on which the user is attempting to perform a start IO 994230557Sjimharris * operation. 995230557Sjimharris * @param[in] task_request This parameter specifies the task request that 996230557Sjimharris * is being started. 997230557Sjimharris * 998230557Sjimharris * @return This method returns a status of start task operations 999230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is returned for any tasks, 1000230557Sjimharris * except for HARD RESET. 1001230557Sjimharris */ 1002230557Sjimharrisstatic 1003230557SjimharrisSCI_STATUS scif_sas_domain_discovering_start_task_handler( 1004230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1005230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 1006230557Sjimharris SCI_BASE_REQUEST_T * task_request 1007230557Sjimharris) 1008230557Sjimharris{ 1009230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 1010230557Sjimharris remote_device; 1011230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*)task_request; 1012230557Sjimharris 1013230557Sjimharris //Only let target reset go through. 1014230557Sjimharris if (scif_sas_task_request_get_function(fw_task) 1015230557Sjimharris == SCI_SAS_HARD_RESET) 1016230557Sjimharris { 1017230557Sjimharris //If the domain is in the middle of smp DISCOVER process, 1018230557Sjimharris //interrupt it. After target reset is done, resume the smp DISCOVERY. 1019230557Sjimharris scif_sas_domain_cancel_smp_activities(fw_device->domain); 1020230557Sjimharris 1021230557Sjimharris return scif_sas_domain_ready_start_task_handler(domain, remote_device, task_request); 1022230557Sjimharris } 1023230557Sjimharris else{ 1024230557Sjimharris SCIF_LOG_WARNING(( 1025230557Sjimharris sci_base_object_get_logger(domain), 1026230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1027230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x start task message invalid\n", 1028230557Sjimharris domain, remote_device, 1029230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1030230557Sjimharris )); 1031230557Sjimharris 1032230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1033230557Sjimharris } 1034230557Sjimharris} 1035230557Sjimharris 1036230557Sjimharris 1037230557Sjimharris/** 1038230557Sjimharris * @brief This method provides DISCOVERING state specific handling for 1039230557Sjimharris * when a user attempts to complete a task request. User task 1040230557Sjimharris * management requests are allowed to be completed during discovery. 1041230557Sjimharris * 1042230557Sjimharris * @param[in] domain This parameter specifies the domain object 1043230557Sjimharris * on which the user is attempting to perform a complete IO 1044230557Sjimharris * operation. 1045230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1046230557Sjimharris * object on which the user is attempting to perform a complete 1047230557Sjimharris * IO operation. 1048230557Sjimharris * @param[in] task_request This parameter specifies the task request that 1049230557Sjimharris * is being completed. 1050230557Sjimharris * 1051230557Sjimharris * @return This method returns an indication of whether the complete task 1052230557Sjimharris * management operation succeeded. 1053230557Sjimharris * @retval SCI_SUCCESS This value is returned when the complete task request 1054230557Sjimharris * is successful. 1055230557Sjimharris */ 1056230557Sjimharrisstatic 1057230557SjimharrisSCI_STATUS scif_sas_domain_discovering_complete_task_handler( 1058230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1059230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 1060230557Sjimharris SCI_BASE_REQUEST_T * task_request 1061230557Sjimharris) 1062230557Sjimharris{ 1063230557Sjimharris SCI_STATUS status; 1064230557Sjimharris 1065230557Sjimharris SCIF_LOG_TRACE(( 1066230557Sjimharris sci_base_object_get_logger(domain), 1067230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_TASK_MANAGEMENT, 1068230557Sjimharris "scif_sas_domain_discovering_complete_task_handler(0x%x, 0x%x, 0x%x) enter\n", 1069230557Sjimharris domain, remote_device, task_request 1070230557Sjimharris )); 1071230557Sjimharris 1072230557Sjimharris status = scif_sas_domain_ready_complete_task_handler( 1073230557Sjimharris domain, remote_device, task_request 1074230557Sjimharris ); 1075230557Sjimharris 1076230557Sjimharris return status; 1077230557Sjimharris} 1078230557Sjimharris 1079230557Sjimharris//****************************************************************************** 1080230557Sjimharris//* D E F A U L T H A N D L E R S 1081230557Sjimharris//****************************************************************************** 1082230557Sjimharris 1083230557Sjimharris/** 1084230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1085230557Sjimharris * when a user attempts to discover a domain and a discovery 1086230557Sjimharris * operation is not allowed. 1087230557Sjimharris * 1088230557Sjimharris * @param[in] domain This parameter specifies the domain object 1089230557Sjimharris * on which the user is attempting to perform an discover 1090230557Sjimharris * operation. 1091230557Sjimharris * @param[in] op_timeout This parameter specifies the timeout 1092230557Sjimharris * (in milliseconds) for the entire discovery operation. 1093230557Sjimharris * This timeout value should be some multiple of the 1094230557Sjimharris * individual device_timeout value. 1095230557Sjimharris * @param[in] device_timeout This parameter specifies the timeout 1096230557Sjimharris * (in milliseconds) for an individual device being discovered 1097230557Sjimharris * and configured during this operation. 1098230557Sjimharris * 1099230557Sjimharris * @return This method returns an indication that discovery operations 1100230557Sjimharris * are not allowed. 1101230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1102230557Sjimharris */ 1103230557Sjimharrisstatic 1104230557SjimharrisSCI_STATUS scif_sas_domain_default_discover_handler( 1105230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1106230557Sjimharris U32 op_timeout, 1107230557Sjimharris U32 device_timeout 1108230557Sjimharris) 1109230557Sjimharris{ 1110230557Sjimharris SCIF_LOG_WARNING(( 1111230557Sjimharris sci_base_object_get_logger((SCIF_SAS_DOMAIN_T *)domain), 1112230557Sjimharris SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY, 1113230557Sjimharris "Domain:0x%x State:0x%x requested to discover in invalid state\n", 1114230557Sjimharris domain, 1115230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1116230557Sjimharris )); 1117230557Sjimharris 1118230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1119230557Sjimharris} 1120230557Sjimharris 1121230557Sjimharris/** 1122230557Sjimharris * @brief This method provides default processing for reception of a port 1123230557Sjimharris * ready notification from the core. 1124230557Sjimharris * 1125230557Sjimharris * @param[in] domain This parameter specifies the domain object 1126230557Sjimharris * on which the core port has just come ready. 1127230557Sjimharris * 1128230557Sjimharris * @return 1129230557Sjimharris */ 1130230557Sjimharrisstatic 1131230557SjimharrisSCI_STATUS scif_sas_domain_default_port_ready_handler( 1132230557Sjimharris SCI_BASE_DOMAIN_T * domain 1133230557Sjimharris) 1134230557Sjimharris{ 1135230557Sjimharris SCIF_LOG_INFO(( 1136230557Sjimharris sci_base_object_get_logger(domain), 1137230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1138230557Sjimharris "Domain:0x%x State:0x%x port now ready\n", 1139230557Sjimharris domain, 1140230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1141230557Sjimharris )); 1142230557Sjimharris 1143230557Sjimharris return SCI_SUCCESS; 1144230557Sjimharris} 1145230557Sjimharris 1146230557Sjimharris/** 1147230557Sjimharris * @brief This method provides default processing for reception of a port 1148230557Sjimharris * NOT ready notification from the core. 1149230557Sjimharris * 1150230557Sjimharris * @param[in] domain This parameter specifies the domain object 1151230557Sjimharris * on which the core port has just come ready. 1152230557Sjimharris * 1153230557Sjimharris * @return 1154230557Sjimharris */ 1155230557Sjimharrisstatic 1156230557SjimharrisSCI_STATUS scif_sas_domain_default_port_not_ready_handler( 1157230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1158230557Sjimharris U32 reason_code 1159230557Sjimharris) 1160230557Sjimharris{ 1161230557Sjimharris SCIF_LOG_WARNING(( 1162230557Sjimharris sci_base_object_get_logger(domain), 1163230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1164230557Sjimharris "Domain:0x%x State:0x%x Port Not Ready 0x%x in invalid state\n", 1165230557Sjimharris domain, 1166230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine), 1167230557Sjimharris reason_code 1168230557Sjimharris )); 1169230557Sjimharris 1170230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1171230557Sjimharris} 1172230557Sjimharris 1173230557Sjimharris/** 1174230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1175230557Sjimharris * when a user attempts to start an IO on a domain and a start 1176230557Sjimharris * IO operation is not allowed. 1177230557Sjimharris * 1178230557Sjimharris * @param[in] domain This parameter specifies the domain object 1179230557Sjimharris * on which the user is attempting to perform a start IO 1180230557Sjimharris * operation. 1181230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1182230557Sjimharris * object on which the user is attempting to perform a start IO 1183230557Sjimharris * operation. 1184230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 1185230557Sjimharris * being started. 1186230557Sjimharris * 1187230557Sjimharris * @return This method returns an indication that start IO operations 1188230557Sjimharris * are not allowed. 1189230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1190230557Sjimharris */ 1191230557Sjimharrisstatic 1192230557SjimharrisSCI_STATUS scif_sas_domain_default_start_io_handler( 1193230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1194230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 1195230557Sjimharris SCI_BASE_REQUEST_T * io_request 1196230557Sjimharris) 1197230557Sjimharris{ 1198230557Sjimharris SCIF_LOG_WARNING(( 1199230557Sjimharris sci_base_object_get_logger(domain), 1200230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1201230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x start IO message invalid\n", 1202230557Sjimharris domain, remote_device, 1203230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1204230557Sjimharris )); 1205230557Sjimharris 1206230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1207230557Sjimharris} 1208230557Sjimharris 1209230557Sjimharris/** 1210230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1211230557Sjimharris * when a user attempts to complete an IO on a domain and a 1212230557Sjimharris * complete IO operation is not allowed. 1213230557Sjimharris * 1214230557Sjimharris * @param[in] domain This parameter specifies the domain object 1215230557Sjimharris * on which the user is attempting to perform a complete IO 1216230557Sjimharris * operation. 1217230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1218230557Sjimharris * object on which the user is attempting to perform a complete IO 1219230557Sjimharris * operation. 1220230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 1221230557Sjimharris * being completed. 1222230557Sjimharris * 1223230557Sjimharris * @return This method returns an indication that complete IO operations 1224230557Sjimharris * are not allowed. 1225230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1226230557Sjimharris */ 1227230557Sjimharrisstatic 1228230557SjimharrisSCI_STATUS scif_sas_domain_default_complete_io_handler( 1229230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1230230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 1231230557Sjimharris SCI_BASE_REQUEST_T * io_request 1232230557Sjimharris) 1233230557Sjimharris{ 1234230557Sjimharris SCIF_LOG_WARNING(( 1235230557Sjimharris sci_base_object_get_logger(domain), 1236230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1237230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x complete IO message invalid\n", 1238230557Sjimharris domain, remote_device, 1239230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1240230557Sjimharris )); 1241230557Sjimharris 1242230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1243230557Sjimharris} 1244230557Sjimharris 1245230557Sjimharris 1246230557Sjimharris/** 1247230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1248230557Sjimharris * when a user attempts to complete an IO on a domain and a 1249230557Sjimharris * complete IO operation is not allowed. 1250230557Sjimharris * 1251230557Sjimharris * @param[in] domain This parameter specifies the domain object 1252230557Sjimharris * on which the user is attempting to perform a complete IO 1253230557Sjimharris * operation. 1254230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1255230557Sjimharris * object on which the user is attempting to perform a complete IO 1256230557Sjimharris * operation. 1257230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 1258230557Sjimharris * being completed. 1259230557Sjimharris * 1260230557Sjimharris * @return This method returns an indication that complete IO operations 1261230557Sjimharris * are not allowed. 1262230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1263230557Sjimharris */ 1264230557Sjimharrisstatic 1265230557SjimharrisSCI_STATUS scif_sas_domain_default_complete_high_priority_io_handler( 1266230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1267230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 1268230557Sjimharris SCI_BASE_REQUEST_T * io_request, 1269230557Sjimharris void * response_data, 1270230557Sjimharris SCI_IO_STATUS completion_status 1271230557Sjimharris) 1272230557Sjimharris{ 1273230557Sjimharris SCIF_LOG_WARNING(( 1274230557Sjimharris sci_base_object_get_logger(domain), 1275230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1276230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x complete IO message invalid\n", 1277230557Sjimharris domain, remote_device, 1278230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1279230557Sjimharris )); 1280230557Sjimharris 1281230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1282230557Sjimharris} 1283230557Sjimharris 1284230557Sjimharris/** 1285230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1286230557Sjimharris * when a user attempts to continue an IO on a domain and a 1287230557Sjimharris * continue IO operation is not allowed. 1288230557Sjimharris * 1289230557Sjimharris * @param[in] domain This parameter specifies the domain object 1290230557Sjimharris * on which the user is attempting to perform a continue IO 1291230557Sjimharris * operation. 1292230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1293230557Sjimharris * object on which the user is attempting to perform a start IO 1294230557Sjimharris * operation. 1295230557Sjimharris * @param[in] io_request This parameter specifies the io request that is 1296230557Sjimharris * being started. 1297230557Sjimharris * 1298230557Sjimharris * @return This method returns an indication that continue IO operations 1299230557Sjimharris * are not allowed. 1300230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1301230557Sjimharris */ 1302230557Sjimharrisstatic 1303230557SjimharrisSCI_STATUS scif_sas_domain_default_continue_io_handler( 1304230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1305230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 1306230557Sjimharris SCI_BASE_REQUEST_T * io_request 1307230557Sjimharris) 1308230557Sjimharris{ 1309230557Sjimharris SCIF_LOG_WARNING(( 1310230557Sjimharris sci_base_object_get_logger(domain), 1311230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1312230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x contineu IO message invalid\n", 1313230557Sjimharris domain, remote_device, 1314230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1315230557Sjimharris )); 1316230557Sjimharris 1317230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1318230557Sjimharris} 1319230557Sjimharris 1320230557Sjimharris/** 1321230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1322230557Sjimharris * when a user attempts to start a task on a domain and a start 1323230557Sjimharris * task operation is not allowed. 1324230557Sjimharris * 1325230557Sjimharris * @param[in] domain This parameter specifies the domain object 1326230557Sjimharris * on which the user is attempting to perform a start task 1327230557Sjimharris * operation. 1328230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1329230557Sjimharris * object on which the user is attempting to perform a start IO 1330230557Sjimharris * operation. 1331230557Sjimharris * @param[in] task_request This parameter specifies the task request that 1332230557Sjimharris * is being started. 1333230557Sjimharris * 1334230557Sjimharris * @return This method returns an indication that start task operations 1335230557Sjimharris * are not allowed. 1336230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1337230557Sjimharris */ 1338230557Sjimharrisstatic 1339230557SjimharrisSCI_STATUS scif_sas_domain_default_start_task_handler( 1340230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1341230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 1342230557Sjimharris SCI_BASE_REQUEST_T * task_request 1343230557Sjimharris) 1344230557Sjimharris{ 1345230557Sjimharris SCIF_LOG_WARNING(( 1346230557Sjimharris sci_base_object_get_logger(domain), 1347230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1348230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x start task message invalid\n", 1349230557Sjimharris domain, remote_device, 1350230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1351230557Sjimharris )); 1352230557Sjimharris 1353230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1354230557Sjimharris} 1355230557Sjimharris 1356230557Sjimharris/** 1357230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1358230557Sjimharris * when a user attempts to complete a task on a domain and a 1359230557Sjimharris * complete task operation is not allowed. 1360230557Sjimharris * 1361230557Sjimharris * @param[in] domain This parameter specifies the domain object 1362230557Sjimharris * on which the user is attempting to perform a complete task 1363230557Sjimharris * operation. 1364230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1365230557Sjimharris * object on which the user is attempting to perform a start IO 1366230557Sjimharris * operation. 1367230557Sjimharris * @param[in] task_request This parameter specifies the task request that 1368230557Sjimharris * is being started. 1369230557Sjimharris * 1370230557Sjimharris * @return This method returns an indication that complete task operations 1371230557Sjimharris * are not allowed. 1372230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1373230557Sjimharris */ 1374230557Sjimharrisstatic 1375230557SjimharrisSCI_STATUS scif_sas_domain_default_complete_task_handler( 1376230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1377230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device, 1378230557Sjimharris SCI_BASE_REQUEST_T * task_request 1379230557Sjimharris) 1380230557Sjimharris{ 1381230557Sjimharris SCIF_LOG_WARNING(( 1382230557Sjimharris sci_base_object_get_logger(domain), 1383230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1384230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x complete task message invalid\n", 1385230557Sjimharris domain, remote_device, 1386230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1387230557Sjimharris )); 1388230557Sjimharris 1389230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1390230557Sjimharris} 1391230557Sjimharris 1392230557Sjimharris/** 1393230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1394230557Sjimharris * when a remote device start operation completes in a state. 1395230557Sjimharris * 1396230557Sjimharris * @param[in] domain This parameter specifies the domain object 1397230557Sjimharris * on which the remote device start operation is completing. 1398230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1399230557Sjimharris * for which the start operation is completing. 1400230557Sjimharris * 1401230557Sjimharris * @return This method returns an indication that start operation 1402230557Sjimharris * completion is not allowed. 1403230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1404230557Sjimharris */ 1405230557Sjimharrisstatic 1406230557SjimharrisSCI_STATUS scif_sas_domain_default_device_start_complete_handler( 1407230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1408230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device 1409230557Sjimharris) 1410230557Sjimharris{ 1411230557Sjimharris SCIF_LOG_WARNING(( 1412230557Sjimharris sci_base_object_get_logger(domain), 1413230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1414230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x device stop complete message invalid\n", 1415230557Sjimharris domain, remote_device, 1416230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1417230557Sjimharris )); 1418230557Sjimharris 1419230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1420230557Sjimharris} 1421230557Sjimharris 1422230557Sjimharris/** 1423230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1424230557Sjimharris * when a remote device stop operation completes in a state. 1425230557Sjimharris * 1426230557Sjimharris * @param[in] domain This parameter specifies the domain object 1427230557Sjimharris * on which the remote device stop operation is completing. 1428230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1429230557Sjimharris * for which the stop operation is completing. 1430230557Sjimharris * 1431230557Sjimharris * @return This method returns an indication that stop operation 1432230557Sjimharris * completion is not allowed. 1433230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1434230557Sjimharris */ 1435230557Sjimharrisstatic 1436230557SjimharrisSCI_STATUS scif_sas_domain_default_device_stop_complete_handler( 1437230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1438230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device 1439230557Sjimharris) 1440230557Sjimharris{ 1441230557Sjimharris SCIF_LOG_WARNING(( 1442230557Sjimharris sci_base_object_get_logger(domain), 1443230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1444230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x device stop complete message invalid\n", 1445230557Sjimharris domain, remote_device, 1446230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1447230557Sjimharris )); 1448230557Sjimharris 1449230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1450230557Sjimharris} 1451230557Sjimharris 1452230557Sjimharris/** 1453230557Sjimharris * @brief This method provides default handling (i.e. returns an error) 1454230557Sjimharris * when sci user try to destruct a remote device of this domain. 1455230557Sjimharris * 1456230557Sjimharris * @param[in] domain This parameter specifies the domain object 1457230557Sjimharris * on which the remote device is to be destructed. 1458230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1459230557Sjimharris * to be destructed. 1460230557Sjimharris * 1461230557Sjimharris * @return This method returns an indication that device destruction 1462230557Sjimharris * is not allowed. 1463230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 1464230557Sjimharris */ 1465230557Sjimharrisstatic 1466230557SjimharrisSCI_STATUS scif_sas_domain_default_device_destruct_handler( 1467230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1468230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device 1469230557Sjimharris) 1470230557Sjimharris{ 1471230557Sjimharris SCIF_LOG_WARNING(( 1472230557Sjimharris sci_base_object_get_logger(domain), 1473230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1474230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x device destruct in invalid state\n", 1475230557Sjimharris domain, remote_device, 1476230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1477230557Sjimharris )); 1478230557Sjimharris 1479230557Sjimharris return SCI_FAILURE_INVALID_STATE; 1480230557Sjimharris} 1481230557Sjimharris 1482230557Sjimharris 1483230557Sjimharris/** 1484230557Sjimharris * @brief This method provides handling when sci user destruct a remote 1485230557Sjimharris * device of this domain in discovering state. Mainly the device 1486230557Sjimharris * is removed from domain's remote_device_list. 1487230557Sjimharris * 1488230557Sjimharris * @param[in] domain This parameter specifies the domain object 1489230557Sjimharris * on which the remote device is to be destructed. 1490230557Sjimharris * @param[in] remote_device This parameter specifies the remote device 1491230557Sjimharris * to be destructed. 1492230557Sjimharris * 1493230557Sjimharris * @return This method returns a status of the device destruction. 1494230557Sjimharris * @retval SCI_SUCCESS This value is returned when a remote device is 1495230557Sjimharris * successfully removed from domain. 1496230557Sjimharris */ 1497230557Sjimharrisstatic 1498230557SjimharrisSCI_STATUS scif_sas_domain_discovering_device_destruct_handler( 1499230557Sjimharris SCI_BASE_DOMAIN_T * domain, 1500230557Sjimharris SCI_BASE_REMOTE_DEVICE_T * remote_device 1501230557Sjimharris) 1502230557Sjimharris{ 1503230557Sjimharris SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *)domain; 1504230557Sjimharris 1505230557Sjimharris SCIF_LOG_WARNING(( 1506230557Sjimharris sci_base_object_get_logger(domain), 1507230557Sjimharris SCIF_LOG_OBJECT_DOMAIN, 1508230557Sjimharris "Domain:0x%x Device:0x%x State:0x%x device destruct in domain DISCOVERING state\n", 1509230557Sjimharris domain, remote_device, 1510230557Sjimharris sci_base_state_machine_get_state(&domain->state_machine) 1511230557Sjimharris )); 1512230557Sjimharris 1513230557Sjimharris //remove the remote device from domain's remote_device_list 1514230557Sjimharris sci_abstract_list_erase( 1515230557Sjimharris &(fw_domain->remote_device_list), 1516230557Sjimharris remote_device 1517230557Sjimharris ); 1518230557Sjimharris 1519230557Sjimharris return SCI_SUCCESS; 1520230557Sjimharris} 1521230557Sjimharris 1522230557Sjimharris 1523230557Sjimharris#define scif_sas_domain_stopped_discover_handler \ 1524230557Sjimharris scif_sas_domain_ready_discover_handler 1525230557Sjimharris 1526230557Sjimharris#define scif_sas_domain_default_start_high_priority_io_handler \ 1527230557Sjimharris scif_sas_domain_default_start_io_handler 1528230557Sjimharris 1529230557Sjimharris 1530230557SjimharrisSCI_BASE_DOMAIN_STATE_HANDLER_T 1531230557Sjimharris scif_sas_domain_state_handler_table[SCI_BASE_DOMAIN_MAX_STATES] = 1532230557Sjimharris{ 1533230557Sjimharris // SCI_BASE_DOMAIN_STATE_INITIAL 1534230557Sjimharris { 1535230557Sjimharris scif_sas_domain_default_discover_handler, 1536230557Sjimharris scif_sas_domain_default_port_ready_handler, 1537230557Sjimharris scif_sas_domain_default_port_not_ready_handler, 1538230557Sjimharris scif_sas_domain_default_device_start_complete_handler, 1539230557Sjimharris scif_sas_domain_default_device_stop_complete_handler, 1540230557Sjimharris scif_sas_domain_default_device_destruct_handler, 1541230557Sjimharris scif_sas_domain_default_start_io_handler, 1542230557Sjimharris scif_sas_domain_default_start_high_priority_io_handler, 1543230557Sjimharris scif_sas_domain_default_complete_io_handler, 1544230557Sjimharris scif_sas_domain_default_complete_high_priority_io_handler, 1545230557Sjimharris scif_sas_domain_default_continue_io_handler, 1546230557Sjimharris scif_sas_domain_default_start_task_handler, 1547230557Sjimharris scif_sas_domain_default_complete_task_handler 1548230557Sjimharris }, 1549230557Sjimharris // SCI_BASE_DOMAIN_STATE_STARTING 1550230557Sjimharris { 1551230557Sjimharris scif_sas_domain_default_discover_handler, 1552230557Sjimharris scif_sas_domain_starting_port_ready_handler, 1553230557Sjimharris scif_sas_domain_default_port_not_ready_handler, 1554230557Sjimharris scif_sas_domain_default_device_start_complete_handler, 1555230557Sjimharris scif_sas_domain_default_device_stop_complete_handler, 1556230557Sjimharris scif_sas_domain_default_device_destruct_handler, 1557230557Sjimharris scif_sas_domain_default_start_io_handler, 1558230557Sjimharris scif_sas_domain_default_start_high_priority_io_handler, 1559230557Sjimharris scif_sas_domain_default_complete_io_handler, 1560230557Sjimharris scif_sas_domain_default_complete_high_priority_io_handler, 1561230557Sjimharris scif_sas_domain_default_continue_io_handler, 1562230557Sjimharris scif_sas_domain_default_start_task_handler, 1563230557Sjimharris scif_sas_domain_default_complete_task_handler 1564230557Sjimharris }, 1565230557Sjimharris // SCI_BASE_DOMAIN_STATE_READY 1566230557Sjimharris { 1567230557Sjimharris scif_sas_domain_ready_discover_handler, 1568230557Sjimharris scif_sas_domain_default_port_ready_handler, 1569230557Sjimharris scif_sas_domain_ready_port_not_ready_handler, 1570230557Sjimharris scif_sas_domain_default_device_start_complete_handler, 1571230557Sjimharris scif_sas_domain_default_device_stop_complete_handler, 1572230557Sjimharris scif_sas_domain_default_device_destruct_handler, 1573230557Sjimharris scif_sas_domain_ready_start_io_handler, 1574230557Sjimharris scif_sas_domain_ready_start_high_priority_io_handler, 1575230557Sjimharris scif_sas_domain_ready_complete_io_handler, 1576230557Sjimharris scif_sas_domain_ready_complete_high_priority_io_handler, 1577230557Sjimharris scif_sas_domain_ready_continue_io_handler, 1578230557Sjimharris scif_sas_domain_ready_start_task_handler, 1579230557Sjimharris scif_sas_domain_ready_complete_task_handler 1580230557Sjimharris }, 1581230557Sjimharris // SCI_BASE_DOMAIN_STATE_STOPPING 1582230557Sjimharris { 1583230557Sjimharris scif_sas_domain_default_discover_handler, 1584230557Sjimharris scif_sas_domain_default_port_ready_handler, 1585230557Sjimharris scif_sas_domain_default_port_not_ready_handler, 1586230557Sjimharris scif_sas_domain_default_device_start_complete_handler, 1587230557Sjimharris scif_sas_domain_stopping_device_stop_complete_handler, 1588230557Sjimharris scif_sas_domain_default_device_destruct_handler, 1589230557Sjimharris scif_sas_domain_default_start_io_handler, 1590230557Sjimharris scif_sas_domain_default_start_high_priority_io_handler, 1591230557Sjimharris scif_sas_domain_stopping_complete_io_handler, 1592230557Sjimharris scif_sas_domain_stopping_complete_high_priority_io_handler, 1593230557Sjimharris scif_sas_domain_default_continue_io_handler, 1594230557Sjimharris scif_sas_domain_default_start_task_handler, 1595230557Sjimharris scif_sas_domain_stopping_complete_task_handler 1596230557Sjimharris }, 1597230557Sjimharris // SCI_BASE_DOMAIN_STATE_STOPPED 1598230557Sjimharris { 1599230557Sjimharris scif_sas_domain_stopped_discover_handler, 1600230557Sjimharris scif_sas_domain_default_port_ready_handler, 1601230557Sjimharris scif_sas_domain_default_port_not_ready_handler, 1602230557Sjimharris scif_sas_domain_default_device_start_complete_handler, 1603230557Sjimharris scif_sas_domain_default_device_stop_complete_handler, 1604230557Sjimharris scif_sas_domain_default_device_destruct_handler, 1605230557Sjimharris scif_sas_domain_default_start_io_handler, 1606230557Sjimharris scif_sas_domain_default_start_high_priority_io_handler, 1607230557Sjimharris scif_sas_domain_default_complete_io_handler, 1608230557Sjimharris scif_sas_domain_default_complete_high_priority_io_handler, 1609230557Sjimharris scif_sas_domain_default_continue_io_handler, 1610230557Sjimharris scif_sas_domain_default_start_task_handler, 1611230557Sjimharris scif_sas_domain_default_complete_task_handler 1612230557Sjimharris }, 1613230557Sjimharris // SCI_BASE_DOMAIN_STATE_DISCOVERING 1614230557Sjimharris { 1615230557Sjimharris scif_sas_domain_default_discover_handler, 1616230557Sjimharris scif_sas_domain_default_port_ready_handler, 1617230557Sjimharris scif_sas_domain_discovering_port_not_ready_handler, 1618230557Sjimharris scif_sas_domain_discovering_device_start_complete_handler, 1619230557Sjimharris scif_sas_domain_discovering_device_stop_complete_handler, 1620230557Sjimharris scif_sas_domain_discovering_device_destruct_handler, // 1621230557Sjimharris scif_sas_domain_default_start_io_handler, 1622230557Sjimharris scif_sas_domain_discovering_start_high_priority_io_handler, 1623230557Sjimharris scif_sas_domain_discovering_complete_io_handler, 1624230557Sjimharris scif_sas_domain_discovering_complete_high_priority_io_handler, // 1625230557Sjimharris scif_sas_domain_discovering_continue_io_handler, 1626230557Sjimharris scif_sas_domain_discovering_start_task_handler, 1627230557Sjimharris scif_sas_domain_discovering_complete_task_handler 1628230557Sjimharris } 1629230557Sjimharris}; 1630230557Sjimharris 1631