/** * @brief This handler is currently solely used by smp remote device for * discovering. * * @param[in] remote_device This parameter specifies the remote device * object on which the user is attempting to perform a complete high * priority IO operation. * @param[in] io_request This parameter specifies the high priority IO request * to be completed. * * @return SCI_STATUS indicate whether the io complete successfully. */ SCI_STATUS scif_sas_remote_device_ready_task_management_complete_high_priority_io_handler( SCI_BASE_REMOTE_DEVICE_T * remote_device, SCI_BASE_REQUEST_T * io_request, void * response_data, SCI_IO_STATUS completion_status ) { SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) remote_device; SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T*) io_request; SCI_STATUS status = SCI_SUCCESS; SCIC_TRANSPORT_PROTOCOL protocol; SCIF_LOG_TRACE(( sci_base_object_get_logger(remote_device), SCIF_LOG_OBJECT_REMOTE_DEVICE | SCIF_LOG_OBJECT_IO_REQUEST, "scif_sas_remote_device_ready_task_management_complete_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n", remote_device, io_request, response_data, completion_status )); fw_device->request_count--; // we are back to ready operational sub state here. sci_base_state_machine_change_state( &fw_device->ready_substate_machine, SCIF_SAS_REMOTE_DEVICE_READY_SUBSTATE_OPERATIONAL ); protocol = scic_io_request_get_protocol(fw_request->core_object); // If this request was an SMP initiator request we created, then // decode the response. if (protocol == SCIC_SMP_PROTOCOL) { if (completion_status != SCI_IO_FAILURE_TERMINATED) { status = scif_sas_smp_remote_device_decode_smp_response( fw_device, fw_request, response_data, completion_status ); } else scif_sas_smp_remote_device_terminated_request_handler(fw_device, fw_request); } else { // Currently, there are only internal SMP requests. So, default work // is simply to clean up the internal request. if (fw_request->is_internal == TRUE) { scif_sas_internal_io_request_complete( fw_device->domain->controller, (SCIF_SAS_INTERNAL_IO_REQUEST_T *)fw_request, SCI_SUCCESS ); } } return status; }
/** * @brief This method provides STOPPING state handling for high priority * IO requests, when the framework attempts to complete a high * priority request. * * @param[in] remote_device This parameter specifies the remote device * object for which to complete the high priority IO. * @param[in] io_request This parameter specifies the IO request to be * completed. * @param[in] response_data This parameter is ignored, since the device * is in the stopping state. * * @return This method always returns success. */ static SCI_STATUS scif_sas_remote_device_stopping_complete_high_priority_io_handler( SCI_BASE_REMOTE_DEVICE_T * remote_device, SCI_BASE_REQUEST_T * io_request, void * response_data, SCI_IO_STATUS completion_status ) { SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T *) remote_device; SCIF_SAS_REQUEST_T * fw_request = (SCIF_SAS_REQUEST_T *) io_request; SCIF_LOG_TRACE(( sci_base_object_get_logger(remote_device), SCIF_LOG_OBJECT_REMOTE_DEVICE | SCIF_LOG_OBJECT_IO_REQUEST, "scif_sas_remote_device_stopping_complete_high_priority_io_handler(0x%x,0x%x,0x%x) enter\n", remote_device, io_request, response_data )); fw_device->request_count--; if (fw_request->is_internal == TRUE) { scif_sas_internal_io_request_complete( fw_device->domain->controller, (SCIF_SAS_INTERNAL_IO_REQUEST_T *) io_request, SCI_SUCCESS ); } return SCI_SUCCESS; }