Skip to content

Commit

Permalink
scsi: ufs: Do not rely on prefetched data
Browse files Browse the repository at this point in the history
We were setting bActiveICCLevel attribute for UFS device only once but the
type of this attribute has changed from persistent to volatile since UFS
device specification v2.1. This attribute is set to the default value after
power cycle or hardware reset event. It isn't safe to rely on prefetched
data (only used for bActiveICCLevel attribute now). Hence this change
removes the code related to data prefetching and set this parameter on
every attempt to probe the UFS device.

Tested-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Can Guo <cang@codeaurora.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Can Guo authored and Martin K. Petersen committed Mar 27, 2020
1 parent ccfa00a commit e89860f
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 22 deletions.
26 changes: 15 additions & 11 deletions drivers/scsi/ufs/ufshcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -6475,11 +6475,12 @@ static u32 ufshcd_find_max_sup_active_icc_level(struct ufs_hba *hba,
return icc_level;
}

static void ufshcd_init_icc_levels(struct ufs_hba *hba)
static void ufshcd_set_active_icc_lvl(struct ufs_hba *hba)
{
int ret;
int buff_len = hba->desc_size.pwr_desc;
u8 *desc_buf;
u32 icc_level;

desc_buf = kmalloc(buff_len, GFP_KERNEL);
if (!desc_buf)
Expand All @@ -6494,20 +6495,17 @@ static void ufshcd_init_icc_levels(struct ufs_hba *hba)
goto out;
}

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);

out:
kfree(desc_buf);
Expand Down Expand Up @@ -7027,8 +7025,6 @@ static int ufshcd_add_lus(struct ufs_hba *hba)
{
int ret;

ufshcd_init_icc_levels(hba);

/* Add required well known logical units to scsi mid layer */
ret = ufshcd_scsi_add_wlus(hba);
if (ret)
Expand Down Expand Up @@ -7126,6 +7122,14 @@ static int ufshcd_probe_hba(struct ufs_hba *hba, bool async)
}
}

/*
* bActiveICCLevel is volatile for UFS device (as per latest v2.1 spec)
* and for removable UFS card as well, hence always set the parameter.
* Note: Error handler may issue the device reset hence resetting
* bActiveICCLevel as well so it is always safe to set this here.
*/
ufshcd_set_active_icc_lvl(hba);

/* set the state as operational after switching to desired gear */
hba->ufshcd_state = UFSHCD_STATE_OPERATIONAL;

Expand Down
11 changes: 0 additions & 11 deletions drivers/scsi/ufs/ufshcd.h
Original file line number Diff line number Diff line change
Expand Up @@ -408,15 +408,6 @@ struct ufs_clk_scaling {
bool is_suspended;
};

/**
* 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 UFS_ERR_REG_HIST_LENGTH 8
/**
* struct ufs_err_reg_hist - keeps history of errors
Expand Down Expand Up @@ -585,7 +576,6 @@ enum ufshcd_caps {
* @intr_mask: Interrupt Mask Bits
* @ee_ctrl_mask: Exception event control mask
* @is_powered: flag to check if HBA is powered
* @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
Expand Down Expand Up @@ -674,7 +664,6 @@ struct ufs_hba {
u16 ee_ctrl_mask;
u16 hba_enable_delay_us;
bool is_powered;
struct ufs_init_prefetch init_prefetch_data;

/* Work Queues */
struct work_struct eh_work;
Expand Down

0 comments on commit e89860f

Please sign in to comment.