From: leonardo.da.cunha Date: Mon, 16 Oct 2023 16:33:09 +0000 (-0700) Subject: plugins/ocp: Reorganized clear feature code for better reuse X-Git-Tag: v2.7~43 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=ef918d1e8bad5b4d1ae49cd9d6c3e3861bd395c8;p=users%2Fsagi%2Fnvme-cli.git plugins/ocp: Reorganized clear feature code for better reuse Signed-off-by: leonardo.da.cunha --- diff --git a/plugins/ocp/meson.build b/plugins/ocp/meson.build index 405ee512..64447ff6 100644 --- a/plugins/ocp/meson.build +++ b/plugins/ocp/meson.build @@ -1,7 +1,7 @@ sources += [ 'plugins/ocp/ocp-utils.c', 'plugins/ocp/ocp-nvme.c', - 'plugins/ocp/ocp-clear-fw-update-history.c', + 'plugins/ocp/ocp-clear-features.c', 'plugins/ocp/ocp-smart-extended-log.c', 'plugins/ocp/ocp-fw-activation-history.c', ] diff --git a/plugins/ocp/ocp-clear-features.c b/plugins/ocp/ocp-clear-features.c new file mode 100644 index 00000000..7c4e7e53 --- /dev/null +++ b/plugins/ocp/ocp-clear-features.c @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2022 Solidigm. + * + * Authors: haro.panosyan@solidigm.com + * leonardo.da.cunha@solidigm.com + */ + +#include +#include "ocp-utils.h" +#include "nvme-print.h" + +static const __u8 OCP_FID_CLEAR_FW_ACTIVATION_HISTORY = 0xC1; +static const __u8 OCP_FID_CLEAR_PCIE_CORRECTABLE_ERROR_COUNTERS = 0xC3; + +static int ocp_clear_feature(int argc, char **argv, const char *desc, const __u8 fid) +{ + __u32 result = 0; + __u32 clear = 1 << 31; + struct nvme_dev *dev; + int uuid_index = 0; + bool uuid = true; + int err; + + OPT_ARGS(opts) = { + OPT_FLAG("no-uuid", 'n', NULL, + "Skip UUID index search (UUID index not required for OCP 1.0)"), + OPT_END() + }; + + err = parse_and_open(&dev, argc, argv, desc, opts); + if (err) + return err; + + if (opts[0].seen) + uuid = false; + + if (uuid) { + /* OCP 2.0 requires UUID index support */ + err = ocp_get_uuid_index(dev, &uuid_index); + if (err || !uuid_index) { + fprintf(stderr, "ERROR: No OCP UUID index found\n"); + goto close_dev; + } + } + + struct nvme_set_features_args args = { + .result = &result, + .data = NULL, + .args_size = sizeof(args), + .fd = dev_fd(dev), + .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, + .nsid = 0, + .cdw11 = clear, + .cdw12 = 0, + .cdw13 = 0, + .cdw15 = 0, + .data_len = 0, + .save = 0, + .uuidx = uuid_index, + .fid = fid, + }; + + err = nvme_set_features(&args); + + if (err == 0) + printf("Success : %s\n", desc); + else if (err > 0) + nvme_show_status(err); + else + printf("Fail : %s\n", desc); +close_dev: + /* Redundant close() to make static code analysis happy */ + close(dev->direct.fd); + dev_close(dev); + return err; +} + +int ocp_clear_fw_update_history(int argc, char **argv, struct command *cmd, struct plugin *plugin) +{ + const char *desc = "OCP Clear Firmware Update History"; + + return ocp_clear_feature(argc, argv, desc, OCP_FID_CLEAR_FW_ACTIVATION_HISTORY); +} + +int ocp_clear_pcie_corectable_error_counters(int argc, char **argv, struct command *cmd, + struct plugin *plugin) +{ + const char *desc = "OCP Clear PCIe Correctable Error Counters"; + + return ocp_clear_feature(argc, argv, desc, + OCP_FID_CLEAR_PCIE_CORRECTABLE_ERROR_COUNTERS); +} diff --git a/plugins/ocp/ocp-clear-features.h b/plugins/ocp/ocp-clear-features.h new file mode 100644 index 00000000..cbecd4b7 --- /dev/null +++ b/plugins/ocp/ocp-clear-features.h @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Copyright (c) 2022 Solidigm. + * + * Authors: haro.panosyan@solidigm.com + * leonardo.da.cunha@solidigm.com + */ + +int ocp_clear_fw_update_history(int argc, char **argv, struct command *cmd, struct plugin *plugin); + +int ocp_clear_pcie_corectable_error_counters(int argc, char **argv, struct command *cmd, + struct plugin *plugin); diff --git a/plugins/ocp/ocp-clear-fw-update-history.c b/plugins/ocp/ocp-clear-fw-update-history.c deleted file mode 100644 index 6b256b16..00000000 --- a/plugins/ocp/ocp-clear-fw-update-history.c +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * Copyright (c) 2022 Solidigm. - * - * Authors: haro.panosyan@solidigm.com - * leonardo.da.cunha@solidigm.com - */ - -#include -#include "ocp-utils.h" -#include "nvme-print.h" - -static const __u8 OCP_FID_CLEAR_FW_ACTIVATION_HISTORY = 0xC1; - -int ocp_clear_fw_update_history(int argc, char **argv, struct command *cmd, struct plugin *plugin) -{ - const char *desc = "OCP Clear Firmware Update History"; - - return ocp_clear_feature(argc, argv, desc, OCP_FID_CLEAR_FW_ACTIVATION_HISTORY); -} diff --git a/plugins/ocp/ocp-clear-fw-update-history.h b/plugins/ocp/ocp-clear-fw-update-history.h deleted file mode 100644 index cd0844c8..00000000 --- a/plugins/ocp/ocp-clear-fw-update-history.h +++ /dev/null @@ -1,10 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0-or-later */ -/* - * Copyright (c) 2022 Solidigm. - * - * Authors: haro.panosyan@solidigm.com - * leonardo.da.cunha@solidigm.com - */ - -int ocp_clear_fw_update_history(int argc, char **argv, - struct command *cmd, struct plugin *plugin); diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c index cc67a091..cebb0d9d 100644 --- a/plugins/ocp/ocp-nvme.c +++ b/plugins/ocp/ocp-nvme.c @@ -25,7 +25,7 @@ #include "nvme-print.h" #include "ocp-smart-extended-log.h" -#include "ocp-clear-fw-update-history.h" +#include "ocp-clear-features.h" #include "ocp-fw-activation-history.h" #define CREATE_CMD @@ -2106,8 +2106,6 @@ static int get_plp_health_check_interval(int argc, char **argv, struct command * /////////////////////////////////////////////////////////////////////////////// /// Misc -static const __u8 OCP_FID_CLEAR_PCIE_CORRECTABLE_ERROR_COUNTERS = 0xC3; - static int clear_fw_update_history(int argc, char **argv, struct command *cmd, struct plugin *plugin) { @@ -2120,14 +2118,10 @@ static int smart_add_log(int argc, char **argv, struct command *cmd, return ocp_smart_add_log(argc, argv, cmd, plugin); } -static int clear_pcie_corectable_error_counters(int argc, char **argv, - struct command *cmd, +static int clear_pcie_corectable_error_counters(int argc, char **argv, struct command *cmd, struct plugin *plugin) { - const char *desc = "OCP Clear PCIe Correctable Error Counters"; - - return ocp_clear_feature(argc, argv, desc, - OCP_FID_CLEAR_PCIE_CORRECTABLE_ERROR_COUNTERS); + return ocp_clear_pcie_corectable_error_counters(argc, argv, cmd, plugin); } static int fw_activation_history_log(int argc, char **argv, struct command *cmd, diff --git a/plugins/ocp/ocp-utils.c b/plugins/ocp/ocp-utils.c index a37a58c6..1257b300 100644 --- a/plugins/ocp/ocp-utils.c +++ b/plugins/ocp/ocp-utils.c @@ -30,66 +30,3 @@ int ocp_get_uuid_index(struct nvme_dev *dev, int *index) } return err; } - -int ocp_clear_feature(int argc, char **argv, const char *desc, const __u8 fid) -{ - __u32 result = 0; - __u32 clear = 1 << 31; - struct nvme_dev *dev; - int uuid_index = 0; - bool uuid = true; - int err; - - OPT_ARGS(opts) = { - OPT_FLAG("no-uuid", 'n', NULL, - "Skip UUID index search (UUID index not required for OCP 1.0)"), - OPT_END() - }; - - err = parse_and_open(&dev, argc, argv, desc, opts); - if (err) - return err; - - if (opts[0].seen) - uuid = false; - - if (uuid) { - /* OCP 2.0 requires UUID index support */ - err = ocp_get_uuid_index(dev, &uuid_index); - if (err || !uuid_index) { - fprintf(stderr, "ERROR: No OCP UUID index found\n"); - goto close_dev; - } - } - - struct nvme_set_features_args args = { - .result = &result, - .data = NULL, - .args_size = sizeof(args), - .fd = dev_fd(dev), - .timeout = NVME_DEFAULT_IOCTL_TIMEOUT, - .nsid = 0, - .cdw11 = clear, - .cdw12 = 0, - .cdw13 = 0, - .cdw15 = 0, - .data_len = 0, - .save = 0, - .uuidx = uuid_index, - .fid = fid, - }; - - err = nvme_set_features(&args); - - if (err == 0) - printf("Success : %s\n", desc); - else if (err > 0) - nvme_show_status(err); - else - printf("Fail : %s\n", desc); -close_dev: - /* Redundant close() to make static code analysis happy */ - close(dev->direct.fd); - dev_close(dev); - return err; -} diff --git a/plugins/ocp/ocp-utils.h b/plugins/ocp/ocp-utils.h index 76a4b941..d02bea99 100644 --- a/plugins/ocp/ocp-utils.h +++ b/plugins/ocp/ocp-utils.h @@ -16,5 +16,3 @@ * Return: Zero if nvme device has UUID list log page, or result of get uuid list otherwise. */ int ocp_get_uuid_index(struct nvme_dev *dev, int *index); - -int ocp_clear_feature(int argc, char **argv, const char *desc, const __u8 fid); diff --git a/plugins/solidigm/solidigm-nvme.c b/plugins/solidigm/solidigm-nvme.c index a000f8eb..ecb515a0 100644 --- a/plugins/solidigm/solidigm-nvme.c +++ b/plugins/solidigm/solidigm-nvme.c @@ -20,7 +20,7 @@ #include "solidigm-market-log.h" #include "solidigm-temp-stats.h" -#include "plugins/ocp/ocp-clear-fw-update-history.h" +#include "plugins/ocp/ocp-clear-features.h" #include "plugins/ocp/ocp-smart-extended-log.h" #include "plugins/ocp/ocp-fw-activation-history.h"