aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-05-12 07:46:59 -0700
committerDan Williams <dan.j.williams@intel.com>2011-07-03 04:04:49 -0700
commit338e386d12c2440e39c987d35fda403d319a79a0 (patch)
tree912dec715b326319ed2631aa7dacad4e05d4a641
parent6813820c7b892e1a5c2306808a5ccc8a27b7946d (diff)
downloadkernel_samsung_crespo-338e386d12c2440e39c987d35fda403d319a79a0.zip
kernel_samsung_crespo-338e386d12c2440e39c987d35fda403d319a79a0.tar.gz
kernel_samsung_crespo-338e386d12c2440e39c987d35fda403d319a79a0.tar.bz2
isci: unify rnc event handlers
Unify rnc event handlers and delete the state handler. Reported-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r--drivers/scsi/isci/remote_node_context.c365
-rw-r--r--drivers/scsi/isci/remote_node_context.h16
2 files changed, 111 insertions, 270 deletions
diff --git a/drivers/scsi/isci/remote_node_context.c b/drivers/scsi/isci/remote_node_context.c
index aef258b..9f2407f 100644
--- a/drivers/scsi/isci/remote_node_context.c
+++ b/drivers/scsi/isci/remote_node_context.c
@@ -299,21 +299,6 @@ static enum sci_status scic_sds_remote_node_context_default_start_task_handler(
return SCI_FAILURE;
}
-static enum sci_status scic_sds_remote_node_context_default_event_handler(
- struct scic_sds_remote_node_context *sci_rnc,
- u32 event_code)
-{
- dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
- "%s: SCIC Remote Node Context 0x%p requested to process "
- "event 0x%x while in wrong state %d\n",
- __func__,
- sci_rnc,
- event_code,
- sci_base_state_machine_get_state(&sci_rnc->state_machine));
-
- return SCI_FAILURE_INVALID_STATE;
-}
-
/**
*
* @sci_rnc: The rnc for which the task request is targeted.
@@ -383,41 +368,6 @@ static enum sci_status scic_sds_remote_node_context_initial_state_resume_handler
return SCI_FAILURE_INVALID_STATE;
}
-/* --------------------------------------------------------------------------- */
-
-static enum sci_status scic_sds_remote_node_context_posting_state_event_handler(
- struct scic_sds_remote_node_context *sci_rnc,
- u32 event_code)
-{
- enum sci_status status;
-
- switch (scu_get_event_code(event_code)) {
- case SCU_EVENT_POST_RNC_COMPLETE:
- status = SCI_SUCCESS;
-
- sci_base_state_machine_change_state(
- &sci_rnc->state_machine,
- SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE
- );
- break;
-
- default:
- status = SCI_FAILURE;
- dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
- "%s: SCIC Remote Node Context 0x%p requested to "
- "process unexpected event 0x%x while in posting "
- "state\n",
- __func__,
- sci_rnc,
- event_code);
- break;
- }
-
- return status;
-}
-
-/* --------------------------------------------------------------------------- */
-
static enum sci_status scic_sds_remote_node_context_invalidating_state_destruct_handler(
struct scic_sds_remote_node_context *sci_rnc,
scics_sds_remote_node_context_callback callback,
@@ -430,110 +380,6 @@ static enum sci_status scic_sds_remote_node_context_invalidating_state_destruct_
return SCI_SUCCESS;
}
-static enum sci_status scic_sds_remote_node_context_invalidating_state_event_handler(
- struct scic_sds_remote_node_context *sci_rnc,
- u32 event_code)
-{
- enum sci_status status;
-
- if (scu_get_event_code(event_code) == SCU_EVENT_POST_RNC_INVALIDATE_COMPLETE) {
- status = SCI_SUCCESS;
-
- if (sci_rnc->destination_state == SCIC_SDS_REMOTE_NODE_DESTINATION_STATE_FINAL) {
- sci_base_state_machine_change_state(
- &sci_rnc->state_machine,
- SCIC_SDS_REMOTE_NODE_CONTEXT_INITIAL_STATE
- );
- } else {
- sci_base_state_machine_change_state(
- &sci_rnc->state_machine,
- SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE
- );
- }
- } else {
- switch (scu_get_event_type(event_code)) {
- case SCU_EVENT_TYPE_RNC_SUSPEND_TX:
- case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX:
- /*
- * We really dont care if the hardware is going to suspend
- * the device since it's being invalidated anyway */
- dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)),
- "%s: SCIC Remote Node Context 0x%p was "
- "suspeneded by hardware while being "
- "invalidated.\n",
- __func__,
- sci_rnc);
- status = SCI_SUCCESS;
- break;
-
- default:
- dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
- "%s: SCIC Remote Node Context 0x%p "
- "requested to process event 0x%x while "
- "in state %d.\n",
- __func__,
- sci_rnc,
- event_code,
- sci_base_state_machine_get_state(
- &sci_rnc->state_machine));
- status = SCI_FAILURE;
- break;
- }
- }
-
- return status;
-}
-
-/* --------------------------------------------------------------------------- */
-
-
-static enum sci_status scic_sds_remote_node_context_resuming_state_event_handler(
- struct scic_sds_remote_node_context *sci_rnc,
- u32 event_code)
-{
- enum sci_status status;
-
- if (scu_get_event_code(event_code) == SCU_EVENT_POST_RCN_RELEASE) {
- status = SCI_SUCCESS;
-
- sci_base_state_machine_change_state(
- &sci_rnc->state_machine,
- SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE
- );
- } else {
- switch (scu_get_event_type(event_code)) {
- case SCU_EVENT_TYPE_RNC_SUSPEND_TX:
- case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX:
- /*
- * We really dont care if the hardware is going to suspend
- * the device since it's being resumed anyway */
- dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)),
- "%s: SCIC Remote Node Context 0x%p was "
- "suspeneded by hardware while being resumed.\n",
- __func__,
- sci_rnc);
- status = SCI_SUCCESS;
- break;
-
- default:
- dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
- "%s: SCIC Remote Node Context 0x%p requested "
- "to process event 0x%x while in state %d.\n",
- __func__,
- sci_rnc,
- event_code,
- sci_base_state_machine_get_state(
- &sci_rnc->state_machine));
- status = SCI_FAILURE;
- break;
- }
- }
-
- return status;
-}
-
-/* --------------------------------------------------------------------------- */
-
/**
*
* @sci_rnc: The remote node context object being suspended.
@@ -582,53 +428,6 @@ static enum sci_status scic_sds_remote_node_context_ready_state_start_io_handler
return SCI_SUCCESS;
}
-
-static enum sci_status scic_sds_remote_node_context_ready_state_event_handler(
- struct scic_sds_remote_node_context *sci_rnc,
- u32 event_code)
-{
- enum sci_status status;
-
- switch (scu_get_event_type(event_code)) {
- case SCU_EVENT_TL_RNC_SUSPEND_TX:
- sci_base_state_machine_change_state(
- &sci_rnc->state_machine,
- SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE
- );
-
- sci_rnc->suspension_code = scu_get_event_specifier(event_code);
- status = SCI_SUCCESS;
- break;
-
- case SCU_EVENT_TL_RNC_SUSPEND_TX_RX:
- sci_base_state_machine_change_state(
- &sci_rnc->state_machine,
- SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE
- );
-
- sci_rnc->suspension_code = scu_get_event_specifier(event_code);
- status = SCI_SUCCESS;
- break;
-
- default:
- dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
- "%s: SCIC Remote Node Context 0x%p requested to "
- "process event 0x%x while in state %d.\n",
- __func__,
- sci_rnc,
- event_code,
- sci_base_state_machine_get_state(
- &sci_rnc->state_machine));
-
- status = SCI_FAILURE;
- break;
- }
-
- return status;
-}
-
-/* --------------------------------------------------------------------------- */
-
static enum sci_status scic_sds_remote_node_context_tx_suspended_state_resume_handler(
struct scic_sds_remote_node_context *sci_rnc,
scics_sds_remote_node_context_callback callback,
@@ -738,61 +537,13 @@ static enum sci_status scic_sds_remote_node_context_await_suspension_state_start
return SCI_SUCCESS;
}
-static enum sci_status scic_sds_remote_node_context_await_suspension_state_event_handler(
- struct scic_sds_remote_node_context *sci_rnc,
- u32 event_code)
-{
- enum sci_status status;
-
- switch (scu_get_event_type(event_code)) {
- case SCU_EVENT_TL_RNC_SUSPEND_TX:
- sci_base_state_machine_change_state(
- &sci_rnc->state_machine,
- SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE
- );
-
- sci_rnc->suspension_code = scu_get_event_specifier(event_code);
- status = SCI_SUCCESS;
- break;
-
- case SCU_EVENT_TL_RNC_SUSPEND_TX_RX:
- sci_base_state_machine_change_state(
- &sci_rnc->state_machine,
- SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE
- );
-
- sci_rnc->suspension_code = scu_get_event_specifier(event_code);
- status = SCI_SUCCESS;
- break;
-
- default:
- dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
- "%s: SCIC Remote Node Context 0x%p requested to "
- "process event 0x%x while in state %d.\n",
- __func__,
- sci_rnc,
- event_code,
- sci_base_state_machine_get_state(
- &sci_rnc->state_machine));
-
- status = SCI_FAILURE;
- break;
- }
-
- return status;
-}
-
-/* --------------------------------------------------------------------------- */
-
-static struct scic_sds_remote_node_context_handlers
-scic_sds_remote_node_context_state_handler_table[] = {
+static struct scic_sds_remote_node_context_handlers scic_sds_remote_node_context_state_handler_table[] = {
[SCIC_SDS_REMOTE_NODE_CONTEXT_INITIAL_STATE] = {
.destruct_handler = scic_sds_remote_node_context_default_destruct_handler,
.suspend_handler = scic_sds_remote_node_context_default_suspend_handler,
.resume_handler = scic_sds_remote_node_context_initial_state_resume_handler,
.start_io_handler = scic_sds_remote_node_context_default_start_io_handler,
.start_task_handler = scic_sds_remote_node_context_default_start_task_handler,
- .event_handler = scic_sds_remote_node_context_default_event_handler
},
[SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE] = {
.destruct_handler = scic_sds_remote_node_context_general_destruct_handler,
@@ -800,7 +551,6 @@ scic_sds_remote_node_context_state_handler_table[] = {
.resume_handler = scic_sds_remote_node_context_continue_to_resume_handler,
.start_io_handler = scic_sds_remote_node_context_default_start_io_handler,
.start_task_handler = scic_sds_remote_node_context_default_start_task_handler,
- .event_handler = scic_sds_remote_node_context_posting_state_event_handler
},
[SCIC_SDS_REMOTE_NODE_CONTEXT_INVALIDATING_STATE] = {
.destruct_handler = scic_sds_remote_node_context_invalidating_state_destruct_handler,
@@ -808,7 +558,6 @@ scic_sds_remote_node_context_state_handler_table[] = {
.resume_handler = scic_sds_remote_node_context_continue_to_resume_handler,
.start_io_handler = scic_sds_remote_node_context_default_start_io_handler,
.start_task_handler = scic_sds_remote_node_context_default_start_task_handler,
- .event_handler = scic_sds_remote_node_context_invalidating_state_event_handler
},
[SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE] = {
.destruct_handler = scic_sds_remote_node_context_general_destruct_handler,
@@ -816,7 +565,6 @@ scic_sds_remote_node_context_state_handler_table[] = {
.resume_handler = scic_sds_remote_node_context_continue_to_resume_handler,
.start_io_handler = scic_sds_remote_node_context_default_start_io_handler,
.start_task_handler = scic_sds_remote_node_context_success_start_task_handler,
- .event_handler = scic_sds_remote_node_context_resuming_state_event_handler
},
[SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE] = {
.destruct_handler = scic_sds_remote_node_context_general_destruct_handler,
@@ -824,7 +572,6 @@ scic_sds_remote_node_context_state_handler_table[] = {
.resume_handler = scic_sds_remote_node_context_default_resume_handler,
.start_io_handler = scic_sds_remote_node_context_ready_state_start_io_handler,
.start_task_handler = scic_sds_remote_node_context_success_start_task_handler,
- .event_handler = scic_sds_remote_node_context_ready_state_event_handler
},
[SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE] = {
.destruct_handler = scic_sds_remote_node_context_general_destruct_handler,
@@ -832,7 +579,6 @@ scic_sds_remote_node_context_state_handler_table[] = {
.resume_handler = scic_sds_remote_node_context_tx_suspended_state_resume_handler,
.start_io_handler = scic_sds_remote_node_context_default_start_io_handler,
.start_task_handler = scic_sds_remote_node_context_suspended_start_task_handler,
- .event_handler = scic_sds_remote_node_context_default_event_handler
},
[SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE] = {
.destruct_handler = scic_sds_remote_node_context_general_destruct_handler,
@@ -840,7 +586,6 @@ scic_sds_remote_node_context_state_handler_table[] = {
.resume_handler = scic_sds_remote_node_context_tx_rx_suspended_state_resume_handler,
.start_io_handler = scic_sds_remote_node_context_default_start_io_handler,
.start_task_handler = scic_sds_remote_node_context_suspended_start_task_handler,
- .event_handler = scic_sds_remote_node_context_default_event_handler
},
[SCIC_SDS_REMOTE_NODE_CONTEXT_AWAIT_SUSPENSION_STATE] = {
.destruct_handler = scic_sds_remote_node_context_general_destruct_handler,
@@ -848,7 +593,6 @@ scic_sds_remote_node_context_state_handler_table[] = {
.resume_handler = scic_sds_remote_node_context_await_suspension_state_resume_handler,
.start_io_handler = scic_sds_remote_node_context_default_start_io_handler,
.start_task_handler = scic_sds_remote_node_context_await_suspension_state_start_task_handler,
- .event_handler = scic_sds_remote_node_context_await_suspension_state_event_handler
}
};
@@ -1172,3 +916,110 @@ void scic_sds_remote_node_context_construct(struct scic_sds_remote_node_context
sci_base_state_machine_start(&rnc->state_machine);
}
+
+enum sci_status scic_sds_remote_node_context_event_handler(struct scic_sds_remote_node_context *sci_rnc,
+ u32 event_code)
+{
+ enum scis_sds_remote_node_context_states state;
+
+ state = sci_rnc->state_machine.current_state_id;
+ switch (state) {
+ case SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE:
+ switch (scu_get_event_code(event_code)) {
+ case SCU_EVENT_POST_RNC_COMPLETE:
+ sci_base_state_machine_change_state(&sci_rnc->state_machine,
+ SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE);
+ break;
+ default:
+ goto out;
+ }
+ break;
+ case SCIC_SDS_REMOTE_NODE_CONTEXT_INVALIDATING_STATE:
+ if (scu_get_event_code(event_code) == SCU_EVENT_POST_RNC_INVALIDATE_COMPLETE) {
+ if (sci_rnc->destination_state == SCIC_SDS_REMOTE_NODE_DESTINATION_STATE_FINAL)
+ state = SCIC_SDS_REMOTE_NODE_CONTEXT_INITIAL_STATE;
+ else
+ state = SCIC_SDS_REMOTE_NODE_CONTEXT_POSTING_STATE;
+ sci_base_state_machine_change_state(&sci_rnc->state_machine,
+ state);
+ } else {
+ switch (scu_get_event_type(event_code)) {
+ case SCU_EVENT_TYPE_RNC_SUSPEND_TX:
+ case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX:
+ /* We really dont care if the hardware is going to suspend
+ * the device since it's being invalidated anyway */
+ dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)),
+ "%s: SCIC Remote Node Context 0x%p was "
+ "suspeneded by hardware while being "
+ "invalidated.\n", __func__, sci_rnc);
+ break;
+ default:
+ goto out;
+ }
+ }
+ break;
+ case SCIC_SDS_REMOTE_NODE_CONTEXT_RESUMING_STATE:
+ if (scu_get_event_code(event_code) == SCU_EVENT_POST_RCN_RELEASE) {
+ sci_base_state_machine_change_state(&sci_rnc->state_machine,
+ SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE);
+ } else {
+ switch (scu_get_event_type(event_code)) {
+ case SCU_EVENT_TYPE_RNC_SUSPEND_TX:
+ case SCU_EVENT_TYPE_RNC_SUSPEND_TX_RX:
+ /* We really dont care if the hardware is going to suspend
+ * the device since it's being resumed anyway */
+ dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)),
+ "%s: SCIC Remote Node Context 0x%p was "
+ "suspeneded by hardware while being resumed.\n",
+ __func__, sci_rnc);
+ break;
+ default:
+ goto out;
+ }
+ }
+ break;
+ case SCIC_SDS_REMOTE_NODE_CONTEXT_READY_STATE:
+ switch (scu_get_event_type(event_code)) {
+ case SCU_EVENT_TL_RNC_SUSPEND_TX:
+ sci_base_state_machine_change_state(&sci_rnc->state_machine,
+ SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE);
+ sci_rnc->suspension_code = scu_get_event_specifier(event_code);
+ break;
+ case SCU_EVENT_TL_RNC_SUSPEND_TX_RX:
+ sci_base_state_machine_change_state(&sci_rnc->state_machine,
+ SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE);
+ sci_rnc->suspension_code = scu_get_event_specifier(event_code);
+ break;
+ default:
+ goto out;
+ }
+ break;
+ case SCIC_SDS_REMOTE_NODE_CONTEXT_AWAIT_SUSPENSION_STATE:
+ switch (scu_get_event_type(event_code)) {
+ case SCU_EVENT_TL_RNC_SUSPEND_TX:
+ sci_base_state_machine_change_state(&sci_rnc->state_machine,
+ SCIC_SDS_REMOTE_NODE_CONTEXT_TX_SUSPENDED_STATE);
+ sci_rnc->suspension_code = scu_get_event_specifier(event_code);
+ break;
+ case SCU_EVENT_TL_RNC_SUSPEND_TX_RX:
+ sci_base_state_machine_change_state(&sci_rnc->state_machine,
+ SCIC_SDS_REMOTE_NODE_CONTEXT_TX_RX_SUSPENDED_STATE);
+ sci_rnc->suspension_code = scu_get_event_specifier(event_code);
+ break;
+ default:
+ goto out;
+ }
+ break;
+ default:
+ dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
+ "%s: invalid state %d\n", __func__, state);
+ return SCI_FAILURE_INVALID_STATE;
+ }
+ return SCI_SUCCESS;
+
+ out:
+ dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
+ "%s: code: %#x state: %d\n", __func__, event_code, state);
+ return SCI_FAILURE;
+
+}
diff --git a/drivers/scsi/isci/remote_node_context.h b/drivers/scsi/isci/remote_node_context.h
index a763468..fb93f09 100644
--- a/drivers/scsi/isci/remote_node_context.h
+++ b/drivers/scsi/isci/remote_node_context.h
@@ -102,11 +102,6 @@ typedef enum sci_status (*scic_sds_remote_node_context_io_request)(
struct scic_sds_request *sci_req
);
-typedef enum sci_status (*scic_sds_remote_node_context_event_handler)(
- struct scic_sds_remote_node_context *sci_rnc,
- u32 event_code
- );
-
struct scic_sds_remote_node_context_handlers {
/**
* This handle is invoked to stop the RNC. The callback is invoked when after
@@ -138,12 +133,6 @@ struct scic_sds_remote_node_context_handlers {
* operation.
*/
scic_sds_remote_node_context_io_request start_task_handler;
-
- /**
- * This handler is invoked where there is an RNC event that must be processed.
- */
- scic_sds_remote_node_context_event_handler event_handler;
-
};
/**
@@ -271,8 +260,9 @@ bool scic_sds_remote_node_context_is_ready(
#define scic_sds_remote_node_context_get_remote_node_index(rcn) \
((rnc)->remote_node_index)
-#define scic_sds_remote_node_context_event_handler(rnc, event_code) \
- ((rnc)->state_handlers->event_handler(rnc, event_code))
+
+enum sci_status scic_sds_remote_node_context_event_handler(struct scic_sds_remote_node_context *sci_rnc,
+ u32 event_code);
#define scic_sds_remote_node_context_resume(rnc, callback, parameter) \
((rnc)->state_handlers->resume_handler(rnc, callback, parameter))