From 59c76b364878f4dc733938269f627e99adab24be Mon Sep 17 00:00:00 2001 From: Nitin Rawat Date: Thu, 7 Nov 2019 22:07:14 +0530 Subject: [PATCH 1/2] 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: Nitin Rawat Signed-off-by: Asutosh Das --- drivers/scsi/ufs/ufs-sysfs.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/drivers/scsi/ufs/ufs-sysfs.c b/drivers/scsi/ufs/ufs-sysfs.c index 720be3f64be7..1480a52af2c9 100644 --- a/drivers/scsi/ufs/ufs-sysfs.c +++ b/drivers/scsi/ufs/ufs-sysfs.c @@ -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); From 9c0dff45b9f167049957e83e262b12c51db7af0d Mon Sep 17 00:00:00 2001 From: Asutosh Das Date: Mon, 23 Mar 2020 14:54:57 -0700 Subject: [PATCH 2/2] scsi: ufshcd-qti: Invoke sysfs node creation Creates host specific sysfs nodes for UFS. Change-Id: I8a2023aa9164216de7ba720fe469a73899c448d0 Signed-off-by: Asutosh Das --- drivers/scsi/ufs/ufshcd-qti.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/scsi/ufs/ufshcd-qti.c b/drivers/scsi/ufs/ufshcd-qti.c index 1bcd6992f890..327e9ae52a5c 100644 --- a/drivers/scsi/ufs/ufshcd-qti.c +++ b/drivers/scsi/ufs/ufshcd-qti.c @@ -9999,6 +9999,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq) async_schedule(ufshcd_async_scan, hba); + ufs_sysfs_add_nodes(hba->dev); return 0;