[PATCH V2 2/3] nvme-cli: update Firmware Commit with boot partition feature
Minwoo Im
minwoo.im.dev at gmail.com
Sun Dec 17 01:58:41 PST 2017
NVMe 1.3 spec introduced boot partition feature to Firmware Commit
command.
Make it support boot partition feature in Firmware Commit command.
Signed-off-by: Minwoo Im <minwoo.im.dev at gmail.com>
---
nvme-ioctl.c | 2 +-
nvme-ioctl.h | 2 +-
nvme.c | 33 ++++++++++++++++++++++++---------
3 files changed, 26 insertions(+), 11 deletions(-)
diff --git a/nvme-ioctl.c b/nvme-ioctl.c
index f735ecc..c0d7775 100644
--- a/nvme-ioctl.c
+++ b/nvme-ioctl.c
@@ -650,7 +650,7 @@ int nvme_fw_download(int fd, __u32 offset, __u32 data_len, void *data)
return nvme_submit_admin_passthru(fd, &cmd);
}
-int nvme_fw_activate(int fd, __u8 slot, __u8 action)
+int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid)
{
struct nvme_admin_cmd cmd = {
.opcode = nvme_admin_activate_fw,
diff --git a/nvme-ioctl.h b/nvme-ioctl.h
index 7cc80c8..6a3b52b 100644
--- a/nvme-ioctl.h
+++ b/nvme-ioctl.h
@@ -106,7 +106,7 @@ int nvme_ns_attach_ctrls(int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist);
int nvme_ns_detach_ctrls(int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist);
int nvme_fw_download(int fd, __u32 offset, __u32 data_len, void *data);
-int nvme_fw_activate(int fd, __u8 slot, __u8 action);
+int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid);
int nvme_sec_send(int fd, __u32 nsid, __u8 nssf, __u16 spsp,
__u8 secp, __u32 tl, __u32 data_len, void *data, __u32 *result);
diff --git a/nvme.c b/nvme.c
index bb9feaa..d9cb5db 100644
--- a/nvme.c
+++ b/nvme.c
@@ -1787,23 +1787,27 @@ static int fw_commit(int argc, char **argv, struct command *cmd, struct plugin *
"reset following firmware activation. A reset may be issued "\
"with an 'echo 1 > /sys/class/nvme/nvmeX/reset_controller'. "\
"Ensure nvmeX is the device you just activated before reset.";
- const char *slot = "firmware slot to activate";
- const char *action = "[0-2]: replacement action";
+ const char *slot = "[0-7]: firmware slot for commit action";
+ const char *action = "[0-7]: commit action";
+ const char *bpid = "[0,1]: boot partition identifier, if applicable (default: 0)";
int err, fd;
struct config {
__u8 slot;
__u8 action;
+ __u8 bpid;
};
struct config cfg = {
.slot = 0,
.action = 0,
+ .bpid = 0,
};
const struct argconfig_commandline_options command_line_options[] = {
{"slot", 's', "NUM", CFG_BYTE, &cfg.slot, required_argument, slot},
{"action", 'a', "NUM", CFG_BYTE, &cfg.action, required_argument, action},
+ {"bpid", 'b', "NUM", CFG_BYTE, &cfg.bpid, required_argument, bpid},
{NULL}
};
@@ -1815,30 +1819,41 @@ static int fw_commit(int argc, char **argv, struct command *cmd, struct plugin *
fprintf(stderr, "invalid slot:%d\n", cfg.slot);
return EINVAL;
}
- if (cfg.action > 3) {
+ if (cfg.action > 7 || cfg.action == 4 || cfg.action == 5) {
fprintf(stderr, "invalid action:%d\n", cfg.action);
return EINVAL;
}
+ if (cfg.bpid > 1) {
+ fprintf(stderr, "invalid boot partition id:%d\n", cfg.bpid);
+ return EINVAL;
+ }
- err = nvme_fw_activate(fd, cfg.slot, cfg.action);
+ err = nvme_fw_commit(fd, cfg.slot, cfg.action, cfg.bpid);
if (err < 0)
- perror("fw-activate");
+ perror("fw-commit");
else if (err != 0)
switch (err & 0x3ff) {
case NVME_SC_FW_NEEDS_CONV_RESET:
case NVME_SC_FW_NEEDS_SUBSYS_RESET:
case NVME_SC_FW_NEEDS_RESET:
- printf("Success activating firmware action:%d slot:%d, but firmware requires %s reset\n",
- cfg.action, cfg.slot, nvme_fw_status_reset_type(err));
+ printf("Success activating firmware action:%d slot:%d",
+ cfg.action, cfg.slot);
+ if (cfg.action == 6 || cfg.action == 7)
+ printf(" bpid:%d", cfg.bpid);
+ printf(", but firmware requires %s reset\n", nvme_fw_status_reset_type(err));
break;
default:
fprintf(stderr, "NVME Admin command error:%s(%x)\n",
nvme_status_to_string(err), err);
break;
}
- else
- printf("Success activating firmware action:%d slot:%d\n",
+ else {
+ printf("Success committing firmware action:%d slot:%d",
cfg.action, cfg.slot);
+ if (cfg.action == 6 || cfg.action == 7)
+ printf(" bpid:%d", cfg.bpid);
+ printf("\n");
+ }
return err;
}
--
2.7.4
More information about the Linux-nvme
mailing list