Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 086a0dab authored by Dan Williams's avatar Dan Williams
Browse files

isci: fix isci_task_execute_tmf completion



1/ fix the timeout for wait_for_completion_timeout
2/ In the tmf timeout case we need to wait for our termination callback
3/ Once the request is successfully started it will be freed according to the
   normal lifetime for requests.

Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent e9bf7095
Loading
Loading
Loading
Loading
+8 −12
Original line number Diff line number Diff line
@@ -339,7 +339,8 @@ int isci_task_execute_tmf(struct isci_host *ihost,
			 status,
			 ireq);
		spin_unlock_irqrestore(&ihost->scic_lock, flags);
		goto cleanup_request;
		isci_request_free(ihost, ireq);
		return ret;
	}

	if (tmf->cb_state_func != NULL)
@@ -354,7 +355,7 @@ int isci_task_execute_tmf(struct isci_host *ihost,

	/* Wait for the TMF to complete, or a timeout. */
	timeleft = wait_for_completion_timeout(&completion,
				       jiffies + msecs_to_jiffies(timeout_ms));
					       msecs_to_jiffies(timeout_ms));

	if (timeleft == 0) {
		spin_lock_irqsave(&ihost->scic_lock, flags);
@@ -362,11 +363,13 @@ int isci_task_execute_tmf(struct isci_host *ihost,
		if (tmf->cb_state_func != NULL)
			tmf->cb_state_func(isci_tmf_timed_out, tmf, tmf->cb_data);

		status = scic_controller_terminate_request(&ihost->sci,
		scic_controller_terminate_request(&ihost->sci,
						  &isci_device->sci,
						  &ireq->sci);

		spin_unlock_irqrestore(&ihost->scic_lock, flags);

		wait_for_completion(tmf->complete);
	}

	isci_print_tmf(tmf);
@@ -387,13 +390,6 @@ int isci_task_execute_tmf(struct isci_host *ihost,
		__func__,
		ireq);

	if (ireq->io_request_completion != NULL) {
		/* A thread is waiting for this TMF to finish. */
		complete(ireq->io_request_completion);
	}

 cleanup_request:
	isci_request_free(ihost, ireq);
	return ret;
}