Commit d7a0ccdd authored by Dan Williams's avatar Dan Williams Committed by James Bottomley

[SCSI] isci: debug, provide state-enum-to-string conversions

Debugging the driver requires tracing the state transtions and tracing
state names is less work than decoding numbers.
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 16d3db1b
...@@ -59,6 +59,16 @@ ...@@ -59,6 +59,16 @@
#include "scu_event_codes.h" #include "scu_event_codes.h"
#include "probe_roms.h" #include "probe_roms.h"
#undef C
#define C(a) (#a)
static const char *phy_state_name(enum sci_phy_states state)
{
static const char * const strings[] = PHY_STATES;
return strings[state];
}
#undef C
/* Maximum arbitration wait time in micro-seconds */ /* Maximum arbitration wait time in micro-seconds */
#define SCIC_SDS_PHY_MAX_ARBITRATION_WAIT_TIME (700) #define SCIC_SDS_PHY_MAX_ARBITRATION_WAIT_TIME (700)
...@@ -454,8 +464,8 @@ enum sci_status sci_phy_start(struct isci_phy *iphy) ...@@ -454,8 +464,8 @@ enum sci_status sci_phy_start(struct isci_phy *iphy)
enum sci_phy_states state = iphy->sm.current_state_id; enum sci_phy_states state = iphy->sm.current_state_id;
if (state != SCI_PHY_STOPPED) { if (state != SCI_PHY_STOPPED) {
dev_dbg(sciphy_to_dev(iphy), dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, phy_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -480,8 +490,8 @@ enum sci_status sci_phy_stop(struct isci_phy *iphy) ...@@ -480,8 +490,8 @@ enum sci_status sci_phy_stop(struct isci_phy *iphy)
case SCI_PHY_READY: case SCI_PHY_READY:
break; break;
default: default:
dev_dbg(sciphy_to_dev(iphy), dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, phy_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -494,8 +504,8 @@ enum sci_status sci_phy_reset(struct isci_phy *iphy) ...@@ -494,8 +504,8 @@ enum sci_status sci_phy_reset(struct isci_phy *iphy)
enum sci_phy_states state = iphy->sm.current_state_id; enum sci_phy_states state = iphy->sm.current_state_id;
if (state != SCI_PHY_READY) { if (state != SCI_PHY_READY) {
dev_dbg(sciphy_to_dev(iphy), dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, phy_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -544,8 +554,8 @@ enum sci_status sci_phy_consume_power_handler(struct isci_phy *iphy) ...@@ -544,8 +554,8 @@ enum sci_status sci_phy_consume_power_handler(struct isci_phy *iphy)
return SCI_SUCCESS; return SCI_SUCCESS;
} }
default: default:
dev_dbg(sciphy_to_dev(iphy), dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, phy_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
...@@ -870,8 +880,8 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code) ...@@ -870,8 +880,8 @@ enum sci_status sci_phy_event_handler(struct isci_phy *iphy, u32 event_code)
} }
return SCI_SUCCESS; return SCI_SUCCESS;
default: default:
dev_dbg(sciphy_to_dev(iphy), dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, phy_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
...@@ -964,8 +974,8 @@ enum sci_status sci_phy_frame_handler(struct isci_phy *iphy, u32 frame_index) ...@@ -964,8 +974,8 @@ enum sci_status sci_phy_frame_handler(struct isci_phy *iphy, u32 frame_index)
return result; return result;
} }
default: default:
dev_dbg(sciphy_to_dev(iphy), dev_dbg(sciphy_to_dev(iphy), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, phy_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
......
...@@ -343,101 +343,65 @@ enum sci_phy_counter_id { ...@@ -343,101 +343,65 @@ enum sci_phy_counter_id {
SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR SCIC_PHY_COUNTER_SN_DWORD_SYNC_ERROR
}; };
enum sci_phy_states { /**
/** * enum sci_phy_states - phy state machine states
* Simply the initial state for the base domain state machine. * @SCI_PHY_INITIAL: Simply the initial state for the base domain state
*/ * machine.
SCI_PHY_INITIAL, * @SCI_PHY_STOPPED: phy has successfully been stopped. In this state
* no new IO operations are permitted on this phy.
/** * @SCI_PHY_STARTING: the phy is in the process of becomming ready. In
* This state indicates that the phy has successfully been stopped. * this state no new IO operations are permitted on
* In this state no new IO operations are permitted on this phy. * this phy.
* This state is entered from the INITIAL state. * @SCI_PHY_SUB_INITIAL: Initial state
* This state is entered from the STARTING state. * @SCI_PHY_SUB_AWAIT_OSSP_EN: Wait state for the hardware OSSP event
* This state is entered from the READY state. * type notification
* This state is entered from the RESETTING state. * @SCI_PHY_SUB_AWAIT_SAS_SPEED_EN: Wait state for the PHY speed
*/ * notification
SCI_PHY_STOPPED, * @SCI_PHY_SUB_AWAIT_IAF_UF: Wait state for the IAF Unsolicited frame
* notification
/** * @SCI_PHY_SUB_AWAIT_SAS_POWER: Wait state for the request to consume
* This state indicates that the phy is in the process of becomming * power
* ready. In this state no new IO operations are permitted on this phy. * @SCI_PHY_SUB_AWAIT_SATA_POWER: Wait state for request to consume
* This state is entered from the STOPPED state. * power
* This state is entered from the READY state. * @SCI_PHY_SUB_AWAIT_SATA_PHY_EN: Wait state for the SATA PHY
* This state is entered from the RESETTING state. * notification
*/ * @SCI_PHY_SUB_AWAIT_SATA_SPEED_EN: Wait for the SATA PHY speed
SCI_PHY_STARTING, * notification
* @SCI_PHY_SUB_AWAIT_SIG_FIS_UF: Wait state for the SIGNATURE FIS
/** * unsolicited frame notification
* Initial state * @SCI_PHY_SUB_FINAL: Exit state for this state machine
*/ * @SCI_PHY_READY: phy is now ready. Thus, the user is able to perform
SCI_PHY_SUB_INITIAL, * IO operations utilizing this phy as long as it is
* currently part of a valid port. This state is
/** * entered from the STARTING state.
* Wait state for the hardware OSSP event type notification * @SCI_PHY_RESETTING: phy is in the process of being reset. In this
*/ * state no new IO operations are permitted on this
SCI_PHY_SUB_AWAIT_OSSP_EN, * phy. This state is entered from the READY state.
* @SCI_PHY_FINAL: Simply the final state for the base phy state
/** * machine.
* Wait state for the PHY speed notification */
*/ #define PHY_STATES {\
SCI_PHY_SUB_AWAIT_SAS_SPEED_EN, C(PHY_INITIAL),\
C(PHY_STOPPED),\
/** C(PHY_STARTING),\
* Wait state for the IAF Unsolicited frame notification C(PHY_SUB_INITIAL),\
*/ C(PHY_SUB_AWAIT_OSSP_EN),\
SCI_PHY_SUB_AWAIT_IAF_UF, C(PHY_SUB_AWAIT_SAS_SPEED_EN),\
C(PHY_SUB_AWAIT_IAF_UF),\
/** C(PHY_SUB_AWAIT_SAS_POWER),\
* Wait state for the request to consume power C(PHY_SUB_AWAIT_SATA_POWER),\
*/ C(PHY_SUB_AWAIT_SATA_PHY_EN),\
SCI_PHY_SUB_AWAIT_SAS_POWER, C(PHY_SUB_AWAIT_SATA_SPEED_EN),\
C(PHY_SUB_AWAIT_SIG_FIS_UF),\
/** C(PHY_SUB_FINAL),\
* Wait state for request to consume power C(PHY_READY),\
*/ C(PHY_RESETTING),\
SCI_PHY_SUB_AWAIT_SATA_POWER, C(PHY_FINAL),\
}
/** #undef C
* Wait state for the SATA PHY notification #define C(a) SCI_##a
*/ enum sci_phy_states PHY_STATES;
SCI_PHY_SUB_AWAIT_SATA_PHY_EN, #undef C
/**
* Wait for the SATA PHY speed notification
*/
SCI_PHY_SUB_AWAIT_SATA_SPEED_EN,
/**
* Wait state for the SIGNATURE FIS unsolicited frame notification
*/
SCI_PHY_SUB_AWAIT_SIG_FIS_UF,
/**
* Exit state for this state machine
*/
SCI_PHY_SUB_FINAL,
/**
* This state indicates the the phy is now ready. Thus, the user
* is able to perform IO operations utilizing this phy as long as it
* is currently part of a valid port.
* This state is entered from the STARTING state.
*/
SCI_PHY_READY,
/**
* This state indicates that the phy is in the process of being reset.
* In this state no new IO operations are permitted on this phy.
* This state is entered from the READY state.
*/
SCI_PHY_RESETTING,
/**
* Simply the final state for the base phy state machine.
*/
SCI_PHY_FINAL,
};
void sci_phy_construct( void sci_phy_construct(
struct isci_phy *iphy, struct isci_phy *iphy,
......
...@@ -60,6 +60,16 @@ ...@@ -60,6 +60,16 @@
#define SCIC_SDS_PORT_HARD_RESET_TIMEOUT (1000) #define SCIC_SDS_PORT_HARD_RESET_TIMEOUT (1000)
#define SCU_DUMMY_INDEX (0xFFFF) #define SCU_DUMMY_INDEX (0xFFFF)
#undef C
#define C(a) (#a)
const char *port_state_name(enum sci_port_states state)
{
static const char * const strings[] = PORT_STATES;
return strings[state];
}
#undef C
static struct device *sciport_to_dev(struct isci_port *iport) static struct device *sciport_to_dev(struct isci_port *iport)
{ {
int i = iport->physical_port_index; int i = iport->physical_port_index;
...@@ -1054,8 +1064,8 @@ enum sci_status sci_port_start(struct isci_port *iport) ...@@ -1054,8 +1064,8 @@ enum sci_status sci_port_start(struct isci_port *iport)
state = iport->sm.current_state_id; state = iport->sm.current_state_id;
if (state != SCI_PORT_STOPPED) { if (state != SCI_PORT_STOPPED) {
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -1129,8 +1139,8 @@ enum sci_status sci_port_stop(struct isci_port *iport) ...@@ -1129,8 +1139,8 @@ enum sci_status sci_port_stop(struct isci_port *iport)
SCI_PORT_STOPPING); SCI_PORT_STOPPING);
return SCI_SUCCESS; return SCI_SUCCESS;
default: default:
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
...@@ -1144,8 +1154,8 @@ static enum sci_status sci_port_hard_reset(struct isci_port *iport, u32 timeout) ...@@ -1144,8 +1154,8 @@ static enum sci_status sci_port_hard_reset(struct isci_port *iport, u32 timeout)
state = iport->sm.current_state_id; state = iport->sm.current_state_id;
if (state != SCI_PORT_SUB_OPERATIONAL) { if (state != SCI_PORT_SUB_OPERATIONAL) {
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -1239,8 +1249,8 @@ enum sci_status sci_port_add_phy(struct isci_port *iport, ...@@ -1239,8 +1249,8 @@ enum sci_status sci_port_add_phy(struct isci_port *iport,
SCI_PORT_SUB_CONFIGURING); SCI_PORT_SUB_CONFIGURING);
return SCI_SUCCESS; return SCI_SUCCESS;
default: default:
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
...@@ -1289,8 +1299,8 @@ enum sci_status sci_port_remove_phy(struct isci_port *iport, ...@@ -1289,8 +1299,8 @@ enum sci_status sci_port_remove_phy(struct isci_port *iport,
SCI_PORT_SUB_CONFIGURING); SCI_PORT_SUB_CONFIGURING);
return SCI_SUCCESS; return SCI_SUCCESS;
default: default:
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
...@@ -1332,8 +1342,8 @@ enum sci_status sci_port_link_up(struct isci_port *iport, ...@@ -1332,8 +1342,8 @@ enum sci_status sci_port_link_up(struct isci_port *iport,
sci_port_general_link_up_handler(iport, iphy, PF_RESUME); sci_port_general_link_up_handler(iport, iphy, PF_RESUME);
return SCI_SUCCESS; return SCI_SUCCESS;
default: default:
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
...@@ -1362,8 +1372,8 @@ enum sci_status sci_port_link_down(struct isci_port *iport, ...@@ -1362,8 +1372,8 @@ enum sci_status sci_port_link_down(struct isci_port *iport,
sci_port_deactivate_phy(iport, iphy, false); sci_port_deactivate_phy(iport, iphy, false);
return SCI_SUCCESS; return SCI_SUCCESS;
default: default:
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
...@@ -1382,8 +1392,8 @@ enum sci_status sci_port_start_io(struct isci_port *iport, ...@@ -1382,8 +1392,8 @@ enum sci_status sci_port_start_io(struct isci_port *iport,
iport->started_request_count++; iport->started_request_count++;
return SCI_SUCCESS; return SCI_SUCCESS;
default: default:
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
...@@ -1397,8 +1407,8 @@ enum sci_status sci_port_complete_io(struct isci_port *iport, ...@@ -1397,8 +1407,8 @@ enum sci_status sci_port_complete_io(struct isci_port *iport,
state = iport->sm.current_state_id; state = iport->sm.current_state_id;
switch (state) { switch (state) {
case SCI_PORT_STOPPED: case SCI_PORT_STOPPED:
dev_warn(sciport_to_dev(iport), dev_warn(sciport_to_dev(iport), "%s: in wrong state: %s\n",
"%s: in wrong state: %d\n", __func__, state); __func__, port_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
case SCI_PORT_STOPPING: case SCI_PORT_STOPPING:
sci_port_decrement_request_count(iport); sci_port_decrement_request_count(iport);
......
...@@ -144,70 +144,47 @@ struct sci_port_properties { ...@@ -144,70 +144,47 @@ struct sci_port_properties {
}; };
/** /**
* enum sci_port_states - This enumeration depicts all the states for the * enum sci_port_states - port state machine states
* common port state machine. * @SCI_PORT_STOPPED: port has successfully been stopped. In this state
* * no new IO operations are permitted. This state is
* * entered from the STOPPING state.
* @SCI_PORT_STOPPING: port 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.
* @SCI_PORT_READY: port is now ready. Thus, the user is able to
* perform IO operations on this port. This state is
* entered from the STARTING state.
* @SCI_PORT_SUB_WAITING: port is started and ready but has no active
* phys.
* @SCI_PORT_SUB_OPERATIONAL: port is started and ready and there is at
* least one phy operational.
* @SCI_PORT_SUB_CONFIGURING: port is started and there was an
* add/remove phy event. This state is only
* used in Automatic Port Configuration Mode
* (APC)
* @SCI_PORT_RESETTING: port is in the process of performing a hard
* reset. Thus, the user is unable to perform IO
* operations on this port. This state is entered
* from the READY state.
* @SCI_PORT_FAILED: port has failed a reset request. This state is
* entered when a port reset request times out. This
* state is entered from the RESETTING state.
*/ */
enum sci_port_states { #define PORT_STATES {\
/** C(PORT_STOPPED),\
* This state indicates that the port has successfully been stopped. C(PORT_STOPPING),\
* In this state no new IO operations are permitted. C(PORT_READY),\
* This state is entered from the STOPPING state. C(PORT_SUB_WAITING),\
*/ C(PORT_SUB_OPERATIONAL),\
SCI_PORT_STOPPED, C(PORT_SUB_CONFIGURING),\
C(PORT_RESETTING),\
/** C(PORT_FAILED),\
* This state indicates that the port is in the process of stopping. }
* In this state no new IO operations are permitted, but existing IO #undef C
* operations are allowed to complete. #define C(a) SCI_##a
* This state is entered from the READY state. enum sci_port_states PORT_STATES;
*/ #undef C
SCI_PORT_STOPPING,
/**
* This state indicates the port is now ready. Thus, the user is
* able to perform IO operations on this port.
* This state is entered from the STARTING state.
*/
SCI_PORT_READY,
/**
* The substate where the port is started and ready but has no
* active phys.
*/
SCI_PORT_SUB_WAITING,
/**
* The substate where the port is started and ready and there is
* at least one phy operational.
*/
SCI_PORT_SUB_OPERATIONAL,
/**
* The substate where the port is started and there was an
* add/remove phy event. This state is only used in Automatic
* Port Configuration Mode (APC)
*/
SCI_PORT_SUB_CONFIGURING,
/**
* This state indicates the port is in the process of performing a hard
* reset. Thus, the user is unable to perform IO operations on this
* port.
* This state is entered from the READY state.
*/
SCI_PORT_RESETTING,
/**
* This state indicates the port has failed a reset request. This state
* is entered when a port reset request times out.
* This state is entered from the RESETTING state.
*/
SCI_PORT_FAILED,
};
static inline void sci_port_decrement_request_count(struct isci_port *iport) static inline void sci_port_decrement_request_count(struct isci_port *iport)
{ {
......
...@@ -62,6 +62,16 @@ ...@@ -62,6 +62,16 @@
#include "scu_event_codes.h" #include "scu_event_codes.h"
#include "task.h" #include "task.h"
#undef C
#define C(a) (#a)
const char *dev_state_name(enum sci_remote_device_states state)
{
static const char * const strings[] = REMOTE_DEV_STATES;
return strings[state];
}
#undef C
/** /**
* isci_remote_device_not_ready() - This function is called by the ihost when * isci_remote_device_not_ready() - This function is called by the ihost when
* the remote device is not ready. We mark the isci device as ready (not * the remote device is not ready. We mark the isci device as ready (not
...@@ -167,8 +177,8 @@ enum sci_status sci_remote_device_stop(struct isci_remote_device *idev, ...@@ -167,8 +177,8 @@ enum sci_status sci_remote_device_stop(struct isci_remote_device *idev,
case SCI_DEV_FAILED: case SCI_DEV_FAILED:
case SCI_DEV_FINAL: case SCI_DEV_FINAL:
default: default:
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
case SCI_DEV_STOPPED: case SCI_DEV_STOPPED:
return SCI_SUCCESS; return SCI_SUCCESS;
...@@ -226,8 +236,8 @@ enum sci_status sci_remote_device_reset(struct isci_remote_device *idev) ...@@ -226,8 +236,8 @@ enum sci_status sci_remote_device_reset(struct isci_remote_device *idev)
case SCI_DEV_RESETTING: case SCI_DEV_RESETTING:
case SCI_DEV_FINAL: case SCI_DEV_FINAL:
default: default:
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
case SCI_DEV_READY: case SCI_DEV_READY:
case SCI_STP_DEV_IDLE: case SCI_STP_DEV_IDLE:
...@@ -246,8 +256,8 @@ enum sci_status sci_remote_device_reset_complete(struct isci_remote_device *idev ...@@ -246,8 +256,8 @@ enum sci_status sci_remote_device_reset_complete(struct isci_remote_device *idev
enum sci_remote_device_states state = sm->current_state_id; enum sci_remote_device_states state = sm->current_state_id;
if (state != SCI_DEV_RESETTING) { if (state != SCI_DEV_RESETTING) {
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -262,8 +272,8 @@ enum sci_status sci_remote_device_suspend(struct isci_remote_device *idev, ...@@ -262,8 +272,8 @@ enum sci_status sci_remote_device_suspend(struct isci_remote_device *idev,
enum sci_remote_device_states state = sm->current_state_id; enum sci_remote_device_states state = sm->current_state_id;
if (state != SCI_STP_DEV_CMD) { if (state != SCI_STP_DEV_CMD) {
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -287,8 +297,8 @@ enum sci_status sci_remote_device_frame_handler(struct isci_remote_device *idev, ...@@ -287,8 +297,8 @@ enum sci_status sci_remote_device_frame_handler(struct isci_remote_device *idev,
case SCI_SMP_DEV_IDLE: case SCI_SMP_DEV_IDLE:
case SCI_DEV_FINAL: case SCI_DEV_FINAL:
default: default:
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
/* Return the frame back to the controller */ /* Return the frame back to the controller */
sci_controller_release_frame(ihost, frame_index); sci_controller_release_frame(ihost, frame_index);
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
...@@ -502,8 +512,8 @@ enum sci_status sci_remote_device_start_io(struct isci_host *ihost, ...@@ -502,8 +512,8 @@ enum sci_status sci_remote_device_start_io(struct isci_host *ihost,
case SCI_DEV_RESETTING: case SCI_DEV_RESETTING:
case SCI_DEV_FINAL: case SCI_DEV_FINAL:
default: default:
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
case SCI_DEV_READY: case SCI_DEV_READY:
/* attempt to start an io request for this device object. The remote /* attempt to start an io request for this device object. The remote
...@@ -637,8 +647,8 @@ enum sci_status sci_remote_device_complete_io(struct isci_host *ihost, ...@@ -637,8 +647,8 @@ enum sci_status sci_remote_device_complete_io(struct isci_host *ihost,
case SCI_DEV_FAILED: case SCI_DEV_FAILED:
case SCI_DEV_FINAL: case SCI_DEV_FINAL:
default: default:
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
case SCI_DEV_READY: case SCI_DEV_READY:
case SCI_STP_DEV_AWAIT_RESET: case SCI_STP_DEV_AWAIT_RESET:
...@@ -721,8 +731,8 @@ enum sci_status sci_remote_device_start_task(struct isci_host *ihost, ...@@ -721,8 +731,8 @@ enum sci_status sci_remote_device_start_task(struct isci_host *ihost,
case SCI_DEV_RESETTING: case SCI_DEV_RESETTING:
case SCI_DEV_FINAL: case SCI_DEV_FINAL:
default: default:
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
case SCI_STP_DEV_IDLE: case SCI_STP_DEV_IDLE:
case SCI_STP_DEV_CMD: case SCI_STP_DEV_CMD:
...@@ -853,8 +863,8 @@ static enum sci_status sci_remote_device_destruct(struct isci_remote_device *ide ...@@ -853,8 +863,8 @@ static enum sci_status sci_remote_device_destruct(struct isci_remote_device *ide
struct isci_host *ihost; struct isci_host *ihost;
if (state != SCI_DEV_STOPPED) { if (state != SCI_DEV_STOPPED) {
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -1204,8 +1214,8 @@ static enum sci_status sci_remote_device_start(struct isci_remote_device *idev, ...@@ -1204,8 +1214,8 @@ static enum sci_status sci_remote_device_start(struct isci_remote_device *idev,
enum sci_status status; enum sci_status status;
if (state != SCI_DEV_STOPPED) { if (state != SCI_DEV_STOPPED) {
dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %d\n", dev_warn(scirdev_to_dev(idev), "%s: in wrong state: %s\n",
__func__, state); __func__, dev_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
......
...@@ -179,122 +179,101 @@ enum sci_status sci_remote_device_reset_complete( ...@@ -179,122 +179,101 @@ enum sci_status sci_remote_device_reset_complete(
/** /**
* enum sci_remote_device_states - This enumeration depicts all the states * enum sci_remote_device_states - This enumeration depicts all the states
* for the common remote device state machine. * for the common remote device state machine.
* @SCI_DEV_INITIAL: Simply the initial state for the base remote device
* state machine.
* *
* @SCI_DEV_STOPPED: This state indicates that the remote device has
* successfully been stopped. In this state no new IO operations are
* permitted. This state is entered from the INITIAL state. This state
* is entered from the STOPPING state.
* *
* @SCI_DEV_STARTING: This state indicates the the remote device is in
* the process of becoming ready (i.e. starting). In this state no new
* IO operations are permitted. This state is entered from the STOPPED
* state.
*
* @SCI_DEV_READY: This state indicates the remote device is now ready.
* Thus, the user is able to perform IO operations on the remote device.
* This state is entered from the STARTING state.
*
* @SCI_STP_DEV_IDLE: 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.
*
* @SCI_STP_DEV_CMD: This is the command state for for the STP remote
* device. This state is entered when the device is processing a
* non-NCQ command. The device object will fail any new start IO
* requests until this command is complete.
*
* @SCI_STP_DEV_NCQ: This is the NCQ state for the STP remote device.
* This state is entered when the device is processing an NCQ reuqest.
* It will remain in this state so long as there is one or more NCQ
* requests being processed.
*
* @SCI_STP_DEV_NCQ_ERROR: This is the NCQ error state for the STP
* remote device. This state is entered when an SDB error FIS is
* received by the device object while in the NCQ state. The device
* object will only accept a READ LOG command while in this state.
*
* @SCI_STP_DEV_ATAPI_ERROR: This is the ATAPI error state for the STP
* ATAPI remote device. This state is entered when ATAPI device sends
* error status FIS without data while the device object is in CMD
* state. A suspension event is expected in this state. The device
* object will resume right away.
*
* @SCI_STP_DEV_AWAIT_RESET: This is the READY substate indicates the
* device is waiting for the RESET task coming to be recovered from
* certain hardware specific error.
*
* @SCI_SMP_DEV_IDLE: This is the ready operational substate for the
* remote device. This is the normal operational state for a remote
* device.
*
* @SCI_SMP_DEV_CMD: 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.
*
* @SCI_DEV_STOPPING: 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_DEV_FAILED: 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_DEV_RESETTING: 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_DEV_FINAL: Simply the final state for the base remote device
* state machine.
*/ */
enum sci_remote_device_states { #define REMOTE_DEV_STATES {\
/** C(DEV_INITIAL),\
* Simply the initial state for the base remote device state machine. C(DEV_STOPPED),\
*/ C(DEV_STARTING),\
SCI_DEV_INITIAL, C(DEV_READY),\
C(STP_DEV_IDLE),\
/** C(STP_DEV_CMD),\
* This state indicates that the remote device has successfully been C(STP_DEV_NCQ),\
* stopped. In this state no new IO operations are permitted. C(STP_DEV_NCQ_ERROR),\
* This state is entered from the INITIAL state. C(STP_DEV_ATAPI_ERROR),\
* This state is entered from the STOPPING state. C(STP_DEV_AWAIT_RESET),\
*/ C(SMP_DEV_IDLE),\
SCI_DEV_STOPPED, C(SMP_DEV_CMD),\
C(DEV_STOPPING),\
/** C(DEV_FAILED),\
* This state indicates the the remote device is in the process of C(DEV_RESETTING),\
* becoming ready (i.e. starting). In this state no new IO operations C(DEV_FINAL),\
* are permitted. }
* This state is entered from the STOPPED state. #undef C
*/ #define C(a) SCI_##a
SCI_DEV_STARTING, enum sci_remote_device_states REMOTE_DEV_STATES;
#undef C
/** const char *dev_state_name(enum sci_remote_device_states state);
* This state indicates the remote device is now ready. Thus, the user
* is able to perform IO operations on the remote device.
* This state is entered from the STARTING state.
*/
SCI_DEV_READY,
/**
* 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.
*/
SCI_STP_DEV_IDLE,
/**
* This is the command state for for the STP remote device. This state is
* entered when the device is processing a non-NCQ command. The device object
* will fail any new start IO requests until this command is complete.
*/
SCI_STP_DEV_CMD,
/**
* This is the NCQ state for the STP remote device. This state is entered
* when the device is processing an NCQ reuqest. It will remain in this state
* so long as there is one or more NCQ requests being processed.
*/
SCI_STP_DEV_NCQ,
/**
* This is the NCQ error state for the STP remote device. This state is
* entered when an SDB error FIS is received by the device object while in the
* NCQ state. The device object will only accept a READ LOG command while in
* this state.
*/
SCI_STP_DEV_NCQ_ERROR,
/**
* This is the ATAPI error state for the STP ATAPI remote device.
* This state is entered when ATAPI device sends error status FIS
* without data while the device object is in CMD state.
* A suspension event is expected in this state.
* The device object will resume right away.
*/
SCI_STP_DEV_ATAPI_ERROR,
/**
* This is the READY substate indicates the device is waiting for the RESET task
* coming to be recovered from certain hardware specific error.
*/
SCI_STP_DEV_AWAIT_RESET,
/**
* This is the ready operational substate for the remote device. This is the
* normal operational state for a remote device.
*/
SCI_SMP_DEV_IDLE,
/**
* 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.
*/
SCI_SMP_DEV_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_DEV_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_DEV_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_DEV_RESETTING,
/**
* Simply the final state for the base remote device state machine.
*/
SCI_DEV_FINAL,
};
static inline struct isci_remote_device *rnc_to_dev(struct sci_remote_node_context *rnc) static inline struct isci_remote_device *rnc_to_dev(struct sci_remote_node_context *rnc)
{ {
......
...@@ -60,18 +60,15 @@ ...@@ -60,18 +60,15 @@
#include "scu_event_codes.h" #include "scu_event_codes.h"
#include "scu_task_context.h" #include "scu_task_context.h"
#undef C
#define C(a) (#a)
const char *rnc_state_name(enum scis_sds_remote_node_context_states state)
{
static const char * const strings[] = RNC_STATES;
/** return strings[state];
* }
* @sci_rnc: The RNC for which the is posted request is being made. #undef C
*
* This method will return true if the RNC is not in the initial state. In all
* other states the RNC is considered active and this will return true. The
* destroy request of the state machine drives the RNC back to the initial
* state. If the state machine changes then this routine will also have to be
* changed. bool true if the state machine is not in the initial state false if
* the state machine is in the initial state
*/
/** /**
* *
......
...@@ -85,61 +85,50 @@ struct sci_remote_node_context; ...@@ -85,61 +85,50 @@ struct sci_remote_node_context;
typedef void (*scics_sds_remote_node_context_callback)(void *); typedef void (*scics_sds_remote_node_context_callback)(void *);
/** /**
* This is the enumeration of the remote node context states. * enum sci_remote_node_context_states
* @SCI_RNC_INITIAL initial state for a remote node context. On a resume
* request the remote node context will transition to the posting state.
*
* @SCI_RNC_POSTING: transition state that posts the RNi to the hardware. Once
* the RNC is posted the remote node context will be made ready.
*
* @SCI_RNC_INVALIDATING: transition state that will post an RNC invalidate to
* the hardware. Once the invalidate is complete the remote node context will
* transition to the posting state.
*
* @SCI_RNC_RESUMING: transition state that will post an RNC resume to the
* hardare. Once the event notification of resume complete is received the
* remote node context will transition to the ready state.
*
* @SCI_RNC_READY: state that the remote node context must be in to accept io
* request operations.
*
* @SCI_RNC_TX_SUSPENDED: state that the remote node context transitions to when
* it gets a TX suspend notification from the hardware.
*
* @SCI_RNC_TX_RX_SUSPENDED: state that the remote node context transitions to
* when it gets a TX RX suspend notification from the hardware.
*
* @SCI_RNC_AWAIT_SUSPENSION: wait state for the remote node context that waits
* for a suspend notification from the hardware. This state is entered when
* either there is a request to supend the remote node context or when there is
* a TC completion where the remote node will be suspended by the hardware.
*/ */
enum scis_sds_remote_node_context_states { #define RNC_STATES {\
/** C(RNC_INITIAL),\
* This state is the initial state for a remote node context. On a resume C(RNC_POSTING),\
* request the remote node context will transition to the posting state. C(RNC_INVALIDATING),\
*/ C(RNC_RESUMING),\
SCI_RNC_INITIAL, C(RNC_READY),\
C(RNC_TX_SUSPENDED),\
/** C(RNC_TX_RX_SUSPENDED),\
* This is a transition state that posts the RNi to the hardware. Once the RNC C(RNC_AWAIT_SUSPENSION),\
* is posted the remote node context will be made ready. }
*/ #undef C
SCI_RNC_POSTING, #define C(a) SCI_##a
enum scis_sds_remote_node_context_states RNC_STATES;
/** #undef C
* This is a transition state that will post an RNC invalidate to the const char *rnc_state_name(enum scis_sds_remote_node_context_states state);
* hardware. Once the invalidate is complete the remote node context will
* transition to the posting state.
*/
SCI_RNC_INVALIDATING,
/**
* This is a transition state that will post an RNC resume to the hardare.
* Once the event notification of resume complete is received the remote node
* context will transition to the ready state.
*/
SCI_RNC_RESUMING,
/**
* This is the state that the remote node context must be in to accept io
* request operations.
*/
SCI_RNC_READY,
/**
* This is the state that the remote node context transitions to when it gets
* a TX suspend notification from the hardware.
*/
SCI_RNC_TX_SUSPENDED,
/**
* This is the state that the remote node context transitions to when it gets
* a TX RX suspend notification from the hardware.
*/
SCI_RNC_TX_RX_SUSPENDED,
/**
* This state is a wait state for the remote node context that waits for a
* suspend notification from the hardware. This state is entered when either
* there is a request to supend the remote node context or when there is a TC
* completion where the remote node will be suspended by the hardware.
*/
SCI_RNC_AWAIT_SUSPENSION
};
/** /**
* *
......
...@@ -61,6 +61,16 @@ ...@@ -61,6 +61,16 @@
#include "scu_event_codes.h" #include "scu_event_codes.h"
#include "sas.h" #include "sas.h"
#undef C
#define C(a) (#a)
const char *req_state_name(enum sci_base_request_states state)
{
static const char * const strings[] = REQUEST_STATES;
return strings[state];
}
#undef C
static struct scu_sgl_element_pair *to_sgl_element_pair(struct isci_request *ireq, static struct scu_sgl_element_pair *to_sgl_element_pair(struct isci_request *ireq,
int idx) int idx)
{ {
...@@ -910,7 +920,8 @@ enum sci_status sci_request_complete(struct isci_request *ireq) ...@@ -910,7 +920,8 @@ enum sci_status sci_request_complete(struct isci_request *ireq)
state = ireq->sm.current_state_id; state = ireq->sm.current_state_id;
if (WARN_ONCE(state != SCI_REQ_COMPLETED, if (WARN_ONCE(state != SCI_REQ_COMPLETED,
"isci: request completion from wrong state (%d)\n", state)) "isci: request completion from wrong state (%s)\n",
req_state_name(state)))
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
if (ireq->saved_rx_frame_index != SCU_INVALID_FRAME_INDEX) if (ireq->saved_rx_frame_index != SCU_INVALID_FRAME_INDEX)
...@@ -931,8 +942,8 @@ enum sci_status sci_io_request_event_handler(struct isci_request *ireq, ...@@ -931,8 +942,8 @@ enum sci_status sci_io_request_event_handler(struct isci_request *ireq,
state = ireq->sm.current_state_id; state = ireq->sm.current_state_id;
if (state != SCI_REQ_STP_PIO_DATA_IN) { if (state != SCI_REQ_STP_PIO_DATA_IN) {
dev_warn(&ihost->pdev->dev, "%s: (%x) in wrong state %d\n", dev_warn(&ihost->pdev->dev, "%s: (%x) in wrong state %s\n",
__func__, event_code, state); __func__, event_code, req_state_name(state));
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
...@@ -2306,12 +2317,8 @@ sci_io_request_tc_completion(struct isci_request *ireq, ...@@ -2306,12 +2317,8 @@ sci_io_request_tc_completion(struct isci_request *ireq,
return atapi_data_tc_completion_handler(ireq, completion_code); return atapi_data_tc_completion_handler(ireq, completion_code);
default: default:
dev_warn(&ihost->pdev->dev, dev_warn(&ihost->pdev->dev, "%s: %x in wrong state %s\n",
"%s: SCIC IO Request given task completion " __func__, completion_code, req_state_name(state));
"notification %x while in wrong state %d\n",
__func__,
completion_code,
state);
return SCI_FAILURE_INVALID_STATE; return SCI_FAILURE_INVALID_STATE;
} }
} }
......
...@@ -182,134 +182,103 @@ static inline struct isci_request *to_ireq(struct isci_stp_request *stp_req) ...@@ -182,134 +182,103 @@ static inline struct isci_request *to_ireq(struct isci_stp_request *stp_req)
} }
/** /**
* enum sci_base_request_states - This enumeration depicts all the states for * enum sci_base_request_states - request state machine states
* the common request state machine.
* *
* @SCI_REQ_INIT: Simply the initial state for the base request state machine.
* *
* @SCI_REQ_CONSTRUCTED: This state indicates that the request has been
* constructed. This state is entered from the INITIAL state.
*
* @SCI_REQ_STARTED: This state indicates that the request has been started.
* This state is entered from the CONSTRUCTED state.
*
* @SCI_REQ_STP_UDMA_WAIT_TC_COMP:
* @SCI_REQ_STP_UDMA_WAIT_D2H:
* @SCI_REQ_STP_NON_DATA_WAIT_H2D:
* @SCI_REQ_STP_NON_DATA_WAIT_D2H:
*
* @SCI_REQ_STP_PIO_WAIT_H2D: While in this state the IO request object is
* waiting for the TC completion notification for the H2D Register FIS
*
* @SCI_REQ_STP_PIO_WAIT_FRAME: While in this state the IO request object is
* waiting for either a PIO Setup FIS or a D2H register FIS. The type of frame
* received is based on the result of the prior frame and line conditions.
*
* @SCI_REQ_STP_PIO_DATA_IN: While in this state the IO request object is
* waiting for a DATA frame from the device.
*
* @SCI_REQ_STP_PIO_DATA_OUT: While in this state the IO request object is
* waiting to transmit the next data frame to the device.
*
* @SCI_REQ_ATAPI_WAIT_H2D: While in this state the IO request object is
* waiting for the TC completion notification for the H2D Register FIS
*
* @SCI_REQ_ATAPI_WAIT_PIO_SETUP: While in this state the IO request object is
* waiting for either a PIO Setup.
*
* @SCI_REQ_ATAPI_WAIT_D2H: The non-data IO transit to this state in this state
* after receiving TC completion. While in this state IO request object is
* waiting for D2H status frame as UF.
*
* @SCI_REQ_ATAPI_WAIT_TC_COMP: When transmitting raw frames hardware reports
* task context completion after every frame submission, so in the
* non-accelerated case we need to expect the completion for the "cdb" frame.
*
* @SCI_REQ_TASK_WAIT_TC_COMP: The AWAIT_TC_COMPLETION sub-state indicates that
* the started raw task management request is waiting for the transmission of
* the initial frame (i.e. command, task, etc.).
*
* @SCI_REQ_TASK_WAIT_TC_RESP: This sub-state indicates that the started task
* management request is waiting for the reception of an unsolicited frame
* (i.e. response IU).
*
* @SCI_REQ_SMP_WAIT_RESP: This sub-state indicates that the started task
* management request is waiting for the reception of an unsolicited frame
* (i.e. response IU).
*
* @SCI_REQ_SMP_WAIT_TC_COMP: The AWAIT_TC_COMPLETION sub-state indicates that
* the started SMP request is waiting for the transmission of the initial frame
* (i.e. command, task, etc.).
*
* @SCI_REQ_COMPLETED: This state indicates that the request has completed.
* This state is entered from the STARTED state. This state is entered from the
* ABORTING state.
*
* @SCI_REQ_ABORTING: This state indicates that the request is in the process
* of being terminated/aborted. This state is entered from the CONSTRUCTED
* state. This state is entered from the STARTED state.
*
* @SCI_REQ_FINAL: Simply the final state for the base request state machine.
*/ */
enum sci_base_request_states { #define REQUEST_STATES {\
/* C(REQ_INIT),\
* Simply the initial state for the base request state machine. C(REQ_CONSTRUCTED),\
*/ C(REQ_STARTED),\
SCI_REQ_INIT, C(REQ_STP_UDMA_WAIT_TC_COMP),\
C(REQ_STP_UDMA_WAIT_D2H),\
/* C(REQ_STP_NON_DATA_WAIT_H2D),\
* This state indicates that the request has been constructed. C(REQ_STP_NON_DATA_WAIT_D2H),\
* This state is entered from the INITIAL state. C(REQ_STP_PIO_WAIT_H2D),\
*/ C(REQ_STP_PIO_WAIT_FRAME),\
SCI_REQ_CONSTRUCTED, C(REQ_STP_PIO_DATA_IN),\
C(REQ_STP_PIO_DATA_OUT),\
/* C(REQ_ATAPI_WAIT_H2D),\
* This state indicates that the request has been started. This state C(REQ_ATAPI_WAIT_PIO_SETUP),\
* is entered from the CONSTRUCTED state. C(REQ_ATAPI_WAIT_D2H),\
*/ C(REQ_ATAPI_WAIT_TC_COMP),\
SCI_REQ_STARTED, C(REQ_TASK_WAIT_TC_COMP),\
C(REQ_TASK_WAIT_TC_RESP),\
SCI_REQ_STP_UDMA_WAIT_TC_COMP, C(REQ_SMP_WAIT_RESP),\
SCI_REQ_STP_UDMA_WAIT_D2H, C(REQ_SMP_WAIT_TC_COMP),\
C(REQ_COMPLETED),\
SCI_REQ_STP_NON_DATA_WAIT_H2D, C(REQ_ABORTING),\
SCI_REQ_STP_NON_DATA_WAIT_D2H, C(REQ_FINAL),\
}
/* #undef C
* While in this state the IO request object is waiting for the TC #define C(a) SCI_##a
* completion notification for the H2D Register FIS enum sci_base_request_states REQUEST_STATES;
*/ #undef C
SCI_REQ_STP_PIO_WAIT_H2D, const char *req_state_name(enum sci_base_request_states state);
/*
* While in this state the IO request object is waiting for either a
* PIO Setup FIS or a D2H register FIS. The type of frame received is
* based on the result of the prior frame and line conditions.
*/
SCI_REQ_STP_PIO_WAIT_FRAME,
/*
* While in this state the IO request object is waiting for a DATA
* frame from the device.
*/
SCI_REQ_STP_PIO_DATA_IN,
/*
* While in this state the IO request object is waiting to transmit
* the next data frame to the device.
*/
SCI_REQ_STP_PIO_DATA_OUT,
/*
* While in this state the IO request object is waiting for the TC
* completion notification for the H2D Register FIS
*/
SCI_REQ_ATAPI_WAIT_H2D,
/*
* While in this state the IO request object is waiting for either a
* PIO Setup.
*/
SCI_REQ_ATAPI_WAIT_PIO_SETUP,
/*
* The non-data IO transit to this state in this state after receiving
* TC completion. While in this state IO request object is waiting for
* D2H status frame as UF.
*/
SCI_REQ_ATAPI_WAIT_D2H,
/*
* When transmitting raw frames hardware reports task context completion
* after every frame submission, so in the non-accelerated case we need
* to expect the completion for the "cdb" frame.
*/
SCI_REQ_ATAPI_WAIT_TC_COMP,
/*
* The AWAIT_TC_COMPLETION sub-state indicates that the started raw
* task management request is waiting for the transmission of the
* initial frame (i.e. command, task, etc.).
*/
SCI_REQ_TASK_WAIT_TC_COMP,
/*
* This sub-state indicates that the started task management request
* is waiting for the reception of an unsolicited frame
* (i.e. response IU).
*/
SCI_REQ_TASK_WAIT_TC_RESP,
/*
* This sub-state indicates that the started task management request
* is waiting for the reception of an unsolicited frame
* (i.e. response IU).
*/
SCI_REQ_SMP_WAIT_RESP,
/*
* The AWAIT_TC_COMPLETION sub-state indicates that the started SMP
* request is waiting for the transmission of the initial frame
* (i.e. command, task, etc.).
*/
SCI_REQ_SMP_WAIT_TC_COMP,
/*
* This state indicates that the request has completed.
* This state is entered from the STARTED state. This state is entered
* from the ABORTING state.
*/
SCI_REQ_COMPLETED,
/*
* This state indicates that the request is in the process of being
* terminated/aborted.
* This state is entered from the CONSTRUCTED state.
* This state is entered from the STARTED state.
*/
SCI_REQ_ABORTING,
/*
* Simply the final state for the base request state machine.
*/
SCI_REQ_FINAL,
};
enum sci_status sci_request_start(struct isci_request *ireq); enum sci_status sci_request_start(struct isci_request *ireq);
enum sci_status sci_io_request_terminate(struct isci_request *ireq); enum sci_status sci_io_request_terminate(struct isci_request *ireq);
......
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