UFS string descriptors are UTF-16 big-endian (JESD220), but
ufshcd_read_string_desc() fed the raw bytes to utf16_to_utf8(), which reads
host-endian code units, leaving dev_desc->model blank. Byte-swap to host
order before decoding, matching the kernel.

Signed-off-by: Jorge Ramirez-Ortiz <[email protected]>
---
 drivers/ufs/ufs-uclass.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/drivers/ufs/ufs-uclass.c b/drivers/ufs/ufs-uclass.c
index 6a51f337e47..8f120fbbee8 100644
--- a/drivers/ufs/ufs-uclass.c
+++ b/drivers/ufs/ufs-uclass.c
@@ -1533,6 +1533,19 @@ static inline void ufshcd_remove_non_printable(uint8_t 
*val)
                *val = ' ';
 }
 
+static inline void ufshcd_str_desc_to_cpu(u8 *desc, u32 size)
+{
+       u16 *p = (u16 *)&desc[QUERY_DESC_HDR_SIZE];
+       u32 len = desc[QUERY_DESC_LENGTH_OFFSET];
+       u32 i;
+
+       if (len > size)
+               len = size;
+
+       for (i = QUERY_DESC_HDR_SIZE; i + 1 < len; i += 2, p++)
+               *p = be16_to_cpu(*p);
+}
+
 /**
  * ufshcd_uic_pwr_ctrl - executes UIC commands (which affects the link power
  * state) and waits for it to take effect.
@@ -1765,6 +1778,8 @@ static int ufshcd_read_string_desc(struct ufs_hba *hba, 
int desc_index,
                        goto out;
                }
 
+               ufshcd_str_desc_to_cpu(buf, size);
+
                /*
                 * the descriptor contains string in UTF16 format
                 * we need to convert to utf-8 so it can be displayed
-- 
2.54.0

Reply via email to