lkml.org 
[lkml]   [2018]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 3.18 10/98] ahci_xgene: Fix the DMA state machine lockup for the ATA_CMD_PACKET PIO mode command.
    Date
    From: Suman Tripathi <stripathi@apm.com>

    [ Upstream commit 1102407bb714dcebb43f385335bcb72f6b8843bc ]

    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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/ata/ahci_xgene.c | 12 +++++++-----
    1 file changed, 7 insertions(+), 5 deletions(-)

    diff --git a/drivers/ata/ahci_xgene.c b/drivers/ata/ahci_xgene.c
    index 0ffd3c930bed..d33216155827 100644
    --- a/drivers/ata/ahci_xgene.c
    +++ b/drivers/ata/ahci_xgene.c
    @@ -125,10 +125,11 @@ static int xgene_ahci_restart_engine(struct ata_port *ap)
    * xgene_ahci_qc_issue - Issue commands to the device
    * @qc: Command to issue
    *
    - * Due to Hardware errata for IDENTIFY DEVICE command, the controller cannot
    - * clear the BSY bit after receiving the PIO setup FIS. This results in the dma
    - * state machine goes into the CMFatalErrorUpdate state and locks up. By
    - * restarting the dma engine, it removes the controller out of lock up state.
    + * Due to Hardware errata for IDENTIFY DEVICE command and PACKET
    + * command of ATAPI protocol set, the controller cannot clear the BSY bit
    + * after receiving the PIO setup FIS. This results in the DMA state machine
    + * 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)
    {
    @@ -137,7 +138,8 @@ static unsigned int xgene_ahci_qc_issue(struct ata_queued_cmd *qc)
    struct xgene_ahci_context *ctx = hpriv->plat_data;
    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);

    rc = ahci_qc_issue(qc);
    --
    2.17.1
    \
     
     \ /
      Last update: 2018-10-25 16:31    [W:4.578 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site