Commit 1102407b authored by Suman Tripathi's avatar Suman Tripathi Committed by Tejun Heo

ahci_xgene: Fix the DMA state machine lockup for the ATA_CMD_PACKET PIO mode command.

This patch addresses the issue with ATA_CMD_PACKET pio mode
command for enumeration and device detection with ATAPI 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.
Signed-off-by: default avatarSuman Tripathi <stripathi@apm.com>
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
parent 5c0b8e0d
...@@ -125,10 +125,11 @@ static int xgene_ahci_restart_engine(struct ata_port *ap) ...@@ -125,10 +125,11 @@ static int xgene_ahci_restart_engine(struct ata_port *ap)
* xgene_ahci_qc_issue - Issue commands to the device * xgene_ahci_qc_issue - Issue commands to the device
* @qc: Command to issue * @qc: Command to issue
* *
* Due to Hardware errata for IDENTIFY DEVICE command, the controller cannot * Due to Hardware errata for IDENTIFY DEVICE command and PACKET
* clear the BSY bit after receiving the PIO setup FIS. This results in the dma * command of ATAPI protocol set, the controller cannot clear the BSY bit
* state machine goes into the CMFatalErrorUpdate state and locks up. By * after receiving the PIO setup FIS. This results in the DMA state machine
* restarting the dma engine, it removes the controller out of lock up state. * going into the CMFatalErrorUpdate state and locks up. By restarting the
* DMA engine, it removes the controller out of lock up state.
*/ */
static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc) static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
{ {
...@@ -137,7 +138,8 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc) ...@@ -137,7 +138,8 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
struct xgene_ahci_context *ctx = hpriv->plat_data; struct xgene_ahci_context *ctx = hpriv->plat_data;
int rc = 0; int rc = 0;
if (unlikely(ctx->last_cmd[ap->port_no] == ATA_CMD_ID_ATA)) if (unlikely((ctx->last_cmd[ap->port_no] == ATA_CMD_ID_ATA) ||
(ctx->last_cmd[ap->port_no] == ATA_CMD_PACKET)))
xgene_ahci_restart_engine(ap); xgene_ahci_restart_engine(ap);
rc = ahci_qc_issue(qc); rc = ahci_qc_issue(qc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment