isci: unify request start handlers

Unify the implementation in scic_sds_request_start and kill the state
handler.

Reported-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Piotr Sawicki <piotr.sawicki@intel.com>
[remove scic_sds_request_constructed_state_start_handler]
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Piotr Sawicki 2011-05-10 23:50:32 +00:00 committed by Dan Williams
parent f00e6ba499
commit f4636a7b2a
3 changed files with 74 additions and 94 deletions

View File

@ -515,7 +515,7 @@ enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic
if (status != SCI_SUCCESS) if (status != SCI_SUCCESS)
break; break;
status = sci_req->state_handlers->start_handler(sci_req); status = scic_sds_request_start(sci_req);
if (status != SCI_SUCCESS) if (status != SCI_SUCCESS)
break; break;
@ -540,7 +540,7 @@ enum sci_status scic_sds_remote_device_start_io(struct scic_sds_controller *scic
if (status != SCI_SUCCESS) if (status != SCI_SUCCESS)
break; break;
status = sci_req->state_handlers->start_handler(sci_req); status = scic_sds_request_start(sci_req);
} else } else
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
break; break;
@ -709,7 +709,7 @@ enum sci_status scic_sds_remote_device_start_task(struct scic_sds_controller *sc
if (status != SCI_SUCCESS) if (status != SCI_SUCCESS)
goto out; goto out;
status = sci_req->state_handlers->start_handler(sci_req); status = scic_sds_request_start(sci_req);
if (status != SCI_SUCCESS) if (status != SCI_SUCCESS)
goto out; goto out;

View File

@ -757,23 +757,80 @@ static u32 sci_req_tx_bytes(struct scic_sds_request *sci_req)
return ret_val; return ret_val;
} }
enum sci_status enum sci_status scic_sds_request_start(struct scic_sds_request *sci_req)
scic_sds_request_start(struct scic_sds_request *request)
{ {
if (request->device_sequence != struct scic_sds_controller *scic = sci_req->owning_controller;
scic_sds_remote_device_get_sequence(request->target_device)) struct scu_task_context *task_context;
enum sci_base_request_states state;
if (sci_req->device_sequence !=
scic_sds_remote_device_get_sequence(sci_req->target_device))
return SCI_FAILURE; return SCI_FAILURE;
if (request->state_handlers->start_handler) state = sci_req->state_machine.current_state_id;
return request->state_handlers->start_handler(request); if (state != SCI_BASE_REQUEST_STATE_CONSTRUCTED) {
dev_warn(scic_to_dev(scic),
"%s: SCIC IO Request requested to start while in wrong "
"state %d\n", __func__, state);
return SCI_FAILURE_INVALID_STATE;
}
dev_warn(scic_to_dev(request->owning_controller), /* if necessary, allocate a TCi for the io request object and then will,
"%s: SCIC IO Request requested to start while in wrong " * if necessary, copy the constructed TC data into the actual TC buffer.
"state %d\n", * If everything is successful the post context field is updated with
__func__, * the TCi so the controller can post the request to the hardware.
sci_base_state_machine_get_state(&request->state_machine)); */
if (sci_req->io_tag == SCI_CONTROLLER_INVALID_IO_TAG)
sci_req->io_tag = scic_controller_allocate_io_tag(scic);
return SCI_FAILURE_INVALID_STATE; /* Record the IO Tag in the request */
if (sci_req->io_tag != SCI_CONTROLLER_INVALID_IO_TAG) {
task_context = sci_req->task_context_buffer;
task_context->task_index = scic_sds_io_tag_get_index(sci_req->io_tag);
switch (task_context->protocol_type) {
case SCU_TASK_CONTEXT_PROTOCOL_SMP:
case SCU_TASK_CONTEXT_PROTOCOL_SSP:
/* SSP/SMP Frame */
task_context->type.ssp.tag = sci_req->io_tag;
task_context->type.ssp.target_port_transfer_tag =
0xFFFF;
break;
case SCU_TASK_CONTEXT_PROTOCOL_STP:
/* STP/SATA Frame
* task_context->type.stp.ncq_tag = sci_req->ncq_tag;
*/
break;
case SCU_TASK_CONTEXT_PROTOCOL_NONE:
/* / @todo When do we set no protocol type? */
break;
default:
/* This should never happen since we build the IO
* requests */
break;
}
/*
* Check to see if we need to copy the task context buffer
* or have been building into the task context buffer */
if (sci_req->was_tag_assigned_by_user == false)
scic_sds_controller_copy_task_context(scic, sci_req);
/* Add to the post_context the io tag value */
sci_req->post_context |= scic_sds_io_tag_get_index(sci_req->io_tag);
/* Everything is good go ahead and change state */
sci_base_state_machine_change_state(&sci_req->state_machine,
SCI_BASE_REQUEST_STATE_STARTED);
return SCI_SUCCESS;
}
return SCI_FAILURE_INSUFFICIENT_RESOURCES;
} }
enum sci_status enum sci_status
@ -903,75 +960,6 @@ static void scic_sds_io_request_copy_response(struct scic_sds_request *sci_req)
memcpy(resp_buf, ssp_response->resp_data, len); memcpy(resp_buf, ssp_response->resp_data, len);
} }
/*
* This method implements the action taken when a constructed
* SCIC_SDS_IO_REQUEST_T object receives a scic_sds_request_start() request.
* This method will, if necessary, allocate a TCi for the io request object and
* then will, if necessary, copy the constructed TC data into the actual TC
* buffer. If everything is successful the post context field is updated with
* the TCi so the controller can post the request to the hardware. enum sci_status
* SCI_SUCCESS SCI_FAILURE_INSUFFICIENT_RESOURCES
*/
static enum sci_status scic_sds_request_constructed_state_start_handler(
struct scic_sds_request *request)
{
struct scu_task_context *task_context;
if (request->io_tag == SCI_CONTROLLER_INVALID_IO_TAG) {
request->io_tag =
scic_controller_allocate_io_tag(request->owning_controller);
}
/* Record the IO Tag in the request */
if (request->io_tag != SCI_CONTROLLER_INVALID_IO_TAG) {
task_context = request->task_context_buffer;
task_context->task_index = scic_sds_io_tag_get_index(request->io_tag);
switch (task_context->protocol_type) {
case SCU_TASK_CONTEXT_PROTOCOL_SMP:
case SCU_TASK_CONTEXT_PROTOCOL_SSP:
/* SSP/SMP Frame */
task_context->type.ssp.tag = request->io_tag;
task_context->type.ssp.target_port_transfer_tag = 0xFFFF;
break;
case SCU_TASK_CONTEXT_PROTOCOL_STP:
/*
* STP/SATA Frame
* task_context->type.stp.ncq_tag = request->ncq_tag; */
break;
case SCU_TASK_CONTEXT_PROTOCOL_NONE:
/* / @todo When do we set no protocol type? */
break;
default:
/* This should never happen since we build the IO requests */
break;
}
/*
* Check to see if we need to copy the task context buffer
* or have been building into the task context buffer */
if (request->was_tag_assigned_by_user == false) {
scic_sds_controller_copy_task_context(
request->owning_controller, request);
}
/* Add to the post_context the io tag value */
request->post_context |= scic_sds_io_tag_get_index(request->io_tag);
/* Everything is good go ahead and change state */
sci_base_state_machine_change_state(&request->state_machine,
SCI_BASE_REQUEST_STATE_STARTED);
return SCI_SUCCESS;
}
return SCI_FAILURE_INSUFFICIENT_RESOURCES;
}
/* /*
* scic_sds_request_started_state_tc_completion_handler() - This method process * scic_sds_request_started_state_tc_completion_handler() - This method process
* TC (task context) completions for normal IO request (i.e. Task/Abort * TC (task context) completions for normal IO request (i.e. Task/Abort
@ -2529,10 +2517,8 @@ static enum sci_status scic_sds_stp_request_soft_reset_await_d2h_frame_handler(
} }
static const struct scic_sds_io_request_state_handler scic_sds_request_state_handler_table[] = { static const struct scic_sds_io_request_state_handler scic_sds_request_state_handler_table[] = {
[SCI_BASE_REQUEST_STATE_INITIAL] = { }, [SCI_BASE_REQUEST_STATE_INITIAL] = {},
[SCI_BASE_REQUEST_STATE_CONSTRUCTED] = { [SCI_BASE_REQUEST_STATE_CONSTRUCTED] = {},
.start_handler = scic_sds_request_constructed_state_start_handler,
},
[SCI_BASE_REQUEST_STATE_STARTED] = { [SCI_BASE_REQUEST_STATE_STARTED] = {
.tc_completion_handler = scic_sds_request_started_state_tc_completion_handler, .tc_completion_handler = scic_sds_request_started_state_tc_completion_handler,
.frame_handler = scic_sds_request_started_state_frame_handler, .frame_handler = scic_sds_request_started_state_frame_handler,

View File

@ -438,12 +438,6 @@ typedef enum sci_status (*scic_sds_io_request_task_completion_handler_t)
* *
*/ */
struct scic_sds_io_request_state_handler { struct scic_sds_io_request_state_handler {
/**
* The start_handler specifies the method invoked when a user attempts to
* start a request.
*/
scic_sds_io_request_handler_t start_handler;
/** /**
* The complete_handler specifies the method invoked when a user attempts to * The complete_handler specifies the method invoked when a user attempts to
* complete a request. * complete a request.