aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2006-03-24 01:25:30 -0500
committerJeff Garzik <jeff@garzik.org>2006-03-24 09:39:57 -0500
commit1f7dd3e9d62b25c7b79f913f37c2242a61295de4 (patch)
tree7fc6cfaeca33cdae056a3ed69f841327391c9e8e /drivers/scsi
parent5a529139554f12cb265715117a2153c936286294 (diff)
[PATCH] libata: check if port is disabled after internal command
libata core is being changed to disallow port/device disable on lower layers. However, some LLDDs (sata_mv) directly disable port on command failure. This patch makes ata_exec_internal() check whether a port got disabled after an internal command. If it is, AC_ERR_SYSTEM is added to err_mask and the port gets re-enabled. As internal command failure results in device disable for drivers which don't implement newer reset/EH callbacks, this change results in no behavior change for single device per port controllers. For slave-possible LLDDs which disable port on command failure, (1) such drivers don't exist currently, (2) issuing command to the other device of once-disabled port shouldn't result in catastrophe even if such driver exists. So, this should be enough as a temporary measure. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/libata-core.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/scsi/libata-core.c b/drivers/scsi/libata-core.c
index 1063928e3824..9cd9053e78fe 100644
--- a/drivers/scsi/libata-core.c
+++ b/drivers/scsi/libata-core.c
@@ -1009,6 +1009,22 @@ ata_exec_internal(struct ata_port *ap, struct ata_device *dev,
1009 1009
1010 ata_qc_free(qc); 1010 ata_qc_free(qc);
1011 1011
1012 /* XXX - Some LLDDs (sata_mv) disable port on command failure.
1013 * Until those drivers are fixed, we detect the condition
1014 * here, fail the command with AC_ERR_SYSTEM and reenable the
1015 * port.
1016 *
1017 * Note that this doesn't change any behavior as internal
1018 * command failure results in disabling the device in the
1019 * higher layer for LLDDs without new reset/EH callbacks.
1020 *
1021 * Kill the following code as soon as those drivers are fixed.
1022 */
1023 if (ap->flags & ATA_FLAG_PORT_DISABLED) {
1024 err_mask |= AC_ERR_SYSTEM;
1025 ata_port_probe(ap);
1026 }
1027
1012 return err_mask; 1028 return err_mask;
1013} 1029}
1014 1030