Call back to a per-dimm-family operation that can provide a text description for the function number passed in ND_CMD_CALL invocations.
Signed-off-by: Dan Williams <[email protected]> --- ndctl/lib/intel.c | 17 +++++++++++++++++ ndctl/lib/libndctl.c | 37 +++++++++++++++++++++++++------------ ndctl/lib/private.h | 2 ++ 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/ndctl/lib/intel.c b/ndctl/lib/intel.c index af13c60d4f52..3e4260f9dbd1 100644 --- a/ndctl/lib/intel.c +++ b/ndctl/lib/intel.c @@ -283,7 +283,24 @@ intel_smart_set_threshold_field(spares) intel_smart_set_threshold_field(media_temperature) intel_smart_set_threshold_field(ctrl_temperature) +static const char *intel_cmd_desc(int fn) +{ + static const char *descs[] = { + [ND_INTEL_SMART] = "smart", + [ND_INTEL_SMART_THRESHOLD] = "smart_thresh", + [ND_INTEL_SMART_SET_THRESHOLD] = "smart_set_thresh", + }; + const char *desc = descs[fn]; + + if (fn >= (int) ARRAY_SIZE(descs)) + return "unknown"; + if (!desc) + return "unknown"; + return desc; +} + struct ndctl_dimm_ops * const intel_dimm_ops = &(struct ndctl_dimm_ops) { + .cmd_desc = intel_cmd_desc, .new_smart = intel_dimm_cmd_new_smart, .smart_get_flags = intel_cmd_smart_get_flags, .smart_get_health = intel_cmd_smart_get_health, diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c index d6d8a7f0c0b3..8471dd8c4f89 100644 --- a/ndctl/lib/libndctl.c +++ b/ndctl/lib/libndctl.c @@ -2372,26 +2372,39 @@ static int to_ioctl_cmd(int cmd, int dimm) } } +static const char *ndctl_dimm_get_cmd_subname(struct ndctl_cmd *cmd) +{ + struct ndctl_dimm *dimm = cmd->dimm; + struct ndctl_dimm_ops *ops = dimm ? dimm->ops : NULL; + + if (!dimm || cmd->type != ND_CMD_CALL || !ops || !ops->cmd_desc) + return NULL; + return ops->cmd_desc(cmd->pkg->nd_command); +} + static int do_cmd(int fd, int ioctl_cmd, struct ndctl_cmd *cmd) { int rc; u32 offset; - const char *name; + const char *name, *sub_name = NULL; + struct ndctl_dimm *dimm = cmd->dimm; struct ndctl_bus *bus = cmd_to_bus(cmd); struct ndctl_cmd_iter *iter = &cmd->iter; struct ndctl_ctx *ctx = ndctl_bus_get_ctx(bus); - if (cmd->dimm) - name = ndctl_dimm_get_cmd_name(cmd->dimm, cmd->type); - else + if (dimm) { + name = ndctl_dimm_get_cmd_name(dimm, cmd->type); + sub_name = ndctl_dimm_get_cmd_subname(cmd); + } else name = ndctl_bus_get_cmd_name(cmd->bus, cmd->type); + if (iter->total_xfer == 0) { rc = ioctl(fd, ioctl_cmd, cmd->cmd_buf); - dbg(ctx, "bus: %d dimm: %#x cmd: %s status: %d fw: %d (%s)\n", - bus->id, cmd->dimm - ? ndctl_dimm_get_handle(cmd->dimm) : 0, - name, rc, *(cmd->firmware_status), rc < 0 ? + dbg(ctx, "bus: %d dimm: %#x cmd: %s%s%s status: %d fw: %d (%s)\n", + bus->id, dimm ? ndctl_dimm_get_handle(dimm) : 0, + name, sub_name ? ":" : "", sub_name ? sub_name : "", + rc, *(cmd->firmware_status), rc < 0 ? strerror(errno) : "success"); if (rc < 0) return -errno; @@ -2421,10 +2434,10 @@ static int do_cmd(int fd, int ioctl_cmd, struct ndctl_cmd *cmd) } } - dbg(ctx, "bus: %d dimm: %#x cmd: %s total: %d max_xfer: %d status: %d fw: %d (%s)\n", - bus->id, - cmd->dimm ? ndctl_dimm_get_handle(cmd->dimm) : 0, - name, iter->total_xfer, iter->max_xfer, rc, + dbg(ctx, "bus: %d dimm: %#x cmd: %s%s%s total: %d max_xfer: %d status: %d fw: %d (%s)\n", + bus->id, dimm ? ndctl_dimm_get_handle(dimm) : 0, + name, sub_name ? ":" : "", sub_name ? sub_name : "", + iter->total_xfer, iter->max_xfer, rc, *(cmd->firmware_status), rc < 0 ? strerror(errno) : "success"); diff --git a/ndctl/lib/private.h b/ndctl/lib/private.h index 490de96f6ce6..67260970bfb2 100644 --- a/ndctl/lib/private.h +++ b/ndctl/lib/private.h @@ -260,6 +260,7 @@ struct ndctl_cmd { struct nd_cmd_ars_start ars_start[0]; struct nd_cmd_ars_status ars_status[0]; struct nd_cmd_clear_error clear_err[0]; + struct nd_cmd_pkg pkg[0]; struct ndn_pkg_hpe1 hpe1[0]; struct ndn_pkg_msft msft[0]; struct nd_pkg_intel intel[0]; @@ -278,6 +279,7 @@ struct ndctl_bb { }; struct ndctl_dimm_ops { + const char *(*cmd_desc)(int); struct ndctl_cmd *(*new_smart)(struct ndctl_dimm *); unsigned int (*smart_get_flags)(struct ndctl_cmd *); unsigned int (*smart_get_health)(struct ndctl_cmd *); _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
