summaryrefslogtreecommitdiffstats
path: root/drivers/scsi/isci/core
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/isci/core')
-rw-r--r--drivers/scsi/isci/core/scic_sds_stp_remote_device.c25
1 files changed, 21 insertions, 4 deletions
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 1d8d901..9a615f0 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;
OpenPOWER on IntegriCloud