mirror of https://gitee.com/openkylin/linux.git
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: Suman Tripathi <stripathi@apm.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
5c0b8e0de7
commit
1102407bb7
|
@ -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)
|
||||||
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);
|
||||||
|
|
Loading…
Reference in New Issue