/** * @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 searches the domain's request list and counts outstanding * smp IOs. * * @param[in] fw_domain The domain that its request list is to be searched. * * @return U8 The possible return value of this routine is 0 or 1. */ U8 scif_sas_domain_get_smp_request_count( SCIF_SAS_DOMAIN_T * fw_domain ) { SCI_FAST_LIST_ELEMENT_T * element = fw_domain->request_list.list_head; SCIF_SAS_REQUEST_T * request = NULL; U8 count = 0; SCIC_TRANSPORT_PROTOCOL protocol; // Cycle through the fast list of IO requests. Terminate each // outstanding requests that matches the criteria supplied by the // caller. while (element != NULL) { request = (SCIF_SAS_REQUEST_T*) sci_fast_list_get_object(element); // The current element may be deleted from the list becasue of // IO completion so advance to the next element early element = sci_fast_list_get_next(element); protocol = scic_io_request_get_protocol(request->core_object); if ( protocol == SCIC_SMP_PROTOCOL) count++; } return count; }
// ---------------------------------------------------------------------------- U32 scif_io_request_get_number_of_bytes_transferred( SCI_IO_REQUEST_HANDLE_T scif_io_request ) { SCIF_SAS_IO_REQUEST_T * fw_request = (SCIF_SAS_IO_REQUEST_T*) scif_io_request; if(scic_io_request_get_protocol(scif_io_request_get_scic_handle(scif_io_request)) == SCIC_STP_PROTOCOL) { U16 sati_data_bytes_set = sati_get_number_data_bytes_set(&(fw_request->parent.stp.sequence)); if (sati_data_bytes_set != 0) return sati_data_bytes_set; else { #if !defined(DISABLE_ATAPI) U8 sat_protocol = fw_request->parent.stp.sequence.protocol; if ( sat_protocol & SAT_PROTOCOL_PACKET) return scif_sas_stp_packet_io_request_get_number_of_bytes_transferred(fw_request); else #endif return scic_io_request_get_number_of_bytes_transferred( scif_io_request_get_scic_handle(scif_io_request)); } } else { return scic_io_request_get_number_of_bytes_transferred( scif_io_request_get_scic_handle(scif_io_request)); } }