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

Commit 621120ca authored by Jeff Skirvin's avatar Jeff Skirvin Committed by Dan Williams
Browse files

isci: Manage tag releases differently when aborting tasks.



When an individual request is being terminated, the request's tag
is managed in the terminate function.

Signed-off-by: default avatarJeff Skirvin <jeffrey.d.skirvin@intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 033d19d2
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -1141,6 +1141,7 @@ void isci_host_completion_routine(unsigned long data)
		if (test_and_clear_bit(IREQ_ABORT_PATH_ACTIVE, &request->flags))
			wake_up_all(&ihost->eventq);

		if (!test_bit(IREQ_NO_AUTO_FREE_TAG, &request->flags))
			isci_free_tag(ihost, request->io_tag);
	}
	spin_unlock_irq(&ihost->scic_lock);
+7 −4
Original line number Diff line number Diff line
@@ -104,15 +104,15 @@ static enum sci_status sci_remote_device_terminate_req(
	int check_abort,
	struct isci_request *ireq)
{
	dev_dbg(&ihost->pdev->dev,
		"%s: idev=%p; flags=%lx; req=%p; req target=%p\n",
		__func__, idev, idev->flags, ireq, ireq->target_device);

	if (!test_bit(IREQ_ACTIVE, &ireq->flags) ||
	    (ireq->target_device != idev) ||
	    (check_abort && !test_bit(IREQ_PENDING_ABORT, &ireq->flags)))
		return SCI_SUCCESS;

	dev_dbg(&ihost->pdev->dev,
		"%s: idev=%p; flags=%lx; req=%p; req target=%p\n",
		__func__, idev, idev->flags, ireq, ireq->target_device);

	set_bit(IREQ_ABORT_PATH_ACTIVE, &ireq->flags);

	return sci_controller_terminate_request(ihost, idev, ireq);
@@ -209,11 +209,14 @@ enum sci_status isci_remote_device_terminate_requests(
			rnc_suspend_count, idev->rnc.suspend_count);
		if (ireq) {
			/* Terminate a specific TC. */
			set_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags);
			sci_remote_device_terminate_req(ihost, idev, 0, ireq);
			spin_unlock_irqrestore(&ihost->scic_lock, flags);
			wait_event(ihost->eventq,
				   isci_check_reqterm(ihost, idev, ireq,
						      rnc_suspend_count));
			clear_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags);
			isci_free_tag(ihost, ireq->io_tag);
		} else {
			/* Terminate all TCs. */
			sci_remote_device_terminate_requests(idev);
+1 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ struct isci_request {
	#define IREQ_PENDING_ABORT 4 /* Set == device was not suspended yet */
	#define IREQ_TC_ABORT_POSTED 5
	#define IREQ_ABORT_PATH_ACTIVE 6
	#define IREQ_NO_AUTO_FREE_TAG 7 /* Set when being explicitly managed */
	unsigned long flags;
	/* XXX kill ttype and ttype_ptr, allocate full sas_task */
	union ttype_ptr_union {
+2 −1
Original line number Diff line number Diff line
@@ -719,6 +719,7 @@ isci_task_request_complete(struct isci_host *ihost,
	 */
	set_bit(IREQ_TERMINATED, &ireq->flags);

	if (!test_bit(IREQ_NO_AUTO_FREE_TAG, &ireq->flags))
		isci_free_tag(ihost, ireq->io_tag);

	/* The task management part completes last. */