Currently telemetry-log cannot retain content of corresponding log page as RAE is not set.
This patch adds RAE bit support into routines to retrieve log pages.
Signed-off-by: Alexey Timofeyev <alexey.timofeyev@sk.com>
.\" Title: nvme-get-log
.\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\" Date: 06/05/2018
+.\" Date: 06/28/2018
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-GET\-LOG" "1" "06/05/2018" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-LOG" "1" "06/28/2018" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
[\-\-raw\-binary | \-b]
[\-\-lpo=<offset> | \-o <offset>]
[\-\-lsp=<field> | \-s <field>]
+ [\-\-rae | \-r]
.fi
.SH "DESCRIPTION"
.sp
.RS 4
The log specified field of LID\&.
.RE
+.PP
+\-r, \-\-rae
+.RS 4
+Retain an Asynchronous Event\&.
+.RE
.SH "EXAMPLES"
.sp
.RS 4
+<?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-log(1)</title>\r
<style type="text/css">\r
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */\r
padding: 0;\r
margin: 0;\r
}\r
-\r
+pre {\r
+ white-space: pre-wrap;\r
+}\r
\r
#author {\r
color: #527bbd;\r
}\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
[--namespace-id=<nsid> | -n <nsid>]\r
[--raw-binary | -b]\r
[--lpo=<offset> | -o <offset>]\r
- [--lsp=<field> | -s <field>]</pre>\r
+ [--lsp=<field> | -s <field>]\r
+ [--rae | -r]</pre>\r
<div class="attribution">\r
</div></div>\r
</div>\r
The log specified field of LID.\r
</p>\r
</dd>\r
+<dt class="hdlist1">\r
+-r\r
+</dt>\r
+<dt class="hdlist1">\r
+--rae\r
+</dt>\r
+<dd>\r
+<p>\r
+ Retain an Asynchronous Event.\r
+</p>\r
+</dd>\r
</dl></div>\r
</div>\r
</div>\r
<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
+ 2018-06-28 16:56:55 UTC\r
</div>\r
</div>\r
</body>\r
[--raw-binary | -b]
[--lpo=<offset> | -o <offset>]
[--lsp=<field> | -s <field>]
+ [--rae | -r]
DESCRIPTION
-----------
--lsp=<field>::
The log specified field of LID.
+-r::
+--rae::
+ Retain an Asynchronous Event.
+
EXAMPLES
--------
* Get 512 bytes from log page 2
}
int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
- __u16 lsi, __u32 data_len, void *data)
+ __u16 lsi, bool rae, __u32 data_len, void *data)
{
struct nvme_admin_cmd cmd = {
.opcode = nvme_admin_get_log_page,
__u32 numd = (data_len >> 2) - 1;
__u16 numdu = numd >> 16, numdl = numd & 0xffff;
- cmd.cdw10 = log_id | (numdl << 16);
+ cmd.cdw10 = log_id | (numdl << 16) | (rae ? 1 << 15 : 0);
if (lsp)
cmd.cdw10 |= lsp << 8;
int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data)
{
return nvme_get_log13(fd, nsid, log_id, NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
- 0, data_len, data);
+ 0, 0, data_len, data);
}
int nvme_get_telemetry_log(int fd, void *lp, int generate_report,
if (ctrl_init)
return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_TELEMETRY_CTRL,
NVME_NO_LOG_LSP, offset,
- 0, log_page_size, lp);
+ 0, 1, log_page_size, lp);
if (generate_report)
return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_TELEMETRY_HOST,
NVME_TELEM_LSP_CREATE, offset,
- 0, log_page_size, lp);
+ 0, 1, log_page_size, lp);
else
return nvme_get_log13(fd, NVME_NSID_ALL, NVME_LOG_TELEMETRY_HOST,
NVME_NO_LOG_LSP, offset,
- 0, log_page_size, lp);
+ 0, 1, log_page_size, lp);
}
int nvme_fw_log(int fd, struct nvme_firmware_log_page *fw_log)
int nvme_endurance_log(int fd, __u16 group_id, struct nvme_endurance_group_log *endurance_log)
{
- return nvme_get_log13(fd, 0, NVME_LOG_ENDURANCE_GROUP, 0, 0, group_id,
+ return nvme_get_log13(fd, 0, NVME_LOG_ENDURANCE_GROUP, 0, 0, group_id, 0,
sizeof(*endurance_log), endurance_log);
}
int nvme_identify_ns_descs(int fd, __u32 nsid, void *data);
int nvme_identify_nvmset(int fd, __u16 nvmset_id, void *data);
int nvme_get_log13(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
- __u16 group_id, __u32 data_len, void *data);
+ __u16 group_id, bool rae, __u32 data_len, void *data);
int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data);
const char *aen = "result of the aen, use to override log id";
const char *lsp = "log specific field";
const char *lpo = "log page offset specifies the location within a log page from where to start returning data";
+ const char *rae = "retain an asynchronous event";
const char *raw_binary = "output in raw format";
int err, fd;
__u32 aen;
__u64 lpo;
__u8 lsp;
+ int rae;
int raw_binary;
};
.log_len = 0,
.lpo = NVME_NO_LOG_LPO,
.lsp = NVME_NO_LOG_LSP,
+ .rae = 0,
};
const struct argconfig_commandline_options command_line_options[] = {
{"raw-binary", 'b', "", CFG_NONE, &cfg.raw_binary, no_argument, raw_binary},
{"lpo", 'o', "NUM", CFG_LONG, &cfg.lpo, required_argument, lpo},
{"lsp", 's', "NUM", CFG_BYTE, &cfg.lsp, required_argument, lsp},
+ {"rae", 'r', "", CFG_NONE, &cfg.rae, no_argument, rae},
{NULL}
};
}
err = nvme_get_log13(fd, cfg.namespace_id, cfg.log_id,
- cfg.lsp, cfg.lpo, 0,
+ cfg.lsp, cfg.lpo, 0, cfg.rae,
cfg.log_len, log);
if (!err) {
if (!cfg.raw_binary) {
{"cdw12", 'c', "NUM", CFG_POSITIVE, &cfg.cdw12, required_argument, cdw12},
{"data-len", 'l', "NUM", CFG_POSITIVE, &cfg.data_len, required_argument, data_len},
{"data", 'd', "FILE", CFG_STRING, &cfg.file, required_argument, data},
- {"save", 's', "", CFG_NONE, &cfg.save, no_argument, save},
+ {"save", 's', "", CFG_NONE, &cfg.save, no_argument, save},
{NULL}
};