@@ -404,7 +404,10 @@ void nvdimm_bus_destroy_ndctl(struct nvdimm_bus *nvdimm_bus)
}
static const struct nd_cmd_desc __nd_cmd_dimm_descs[] = {
- [ND_CMD_IMPLEMENTED] = { },
+ [ND_CMD_IMPLEMENTED] = {
+ .out_num = 1,
+ .out_sizes = { 8, },
+ },
[ND_CMD_SMART] = {
.out_num = 2,
.out_sizes = { 4, 8, },
@@ -456,7 +459,10 @@ const struct nd_cmd_desc *nd_cmd_dimm_desc(int cmd)
EXPORT_SYMBOL_GPL(nd_cmd_dimm_desc);
static const struct nd_cmd_desc __nd_cmd_bus_descs[] = {
- [ND_CMD_IMPLEMENTED] = { },
+ [ND_CMD_IMPLEMENTED] = {
+ .out_num = 1,
+ .out_sizes = { 1, },
+ },
[ND_CMD_ARS_CAP] = {
.in_num = 2,
.in_sizes = { 8, 8, },
@@ -20,6 +20,10 @@ struct nd_cmd_smart {
__u8 data[128];
} __packed;
+struct nd_cmd_mask {
+ __u8 data[8];
+} __packed;
+
struct nd_cmd_smart_threshold {
__u32 status;
__u8 data[8];
@@ -137,6 +141,7 @@ enum {
static inline const char *nvdimm_bus_cmd_name(unsigned cmd)
{
static const char * const names[] = {
+ [ND_CMD_IMPLEMENTED] = "cmd_mask",
[ND_CMD_ARS_CAP] = "ars_cap",
[ND_CMD_ARS_START] = "ars_start",
[ND_CMD_ARS_STATUS] = "ars_status",
@@ -152,6 +157,7 @@ static inline const char *nvdimm_bus_cmd_name(unsigned cmd)
static inline const char *nvdimm_cmd_name(unsigned cmd)
{
static const char * const names[] = {
+ [ND_CMD_IMPLEMENTED] = "cmd_mask",
[ND_CMD_SMART] = "smart",
[ND_CMD_SMART_THRESHOLD] = "smart_thresh",
[ND_CMD_DIMM_FLAGS] = "flags",
@@ -171,6 +177,9 @@ static inline const char *nvdimm_cmd_name(unsigned cmd)
#define ND_IOCTL 'N'
+#define ND_IOCTL_CMD_MASK _IOWR(ND_IOCTL, ND_CMD_IMPLEMENTED,\
+ struct nd_cmd_mask)
+
#define ND_IOCTL_SMART _IOWR(ND_IOCTL, ND_CMD_SMART,\
struct nd_cmd_smart)
The pass thru calls return command mask. Previously, bit zero wasn't part of command mask, but as it is now, this left commands_show displaying "unknown" for function zero. Add an ioctl interface to return command mask. Signed-off-by: Jerry Hoemann <jerry.hoemann@hpe.com> --- drivers/nvdimm/bus.c | 10 ++++++++-- include/uapi/linux/ndctl.h | 9 +++++++++ 2 files changed, 17 insertions(+), 2 deletions(-)