Skip to content

Commit

Permalink
isci: Manage the LLHANG timer enable/disable per-device.
Browse files Browse the repository at this point in the history
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: Jeff Skirvin <jeffrey.d.skirvin@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Jeff Skirvin authored and Dan Williams committed May 17, 2012
1 parent 447bfbc commit 9608b64
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 8 deletions.
17 changes: 17 additions & 0 deletions drivers/scsi/isci/remote_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
8 changes: 2 additions & 6 deletions drivers/scsi/isci/remote_device.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down
3 changes: 1 addition & 2 deletions drivers/scsi/isci/remote_node_context.c
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down

0 comments on commit 9608b64

Please sign in to comment.