Commit ab2e8f7d authored by Dan Williams's avatar Dan Williams

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: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent be2f41c6
......@@ -7,8 +7,6 @@ obj-$(CONFIG_SCSI_ISCI) += isci.o
isci-objs := init.o phy.o request.o sata.o \
remote_device.o port.o timers.o \
host.o task.o probe_roms.o \
stp_remote_device.o \
smp_remote_device.o \
remote_node_context.o \
remote_node_table.o \
core/scic_sds_controller.o \
......
This diff is collapsed.
......@@ -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 {
......@@ -131,19 +129,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,
......@@ -277,77 +258,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_) */
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment