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

Commit 963ecf1f authored by Nitin Rawat's avatar Nitin Rawat
Browse files

scsi: ufs: UIC timeout while reading sysfs entry



As a part of sysfs reading of descriptors/attributes/flags, query commands
should only be executed when hba's power runtime status is active. To
guarantee this, add pm_runtime_get/put_sync() calls to those paths where
query commands are sent.

Change-Id: Ieb924efd3159c7422e50bb69ecf70b369ec72d89
Signed-off-by: default avatarNitin Rawat <nitirawa@codeaurora.org>
parent eabcd830
Loading
Loading
Loading
Loading
+24 −6
Original line number Diff line number Diff line
@@ -244,8 +244,11 @@ static ssize_t ufs_sysfs_read_desc_param(struct ufs_hba *hba,
	if (param_size > 8)
		return -EINVAL;

	pm_runtime_get_sync(hba->dev);
	ret = ufshcd_read_desc_param(hba, desc_id, desc_index,
				param_offset, desc_buf, param_size);
	pm_runtime_put_sync(hba->dev);

	if (ret)
		return -EINVAL;
	switch (param_size) {
@@ -591,6 +594,7 @@ static ssize_t _name##_show(struct device *dev, \
	desc_buf = kzalloc(QUERY_DESC_MAX_SIZE, GFP_ATOMIC);		\
	if (!desc_buf)							\
		return -ENOMEM;						\
	pm_runtime_get_sync(hba->dev);					\
	ret = ufshcd_query_descriptor_retry(hba,			\
		UPIU_QUERY_OPCODE_READ_DESC, QUERY_DESC_IDN_DEVICE,	\
		0, 0, desc_buf, &desc_len);				\
@@ -608,6 +612,7 @@ static ssize_t _name##_show(struct device *dev, \
	ret = snprintf(buf, PAGE_SIZE, "%s\n",				\
		desc_buf + QUERY_DESC_HDR_SIZE);			\
out:									\
	pm_runtime_put_sync(hba->dev);					\
	kfree(desc_buf);						\
	return ret;							\
}									\
@@ -638,9 +643,13 @@ static ssize_t _name##_show(struct device *dev, \
	struct device_attribute *attr, char *buf)			\
{									\
	bool flag;							\
	int ret;							\
	struct ufs_hba *hba = dev_get_drvdata(dev);			\
	if (ufshcd_query_flag(hba, UPIU_QUERY_OPCODE_READ_FLAG,		\
		QUERY_FLAG_IDN##_uname, &flag))				\
	pm_runtime_get_sync(hba->dev);					\
	ret = ufshcd_query_flag(hba, UPIU_QUERY_OPCODE_READ_FLAG,	\
		QUERY_FLAG_IDN##_uname, &flag);				\
	pm_runtime_put_sync(hba->dev);					\
	if (ret)							\
		return -EINVAL;						\
	return sprintf(buf, "%s\n", flag ? "true" : "false");		\
}									\
@@ -678,8 +687,12 @@ static ssize_t _name##_show(struct device *dev, \
{									\
	struct ufs_hba *hba = dev_get_drvdata(dev);			\
	u32 value;							\
	if (ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR,		\
		QUERY_ATTR_IDN##_uname, 0, 0, &value))			\
	int ret;							\
	pm_runtime_get_sync(hba->dev);					\
	ret = ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR,	\
		QUERY_ATTR_IDN##_uname, 0, 0, &value);			\
	pm_runtime_put_sync(hba->dev);					\
	if (ret)							\
		return -EINVAL;						\
	return sprintf(buf, "0x%08X\n", value);				\
}									\
@@ -800,10 +813,15 @@ static ssize_t dyn_cap_needed_attribute_show(struct device *dev,
	struct scsi_device *sdev = to_scsi_device(dev);
	struct ufs_hba *hba = shost_priv(sdev->host);
	u8 lun = ufshcd_scsi_to_upiu_lun(sdev->lun);
	int ret;

	if (ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR,
		QUERY_ATTR_IDN_DYN_CAP_NEEDED, lun, 0, &value))
	pm_runtime_get_sync(hba->dev);
	ret = ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR,
		QUERY_ATTR_IDN_DYN_CAP_NEEDED, lun, 0, &value);
	pm_runtime_put_sync(hba->dev);
	if (ret)
		return -EINVAL;

	return sprintf(buf, "0x%08X\n", value);
}
static DEVICE_ATTR_RO(dyn_cap_needed_attribute);