/** * @brief */ void scic_sds_remote_node_context_construct( SCIC_SDS_REMOTE_DEVICE_T * device, SCIC_SDS_REMOTE_NODE_CONTEXT_T * rnc, U16 remote_node_index ) { memset (rnc, 0, sizeof(SCIC_SDS_REMOTE_NODE_CONTEXT_T) ); rnc->remote_node_index = remote_node_index; rnc->device = device; rnc->destination_state = SCIC_SDS_REMOTE_NODE_DESTINATION_STATE_UNSPECIFIED; rnc->parent.logger = device->parent.parent.logger; sci_base_state_machine_construct( &rnc->state_machine, &rnc->parent, scic_sds_remote_node_context_state_table, SCIC_SDS_REMOTE_NODE_CONTEXT_INITIAL_STATE ); sci_base_state_machine_start(&rnc->state_machine); // State logging initialization takes place late for the remote node context // see the resume state handler for the initial state. }
/** * @brief This method is called by the SCI user to build an SMP pass-through * IO request. * * @pre * - The user must have previously called scic_io_request_construct() * on the supplied IO request. * * @param[in] scic_smp_request This parameter specifies the handle to the * io request object to be built. * * @param[in] passthru_cb This parameter specifies the pointer to the callback * structure that contains the function pointers * * @return Indicate if the controller successfully built the IO request. */ SCI_STATUS scic_io_request_construct_smp_pass_through( SCI_IO_REQUEST_HANDLE_T scic_smp_request, SCIC_SMP_PASSTHRU_REQUEST_CALLBACKS_T *passthru_cb ) { SMP_REQUEST_T smp_request; U8 * request_buffer; U32 request_buffer_length_in_bytes; SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *) scic_smp_request; SCIC_LOG_TRACE(( sci_base_object_get_logger(this_request), SCIC_LOG_OBJECT_SMP_IO_REQUEST, "scic_io_request_construct_smp_pass_through(0x%x) enter\n", this_request )); this_request->protocol = SCIC_SMP_PROTOCOL; this_request->has_started_substate_machine = TRUE; // Call the callback function to retrieve the SMP passthrough request request_buffer_length_in_bytes = passthru_cb->scic_cb_smp_passthru_get_request ( (void *)this_request, &request_buffer ); //copy the request to smp request memcpy((char *)&smp_request.request.vendor_specific_request, request_buffer, request_buffer_length_in_bytes); //the header length in smp_request is in dwords - the sas spec has similar way, //but the csmi header contains the number of bytes, so we need to convert the //number of bytes to number of dwords smp_request.header.request_length = (U8) (request_buffer_length_in_bytes / sizeof (U32)); //Grab the other needed fields from the smp request using callbacks smp_request.header.smp_frame_type = passthru_cb->scic_cb_smp_passthru_get_frame_type ((void *)this_request); smp_request.header.function = passthru_cb->scic_cb_smp_passthru_get_function ((void *)this_request); smp_request.header.allocated_response_length = passthru_cb->scic_cb_smp_passthru_get_allocated_response_length((void *)this_request); // Construct the started sub-state machine. sci_base_state_machine_construct( &this_request->started_substate_machine, &this_request->parent.parent, scic_sds_smp_request_started_substate_table, SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATE_AWAIT_RESPONSE ); // Construct the SMP SCU Task Context scu_smp_request_construct_task_context (this_request, &smp_request); sci_base_state_machine_change_state( &this_request->parent.state_machine, SCI_BASE_REQUEST_STATE_CONSTRUCTED ); return SCI_SUCCESS; }
void sci_base_phy_construct( SCI_BASE_PHY_T *this_phy, SCI_BASE_LOGGER_T *logger, SCI_BASE_STATE_T *state_table ) { sci_base_object_construct(&this_phy->parent, logger); sci_base_state_machine_construct( &this_phy->state_machine, &this_phy->parent, state_table, SCI_BASE_PHY_STATE_INITIAL ); sci_base_state_machine_start( &this_phy->state_machine ); }
void sci_base_port_construct( SCI_BASE_PORT_T *this_port, SCI_BASE_LOGGER_T *logger, SCI_BASE_STATE_T *state_table ) { sci_base_object_construct(&this_port->parent, logger); sci_base_state_machine_construct( &this_port->state_machine, &this_port->parent, state_table, SCI_BASE_PORT_STATE_STOPPED ); sci_base_state_machine_start( &this_port->state_machine ); }
void sci_base_domain_construct( SCI_BASE_DOMAIN_T * this_domain, SCI_BASE_LOGGER_T * logger, SCI_BASE_STATE_T * state_table ) { sci_base_object_construct(&this_domain->parent, logger); sci_base_state_machine_construct( &this_domain->state_machine, &this_domain->parent, state_table, SCI_BASE_DOMAIN_STATE_INITIAL ); sci_base_state_machine_start( &this_domain->state_machine ); }
void sci_base_remote_device_construct( SCI_BASE_REMOTE_DEVICE_T *this_device, SCI_BASE_LOGGER_T *logger, SCI_BASE_STATE_T *state_table ) { sci_base_object_construct( &this_device->parent, logger ); sci_base_state_machine_construct( &this_device->state_machine, &this_device->parent, state_table, SCI_BASE_REMOTE_DEVICE_STATE_INITIAL ); sci_base_state_machine_start( &this_device->state_machine ); }
void sci_base_request_construct( SCI_BASE_REQUEST_T *this_request, SCI_BASE_LOGGER_T *my_logger, SCI_BASE_STATE_T *my_state_table ) { sci_base_object_construct( &this_request->parent, my_logger ); sci_base_state_machine_construct( &this_request->state_machine, &this_request->parent, my_state_table, SCI_BASE_REQUEST_STATE_INITIAL ); sci_base_state_machine_start( &this_request->state_machine ); }
/** * @brief This method is called by the SCI user to build an SMP * IO request. * * @pre * - The user must have previously called scic_io_request_construct() * on the supplied IO request. * * @param[in] scic_io_request This parameter specifies the handle to the * io request object to be built. * * @return Indicate if the controller successfully built the IO request. * @retval SCI_SUCCESS This value is returned if the IO request was * successfully built. * @retval SCI_FAILURE_UNSUPPORTED_PROTOCOL This value is returned if the * remote_device does not support the SMP protocol. * @retval SCI_FAILURE_INVALID_ASSOCIATION This value is returned if the * user did not properly set the association between the SCIC IO * request and the user's IO request. Please refer to the * sci_object_set_association() routine for more * information. */ SCI_STATUS scic_io_request_construct_smp( SCI_IO_REQUEST_HANDLE_T scic_smp_request ) { SMP_REQUEST_T smp_request; SCIC_SDS_REQUEST_T *this_request = (SCIC_SDS_REQUEST_T *) scic_smp_request; SCIC_LOG_TRACE(( sci_base_object_get_logger(this_request), SCIC_LOG_OBJECT_SMP_IO_REQUEST, "scic_io_request_construct_smp(0x%x) enter\n", this_request )); this_request->protocol = SCIC_SMP_PROTOCOL; this_request->has_started_substate_machine = TRUE; // Construct the started sub-state machine. sci_base_state_machine_construct( &this_request->started_substate_machine, &this_request->parent.parent, scic_sds_smp_request_started_substate_table, SCIC_SDS_SMP_REQUEST_STARTED_SUBSTATE_AWAIT_RESPONSE ); // Construct the SMP SCU Task Context memcpy((char *)&smp_request, this_request->command_buffer, sizeof(SMP_REQUEST_T)); // Look at the SMP requests' header fields; for certain SAS 1.x SMP // functions under SAS 2.0, a zero request length really indicates // a non-zero default length. if( smp_request.header.request_length == 0 ) { switch( smp_request.header.function ) { case SMP_FUNCTION_DISCOVER: case SMP_FUNCTION_REPORT_PHY_ERROR_LOG: case SMP_FUNCTION_REPORT_PHY_SATA: case SMP_FUNCTION_REPORT_ROUTE_INFORMATION: smp_request.header.request_length = 2; break; case SMP_FUNCTION_CONFIGURE_ROUTE_INFORMATION: case SMP_FUNCTION_PHY_CONTROL: case SMP_FUNCTION_PHY_TEST: smp_request.header.request_length = 9; break; // Default - zero is a valid default for 2.0. } } scu_smp_request_construct_task_context( this_request, &smp_request ); sci_base_state_machine_change_state( &this_request->parent.state_machine, SCI_BASE_REQUEST_STATE_CONSTRUCTED ); return SCI_SUCCESS; }