All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arthur Simchaev <Arthur.Simchaev@sandisk.com>
To: "James E . J . Bottomley" <jejb@linux.vnet.ibm.com>,
	"Martin K . Petersen" <martin.petersen@oracle.com>,
	linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org
Cc: alim.akhtar@samsung.com, Bean Huo <beanhuo@micron.com>,
	Arthur Simchaev <arthur.simchaev@wdc.com>,
	Arthur Simchaev <Arthur.Simchaev@sandisk.com>
Subject: [PATCH] scsi: ufs: sysfs: add is_ascii_output entry
Date: Wed, 10 Feb 2021 12:53:45 +0200	[thread overview]
Message-ID: <1612954425-6705-1-git-send-email-Arthur.Simchaev@sandisk.com> (raw)

From: Arthur Simchaev <arthur.simchaev@wdc.com>

Currently the string descriptors sysfs entries are printing in ascii
format. According to Jedec UFS spec the string descriptors data is
Unicode and may not be ascii convertible. Therefore in case the device
string descriptor contains non ascii convertible characters, it will
produce a wrong output. In order to fix this issue, the new
"is_ascii_output" entry will be added to string descriptor's sysfs
directory. According to the entry value, the user will receive the
string descriptor output in raw or ascii data

Signed-off-by: Arthur Simchaev <Arthur.Simchaev@sandisk.com>
---
 Documentation/ABI/testing/sysfs-driver-ufs |  9 +++++++++
 drivers/scsi/ufs/ufs-sysfs.c               | 32 ++++++++++++++++++++++++++++--
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/Documentation/ABI/testing/sysfs-driver-ufs b/Documentation/ABI/testing/sysfs-driver-ufs
index d1bc23c..c7d8d8d 100644
--- a/Documentation/ABI/testing/sysfs-driver-ufs
+++ b/Documentation/ABI/testing/sysfs-driver-ufs
@@ -561,6 +561,15 @@ Description:	This file contains a product revision string. The full
 
 		The file is read only.
 
+What:		/sys/bus/platform/drivers/ufshcd/*/string_descriptors/is_ascii_output
+Date:		February 2021
+Contact:	Arthur Simchaev <arthur.simchaev@wdc.com>
+Description:	This entry could be used to set the string descriptor
+		output format:
+		0 will print raw string descriptor data as defined in
+		UFS JEDEC spec.
+		1 will convert the string descriptor data to ascii string
+		and print it.
 
 What:		/sys/class/scsi_device/*/device/unit_descriptor/boot_lun_id
 Date:		February 2018
diff --git a/drivers/scsi/ufs/ufs-sysfs.c b/drivers/scsi/ufs/ufs-sysfs.c
index acc54f5..83c8104 100644
--- a/drivers/scsi/ufs/ufs-sysfs.c
+++ b/drivers/scsi/ufs/ufs-sysfs.c
@@ -9,6 +9,8 @@
 #include "ufs.h"
 #include "ufs-sysfs.h"
 
+static bool is_ascii_output = true;
+
 static const char *ufschd_uic_link_state_to_string(
 			enum uic_link_state state)
 {
@@ -693,7 +695,15 @@ static ssize_t _name##_show(struct device *dev,				\
 				      SD_ASCII_STD);			\
 	if (ret < 0)							\
 		goto out;						\
-	ret = sysfs_emit(buf, "%s\n", desc_buf);			\
+	if (is_ascii_output) {						\
+		ret = sysfs_emit(buf, "%s\n", desc_buf);		\
+	} else {							\
+		int i;							\
+									\
+		for (i = 0; i < desc_buf[0]; i++)			\
+			hex_byte_pack(buf + i * 2, desc_buf[i]);	\
+		ret = sysfs_emit(buf, "%s\n", buf);			\
+	}								\
 out:									\
 	pm_runtime_put_sync(hba->dev);					\
 	kfree(desc_buf);						\
@@ -708,13 +718,31 @@ UFS_STRING_DESCRIPTOR(oem_id, _OEM_ID);
 UFS_STRING_DESCRIPTOR(serial_number, _SN);
 UFS_STRING_DESCRIPTOR(product_revision, _PRDCT_REV);
 
+static ssize_t is_ascii_output_show(struct device *dev,
+				    struct device_attribute *attr, char *buf)
+{
+	return scnprintf(buf, PAGE_SIZE, "%d\n", is_ascii_output);
+}
+
+static ssize_t is_ascii_output_store(struct device *dev,
+				     struct device_attribute *attr,
+				     const char *buf, size_t count)
+{
+	if (kstrtobool(buf, &is_ascii_output))
+		return -EINVAL;
+	return count;
+}
+
+static DEVICE_ATTR_RW(is_ascii_output);
+
 static struct attribute *ufs_sysfs_string_descriptors[] = {
 	&dev_attr_manufacturer_name.attr,
 	&dev_attr_product_name.attr,
 	&dev_attr_oem_id.attr,
 	&dev_attr_serial_number.attr,
 	&dev_attr_product_revision.attr,
-	NULL,
+	&dev_attr_is_ascii_output.attr,
+	NULL
 };
 
 static const struct attribute_group ufs_sysfs_string_descriptors_group = {
-- 
2.7.4


             reply	other threads:[~2021-02-10 10:59 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-10 10:53 Arthur Simchaev [this message]
2021-02-11  3:35 ` [PATCH] scsi: ufs: sysfs: add is_ascii_output entry Bart Van Assche
2021-02-14  9:53   ` Greg KH
2021-02-14 14:21     ` Arthur Simchaev

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1612954425-6705-1-git-send-email-Arthur.Simchaev@sandisk.com \
    --to=arthur.simchaev@sandisk.com \
    --cc=alim.akhtar@samsung.com \
    --cc=arthur.simchaev@wdc.com \
    --cc=beanhuo@micron.com \
    --cc=jejb@linux.vnet.ibm.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=martin.petersen@oracle.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.