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: Subhash Jadavani <subhashj@codeaurora.org>
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index f15c607..def5bda 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -6541,6 +6541,7 @@
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 @@
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,8 +6916,7 @@
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);
+ ufshcd_init_icc_levels(hba);
/* Add required well known logical units to scsi mid layer */
if (ufshcd_scsi_add_wlus(hba))
@@ -6940,9 +6936,6 @@
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