From: Piotr Sawicki <piotr.sawicki@intel.com>
Date: Fri, 25 Feb 2011 21:07:38 +0000 (-0800)
Subject: isci: handle cases where a d2h fis is used report an ncq error
X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=3ff0121a704172aa4bca9c4026b419ddfe1921c8;p=GitHub%2Fexynos8895%2Fandroid_kernel_samsung_universal8895.git

isci: handle cases where a d2h fis is used report an ncq error

Observed that some devices return a d2h fis, treat like an sdb error fis.

Signed-off-by: Piotr Sawicki <piotr.sawicki@intel.com>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---

diff --git a/drivers/scsi/isci/core/scic_sds_stp_remote_device.c b/drivers/scsi/isci/core/scic_sds_stp_remote_device.c
index 1d8d9013068f..9a615f07cefe 100644
--- a/drivers/scsi/isci/core/scic_sds_stp_remote_device.c
+++ b/drivers/scsi/isci/core/scic_sds_stp_remote_device.c
@@ -367,10 +367,27 @@ static enum sci_status scic_sds_stp_remote_device_ready_ncq_substate_frame_handl
 		);
 
 	if (status == SCI_SUCCESS) {
-		if (
-			(frame_header->fis_type == SATA_FIS_TYPE_SETDEVBITS)
-			&& (frame_header->status & ATA_STATUS_REG_ERROR_BIT)
-			) {
+		if (frame_header->fis_type == SATA_FIS_TYPE_SETDEVBITS &&
+		    (frame_header->status & ATA_STATUS_REG_ERROR_BIT)) {
+			this_device->not_ready_reason =
+				SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;
+
+			/*
+			 * / @todo Check sactive and complete associated IO
+			 * if any.
+			 */
+
+			sci_base_state_machine_change_state(
+				&this_device->ready_substate_machine,
+				SCIC_SDS_STP_REMOTE_DEVICE_READY_SUBSTATE_NCQ_ERROR
+				);
+		} else if (frame_header->fis_type == SATA_FIS_TYPE_REGD2H &&
+			   (frame_header->status & ATA_STATUS_REG_ERROR_BIT)) {
+
+			/*
+			 * Some devices return D2H FIS when an NCQ error is detected.
+			 * Treat this like an SDB error FIS ready reason.
+			 */
 			this_device->not_ready_reason =
 				SCIC_REMOTE_DEVICE_NOT_READY_SATA_SDB_ERROR_FIS_RECEIVED;