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

Commit 35732e52 authored by Subhash Jadavani's avatar Subhash Jadavani
Browse files

scsi: ufs: don't rely on prefetched data



We were setting bActiveICCLevel attribute for UFS device only once but
type of this attribute has changed from persistent to volatile in latest
UFS device specification (v2.1). Also, UFS card specification marks this
attribute as volatile.
This means it isn't safe to rely on prefetched data (only used for
bActiveICCLevel attribute now) for both embedded & removable UFS devices
hence this change removes the code related to data prefetching.

Change-Id: I12df04d8781ede22e583db7b820753e97ee9503c
Signed-off-by: default avatarSubhash Jadavani <subhashj@codeaurora.org>
parent 5c9280cd
Loading
Loading
Loading
Loading
+7 −14
Original line number Diff line number Diff line
@@ -6541,6 +6541,7 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba)
	int ret;
	int buff_len = QUERY_DESC_POWER_MAX_SIZE;
	u8 desc_buf[QUERY_DESC_POWER_MAX_SIZE];
	u32 icc_level;

	ret = ufshcd_read_power_desc(hba, desc_buf, buff_len);
	if (ret) {
@@ -6550,21 +6551,17 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba)
		return;
	}

	hba->init_prefetch_data.icc_level =
			ufshcd_find_max_sup_active_icc_level(hba,
			desc_buf, buff_len);
	dev_dbg(hba->dev, "%s: setting icc_level 0x%x",
			__func__, hba->init_prefetch_data.icc_level);
	icc_level = ufshcd_find_max_sup_active_icc_level(hba, desc_buf,
							 buff_len);
	dev_dbg(hba->dev, "%s: setting icc_level 0x%x", __func__, icc_level);

	ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
		QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0,
		&hba->init_prefetch_data.icc_level);
		QUERY_ATTR_IDN_ACTIVE_ICC_LVL, 0, 0, &icc_level);

	if (ret)
		dev_err(hba->dev,
			"%s: Failed configuring bActiveICCLevel = %d ret = %d",
			__func__, hba->init_prefetch_data.icc_level , ret);

			__func__, icc_level, ret);
}

/**
@@ -6919,7 +6916,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba)
				QUERY_FLAG_IDN_PWR_ON_WPE, &flag))
			hba->dev_info.f_power_on_wp_en = flag;

		if (!hba->is_init_prefetch)
		ufshcd_init_icc_levels(hba);

		/* Add required well known logical units to scsi mid layer */
@@ -6940,9 +6936,6 @@ static int ufshcd_probe_hba(struct ufs_hba *hba)
		hba->clk_scaling.is_allowed = true;
	}

	if (!hba->is_init_prefetch)
		hba->is_init_prefetch = true;

out:
	/*
	 * If we failed to initialize the device or the device is not
+0 −13
Original line number Diff line number Diff line
@@ -503,15 +503,6 @@ struct ufs_clk_scaling {
	bool is_scaled_up;
};

/**
 * struct ufs_init_prefetch - contains data that is pre-fetched once during
 * initialization
 * @icc_level: icc level which was read during initialization
 */
struct ufs_init_prefetch {
	u32 icc_level;
};

#define UIC_ERR_REG_HIST_LENGTH 8
/**
 * struct ufs_uic_err_reg_hist - keeps history of uic errors
@@ -668,8 +659,6 @@ struct ufs_stats {
 * @intr_mask: Interrupt Mask Bits
 * @ee_ctrl_mask: Exception event control mask
 * @is_powered: flag to check if HBA is powered
 * @is_init_prefetch: flag to check if data was pre-fetched in initialization
 * @init_prefetch_data: data pre-fetched during initialization
 * @eh_work: Worker to handle UFS errors that require s/w attention
 * @eeh_work: Worker to handle exception events
 * @errors: HBA errors
@@ -800,8 +789,6 @@ struct ufs_hba {
	u32 intr_mask;
	u16 ee_ctrl_mask;
	bool is_powered;
	bool is_init_prefetch;
	struct ufs_init_prefetch init_prefetch_data;

	/* Work Queues */
	struct work_struct eh_work;