scsi: ufs: handle errors from PHY_ADAPTER_ERROR register
authorDolev Raviv <draviv@codeaurora.org>
Thu, 24 Nov 2016 00:32:32 +0000 (16:32 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 29 Nov 2016 17:06:56 +0000 (12:06 -0500)
The PHY_ADAPTER_ERROR status register indicates PHY lane errors
reported by the M-PHY layer. In some occasions the controller
can recover from such errors. When the error is not recoverable,
a stuck DB error will occur. Since the stuck DB error is spotted
separately, no action other than clearing the register is necessary.

Signed-off-by: Dolev Raviv <draviv@codeaurora.org>
Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufshcd.c
drivers/scsi/ufs/ufshci.h

index 16c5c50..ec4c99a 100644 (file)
@@ -4215,6 +4215,17 @@ static void ufshcd_update_uic_error(struct ufs_hba *hba)
 {
        u32 reg;
 
+       /* PHY layer lane error */
+       reg = ufshcd_readl(hba, REG_UIC_ERROR_CODE_PHY_ADAPTER_LAYER);
+       /* Ignore LINERESET indication, as this is not an error */
+       if ((reg & UIC_PHY_ADAPTER_LAYER_ERROR) &&
+                       (reg & UIC_PHY_ADAPTER_LAYER_LANE_ERR_MASK))
+               /*
+                * To know whether this error is fatal or not, DB timeout
+                * must be checked but this error is handled separately.
+                */
+               dev_dbg(hba->dev, "%s: UIC Lane error reported\n", __func__);
+
        /* PA_INIT_ERROR is fatal and needs UIC reset */
        reg = ufshcd_readl(hba, REG_UIC_ERROR_CODE_DATA_LINK_LAYER);
        if (reg & UIC_DATA_LINK_LAYER_ERROR_PA_INIT)
index bbd8df9..5d97886 100644 (file)
@@ -168,6 +168,7 @@ enum {
 /* UECPA - Host UIC Error Code PHY Adapter Layer 38h */
 #define UIC_PHY_ADAPTER_LAYER_ERROR                    UFS_BIT(31)
 #define UIC_PHY_ADAPTER_LAYER_ERROR_CODE_MASK          0x1F
+#define UIC_PHY_ADAPTER_LAYER_LANE_ERR_MASK            0xF
 
 /* UECDL - Host UIC Error Code Data Link Layer 3Ch */
 #define UIC_DATA_LINK_LAYER_ERROR              UFS_BIT(31)