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

Commit 59c76b36 authored by Nitin Rawat's avatar Nitin Rawat Committed by Asutosh Das
Browse files

scsi: ufs: Resume ufs host before accessing ufs device



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()
to those paths where query commands are sent.

Change-Id: Ieb924efd3159c7422e50bb69ecf70b369ec72d89
Signed-off-by: default avatarNitin Rawat <nitirawa@codeaurora.org>
Signed-off-by: default avatarAsutosh Das <asutoshd@codeaurora.org>
parent f5e30025
Loading
Loading
Loading
Loading
+24 −6
Original line number Diff line number Diff line
@@ -210,8 +210,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) {
@@ -558,6 +561,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);				\
@@ -574,6 +578,7 @@ static ssize_t _name##_show(struct device *dev, \
		goto out;						\
	ret = snprintf(buf, PAGE_SIZE, "%s\n", desc_buf);		\
out:									\
	pm_runtime_put_sync(hba->dev);					\
	kfree(desc_buf);						\
	return ret;							\
}									\
@@ -604,9 +609,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");		\
}									\
@@ -644,8 +653,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);				\
}									\
@@ -766,10 +779,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);