]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: add uuid index in get and set features command
authorGollu Appalanaidu <anaidu.gollu@samsung.com>
Sat, 15 May 2021 18:59:37 +0000 (00:29 +0530)
committerKeith Busch <kbusch@kernel.org>
Tue, 25 May 2021 13:55:15 +0000 (07:55 -0600)
Signed-off-by: Gollu Appalanaidu <anaidu.gollu@samsung.com>
18 files changed:
Documentation/nvme-get-feature.1
Documentation/nvme-get-feature.html
Documentation/nvme-get-feature.txt
Documentation/nvme-set-feature.1
Documentation/nvme-set-feature.html
Documentation/nvme-set-feature.txt
completions/_nvme
completions/bash-nvme-completion.sh
nvme-ioctl.c
nvme-ioctl.h
nvme.c
plugins/intel/intel-nvme.c
plugins/memblaze/memblaze-nvme.c
plugins/micron/micron-nvme.c
plugins/seagate/seagate-nvme.c
plugins/shannon/shannon-nvme.c
plugins/toshiba/toshiba-nvme.c
plugins/wdc/wdc-nvme.c

index 399d1d2cd6f7557fd585df37c229c68068f76d83..d7cc7265808acc19d234c93b26354502b65017d5 100644 (file)
@@ -1,13 +1,13 @@
 '\" t
 .\"     Title: nvme-get-feature
-.\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
-.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/20/2020
+.\"    Author: [FIXME: author] [see http://docbook.sf.net/el/author]
+.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
+.\"      Date: 05/16/2021
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-GET\-FEATURE" "1" "10/20/2020" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-FEATURE" "1" "05/16/2021" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -34,6 +34,7 @@ nvme-get-feature \- Gets an NVMe feature, returns applicable results
 .nf
 \fInvme get\-feature\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
                           [\-\-feature\-id=<fid> | \-f <fid>] [\-\-cdw11=<cdw11>]
+                          [\-\-uuid\-index=<uuid\-index> | \-U <uuid_index>]
                           [\-\-data\-len=<data\-len> | \-l <data\-len>]
                           [\-\-sel=<select> | \-s <select>]
                           [\-\-raw\-binary | \-b]
@@ -103,6 +104,11 @@ T}
 .sp 1
 .RE
 .PP
+\-U <uuid\-index>, \-\-uuid\-index=<uuid\-index>
+.RS 4
+UUID Index of the feature
+.RE
+.PP
 \-l <data\-len>, \-\-data\-len=<data\-len>
 .RS 4
 The data length for the buffer returned for this feature\&. Most known features do not use this value\&. The exception is LBA Range Type
@@ -185,8 +191,20 @@ Retrieves the feature for the some vendor specific feature and specifically requ
 .if n \{\
 .RE
 .\}
+.sp
+Get feature with UUID index
 .RE
 .sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme get\-feature /dev/nvme0 \-f 0xc0 \-l 512 \-U 0x1
