summaryrefslogtreecommitdiff
path: root/drivers/scsi
diff options
context:
space:
mode:
authorJeff Skirvin <jeffrey.d.skirvin@intel.com>2011-06-21 01:09:22 +0400
committerDan Williams <dan.j.williams@intel.com>2011-07-03 15:04:50 +0400
commitfd53660120b5eda06539225de56755dc389a4e64 (patch)
tree97780e0cd62fd12ba2e171a0524ca5f335ba5906 /drivers/scsi
parent980d3aeb3828b0fdf2a0b2e893d238130b014575 (diff)
downloadlinux-fd53660120b5eda06539225de56755dc389a4e64.tar.xz
isci: Explicitly decode remote node ready and suspended states
The remote node context should only signal a device reset condition in a suspended state. Signed-off-by: Jeff Skirvin <jeffrey.d.skirvin@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/isci/remote_node_context.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/scsi/isci/remote_node_context.c b/drivers/scsi/isci/remote_node_context.c
index 9e8967e19688..b6774bcdabd8 100644
--- a/drivers/scsi/isci/remote_node_context.c
+++ b/drivers/scsi/isci/remote_node_context.c
@@ -603,12 +603,23 @@ enum sci_status scic_sds_remote_node_context_start_io(struct scic_sds_remote_nod
enum scis_sds_remote_node_context_states state;
state = sci_rnc->sm.current_state_id;
- if (state != SCI_RNC_READY) {
+
+ switch (state) {
+ case SCI_RNC_READY:
+ return SCI_SUCCESS;
+ case SCI_RNC_TX_SUSPENDED:
+ case SCI_RNC_TX_RX_SUSPENDED:
+ case SCI_RNC_AWAIT_SUSPENSION:
dev_warn(scirdev_to_dev(rnc_to_dev(sci_rnc)),
"%s: invalid state %d\n", __func__, state);
return SCI_FAILURE_REMOTE_DEVICE_RESET_REQUIRED;
+ default:
+ break;
}
- return SCI_SUCCESS;
+ dev_dbg(scirdev_to_dev(rnc_to_dev(sci_rnc)),
+ "%s: requested to start IO while still resuming, %d\n",
+ __func__, state);
+ return SCI_FAILURE_INVALID_STATE;
}
enum sci_status scic_sds_remote_node_context_start_task(struct scic_sds_remote_node_context *sci_rnc,