| From c521af565b47d1db292cb1efba9d57832e1c78ec Mon Sep 17 00:00:00 2001 |
| From: Florian Fainelli <f.fainelli@gmail.com> |
| Date: Tue, 10 Dec 2019 10:53:46 -0800 |
| Subject: [PATCH] ata: ahci_brcm: BCM7425 AHCI requires AHCI_HFLAG_DELAY_ENGINE |
| |
| commit 1a3d78cb6e20779a19388315bd8efefbd8d4a656 upstream. |
| |
| Set AHCI_HFLAG_DELAY_ENGINE for the BCM7425 AHCI controller thus making |
| it conforming to the 'strict' AHCI implementation which this controller |
| is based on. |
| |
| This solves long link establishment with specific hard drives (e.g.: |
| Seagate ST1000VM002-9ZL1 SC12) that would otherwise have to complete the |
| error recovery handling before finally establishing a succesful SATA |
| link at the desired speed. |
| |
| We re-order the hpriv->flags assignment to also remove the NONCQ quirk |
| since we can set the flag directly. |
| |
| Fixes: 9586114cf1e9 ("ata: ahci_brcmstb: add support MIPS-based platforms") |
| Fixes: 423be77daabe ("ata: ahci_brcmstb: add quirk for broken ncq") |
| Cc: stable@vger.kernel.org |
| Reviewed-by: Hans de Goede <hdegoede@redhat.com> |
| Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/ata/ahci_brcm.c b/drivers/ata/ahci_brcm.c |
| index 21043cc70045..66a570d0da83 100644 |
| --- a/drivers/ata/ahci_brcm.c |
| +++ b/drivers/ata/ahci_brcm.c |
| @@ -76,8 +76,7 @@ enum brcm_ahci_version { |
| }; |
| |
| enum brcm_ahci_quirks { |
| - BRCM_AHCI_QUIRK_NO_NCQ = BIT(0), |
| - BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE = BIT(1), |
| + BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE = BIT(0), |
| }; |
| |
| struct brcm_ahci_priv { |
| @@ -439,18 +438,27 @@ static int brcm_ahci_probe(struct platform_device *pdev) |
| if (!IS_ERR_OR_NULL(priv->rcdev)) |
| reset_control_deassert(priv->rcdev); |
| |
| - if ((priv->version == BRCM_SATA_BCM7425) || |
| - (priv->version == BRCM_SATA_NSP)) { |
| - priv->quirks |= BRCM_AHCI_QUIRK_NO_NCQ; |
| - priv->quirks |= BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE; |
| - } |
| - |
| hpriv = ahci_platform_get_resources(pdev, 0); |
| if (IS_ERR(hpriv)) { |
| ret = PTR_ERR(hpriv); |
| goto out_reset; |
| } |
| |
| + hpriv->plat_data = priv; |
| + hpriv->flags = AHCI_HFLAG_WAKE_BEFORE_STOP | AHCI_HFLAG_NO_WRITE_TO_RO; |
| + |
| + switch (priv->version) { |
| + case BRCM_SATA_BCM7425: |
| + hpriv->flags |= AHCI_HFLAG_DELAY_ENGINE; |
| + /* fall through */ |
| + case BRCM_SATA_NSP: |
| + hpriv->flags |= AHCI_HFLAG_NO_NCQ; |
| + priv->quirks |= BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE; |
| + break; |
| + default: |
| + break; |
| + } |
| + |
| ret = ahci_platform_enable_clks(hpriv); |
| if (ret) |
| goto out_reset; |
| @@ -470,15 +478,8 @@ static int brcm_ahci_probe(struct platform_device *pdev) |
| /* Must be done before ahci_platform_enable_phys() */ |
| brcm_sata_phys_enable(priv); |
| |
| - hpriv->plat_data = priv; |
| - hpriv->flags = AHCI_HFLAG_WAKE_BEFORE_STOP; |
| - |
| brcm_sata_alpm_init(hpriv); |
| |
| - if (priv->quirks & BRCM_AHCI_QUIRK_NO_NCQ) |
| - hpriv->flags |= AHCI_HFLAG_NO_NCQ; |
| - hpriv->flags |= AHCI_HFLAG_NO_WRITE_TO_RO; |
| - |
| ret = ahci_platform_enable_phys(hpriv); |
| if (ret) |
| goto out_disable_phys; |
| -- |
| 2.7.4 |
| |