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 the task management request object 60230557Sjimharris * (SCIF_SAS_TASK_REQUEST) method implementations. 61230557Sjimharris */ 62230557Sjimharris 63230557Sjimharris 64230557Sjimharris#include <dev/isci/scil/intel_sas.h> 65230557Sjimharris 66230557Sjimharris#include <dev/isci/scil/scic_task_request.h> 67230557Sjimharris#include <dev/isci/scil/scic_remote_device.h> 68230557Sjimharris#include <dev/isci/scil/scic_user_callback.h> 69230557Sjimharris#include <dev/isci/scil/scic_controller.h> 70230557Sjimharris#include <dev/isci/scil/scif_user_callback.h> 71230557Sjimharris 72230557Sjimharris#include <dev/isci/scil/scif_sas_request.h> 73230557Sjimharris#include <dev/isci/scil/scif_sas_task_request.h> 74230557Sjimharris#include <dev/isci/scil/scif_sas_stp_task_request.h> 75230557Sjimharris#include <dev/isci/scil/scif_sas_logger.h> 76230557Sjimharris#include <dev/isci/scil/scif_sas_controller.h> 77230557Sjimharris#include <dev/isci/scil/scif_sas_domain.h> 78230557Sjimharris#include <dev/isci/scil/scif_sas_remote_device.h> 79230557Sjimharris#include <dev/isci/scil/scif_sas_smp_io_request.h> 80230557Sjimharris 81230557Sjimharris//****************************************************************************** 82230557Sjimharris//* P U B L I C M E T H O D S 83230557Sjimharris//****************************************************************************** 84230557Sjimharris 85230557SjimharrisU32 scif_task_request_get_object_size( 86230557Sjimharris void 87230557Sjimharris) 88230557Sjimharris{ 89230557Sjimharris return (sizeof(SCIF_SAS_TASK_REQUEST_T) + scic_task_request_get_object_size()); 90230557Sjimharris} 91230557Sjimharris 92230557Sjimharris// --------------------------------------------------------------------------- 93230557Sjimharris 94230557SjimharrisU8 scif_sas_task_request_get_function( 95230557Sjimharris SCIF_SAS_TASK_REQUEST_T *fw_task 96230557Sjimharris) 97230557Sjimharris{ 98230557Sjimharris return fw_task->function; 99230557Sjimharris} 100230557Sjimharris 101230557Sjimharris// --------------------------------------------------------------------------- 102230557Sjimharris 103230557Sjimharrisstatic 104230557SjimharrisSCI_STATUS scif_sas_task_request_generic_construct( 105230557Sjimharris SCI_CONTROLLER_HANDLE_T scif_controller, 106230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T scif_remote_device, 107230557Sjimharris U16 io_tag, 108230557Sjimharris void * user_task_request_object, 109230557Sjimharris void * task_request_memory, 110230557Sjimharris SCI_TASK_REQUEST_HANDLE_T * scif_task_request, 111230557Sjimharris U8 task_function 112230557Sjimharris) 113230557Sjimharris{ 114230557Sjimharris SCI_STATUS status; 115230557Sjimharris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) 116230557Sjimharris scif_controller; 117230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*) 118230557Sjimharris task_request_memory; 119230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 120230557Sjimharris scif_remote_device; 121230557Sjimharris U8 * core_request_memory; 122230557Sjimharris 123230557Sjimharris SCIF_LOG_TRACE(( 124230557Sjimharris sci_base_object_get_logger(fw_controller), 125230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 126230557Sjimharris "scif_task_request_construct(0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x) enter\n", 127230557Sjimharris scif_controller, scif_remote_device, io_tag, user_task_request_object, 128230557Sjimharris task_request_memory, scif_task_request 129230557Sjimharris )); 130230557Sjimharris 131230557Sjimharris // Initialize the user's handle to the framework task request. 132230557Sjimharris *scif_task_request = fw_task; 133230557Sjimharris 134230557Sjimharris // initialize affected request count 135230557Sjimharris fw_task->affected_request_count = 0; 136230557Sjimharris fw_task->io_tag_to_manage = SCI_CONTROLLER_INVALID_IO_TAG; 137230557Sjimharris fw_task->function = task_function; 138230557Sjimharris 139230557Sjimharris if (task_function == SCI_SAS_HARD_RESET ) 140230557Sjimharris { 141230557Sjimharris if (fw_device->containing_device != NULL ) 142230557Sjimharris {// Target Reset is for an expander attached device, 143230557Sjimharris // go down to construct smp Phy Control request. 144230557Sjimharris scif_sas_smp_request_construct_phy_control( 145230557Sjimharris fw_controller, 146230557Sjimharris fw_device->containing_device, 147230557Sjimharris PHY_OPERATION_HARD_RESET, 148230557Sjimharris fw_device->expander_phy_identifier, 149230557Sjimharris user_task_request_object, 150230557Sjimharris task_request_memory 151230557Sjimharris ); 152230557Sjimharris } 153230557Sjimharris else 154230557Sjimharris { 155230557Sjimharris scif_sas_request_construct( 156230557Sjimharris &fw_task->parent, 157230557Sjimharris fw_device, 158230557Sjimharris sci_base_object_get_logger(fw_controller), 159230557Sjimharris scif_sas_task_request_state_table 160230557Sjimharris ); 161230557Sjimharris 162230557Sjimharris // If target reset is for a DA device, don't build task at all. 163230557Sjimharris // Just set object association. 164230557Sjimharris sci_object_set_association(fw_task, user_task_request_object); 165230557Sjimharris } 166230557Sjimharris 167230557Sjimharris return SCI_SUCCESS; 168230557Sjimharris } 169230557Sjimharris 170230557Sjimharris // Construct the parent object first in order to ensure logging can 171230557Sjimharris // function. 172230557Sjimharris scif_sas_request_construct( 173230557Sjimharris &fw_task->parent, 174230557Sjimharris fw_device, 175230557Sjimharris sci_base_object_get_logger(fw_controller), 176230557Sjimharris scif_sas_task_request_state_table 177230557Sjimharris ); 178230557Sjimharris 179230557Sjimharris core_request_memory = (U8 *)task_request_memory + sizeof(SCIF_SAS_TASK_REQUEST_T); 180230557Sjimharris 181230557Sjimharris status = scic_task_request_construct( 182230557Sjimharris fw_controller->core_object, 183230557Sjimharris fw_device->core_object, 184230557Sjimharris io_tag, 185230557Sjimharris fw_task, 186230557Sjimharris core_request_memory, 187230557Sjimharris &fw_task->parent.core_object 188230557Sjimharris ); 189230557Sjimharris 190230557Sjimharris if (status == SCI_SUCCESS) 191230557Sjimharris { 192230557Sjimharris SMP_DISCOVER_RESPONSE_PROTOCOLS_T dev_protocols; 193230557Sjimharris 194230557Sjimharris // These associations must be set early for the core io request 195230557Sjimharris // object construction to complete correctly as there will be 196230557Sjimharris // callbacks into the user driver framework during core construction 197230557Sjimharris sci_object_set_association(fw_task, user_task_request_object); 198230557Sjimharris sci_object_set_association(fw_task->parent.core_object, fw_task); 199230557Sjimharris 200230557Sjimharris // Perform protocol specific core IO request construction. 201230557Sjimharris scic_remote_device_get_protocols(fw_device->core_object, &dev_protocols); 202230557Sjimharris if (dev_protocols.u.bits.attached_ssp_target) 203230557Sjimharris status = scic_task_request_construct_ssp(fw_task->parent.core_object); 204230557Sjimharris else if (dev_protocols.u.bits.attached_stp_target) 205230557Sjimharris status = scif_sas_stp_task_request_construct(fw_task); 206230557Sjimharris else 207230557Sjimharris status = SCI_FAILURE_UNSUPPORTED_PROTOCOL; 208230557Sjimharris 209230557Sjimharris if (status == SCI_SUCCESS) 210230557Sjimharris { 211230557Sjimharris sci_base_state_machine_logger_initialize( 212230557Sjimharris &fw_task->parent.parent.state_machine_logger, 213230557Sjimharris &fw_task->parent.parent.state_machine, 214230557Sjimharris &fw_task->parent.parent.parent, 215230557Sjimharris scif_cb_logger_log_states, 216230557Sjimharris "SCIF_SAS_TASK_REQUEST_T", "base_state_machine", 217230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT 218230557Sjimharris ); 219230557Sjimharris } 220230557Sjimharris else 221230557Sjimharris { 222230557Sjimharris SCIF_LOG_WARNING(( 223230557Sjimharris sci_base_object_get_logger(fw_task), 224230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 225230557Sjimharris "Device:0x%x TaskRequest:0x%x Function:0x%x construct failed\n", 226230557Sjimharris fw_device, fw_task, scif_sas_task_request_get_function(fw_task) 227230557Sjimharris )); 228230557Sjimharris } 229230557Sjimharris } 230230557Sjimharris 231230557Sjimharris return status; 232230557Sjimharris} 233230557Sjimharris 234230557Sjimharris// --------------------------------------------------------------------------- 235230557Sjimharris 236230557SjimharrisSCI_STATUS scif_sas_internal_task_request_construct( 237230557Sjimharris SCI_CONTROLLER_HANDLE_T scif_controller, 238230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T scif_remote_device, 239230557Sjimharris U16 io_tag, 240230557Sjimharris void * task_request_memory, 241230557Sjimharris SCI_TASK_REQUEST_HANDLE_T * scif_task_request, 242230557Sjimharris U8 task_function 243230557Sjimharris) 244230557Sjimharris{ 245230557Sjimharris SCI_STATUS status; 246230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task; 247230557Sjimharris 248230557Sjimharris status = scif_sas_task_request_generic_construct( 249230557Sjimharris scif_controller, 250230557Sjimharris scif_remote_device, 251230557Sjimharris io_tag, 252230557Sjimharris NULL, 253230557Sjimharris task_request_memory, 254230557Sjimharris scif_task_request, 255230557Sjimharris task_function 256230557Sjimharris ); 257230557Sjimharris 258230557Sjimharris fw_task = (SCIF_SAS_TASK_REQUEST_T *)task_request_memory; 259230557Sjimharris 260230557Sjimharris fw_task->parent.is_internal = TRUE; 261230557Sjimharris 262230557Sjimharris return status; 263230557Sjimharris} 264230557Sjimharris 265230557Sjimharris// --------------------------------------------------------------------------- 266230557Sjimharris 267230557SjimharrisSCI_STATUS scif_task_request_construct( 268230557Sjimharris SCI_CONTROLLER_HANDLE_T scif_controller, 269230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T scif_remote_device, 270230557Sjimharris U16 io_tag, 271230557Sjimharris void * user_task_request_object, 272230557Sjimharris void * task_request_memory, 273230557Sjimharris SCI_TASK_REQUEST_HANDLE_T * scif_task_request 274230557Sjimharris) 275230557Sjimharris{ 276230557Sjimharris SCI_STATUS status; 277230557Sjimharris U8 task_function = 278230557Sjimharris scif_cb_task_request_get_function(user_task_request_object); 279230557Sjimharris 280230557Sjimharris status = scif_sas_task_request_generic_construct( 281230557Sjimharris scif_controller, 282230557Sjimharris scif_remote_device, 283230557Sjimharris io_tag, 284230557Sjimharris user_task_request_object, 285230557Sjimharris task_request_memory, 286230557Sjimharris scif_task_request, 287230557Sjimharris task_function 288230557Sjimharris ); 289230557Sjimharris 290230557Sjimharris return status; 291230557Sjimharris} 292230557Sjimharris 293230557Sjimharris// --------------------------------------------------------------------------- 294230557Sjimharris 295230557Sjimharrisvoid scif_sas_internal_task_request_destruct( 296230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_internal_task 297230557Sjimharris) 298230557Sjimharris{ 299230557Sjimharris SCIF_SAS_CONTROLLER_T * fw_controller = 300230557Sjimharris fw_internal_task->parent.device->domain->controller; 301230557Sjimharris scif_sas_controller_free_internal_request(fw_controller, fw_internal_task); 302230557Sjimharris} 303230557Sjimharris 304230557Sjimharris// --------------------------------------------------------------------------- 305230557Sjimharris 306230557Sjimharrisvoid scic_cb_task_request_complete( 307230557Sjimharris SCI_CONTROLLER_HANDLE_T controller, 308230557Sjimharris SCI_REMOTE_DEVICE_HANDLE_T remote_device, 309230557Sjimharris SCI_TASK_REQUEST_HANDLE_T task_request, 310230557Sjimharris SCI_TASK_STATUS completion_status 311230557Sjimharris) 312230557Sjimharris{ 313230557Sjimharris SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*) 314230557Sjimharris sci_object_get_association(controller); 315230557Sjimharris SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) 316230557Sjimharris sci_object_get_association(remote_device); 317230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*) 318230557Sjimharris sci_object_get_association(task_request); 319230557Sjimharris SCI_STATUS status; 320230557Sjimharris 321230557Sjimharris SCIF_LOG_TRACE(( 322230557Sjimharris sci_base_object_get_logger(fw_controller), 323230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 324230557Sjimharris "scic_cb_task_request_complete(0x%x, 0x%x, 0x%x, 0x%x) enter\n", 325230557Sjimharris controller, remote_device, task_request, completion_status 326230557Sjimharris )); 327230557Sjimharris 328230557Sjimharris status = fw_task->parent.state_handlers->complete_handler( 329230557Sjimharris &fw_task->parent.parent 330230557Sjimharris ); 331230557Sjimharris 332230557Sjimharris if (status == SCI_SUCCESS) 333230557Sjimharris { 334230557Sjimharris if (fw_task->parent.protocol_complete_handler != NULL) 335230557Sjimharris { 336230557Sjimharris status = fw_task->parent.protocol_complete_handler( 337230557Sjimharris fw_controller, fw_device, &fw_task->parent, (SCI_STATUS *)&completion_status 338230557Sjimharris ); 339230557Sjimharris } 340230557Sjimharris 341230557Sjimharris if (status == SCI_SUCCESS) 342230557Sjimharris { 343230557Sjimharris SCIF_LOG_WARNING(( 344230557Sjimharris sci_base_object_get_logger(fw_task), 345230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 346230557Sjimharris "RemoteDevice:0x%x TaskRequest:0x%x Function:0x%x CompletionStatus:0x%x " 347230557Sjimharris "completed\n", 348230557Sjimharris fw_device, fw_task, 349230557Sjimharris scif_sas_task_request_get_function(fw_task), 350230557Sjimharris completion_status 351230557Sjimharris )); 352230557Sjimharris 353230557Sjimharris // If this isn't an internal framework IO request, then simply pass the 354230557Sjimharris // notification up to the SCIF user. Otherwise, immediately complete the 355230557Sjimharris // task since there is no SCIF user to notify. 356230557Sjimharris if (fw_task->parent.is_internal == FALSE) 357230557Sjimharris { 358230557Sjimharris scif_cb_task_request_complete( 359230557Sjimharris fw_controller, fw_device, fw_task, completion_status 360230557Sjimharris ); 361230557Sjimharris } 362230557Sjimharris else 363230557Sjimharris { 364230557Sjimharris scif_controller_complete_task( 365230557Sjimharris fw_controller, 366230557Sjimharris fw_device, 367230557Sjimharris fw_task 368230557Sjimharris ); 369230557Sjimharris } 370230557Sjimharris } 371230557Sjimharris } 372230557Sjimharris} 373230557Sjimharris 374230557Sjimharris// --------------------------------------------------------------------------- 375230557Sjimharris 376230557SjimharrisU32 scic_cb_ssp_task_request_get_lun( 377230557Sjimharris void * scic_user_task_request 378230557Sjimharris) 379230557Sjimharris{ 380230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*) 381230557Sjimharris scic_user_task_request; 382230557Sjimharris 383230557Sjimharris fw_task->parent.lun = scif_cb_task_request_get_lun( 384230557Sjimharris fw_task->parent.parent.parent.associated_object 385230557Sjimharris ); 386230557Sjimharris 387230557Sjimharris return fw_task->parent.lun; 388230557Sjimharris} 389230557Sjimharris 390230557Sjimharris// --------------------------------------------------------------------------- 391230557Sjimharris 392230557SjimharrisU8 scic_cb_ssp_task_request_get_function( 393230557Sjimharris void * scic_user_task_request 394230557Sjimharris) 395230557Sjimharris{ 396230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*) 397230557Sjimharris scic_user_task_request; 398230557Sjimharris 399230557Sjimharris return scif_sas_task_request_get_function(fw_task); 400230557Sjimharris} 401230557Sjimharris 402230557Sjimharris// --------------------------------------------------------------------------- 403230557Sjimharris 404230557SjimharrisU16 scic_cb_ssp_task_request_get_io_tag_to_manage( 405230557Sjimharris void * scic_user_task_request 406230557Sjimharris) 407230557Sjimharris{ 408230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*) 409230557Sjimharris scic_user_task_request; 410230557Sjimharris 411230557Sjimharris fw_task->io_tag_to_manage 412230557Sjimharris = scif_cb_task_request_get_io_tag_to_manage( 413230557Sjimharris fw_task->parent.parent.parent.associated_object 414230557Sjimharris ); 415230557Sjimharris 416230557Sjimharris return fw_task->io_tag_to_manage; 417230557Sjimharris} 418230557Sjimharris 419230557Sjimharris// --------------------------------------------------------------------------- 420230557Sjimharris 421230557Sjimharrisvoid * scic_cb_ssp_task_request_get_response_data_address( 422230557Sjimharris void * scic_user_task_request 423230557Sjimharris) 424230557Sjimharris{ 425230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*) 426230557Sjimharris scic_user_task_request; 427230557Sjimharris 428230557Sjimharris return scif_cb_task_request_get_response_data_address( 429230557Sjimharris fw_task->parent.parent.parent.associated_object 430230557Sjimharris ); 431230557Sjimharris} 432230557Sjimharris 433230557Sjimharris// --------------------------------------------------------------------------- 434230557Sjimharris 435230557SjimharrisU32 scic_cb_ssp_task_request_get_response_data_length( 436230557Sjimharris void * scic_user_task_request 437230557Sjimharris) 438230557Sjimharris{ 439230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*) 440230557Sjimharris scic_user_task_request; 441230557Sjimharris 442230557Sjimharris return scif_cb_task_request_get_response_data_length( 443230557Sjimharris fw_task->parent.parent.parent.associated_object 444230557Sjimharris ); 445230557Sjimharris} 446230557Sjimharris 447230557Sjimharris//****************************************************************************** 448230557Sjimharris//* P R O T E C T E D M E T H O D S 449230557Sjimharris//****************************************************************************** 450230557Sjimharris 451230557Sjimharris/** 452230557Sjimharris * @brief This method performs functionality required after a task management 453230557Sjimharris * operation (either a task management request or a silicon task 454230557Sjimharris * termination) has finished. 455230557Sjimharris * 456230557Sjimharris * @param[in] fw_task This parameter specifies the request that has 457230557Sjimharris * the operation completing. 458230557Sjimharris * 459230557Sjimharris * @return none 460230557Sjimharris */ 461230557Sjimharrisvoid scif_sas_task_request_operation_complete( 462230557Sjimharris SCIF_SAS_TASK_REQUEST_T * fw_task 463230557Sjimharris) 464230557Sjimharris{ 465230557Sjimharris SCIF_LOG_TRACE(( 466230557Sjimharris sci_base_object_get_logger(fw_task), 467230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 468230557Sjimharris "scif_sas_task_request_operation_complete(0x%x) enter\n", 469230557Sjimharris fw_task 470230557Sjimharris )); 471230557Sjimharris 472230557Sjimharris fw_task->affected_request_count--; 473230557Sjimharris 474230557Sjimharris SCIF_LOG_INFO(( 475230557Sjimharris sci_base_object_get_logger(fw_task), 476230557Sjimharris SCIF_LOG_OBJECT_TASK_MANAGEMENT, 477230557Sjimharris "TaskRequest:0x%x current affected request count:0x%x\n", 478230557Sjimharris fw_task, fw_task->affected_request_count 479230557Sjimharris )); 480230557Sjimharris} 481230557Sjimharris 482