Commit 0c2039dc authored by Nitin Rawat's avatar Nitin Rawat Committed by Martin K. Petersen

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.

Link: https://lore.kernel.org/r/f712a4f7bdb0ae32e0d83634731e7aaa1b3a6cdd.1585009663.git.asutoshd@codeaurora.orgReviewed-by: default avatarAvri Altman <avri.altman@wdc.com>
Signed-off-by: default avatarNitin Rawat <nitirawa@codeaurora.org>
Signed-off-by: default avatarAsutosh Das <asutoshd@codeaurora.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 73e990b4
...@@ -210,8 +210,10 @@ static ssize_t ufs_sysfs_read_desc_param(struct ufs_hba *hba, ...@@ -210,8 +210,10 @@ static ssize_t ufs_sysfs_read_desc_param(struct ufs_hba *hba,
if (param_size > 8) if (param_size > 8)
return -EINVAL; return -EINVAL;
pm_runtime_get_sync(hba->dev);
ret = ufshcd_read_desc_param(hba, desc_id, desc_index, ret = ufshcd_read_desc_param(hba, desc_id, desc_index,
param_offset, desc_buf, param_size); param_offset, desc_buf, param_size);
pm_runtime_put_sync(hba->dev);
if (ret) if (ret)
return -EINVAL; return -EINVAL;
switch (param_size) { switch (param_size) {
...@@ -558,6 +560,7 @@ static ssize_t _name##_show(struct device *dev, \ ...@@ -558,6 +560,7 @@ static ssize_t _name##_show(struct device *dev, \
desc_buf = kzalloc(QUERY_DESC_MAX_SIZE, GFP_ATOMIC); \ desc_buf = kzalloc(QUERY_DESC_MAX_SIZE, GFP_ATOMIC); \
if (!desc_buf) \ if (!desc_buf) \
return -ENOMEM; \ return -ENOMEM; \
pm_runtime_get_sync(hba->dev); \
ret = ufshcd_query_descriptor_retry(hba, \ ret = ufshcd_query_descriptor_retry(hba, \
UPIU_QUERY_OPCODE_READ_DESC, QUERY_DESC_IDN_DEVICE, \ UPIU_QUERY_OPCODE_READ_DESC, QUERY_DESC_IDN_DEVICE, \
0, 0, desc_buf, &desc_len); \ 0, 0, desc_buf, &desc_len); \
...@@ -574,6 +577,7 @@ static ssize_t _name##_show(struct device *dev, \ ...@@ -574,6 +577,7 @@ static ssize_t _name##_show(struct device *dev, \
goto out; \ goto out; \
ret = snprintf(buf, PAGE_SIZE, "%s\n", desc_buf); \ ret = snprintf(buf, PAGE_SIZE, "%s\n", desc_buf); \
out: \ out: \
pm_runtime_put_sync(hba->dev); \
kfree(desc_buf); \ kfree(desc_buf); \
return ret; \ return ret; \
} \ } \
...@@ -604,9 +608,13 @@ static ssize_t _name##_show(struct device *dev, \ ...@@ -604,9 +608,13 @@ static ssize_t _name##_show(struct device *dev, \
struct device_attribute *attr, char *buf) \ struct device_attribute *attr, char *buf) \
{ \ { \
bool flag; \ bool flag; \
int ret; \
struct ufs_hba *hba = dev_get_drvdata(dev); \ struct ufs_hba *hba = dev_get_drvdata(dev); \
if (ufshcd_query_flag(hba, UPIU_QUERY_OPCODE_READ_FLAG, \ pm_runtime_get_sync(hba->dev); \
QUERY_FLAG_IDN##_uname, &flag)) \ 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 -EINVAL; \
return sprintf(buf, "%s\n", flag ? "true" : "false"); \ return sprintf(buf, "%s\n", flag ? "true" : "false"); \
} \ } \
...@@ -644,8 +652,12 @@ static ssize_t _name##_show(struct device *dev, \ ...@@ -644,8 +652,12 @@ static ssize_t _name##_show(struct device *dev, \
{ \ { \
struct ufs_hba *hba = dev_get_drvdata(dev); \ struct ufs_hba *hba = dev_get_drvdata(dev); \
u32 value; \ u32 value; \
if (ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, \ int ret; \
QUERY_ATTR_IDN##_uname, 0, 0, &value)) \ 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 -EINVAL; \
return sprintf(buf, "0x%08X\n", value); \ return sprintf(buf, "0x%08X\n", value); \
} \ } \
...@@ -766,9 +778,13 @@ static ssize_t dyn_cap_needed_attribute_show(struct device *dev, ...@@ -766,9 +778,13 @@ static ssize_t dyn_cap_needed_attribute_show(struct device *dev,
struct scsi_device *sdev = to_scsi_device(dev); struct scsi_device *sdev = to_scsi_device(dev);
struct ufs_hba *hba = shost_priv(sdev->host); struct ufs_hba *hba = shost_priv(sdev->host);
u8 lun = ufshcd_scsi_to_upiu_lun(sdev->lun); u8 lun = ufshcd_scsi_to_upiu_lun(sdev->lun);
int ret;
if (ufshcd_query_attr(hba, UPIU_QUERY_OPCODE_READ_ATTR, pm_runtime_get_sync(hba->dev);
QUERY_ATTR_IDN_DYN_CAP_NEEDED, lun, 0, &value)) 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 -EINVAL;
return sprintf(buf, "0x%08X\n", value); return sprintf(buf, "0x%08X\n", value);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment