__u16 *ctrlist, bool attach);
int nvme_fw_download(int fd, __u32 offset, __u32 data_len, void *data);
-int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid);
+int nvme_fw_commit(int fd, __u8 slot, __u8 action, __u8 bpid, __u32 *result);
int nvme_sec_send(int fd, __u32 nsid, __u8 nssf, __u16 spsp,
- __u8 secp, __u32 tl, __u32 data_len, void *data);
+ __u8 secp, __u32 data_len, void *data);
int nvme_sec_recv(int fd, __u32 nsid, __u8 nssf, __u16 spsp,
__u8 secp, __u32 al, __u32 data_len, void *data);
if (fd < 0)
goto ret;
- err = fstat(sec_fd, &sb);
- if (err < 0) {
- perror("fstat");
- goto close_sec_fd;
+ if (cfg.tl == 0) {
+ fprintf(stderr, "--tl unspecified or zero\n");
+ err = -EINVAL;
+ goto close_fd;
+ }
++
+ sec_fd = open(cfg.file, O_RDONLY);
+ if (sec_fd < 0) {
+ fprintf(stderr, "Failed to open %s: %s\n",
+ cfg.file, strerror(errno));
+ errno = EINVAL;
+ err = -1;
+ goto close_fd;
+ }
+
+ if ((cfg.tl & 3) != 0)
+ fprintf(stderr, "WARNING: --tl not dword aligned; unaligned bytes may be truncated\n");
+
+ if (strlen(cfg.file) == 0) {
+ sec_fd = STDIN_FILENO;
+ sec_size = cfg.tl;
+ } else {
+ sec_fd = open(cfg.file, O_RDONLY);
+ if (sec_fd < 0) {
+ fprintf(stderr, "Failed to open %s: %s\n",
+ cfg.file, strerror(errno));
+ err = -EINVAL;
+ goto close_fd;
+ }
+
+ err = fstat(sec_fd, &sb);
+ if (err < 0) {
+ perror("fstat");
+ goto close_sec_fd;
+ }
+
+ sec_size = cfg.tl > sb.st_size ? cfg.tl : sb.st_size;
}
- if (posix_memalign(&sec_buf, getpagesize(), cfg.tl)) {
- fprintf(stderr, "No memory for security size:%d\n", cfg.tl);
- err = -ENOMEM;
+ sec_size = sb.st_size;
+ if (posix_memalign(&sec_buf, getpagesize(), sec_size)) {
+ fprintf(stderr, "No memory for security size:%d\n", sec_size);
+ errno = ENOMEM;
+ err = -1;
goto close_sec_fd;
}