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