+.fi
+.if n \{\
+.RE
+.\}
+.sp
 .RS 4
 .ie n \{\
 \h'-04'\(bu\h'+03'\c
index 19c2444f24e515c0dd753b0d3abbe8c05f9b88f7..62f54bd1aac3ddb5726db5a3a5afecc77c42c94c 100644 (file)
@@ -1,9 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
 <head>\r
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.6.8" />\r
+<meta name="generator" content="AsciiDoc 8.6.10" />\r
 <title>nvme-get-feature(1)</title>\r
 <style type="text/css">\r
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
@@ -94,7 +95,9 @@ ul > li > * { color: black; }
   padding: 0;\r
   margin: 0;\r
 }\r
-\r
+pre {\r
+  white-space: pre-wrap;\r
+}\r
 \r
 #author {\r
   color: #527bbd;\r
@@ -223,7 +226,7 @@ div.exampleblock > div.content {
 }\r
 \r
 div.imageblock div.content { padding-left: 0; }\r
-span.image img { border-style: none; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
 a.image:visited { color: white; }\r
 \r
 dl {\r
@@ -433,7 +436,7 @@ thead, p.table.header {
 p.table {\r
   margin-top: 0;\r
 }\r
-/* Because the table frame attribute is overridden by CSS in most browsers. */\r
+/* Because the table frame attribute is overriden by CSS in most browsers. */\r
 div.tableblock > table[frame="void"] {\r
   border-style: none;\r
 }\r
@@ -748,6 +751,7 @@ nvme-get-feature(1) Manual Page
 <div class="verseblock">\r
 <pre class="content"><em>nvme get-feature</em> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]\r
                           [--feature-id=&lt;fid&gt; | -f &lt;fid&gt;] [--cdw11=&lt;cdw11&gt;]\r
+                          [--uuid-index=&lt;uuid-index&gt; | -U &lt;uuid_index&gt;]\r
                           [--data-len=&lt;data-len&gt; | -l &lt;data-len&gt;]\r
                           [--sel=&lt;select&gt; | -s &lt;select&gt;]\r
                           [--raw-binary | -b]\r
@@ -847,6 +851,17 @@ cellspacing="0" cellpadding="4">
 </div>\r
 </dd>\r
 <dt class="hdlist1">\r
+-U &lt;uuid-index&gt;\r
+</dt>\r
+<dt class="hdlist1">\r
+--uuid-index=&lt;uuid-index&gt;\r
+</dt>\r
+<dd>\r
+<p>\r
+        UUID Index of the feature\r
+</p>\r
+</dd>\r
+<dt class="hdlist1">\r
 -l &lt;data-len&gt;\r
 </dt>\r
 <dt class="hdlist1">\r
@@ -928,7 +943,14 @@ will be displayed to the user in as a hex dump:
 <div class="content">\r
 <pre><code># nvme get-feature /dev/nvme0 -f 0xc0 -l 512</code></pre>\r
 </div></div>\r
+<div class="paragraph"><p>Get feature with UUID index</p></div>\r
 </li>\r
+</ul></div>\r
+<div class="listingblock">\r
+<div class="content">\r
+<pre><code># nvme get-feature /dev/nvme0 -f 0xc0 -l 512 -U 0x1</code></pre>\r
+</div></div>\r
+<div class="ulist"><ul>\r
 <li>\r
 <p>\r
 The following retrieves the feature for the LBA Range Type, which\r
@@ -954,7 +976,8 @@ format:
 <div id="footnotes"><hr /></div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 2018-02-07 09:54:27 MST\r
+Last updated\r
+ 2021-05-16 00:13:16 IST\r
 </div>\r
 </div>\r
 </body>\r
index 56542dcc9c9827afa37e3611ab11904d660605c3..a6f57a7aee60b3f8622a5b3a0fda36817e5df363 100644 (file)
@@ -10,6 +10,7 @@ SYNOPSIS
 [verse]
 'nvme get-feature' <device> [--namespace-id=<nsid> | -n <nsid>]
                          [--feature-id=<fid> | -f <fid>] [--cdw11=<cdw11>]
+                         [--uuid-index=<uuid-index> | -U <uuid_index>]
                          [--data-len=<data-len> | -l <data-len>]
                          [--sel=<select> | -s <select>]
                          [--raw-binary | -b]
@@ -57,6 +58,10 @@ OPTIONS
 |4–7|Reserved
 |==================
 
+-U <uuid-index>::
+--uuid-index=<uuid-index>::
+       UUID Index of the feature
+
 -l <data-len>::
 --data-len=<data-len>::
        The data length for the buffer returned for this feature. Most
@@ -102,6 +107,10 @@ will be displayed to the user in as a hex dump:
 # nvme get-feature /dev/nvme0 -f 0xc0 -l 512
 ------------
 +
+Get feature with UUID index
+------------
+# nvme get-feature /dev/nvme0 -f 0xc0 -l 512 -U 0x1
+------------
 
 * The following retrieves the feature for the LBA Range Type, which
 implicitly requires a buffer and will be saved to a file in its raw
index 913df38d7cd96f2bf2445e3df1de006ec14c7311..57e8c0899e968e190ff2da819b8dd19fdce18b13 100644 (file)
@@ -1,13 +1,13 @@
 '\" t
 .\"     Title: nvme-set-feature
-.\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
-.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/20/2020
+.\"    Author: [FIXME: author] [see http://docbook.sf.net/el/author]
+.\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/>
+.\"      Date: 05/16/2021
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SET\-FEATURE" "1" "10/20/2020" "NVMe" "NVMe Manual"
+.TH "NVME\-SET\-FEATURE" "1" "05/16/2021" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -34,6 +34,7 @@ nvme-set-feature \- Sets an NVMe feature, returns applicable results
 .nf
 \fInvme set\-feature\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
                           [\-\-feature\-id=<fid> | \-f <fid>] [\-\-value=<value> | \-v <value>]
+                          [\-\-uuid\-index=<uuid\-index> | \-U <uuid_index>]
                           [\-\-data\-len=<data\-len> | \-l <data\-len>]
                           [\-\-data=<data\-file> | \-d <data\-file>]
                           [\-\-save| \-s]
@@ -76,6 +77,11 @@ The value for command dword 11, the value you want to set the feature to\&.
 .RS 4
 Save the attribute so that it persists through all power states and resets\&.
 .RE
+.PP
+\-U <uuid\-index>, \-\-uuid\-index=<uuid\-index>
+.RS 4
+UUID Index of the feature
+.RE
 .SH "EXAMPLES"
 .sp
 .RS 4
@@ -118,6 +124,8 @@ Sets the host id to the ascii string\&.
 .if n \{\
 .RE
 .\}
+.sp
+nvme set\-feature /dev/nvme0 \-f 0x81 \-l 8 \-U 0x1
 .RE
 .SH "NVME"
 .sp
index b813b91213c075b7d80c40daf83a9beec00af40b..b5bf7792fbc9a770cbef519b1ac0c099d4aeff7f 100644 (file)
@@ -1,9 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"\r
     "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\r
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">\r
 <head>\r
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />\r
-<meta name="generator" content="AsciiDoc 8.6.8" />\r
+<meta name="generator" content="AsciiDoc 8.6.10" />\r
 <title>nvme-set-feature(1)</title>\r
 <style type="text/css">\r
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
@@ -94,7 +95,9 @@ ul > li > * { color: black; }
   padding: 0;\r
   margin: 0;\r
 }\r
-\r
+pre {\r
+  white-space: pre-wrap;\r
+}\r
 \r
 #author {\r
   color: #527bbd;\r
@@ -223,7 +226,7 @@ div.exampleblock > div.content {
 }\r
 \r
 div.imageblock div.content { padding-left: 0; }\r
-span.image img { border-style: none; }\r
+span.image img { border-style: none; vertical-align: text-bottom; }\r
 a.image:visited { color: white; }\r
 \r
 dl {\r
@@ -433,7 +436,7 @@ thead, p.table.header {
 p.table {\r
   margin-top: 0;\r
 }\r
-/* Because the table frame attribute is overridden by CSS in most browsers. */\r
+/* Because the table frame attribute is overriden by CSS in most browsers. */\r
 div.tableblock > table[frame="void"] {\r
   border-style: none;\r
 }\r
@@ -748,6 +751,7 @@ nvme-set-feature(1) Manual Page
 <div class="verseblock">\r
 <pre class="content"><em>nvme set-feature</em> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]\r
                           [--feature-id=&lt;fid&gt; | -f &lt;fid&gt;] [--value=&lt;value&gt; | -v &lt;value&gt;]\r
+                          [--uuid-index=&lt;uuid-index&gt; | -U &lt;uuid_index&gt;]\r
                           [--data-len=&lt;data-len&gt; | -l &lt;data-len&gt;]\r
                           [--data=&lt;data-file&gt; | -d &lt;data-file&gt;]\r
                           [--save| -s]</pre>\r
@@ -844,6 +848,17 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
         Save the attribute so that it persists through all power states and resets.\r
 </p>\r
 </dd>\r
+<dt class="hdlist1">\r
+-U &lt;uuid-index&gt;\r
+</dt>\r
+<dt class="hdlist1">\r
+--uuid-index=&lt;uuid-index&gt;\r
+</dt>\r
+<dd>\r
+<p>\r
+        UUID Index of the feature\r
+</p>\r
+</dd>\r
 </dl></div>\r
 </div>\r
 </div>\r
@@ -868,6 +883,7 @@ Sets the host id to the ascii string.
 <div class="content">\r
 <pre><code># echo "abcdefgh" | nvme set-feature /dev/nvme0 -f 0x81 -l 8</code></pre>\r
 </div></div>\r
+<div class="paragraph"><p>nvme set-feature /dev/nvme0 -f 0x81 -l 8 -U 0x1</p></div>\r
 </li>\r
 </ul></div>\r
 </div>\r
@@ -882,7 +898,8 @@ Sets the host id to the ascii string.
 <div id="footnotes"><hr /></div>\r
 <div id="footer">\r
 <div id="footer-text">\r
-Last updated 2017-02-27 10:11:58 EST\r
+Last updated\r
+ 2021-05-16 00:14:28 IST\r
 </div>\r
 </div>\r
 </body>\r
index ca1874d40f08ed139434a393975011a5b0ebc7ee..24a9f40955b34d28eabf63ed595274772c56ccc2 100644 (file)
@@ -10,6 +10,7 @@ SYNOPSIS
 [verse]
 'nvme set-feature' <device> [--namespace-id=<nsid> | -n <nsid>]
                          [--feature-id=<fid> | -f <fid>] [--value=<value> | -v <value>]
+                         [--uuid-index=<uuid-index> | -U <uuid_index>]
                          [--data-len=<data-len> | -l <data-len>]
                          [--data=<data-file> | -d <data-file>]
                          [--save| -s]
@@ -59,6 +60,10 @@ OPTIONS
 --save::
        Save the attribute so that it persists through all power states and resets.     
 
+-U <uuid-index>::
+--uuid-index=<uuid-index>::
+       UUID Index of the feature
+
 EXAMPLES
 --------
 * Sets the Power State (PS) to 1  in feature id 2:
@@ -73,6 +78,8 @@ EXAMPLES
 ------------
 # echo "abcdefgh" | nvme set-feature /dev/nvme0 -f 0x81 -l 8
 ------------
++
+nvme set-feature /dev/nvme0 -f 0x81 -l 8 -U 0x1
 
 NVME
 ----
index d73056225e1e08561431c2bfa4e3ca98b78a062c..4b388d8ce33d8a9106f3550e1749994b9e52aa1d 100644 (file)
@@ -343,6 +343,8 @@ _nvme () {
                        -s':alias to --sel'
                        --data-len=':buffer len for returned LBA Type Range or host identifier data'
                        -l':alias for --data-len'
+                       --uuid-index=':uuid index'
+                       -U':alias for --uuid-index'
                        --cdw11=':dword 11 value, used for interrupt vector configuration only'
                        --raw-binary':dump infos in binary format'
                        -b':alias to --raw-binary'
@@ -364,6 +366,8 @@ _nvme () {
                        -d':alias to --data'
                        --value=':new value of feature (required)'
                        -v'alias to --value'
+                       --uuid-index=':uuid index'
+                       -U':alias for --uuid-index'
                        )
                        _arguments '*:: :->subcmds'
                        _describe -t commands "nvme set-feature options" _setf
index c022b89ca88a29c4b95ae34533f830401f997b32..9eed8e8c34448506c2b4657a3a7ffbac0ddeafce 100644 (file)
@@ -113,12 +113,12 @@ nvme_list_opts () {
                        ;;
                "get-feature")
                opts+=" --namespace-id= -n --feature-id= -f --sel= -s \
-                       --data-len= -l --cdw11= --raw-binary -b \
+                       --data-len= -l --cdw11= --uuid-index= -U --raw-binary -b \
                        --human-readable -H"
                        ;;
                "set-feature")
                opts+=" --namespace-id= -n --feature-id= -f --value= -v \
-                       --data-len= -l -data= -d --value= --save -s"
+                       --data-len= -l -data= -d --value= --save -s --uuid-index= -U"
                        ;;
                "format")
                opts+=" --namespace-id= -n --timeout= -t --lbaf= -l \
index 28010754b5e4a124f7794dd0e126a2e7d8f1a21c..52099eaa8cece72d869b702b87e5a93a376f66dc 100644 (file)
@@ -646,7 +646,7 @@ int nvme_resv_notif_log(int fd, struct nvme_resv_notif_log *resv)
 }
 
 int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10, __u32 cdw11,
-                __u32 cdw12, __u32 data_len, void *data, __u32 *result)
+                __u32 cdw12, __u32 cdw14, __u32 data_len, void *data, __u32 *result)
 {
        struct nvme_admin_cmd cmd = {
                .opcode         = opcode,
@@ -654,6 +654,7 @@ int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10, __u32 cdw11,
                .cdw10          = cdw10,
                .cdw11          = cdw11,
                .cdw12          = cdw12,
+               .cdw14          = cdw14,
                .addr           = (__u64)(uintptr_t) data,
                .data_len       = data_len,
        };
@@ -666,12 +667,13 @@ int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10, __u32 cdw11,
 }
 
 int nvme_set_feature(int fd, __u32 nsid, __u8 fid, __u32 value, __u32 cdw12,
-                    bool save, __u32 data_len, void *data, __u32 *result)
+                    bool save, __u8 uuid_index, __u32 data_len, void *data, __u32 *result)
 {
        __u32 cdw10 = fid | (save ? 1 << 31 : 0);
+       __u32 cdw14 = uuid_index;
 
        return nvme_feature(fd, nvme_admin_set_features, nsid, cdw10, value,
-                           cdw12, data_len, data, result);
+                           cdw12, cdw14, data_len, data, result);
 }
 
 
