From: Petr Hodina <[email protected]>

Extend ufs_get_device_desc() to also fetch the device's product revision
string (PRDCT_REV) and the UFS spec version (SPEC_VER) into struct
ufs_dev_desc.

Signed-off-by: Petr Hodina <[email protected]>
---
 drivers/ufs/ufs-uclass.c | 24 ++++++++++++++++++++++++
 drivers/ufs/ufs.h        |  5 +++++
 2 files changed, 29 insertions(+)

diff --git a/drivers/ufs/ufs-uclass.c b/drivers/ufs/ufs-uclass.c
index 6a51f337e47..56118a0ee46 100644
--- a/drivers/ufs/ufs-uclass.c
+++ b/drivers/ufs/ufs-uclass.c
@@ -1792,6 +1792,7 @@ static int ufs_get_device_desc(struct ufs_hba *hba,
        int err;
        size_t buff_len;
        u8 model_index;
+       u8 revision_index;
        u8 *desc_buf;
 
        buff_len = max_t(size_t, hba->desc_size.dev_desc,
@@ -1816,7 +1817,11 @@ static int ufs_get_device_desc(struct ufs_hba *hba,
        dev_desc->wmanufacturerid = desc_buf[DEVICE_DESC_PARAM_MANF_ID] << 8 |
                                     desc_buf[DEVICE_DESC_PARAM_MANF_ID + 1];
 
+       dev_desc->wspecversion = desc_buf[DEVICE_DESC_PARAM_SPEC_VER] << 8 |
+                                 desc_buf[DEVICE_DESC_PARAM_SPEC_VER + 1];
+
        model_index = desc_buf[DEVICE_DESC_PARAM_PRDCT_NAME];
+       revision_index = desc_buf[DEVICE_DESC_PARAM_PRDCT_REV];
 
        /* Zero-pad entire buffer for string termination. */
        memset(desc_buf, 0, buff_len);
@@ -1837,6 +1842,25 @@ static int ufs_get_device_desc(struct ufs_hba *hba,
        /* Null terminate the model string */
        dev_desc->model[MAX_MODEL_LEN] = '\0';
 
+       /* Zero-pad entire buffer for string termination. */
+       memset(desc_buf, 0, buff_len);
+
+       err = ufshcd_read_string_desc(hba, revision_index, desc_buf,
+                                     QUERY_DESC_MAX_SIZE, true/*ASCII*/);
+       if (err) {
+               dev_err(hba->dev, "%s: Failed reading Product Revision. err = 
%d\n",
+                       __func__, err);
+               goto out;
+       }
+
+       desc_buf[QUERY_DESC_MAX_SIZE] = '\0';
+       strlcpy(dev_desc->revision, (char *)(desc_buf + QUERY_DESC_HDR_SIZE),
+               min_t(u8, desc_buf[QUERY_DESC_LENGTH_OFFSET],
+                     MAX_REVISION_LEN));
+
+       /* Null terminate the revision string */
+       dev_desc->revision[MAX_REVISION_LEN] = '\0';
+
 out:
        kfree(desc_buf);
        return err;
diff --git a/drivers/ufs/ufs.h b/drivers/ufs/ufs.h
index 0f6c93fbce7..e3368a516e4 100644
--- a/drivers/ufs/ufs.h
+++ b/drivers/ufs/ufs.h
@@ -346,15 +346,20 @@ struct utp_upiu_rsp {
 };
 
 #define MAX_MODEL_LEN 16
+#define MAX_REVISION_LEN 4
 /**
  * ufs_dev_desc - ufs device details from the device descriptor
  *
  * @wmanufacturerid: card details
+ * @wspecversion: UFS spec version supported by the device
  * @model: card model
+ * @revision: card fw revision
  */
 struct ufs_dev_desc {
        u16 wmanufacturerid;
+       u16 wspecversion;
        char model[MAX_MODEL_LEN + 1];
+       char revision[MAX_REVISION_LEN + 1];
 };
 
 /* Device descriptor parameters offsets in bytes*/

-- 
2.55.0


Reply via email to