/** * @brief This method implements the actions taken when entering the * FAILED state. This includes setting the state handler methods * and issuing a scif_cb_remote_device_failed() notification to * the user. * * @param[in] object This parameter specifies the base object for which * the state transition is occurring. This is cast into a * SCIF_SAS_REMOTE_DEVICE object in the method implementation. * * @return none */ static void scif_sas_remote_device_failed_state_enter( SCI_BASE_OBJECT_T *object ) { SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T *)object; SET_STATE_HANDLER( fw_device, scif_sas_remote_device_state_handler_table, SCI_BASE_REMOTE_DEVICE_STATE_FAILED ); SCIF_LOG_INFO(( sci_base_object_get_logger(fw_device), SCIF_LOG_OBJECT_REMOTE_DEVICE | SCIF_LOG_OBJECT_REMOTE_DEVICE_CONFIG, "Domain:0x%x Device:0x%x Status:0x%x device failed\n", fw_device->domain, fw_device, fw_device->operation_status )); // Notify the user that the device has failed. scif_cb_remote_device_failed( fw_device->domain->controller, fw_device->domain, fw_device, fw_device->operation_status ); // Only call start_complete for the remote device if the device failed // from the STARTING state. if (fw_device->parent.state_machine.previous_state_id == SCI_BASE_REMOTE_DEVICE_STATE_STARTING) scif_sas_domain_remote_device_start_complete(fw_device->domain,fw_device); }
/** * @brief This method provides STARTING AWAIT READY sub-state specific * handling for when the core provides a device ready notification * for the remote device. This essentially, causes a transition * of the framework remote device into the READY state. * * @param[in] fw_device This parameter specifies the remote device * object for which the notification has occurred. * * @return none. */ static void scif_sas_remote_device_starting_await_ready_ready_handler( SCIF_SAS_REMOTE_DEVICE_T * fw_device ) { #if !defined(DISABLE_WIDE_PORTED_TARGETS) if (fw_device->destination_state == SCIF_SAS_REMOTE_DEVICE_DESTINATION_STATE_UPDATING_PORT_WIDTH) { { sci_base_state_machine_change_state( &fw_device->parent.state_machine, SCI_BASE_REMOTE_DEVICE_STATE_UPDATING_PORT_WIDTH ); } } else #endif { sci_base_state_machine_change_state( &fw_device->parent.state_machine, SCI_BASE_REMOTE_DEVICE_STATE_READY ); } #if !defined(DISABLE_WIDE_PORTED_TARGETS) scif_sas_domain_remote_device_start_complete(fw_device->domain,fw_device); #endif }
/** * @brief This method implements the actions taken when entering the * READY state. Currently this method simply starts the * sub-state machine. * * @param[in] object This parameter specifies the base object for which * the state transition is occurring. This is cast into a * SCIF_SAS_REMOTE_DEVICE object in the method implementation. * * @return none */ static void scif_sas_remote_device_ready_state_enter( SCI_BASE_OBJECT_T *object ) { SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T *)object; // Transition immediately into the operational sub-state. sci_base_state_machine_start(&fw_device->ready_substate_machine); #if defined(DISABLE_WIDE_PORTED_TARGETS) scif_sas_domain_remote_device_start_complete(fw_device->domain,fw_device); #endif }