Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 66ad6f80 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge changes Icfcca65c,I6fb7fed8,I586a9f8c into msm-4.14

* changes:
  scsi: ufs: add link lost error status detection
  scsi: ufs: add support for logging custom events
  scsi: ufs: print TSTBUS_UTP_HCI testbus data
parents 1ae3062f 859cf5b9
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -2633,6 +2633,27 @@ static void ufs_qcom_print_unipro_testbus(struct ufs_hba *hba)
	kfree(testbus);
}

static void ufs_qcom_print_utp_hci_testbus(struct ufs_hba *hba)
{
	struct ufs_qcom_host *host = ufshcd_get_variant(hba);
	u32 *testbus = NULL;
	int i, nminor = 32, testbus_len = nminor * sizeof(u32);

	testbus = kmalloc(testbus_len, GFP_KERNEL);
	if (!testbus)
		return;

	host->testbus.select_major = TSTBUS_UTP_HCI;
	for (i = 0; i <= nminor; i++) {
		host->testbus.select_minor = i;
		ufs_qcom_testbus_config(host);
		testbus[i] = ufshcd_readl(hba, UFS_TEST_BUS);
	}
	print_hex_dump(KERN_ERR, "UTP_HCI_TEST_BUS ", DUMP_PREFIX_OFFSET,
			16, 4, testbus, testbus_len, false);
	kfree(testbus);
}

static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba, bool no_sleep)
{
	struct ufs_qcom_host *host = ufshcd_get_variant(hba);
@@ -2651,6 +2672,8 @@ static void ufs_qcom_dump_dbg_regs(struct ufs_hba *hba, bool no_sleep)
	usleep_range(1000, 1100);
	ufs_qcom_print_unipro_testbus(hba);
	usleep_range(1000, 1100);
	ufs_qcom_print_utp_hci_testbus(hba);
	usleep_range(1000, 1100);
	ufs_qcom_phy_dbg_register_dump(phy);
	usleep_range(1000, 1100);
	ufs_qcom_ice_print_regs(host);
+24 −2
Original line number Diff line number Diff line
@@ -651,6 +651,11 @@ static void ufshcd_dme_cmd_log(struct ufs_hba *hba, char *str, u8 cmd_id)
	ufshcd_cmd_log(hba, str, "dme", 0, cmd_id, 0);
}

static void ufshcd_custom_cmd_log(struct ufs_hba *hba, char *str)
{
	ufshcd_cmd_log(hba, str, "custom", 0, 0, 0);
}

static void ufshcd_print_cmd_log(struct ufs_hba *hba)
{
	int i;
@@ -701,6 +706,10 @@ static void ufshcd_dme_cmd_log(struct ufs_hba *hba, char *str, u8 cmd_id)
{
}

static void ufshcd_custom_cmd_log(struct ufs_hba *hba, char *str)
{
}

static void ufshcd_print_cmd_log(struct ufs_hba *hba)
{
}
@@ -1684,11 +1693,14 @@ static int ufshcd_devfreq_scale(struct ufs_hba *hba, bool scale_up)
	if (ret)
		goto out;

	ufshcd_custom_cmd_log(hba, "waited-for-DB-clear");

	/* scale down the gear before scaling down clocks */
	if (!scale_up) {
		ret = ufshcd_scale_gear(hba, false);
		if (ret)
			goto clk_scaling_unprepare;
		ufshcd_custom_cmd_log(hba, "Gear-scaled-down");
	}

	/*
@@ -1701,17 +1713,20 @@ static int ufshcd_devfreq_scale(struct ufs_hba *hba, bool scale_up)
		if (ret)
			/* link will be bad state so no need to scale_up_gear */
			return ret;
		ufshcd_custom_cmd_log(hba, "Hibern8-entered");
	}

	ret = ufshcd_scale_clks(hba, scale_up);
	if (ret)
		goto scale_up_gear;
	ufshcd_custom_cmd_log(hba, "Clk-freq-switched");

	if (ufshcd_is_auto_hibern8_supported(hba)) {
		ret = ufshcd_uic_hibern8_exit(hba);
		if (ret)
			/* link will be bad state so no need to scale_up_gear */
			return ret;
		ufshcd_custom_cmd_log(hba, "Hibern8-Exited");
	}

	/* scale up the gear after scaling up clocks */
@@ -1721,6 +1736,7 @@ static int ufshcd_devfreq_scale(struct ufs_hba *hba, bool scale_up)
			ufshcd_scale_clks(hba, false);
			goto clk_scaling_unprepare;
		}
		ufshcd_custom_cmd_log(hba, "Gear-scaled-up");
	}

	if (!ret) {
@@ -6861,7 +6877,7 @@ static void ufshcd_err_handler(struct work_struct *work)
	 * Dump controller state before resetting. Transfer requests state
	 * will be dump as part of the request completion.
	 */
	if ((hba->saved_err & (INT_FATAL_ERRORS | UIC_ERROR)) ||
	if ((hba->saved_err & (INT_FATAL_ERRORS | UIC_ERROR | UIC_LINK_LOST)) ||
	    hba->auto_h8_err) {
		dev_err(hba->dev, "%s: saved_err 0x%x saved_uic_err 0x%x",
			__func__, hba->saved_err, hba->saved_uic_err);
@@ -6878,7 +6894,7 @@ static void ufshcd_err_handler(struct work_struct *work)
		hba->auto_h8_err = false;
	}

	if ((hba->saved_err & INT_FATAL_ERRORS)
	if ((hba->saved_err & (INT_FATAL_ERRORS | UIC_LINK_LOST))
	    || hba->saved_ce_err || hba->force_host_reset ||
	    ((hba->saved_err & UIC_ERROR) &&
	    (hba->saved_uic_err & (UFSHCD_UIC_DL_PA_INIT_ERROR |
@@ -7157,6 +7173,12 @@ static irqreturn_t ufshcd_check_errors(struct ufs_hba *hba)
	if (hba->errors & INT_FATAL_ERRORS || hba->ce_error)
		queue_eh_work = true;

	if (hba->errors & UIC_LINK_LOST) {
		dev_err(hba->dev, "%s: UIC_LINK_LOST received, errors 0x%x\n",
					__func__, hba->errors);
		queue_eh_work = true;
	}

	if (hba->errors & UIC_ERROR) {
		hba->uic_error = 0;
		retval = ufshcd_update_uic_error(hba);
+1 −1
Original line number Diff line number Diff line
@@ -155,7 +155,7 @@ enum {

#define UFSHCD_UIC_MASK		(UIC_COMMAND_COMPL | UFSHCD_UIC_PWR_MASK)

#define UFSHCD_ERROR_MASK	(UIC_ERROR |\
#define UFSHCD_ERROR_MASK	(UIC_ERROR | UIC_LINK_LOST |\
				DEVICE_FATAL_ERROR |\
				CONTROLLER_FATAL_ERROR |\
				SYSTEM_BUS_FATAL_ERROR |\