if (fd < 0)
return fd;
- err = nvme_get_log(fd, cfg.namespace_id, 0xca, sizeof(smart_log),
- &smart_log);
+ err = nvme_get_log(fd, cfg.namespace_id, 0xca,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(smart_log), &smart_log);
if (!err) {
if (cfg.json)
show_intel_smart_log_jsn(&smart_log, cfg.namespace_id, devicename);
if (fd < 0)
return fd;
- err = nvme_get_log(fd, NVME_NSID_ALL, 0xdd, sizeof(log), log);
+ err = nvme_get_log(fd, NVME_NSID_ALL, 0xdd,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(log), log);
if (!err) {
if (!cfg.raw_binary)
printf("Intel Marketing Name Log:\n%s\n", log);
if (fd < 0)
return fd;
- err = nvme_get_log(fd, NVME_NSID_ALL, 0xc5, sizeof(stats), &stats);
+ err = nvme_get_log(fd, NVME_NSID_ALL, 0xc5,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(stats), &stats);
if (!err) {
if (!cfg.raw_binary)
show_temp_stats(&stats);
if (fd < 0)
return fd;
- err = nvme_get_log(fd, NVME_NSID_ALL, cfg.write ? 0xc2 : 0xc1, sizeof(stats), &stats);
+ err = nvme_get_log(fd, NVME_NSID_ALL, cfg.write ? 0xc2 : 0xc1,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(stats), &stats);
if (!err) {
if (!cfg.raw_binary)
show_lat_stats(&stats, cfg.write);
NVME_FWACT_ACTV = (2 << 3),
};
+enum {
+ NVME_NO_LOG_LSP = 0x0,
+ NVME_NO_LOG_LPO = 0x0,
+};
+
/* Sanitize and Sanitize Monitor/Log */
enum {
/* Sanitize */
fd = parse_and_open(argc, argv, desc, command_line_options, &cfg, sizeof(cfg));
- err = nvme_get_log(fd, cfg.namespace_id, 0xca, sizeof(smart_log), &smart_log);
+ err = nvme_get_log(fd, cfg.namespace_id, 0xca,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(smart_log), &smart_log);
if (!err) {
if (!cfg.raw_binary)
err = show_memblaze_smart_log(fd, cfg.namespace_id, devicename, &smart_log);
return nvme_identify(fd, nsid, NVME_ID_CNS_NS_DESC_LIST, data);
}
-int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data)
+int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
+ __u32 data_len, void *data)
{
struct nvme_admin_cmd cmd = {
.opcode = nvme_admin_get_log_page,
__u16 numdu = numd >> 16, numdl = numd & 0xffff;
cmd.cdw10 = log_id | (numdl << 16);
+ if (lsp)
+ cmd.cdw10 |= lsp << 8;
+
cmd.cdw11 = numdu;
+ cmd.cdw12 = lpo;
+ cmd.cdw13 = (lpo >> 32);
return nvme_submit_admin_passthru(fd, &cmd);
}
int nvme_fw_log(int fd, struct nvme_firmware_log_page *fw_log)
{
- return nvme_get_log(fd, NVME_NSID_ALL, NVME_LOG_FW_SLOT, sizeof(*fw_log), fw_log);
+ return nvme_get_log(fd, NVME_NSID_ALL, NVME_LOG_FW_SLOT,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(*fw_log), fw_log);
}
int nvme_error_log(int fd, int entries, struct nvme_error_log_page *err_log)
{
- return nvme_get_log(fd, 0, NVME_LOG_ERROR, entries * sizeof(*err_log), err_log);
+ return nvme_get_log(fd, 0, NVME_LOG_ERROR,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ entries * sizeof(*err_log), err_log);
}
int nvme_smart_log(int fd, __u32 nsid, struct nvme_smart_log *smart_log)
{
- return nvme_get_log(fd, nsid, NVME_LOG_SMART, sizeof(*smart_log), smart_log);
+ return nvme_get_log(fd, nsid, NVME_LOG_SMART,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(*smart_log), smart_log);
}
int nvme_effects_log(int fd, struct nvme_effects_log_page *effects_log)
{
- return nvme_get_log(fd, 0, NVME_LOG_CMD_EFFECTS, sizeof(*effects_log), effects_log);
+ return nvme_get_log(fd, 0, NVME_LOG_CMD_EFFECTS,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(*effects_log), effects_log);
}
int nvme_discovery_log(int fd, struct nvmf_disc_rsp_page_hdr *log, __u32 size)
{
- return nvme_get_log(fd, 0, NVME_LOG_DISC, size, log);
+ return nvme_get_log(fd, 0, NVME_LOG_DISC,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ size, log);
}
int nvme_sanitize_log(int fd, struct nvme_sanitize_log_page *sanitize_log)
{
- return nvme_get_log(fd, 0, NVME_LOG_SANITIZE, sizeof(*sanitize_log), sanitize_log);
+ return nvme_get_log(fd, 0, NVME_LOG_SANITIZE,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ sizeof(*sanitize_log), sanitize_log);
}
int nvme_feature(int fd, __u8 opcode, __u32 nsid, __u32 cdw10, __u32 cdw11,
int nvme_identify_ns_list(int fd, __u32 nsid, bool all, void *data);
int nvme_identify_ctrl_list(int fd, __u32 nsid, __u16 cntid, void *data);
int nvme_identify_ns_descs(int fd, __u32 nsid, void *data);
+int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u8 lsp, __u64 lpo,
+ __u32 data_len, void *data);
-int nvme_get_log(int fd, __u32 nsid, __u8 log_id, __u32 data_len, void *data);
int nvme_fw_log(int fd, struct nvme_firmware_log_page *fw_log);
int nvme_error_log(int fd, int entries, struct nvme_error_log_page *err_log);
int nvme_smart_log(int fd, __u32 nsid, struct nvme_smart_log *smart_log);
const char *log_id = "identifier of log to retrieve";
const char *log_len = "how many bytes to retrieve";
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 *raw_binary = "output in raw format";
int err, fd;
__u32 log_id;
__u32 log_len;
__u32 aen;
+ __u64 lpo;
+ __u8 lsp;
int raw_binary;
};
.namespace_id = NVME_NSID_ALL,
.log_id = 0,
.log_len = 0,
+ .lpo = NVME_NO_LOG_LPO,
+ .lsp = NVME_NO_LOG_LSP,
};
const struct argconfig_commandline_options command_line_options[] = {
{"log-len", 'l', "NUM", CFG_POSITIVE, &cfg.log_len, required_argument, log_len},
{"aen", 'a', "NUM", CFG_POSITIVE, &cfg.aen, required_argument, aen},
{"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},
{NULL}
};
return EINVAL;
}
- err = nvme_get_log(fd, cfg.namespace_id, cfg.log_id, cfg.log_len, log);
+ err = nvme_get_log(fd, cfg.namespace_id, cfg.log_id,
+ cfg.lsp, cfg.lpo,
+ cfg.log_len, log);
if (!err) {
if (!cfg.raw_binary) {
printf("Device:%s log-id:%d namespace-id:%#x\n",
memset(data, 0, sizeof (__u8) * WDC_C2_LOG_BUF_LEN);
/* get the log page length */
- ret = nvme_get_log(fd, 0xFFFFFFFF, WDC_NVME_GET_AVAILABLE_LOG_PAGES_OPCODE, WDC_C2_LOG_BUF_LEN, data);
+ ret = nvme_get_log(fd, 0xFFFFFFFF, WDC_NVME_GET_AVAILABLE_LOG_PAGES_OPCODE,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ WDC_C2_LOG_BUF_LEN, data);
if (ret) {
fprintf(stderr, "ERROR : WDC : Unable to get C2 Log Page length, ret = %d\n", ret);
goto out;
goto out;
}
- ret = nvme_get_log(fd, 0xFFFFFFFF, WDC_NVME_GET_AVAILABLE_LOG_PAGES_OPCODE, hdr_ptr->length, data);
+ ret = nvme_get_log(fd, 0xFFFFFFFF, WDC_NVME_GET_AVAILABLE_LOG_PAGES_OPCODE,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ hdr_ptr->length, data);
/* parse the data until the List of log page ID's is found */
if (ret) {
fprintf(stderr, "ERROR : WDC : Unable to read C2 Log Page data, ret = %d\n", ret);
}
memset(data, 0, sizeof (__u8) * WDC_CA_LOG_BUF_LEN);
- ret = nvme_get_log(fd, 0xFFFFFFFF, WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE, WDC_CA_LOG_BUF_LEN, data);
+ ret = nvme_get_log(fd, 0xFFFFFFFF, WDC_NVME_GET_DEVICE_INFO_LOG_OPCODE,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ WDC_CA_LOG_BUF_LEN, data);
if (strcmp(format, "json"))
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
}
memset(data, 0, sizeof (__u8) * WDC_ADD_LOG_BUF_LEN);
- ret = nvme_get_log(fd, 0x01, WDC_NVME_ADD_LOG_OPCODE, WDC_ADD_LOG_BUF_LEN, data);
+ ret = nvme_get_log(fd, 0x01, WDC_NVME_ADD_LOG_OPCODE,
+ NVME_NO_LOG_LSP, NVME_NO_LOG_LPO,
+ WDC_ADD_LOG_BUF_LEN, data);
if (strcmp(format, "json"))
fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret), ret);
if (ret == 0) {