summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorGilad Broner <gbroner@codeaurora.org>2015-01-22 11:36:55 +0200
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 10:58:58 -0700
commitd791fc72346030f02501bddaf0723aaa1a1c9407 (patch)
tree277769ebbc6d35ee012d21617bfdbbe5ac6db2fd /drivers
parent04825be019a90563774fb922ca3f0ece1cca0d7a (diff)
scsi: ufs: add host state prints in failure cases
Whenever some UFS failure occurs the driver prints the UFS registers in order to help with analysis of the failure. However this may not be sufficient in some cases, so having the host controller state as it is represented and managed in the driver will contribute to analysis efforts. Added prints of various fields in the hba struct which may be of interest. Change-Id: I8385a6b40f6937f07d8f0f0c51f5cf36babf7515 Signed-off-by: Gilad Broner <gbroner@codeaurora.org> [subhashj@codeaurora.org: resolved merge conflicts] Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/scsi/ufs/ufshcd.c34
-rw-r--r--drivers/scsi/ufs/ufshcd.h4
2 files changed, 37 insertions, 1 deletions
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index a6812007aacb..cf5e61080c04 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -569,6 +569,36 @@ static void ufshcd_print_tmrs(struct ufs_hba *hba, unsigned long bitmap)
}
}
+static void ufshcd_print_host_state(struct ufs_hba *hba)
+{
+ if (!(hba->ufshcd_dbg_print & UFSHCD_DBG_PRINT_HOST_STATE_EN))
+ return;
+
+ dev_err(hba->dev, "UFS Host state=%d\n", hba->ufshcd_state);
+ dev_err(hba->dev, "lrb in use=0x%lx, outstanding reqs=0x%lx tasks=0x%lx\n",
+ hba->lrb_in_use, hba->outstanding_tasks, hba->outstanding_reqs);
+ dev_err(hba->dev, "saved_err=0x%x, saved_uic_err=0x%x\n",
+ hba->saved_err, hba->saved_uic_err);
+ dev_err(hba->dev, "Device power mode=%d, UIC link state=%d\n",
+ hba->curr_dev_pwr_mode, hba->uic_link_state);
+ dev_err(hba->dev, "PM in progress=%d, sys. suspended=%d\n",
+ hba->pm_op_in_progress, hba->is_sys_suspended);
+ dev_err(hba->dev, "Auto BKOPS=%d, Host self-block=%d\n",
+ hba->auto_bkops_enabled, hba->host->host_self_blocked);
+ dev_err(hba->dev, "Clk gate=%d, hibern8 on idle=%d, PM QoS=%d\n",
+ hba->clk_gating.state, hba->hibern8_on_idle.state,
+ hba->pm_qos.state);
+ dev_err(hba->dev, "Clk gate=%d, hibern8 on idle=%d, PM QoS=%d\n",
+ hba->clk_gating.state, hba->hibern8_on_idle.state,
+ hba->pm_qos.state);
+ dev_err(hba->dev, "error handling flags=0x%x, req. abort count=%d\n",
+ hba->eh_flags, hba->req_abort_count);
+ dev_err(hba->dev, "Host capabilities=0x%x, caps=0x%x\n",
+ hba->capabilities, hba->caps);
+ dev_err(hba->dev, "quirks=0x%x, dev. quirks=0x%x\n", hba->quirks,
+ hba->dev_quirks);
+}
+
/**
* ufshcd_print_pwr_info - print power params as saved in hba
* power info
@@ -4779,6 +4809,7 @@ ufshcd_transfer_rsp_status(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
"OCS error from controller = %x for tag %d\n",
ocs, lrbp->task_tag);
ufshcd_print_host_regs(hba);
+ ufshcd_print_host_state(hba);
break;
} /* end of switch */
@@ -5345,6 +5376,7 @@ static void ufshcd_err_handler(struct work_struct *work)
__func__, hba->saved_err, hba->saved_uic_err);
if (!hba->silence_err_logs) {
ufshcd_print_host_regs(hba);
+ ufshcd_print_host_state(hba);
ufshcd_print_pwr_info(hba);
ufshcd_print_tmrs(hba, hba->outstanding_tasks);
}
@@ -5891,6 +5923,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
scsi_print_command(cmd);
if (!hba->req_abort_count) {
ufshcd_print_host_regs(hba);
+ ufshcd_print_host_state(hba);
ufshcd_print_pwr_info(hba);
ufshcd_print_trs(hba, 1 << tag, true);
} else {
@@ -8604,6 +8637,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
if (err) {
dev_err(hba->dev, "Host controller enable failed\n");
ufshcd_print_host_regs(hba);
+ ufshcd_print_host_state(hba);
goto out_remove_scsi_host;
}
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h
index f1f80de78556..7bfaa234c23c 100644
--- a/drivers/scsi/ufs/ufshcd.h
+++ b/drivers/scsi/ufs/ufshcd.h
@@ -579,12 +579,14 @@ struct ufshcd_pm_qos {
#define UFSHCD_DBG_PRINT_TRS_EN UFS_BIT(3)
#define UFSHCD_DBG_PRINT_TMRS_EN UFS_BIT(4)
#define UFSHCD_DBG_PRINT_PWR_EN UFS_BIT(5)
+#define UFSHCD_DBG_PRINT_HOST_STATE_EN UFS_BIT(6)
#define UFSHCD_DBG_PRINT_ALL \
(UFSHCD_DBG_PRINT_CLK_FREQ_EN | \
UFSHCD_DBG_PRINT_UIC_ERR_HIST_EN | \
UFSHCD_DBG_PRINT_HOST_REGS_EN | UFSHCD_DBG_PRINT_TRS_EN | \
- UFSHCD_DBG_PRINT_TMRS_EN | UFSHCD_DBG_PRINT_PWR_EN)
+ UFSHCD_DBG_PRINT_TMRS_EN | UFSHCD_DBG_PRINT_PWR_EN | \
+ UFSHCD_DBG_PRINT_HOST_STATE_EN)
/**
* struct ufs_hba - per adapter private structure