From 20235bca1ccee00b02cc471e6235bd6877d97de2 Mon Sep 17 00:00:00 2001 From: Can Guo Date: Sat, 13 Jun 2020 09:51:18 +0800 Subject: [PATCH] scsi: ufs: Dump PA_VS_STATUS_REG1 in eh Dump PA_VS_STATUS_REG1 when full reset is needed in eh, which is helpful for error debugging. Change-Id: Iad3c2fc09c88598428762b5da09e13b46493fc7d Signed-off-by: Can Guo --- drivers/scsi/ufs/ufs-qcom.h | 1 + drivers/scsi/ufs/ufshcd.c | 19 ++++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/drivers/scsi/ufs/ufs-qcom.h b/drivers/scsi/ufs/ufs-qcom.h index f021ce432156..31167384a21a 100644 --- a/drivers/scsi/ufs/ufs-qcom.h +++ b/drivers/scsi/ufs/ufs-qcom.h @@ -164,6 +164,7 @@ enum ufs_qcom_phy_init_type { UFS_QCOM_DBG_PRINT_TEST_BUS_EN) /* QUniPro Vendor specific attributes */ +#define PA_VS_STATUS_REG1 0x9001 #define PA_VS_CONFIG_REG1 0x9000 #define SAVECONFIGTIME_MODE_MASK 0x6000 #define DME_VS_CORE_CLK_CTRL 0xD002 diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index c46df30e8548..eb08df26655b 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -51,6 +51,7 @@ #include "ufs-sysfs.h" #include "ufs_bsg.h" #include "ufshcd-crypto.h" +#include "ufs-qcom.h" #define CREATE_TRACE_POINTS #include @@ -5737,17 +5738,25 @@ static void ufshcd_err_handler(struct work_struct *work) goto skip_err_handling; } - spin_unlock_irqrestore(hba->host->host_lock, flags); - ufshcd_vops_dbg_register_dump(hba); - spin_lock_irqsave(hba->host->host_lock, flags); - if ((hba->saved_err & INT_FATAL_ERRORS) || (hba->saved_err & UFSHCD_UIC_HIBERN8_MASK) || ((hba->saved_err & UIC_ERROR) && (hba->saved_uic_err & (UFSHCD_UIC_DL_PA_INIT_ERROR | UFSHCD_UIC_DL_NAC_RECEIVED_ERROR | - UFSHCD_UIC_DL_TCx_REPLAY_ERROR)))) + UFSHCD_UIC_DL_TCx_REPLAY_ERROR)))) { + u32 pa_vs_status_reg1 = 0; + int ret; + + spin_unlock_irqrestore(hba->host->host_lock, flags); + ret = ufshcd_dme_get(hba, UIC_ARG_MIB(PA_VS_STATUS_REG1), + &pa_vs_status_reg1); + dev_err(hba->dev, "%s: pa_vs_status_reg1 0x%x, ret %d\n", + __func__, pa_vs_status_reg1, ret); + ufshcd_vops_dbg_register_dump(hba); + spin_lock_irqsave(hba->host->host_lock, flags); + needs_reset = true; + } /* * if host reset is required then skip clearing the pending