nvme-cli: update Firmware Commit with boot partition feature
PATCH v2 2/3 nvme-cli: update Firmware Commit with boot partition feature
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(-)
nvme-ioctl.c +1 -1
@@ -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,
nvme-ioctl.h +1 -1
@@ -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);
nvme.c +24 -9
@@ -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; }
Signature · 1 line
2.7.4