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 method implementations pertaining 60230557Sjimharris * to the framework io request state handler methods. 61230557Sjimharris */ 62230557Sjimharris 63230557Sjimharris#include <dev/isci/scil/scif_sas_logger.h> 64230557Sjimharris#include <dev/isci/scil/scif_sas_task_request.h> 65230557Sjimharris 66230557Sjimharris//****************************************************************************** 67230557Sjimharris//* C O N S T R U C T E D H A N D L E R S 68230557Sjimharris//****************************************************************************** 69230557Sjimharris 70230557Sjimharris/** 71230557Sjimharris * @brief This method provides CONSTRUCTED state specific handling for 72230557Sjimharris * when the user attempts to start the supplied task request. 73230557Sjimharris * 74230557Sjimharris * @param[in] task_request This parameter specifies the task request object 75230557Sjimharris * to be started. 76230557Sjimharris * 77230557Sjimharris * @return This method returns a value indicating if the task request was 78230557Sjimharris * successfully started or not. 79230557Sjimharris * @retval SCI_SUCCESS This return value indicates successful starting 80230557Sjimharris * of the task request. 81230557Sjimharris */ 82230557Sjimharrisstatic 83230557SjimharrisSCI_STATUS scif_sas_task_request_constructed_start_handler( 84230557Sjimharris SCI_BASE_REQUEST_T * task_request 85230557Sjimharris) 86230557Sjimharris{ 87230557Sjimharris sci_base_state_machine_change_state( 88230557Sjimharris &task_request->state_machine, SCI_BASE_REQUEST_STATE_STARTED 89230557Sjimharris ); 90230557Sjimharris 91230557Sjimharris return SCI_SUCCESS; 92230557Sjimharris} 93230557Sjimharris 94230557Sjimharris/** 95230557Sjimharris * @brief This method provides CONSTRUCTED state specific handling for 96230557Sjimharris * when the user attempts to abort the supplied task request. 97230557Sjimharris * 98230557Sjimharris * @param[in] task_request This parameter specifies the task request object 99230557Sjimharris * to be aborted. 100230557Sjimharris * 101230557Sjimharris * @return This method returns a value indicating if the task request was 102230557Sjimharris * successfully aborted or not. 103230557Sjimharris * @retval SCI_SUCCESS This return value indicates successful aborting 104230557Sjimharris * of the task request. 105230557Sjimharris */ 106230557Sjimharrisstatic 107230557SjimharrisSCI_STATUS scif_sas_task_request_constructed_abort_handler( 108230557Sjimharris SCI_BASE_REQUEST_T * task_request 109230557Sjimharris) 110230557Sjimharris{ 111230557Sjimharris sci_base_state_machine_change_state( 112230557Sjimharris &task_request->state_machine, SCI_BASE_REQUEST_STATE_COMPLETED 113230557Sjimharris ); 114230557Sjimharris 115230557Sjimharris return SCI_SUCCESS; 116230557Sjimharris} 117230557Sjimharris 118230557Sjimharris//****************************************************************************** 119230557Sjimharris//* S T A R T E D H A N D L E R S 120230557Sjimharris//****************************************************************************** 121230557Sjimharris 122230557Sjimharris/** 123230557Sjimharris * @brief This method provides STARTED state specific handling for 124230557Sjimharris * when the user attempts to abort the supplied task request. 125230557Sjimharris * 126230557Sjimharris * @param[in] task_request This parameter specifies the task request object 127230557Sjimharris * to be aborted. 128230557Sjimharris * 129230557Sjimharris * @return This method returns a value indicating if the aborting the 130230557Sjimharris * task request was successfully started. 131230557Sjimharris * @retval SCI_SUCCESS This return value indicates that the abort process 132230557Sjimharris * began successfully. 133230557Sjimharris */ 134230557Sjimharrisstatic 135230557SjimharrisSCI_STATUS scif_sas_task_request_started_abort_handler( 136230557Sjimharris SCI_BASE_REQUEST_T * task_request 137230557Sjimharris) 138230557Sjimharris{ 139230557Sjimharris SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T *) task_request; 140230557Sjimharris 141230557Sjimharris sci_base_state_machine_change_state( 142230557Sjimharris &task_request->state_machine, SCI_BASE_REQUEST_STATE_ABORTING 143230557Sjimharris ); 144230557Sjimharris 145230557Sjimharris return fw_request->status; 146230557Sjimharris} 147230557Sjimharris 148230557Sjimharris/** 149230557Sjimharris * @brief This method provides STARTED state specific handling for 150230557Sjimharris * when the user attempts to complete the supplied task request. 151230557Sjimharris * 152230557Sjimharris * @param[in] task_request This parameter specifies the task request object 153230557Sjimharris * to be completed. 154230557Sjimharris * 155230557Sjimharris * @return This method returns a value indicating if the completion of the 156230557Sjimharris * task request was successful. 157230557Sjimharris * @retval SCI_SUCCESS This return value indicates that the completion process 158230557Sjimharris * was successful. 159230557Sjimharris */ 160230557Sjimharrisstatic 161230557SjimharrisSCI_STATUS scif_sas_task_request_started_complete_handler( 162230557Sjimharris SCI_BASE_REQUEST_T * task_request 163230557Sjimharris) 164230557Sjimharris{ 165230557Sjimharris sci_base_state_machine_change_state( 166230557Sjimharris &task_request->state_machine, SCI_BASE_REQUEST_STATE_COMPLETED 167230557Sjimharris ); 168230557Sjimharris 169230557Sjimharris return SCI_SUCCESS; 170230557Sjimharris} 171230557Sjimharris 172230557Sjimharris//****************************************************************************** 173230557Sjimharris//* C O M P L E T E D H A N D L E R S 174230557Sjimharris//****************************************************************************** 175230557Sjimharris 176230557Sjimharris/** 177230557Sjimharris * @brief This method provides COMPLETED state specific handling for 178230557Sjimharris * when the user attempts to destruct the supplied task request. 179230557Sjimharris * 180230557Sjimharris * @param[in] task_request This parameter specifies the task request object 181230557Sjimharris * to be destructed. 182230557Sjimharris * 183230557Sjimharris * @return This method returns a value indicating if the destruct 184230557Sjimharris * operation was successful. 185230557Sjimharris * @retval SCI_SUCCESS This return value indicates that the destruct 186230557Sjimharris * was successful. 187230557Sjimharris */ 188230557Sjimharrisstatic 189230557SjimharrisSCI_STATUS scif_sas_task_request_completed_destruct_handler( 190230557Sjimharris SCI_BASE_REQUEST_T * task_request 191230557Sjimharris) 192230557Sjimharris{ 193230557Sjimharris SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T *)task_request; 194230557Sjimharris 195230557Sjimharris sci_base_state_machine_change_state( 196230557Sjimharris &task_request->state_machine, SCI_BASE_REQUEST_STATE_FINAL 197230557Sjimharris ); 198230557Sjimharris 199230557Sjimharris sci_base_state_machine_logger_deinitialize( 200230557Sjimharris &task_request->state_machine_logger, 201230557Sjimharris &task_request->state_machine 202230557Sjimharris ); 203230557Sjimharris 204230557Sjimharris if (fw_request->is_internal == TRUE) 205230557Sjimharris { 206230557Sjimharris scif_sas_internal_task_request_destruct( 207230557Sjimharris (SCIF_SAS_TASK_REQUEST_T *)fw_request 208230557Sjimharris ); 209230557Sjimharris } 210230557Sjimharris 211230557Sjimharris return SCI_SUCCESS; 212230557Sjimharris} 213230557Sjimharris 214230557Sjimharris//****************************************************************************** 215230557Sjimharris//* A B O R T I N G H A N D L E R S 216230557Sjimharris//****************************************************************************** 217230557Sjimharris 218230557Sjimharris/** 219230557Sjimharris * @brief This method provides ABORTING state specific handling for 220230557Sjimharris * when the user attempts to complete the supplied task request. 221230557Sjimharris * 222230557Sjimharris * @param[in] task_request This parameter specifies the task request object 223230557Sjimharris * to be completed. 224230557Sjimharris * 225230557Sjimharris * @return This method returns a value indicating if the completion 226230557Sjimharris * operation was successful. 227230557Sjimharris * @retval SCI_SUCCESS This return value indicates that the completion 228230557Sjimharris * was successful. 229230557Sjimharris */ 230230557Sjimharrisstatic 231230557SjimharrisSCI_STATUS scif_sas_task_request_aborting_complete_handler( 232230557Sjimharris SCI_BASE_REQUEST_T * task_request 233230557Sjimharris) 234230557Sjimharris{ 235230557Sjimharris sci_base_state_machine_change_state( 236230557Sjimharris &task_request->state_machine, SCI_BASE_REQUEST_STATE_COMPLETED 237230557Sjimharris ); 238230557Sjimharris 239230557Sjimharris return SCI_SUCCESS; 240230557Sjimharris} 241230557Sjimharris 242230557Sjimharris//****************************************************************************** 243230557Sjimharris//* D E F A U L T H A N D L E R S 244230557Sjimharris//****************************************************************************** 245230557Sjimharris 246230557Sjimharris/** 247230557Sjimharris * @brief This method provides DEFAULT handling for when the user 248230557Sjimharris * attempts to start the supplied task request. 249230557Sjimharris * 250230557Sjimharris * @param[in] task_request This parameter specifies the task request object 251230557Sjimharris * to be started. 252230557Sjimharris * 253230557Sjimharris * @return This method returns an indication that the start operation is 254230557Sjimharris * not allowed. 255230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 256230557Sjimharris */ 257230557Sjimharrisstatic 258230557SjimharrisSCI_STATUS scif_sas_task_request_default_start_handler( 259230557Sjimharris SCI_BASE_REQUEST_T * task_request 260230557Sjimharris) 261230557Sjimharris{ 262230557Sjimharris SCIF_LOG_ERROR(( 263230557Sjimharris sci_base_object_get_logger((SCIF_SAS_TASK_REQUEST_T *) task_request), 264230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 265230557Sjimharris "TaskRequest:0x%x State:0x%x invalid state to start\n", 266230557Sjimharris task_request, 267230557Sjimharris sci_base_state_machine_get_state( 268230557Sjimharris &((SCIF_SAS_TASK_REQUEST_T *) task_request)->parent.parent.state_machine) 269230557Sjimharris )); 270230557Sjimharris 271230557Sjimharris return SCI_FAILURE_INVALID_STATE; 272230557Sjimharris} 273230557Sjimharris 274230557Sjimharris/** 275230557Sjimharris * @brief This method provides DEFAULT handling for when the user 276230557Sjimharris * attempts to abort the supplied task request. 277230557Sjimharris * 278230557Sjimharris * @param[in] task_request This parameter specifies the task request object 279230557Sjimharris * to be aborted. 280230557Sjimharris * 281230557Sjimharris * @return This method returns an indication that the abort operation is 282230557Sjimharris * not allowed. 283230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 284230557Sjimharris */ 285230557Sjimharrisstatic 286230557SjimharrisSCI_STATUS scif_sas_task_request_default_abort_handler( 287230557Sjimharris SCI_BASE_REQUEST_T * task_request 288230557Sjimharris) 289230557Sjimharris{ 290230557Sjimharris SCIF_LOG_ERROR(( 291230557Sjimharris sci_base_object_get_logger((SCIF_SAS_TASK_REQUEST_T *) task_request), 292230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 293230557Sjimharris "TaskRequest:0x%x State:0x%x invalid state to abort\n", 294230557Sjimharris task_request, 295230557Sjimharris sci_base_state_machine_get_state( 296230557Sjimharris &((SCIF_SAS_TASK_REQUEST_T *) task_request)->parent.parent.state_machine) 297230557Sjimharris )); 298230557Sjimharris 299230557Sjimharris return SCI_FAILURE_INVALID_STATE; 300230557Sjimharris} 301230557Sjimharris 302230557Sjimharris/** 303230557Sjimharris * @brief This method provides DEFAULT handling for when the user 304230557Sjimharris * attempts to complete the supplied task request. 305230557Sjimharris * 306230557Sjimharris * @param[in] task_request This parameter specifies the task request object 307230557Sjimharris * to be completed. 308230557Sjimharris * 309230557Sjimharris * @return This method returns an indication that complete operation is 310230557Sjimharris * not allowed. 311230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 312230557Sjimharris */ 313230557Sjimharrisstatic 314230557SjimharrisSCI_STATUS scif_sas_task_request_default_complete_handler( 315230557Sjimharris SCI_BASE_REQUEST_T * task_request 316230557Sjimharris) 317230557Sjimharris{ 318230557Sjimharris SCIF_LOG_ERROR(( 319230557Sjimharris sci_base_object_get_logger((SCIF_SAS_TASK_REQUEST_T *) task_request), 320230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 321230557Sjimharris "TaskRequest:0x%x State:0x%x invalid state to complete\n", 322230557Sjimharris task_request, 323230557Sjimharris sci_base_state_machine_get_state( 324230557Sjimharris &((SCIF_SAS_TASK_REQUEST_T *) task_request)->parent.parent.state_machine) 325230557Sjimharris )); 326230557Sjimharris 327230557Sjimharris return SCI_FAILURE_INVALID_STATE; 328230557Sjimharris} 329230557Sjimharris 330230557Sjimharris/** 331230557Sjimharris * @brief This method provides DEFAULT handling for when the user 332230557Sjimharris * attempts to destruct the supplied task request. 333230557Sjimharris * 334230557Sjimharris * @param[in] task_request This parameter specifies the task request object 335230557Sjimharris * to be destructed. 336230557Sjimharris * 337230557Sjimharris * @return This method returns an indication that destruct operation is 338230557Sjimharris * not allowed. 339230557Sjimharris * @retval SCI_FAILURE_INVALID_STATE This value is always returned. 340230557Sjimharris */ 341230557Sjimharrisstatic 342230557SjimharrisSCI_STATUS scif_sas_task_request_default_destruct_handler( 343230557Sjimharris SCI_BASE_REQUEST_T * task_request 344230557Sjimharris) 345230557Sjimharris{ 346230557Sjimharris SCIF_LOG_ERROR(( 347230557Sjimharris sci_base_object_get_logger((SCIF_SAS_TASK_REQUEST_T *) task_request), 348230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 349230557Sjimharris "TaskRequest:0x%x State:0x%x invalid state to destruct.\n", 350230557Sjimharris task_request, 351230557Sjimharris sci_base_state_machine_get_state( 352230557Sjimharris &((SCIF_SAS_TASK_REQUEST_T *) task_request)->parent.parent.state_machine) 353230557Sjimharris )); 354230557Sjimharris 355230557Sjimharris return SCI_FAILURE_INVALID_STATE; 356230557Sjimharris} 357230557Sjimharris 358230557Sjimharris 359230557SjimharrisSCI_BASE_REQUEST_STATE_HANDLER_T scif_sas_task_request_state_handler_table[] = 360230557Sjimharris{ 361230557Sjimharris // SCI_BASE_REQUEST_STATE_INITIAL 362230557Sjimharris { 363230557Sjimharris scif_sas_task_request_default_start_handler, 364230557Sjimharris scif_sas_task_request_default_abort_handler, 365230557Sjimharris scif_sas_task_request_default_complete_handler, 366230557Sjimharris scif_sas_task_request_default_destruct_handler 367230557Sjimharris }, 368230557Sjimharris // SCI_BASE_REQUEST_STATE_CONSTRUCTED 369230557Sjimharris { 370230557Sjimharris scif_sas_task_request_constructed_start_handler, 371230557Sjimharris scif_sas_task_request_constructed_abort_handler, 372230557Sjimharris scif_sas_task_request_default_complete_handler, 373230557Sjimharris scif_sas_task_request_default_destruct_handler 374230557Sjimharris }, 375230557Sjimharris // SCI_BASE_REQUEST_STATE_STARTED 376230557Sjimharris { 377230557Sjimharris scif_sas_task_request_default_start_handler, 378230557Sjimharris scif_sas_task_request_started_abort_handler, 379230557Sjimharris scif_sas_task_request_started_complete_handler, 380230557Sjimharris scif_sas_task_request_default_destruct_handler 381230557Sjimharris }, 382230557Sjimharris // SCI_BASE_REQUEST_STATE_COMPLETED 383230557Sjimharris { 384230557Sjimharris scif_sas_task_request_default_start_handler, 385230557Sjimharris scif_sas_task_request_default_abort_handler, 386230557Sjimharris scif_sas_task_request_default_complete_handler, 387230557Sjimharris scif_sas_task_request_completed_destruct_handler 388230557Sjimharris }, 389230557Sjimharris // SCI_BASE_REQUEST_STATE_ABORTING 390230557Sjimharris { 391230557Sjimharris scif_sas_task_request_default_start_handler, 392230557Sjimharris scif_sas_task_request_default_abort_handler, 393230557Sjimharris scif_sas_task_request_aborting_complete_handler, 394230557Sjimharris scif_sas_task_request_default_destruct_handler 395230557Sjimharris }, 396230557Sjimharris // SCI_BASE_REQUEST_STATE_FINAL 397230557Sjimharris { 398230557Sjimharris scif_sas_task_request_default_start_handler, 399230557Sjimharris scif_sas_task_request_default_abort_handler, 400230557Sjimharris scif_sas_task_request_default_complete_handler, 401230557Sjimharris scif_sas_task_request_default_destruct_handler 402230557Sjimharris }, 403230557Sjimharris}; 404230557Sjimharris 405