summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/isci/remote_device.h
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-04-27 16:32:45 -0700
committerDan Williams <dan.j.williams@intel.com>2011-07-03 04:00:39 -0700
commitab2e8f7d07f577ee39228fb3454b9f29eab0f312 (patch)
tree9f3fc14b955f689a29d6777349db0f49c8dcf3e0 /drivers/scsi/isci/remote_device.h
parentbe2f41c611b65353fa3ae0c155cf906b348dc864 (diff)
downloadlinux-ab2e8f7d07f577ee39228fb3454b9f29eab0f312.tar.gz
linux-ab2e8f7d07f577ee39228fb3454b9f29eab0f312.tar.bz2
linux-ab2e8f7d07f577ee39228fb3454b9f29eab0f312.zip
isci: merge remote_device substates into a single state machine
A substate is just a state, so uplevel the smp and stp device substates. Three tricks at work here: 1/ scic_sds_remote_device_ready_state_enter: needs to know the the device type so it can immediately transition to a stp or smp ready substate. 2/ scic_sds_remote_device_ready_state_exit: needs to know the device type. In the ssp case the device is no longer ready, in the stp, and smp case we have simply exited to a ready "substate". 3/ scic_sds_remote_device_resume_complete_handler: The one location where we directly check the current state against SCI_BASE_REMOTE_DEVICE_STATE_READY needed to comprehend the possible ready substates. Reported-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/scsi/isci/remote_device.h')
-rw-r--r--drivers/scsi/isci/remote_device.h208
1 files changed, 34 insertions, 174 deletions
diff --git a/drivers/scsi/isci/remote_device.h b/drivers/scsi/isci/remote_device.h
index 62623c766388..dda217a6bd3a 100644
--- a/drivers/scsi/isci/remote_device.h
+++ b/drivers/scsi/isci/remote_device.h
@@ -68,9 +68,7 @@ enum scic_remote_device_not_ready_reason_code {
SCIC_REMOTE_DEVICE_NOT_READY_SATA_REQUEST_STARTED,
SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED,
SCIC_REMOTE_DEVICE_NOT_READY_SMP_REQUEST_STARTED,
-
SCIC_REMOTE_DEVICE_NOT_READY_REASON_CODE_MAX
-
};
struct scic_sds_remote_device {
@@ -132,19 +130,6 @@ struct scic_sds_remote_device {
u32 not_ready_reason;
/**
- * This field is true if this remote device has an initialzied ready substate
- * machine. SSP devices do not have a ready substate machine and STP devices
- * have a ready substate machine.
- */
- bool has_ready_substate_machine;
-
- /**
- * This field contains the state machine for the ready substate machine for
- * this struct scic_sds_remote_device object.
- */
- struct sci_base_state_machine ready_substate_machine;
-
- /**
* This field maintains the set of state handlers for the remote device
* object. These are changed each time the remote device enters a new state.
*/
@@ -171,10 +156,6 @@ enum sci_status isci_remote_device_stop(struct isci_host *ihost,
struct isci_remote_device *idev);
void isci_remote_device_nuke_requests(struct isci_host *ihost,
struct isci_remote_device *idev);
-void isci_remote_device_ready(struct isci_host *ihost,
- struct isci_remote_device *idev);
-void isci_remote_device_not_ready(struct isci_host *ihost,
- struct isci_remote_device *idev, u32 reason);
void isci_remote_device_gone(struct domain_device *domain_dev);
int isci_remote_device_found(struct domain_device *domain_dev);
bool isci_device_is_reset_pending(struct isci_host *ihost,
@@ -278,77 +259,6 @@ enum scic_sds_remote_device_states {
SCI_BASE_REMOTE_DEVICE_STATE_READY,
/**
- * This state indicates that the remote device is in the process of
- * stopping. In this state no new IO operations are permitted, but
- * existing IO operations are allowed to complete.
- * This state is entered from the READY state.
- * This state is entered from the FAILED state.
- */
- SCI_BASE_REMOTE_DEVICE_STATE_STOPPING,
-
- /**
- * This state indicates that the remote device has failed.
- * In this state no new IO operations are permitted.
- * This state is entered from the INITIALIZING state.
- * This state is entered from the READY state.
- */
- SCI_BASE_REMOTE_DEVICE_STATE_FAILED,
-
- /**
- * This state indicates the device is being reset.
- * In this state no new IO operations are permitted.
- * This state is entered from the READY state.
- */
- SCI_BASE_REMOTE_DEVICE_STATE_RESETTING,
-
- /**
- * Simply the final state for the base remote device state machine.
- */
- SCI_BASE_REMOTE_DEVICE_STATE_FINAL,
-};
-
-/**
- * enum scic_sds_ssp_remote_device_ready_substates -
- *
- * This is the enumeration of the ready substates for the
- * struct scic_sds_remote_device.
- */
-enum scic_sds_ssp_remote_device_ready_substates {
- /**
- * This is the initial state for the remote device ready substate.
- */
- SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATE_INITIAL,
-
- /**
- * This is the ready operational substate for the remote device.
- * This is the normal operational state for a remote device.
- */
- SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATE_OPERATIONAL,
-
- /**
- * This is the suspended state for the remote device. This is the state
- * that the device is placed in when a RNC suspend is received by
- * the SCU hardware.
- */
- SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATE_SUSPENDED,
-
- /**
- * This is the final state that the device is placed in before a change
- * to the base state machine.
- */
- SCIC_SDS_SSP_REMOTE_DEVICE_READY_SUBSTATE_FINAL,
-
- SCIC_SDS_SSP_REMOTE_DEVICE_READY_MAX_SUBSTATES
-};
-
-/**
- * enum scic_sds_stp_remote_device_ready_substates -
- *
- * This is the enumeration for the struct scic_sds_remote_device ready substates
- * for the STP remote device.
- */
-enum scic_sds_stp_remote_device_ready_substates {
- /**
* This is the idle substate for the stp remote device. When there are no
* active IO for the device it is is in this state.
*/
@@ -381,14 +291,7 @@ enum scic_sds_stp_remote_device_ready_substates {
* coming to be recovered from certain hardware specific error.
*/
SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_AWAIT_RESET,
-};
-/**
- * enum scic_sds_smp_remote_device_ready_substates -
- *
- * This is the enumeration of the ready substates for the SMP REMOTE DEVICE.
- */
-enum scic_sds_smp_remote_device_ready_substates {
/**
* This is the ready operational substate for the remote device. This is the
* normal operational state for a remote device.
@@ -400,6 +303,35 @@ enum scic_sds_smp_remote_device_ready_substates {
* the device is placed in when a RNC suspend is received by the SCU hardware.
*/
SCIC_SDS_SMP_REMOTE_DEVICE_READY_SUBSTATE_CMD,
+
+ /**
+ * This state indicates that the remote device is in the process of
+ * stopping. In this state no new IO operations are permitted, but
+ * existing IO operations are allowed to complete.
+ * This state is entered from the READY state.
+ * This state is entered from the FAILED state.
+ */
+ SCI_BASE_REMOTE_DEVICE_STATE_STOPPING,
+
+ /**
+ * This state indicates that the remote device has failed.
+ * In this state no new IO operations are permitted.
+ * This state is entered from the INITIALIZING state.
+ * This state is entered from the READY state.
+ */
+ SCI_BASE_REMOTE_DEVICE_STATE_FAILED,
+
+ /**
+ * This state indicates the device is being reset.
+ * In this state no new IO operations are permitted.
+ * This state is entered from the READY state.
+ */
+ SCI_BASE_REMOTE_DEVICE_STATE_RESETTING,
+
+ /**
+ * Simply the final state for the base remote device state machine.
+ */
+ SCI_BASE_REMOTE_DEVICE_STATE_FINAL,
};
static inline struct scic_sds_remote_device *rnc_to_dev(struct scic_sds_remote_node_context *rnc)
@@ -541,10 +473,6 @@ struct scic_sds_remote_device_state_handler {
scic_sds_remote_device_frame_handler_t frame_handler;
};
-extern const struct sci_base_state scic_sds_ssp_remote_device_ready_substate_table[];
-extern const struct sci_base_state scic_sds_stp_remote_device_ready_substate_table[];
-extern const struct sci_base_state scic_sds_smp_remote_device_ready_substate_table[];
-
/**
* scic_sds_remote_device_increment_request_count() -
*
@@ -672,92 +600,24 @@ enum sci_status scic_sds_remote_device_start_io(
struct scic_sds_remote_device *sci_dev,
struct scic_sds_request *io_request);
-enum sci_status scic_sds_remote_device_complete_io(
+enum sci_status scic_sds_remote_device_start_task(
struct scic_sds_controller *controller,
struct scic_sds_remote_device *sci_dev,
struct scic_sds_request *io_request);
-enum sci_status scic_sds_remote_device_resume(
- struct scic_sds_remote_device *sci_dev);
+enum sci_status scic_sds_remote_device_complete_io(
+ struct scic_sds_controller *controller,
+ struct scic_sds_remote_device *sci_dev,
+ struct scic_sds_request *io_request);
enum sci_status scic_sds_remote_device_suspend(
struct scic_sds_remote_device *sci_dev,
u32 suspend_type);
-enum sci_status scic_sds_remote_device_start_task(
- struct scic_sds_controller *controller,
- struct scic_sds_remote_device *sci_dev,
- struct scic_sds_request *io_request);
-
void scic_sds_remote_device_post_request(
struct scic_sds_remote_device *sci_dev,
u32 request);
#define scic_sds_remote_device_is_atapi(sci_dev) false
-void scic_sds_remote_device_start_request(
- struct scic_sds_remote_device *sci_dev,
- struct scic_sds_request *sci_req,
- enum sci_status status);
-
-void scic_sds_remote_device_continue_request(void *sci_dev);
-
-enum sci_status scic_sds_remote_device_default_start_handler(
- struct scic_sds_remote_device *sci_dev);
-
-enum sci_status scic_sds_remote_device_default_fail_handler(
- struct scic_sds_remote_device *sci_dev);
-
-enum sci_status scic_sds_remote_device_default_destruct_handler(
- struct scic_sds_remote_device *sci_dev);
-
-enum sci_status scic_sds_remote_device_default_reset_handler(
- struct scic_sds_remote_device *device);
-
-enum sci_status scic_sds_remote_device_default_reset_complete_handler(
- struct scic_sds_remote_device *device);
-
-enum sci_status scic_sds_remote_device_default_start_request_handler(
- struct scic_sds_remote_device *device,
- struct scic_sds_request *request);
-
-enum sci_status scic_sds_remote_device_default_complete_request_handler(
- struct scic_sds_remote_device *device,
- struct scic_sds_request *request);
-
-enum sci_status scic_sds_remote_device_default_continue_request_handler(
- struct scic_sds_remote_device *device,
- struct scic_sds_request *request);
-
-enum sci_status scic_sds_remote_device_default_suspend_handler(
- struct scic_sds_remote_device *sci_dev,
- u32 suspend_type);
-
-enum sci_status scic_sds_remote_device_default_resume_handler(
- struct scic_sds_remote_device *sci_dev);
-
-
-enum sci_status scic_sds_remote_device_default_frame_handler(
- struct scic_sds_remote_device *sci_dev,
- u32 frame_index);
-
-enum sci_status scic_sds_remote_device_ready_state_stop_handler(
- struct scic_sds_remote_device *device);
-
-enum sci_status scic_sds_remote_device_ready_state_reset_handler(
- struct scic_sds_remote_device *device);
-
-enum sci_status scic_sds_remote_device_general_frame_handler(
- struct scic_sds_remote_device *sci_dev,
- u32 frame_index);
-
-enum sci_status scic_sds_remote_device_general_event_handler(
- struct scic_sds_remote_device *sci_dev,
- u32 event_code);
-
-enum sci_status scic_sds_ssp_remote_device_ready_suspended_substate_resume_handler(
- struct scic_sds_remote_device *sci_dev);
-
-
-
#endif /* !defined(_ISCI_REMOTE_DEVICE_H_) */