Skip to content

Commit

Permalink
isci: simplify request state handlers
Browse files Browse the repository at this point in the history
Instead of filling up tables with default handlers call the default
handler in the only caller.

IMHO the whole state handlers concept is not very suitable for the
isci request.  For example there is a single real instance of the
start handler, and we'd be much better off just having a check for
the right state in the only caller, than all this mess.  It's
quite similar for the abort handler as well.

Even the actual state machine has a lot of states that are rather
pointless.  The initial and constructed states are not needed at all
as the request is not reachable for calls before it's fully set up and
started.  And the abort state should be replaced with an abort actions
and a state transition to the completed state.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Christoph Hellwig authored and Dan Williams committed Jul 3, 2011
1 parent 7814167 commit 524b5f7
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 357 deletions.
287 changes: 78 additions & 209 deletions drivers/scsi/isci/core/scic_sds_request.c
Original file line number Diff line number Diff line change
Expand Up @@ -874,67 +874,93 @@ u32 scic_io_request_get_number_of_bytes_transferred(
* * SCIC SDS Interface Implementation
* **************************************************************************** */

/**
*
* @this_request: The SCIC_SDS_IO_REQUEST_T object for which the start
* operation is to be executed.
*
* This method invokes the base state start request handler for the
* SCIC_SDS_IO_REQUEST_T object. enum sci_status
*/
enum sci_status
scic_sds_request_start(struct scic_sds_request *request)
{
if (request->device_sequence ==
if (request->device_sequence !=
scic_sds_remote_device_get_sequence(request->target_device))
return SCI_FAILURE;

if (request->state_handlers->start_handler)
return request->state_handlers->start_handler(request);
return SCI_FAILURE;

dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request requested to start while in wrong "
"state %d\n",
__func__,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

/**
*
* @this_request: The SCIC_SDS_IO_REQUEST_T object for which the start
* operation is to be executed.
*
* This method invokes the base state terminate request handber for the
* SCIC_SDS_IO_REQUEST_T object. enum sci_status
*/
enum sci_status
scic_sds_io_request_terminate(struct scic_sds_request *request)
{
return request->state_handlers->abort_handler(request);
if (request->state_handlers->abort_handler)
return request->state_handlers->abort_handler(request);

dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request requested to abort while in wrong "
"state %d\n",
__func__,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

/**
*
* @this_request: The SCIC_SDS_IO_REQUEST_T object for which the start
* operation is to be executed.
*
* This method invokes the base state request completion handler for the
* SCIC_SDS_IO_REQUEST_T object. enum sci_status
*/
enum sci_status
scic_sds_io_request_complete(struct scic_sds_request *request)
{
return request->state_handlers->complete_handler(request);
if (request->state_handlers->complete_handler)
return request->state_handlers->complete_handler(request);

dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request requested to complete while in wrong "
"state %d\n",
__func__,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

/**
*
* @this_request: The SCIC_SDS_IO_REQUEST_T object for which the start
* operation is to be executed.
* @event_code: The event code returned by the hardware for the task reqeust.
*
* This method invokes the core state handler for the SCIC_SDS_IO_REQUEST_T
* object. enum sci_status
*/
enum sci_status scic_sds_io_request_event_handler(
struct scic_sds_request *this_request,
struct scic_sds_request *request,
u32 event_code)
{
return this_request->state_handlers->event_handler(this_request, event_code);
if (request->state_handlers->event_handler)
return request->state_handlers->event_handler(request, event_code);

dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request given event code notification %x while "
"in wrong state %d\n",
__func__,
event_code,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

enum sci_status
scic_sds_io_request_tc_completion(struct scic_sds_request *request, u32 completion_code)
{
if (request->state_machine.current_state_id == SCI_BASE_REQUEST_STATE_STARTED &&
request->has_started_substate_machine == false)
return scic_sds_request_started_state_tc_completion_handler(request, completion_code);
else if (request->state_handlers->tc_completion_handler)
return request->state_handlers->tc_completion_handler(request, completion_code);

dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request given task completion notification %x "
"while in wrong state %d\n",
__func__,
completion_code,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;

}


/**
*
* @this_request: The SCIC_SDS_IO_REQUEST_T object for which the start
Expand All @@ -946,10 +972,21 @@ enum sci_status scic_sds_io_request_event_handler(
* SCIC_SDS_IO_REQUEST_T object. enum sci_status
*/
enum sci_status scic_sds_io_request_frame_handler(
struct scic_sds_request *this_request,
struct scic_sds_request *request,
u32 frame_index)
{
return this_request->state_handlers->frame_handler(this_request, frame_index);
if (request->state_handlers->frame_handler)
return request->state_handlers->frame_handler(request, frame_index);

dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request given unexpected frame %x while in "
"state %d\n",
__func__,
frame_index,
sci_base_state_machine_get_state(&request->state_machine));

scic_sds_controller_release_frame(request->owning_controller, frame_index);
return SCI_FAILURE_INVALID_STATE;
}

/**
Expand Down Expand Up @@ -1001,141 +1038,6 @@ void scic_sds_io_request_copy_response(struct scic_sds_request *sds_request)
memcpy(response_buffer, ssp_response->data, user_response_length);
}

/*
* *****************************************************************************
* * DEFAULT STATE HANDLERS
* ***************************************************************************** */

/*
* This method is the default action to take when an SCIC_SDS_IO_REQUEST_T
* object receives a scic_sds_request_start() request. The default action is
* to log a warning and return a failure status. enum sci_status
* SCI_FAILURE_INVALID_STATE
*/
enum sci_status scic_sds_request_default_start_handler(
struct scic_sds_request *request)
{
dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request requested to start while in wrong "
"state %d\n",
__func__,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

static enum sci_status scic_sds_request_default_abort_handler(
struct scic_sds_request *request)
{
dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request requested to abort while in wrong "
"state %d\n",
__func__,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

/*
* This method is the default action to take when an SCIC_SDS_IO_REQUEST_T
* object receives a scic_sds_request_complete() request. The default action
* is to log a warning and return a failure status. enum sci_status
* SCI_FAILURE_INVALID_STATE
*/
enum sci_status scic_sds_request_default_complete_handler(
struct scic_sds_request *request)
{
dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request requested to complete while in wrong "
"state %d\n",
__func__,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

/*
* This method is the default action to take when an SCIC_SDS_IO_REQUEST_T
* object receives a scic_sds_request_complete() request. The default action
* is to log a warning and return a failure status. enum sci_status
* SCI_FAILURE_INVALID_STATE
*/
enum sci_status scic_sds_request_default_destruct_handler(
struct scic_sds_request *request)
{
dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request requested to destroy while in wrong "
"state %d\n",
__func__,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

/**
* This method is the default action to take when an SCIC_SDS_IO_REQUEST_T
* object receives a scic_sds_task_request_complete() request. The default
* action is to log a warning and return a failure status. enum sci_status
* SCI_FAILURE_INVALID_STATE
*/
enum sci_status scic_sds_request_default_tc_completion_handler(
struct scic_sds_request *request,
u32 completion_code)
{
dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request given task completion notification %x "
"while in wrong state %d\n",
__func__,
completion_code,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;

}

/*
* This method is the default action to take when an SCIC_SDS_IO_REQUEST_T
* object receives a scic_sds_request_event_handler() request. The default
* action is to log a warning and return a failure status. enum sci_status
* SCI_FAILURE_INVALID_STATE
*/
enum sci_status scic_sds_request_default_event_handler(
struct scic_sds_request *request,
u32 event_code)
{
dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request given event code notification %x while "
"in wrong state %d\n",
__func__,
event_code,
sci_base_state_machine_get_state(&request->state_machine));

return SCI_FAILURE_INVALID_STATE;
}

/*
* This method is the default action to take when an SCIC_SDS_IO_REQUEST_T
* object receives a scic_sds_request_event_handler() request. The default
* action is to log a warning and return a failure status. enum sci_status
* SCI_FAILURE_INVALID_STATE
*/
enum sci_status scic_sds_request_default_frame_handler(
struct scic_sds_request *request,
u32 frame_index)
{
dev_warn(scic_to_dev(request->owning_controller),
"%s: SCIC IO Request given unexpected frame %x while in "
"state %d\n",
__func__,
frame_index,
sci_base_state_machine_get_state(&request->state_machine));

scic_sds_controller_release_frame(
request->owning_controller, frame_index);

return SCI_FAILURE_INVALID_STATE;
}

/*
* *****************************************************************************
* * CONSTRUCTED STATE HANDLERS
Expand Down Expand Up @@ -1601,58 +1503,25 @@ static enum sci_status scic_sds_request_aborting_state_frame_handler(

static const struct scic_sds_io_request_state_handler scic_sds_request_state_handler_table[] = {
[SCI_BASE_REQUEST_STATE_INITIAL] = {
.start_handler = scic_sds_request_default_start_handler,
.abort_handler = scic_sds_request_default_abort_handler,
.complete_handler = scic_sds_request_default_complete_handler,
.destruct_handler = scic_sds_request_default_destruct_handler,
.tc_completion_handler = scic_sds_request_default_tc_completion_handler,
.event_handler = scic_sds_request_default_event_handler,
.frame_handler = scic_sds_request_default_frame_handler,
},
[SCI_BASE_REQUEST_STATE_CONSTRUCTED] = {
.start_handler = scic_sds_request_constructed_state_start_handler,
.abort_handler = scic_sds_request_constructed_state_abort_handler,
.complete_handler = scic_sds_request_default_complete_handler,
.destruct_handler = scic_sds_request_default_destruct_handler,
.tc_completion_handler = scic_sds_request_default_tc_completion_handler,
.event_handler = scic_sds_request_default_event_handler,
.frame_handler = scic_sds_request_default_frame_handler,
},
[SCI_BASE_REQUEST_STATE_STARTED] = {
.start_handler = scic_sds_request_default_start_handler,
.abort_handler = scic_sds_request_started_state_abort_handler,
.complete_handler = scic_sds_request_default_complete_handler,
.destruct_handler = scic_sds_request_default_destruct_handler,
.tc_completion_handler = scic_sds_request_started_state_tc_completion_handler,
.event_handler = scic_sds_request_default_event_handler,
.frame_handler = scic_sds_request_started_state_frame_handler,
},
[SCI_BASE_REQUEST_STATE_COMPLETED] = {
.start_handler = scic_sds_request_default_start_handler,
.abort_handler = scic_sds_request_default_abort_handler,
.complete_handler = scic_sds_request_completed_state_complete_handler,
.destruct_handler = scic_sds_request_default_destruct_handler,
.tc_completion_handler = scic_sds_request_default_tc_completion_handler,
.event_handler = scic_sds_request_default_event_handler,
.frame_handler = scic_sds_request_default_frame_handler,
},
[SCI_BASE_REQUEST_STATE_ABORTING] = {
.start_handler = scic_sds_request_default_start_handler,
.abort_handler = scic_sds_request_aborting_state_abort_handler,
.complete_handler = scic_sds_request_default_complete_handler,
.destruct_handler = scic_sds_request_default_destruct_handler,
.tc_completion_handler = scic_sds_request_aborting_state_tc_completion_handler,
.event_handler = scic_sds_request_default_event_handler,
.frame_handler = scic_sds_request_aborting_state_frame_handler,
},
[SCI_BASE_REQUEST_STATE_FINAL] = {
.start_handler = scic_sds_request_default_start_handler,
.abort_handler = scic_sds_request_default_abort_handler,
.complete_handler = scic_sds_request_default_complete_handler,
.destruct_handler = scic_sds_request_default_destruct_handler,
.tc_completion_handler = scic_sds_request_default_tc_completion_handler,
.event_handler = scic_sds_request_default_event_handler,
.frame_handler = scic_sds_request_default_frame_handler,
},
};

Expand Down
Loading

0 comments on commit 524b5f7

Please sign in to comment.