aboutsummaryrefslogtreecommitdiff
path: root/sbin/nvmecontrol
diff options
context:
space:
mode:
authorSimon J. Gerraty <sjg@FreeBSD.org>2014-04-28 07:50:45 +0000
committerSimon J. Gerraty <sjg@FreeBSD.org>2014-04-28 07:50:45 +0000
commit3b8f08459569bf0faa21473e5cec2491e95c9349 (patch)
tree80f45dd81ca716bcd7ca9674581e1fc40b93cd34 /sbin/nvmecontrol
parent9d2ab4a62d6733c45958627ac113bdbd818d1e2a (diff)
parentb2ba55951383498f252746f618d513139da06e8e (diff)
downloadsrc-3b8f08459569bf0faa21473e5cec2491e95c9349.tar.gz
src-3b8f08459569bf0faa21473e5cec2491e95c9349.zip
Merge head
Notes
Notes: svn path=/projects/bmake/; revision=265044
Diffstat (limited to 'sbin/nvmecontrol')
-rw-r--r--sbin/nvmecontrol/devlist.c4
-rw-r--r--sbin/nvmecontrol/firmware.c35
-rw-r--r--sbin/nvmecontrol/perftest.c2
3 files changed, 26 insertions, 15 deletions
diff --git a/sbin/nvmecontrol/devlist.c b/sbin/nvmecontrol/devlist.c
index f73d643e93d2..35a46c187a7f 100644
--- a/sbin/nvmecontrol/devlist.c
+++ b/sbin/nvmecontrol/devlist.c
@@ -99,11 +99,11 @@ devlist(int argc, char *argv[])
sprintf(name, "%s%d%s%d", NVME_CTRLR_PREFIX, ctrlr,
NVME_NS_PREFIX, i+1);
read_namespace_data(fd, i+1, &nsdata);
- printf(" %10s (%lldGB)\n",
+ printf(" %10s (%lldMB)\n",
name,
nsdata.nsze *
(long long)ns_get_sector_size(&nsdata) /
- 1024 / 1024 / 1024);
+ 1024 / 1024);
}
close(fd);
diff --git a/sbin/nvmecontrol/firmware.c b/sbin/nvmecontrol/firmware.c
index cb7fb0f9d55d..281fabe5a033 100644
--- a/sbin/nvmecontrol/firmware.c
+++ b/sbin/nvmecontrol/firmware.c
@@ -141,7 +141,7 @@ update_firmware(int fd, uint8_t *payload, int32_t payload_size)
}
}
-static void
+static int
activate_firmware(int fd, int slot, int activate_action)
{
struct nvme_pt_command pt;
@@ -154,8 +154,14 @@ activate_firmware(int fd, int slot, int activate_action)
if (ioctl(fd, NVME_PASSTHROUGH_CMD, &pt) < 0)
err(1, "firmware activate request failed");
+ if (pt.cpl.status.sct == NVME_SCT_COMMAND_SPECIFIC &&
+ pt.cpl.status.sc == NVME_SC_FIRMWARE_REQUIRES_RESET)
+ return 1;
+
if (nvme_completion_is_error(&pt.cpl))
errx(1, "firmware activate request returned error");
+
+ return 0;
}
static void
@@ -171,6 +177,7 @@ firmware(int argc, char *argv[])
{
int fd = -1, slot = 0;
int a_flag, s_flag, f_flag;
+ int activate_action, reboot_required;
char ch, *p, *image = NULL;
char *controller = NULL, prompt[64];
void *buf = NULL;
@@ -287,21 +294,27 @@ firmware(int argc, char *argv[])
if (f_flag) {
update_firmware(fd, buf, size);
if (a_flag)
- activate_firmware(fd, slot,
- NVME_AA_REPLACE_ACTIVATE);
+ activate_action = NVME_AA_REPLACE_ACTIVATE;
else
- activate_firmware(fd, slot,
- NVME_AA_REPLACE_NO_ACTIVATE);
+ activate_action = NVME_AA_REPLACE_NO_ACTIVATE;
} else {
- activate_firmware(fd, slot, NVME_AA_ACTIVATE);
+ activate_action = NVME_AA_ACTIVATE;
}
+ reboot_required = activate_firmware(fd, slot, activate_action);
+
if (a_flag) {
- printf("New firmware image activated and will take "
- "effect after next controller reset.\n"
- "Controller reset can be initiated via "
- "'nvmecontrol reset %s'\n",
- controller);
+ if (reboot_required) {
+ printf("New firmware image activated but requires "
+ "conventional reset (i.e. reboot) to "
+ "complete activation.\n");
+ } else {
+ printf("New firmware image activated and will take "
+ "effect after next controller reset.\n"
+ "Controller reset can be initiated via "
+ "'nvmecontrol reset %s'\n",
+ controller);
+ }
}
close(fd);
diff --git a/sbin/nvmecontrol/perftest.c b/sbin/nvmecontrol/perftest.c
index 15e49757e2be..cc9119826f70 100644
--- a/sbin/nvmecontrol/perftest.c
+++ b/sbin/nvmecontrol/perftest.c
@@ -64,8 +64,6 @@ print_perftest(struct nvme_io_test *io_test, bool perthread)
for (i = 0; i < io_test->num_threads; i++)
printf("\t%3d: %8ju IO/s\n", i,
(uintmax_t)io_test->io_completed[i]/io_test->time);
-
- exit(1);
}
static void