summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYaniv Gardi <ygardi@codeaurora.org>2013-12-22 21:07:09 +0200
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-22 10:56:23 -0700
commitc6aef9984dc4e57ca0f61f70604fa658361792ed (patch)
tree15a276f47038cfa4f06afc79e8b1cafa9cdeac47
parent0a33bca1b1da9c37c1e7bcf209a1452649594c1a (diff)
scsi: ufs: save and print current power info in the driver
There is no way to know the current working power info of the driver, so in this patch, we save the power parameters, and we print them to console. This printing is necessary, since in case of crash, we can use those logs to debug and investigate. Change-Id: If0dc7a695c9b14a369e033e4c31787dcc2254ac3 Signed-off-by: Yaniv Gardi <ygardi@codeaurora.org> [subhashj@codeaurora.org: resolved merge conflicts] Signed-off-by: Subhash Jadavani <subhashj@codeaurora.org>
-rw-r--r--drivers/scsi/ufs/ufshcd.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 0ab04e2c1e66..81fa403d0d02 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -2179,6 +2179,32 @@ out:
return -ENOMEM;
}
+ /**
+ * ufshcd_print_pwr_info - print power params as saved in hba
+ * power info
+ * @hba: per-adapter instance
+ */
+static void ufshcd_print_pwr_info(struct ufs_hba *hba)
+{
+ char *names[] = {
+ "INVALID MODE",
+ "FAST MODE",
+ "SLOW_MODE",
+ "INVALID MODE",
+ "FASTAUTO_MODE",
+ "SLOWAUTO_MODE",
+ "INVALID MODE",
+ };
+
+ dev_info(hba->dev, "%s:[RX, TX]: gear=[%d, %d], lane[%d, %d], pwr[%s, %s], rate = %d\n",
+ __func__,
+ hba->pwr_info.gear_rx, hba->pwr_info.gear_tx,
+ hba->pwr_info.lane_rx, hba->pwr_info.lane_tx,
+ names[hba->pwr_info.pwr_rx],
+ names[hba->pwr_info.pwr_tx],
+ hba->pwr_info.hs_rate);
+}
+
/**
* ufshcd_host_memory_configure - configure local reference block with
* memory offsets
@@ -2693,6 +2719,8 @@ static int ufshcd_change_power_mode(struct ufs_hba *hba,
sizeof(struct ufs_pa_layer_attr));
}
+ ufshcd_print_pwr_info(hba);
+
return ret;
}
@@ -3841,6 +3869,7 @@ static void ufshcd_check_errors(struct ufs_hba *hba)
SYSTEM_BUS_FATAL_ERROR);
ufshcd_print_host_regs(hba);
+ ufshcd_print_pwr_info(hba);
ufshcd_print_tmrs(hba, hba->outstanding_tasks);
ufshcd_print_trs(hba, hba->outstanding_reqs,
pr_prdt);
@@ -4119,6 +4148,7 @@ static int ufshcd_abort(struct scsi_cmnd *cmd)
dev_err(hba->dev, "%s: Device abort task at tag %d", __func__, tag);
scsi_print_command(cmd);
ufshcd_print_host_regs(hba);
+ ufshcd_print_pwr_info(hba);
ufshcd_print_trs(hba, 1 << tag, true);
lrbp = &hba->lrb[tag];
@@ -4538,6 +4568,7 @@ static int ufshcd_probe_hba(struct ufs_hba *hba)
goto out;
ufshcd_init_pwr_info(hba);
+ ufshcd_print_pwr_info(hba);
/* UniPro link is active now */
ufshcd_set_link_active(hba);