Adding all option to allow ndctl to update all DIMMs at once.
Signed-off-by: Dave Jiang <dave.jiang(a)intel.com>
---
ndctl/update.c | 25 ++++++++++++++++---------
1 file changed, 16 insertions(+), 9 deletions(-)
diff --git a/ndctl/update.c b/ndctl/update.c
index fc26acf..1b771ff 100644
--- a/ndctl/update.c
+++ b/ndctl/update.c
@@ -77,6 +77,7 @@ struct update_context {
struct ndctl_dimm *dimm;
struct fw_info dimm_fw;
struct ndctl_cmd *start;
+ bool all;
};
/*
@@ -471,16 +472,23 @@ static int get_ndctl_dimm(struct update_context *uctx, void *ctx)
{
struct ndctl_dimm *dimm;
struct ndctl_bus *bus;
+ int rc = -ENODEV;
ndctl_bus_foreach(ctx, bus)
ndctl_dimm_foreach(bus, dimm) {
- if (!util_dimm_filter(dimm, uctx->dimm_id))
+ if (!uctx->all &&
+ !util_dimm_filter(dimm, uctx->dimm_id))
continue;
uctx->dimm = dimm;
- return 0;
+ rc = update_firmware(uctx);
+ if (rc < 0) {
+ error("Update firmware for dimm %s failed\n",
+ ndctl_dimm_get_devname(dimm));
+ continue;
+ }
}
- return -ENODEV;
+ return rc;
}
static int verify_fw_file(struct update_context *uctx)
@@ -573,18 +581,17 @@ int cmd_update_firmware(int argc, const char **argv, void *ctx)
return rc;
}
+ if (strcmp(uctx.dimm_id, "all") == 0)
+ uctx.all = true;
+ else
+ uctx.all = false;
+
rc = get_ndctl_dimm(&uctx, ctx);
if (rc < 0) {
error("DIMM %s not found", uctx.dimm_id);
return rc;
}
- rc = update_firmware(&uctx);
- if (rc < 0) {
- error("Update firmware failed");
- return rc;
- }
-
if (uctx.start)
ndctl_cmd_unref(uctx.start);