#include <sys/cdefs.h>
#include <dev/isci/scil/sci_util.h>
#include <dev/isci/scil/scic_controller.h>
#include <dev/isci/scil/scic_port.h>
#include <dev/isci/scil/scic_remote_device.h>
#include <dev/isci/scil/scic_io_request.h>
#include <dev/isci/scil/scif_sas_controller.h>
#include <dev/isci/scil/scif_sas_remote_device.h>
#include <dev/isci/scil/scif_sas_logger.h>
#include <dev/isci/scil/scif_sas_smp_remote_device.h>
static
SCI_STATUS scif_sas_controller_execute_reset(
SCIF_SAS_CONTROLLER_T * fw_controller
)
{
SCI_STATUS status;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_CONTROLLER_RESET,
"scif_sas_controller_execute_reset(0x%x) enter\n",
fw_controller
));
scif_sas_controller_release_resource(fw_controller);
sci_base_state_machine_change_state(
&fw_controller->parent.state_machine,
SCI_BASE_CONTROLLER_STATE_RESETTING
);
status = fw_controller->operation_status;
fw_controller->operation_status = SCI_SUCCESS;
return status;
}
static
SCI_STATUS scif_sas_controller_validate_mdl(
SCIF_SAS_CONTROLLER_T * fw_controller
)
{
BOOL is_mde_list_valid;
is_mde_list_valid = sci_base_mde_is_valid(
&fw_controller->mdes[SCIF_SAS_MDE_INTERNAL_IO],
4,
fw_controller->internal_request_entries *
scif_sas_internal_request_get_object_size(),
SCI_MDE_ATTRIBUTE_PHYSICALLY_CONTIGUOUS
);
if (is_mde_list_valid == FALSE)
return SCI_FAILURE_UNSUPPORTED_INFORMATION_FIELD;
return SCI_SUCCESS;
}
static
SCI_STATUS scif_sas_controller_stop_domains(
SCIF_SAS_CONTROLLER_T * fw_controller
)
{
U8 index;
SCI_STATUS status = SCI_SUCCESS;
SCIF_SAS_DOMAIN_T * fw_domain;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"scif_sas_controller_stop_domains(0x%x) enter\n",
fw_controller
));
for (index = 0; index < SCI_MAX_DOMAINS && status == SCI_SUCCESS; index++)
{
fw_domain = &fw_controller->domains[index];
if (fw_domain->parent.state_machine.current_state_id ==
SCI_BASE_DOMAIN_STATE_READY
|| fw_domain->parent.state_machine.current_state_id ==
SCI_BASE_DOMAIN_STATE_DISCOVERING)
{
sci_base_state_machine_change_state(
&fw_domain->parent.state_machine, SCI_BASE_DOMAIN_STATE_STOPPING
);
}
}
return status;
}
SCI_STATUS scif_sas_controller_continue_to_stop(
SCIF_SAS_CONTROLLER_T * fw_controller
)
{
SCI_STATUS status;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
"scif_sas_controller_continue_to_stop (0x%x).\n",
fw_controller
));
status = scif_sas_controller_stop_domains(fw_controller);
if (status == SCI_SUCCESS)
{
status = scic_controller_stop(fw_controller->core_object, 0);
if (status != SCI_SUCCESS)
{
SCIF_LOG_ERROR((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
"Controller:0x%x Status:0x%x unable to stop controller.\n",
fw_controller, status
));
sci_base_state_machine_change_state(
&fw_controller->parent.state_machine,
SCI_BASE_CONTROLLER_STATE_FAILED
);
}
}
else
{
SCIF_LOG_ERROR((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_SHUTDOWN,
"Controller:0x%x Status:0x%x unable to stop domains.\n",
fw_controller, status
));
sci_base_state_machine_change_state(
&fw_controller->parent.state_machine,
SCI_BASE_CONTROLLER_STATE_FAILED
);
}
return status;
}
static
SCI_STATUS scif_sas_controller_reset_initialize_handler(
SCI_BASE_CONTROLLER_T * controller
)
{
SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T *)controller;
SCI_STATUS status;
U32 index;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
"scif_sas_controller_reset_initialize_handler(0x%x) enter\n",
controller
));
sci_base_state_machine_change_state(
&fw_controller->parent.state_machine,
SCI_BASE_CONTROLLER_STATE_INITIALIZING
);
scif_sas_controller_build_mdl(fw_controller);
for (index = 0; index < SCI_MAX_DOMAINS; index++)
scif_sas_domain_initialize(&fw_controller->domains[index]);
scif_cb_lock_associate(fw_controller, &fw_controller->hprq.lock);
status = scic_controller_initialize(fw_controller->core_object);
if (status == SCI_SUCCESS)
{
sci_base_state_machine_change_state(
&fw_controller->parent.state_machine,
SCI_BASE_CONTROLLER_STATE_INITIALIZED
);
}
if (status != SCI_SUCCESS)
{
scif_sas_controller_release_resource(fw_controller);
SCIF_LOG_ERROR((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
"Controller:0x%x Status:0x%x unable to successfully initialize.\n",
fw_controller, status
));
}
return status;
}
static
SCI_STATUS scif_sas_controller_initialized_start_handler(
SCI_BASE_CONTROLLER_T * controller,
U32 timeout
)
{
SCI_STATUS status = SCI_SUCCESS;
SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T *)controller;
U16 index = 0;
SCI_PHYSICAL_MEMORY_DESCRIPTOR_T internal_reqeust_mde =
fw_controller->mdes[SCIF_SAS_MDE_INTERNAL_IO];
void * internal_request_virtual_address = internal_reqeust_mde.virtual_address;
POINTER_UINT address = (POINTER_UINT)internal_request_virtual_address;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
"scif_sas_controller_initialized_start_handler(0x%x, 0x%x) enter\n",
controller, timeout
));
sci_base_state_machine_change_state(
&fw_controller->parent.state_machine,
SCI_BASE_CONTROLLER_STATE_STARTING
);
status = scif_sas_controller_validate_mdl(fw_controller);
if (status == SCI_SUCCESS)
{
sci_pool_initialize(fw_controller->internal_request_memory_pool);
for (index = 0; index < fw_controller->internal_request_entries; index++)
{
sci_pool_put(fw_controller->internal_request_memory_pool, address);
address += scif_sas_internal_request_get_object_size();
}
scif_cb_start_internal_io_task_create(fw_controller);
}
if (status == SCI_SUCCESS)
{
for (index = 0;
(index < SCI_MAX_DOMAINS) && (status == SCI_SUCCESS);
index++)
{
sci_base_state_machine_change_state(
&fw_controller->domains[index].parent.state_machine,
SCI_BASE_DOMAIN_STATE_STARTING
);
status = fw_controller->domains[index].operation.status;
}
}
if (status != SCI_SUCCESS)
{
SCIF_LOG_ERROR((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
"Controller:0x%x Domain:0x%x Status:0x%x unable to start\n",
fw_controller, index, status
));
return status;
}
status = scic_controller_start(fw_controller->core_object, timeout);
if (status != SCI_SUCCESS)
{
SCIF_LOG_ERROR((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
"Controller:0x%x Status:0x%x unable to start controller.\n",
fw_controller, status
));
sci_base_state_machine_change_state(
&fw_controller->parent.state_machine,
SCI_BASE_CONTROLLER_STATE_FAILED
);
}
return status;
}
static
SCI_STATUS scif_sas_controller_ready_stop_handler(
SCI_BASE_CONTROLLER_T * controller,
U32 timeout
)
{
SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T *)controller;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_INITIALIZATION,
"scif_sas_controller_ready_stop_handler(0x%x, 0x%x) enter\n",
controller, timeout
));
sci_base_state_machine_change_state(
&fw_controller->parent.state_machine,
SCI_BASE_CONTROLLER_STATE_STOPPING
);
if (fw_controller->user_parameters.sas.clear_affiliation_during_controller_stop)
{
fw_controller->current_domain_to_clear_affiliation = 0;
scif_sas_controller_clear_affiliation(fw_controller);
}
else
scif_sas_controller_continue_to_stop(fw_controller);
return SCI_SUCCESS;
}
static
SCI_STATUS scif_sas_controller_ready_reset_handler(
SCI_BASE_CONTROLLER_T * controller
)
{
return scif_sas_controller_execute_reset((SCIF_SAS_CONTROLLER_T*)controller);
}
static
SCI_STATUS scif_sas_controller_ready_start_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request,
U16 io_tag
)
{
SCI_STATUS status;
SCIF_SAS_IO_REQUEST_T *fw_io = (SCIF_SAS_IO_REQUEST_T*)io_request;
SCIF_SAS_CONTROLLER_T *fw_controller = (SCIF_SAS_CONTROLLER_T*)controller;
SCIF_SAS_REMOTE_DEVICE_T *fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
remote_device;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
"scif_sas_controller_ready_start_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
controller, remote_device, io_request, io_tag
));
status = fw_device->domain->state_handlers->start_io_handler(
&fw_device->domain->parent, remote_device, io_request
);
if (status == SCI_SUCCESS)
{
status = (SCI_STATUS)scic_controller_start_io(
fw_controller->core_object,
fw_device->core_object,
fw_io->parent.core_object,
io_tag
);
if (status == SCI_SUCCESS)
{
sci_base_state_machine_change_state(
&io_request->state_machine, SCI_BASE_REQUEST_STATE_STARTED
);
}
else
{
fw_device->domain->state_handlers->complete_io_handler(
&fw_device->domain->parent, remote_device, io_request
);
fw_io->parent.state_handlers->complete_handler(io_request);
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x IORequest:0x%x Status:0x%x core IO start failed\n",
fw_controller, fw_io, status
));
}
}
else
{
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x IORequest:0x%x Status:0x%x IO start failed\n",
fw_controller, fw_io, status
));
}
return status;
}
static
SCI_STATUS scif_sas_controller_ready_complete_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request
)
{
SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*)
controller;
SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
remote_device;
SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T*)
io_request;
SCI_STATUS status;
SCI_STATUS core_status;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
"scif_sas_controller_ready_complete_io_handler(0x%x, 0x%x, 0x%x) enter\n",
controller, remote_device, io_request
));
fw_io->parent.state_handlers->destruct_handler(&fw_io->parent.parent);
status = fw_device->domain->state_handlers->complete_io_handler(
&fw_device->domain->parent, remote_device, io_request
);
core_status = scic_controller_complete_io(
fw_controller->core_object,
fw_device->core_object,
fw_io->parent.core_object
);
if (status == SCI_SUCCESS)
status = core_status;
if (status != SCI_SUCCESS)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x IORequest:0x%x Status:0x%x CoreStatus:0x%x "
"failure to complete IO\n",
fw_controller, fw_io, status, core_status
));
}
return status;
}
static
SCI_STATUS scif_sas_controller_ready_complete_high_priority_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request
)
{
SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*)
controller;
SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
remote_device;
SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T*)
io_request;
SCI_IO_STATUS core_completion_status =
scic_request_get_sci_status(fw_io->parent.core_object);
U8 response_data[SCIF_SAS_RESPONSE_DATA_LENGTH];
SCI_STATUS status;
SCI_STATUS core_status;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
"scif_sas_controller_ready_complete_high_priority_io_handler(0x%x, 0x%x, 0x%x) enter\n",
controller, remote_device, io_request
));
memcpy(response_data,
scic_io_request_get_response_iu_address(fw_io->parent.core_object),
SCIF_SAS_RESPONSE_DATA_LENGTH
);
core_status = scic_controller_complete_io(
fw_controller->core_object,
fw_device->core_object,
fw_io->parent.core_object
);
fw_io->parent.state_handlers->destruct_handler(&fw_io->parent.parent);
status = fw_device->domain->state_handlers->complete_high_priority_io_handler(
&fw_device->domain->parent,
remote_device,
io_request,
(void *)response_data,
core_completion_status
);
if (status == SCI_SUCCESS)
status = core_status;
if (status == SCI_SUCCESS)
{
if( !sci_pool_empty(fw_controller->hprq.pool) )
scif_cb_start_internal_io_task_schedule(
fw_controller,
scif_sas_controller_start_high_priority_io,
fw_controller
);
}
else
{
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x IORequest:0x%x Status:0x%x CoreStatus:0x%x "
"failure to complete IO\n",
fw_controller, fw_io, status, core_status
));
}
return status;
}
static
SCI_STATUS scif_sas_controller_ready_continue_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request
)
{
SCIF_LOG_TRACE((
sci_base_object_get_logger(controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
"scif_sas_controller_ready_continue_io_handler(0x%x, 0x%x, 0x%x) enter\n",
controller, remote_device, io_request
));
return SCI_FAILURE;
}
static
SCI_STATUS scif_sas_controller_ready_start_task_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * task_request,
U16 io_tag
)
{
SCIF_SAS_CONTROLLER_T * fw_controller = (SCIF_SAS_CONTROLLER_T*)
controller;
SCIF_SAS_REMOTE_DEVICE_T * fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
remote_device;
SCIF_SAS_TASK_REQUEST_T * fw_task = (SCIF_SAS_TASK_REQUEST_T*)task_request;
SCI_STATUS status;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
"scif_sas_controller_ready_start_task_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
controller, remote_device, task_request, io_tag
));
status = fw_device->domain->state_handlers->start_task_handler(
&fw_device->domain->parent, remote_device, task_request
);
if (status == SCI_SUCCESS)
{
if (scif_sas_task_request_get_function(fw_task)
== SCI_SAS_HARD_RESET)
{
scif_sas_remote_device_target_reset(
fw_device,
(SCIF_SAS_REQUEST_T *)fw_task
);
return SCI_SUCCESS;
}
status = (SCI_STATUS)scic_controller_start_task(
fw_controller->core_object,
fw_device->core_object,
fw_task->parent.core_object,
io_tag
);
if (status == SCI_SUCCESS)
{
fw_task->parent.state_handlers->start_handler(&fw_task->parent.parent);
}
else
{
fw_device->domain->state_handlers->complete_task_handler(
&fw_device->domain->parent, remote_device, task_request
);
if (status == SCI_SUCCESS)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x TaskRequest:0x%x Status:0x%x core start failed\n",
fw_controller, fw_task, status
));
}
}
}
else
{
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x TaskRequest:0x%x Status:0x%x Task start failed\n",
fw_controller, fw_task, status
));
}
return status;
}
static
SCI_STATUS scif_sas_controller_ready_complete_task_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * task_request
)
{
SCIF_SAS_CONTROLLER_T *fw_controller = (SCIF_SAS_CONTROLLER_T*)controller;
SCIF_SAS_REMOTE_DEVICE_T *fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)remote_device;
SCIF_SAS_TASK_REQUEST_T *fw_task = (SCIF_SAS_TASK_REQUEST_T*)task_request;
SCI_STATUS status;
SCI_STATUS core_status;
SCIF_LOG_TRACE((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_TASK_MANAGEMENT,
"scif_sas_controller_ready_complete_task_handler(0x%x, 0x%x, 0x%x) enter\n",
controller, remote_device, task_request
));
status = fw_device->domain->state_handlers->complete_task_handler(
&fw_device->domain->parent, remote_device, task_request
);
if (scif_sas_task_request_get_function(fw_task)
== SCI_SAS_HARD_RESET)
{
return status;
}
fw_task->parent.state_handlers->destruct_handler(&fw_task->parent.parent);
core_status = scic_controller_complete_task(
fw_controller->core_object,
fw_device->core_object,
fw_task->parent.core_object
);
if (status == SCI_SUCCESS)
status = core_status;
if (status != SCI_SUCCESS)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x TaskRequest:0x%x Status:0x%x CoreStatus:0x%x "
"failed to complete\n",
fw_controller, fw_task, status, core_status
));
}
return status;
}
static
SCI_STATUS scif_sas_controller_common_start_high_priority_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request,
U16 io_tag
)
{
SCI_STATUS status;
SCIF_SAS_IO_REQUEST_T *fw_io = (SCIF_SAS_IO_REQUEST_T*)io_request;
SCIF_SAS_CONTROLLER_T *fw_controller = (SCIF_SAS_CONTROLLER_T*)controller;
SCIF_SAS_REMOTE_DEVICE_T *fw_device = (SCIF_SAS_REMOTE_DEVICE_T*)
remote_device;
status = fw_device->domain->state_handlers->start_high_priority_io_handler(
&fw_device->domain->parent, remote_device, io_request
);
if (status == SCI_SUCCESS)
{
status = (SCI_STATUS)scic_controller_start_io(
fw_controller->core_object,
fw_device->core_object,
fw_io->parent.core_object,
io_tag
);
if (status == SCI_SUCCESS)
{
sci_base_state_machine_change_state(
&io_request->state_machine, SCI_BASE_REQUEST_STATE_STARTED
);
}
else
{
fw_device->domain->state_handlers->complete_io_handler(
&fw_device->domain->parent, remote_device, io_request
);
fw_io->parent.state_handlers->complete_handler(io_request);
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x IORequest:0x%x Status:0x%x core IO start failed\n",
fw_controller, fw_io, status
));
}
}
else
{
SCIF_LOG_WARNING((
sci_base_object_get_logger(fw_controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x IORequest:0x%x Status:0x%x IO start failed\n",
fw_controller, fw_io, status
));
fw_io->parent.state_handlers->complete_handler(io_request);
}
if (fw_io->parent.is_internal && status != SCI_SUCCESS )
{
SCIC_TRANSPORT_PROTOCOL protocol =
scic_io_request_get_protocol(fw_io->parent.core_object);
U8 retry_count = fw_io->retry_count;
scif_sas_internal_io_request_destruct(
fw_device->domain->controller,
(SCIF_SAS_INTERNAL_IO_REQUEST_T *)fw_io
);
if ( protocol == SCIC_SMP_PROTOCOL )
{
if (fw_device->protocol_device.smp_device.smp_activity_timer != NULL)
{
scif_cb_timer_destroy (
fw_controller,
fw_device->protocol_device.smp_device.smp_activity_timer
);
fw_device->protocol_device.smp_device.smp_activity_timer = NULL;
}
if ( retry_count < SCIF_SAS_IO_RETRY_LIMIT)
{
scif_sas_smp_remote_device_retry_internal_io(
(SCIF_SAS_REMOTE_DEVICE_T *)remote_device,
retry_count,
SMP_REQUEST_RETRY_WAIT_DURATION
);
}
}
}
return status;
}
static
SCI_STATUS scif_sas_controller_ready_start_high_priority_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request,
U16 io_tag
)
{
SCI_STATUS status;
SCIF_SAS_IO_REQUEST_T * fw_io = (SCIF_SAS_IO_REQUEST_T *)io_request;
SCIF_LOG_TRACE((
sci_base_object_get_logger(controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
"scif_sas_controller_ready_start_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
controller, remote_device, io_request, io_tag
));
status = scif_sas_controller_common_start_high_priority_io_handler(
controller, remote_device, io_request, io_tag);
if (status == SCI_SUCCESS)
{
if (fw_io->parent.is_internal)
{
SCIF_SAS_INTERNAL_IO_REQUEST_T * fw_internal_io =
(SCIF_SAS_INTERNAL_IO_REQUEST_T *)fw_io;
scif_cb_timer_start(
(SCI_CONTROLLER_HANDLE_T)controller,
fw_internal_io->internal_io_timer,
SCIF_SAS_INTERNAL_REQUEST_TIMEOUT
);
}
}
else
{
SCIF_LOG_TRACE((
sci_base_object_get_logger(controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
"scif_controller_start_high_priority_io(0x%x, 0x%x), starting io failed\n",
controller, fw_io
));
}
return status;
}
static
SCI_STATUS scif_sas_controller_stopping_start_high_priority_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request,
U16 io_tag
)
{
SCIF_LOG_TRACE((
sci_base_object_get_logger(controller),
SCIF_LOG_OBJECT_CONTROLLER | SCIF_LOG_OBJECT_IO_REQUEST,
"scif_sas_controller_stopping_start_high_priority_io_handler(0x%x, 0x%x, 0x%x, 0x%x) enter\n",
controller, remote_device, io_request, io_tag
));
return scif_sas_controller_common_start_high_priority_io_handler(
controller, remote_device, io_request, io_tag);
}
static
SCI_STATUS scif_sas_controller_stopped_reset_handler(
SCI_BASE_CONTROLLER_T * controller
)
{
return scif_sas_controller_execute_reset((SCIF_SAS_CONTROLLER_T*)controller);
}
static
SCI_STATUS scif_sas_controller_failed_reset_handler(
SCI_BASE_CONTROLLER_T * controller
)
{
return scif_sas_controller_execute_reset((SCIF_SAS_CONTROLLER_T*)controller);
}
static
SCI_STATUS scif_sas_controller_default_start_handler(
SCI_BASE_CONTROLLER_T * controller,
U32 timeout
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to start controller.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_default_stop_handler(
SCI_BASE_CONTROLLER_T * controller,
U32 timeout
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to stop controller.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_default_reset_handler(
SCI_BASE_CONTROLLER_T * controller
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to reset controller.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_default_initialize_handler(
SCI_BASE_CONTROLLER_T * controller
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to initialize controller.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_default_start_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request,
U16 io_tag
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to start IO.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_default_complete_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to complete IO.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_default_continue_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to continue IO.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_default_start_task_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * task_request,
U16 io_tag
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to start task mgmt.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_default_complete_task_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * task_request
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to complete task mgmt.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE_INVALID_STATE;
}
static
SCI_STATUS scif_sas_controller_failed_state_start_io_handler(
SCI_BASE_CONTROLLER_T * controller,
SCI_BASE_REMOTE_DEVICE_T * remote_device,
SCI_BASE_REQUEST_T * io_request,
U16 io_tag
)
{
SCIF_LOG_WARNING((
sci_base_object_get_logger((SCIF_SAS_CONTROLLER_T *)controller),
SCIF_LOG_OBJECT_CONTROLLER,
"Controller:0x%x State:0x%x invalid state to start IO.\n",
controller,
sci_base_state_machine_get_state(
&((SCIF_SAS_CONTROLLER_T *)controller)->parent.state_machine)
));
return SCI_FAILURE;
}
#define scif_sas_controller_stopping_complete_io_handler \
scif_sas_controller_ready_complete_io_handler
#define scif_sas_controller_stopping_complete_task_handler \
scif_sas_controller_ready_complete_task_handler
#define scif_sas_controller_default_start_high_priority_io_handler \
scif_sas_controller_default_start_io_handler
#define scif_sas_controller_default_complete_high_priority_io_handler \
scif_sas_controller_default_complete_io_handler
#define scif_sas_controller_stopping_complete_high_priority_io_handler \
scif_sas_controller_ready_complete_high_priority_io_handler
SCI_BASE_CONTROLLER_STATE_HANDLER_T
scif_sas_controller_state_handler_table[SCI_BASE_CONTROLLER_MAX_STATES] =
{
{
scif_sas_controller_default_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_default_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_default_start_io_handler,
scif_sas_controller_default_start_high_priority_io_handler,
scif_sas_controller_default_complete_io_handler,
scif_sas_controller_default_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_default_complete_task_handler
},
{
scif_sas_controller_default_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_default_reset_handler,
scif_sas_controller_reset_initialize_handler,
scif_sas_controller_default_start_io_handler,
scif_sas_controller_default_start_high_priority_io_handler,
scif_sas_controller_default_complete_io_handler,
scif_sas_controller_default_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_default_complete_task_handler
},
{
scif_sas_controller_default_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_default_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_default_start_io_handler,
scif_sas_controller_default_start_high_priority_io_handler,
scif_sas_controller_default_complete_io_handler,
scif_sas_controller_default_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_default_complete_task_handler
},
{
scif_sas_controller_initialized_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_default_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_default_start_io_handler,
scif_sas_controller_default_start_high_priority_io_handler,
scif_sas_controller_default_complete_io_handler,
scif_sas_controller_default_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_default_complete_task_handler
},
{
scif_sas_controller_default_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_default_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_default_start_io_handler,
scif_sas_controller_default_start_high_priority_io_handler,
scif_sas_controller_default_complete_io_handler,
scif_sas_controller_default_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_default_complete_task_handler
},
{
scif_sas_controller_default_start_handler,
scif_sas_controller_ready_stop_handler,
scif_sas_controller_ready_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_ready_start_io_handler,
scif_sas_controller_ready_start_high_priority_io_handler,
scif_sas_controller_ready_complete_io_handler,
scif_sas_controller_ready_complete_high_priority_io_handler,
scif_sas_controller_ready_continue_io_handler,
scif_sas_controller_ready_start_task_handler,
scif_sas_controller_ready_complete_task_handler
},
{
scif_sas_controller_default_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_default_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_default_start_io_handler,
scif_sas_controller_default_start_high_priority_io_handler,
scif_sas_controller_default_complete_io_handler,
scif_sas_controller_default_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_default_complete_task_handler
},
{
scif_sas_controller_default_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_default_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_default_start_io_handler,
scif_sas_controller_stopping_start_high_priority_io_handler,
scif_sas_controller_stopping_complete_io_handler,
scif_sas_controller_stopping_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_stopping_complete_task_handler
},
{
scif_sas_controller_default_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_stopped_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_default_start_io_handler,
scif_sas_controller_default_start_high_priority_io_handler,
scif_sas_controller_default_complete_io_handler,
scif_sas_controller_default_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_default_complete_task_handler
},
{
scif_sas_controller_default_start_handler,
scif_sas_controller_default_stop_handler,
scif_sas_controller_failed_reset_handler,
scif_sas_controller_default_initialize_handler,
scif_sas_controller_failed_state_start_io_handler,
scif_sas_controller_failed_state_start_io_handler,
scif_sas_controller_default_complete_io_handler,
scif_sas_controller_default_complete_high_priority_io_handler,
scif_sas_controller_default_continue_io_handler,
scif_sas_controller_default_start_task_handler,
scif_sas_controller_default_complete_task_handler
}
};