@@ -740,12 +742,13 @@ int nvme_set_property(int fd, int offset, uint64_t value)
 }
 
 int nvme_get_feature(int fd, __u32 nsid, __u8 fid, __u8 sel, __u32 cdw11,
-                    __u32 data_len, void *data, __u32 *result)
+                    __u8 uuid_index, __u32 data_len, void *data, __u32 *result)
 {
        __u32 cdw10 = fid | sel << 8;
+       __u32 cdw14 = uuid_index;
 
        return nvme_feature(fd, nvme_admin_get_features, nsid, cdw10, cdw11,
-                           0, data_len, data, result);
+                           0, cdw14, data_len, data, result);
 }
 
 int nvme_format(int fd, __u32 nsid, __u8 lbaf, __u8 ses, __u8 pi,
index b0184c7deae4c3ebb4f1be5d60d44910a4670380..9b08882f4be922e6af9350ca027d179137b645b0 100644 (file)
@@ -119,12 +119,12 @@ int nvme_lba_status_log(int fd, void *lba_status, bool rae,
                __u32 size);
 int nvme_resv_notif_log(int fd, struct nvme_resv_notif_log *resv);
 int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10,
-                __u32 cdw11, __u32 cdw12, __u32 data_len, void *data,
+                __u32 cdw11, __u32 cdw12, __u32 cdw14, __u32 data_len, void *data,
                 __u32 *result);
 int nvme_set_feature(int fd, __u32 nsid, __u8 fid, __u32 value, __u32 cdw12,
-                    bool save, __u32 data_len, void *data, __u32 *result);
+                    bool save, __u8 uuid_index, __u32 data_len, void *data, __u32 *result);
 int nvme_get_feature(int fd, __u32 nsid, __u8 fid, __u8 sel,
-                    __u32 cdw11, __u32 data_len, void *data, __u32 *result);
+                    __u32 cdw11, __u8 uuid_index, __u32 data_len, void *data, __u32 *result);
 
 int nvme_format(int fd, __u32 nsid, __u8 lbaf, __u8 ses, __u8 pi,
                __u8 pil, __u8 ms, __u32 timeout);
