aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDan Williams <dan.j.williams@intel.com>2011-03-02 19:45:18 -0500
committerDan Williams <dan.j.williams@intel.com>2011-07-03 06:55:29 -0400
commit27ce51df9a333ca7e05e09f6d25becf26ac1ff45 (patch)
treedbd50cc736c0eeb7e10ee2b15320c9f06b789f02
parentd7628d052242d634dc1e2584c422e690578918a3 (diff)
isci: fix hang after target reset
When aborting a task context we need to be sure that the hardware has acted on this request (retrieved the task context) before invalidating the remote node context. In the case of the "dummy" task context and remote node we do not have the full state machine that goes through the complete tc abort and rnc invalidate states. Instead we ensure the hardware has seen and acted on Signed-off-by: Jacek Danecki <Jacek.Danecki@intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com>
-rw-r--r--drivers/scsi/isci/core/scic_sds_port.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/scsi/isci/core/scic_sds_port.c b/drivers/scsi/isci/core/scic_sds_port.c
index 410c9a104bc0..a41fe426ac26 100644
--- a/drivers/scsi/isci/core/scic_sds_port.c
+++ b/drivers/scsi/isci/core/scic_sds_port.c
@@ -1673,12 +1673,6 @@ static void scic_sds_port_ready_substate_waiting_enter(
1673 1673
1674 scic_sds_port_suspend_port_task_scheduler(this_port); 1674 scic_sds_port_suspend_port_task_scheduler(this_port);
1675 1675
1676 /* Kill the dummy task for this port if it has not yet posted
1677 * the hardware will treat this as a NOP and just return abort
1678 * complete.
1679 */
1680 scic_sds_port_abort_dummy_request(this_port);
1681
1682 this_port->not_ready_reason = SCIC_PORT_NOT_READY_NO_ACTIVE_PHYS; 1676 this_port->not_ready_reason = SCIC_PORT_NOT_READY_NO_ACTIVE_PHYS;
1683 1677
1684 if (this_port->active_phy_mask != 0) { 1678 if (this_port->active_phy_mask != 0) {
@@ -1744,6 +1738,13 @@ static void scic_sds_port_ready_substate_operational_exit(
1744{ 1738{
1745 struct scic_sds_port *this_port = (struct scic_sds_port *)object; 1739 struct scic_sds_port *this_port = (struct scic_sds_port *)object;
1746 1740
1741/*
1742 * Kill the dummy task for this port if it has not yet posted
1743 * the hardware will treat this as a NOP and just return abort
1744 * complete.
1745 */
1746 scic_sds_port_abort_dummy_request(this_port);
1747
1747 isci_event_port_not_ready( 1748 isci_event_port_not_ready(
1748 scic_sds_port_get_controller(this_port), 1749 scic_sds_port_get_controller(this_port),
1749 this_port, 1750 this_port,
@@ -2643,6 +2644,13 @@ void scic_sds_port_invalidate_dummy_remote_node(struct scic_sds_port *sci_port)
2643 2644
2644 rnc->ssp.is_valid = false; 2645 rnc->ssp.is_valid = false;
2645 2646
2647 /* ensure the preceding tc abort request has reached the
2648 * controller and give it ample time to act before posting the rnc
2649 * invalidate
2650 */
2651 SMU_ISR_READ(scic); /* flush */
2652 udelay(10);
2653
2646 command = SCU_CONTEXT_COMMAND_POST_RNC_INVALIDATE | 2654 command = SCU_CONTEXT_COMMAND_POST_RNC_INVALIDATE |
2647 phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni; 2655 phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni;
2648 2656