summaryrefslogtreecommitdiffstats
path: root/drivers/ata/ahci_xgene.c
diff options
context:
space:
mode:
authorSuman Tripathi <stripathi@apm.com>2015-02-02 19:07:19 +0100
committerTejun Heo <tj@kernel.org>2015-02-03 17:16:47 +0100
commit09c32aaa3683cbcb6c2787a42f87630dff37d2a5 (patch)
tree99c0f42c057bfef3401a8353547fd7ca47ef1560 /drivers/ata/ahci_xgene.c
parentlibata: prevent HSM state change race between ISR and PIO (diff)
downloadlinux-09c32aaa3683cbcb6c2787a42f87630dff37d2a5.tar.xz
linux-09c32aaa3683cbcb6c2787a42f87630dff37d2a5.zip
ahci_xgene: Fix the dma state machine lockup for the ATA_CMD_SMART PIO mode command.
This patch addresses the issue with ATA_CMD_SMART pio mode command for enumeration and device detection with ATA devices. The X-Gene AHCI controller has an errata in which it cannot clear the BSY bit after the PIO setup FIS. The dma state machine enters CMFatalErrorUpdate state and locks up. It is the same issue as in the commit 2a0bdff6b958 ("ahci-xgene: fix the dma state machine lockup for the IDENTIFY DEVICE PIO mode command"). For example : without this patch it results in READ DMA command failure as shown below : [ 126.700072] ata2.00: exception Emask 0x0 SAct 0x0 SErr 0x0 action 0x6 frozen [ 126.707089] ata2.00: failed command: READ DMA [ 126.711426] ata2.00: cmd c8/00:08:00:55:57/00:00:00:00:00/e1 tag 1 dma 4096 in [ 126.711426] res 40/00:ff:00:00:00/00:00:00:00:00/40 Emask 0x4 (timeout) [ 126.725956] ata2.00: status: { DRDY } Signed-off-by: Suman Tripathi <stripathi@apm.com> Reported-by: Mark Langsdorf <mlangsdo@redhat.com> Signed-off-by: Tejun Heo <tj@kernel.org>
Diffstat (limited to 'drivers/ata/ahci_xgene.c')
-rw-r--r--drivers/ata/ahci_xgene.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c
index cbcd20810355..f752c30477cb 100644
--- a/drivers/ata/ahci_xgene.c
+++ b/drivers/ata/ahci_xgene.c
@@ -139,7 +139,8 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
int rc = 0;
if (unlikely((ctx->last_cmd[ap->port_no] == ATA_CMD_ID_ATA) ||
- (ctx->last_cmd[ap->port_no] == ATA_CMD_PACKET)))
+ (ctx->last_cmd[ap->port_no] == ATA_CMD_PACKET) ||
+ (ctx->last_cmd[ap->port_no] == ATA_CMD_SMART)))
xgene_ahci_restart_engine(ap);
rc = ahci_qc_issue(qc);