diff --git a/nvme.c b/nvme.c
index b643d7a5d1501c69dafee4d95ef7b7e74266bf09..8968778d5cbc565f4755c843f1e0ec2f4cef8a83 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -2666,6 +2666,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
        const char *data_len = "buffer len if data is returned through host memory buffer";
        const char *cdw11 = "dword 11 for interrupt vector config";
        const char *human_readable = "show feature in readable format";
+       const char *uuid_index = "specify uuid index";
        int err, fd;
        __u32 result;
        void *buf = NULL;
@@ -2675,6 +2676,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
                __u8  feature_id;
                __u8  sel;
                __u32 cdw11;
+               __u8  uuid_index;
                __u32 data_len;
                int  raw_binary;
                int  human_readable;
@@ -2685,6 +2687,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
                .feature_id   = 0,
                .sel          = 0,
                .cdw11        = 0,
+               .uuid_index   = 0,
                .data_len     = 0,
        };
 
@@ -2695,6 +2698,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
                OPT_UINT("data-len",      'l', &cfg.data_len,       data_len),
                OPT_FLAG("raw-binary",    'b', &cfg.raw_binary,     raw),
                OPT_UINT("cdw11",         'c', &cfg.cdw11,          cdw11),
+               OPT_BYTE("uuid-index",    'U', &cfg.uuid_index,     uuid_index),
                OPT_FLAG("human-readable",'H', &cfg.human_readable, human_readable),
                OPT_END()
        };
