]> www.infradead.org Git - users/sagi/nvme-cli.git/commitdiff
nvme: Support effects-log for fabrics ctrl
authorDaniel Wagner <dwagner@suse.de>
Fri, 3 Feb 2023 10:16:11 +0000 (11:16 +0100)
committerDaniel Wagner <dwagner@suse.de>
Fri, 3 Feb 2023 10:17:38 +0000 (11:17 +0100)
nvme-cli v1.16 supported effects-log for fabric devices only, nvme-cli
2.x supported only memory based transports (aka PCI). Obviously, we
should support effects-log independent of the transport type.

Do this by first trying to map the PCI registers and read the CAP
property if this fails fall back using the get-properties approach.

Signed-off-by: Daniel Wagner <dwagner@suse.de>
nvme.c

diff --git a/nvme.c b/nvme.c
index 350e8239d0b5f53ba08e1e53bca135a5ebad8434..aa5cec75f2bc8e982792c6a33b3dc88d9bf55d72 100644 (file)
--- a/nvme.c
+++ b/nvme.c
@@ -921,31 +921,36 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl
        list_head_init(&log_pages);
 
        if (cfg.csi < 0) {
-               nvme_root_t nvme_root;
-               uint64_t cap;
-               int nvme_command_set_supported;
-               int other_command_sets_supported;
-               nvme_root = nvme_scan(NULL);
-               bar = mmap_registers(nvme_root, dev);
-               nvme_free_tree(nvme_root);
-
-               if (!bar) {
-                       goto close_dev;
-               }
-               cap = mmio_read64(bar + NVME_REG_CAP);
-               munmap(bar, getpagesize());
+               nvme_root_t r;
+               __u64 cap;
 
-               nvme_command_set_supported = NVME_CAP_CSS(cap) & NVME_CAP_CSS_NVM;
-               other_command_sets_supported = NVME_CAP_CSS(cap) & NVME_CAP_CSS_CSI;
+               r = nvme_scan(NULL);
+               bar = mmap_registers(r, dev);
+               nvme_free_tree(r);
 
-               if (nvme_command_set_supported)
+               if (bar) {
+                       cap = mmio_read64(bar + NVME_REG_CAP);
+                       munmap(bar, getpagesize());
+               } else {
+                       struct nvme_get_property_args args = {
+                               .args_size      = sizeof(args),
+                               .fd             = dev_fd(dev),
+                               .offset         = NVME_REG_CAP,
+                               .value          = &cap,
+                               .timeout        = NVME_DEFAULT_IOCTL_TIMEOUT,
+                       };
+                       err = nvme_get_property(&args);
+                       if (err)
+                               goto close_dev;
+               }
+
+               if (NVME_CAP_CSS(cap) & NVME_CAP_CSS_NVM)
                        err = collect_effects_log(dev, NVME_CSI_NVM,
                                                  &log_pages, flags);
 
-               if (!err && other_command_sets_supported)
+               if (!err && (NVME_CAP_CSS(cap) & NVME_CAP_CSS_CSI))
                        err = collect_effects_log(dev, NVME_CSI_ZNS,
                                                  &log_pages, flags);
-
        } else {
                err = collect_effects_log(dev, cfg.csi, &log_pages, flags);
        }