/** * @brief This method searches the whole domain and finds all the smp devices to * cancel their smp activities if there is any. * * @param[in] fw_domain The domain that its smp activities are to be canceled. * * @return none. */ void scif_sas_domain_cancel_smp_activities( SCIF_SAS_DOMAIN_T * fw_domain ) { SCI_ABSTRACT_ELEMENT_T * current_element = sci_abstract_list_get_front(&fw_domain->remote_device_list); SCIF_SAS_REMOTE_DEVICE_T * current_device; //purge all the outstanding internal IOs in HPQ. scif_sas_high_priority_request_queue_purge_domain( &fw_domain->controller->hprq, fw_domain ); while ( current_element != NULL ) { SMP_DISCOVER_RESPONSE_PROTOCOLS_T dev_protocols; current_device = (SCIF_SAS_REMOTE_DEVICE_T *) sci_abstract_list_get_object(current_element); scic_remote_device_get_protocols(current_device->core_object, &dev_protocols ); if (dev_protocols.u.bits.attached_smp_target) { scif_sas_smp_remote_device_cancel_smp_activity(current_device); } current_element = sci_abstract_list_get_next(current_element); } }
/** * @brief This method implements the actions taken when entering the * STOPPING state. * * @param[in] object This parameter specifies the base object for which * the state transition is occurring. This is cast into a * SCIF_SAS_DOMAIN object in the method implementation. * * @return none */ static void scif_sas_domain_stopping_state_enter( SCI_BASE_OBJECT_T * object ) { SCIF_SAS_REMOTE_DEVICE_T * fw_device; SCIF_SAS_DOMAIN_T * fw_domain = (SCIF_SAS_DOMAIN_T *)object; SCI_ABSTRACT_ELEMENT_T * element = sci_abstract_list_get_front( &fw_domain->remote_device_list ); SET_STATE_HANDLER( fw_domain, scif_sas_domain_state_handler_table, SCI_BASE_DOMAIN_STATE_STOPPING ); // This must be invoked after the state handlers are set to ensure // appropriate processing will occur if the user attempts to perform // additional actions. scif_sas_domain_transition_from_discovering_state(fw_domain); SCIF_LOG_TRACE(( sci_base_object_get_logger(fw_domain), SCIF_LOG_OBJECT_DOMAIN | SCIF_LOG_OBJECT_DOMAIN_DISCOVERY, "scif_sas_domain_stopping_state_enter(0x%x) enter\n", fw_domain )); scif_sas_high_priority_request_queue_purge_domain( &fw_domain->controller->hprq, fw_domain ); // Search the domain's list of devices and put them all in the STOPPING // state. while (element != NULL) { fw_device = (SCIF_SAS_REMOTE_DEVICE_T*) sci_abstract_list_get_object(element); // This method will stop the core device. The core will terminate // all IO requests currently outstanding. fw_device->state_handlers->parent.stop_handler(&fw_device->parent); element = sci_abstract_list_get_next(element); } // Attempt to transition to the stopped state. scif_sas_domain_transition_to_stopped_state(fw_domain); }