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

Commit 9608b640 authored by Jeff Skirvin's avatar Jeff Skirvin Committed by Dan Williams
Browse files

isci: Manage the LLHANG timer enable/disable per-device.



The LLHANG timer should be enabled once per device.  This patch corrects
both the timer enable and the timer disable for the remote device.

Signed-off-by: default avatarJeff Skirvin <jeffrey.d.skirvin@intel.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent 447bfbce
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -1520,3 +1520,20 @@ enum sci_status isci_remote_device_reset_complete(
	return status;
}

void isci_dev_set_hang_detection_timeout(
	struct isci_remote_device *idev,
	u32 timeout)
{
	if (dev_is_sata(idev->domain_dev)) {
		if (timeout) {
			if (test_and_set_bit(IDEV_RNC_LLHANG_ENABLED,
					     &idev->flags))
				return;  /* Already enabled. */
		} else if (!test_and_clear_bit(IDEV_RNC_LLHANG_ENABLED,
					       &idev->flags))
			return;  /* Not enabled. */

		sci_port_set_hang_detection_timeout(idev->owning_port,
						    timeout);
	}
}
+2 −6
Original line number Diff line number Diff line
@@ -85,6 +85,7 @@ struct isci_remote_device {
	#define IDEV_GONE 3
	#define IDEV_IO_READY 4
	#define IDEV_IO_NCQERROR 5
	#define IDEV_RNC_LLHANG_ENABLED 6
	unsigned long flags;
	struct kref kref;
	struct isci_port *isci_port;
@@ -308,12 +309,7 @@ static inline void sci_remote_device_decrement_request_count(struct isci_remote_
		idev->started_request_count--;
}

static inline void isci_dev_set_hang_detection_timeout(
	struct isci_remote_device *idev,
	u32 timeout)
{
	sci_port_set_hang_detection_timeout(idev->owning_port, timeout);
}
void isci_dev_set_hang_detection_timeout(struct isci_remote_device *idev, u32 timeout);

enum sci_status sci_remote_device_frame_handler(
	struct isci_remote_device *idev,
+1 −2
Original line number Diff line number Diff line
@@ -615,8 +615,7 @@ enum sci_status sci_remote_node_context_suspend(
	if ((suspend_reason == SCI_SW_SUSPEND_NORMAL) ||
	    (suspend_reason == SCI_SW_SUSPEND_LINKHANG_DETECT)) {

		if ((suspend_reason == SCI_SW_SUSPEND_LINKHANG_DETECT)
		 && dev_is_sata(idev->domain_dev))
		if (suspend_reason == SCI_SW_SUSPEND_LINKHANG_DETECT)
			isci_dev_set_hang_detection_timeout(idev, 0x00000001);

		sci_remote_device_post_request(