Skip to content

Commit

Permalink
isci: fix hang after target reset
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Dan Williams committed Jul 3, 2011
1 parent d7628d0 commit 27ce51d
Showing 1 changed file with 14 additions and 6 deletions.
20 changes: 14 additions & 6 deletions drivers/scsi/isci/core/scic_sds_port.c
Original file line number Diff line number Diff line change
Expand Up @@ -1673,12 +1673,6 @@ static void scic_sds_port_ready_substate_waiting_enter(

scic_sds_port_suspend_port_task_scheduler(this_port);

/* Kill the dummy task for this port if it has not yet posted
* the hardware will treat this as a NOP and just return abort
* complete.
*/
scic_sds_port_abort_dummy_request(this_port);

this_port->not_ready_reason = SCIC_PORT_NOT_READY_NO_ACTIVE_PHYS;

if (this_port->active_phy_mask != 0) {
Expand Down Expand Up @@ -1744,6 +1738,13 @@ static void scic_sds_port_ready_substate_operational_exit(
{
struct scic_sds_port *this_port = (struct scic_sds_port *)object;

/*
* Kill the dummy task for this port if it has not yet posted
* the hardware will treat this as a NOP and just return abort
* complete.
*/
scic_sds_port_abort_dummy_request(this_port);

isci_event_port_not_ready(
scic_sds_port_get_controller(this_port),
this_port,
Expand Down Expand Up @@ -2643,6 +2644,13 @@ void scic_sds_port_invalidate_dummy_remote_node(struct scic_sds_port *sci_port)

rnc->ssp.is_valid = false;

/* ensure the preceding tc abort request has reached the
* controller and give it ample time to act before posting the rnc
* invalidate
*/
SMU_ISR_READ(scic); /* flush */
udelay(10);

command = SCU_CONTEXT_COMMAND_POST_RNC_INVALIDATE |
phys_index << SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT | rni;

Expand Down

0 comments on commit 27ce51d

Please sign in to comment.