scsi: ufs: Resume ufs host before accessing ufs device
authorNitin Rawat <nitirawa@codeaurora.org>
Tue, 24 Mar 2020 21:48:21 +0000 (14:48 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 27 Mar 2020 02:11:01 +0000 (22:11 -0400)
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.org
Reviewed-by: Avri Altman <avri.altman@wdc.com>
Signed-off-by: Nitin Rawat <nitirawa@codeaurora.org>
Signed-off-by: Asutosh Das <asutoshd@codeaurora.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/ufs/ufs-sysfs.c

index dbdf8b0..92a63ee 100644 (file)
@@ -210,8 +210,10 @@ 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 +560,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 +577,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 +608,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 +652,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,9 +778,13 @@ 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);
 }