@@ -2726,6 +2730,13 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
                goto close_fd;
        }
 
+       if (cfg.uuid_index > 128) {
+               fprintf(stderr, "invalid uuid index param: %u\n", cfg.uuid_index);
+               errno = EINVAL;
+               err = -1;
+               goto close_fd;
+       }
+
        cfg.data_len = nvme_feat_buf_len[cfg.feature_id];
 
        /* check for Extended Host Identifier */
@@ -2745,7 +2756,7 @@ static int get_feature(int argc, char **argv, struct command *cmd, struct plugin
        }
 
        err = nvme_get_feature(fd, cfg.namespace_id, cfg.feature_id, cfg.sel, cfg.cdw11,
-                       cfg.data_len, buf, &result);
+                       cfg.uuid_index, cfg.data_len, buf, &result);
        if (!err) {
                if (!cfg.raw_binary || !buf) {
                        printf("get-feature:%#02x (%s), %s value:%#08x\n", cfg.feature_id,
@@ -3561,6 +3572,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
        const char *value = "new value of feature (required)";
        const char *cdw12 = "feature cdw12, if used";
        const char *save = "specifies that the controller shall save the attribute";
+       const char *uuid_index = "specify uuid index";
        int err;
        __u32 result;
        void *buf = NULL;
@@ -3574,6 +3586,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
                __u8  feature_id;
                __u64 value;
                __u32 cdw12;
+               __u8  uuid_index;
                __u32 data_len;
                int   save;
        };
@@ -3583,6 +3596,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
                .namespace_id = 0,
                .feature_id   = 0,
                .value        = 0,
+               .uuid_index   = 0,
                .data_len     = 0,
                .save         = 0,
        };
@@ -3592,6 +3606,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
                OPT_UINT("feature-id",   'f', &cfg.feature_id,   feature_id),
                OPT_LONG("value",        'v', &cfg.value,        value),
                OPT_UINT("cdw12",        'c', &cfg.cdw12,        cdw12),
+               OPT_BYTE("uuid-index",   'U', &cfg.uuid_index,   uuid_index),
                OPT_UINT("data-len",     'l', &cfg.data_len,     data_len),
                OPT_FILE("data",         'd', &cfg.file,         data),
                OPT_FLAG("save",         's', &cfg.save,         save),
@@ -3620,6 +3635,13 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
                goto close_fd;
        }
 
+       if (cfg.uuid_index > 128) {
+               fprintf(stderr, "invalid uuid index param: %u\n", cfg.uuid_index);
+               errno = EINVAL;
+               err = -1;
+               goto close_fd;
+       }
+
        cfg.data_len = nvme_feat_buf_len[cfg.feature_id];
 
        if (cfg.data_len) {
@@ -3662,7 +3684,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
        }
 
        err = nvme_set_feature(fd, cfg.namespace_id, cfg.feature_id, cfg.value,
-                              cfg.cdw12, cfg.save, cfg.data_len, buf, &result);
+                              cfg.cdw12, cfg.save, cfg.uuid_index, cfg.data_len, buf, &result);
        if (err < 0) {
                perror("set-feature");
        } else if (!err) {
index 27b065de70c692ee68165d8beff2388818de8c27..8f8d54d8fa1bc4e9c37baff4cc1fba5d729f6a7d 100644 (file)
@@ -1065,7 +1065,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
                __u32 thresholds[OPTANE_V1000_BUCKET_LEN] = {0};
                __u32 result;
 
-               err = nvme_get_feature(fd, 0, 0xf7, 0, cfg.write ? 0x1 : 0x0,
+               err = nvme_get_feature(fd, 0, 0xf7, 0, cfg.write ? 0x1 : 0x0, 0,
                                       sizeof(thresholds), thresholds, &result);
                if (err) {
                        fprintf(stderr, "Quering thresholds failed. NVMe Status:%s(%x)\n",
@@ -1542,7 +1542,7 @@ static int enable_lat_stats_tracking(int argc, char **argv,
                return fd;
        switch (option) {
        case None:
-               err = nvme_get_feature(fd, nsid, fid, sel, cdw11, data_len, buf,
+               err = nvme_get_feature(fd, nsid, fid, sel, cdw11, 0, data_len, buf,
                                        &result);
                if (!err) {
                        printf(
@@ -1555,7 +1555,7 @@ static int enable_lat_stats_tracking(int argc, char **argv,
                break;
        case True:
        case False:
-               err = nvme_set_feature(fd, nsid, fid, option, cdw12, save,
+               err = nvme_set_feature(fd, nsid, fid, option, cdw12, save, 0,
                                data_len, buf, &result);
                if (err > 0) {
                        fprintf(stderr, "NVMe Status:%s(%x)\n",
@@ -1636,7 +1636,7 @@ static int set_lat_stats_thresholds(int argc, char **argv,
                }
 
                err = nvme_set_feature(fd, nsid, fid, cfg.write ? 0x1 : 0x0,
-                                      cdw12, save, OPTANE_V1000_BUCKET_LEN,
+                                      cdw12, save, 0, OPTANE_V1000_BUCKET_LEN,
                                       thresholds, &result);
 
                if (err > 0) {
index d3308354f2f1d5aeef6515e3d7795b06547d955a..e3807f13bf4264b36a6319a2c93d6bf78b6dd710 100644 (file)
@@ -503,7 +503,7 @@ static int mb_get_powermanager_status(int argc, char **argv, struct command *cmd
     fd = parse_and_open(argc, argv, desc, opts);
     if (fd < 0) return fd;
 
-    err = nvme_get_feature(fd, 0, feature_id, 0, 0, 0, NULL, &result);
+    err = nvme_get_feature(fd, 0, feature_id, 0, 0, 0, 0, NULL, &result);
     if (err < 0) {
         perror("get-feature");
     }
@@ -545,7 +545,7 @@ static int mb_set_powermanager_status(int argc, char **argv, struct command *cmd
     fd = parse_and_open(argc, argv, desc, opts);
     if (fd < 0) return fd;
 
-    err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, cfg.save, 0, NULL, &result);
+    err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, cfg.save, 0, 0, NULL, &result);
     if (err < 0) {
         perror("set-feature");
     }
@@ -602,7 +602,7 @@ static int mb_set_high_latency_log(int argc, char **argv, struct command *cmd, s
     }
     cfg.value = (param1 << MB_FEAT_HIGH_LATENCY_VALUE_SHIFT) | param2;
 
-    err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, 0, 0, NULL, &result);
+    err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, 0, 0, 0, NULL, &result);
     if (err < 0) {
         perror("set-feature");
     }
@@ -1038,7 +1038,7 @@ static int memblaze_clear_error_log(int argc, char **argv, struct command *cmd,
 
 
 
-    err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, cfg.save, 0, NULL, &result);
+    err = nvme_set_feature(fd, 0, cfg.feature_id, cfg.value, 0, cfg.save, 0, 0, NULL, &result);
     if (err < 0) {
         perror("set-feature");
     }
@@ -1115,7 +1115,7 @@ static int mb_set_lat_stats(int argc, char **argv,
                return fd;
        switch (option) {
        case None:
-               err = nvme_get_feature(fd, nsid, fid, sel, cdw11, data_len, buf,
+               err = nvme_get_feature(fd, nsid, fid, sel, cdw11, 0, data_len, buf,
                                        &result);
                if (!err) {
                        printf(
@@ -1128,7 +1128,7 @@ static int mb_set_lat_stats(int argc, char **argv,
                break;
        case True:
        case False:
-               err = nvme_set_feature(fd, nsid, fid, option, cdw12, save,
+               err = nvme_set_feature(fd, nsid, fid, option, cdw12, save, 0,
                                data_len, buf, &result);
                if (err > 0) {
                        fprintf(stderr, "NVMe Status:%s(%x)\n",
index 8e4b7cff34f7b5f29d9cd0a758d3385ef0ad4fc2..efa23fbe837ce3da48a851e61d3eb3b11016a383 100644 (file)
@@ -626,7 +626,7 @@ static int micron_smbus_option(int argc, char **argv,
 
     if (!strcmp(opt.option, "enable")) {
         cdw11 = opt.value << 1 | 1;
-        err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, &result);
+        err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, 0, &result);
         if (err == 0) {
             printf("successfully enabled SMBus on drive\n");
         } else {
@@ -635,7 +635,7 @@ static int micron_smbus_option(int argc, char **argv,
     }
     else if (!strcmp(opt.option, "status")) {
         cdw10 = opt.value;
-        err = nvme_get_feature(fd, 1, fid, cdw10, 0, 0, 0, &result);
+        err = nvme_get_feature(fd, 1, fid, cdw10, 0, 0, 0, 0, &result);
         if (err == 0) {
             printf("SMBus status on the drive: %s (returns %s temperature) \n",
                     (result & 1) ? "enabled" : "disabled",
@@ -646,7 +646,7 @@ static int micron_smbus_option(int argc, char **argv,
     }
     else if (!strcmp(opt.option, "disable")) {
         cdw11 = opt.value << 1 | 0;
-        err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, &result);
+        err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, 0, &result);
         if (err == 0) {
             printf("Successfully disabled SMBus on drive\n");
         } else {
@@ -932,7 +932,7 @@ static int micron_clear_pcie_correctable_errors(int argc, char **argv,
 
     /* For M51CX models, PCIe errors are cleared using 0xC3 feature */
     if (model == M51CX) {
-        err = nvme_set_feature(fd, 0, fid, (1 << 31), 0, 0, 0, 0, &result);
+        err = nvme_set_feature(fd, 0, fid, (1 << 31), 0, 0, 0, 0, 0, &result);
         if (err == 0 && (err = (int)result) == 0)
             printf("Device correctable errors cleared!\n");
         else
@@ -1727,7 +1727,7 @@ static int GetFeatureSettings(int fd, const char *dir)
             bufp = NULL;
         }
 
-        err = nvme_get_feature(fd, 1, fmap[i].id, 0, 0x0, len, bufp, &attrVal);
+        err = nvme_get_feature(fd, 1, fmap[i].id, 0, 0x0, 0, len, bufp, &attrVal);
         if (err == 0) {
             sprintf(msg, "feature: 0x%X", fmap[i].id);
             WriteData((__u8*)&attrVal, sizeof(attrVal), dir, fmap[i].file, msg);
@@ -2090,7 +2090,7 @@ static int micron_clr_fw_activation_history(int argc, char **argv,
     }
 
     //err = nvme_set_feature(fd, 1, fid, cdw11, 0, opt.save, 0, 0, &result);
-    err = nvme_set_feature(fd, 1, fid, 0, 0, 0, 0, 0, &result);
+    err = nvme_set_feature(fd, 1, fid, 0, 0, 0, 0, 0, 0, &result);
     if (err == 0) err = (int)result;
     return err;
 }
@@ -2136,14 +2136,14 @@ static int micron_telemetry_cntrl_option(int argc, char **argv,
     }
 
     if (!strcmp(opt.option, "enable")) {
-        err = nvme_set_feature(fd, 1, fid, 1, 0, (opt.select & 0x1), 0, 0, &result);
+        err = nvme_set_feature(fd, 1, fid, 1, 0, (opt.select & 0x1), 0, 0, 0, &result);
         if (err == 0) {
             printf("successfully set controller telemetry option\n");
         } else {
             printf("Failed to set controller telemetry option\n");
         }
     } else if (!strcmp(opt.option, "disable")) {
-        err = nvme_set_feature(fd, 1, fid, 0, 0, (opt.select & 0x1), 0, 0, &result);
+        err = nvme_set_feature(fd, 1, fid, 0, 0, (opt.select & 0x1), 0, 0, 0, &result);
         if (err == 0) {
             printf("successfully disabled controller telemetry option\n");
         } else {
@@ -2151,7 +2151,7 @@ static int micron_telemetry_cntrl_option(int argc, char **argv,
         }
     } else if (!strcmp(opt.option, "status")) {
         opt.select &= 0x3;
-        err = nvme_get_feature(fd, 1, fid, opt.select, 0, 0, 0, &result);
+        err = nvme_get_feature(fd, 1, fid, opt.select, 0, 0, 0, 0, &result);
         if (err == 0) {
             printf("Controller telemetry option : %s\n",
                     (result) ? "enabled" : "disabled");
index d5ef32b23dfa95b2e5d8a89dc366320fa745a451..9512cda624eeffff1499d940048397ae1fe8d353 100644 (file)
@@ -1051,7 +1051,7 @@ static int vs_clr_pcie_correctable_errs(int argc, char **argv, struct command *c
 
        fd = parse_and_open(argc, argv, desc, opts);
 
-       err = nvme_set_feature(fd, 0, 0xE1, 0xCB, 0, cfg.save, 0, buf, &result);
+       err = nvme_set_feature(fd, 0, 0xE1, 0xCB, 0, cfg.save, 0, 0, buf, &result);
 
        if (err < 0) {
                perror("set-feature");
index 588f4f35b13ca3efd7217010d5597cd69fe51dc2..1909e458d0d972c2c61ce65b9125fe01c376535e 100644 (file)
@@ -231,7 +231,7 @@ static int get_additional_feature(int argc, char **argv, struct command *cmd, st
                memset(buf, 0, cfg.data_len);
        }
 
-       err = nvme_get_feature(fd, cfg.namespace_id, cfg.feature_id, cfg.sel, cfg.cdw11,
+       err = nvme_get_feature(fd, cfg.namespace_id, cfg.feature_id, cfg.sel, cfg.cdw11, 0,
                        cfg.data_len, buf, &result);
        if (!err) {
                printf("get-feature:0x%02x (%s), %s value: %#08x\n", cfg.feature_id,
@@ -344,7 +344,7 @@ static int set_additional_feature(int argc, char **argv, struct command *cmd, st
        }
 
        err = nvme_set_feature(fd, cfg.namespace_id, cfg.feature_id, cfg.value,
-                               0, cfg.save, cfg.data_len, buf, &result);
+                               0, cfg.save, 0, cfg.data_len, buf, &result);
        if (err < 0) {
                perror("set-feature");
                goto free;
index 53d54bcc553b3ec8714e98762c765350251051a4..cba1af8ce93c47e66108bf99913a0d4c5876aaed 100644 (file)
@@ -551,7 +551,7 @@ static int clear_correctable_errors(int argc, char **argv, struct command *cmd,
                goto end;
 
        err = nvme_set_feature(fd, namespace_id, feature_id, value, cdw12, save,
-                               0, NULL, &result);
+                               0, 0, NULL, &result);
        if (err)
                fprintf(stderr, "%s: couldn't clear PCIe correctable errors \n",
                        __func__);
index 5d8c3b7ebe2a5cff2c1c707f0c5a36cf044197f2..e2f9e9326c5eee9f8a5aed511ee3348255275c49 100644 (file)
@@ -1984,7 +1984,7 @@ static int wdc_do_cap_telemetry_log(int fd, char *file, __u32 bs, int type, int
        } else if (type == WDC_TELEMETRY_TYPE_CONTROLLER) {
                /* Verify the Controller Initiated Option is enabled */
                err = nvme_get_feature(fd, 0, WDC_VU_DISABLE_CNTLR_TELEMETRY_OPTION_FEATURE_ID, 0, 0,
-                               4, buf, &result);
+                               0, 4, buf, &result);
                if (err == 0) {
                        if (result == 0) {
                                /* enabled */
@@ -5203,7 +5203,7 @@ static int wdc_do_clear_pcie_correctable_errors_fid(int fd)
        __u32 value = 1 << 31; /* Bit 31 - clear PCIe correctable count */
 
        ret = nvme_set_feature(fd, 0, WDC_NVME_CLEAR_PCIE_CORR_FEATURE_ID, value,
-                               0, 0, 0, NULL, &result);
+                               0, 0, 0, 0, NULL, &result);
 
        fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
        return ret;
@@ -5637,7 +5637,7 @@ static int wdc_do_clear_fw_activate_history_fid(int fd)
        __u32 value = 1 << 31; /* Bit 31 - Clear Firmware Update History Log */
 
        ret = nvme_set_feature(fd, 0, WDC_NVME_CLEAR_FW_ACT_HIST_VU_FID, value,
-                               0, 0, 0, NULL, &result);
+                               0, 0, 0, 0, NULL, &result);
 
        fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
        return ret;
@@ -5731,18 +5731,18 @@ static int wdc_vs_telemetry_controller_option(int argc, char **argv, struct comm
 
        if (cfg.disable) {
                ret = nvme_set_feature(fd, 0, WDC_VU_DISABLE_CNTLR_TELEMETRY_OPTION_FEATURE_ID, 1,
-                                      0, 0, 0, buf, &result);
+                                      0, 0, 0, 0, buf, &result);
 
                wdc_clear_reason_id(fd);
        }
        else {
           if (cfg.enable) {
                        ret = nvme_set_feature(fd, 0, WDC_VU_DISABLE_CNTLR_TELEMETRY_OPTION_FEATURE_ID, 0,
-                                              0, 0, 0, buf, &result);
+                                              0, 0, 0, 0, buf, &result);
           }
           else if (cfg.status) {
                        ret = nvme_get_feature(fd, 0, WDC_VU_DISABLE_CNTLR_TELEMETRY_OPTION_FEATURE_ID, 0, 0,
-                                       4, buf, &result);
+                                       0, 4, buf, &result);
                        if (ret == 0) {
                                if (result)
                                        fprintf(stderr, "Controller Option Telemetry Log Page State: Disabled\n");
@@ -6366,7 +6366,7 @@ static int wdc_do_drive_essentials(int fd, char *dir, char *key)
                if (deFeatureIdList[listIdx].featureId == FID_LBA_RANGE_TYPE)
                        continue;
                ret = nvme_get_feature(fd, WDC_DE_GLOBAL_NSID, deFeatureIdList[listIdx].featureId, FS_CURRENT, 0,
-                               sizeof(featureIdBuff), &featureIdBuff, &result);
+                               0, sizeof(featureIdBuff), &featureIdBuff, &result);
 
                if (ret) {
                        fprintf(stderr, "ERROR : WDC : nvme_get_feature id 0x%x failed, ret = %d\n",
@@ -7716,7 +7716,7 @@ static int wdc_vs_temperature_stats(int argc, char **argv,
        temperature = ((smart_log.temperature[1] << 8) | smart_log.temperature[0]) - 273;
 
        /* retrieve HCTM Thermal Management Temperatures */
-       nvme_get_feature(fd, 0, 0x10, 0, 0, 0, 0, &hctm_tmt);
+       nvme_get_feature(fd, 0, 0x10, 0, 0, 0, 0, 0, &hctm_tmt);
        temp_tmt1 = ((hctm_tmt >> 16) & 0xffff) ? ((hctm_tmt >> 16) & 0xffff) - 273 : 0;
        temp_tmt2 = (hctm_tmt & 0xffff) ? (hctm_tmt & 0xffff) - 273 : 0;