From 635faa73465527f75d2ea06b934329eab7eda5df Mon Sep 17 00:00:00 2001
From: Daniel Baumann <daniel@debian.org>
Date: Thu, 20 Mar 2025 08:10:44 +0100
Subject: [PATCH] Merging upstream version 2.12.

Signed-off-by: Daniel Baumann <daniel@debian.org>
---
 .checkpatch.conf                              |   24 +
 .github/workflows/coverage.yml                |    5 +-
 .github/workflows/run-nightly-tests.yml       |   49 +-
 Documentation/cmd-plugins.txt                 |   33 +
 Documentation/meson.build                     |    1 +
 Documentation/nvme-admin-passthru.1           |    4 +-
 Documentation/nvme-admin-passthru.html        |    4 +-
 Documentation/nvme-ana-log.1                  |    4 +-
 Documentation/nvme-ana-log.html               |    4 +-
 Documentation/nvme-attach-ns.1                |    8 +-
 Documentation/nvme-attach-ns.html             |    8 +-
 Documentation/nvme-attach-ns.txt              |    5 +-
 Documentation/nvme-ave-discovery-log.txt      |   51 +
 Documentation/nvme-boot-part-log.1            |    4 +-
 Documentation/nvme-boot-part-log.html         |    4 +-
 Documentation/nvme-capacity-mgmt.1            |    4 +-
 Documentation/nvme-capacity-mgmt.html         |    4 +-
 .../nvme-changed-alloc-ns-list-log.txt        |   67 +
 Documentation/nvme-changed-ns-list-log.1      |    4 +-
 Documentation/nvme-changed-ns-list-log.html   |    4 +-
 Documentation/nvme-cmdset-ind-id-ns.1         |    4 +-
 Documentation/nvme-cmdset-ind-id-ns.html      |    4 +-
 Documentation/nvme-compare.1                  |    4 +-
 Documentation/nvme-compare.html               |    4 +-
 Documentation/nvme-connect-all.1              |    4 +-
 Documentation/nvme-connect-all.html           |    4 +-
 Documentation/nvme-connect.1                  |    4 +-
 Documentation/nvme-connect.html               |    4 +-
 Documentation/nvme-copy.1                     |    4 +-
 Documentation/nvme-copy.html                  |    4 +-
 Documentation/nvme-create-ns.1                |    8 +-
 Documentation/nvme-create-ns.html             |   10 +-
 Documentation/nvme-create-ns.txt              |    6 +-
 Documentation/nvme-dapustor-smart-log-add.1   |    4 +-
 .../nvme-dapustor-smart-log-add.html          |    4 +-
 Documentation/nvme-delete-ns.1                |    4 +-
 Documentation/nvme-delete-ns.html             |    4 +-
 Documentation/nvme-dera-stat.1                |    4 +-
 Documentation/nvme-dera-stat.html             |    4 +-
 Documentation/nvme-detach-ns.1                |    4 +-
 Documentation/nvme-detach-ns.html             |    4 +-
 Documentation/nvme-device-self-test.1         |    4 +-
 Documentation/nvme-device-self-test.html      |    4 +-
 Documentation/nvme-dim.1                      |    4 +-
 Documentation/nvme-dim.html                   |    4 +-
 Documentation/nvme-dir-receive.1              |    4 +-
 Documentation/nvme-dir-receive.html           |    4 +-
 Documentation/nvme-dir-send.1                 |    4 +-
 Documentation/nvme-dir-send.html              |    4 +-
 Documentation/nvme-disconnect-all.1           |    4 +-
 Documentation/nvme-disconnect-all.html        |    4 +-
 Documentation/nvme-disconnect.1               |    4 +-
 Documentation/nvme-disconnect.html            |    4 +-
 Documentation/nvme-discover.1                 |    4 +-
 Documentation/nvme-discover.html              |    4 +-
 ...vme-dispersed-ns-participating-nss-log.txt |   55 +
 Documentation/nvme-dsm.1                      |    4 +-
 Documentation/nvme-dsm.html                   |    4 +-
 Documentation/nvme-effects-log.1              |    4 +-
 Documentation/nvme-effects-log.html           |    4 +-
 Documentation/nvme-endurance-event-agg-log.1  |    4 +-
 .../nvme-endurance-event-agg-log.html         |    4 +-
 Documentation/nvme-endurance-log.1            |    4 +-
 Documentation/nvme-endurance-log.html         |    4 +-
 Documentation/nvme-error-log.1                |    4 +-
 Documentation/nvme-error-log.html             |    4 +-
 Documentation/nvme-fdp-configs.1              |    4 +-
 Documentation/nvme-fdp-configs.html           |    4 +-
 Documentation/nvme-fdp-events.1               |    4 +-
 Documentation/nvme-fdp-events.html            |    4 +-
 Documentation/nvme-fdp-feature.1              |   86 ++
 ...-close-zone.html => nvme-fdp-feature.html} |   76 +-
 Documentation/nvme-fdp-feature.txt            |   56 +
 Documentation/nvme-fdp-set-events.1           |    4 +-
 Documentation/nvme-fdp-set-events.html        |    4 +-
 Documentation/nvme-fdp-stats.1                |    4 +-
 Documentation/nvme-fdp-stats.html             |    4 +-
 Documentation/nvme-fdp-status.1               |    4 +-
 Documentation/nvme-fdp-status.html            |    4 +-
 Documentation/nvme-fdp-update.1               |    4 +-
 Documentation/nvme-fdp-update.html            |    4 +-
 Documentation/nvme-fdp-usage.1                |    4 +-
 Documentation/nvme-fdp-usage.html             |    4 +-
 Documentation/nvme-fid-support-effects-log.1  |    4 +-
 .../nvme-fid-support-effects-log.html         |    4 +-
 Documentation/nvme-flush.1                    |    4 +-
 Documentation/nvme-flush.html                 |    4 +-
 Documentation/nvme-format.1                   |    4 +-
 Documentation/nvme-format.html                |    4 +-
 Documentation/nvme-fw-commit.1                |    4 +-
 Documentation/nvme-fw-commit.html             |    4 +-
 Documentation/nvme-fw-download.1              |    4 +-
 Documentation/nvme-fw-download.html           |    4 +-
 Documentation/nvme-fw-log.1                   |    4 +-
 Documentation/nvme-fw-log.html                |    4 +-
 Documentation/nvme-gen-hostnqn.1              |    4 +-
 Documentation/nvme-gen-hostnqn.html           |    4 +-
 Documentation/nvme-get-feature.1              |    4 +-
 Documentation/nvme-get-feature.html           |    4 +-
 Documentation/nvme-get-lba-status.1           |    4 +-
 Documentation/nvme-get-lba-status.html        |    4 +-
 Documentation/nvme-get-log.1                  |    4 +-
 Documentation/nvme-get-log.html               |    4 +-
 Documentation/nvme-get-ns-id.1                |    4 +-
 Documentation/nvme-get-ns-id.html             |    4 +-
 Documentation/nvme-get-property.1             |    4 +-
 Documentation/nvme-get-property.html          |    4 +-
 Documentation/nvme-get-reg.txt                |    3 +
 Documentation/nvme-help.1                     |    4 +-
 Documentation/nvme-help.html                  |    4 +-
 Documentation/nvme-host-discovery-log.txt     |   57 +
 Documentation/nvme-huawei-id-ctrl.1           |    4 +-
 Documentation/nvme-huawei-id-ctrl.html        |    4 +-
 Documentation/nvme-huawei-list.1              |    4 +-
 Documentation/nvme-huawei-list.html           |    4 +-
 Documentation/nvme-id-ctrl.1                  |    4 +-
 Documentation/nvme-id-ctrl.html               |    4 +-
 Documentation/nvme-id-domain.1                |    4 +-
 Documentation/nvme-id-domain.html             |    4 +-
 Documentation/nvme-id-iocs.1                  |    4 +-
 Documentation/nvme-id-iocs.html               |    4 +-
 Documentation/nvme-id-ns.1                    |    4 +-
 Documentation/nvme-id-ns.html                 |    4 +-
 Documentation/nvme-id-nvmset.1                |    4 +-
 Documentation/nvme-id-nvmset.html             |    4 +-
 Documentation/nvme-inspur-nvme-vendor-log.1   |    4 +-
 .../nvme-inspur-nvme-vendor-log.html          |    4 +-
 Documentation/nvme-intel-id-ctrl.1            |    4 +-
 Documentation/nvme-intel-id-ctrl.html         |    4 +-
 Documentation/nvme-intel-internal-log.1       |    4 +-
 Documentation/nvme-intel-internal-log.html    |    4 +-
 Documentation/nvme-intel-lat-stats.1          |    4 +-
 Documentation/nvme-intel-lat-stats.html       |    4 +-
 Documentation/nvme-intel-market-name.1        |    4 +-
 Documentation/nvme-intel-market-name.html     |    4 +-
 Documentation/nvme-intel-smart-log-add.1      |    4 +-
 Documentation/nvme-intel-smart-log-add.html   |    4 +-
 Documentation/nvme-intel-temp-stats.1         |    4 +-
 Documentation/nvme-intel-temp-stats.html      |    4 +-
 Documentation/nvme-io-mgmt-recv.1             |    4 +-
 Documentation/nvme-io-mgmt-recv.html          |    4 +-
 Documentation/nvme-io-mgmt-send.1             |    4 +-
 Documentation/nvme-io-mgmt-send.html          |    4 +-
 Documentation/nvme-io-passthru.1              |    4 +-
 Documentation/nvme-io-passthru.html           |    4 +-
 Documentation/nvme-lba-status-log.1           |    4 +-
 Documentation/nvme-lba-status-log.html        |    4 +-
 Documentation/nvme-list-ctrl.1                |    4 +-
 Documentation/nvme-list-ctrl.html             |    4 +-
 Documentation/nvme-list-endgrp.1              |    4 +-
 Documentation/nvme-list-endgrp.html           |    4 +-
 Documentation/nvme-list-ns.1                  |    4 +-
 Documentation/nvme-list-ns.html               |    4 +-
 Documentation/nvme-list-subsys.1              |    4 +-
 Documentation/nvme-list-subsys.html           |    4 +-
 Documentation/nvme-list.1                     |    4 +-
 Documentation/nvme-list.html                  |    4 +-
 Documentation/nvme-lockdown.1                 |    4 +-
 Documentation/nvme-lockdown.html              |    4 +-
 Documentation/nvme-mgmt-addr-list-log.txt     |   47 +
 .../nvme-mi-cmd-support-effects-log.1         |    4 +-
 .../nvme-mi-cmd-support-effects-log.html      |    4 +-
 Documentation/nvme-micron-clear-pcie-errors.1 |    4 +-
 .../nvme-micron-clear-pcie-errors.html        |    4 +-
 Documentation/nvme-micron-internal-log.1      |    4 +-
 Documentation/nvme-micron-internal-log.html   |    4 +-
 Documentation/nvme-micron-nand-stats.1        |    4 +-
 Documentation/nvme-micron-nand-stats.html     |    4 +-
 Documentation/nvme-micron-pcie-stats.1        |    4 +-
 Documentation/nvme-micron-pcie-stats.html     |    4 +-
 .../nvme-micron-selective-download.1          |    4 +-
 .../nvme-micron-selective-download.html       |    4 +-
 Documentation/nvme-micron-smart-add-log.1     |    4 +-
 Documentation/nvme-micron-smart-add-log.html  |    4 +-
 Documentation/nvme-micron-temperature-stats.1 |    4 +-
 .../nvme-micron-temperature-stats.html        |    4 +-
 Documentation/nvme-netapp-ontapdevices.1      |   11 +-
 Documentation/nvme-netapp-ontapdevices.html   |   17 +-
 Documentation/nvme-netapp-ontapdevices.txt    |    6 +-
 Documentation/nvme-netapp-smdevices.1         |   11 +-
 Documentation/nvme-netapp-smdevices.html      |   17 +-
 Documentation/nvme-netapp-smdevices.txt       |    6 +-
 Documentation/nvme-ns-descs.1                 |    4 +-
 Documentation/nvme-ns-descs.html              |    4 +-
 Documentation/nvme-ns-rescan.1                |    4 +-
 Documentation/nvme-ns-rescan.html             |    4 +-
 Documentation/nvme-nvm-id-ctrl.1              |    4 +-
 Documentation/nvme-nvm-id-ctrl.html           |    4 +-
 Documentation/nvme-nvme-mi-recv.1             |    4 +-
 Documentation/nvme-nvme-mi-recv.html          |    4 +-
 Documentation/nvme-nvme-mi-send.1             |    4 +-
 Documentation/nvme-nvme-mi-send.html          |    4 +-
 .../nvme-ocp-clear-fw-activate-history.1      |    4 +-
 .../nvme-ocp-clear-fw-activate-history.html   |    4 +-
 ...cp-clear-pcie-correctable-error-counters.1 |    4 +-
 ...clear-pcie-correctable-error-counters.html |    4 +-
 .../nvme-ocp-device-capability-log.1          |    4 +-
 .../nvme-ocp-device-capability-log.html       |    4 +-
 Documentation/nvme-ocp-eol-plp-failure-mode.1 |    4 +-
 .../nvme-ocp-eol-plp-failure-mode.html        |    4 +-
 Documentation/nvme-ocp-error-recovery-log.1   |    4 +-
 .../nvme-ocp-error-recovery-log.html          |    4 +-
 .../nvme-ocp-get-dssd-async-event-config.1    |    4 +-
 .../nvme-ocp-get-dssd-async-event-config.html |    4 +-
 .../nvme-ocp-get-dssd-power-state-feature.1   |    4 +-
 ...nvme-ocp-get-dssd-power-state-feature.html |    4 +-
 .../nvme-ocp-get-plp-health-check-interval.1  |    4 +-
 ...vme-ocp-get-plp-health-check-interval.html |    4 +-
 .../nvme-ocp-hardware-component-log.txt       |    4 +-
 Documentation/nvme-ocp-internal-log.1         |   11 +-
 Documentation/nvme-ocp-internal-log.html      |    9 +-
 Documentation/nvme-ocp-internal-log.txt       |    5 +-
 Documentation/nvme-ocp-latency-monitor-log.1  |    4 +-
 .../nvme-ocp-latency-monitor-log.html         |    4 +-
 .../nvme-ocp-set-dssd-async-event-config.1    |    4 +-
 .../nvme-ocp-set-dssd-async-event-config.html |    4 +-
 .../nvme-ocp-set-dssd-power-state-feature.1   |    4 +-
 ...nvme-ocp-set-dssd-power-state-feature.html |    4 +-
 .../nvme-ocp-set-plp-health-check-interval.1  |    4 +-
 ...vme-ocp-set-plp-health-check-interval.html |    4 +-
 .../nvme-ocp-set-telemetry-profile.1          |    4 +-
 .../nvme-ocp-set-telemetry-profile.html       |    4 +-
 Documentation/nvme-ocp-smart-add-log.1        |   16 +-
 Documentation/nvme-ocp-smart-add-log.html     |   18 +-
 Documentation/nvme-ocp-smart-add-log.txt      |   10 +-
 .../nvme-ocp-telemetry-string-log-page.1      |    4 +-
 .../nvme-ocp-telemetry-string-log-page.html   |    4 +-
 Documentation/nvme-ocp-unsupported-reqs-log.1 |    4 +-
 .../nvme-ocp-unsupported-reqs-log.html        |    4 +-
 Documentation/nvme-persistent-event-log.1     |    4 +-
 Documentation/nvme-persistent-event-log.html  |    4 +-
 Documentation/nvme-pred-lat-event-agg-log.1   |    4 +-
 .../nvme-pred-lat-event-agg-log.html          |    4 +-
 Documentation/nvme-predictable-lat-log.1      |    4 +-
 Documentation/nvme-predictable-lat-log.html   |    4 +-
 Documentation/nvme-primary-ctrl-caps.1        |    4 +-
 Documentation/nvme-primary-ctrl-caps.html     |    4 +-
 Documentation/nvme-pull-model-ddr-req-log.txt |   51 +
 .../nvme-reachability-associations-log.txt    |   56 +
 .../nvme-reachability-groups-log.txt          |   56 +
 Documentation/nvme-read.1                     |    4 +-
 Documentation/nvme-read.html                  |    4 +-
 Documentation/nvme-reset.1                    |    4 +-
 Documentation/nvme-reset.html                 |    4 +-
 Documentation/nvme-resv-acquire.1             |    4 +-
 Documentation/nvme-resv-acquire.html          |    4 +-
 Documentation/nvme-resv-notif-log.1           |    4 +-
 Documentation/nvme-resv-notif-log.html        |    4 +-
 Documentation/nvme-resv-register.1            |    4 +-
 Documentation/nvme-resv-register.html         |    4 +-
 Documentation/nvme-resv-release.1             |    4 +-
 Documentation/nvme-resv-release.html          |    4 +-
 Documentation/nvme-resv-report.1              |    4 +-
 Documentation/nvme-resv-report.html           |    4 +-
 .../nvme-rotational-media-info-log.txt        |   52 +
 Documentation/nvme-rpmb.1                     |    4 +-
 Documentation/nvme-rpmb.html                  |    4 +-
 Documentation/nvme-sanitize-log.1             |    4 +-
 Documentation/nvme-sanitize-log.html          |    4 +-
 Documentation/nvme-sanitize.1                 |    4 +-
 Documentation/nvme-sanitize.html              |    4 +-
 .../nvme-seagate-clear-fw-activate-history.1  |    4 +-
 ...vme-seagate-clear-fw-activate-history.html |    4 +-
 ...me-seagate-clear-pcie-correctable-errors.1 |    4 +-
 ...seagate-clear-pcie-correctable-errors.html |    4 +-
 .../nvme-seagate-cloud-SSD-plugin-version.1   |    4 +-
 ...nvme-seagate-cloud-SSD-plugin-version.html |    4 +-
 Documentation/nvme-seagate-get-ctrl-tele.1    |    4 +-
 Documentation/nvme-seagate-get-ctrl-tele.html |    4 +-
 Documentation/nvme-seagate-get-host-tele.1    |    4 +-
 Documentation/nvme-seagate-get-host-tele.html |    4 +-
 Documentation/nvme-seagate-help.1             |    4 +-
 Documentation/nvme-seagate-help.html          |    4 +-
 Documentation/nvme-seagate-plugin-version.1   |    4 +-
 .../nvme-seagate-plugin-version.html          |    4 +-
 Documentation/nvme-seagate-version.1          |    4 +-
 Documentation/nvme-seagate-version.html       |    4 +-
 .../nvme-seagate-vs-fw-activate-history.1     |    4 +-
 .../nvme-seagate-vs-fw-activate-history.html  |    4 +-
 Documentation/nvme-seagate-vs-internal-log.1  |    4 +-
 .../nvme-seagate-vs-internal-log.html         |    4 +-
 Documentation/nvme-seagate-vs-log-page-sup.1  |    4 +-
 .../nvme-seagate-vs-log-page-sup.html         |    4 +-
 Documentation/nvme-seagate-vs-pcie-stats.1    |    4 +-
 Documentation/nvme-seagate-vs-pcie-stats.html |    4 +-
 Documentation/nvme-seagate-vs-smart-add-log.1 |    4 +-
 .../nvme-seagate-vs-smart-add-log.html        |    4 +-
 .../nvme-seagate-vs-temperature-stats.1       |    4 +-
 .../nvme-seagate-vs-temperature-stats.html    |    4 +-
 Documentation/nvme-security-recv.1            |    4 +-
 Documentation/nvme-security-recv.html         |    4 +-
 Documentation/nvme-security-send.1            |    4 +-
 Documentation/nvme-security-send.html         |    4 +-
 Documentation/nvme-self-test-log.1            |    4 +-
 Documentation/nvme-self-test-log.html         |    4 +-
 Documentation/nvme-set-feature.1              |    4 +-
 Documentation/nvme-set-feature.html           |    4 +-
 Documentation/nvme-set-property.1             |    4 +-
 Documentation/nvme-set-property.html          |    4 +-
 Documentation/nvme-set-reg.txt                |    3 +
 Documentation/nvme-show-hostnqn.1             |    4 +-
 Documentation/nvme-show-hostnqn.html          |    4 +-
 Documentation/nvme-show-regs.1                |    4 +-
 Documentation/nvme-show-regs.html             |    4 +-
 Documentation/nvme-show-topology.1            |    4 +-
 Documentation/nvme-show-topology.html         |    4 +-
 Documentation/nvme-smart-log.1                |    4 +-
 Documentation/nvme-smart-log.html             |    4 +-
 .../nvme-solidigm-clear-fw-activate-history.1 |    4 +-
 ...me-solidigm-clear-fw-activate-history.html |    4 +-
 ...e-solidigm-clear-pcie-correctable-errors.1 |    4 +-
 ...olidigm-clear-pcie-correctable-errors.html |    4 +-
 .../nvme-solidigm-cloud-SSDplugin-version.1   |    4 +-
 ...nvme-solidigm-cloud-SSDplugin-version.html |    4 +-
 .../nvme-solidigm-garbage-collect-log.1       |    4 +-
 .../nvme-solidigm-garbage-collect-log.html    |    4 +-
 Documentation/nvme-solidigm-id-ctrl.1         |    4 +-
 Documentation/nvme-solidigm-id-ctrl.html      |    4 +-
 .../nvme-solidigm-latency-tracking-log.1      |    4 +-
 .../nvme-solidigm-latency-tracking-log.html   |    4 +-
 .../nvme-solidigm-log-page-directory.1        |    4 +-
 .../nvme-solidigm-log-page-directory.html     |    4 +-
 Documentation/nvme-solidigm-market-log.1      |    4 +-
 Documentation/nvme-solidigm-market-log.html   |    4 +-
 .../nvme-solidigm-parse-telemetry-log.1       |    4 +-
 .../nvme-solidigm-parse-telemetry-log.html    |    4 +-
 Documentation/nvme-solidigm-smart-log-add.1   |    4 +-
 .../nvme-solidigm-smart-log-add.html          |    4 +-
 Documentation/nvme-solidigm-temp-stats.1      |    4 +-
 Documentation/nvme-solidigm-temp-stats.html   |    4 +-
 Documentation/nvme-solidigm-vs-drive-info.1   |    4 +-
 .../nvme-solidigm-vs-drive-info.html          |    4 +-
 .../nvme-solidigm-vs-fw-activate-history.1    |    4 +-
 .../nvme-solidigm-vs-fw-activate-history.html |    4 +-
 Documentation/nvme-solidigm-vs-internal-log.1 |    4 +-
 .../nvme-solidigm-vs-internal-log.html        |    4 +-
 .../nvme-solidigm-vs-smart-add-log.1          |    4 +-
 .../nvme-solidigm-vs-smart-add-log.html       |    4 +-
 .../nvme-solidigm-workload-tracker.1          |    4 +-
 .../nvme-solidigm-workload-tracker.html       |    4 +-
 Documentation/nvme-subsystem-reset.1          |    4 +-
 Documentation/nvme-subsystem-reset.html       |    4 +-
 Documentation/nvme-supported-log-pages.1      |    4 +-
 Documentation/nvme-supported-log-pages.html   |    4 +-
 Documentation/nvme-telemetry-log.1            |    4 +-
 Documentation/nvme-telemetry-log.html         |    4 +-
 Documentation/nvme-tls-key.1                  |    4 +-
 Documentation/nvme-tls-key.html               |    4 +-
 ...me-toshiba-clear-pcie-correctable-errors.1 |    4 +-
 ...toshiba-clear-pcie-correctable-errors.html |    4 +-
 Documentation/nvme-toshiba-vs-internal-log.1  |    4 +-
 .../nvme-toshiba-vs-internal-log.html         |    4 +-
 Documentation/nvme-toshiba-vs-smart-add-log.1 |    4 +-
 .../nvme-toshiba-vs-smart-add-log.html        |    4 +-
 Documentation/nvme-transcend-badblock.1       |    4 +-
 Documentation/nvme-transcend-badblock.html    |    4 +-
 Documentation/nvme-transcend-healthvalue.1    |    4 +-
 Documentation/nvme-transcend-healthvalue.html |    4 +-
 Documentation/nvme-verify.1                   |    4 +-
 Documentation/nvme-verify.html                |    4 +-
 .../nvme-virtium-save-smart-to-vtview-log.1   |    4 +-
 ...nvme-virtium-save-smart-to-vtview-log.html |    4 +-
 Documentation/nvme-virtium-show-identify.1    |    4 +-
 Documentation/nvme-virtium-show-identify.html |    4 +-
 Documentation/nvme-wdc-cap-diag.1             |    4 +-
 Documentation/nvme-wdc-cap-diag.html          |    4 +-
 Documentation/nvme-wdc-capabilities.1         |    4 +-
 Documentation/nvme-wdc-capabilities.html      |    4 +-
 Documentation/nvme-wdc-clear-assert-dump.1    |    4 +-
 Documentation/nvme-wdc-clear-assert-dump.html |    4 +-
 .../nvme-wdc-clear-fw-activate-history.1      |    4 +-
 .../nvme-wdc-clear-fw-activate-history.html   |    4 +-
 .../nvme-wdc-clear-pcie-correctable-errors.1  |    4 +-
 ...vme-wdc-clear-pcie-correctable-errors.html |    4 +-
 .../nvme-wdc-cloud-SSD-plugin-version.1       |    4 +-
 .../nvme-wdc-cloud-SSD-plugin-version.html    |    4 +-
 .../nvme-wdc-cloud-boot-SSD-version.1         |    4 +-
 .../nvme-wdc-cloud-boot-SSD-version.html      |    4 +-
 Documentation/nvme-wdc-drive-essentials.1     |    4 +-
 Documentation/nvme-wdc-drive-essentials.html  |    4 +-
 Documentation/nvme-wdc-drive-log.1            |    4 +-
 Documentation/nvme-wdc-drive-log.html         |    4 +-
 Documentation/nvme-wdc-drive-resize.1         |    4 +-
 Documentation/nvme-wdc-drive-resize.html      |    4 +-
 Documentation/nvme-wdc-enc-get-log.1          |    4 +-
 Documentation/nvme-wdc-enc-get-log.html       |    4 +-
 Documentation/nvme-wdc-get-crash-dump.1       |    4 +-
 Documentation/nvme-wdc-get-crash-dump.html    |    4 +-
 .../nvme-wdc-get-dev-capabilities-log.1       |    4 +-
 .../nvme-wdc-get-dev-capabilities-log.html    |    4 +-
 Documentation/nvme-wdc-get-drive-status.1     |    4 +-
 Documentation/nvme-wdc-get-drive-status.html  |    4 +-
 .../nvme-wdc-get-error-recovery-log.1         |    4 +-
 .../nvme-wdc-get-error-recovery-log.html      |    4 +-
 .../nvme-wdc-get-latency-monitor-log.1        |    4 +-
 .../nvme-wdc-get-latency-monitor-log.html     |    4 +-
 Documentation/nvme-wdc-get-pfail-dump.1       |    4 +-
 Documentation/nvme-wdc-get-pfail-dump.html    |    4 +-
 .../nvme-wdc-get-unsupported-reqs-log.1       |    4 +-
 .../nvme-wdc-get-unsupported-reqs-log.html    |    4 +-
 Documentation/nvme-wdc-id-ctrl.1              |    4 +-
 Documentation/nvme-wdc-id-ctrl.html           |    4 +-
 Documentation/nvme-wdc-log-page-directory.1   |    4 +-
 .../nvme-wdc-log-page-directory.html          |    4 +-
 Documentation/nvme-wdc-namespace-resize.1     |    4 +-
 Documentation/nvme-wdc-namespace-resize.html  |    4 +-
 Documentation/nvme-wdc-purge-monitor.1        |    4 +-
 Documentation/nvme-wdc-purge-monitor.html     |    4 +-
 Documentation/nvme-wdc-purge.1                |    4 +-
 Documentation/nvme-wdc-purge.html             |    4 +-
 Documentation/nvme-wdc-vs-cloud-log.1         |    4 +-
 Documentation/nvme-wdc-vs-cloud-log.html      |    4 +-
 Documentation/nvme-wdc-vs-device-waf.1        |    4 +-
 Documentation/nvme-wdc-vs-device-waf.html     |    4 +-
 Documentation/nvme-wdc-vs-drive-info.1        |    4 +-
 Documentation/nvme-wdc-vs-drive-info.html     |    4 +-
 .../nvme-wdc-vs-error-reason-identifier.1     |    4 +-
 .../nvme-wdc-vs-error-reason-identifier.html  |    4 +-
 .../nvme-wdc-vs-fw-activate-history.1         |    4 +-
 .../nvme-wdc-vs-fw-activate-history.html      |    4 +-
 Documentation/nvme-wdc-vs-hw-rev-log.1        |    4 +-
 Documentation/nvme-wdc-vs-hw-rev-log.html     |    4 +-
 Documentation/nvme-wdc-vs-internal-log.1      |    4 +-
 Documentation/nvme-wdc-vs-internal-log.html   |    4 +-
 Documentation/nvme-wdc-vs-nand-stats.1        |    4 +-
 Documentation/nvme-wdc-vs-nand-stats.html     |    4 +-
 Documentation/nvme-wdc-vs-smart-add-log.1     |    4 +-
 Documentation/nvme-wdc-vs-smart-add-log.html  |    4 +-
 .../nvme-wdc-vs-telemetry-controller-option.1 |    4 +-
 ...me-wdc-vs-telemetry-controller-option.html |    4 +-
 Documentation/nvme-wdc-vs-temperature-stats.1 |    4 +-
 .../nvme-wdc-vs-temperature-stats.html        |    4 +-
 Documentation/nvme-write-uncor.1              |    4 +-
 Documentation/nvme-write-uncor.html           |    4 +-
 Documentation/nvme-write-zeroes.1             |   11 +-
 Documentation/nvme-write-zeroes.html          |   17 +-
 Documentation/nvme-write-zeroes.txt           |    5 +-
 Documentation/nvme-write.1                    |    4 +-
 Documentation/nvme-write.html                 |    4 +-
 Documentation/nvme-zns-changed-zone-list.1    |    4 +-
 Documentation/nvme-zns-changed-zone-list.html |    4 +-
 Documentation/nvme-zns-close-zone.1           |    4 +-
 Documentation/nvme-zns-close-zone.html        |    4 +-
 Documentation/nvme-zns-finish-zone.1          |    4 +-
 Documentation/nvme-zns-finish-zone.html       |    4 +-
 Documentation/nvme-zns-id-ctrl.1              |    4 +-
 Documentation/nvme-zns-id-ctrl.html           |    4 +-
 Documentation/nvme-zns-id-ns.1                |    4 +-
 Documentation/nvme-zns-id-ns.html             |    4 +-
 Documentation/nvme-zns-offline-zone.1         |    4 +-
 Documentation/nvme-zns-offline-zone.html      |    4 +-
 Documentation/nvme-zns-open-zone.1            |    4 +-
 Documentation/nvme-zns-open-zone.html         |    4 +-
 Documentation/nvme-zns-report-zones.1         |    4 +-
 Documentation/nvme-zns-report-zones.html      |    4 +-
 Documentation/nvme-zns-reset-zone.1           |    4 +-
 Documentation/nvme-zns-reset-zone.html        |    4 +-
 Documentation/nvme-zns-set-zone-desc.1        |    4 +-
 Documentation/nvme-zns-set-zone-desc.html     |    4 +-
 Documentation/nvme-zns-zone-append.1          |    4 +-
 Documentation/nvme-zns-zone-append.html       |    4 +-
 Documentation/nvme-zns-zone-mgmt-recv.1       |    4 +-
 Documentation/nvme-zns-zone-mgmt-recv.html    |    4 +-
 Documentation/nvme-zns-zone-mgmt-send.1       |    4 +-
 Documentation/nvme-zns-zone-mgmt-send.html    |    4 +-
 Documentation/nvme.1                          |   59 +-
 Documentation/nvme.html                       |   92 +-
 Makefile                                      |   24 +-
 completions/_nvme                             |  201 ++-
 completions/bash-nvme-completion.sh           |   99 +-
 fabrics.c                                     |   32 +-
 meson.build                                   |    4 +-
 nbft.c                                        |   46 +-
 nvme-builtin.h                                |   11 +-
 nvme-print-binary.c                           |   64 +-
 nvme-print-json.c                             |  562 ++++++--
 nvme-print-stdout.c                           | 1279 ++++++++++++-----
 nvme-print.c                                  |  226 ++-
 nvme-print.h                                  |   42 +-
 nvme-wrap.c                                   |   67 +-
 nvme-wrap.h                                   |   29 +-
 nvme.c                                        | 1110 +++++++++++++-
 nvme.h                                        |    2 +-
 nvme.spec.in                                  |    1 +
 .../udev-rules/70-nvmf-keys.rules.in          |    2 +-
 .../udev-rules/71-nvmf-netapp.rules.in        |    4 +-
 plugins/amzn/amzn-nvme.c                      |  221 +++
 plugins/amzn/amzn-nvme.h                      |    1 +
 plugins/dapustor/dapustor-nvme.c              |    4 +-
 plugins/fdp/fdp.c                             |  108 ++
 plugins/fdp/fdp.h                             |    3 +-
 plugins/huawei/huawei-nvme.c                  |    4 +
 plugins/intel/intel-nvme.c                    |    8 +-
 plugins/lm/lm-nvme.c                          |  669 +++++++++
 plugins/lm/lm-nvme.h                          |   30 +
 plugins/lm/lm-print-binary.c                  |   25 +
 plugins/lm/lm-print-json.c                    |  109 ++
 plugins/lm/lm-print-stdout.c                  |  145 ++
 plugins/lm/lm-print.c                         |   38 +
 plugins/lm/lm-print.h                         |   31 +
 plugins/lm/meson.build                        |   12 +
 plugins/meson.build                           |   61 +-
 plugins/micron/micron-nvme.c                  |   37 +-
 plugins/nbft/nbft-plugin.c                    |    4 +
 plugins/netapp/netapp-nvme.c                  |  318 +++-
 plugins/ocp/ocp-clear-features.c              |   12 +-
 plugins/ocp/ocp-fw-activation-history.c       |    4 +-
 plugins/ocp/ocp-fw-activation-history.h       |    3 +-
 plugins/ocp/ocp-hardware-component-log.c      |   57 +-
 plugins/ocp/ocp-hardware-component-log.h      |    2 +-
 plugins/ocp/ocp-nvme.c                        |  230 +--
 plugins/ocp/ocp-nvme.h                        |   47 +-
 plugins/ocp/ocp-print-binary.c                |    7 +-
 plugins/ocp/ocp-print-json.c                  |  408 +++++-
 plugins/ocp/ocp-print-stdout.c                |  230 +--
 plugins/ocp/ocp-print.c                       |    5 +-
 plugins/ocp/ocp-print.h                       |    6 +-
 plugins/ocp/ocp-smart-extended-log.c          |   32 +-
 plugins/ocp/ocp-smart-extended-log.h          |  175 ++-
 plugins/ocp/ocp-telemetry-decode.c            |  162 ++-
 plugins/ocp/ocp-telemetry-decode.h            |  287 +++-
 plugins/ocp/ocp-types.h                       |   13 +
 plugins/ocp/ocp-utils.c                       |   22 +
 plugins/ocp/ocp-utils.h                       |    3 +-
 plugins/scaleflux/sfx-nvme.c                  |  712 +++++++--
 plugins/scaleflux/sfx-nvme.h                  |    1 +
 plugins/scaleflux/sfx-types.h                 |  189 +++
 plugins/seagate/seagate-nvme.c                |   40 +-
 plugins/sed/sed.c                             |   37 +-
 plugins/sed/sedopal_cmd.c                     |  666 ++++++++-
 plugins/sed/sedopal_cmd.h                     |    4 +
 plugins/sed/sedopal_spec.h                    |  321 ++++-
 plugins/solidigm/solidigm-internal-logs.c     |   82 +-
 plugins/solidigm/solidigm-log-page-dir.c      |    1 +
 plugins/solidigm/solidigm-nvme.h              |    2 +-
 plugins/solidigm/solidigm-telemetry/config.c  |    2 +-
 plugins/ssstc/ssstc-nvme.c                    |    4 +-
 plugins/virtium/virtium-nvme.c                |    6 +-
 plugins/wdc/wdc-nvme.c                        |  425 +++++-
 plugins/wdc/wdc-nvme.h                        |    2 +-
 plugins/wdc/wdc-utils.c                       |    2 +-
 scripts/build.sh                              |    9 +-
 subprojects/json-c.wrap                       |   18 +-
 subprojects/libnvme.wrap                      |    2 +-
 tests/nvme_attach_detach_ns_test.py           |    3 -
 tests/nvme_compare_test.py                    |   11 +-
 tests/nvme_copy_test.py                       |   49 +-
 tests/nvme_create_max_ns_test.py              |   16 +-
 tests/nvme_ctrl_reset_test.py                 |    2 +-
 tests/nvme_dsm_test.py                        |    7 +-
 tests/nvme_flush_test.py                      |    4 +-
 tests/nvme_format_test.py                     |   65 +-
 tests/nvme_fw_log_test.py                     |    8 +-
 tests/nvme_get_features_test.py               |   14 +-
 tests/nvme_get_lba_status_test.py             |   18 +-
 tests/nvme_id_ns_test.py                      |   13 +-
 tests/nvme_lba_status_log_test.py             |    8 +-
 tests/nvme_smart_log_test.py                  |   10 +-
 tests/nvme_test.py                            |  231 ++-
 tests/nvme_test_io.py                         |   19 +-
 tests/nvme_verify_test.py                     |   22 +-
 tests/nvme_writeuncor_test.py                 |    6 +-
 tests/nvme_writezeros_test.py                 |    6 +-
 util/argconfig.h                              |    6 +
 util/json.c                                   |   63 +
 util/json.h                                   |   61 +-
 util/logging.c                                |    5 +-
 util/logging.h                                |   14 +-
 util/types.c                                  |   23 +-
 util/types.h                                  |    5 +-
 util/utils.c                                  |   10 +-
 571 files changed, 10718 insertions(+), 2738 deletions(-)
 create mode 100644 .checkpatch.conf
 create mode 100644 Documentation/nvme-ave-discovery-log.txt
 create mode 100644 Documentation/nvme-changed-alloc-ns-list-log.txt
 create mode 100644 Documentation/nvme-dispersed-ns-participating-nss-log.txt
 create mode 100644 Documentation/nvme-fdp-feature.1
 copy Documentation/{nvme-zns-close-zone.html => nvme-fdp-feature.html} (86%)
 create mode 100644 Documentation/nvme-fdp-feature.txt
 create mode 100644 Documentation/nvme-host-discovery-log.txt
 create mode 100644 Documentation/nvme-mgmt-addr-list-log.txt
 create mode 100644 Documentation/nvme-pull-model-ddr-req-log.txt
 create mode 100644 Documentation/nvme-reachability-associations-log.txt
 create mode 100644 Documentation/nvme-reachability-groups-log.txt
 create mode 100644 Documentation/nvme-rotational-media-info-log.txt
 create mode 100644 plugins/lm/lm-nvme.c
 create mode 100644 plugins/lm/lm-nvme.h
 create mode 100644 plugins/lm/lm-print-binary.c
 create mode 100644 plugins/lm/lm-print-json.c
 create mode 100644 plugins/lm/lm-print-stdout.c
 create mode 100644 plugins/lm/lm-print.c
 create mode 100644 plugins/lm/lm-print.h
 create mode 100644 plugins/lm/meson.build
 create mode 100644 plugins/ocp/ocp-types.h
 create mode 100644 plugins/scaleflux/sfx-types.h

diff --git a/.checkpatch.conf b/.checkpatch.conf
new file mode 100644
index 0000000..aacb982
--- /dev/null
+++ b/.checkpatch.conf
@@ -0,0 +1,24 @@
+# Checkpatch options.
+# REF: https://docs.kernel.org/dev-tools/checkpatch.html
+
+# This isn't actually a Linux kernel tree
+--no-tree
+
+--max-line-length=100
+
+--ignore EMAIL_SUBJECT
+
+# FILE_PATH_CHANGES reports this kind of message:
+# "added, moved or deleted file(s), does MAINTAINERS need updating?"
+--ignore FILE_PATH_CHANGES
+
+
+# Commit messages might contain a Gerrit Change-Id.
+--ignore GERRIT_CHANGE_ID
+
+# Do not check the format of commit messages, as Gerrit's merge commits do not
+# preserve it.
+--ignore GIT_COMMIT_ID
+
+# Avoid "Does not appear to be a unified-diff format patch" message
+--ignore NOT_UNIFIED_DIFF
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 20c69fa..a743d03 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -17,6 +17,7 @@ jobs:
       - name: build
         run: |
           scripts/build.sh coverage
-      - uses: codecov/codecov-action@v4
+      - uses: codecov/codecov-action@v5
         with:
-          fail_ci_if_error: false
+          token: ${{ secrets.CODECOV_TOKEN }}
+          fail_ci_if_error: true
diff --git a/.github/workflows/run-nightly-tests.yml b/.github/workflows/run-nightly-tests.yml
index d525986..e8ac232 100644
--- a/.github/workflows/run-nightly-tests.yml
+++ b/.github/workflows/run-nightly-tests.yml
@@ -9,39 +9,25 @@ on:
 jobs:
   nightly-tests:
     runs-on: nvme-nvm
+    container:
+      image: ghcr.io/linux-nvme/debian.python:latest
+      #Expose all devices to the container through the `privileged` flag.
+      #
+      #BDEV0 is an environment variable of the self-hosted runner instance
+      #that contains a valid nvme ctrl name which is capable of the nvm
+      #command set.
+      options: '--privileged -v "/dev":"/dev":z -e BDEV0'
     steps:
       - name: Output kernel version
         run: |
           uname -a
-      - name: Clean up test device
-        run: |
-          #BDEV0 is an environment variable of the self-hosted runner instance
-          #that contains a valid nvme ctrl name which is capable of the nvm
-          #command set.
-          CONTROLLER=$(echo /dev/${BDEV0} | sed 's/n[0-9]*$//')
-          sudo nvme delete-ns $CONTROLLER -n 0xffffffff
-          sudo nvme format $CONTROLLER -n 0xffffffff -l 0 -f
-          SIZE=$(sudo nvme id-ctrl $CONTROLLER --output-format=json | jq -r '{tnvmcap} | .[]' | awk '{print $1/512}')
-          sudo nvme create-ns -s $SIZE -c $SIZE -f 0 -d 0 --csi=0 $CONTROLLER
-          sudo nvme attach-ns $CONTROLLER -n 1 -c 0
       - uses: actions/checkout@v4
       - name: Install dependencies
         run: |
-          sudo apt-get update
-          sudo apt-get install --no-install-recommends -y \
-          meson gcc pkg-config git libjson-c-dev libssl-dev libkeyutils-dev \
-          libdbus-1-dev libpython3-dev pipx python3-dev swig xz-utils
-          pipx ensurepath
-          sudo PIPX_BIN_DIR=/usr/local/bin pipx install nose2
-          sudo PIPX_BIN_DIR=/usr/local/bin pipx install flake8
-          sudo PIPX_BIN_DIR=/usr/local/bin pipx install mypy
-          sudo PIPX_BIN_DIR=/usr/local/bin pipx install autopep8
-          sudo PIPX_BIN_DIR=/usr/local/bin pipx install isort
+          PIPX_BIN_DIR=/usr/local/bin pipx install nose2 --force
       - name: Build and install nvme-cli
         run: |
           scripts/build.sh -b release -c gcc
-          sudo meson install -C .build-ci
-          sudo ldconfig /usr/local/lib64
       - name: Overwrite test config
         run: |
           CONTROLLER=$(echo /dev/${BDEV0} | sed 's/n[0-9]*$//')
@@ -49,12 +35,14 @@ jobs:
           {
             "controller" : "$CONTROLLER",
             "ns1": "/dev/${BDEV0}",
-            "log_dir": "tests/nvmetests/"
+            "log_dir": "tests/nvmetests/",
+            "nvme_bin": "$(pwd)/.build-ci/nvme"
           }
           EOF
+          cat tests/config.json
       - name: Run on device tests
         run: |
-          sudo nose2 --verbose --start-dir tests \
+          nose2 --verbose --start-dir tests \
           nvme_attach_detach_ns_test \
           nvme_compare_test \
           nvme_copy_test \
@@ -79,15 +67,6 @@ jobs:
         uses: actions/upload-artifact@v4
         if: always()
         with:
-          name: logs files
+          name: nvme-cli-test-logs
           path: |
             ./tests/nvmetests/**/*.log
-      - name: Clean up test device
-        if: always()
-        run: |
-          CONTROLLER=$(echo /dev/${BDEV0} | sed 's/n[0-9]*$//')
-          sudo nvme delete-ns $CONTROLLER -n 0xffffffff
-          sudo nvme format $CONTROLLER -n 0xffffffff -l 0 -f
-          SIZE=$(sudo nvme id-ctrl $CONTROLLER --output-format=json | jq -r '{tnvmcap} | .[]' | awk '{print $1/512}')
-          sudo nvme create-ns -s $SIZE -c $SIZE -f 0 -d 0 --csi=0 $CONTROLLER
-          sudo nvme attach-ns $CONTROLLER -n 1 -c 0
diff --git a/Documentation/cmd-plugins.txt b/Documentation/cmd-plugins.txt
index 2e80bfc..ee77408 100644
--- a/Documentation/cmd-plugins.txt
+++ b/Documentation/cmd-plugins.txt
@@ -207,3 +207,36 @@ linknvme:nvme-inspur-nvme-vendor-log[1]::
 
 linknvme:nvme-dapustor-smart-log-add[1]::
 	NVMe DapuStor Additional SMART log page
+
+linknvme:nvme-solidigm-id-ctrl[1]::
+	Solidigm - NVMe Identify Controller
+
+linknvme:nvme-solidigm-smart-log-add[1]::
+	Retrieve Solidigm SMART Log
+
+linknvme:nvme-solidigm-vs-internal-log[1]::
+	Retrieve Debug log binaries
+
+linknvme:nvme-solidigm-garbage-collect-log[1]::
+	Retrieve Garbage Collection Log
+
+linknvme:nvme-solidigm-market-log[1]::
+	Retrieve Market Log
+
+linknvme:nvme-solidigm-latency-tracking-log[1]::
+	Enable/Retrieve Latency tracking Log
+
+linknvme:nvme-solidigm-parse-telemetry-log[1]::
+	Parse Telemetry Log binary
+
+linknvme:nvme-solidigm-log-page-directory[1]::
+	Retrieve log page directory
+
+linknvme:nvme-solidigm-temp-stats[1]::
+	Retrieve Temperature Statistics log
+
+linknvme:nvme-solidigm-vs-drive-info[1]::
+	Retrieve drive information
+
+linknvme:nvme-solidigm-workload-tracker[1]::
+	Real Time capture Workload Tracker samples
diff --git a/Documentation/meson.build b/Documentation/meson.build
index 65495e3..e81db8c 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -32,6 +32,7 @@ adoc_sources = [
   'nvme-error-log',
   'nvme-fdp-configs',
   'nvme-fdp-events',
+  'nvme-fdp-feature',
   'nvme-fdp-set-events',
   'nvme-fdp-stats',
   'nvme-fdp-status',
diff --git a/Documentation/nvme-admin-passthru.1 b/Documentation/nvme-admin-passthru.1
index 25576c9..075816d 100644
--- a/Documentation/nvme-admin-passthru.1
+++ b/Documentation/nvme-admin-passthru.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-admin-passthru
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ADMIN\-PASSTHR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ADMIN\-PASSTHR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-admin-passthru.html b/Documentation/nvme-admin-passthru.html
index 1ae7d89..84eacca 100644
--- a/Documentation/nvme-admin-passthru.html
+++ b/Documentation/nvme-admin-passthru.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-admin-passthru(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1038,7 +1038,7 @@ Or if you want to save that structure to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ana-log.1 b/Documentation/nvme-ana-log.1
index e34ef0f..dca4ba1 100644
--- a/Documentation/nvme-ana-log.1
+++ b/Documentation/nvme-ana-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ana-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ANA\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ANA\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ana-log.html b/Documentation/nvme-ana-log.html
index 0e3be22..154dad4 100644
--- a/Documentation/nvme-ana-log.html
+++ b/Documentation/nvme-ana-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ana-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -835,7 +835,7 @@ Print the ANA log page in a human readable format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-attach-ns.1 b/Documentation/nvme-attach-ns.1
index f6f93f1..c82e1b2 100644
--- a/Documentation/nvme-attach-ns.1
+++ b/Documentation/nvme-attach-ns.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-attach-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ATTACH\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ATTACH\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -39,11 +39,13 @@ nvme-attach-ns \- Send NVMe attach namespace, return result\&.
 .SH "DESCRIPTION"
 .sp
 For the NVMe device given, sends the nvme namespace attach command for the provided namespace identifier, attaching to the provided list of controller identifiers\&.
+.sp
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0) but not a namespace block device (ex: /dev/nvme0n1)\&.
 .SH "OPTIONS"
 .PP
 \-n <nsid>, \-\-namespace\-id=<nsid>
 .RS 4
-The namespace identifier to attach\&.
+The namespace identifier to attach but not attached already\&.
 .RE
 .PP
 \-c <ctrl\-list,>, \-controllers=<ctrl\-list,>
diff --git a/Documentation/nvme-attach-ns.html b/Documentation/nvme-attach-ns.html
index 926a570..bbb71e1 100644
--- a/Documentation/nvme-attach-ns.html
+++ b/Documentation/nvme-attach-ns.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-attach-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -762,6 +762,8 @@ nvme-attach-ns(1) Manual Page
 <div class="paragraph"><p>For the NVMe device given, sends the nvme namespace attach command for
 the provided namespace identifier, attaching to the provided list of
 controller identifiers.</p></div>
+<div class="paragraph"><p>The &lt;device&gt; parameter is mandatory NVMe character device (ex: /dev/nvme0) but
+not a namespace block device (ex: /dev/nvme0n1).</p></div>
 </div>
 </div>
 <div class="sect1">
@@ -776,7 +778,7 @@ controller identifiers.</p></div>
 </dt>
 <dd>
 <p>
-        The namespace identifier to attach.
+        The namespace identifier to attach but not attached already.
 </p>
 </dd>
 <dt class="hdlist1">
@@ -841,7 +843,7 @@ controller identifiers.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-attach-ns.txt b/Documentation/nvme-attach-ns.txt
index 601c20d..1d50759 100644
--- a/Documentation/nvme-attach-ns.txt
+++ b/Documentation/nvme-attach-ns.txt
@@ -18,11 +18,14 @@ For the NVMe device given, sends the nvme namespace attach command for
 the provided namespace identifier, attaching to the provided list of
 controller identifiers.
 
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0) but
+not a namespace block device (ex: /dev/nvme0n1).
+
 OPTIONS
 -------
 -n <nsid>::
 --namespace-id=<nsid>::
-	The namespace identifier to attach.
+	The namespace identifier to attach but not attached already.
 
 -c <ctrl-list,>::
 -controllers=<ctrl-list,>::
diff --git a/Documentation/nvme-ave-discovery-log.txt b/Documentation/nvme-ave-discovery-log.txt
new file mode 100644
index 0000000..75de361
--- /dev/null
+++ b/Documentation/nvme-ave-discovery-log.txt
@@ -0,0 +1,51 @@
+nvme-ave-discovery-log(1)
+=========================
+
+NAME
+----
+nvme-ave-discovery-log - Retrieve AVE Discovery Log, show it
+
+SYNOPSIS
+--------
+[verse]
+'nvme ave-discovery-log' <device> [--rae | -r] [--verbose | -v]
+			[--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve AVE Discovery Log, show it
+
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-r::
+--rae::
+	Retain an Asynchronous Event.
+
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Has the program issue a ave-discovery-log
++
+------------
+# nvme ave-discovery-log /dev/nvme0
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-boot-part-log.1 b/Documentation/nvme-boot-part-log.1
index 1727157..afb9ab3 100644
--- a/Documentation/nvme-boot-part-log.1
+++ b/Documentation/nvme-boot-part-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-boot-part-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-BOOT\-PART\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-BOOT\-PART\-LO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-boot-part-log.html b/Documentation/nvme-boot-part-log.html
index 6bf52e9..56588b2 100644
--- a/Documentation/nvme-boot-part-log.html
+++ b/Documentation/nvme-boot-part-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-boot-part-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -846,7 +846,7 @@ Retrieve Boot Partition data to boot_part_log.bin
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-capacity-mgmt.1 b/Documentation/nvme-capacity-mgmt.1
index 7ec35b8..22d19b7 100644
--- a/Documentation/nvme-capacity-mgmt.1
+++ b/Documentation/nvme-capacity-mgmt.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-capacity-mgmt
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-CAPACITY\-MGMT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CAPACITY\-MGMT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-capacity-mgmt.html b/Documentation/nvme-capacity-mgmt.html
index c0bb419..a8b650b 100644
--- a/Documentation/nvme-capacity-mgmt.html
+++ b/Documentation/nvme-capacity-mgmt.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-capacity-mgmt(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -875,7 +875,7 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-changed-alloc-ns-list-log.txt b/Documentation/nvme-changed-alloc-ns-list-log.txt
new file mode 100644
index 0000000..3a7f2e8
--- /dev/null
+++ b/Documentation/nvme-changed-alloc-ns-list-log.txt
@@ -0,0 +1,67 @@
+nvme-changed-alloc-ns-list-log(1)
+=================================
+
+NAME
+----
+nvme-changed-alloc-ns-list-log - Send NVMe Changed Allocated Namespace List
+log page request, returns result and log.
+
+SYNOPSIS
+--------
+[verse]
+'nvme changed-alloc-ns-list-log' <device> [--raw-binary | -b]
+			[--output-format=<fmt> | -o <fmt>] [--verbose | -v]
+			[--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieves the NVMe Changed Allocated Namespace List log page from an NVMe
+device and provides the returned structure.
+
+The <device> parameter is mandatory and must be a NVMe character device
+(ex: /dev/nvme0).
+
+On success, the returned Changed Allocated Namespace List log structure may
+be returned in one of several ways depending on the option flags; the
+structure may parsed by the program and printed in a readable format or
+the raw buffer may be printed to stdout for another program to parse.
+
+OPTIONS
+-------
+-b::
+--raw-binary::
+	Print the raw Changed Namespace List log buffer to stdout.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Print the Changed Allocated Namespace List Log page in a human readable format:
++
+------------
+# nvme changed-alloc-ns-list-log /dev/nvme0
+------------
++
+
+* Print the raw Changed Allocated Namespace List log to a file:
++
+------------
+# nvme changed-alloc-ns-list-log /dev/nvme0 --raw-binary > log.raw
+------------
++
+It is probably a bad idea to not redirect stdout when using this mode.
+
+NVME
+----
+Part of the nvme-user suite
diff --git a/Documentation/nvme-changed-ns-list-log.1 b/Documentation/nvme-changed-ns-list-log.1
index ce729f7..facfe17 100644
--- a/Documentation/nvme-changed-ns-list-log.1
+++ b/Documentation/nvme-changed-ns-list-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-changed-ns-list-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-CHANGED\-NS\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CHANGED\-NS\-L" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-changed-ns-list-log.html b/Documentation/nvme-changed-ns-list-log.html
index c7606df..c0569ad 100644
--- a/Documentation/nvme-changed-ns-list-log.html
+++ b/Documentation/nvme-changed-ns-list-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-changed-ns-list-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -846,7 +846,7 @@ Print the raw Changed Namespace List log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-cmdset-ind-id-ns.1 b/Documentation/nvme-cmdset-ind-id-ns.1
index 682c15d..be18f67 100644
--- a/Documentation/nvme-cmdset-ind-id-ns.1
+++ b/Documentation/nvme-cmdset-ind-id-ns.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-cmdset-ind-id-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-CMDSET\-IND\-I" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CMDSET\-IND\-I" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-cmdset-ind-id-ns.html b/Documentation/nvme-cmdset-ind-id-ns.html
index 5bf46af..3ea9e13 100644
--- a/Documentation/nvme-cmdset-ind-id-ns.html
+++ b/Documentation/nvme-cmdset-ind-id-ns.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-cmdset-ind-id-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -889,7 +889,7 @@ Have the program return the raw structure in binary:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-compare.1 b/Documentation/nvme-compare.1
index 556e3f5..cd3932f 100644
--- a/Documentation/nvme-compare.1
+++ b/Documentation/nvme-compare.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-compare
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-COMPARE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-COMPARE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-compare.html b/Documentation/nvme-compare.html
index bb0c7d7..a7b9d59 100644
--- a/Documentation/nvme-compare.html
+++ b/Documentation/nvme-compare.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-compare(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1125,7 +1125,7 @@ metadata is passes.</p></td>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-connect-all.1 b/Documentation/nvme-connect-all.1
index b101728..af089f0 100644
--- a/Documentation/nvme-connect-all.1
+++ b/Documentation/nvme-connect-all.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-connect-all
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-CONNECT\-ALL" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CONNECT\-ALL" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-connect-all.html b/Documentation/nvme-connect-all.html
index 80a9f37..a5f578a 100644
--- a/Documentation/nvme-connect-all.html
+++ b/Documentation/nvme-connect-all.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-connect-all(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1273,7 +1273,7 @@ nvme-connect(1)</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-connect.1 b/Documentation/nvme-connect.1
index aca8d8c..acb7331 100644
--- a/Documentation/nvme-connect.1
+++ b/Documentation/nvme-connect.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-connect
 .\"    Author: [see the "AUTHORS" section]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-CONNECT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CONNECT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-connect.html b/Documentation/nvme-connect.html
index def8aee..f182419 100644
--- a/Documentation/nvme-connect.html
+++ b/Documentation/nvme-connect.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-connect(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1235,7 +1235,7 @@ and <a href="mailto:hch@lst.de">Christoph Hellwig</a></p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-copy.1 b/Documentation/nvme-copy.1
index 82fa113..656e699 100644
--- a/Documentation/nvme-copy.1
+++ b/Documentation/nvme-copy.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-copy
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-COPY" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-COPY" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-copy.html b/Documentation/nvme-copy.html
index 6085489..c7258b7 100644
--- a/Documentation/nvme-copy.html
+++ b/Documentation/nvme-copy.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-copy(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1042,7 +1042,7 @@ logical block ranges to a single consecutive destination logical block range.</p
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-create-ns.1 b/Documentation/nvme-create-ns.1
index fe977f4..f105877 100644
--- a/Documentation/nvme-create-ns.1
+++ b/Documentation/nvme-create-ns.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-create-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-CREATE\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CREATE\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -123,12 +123,12 @@ Target block size the new namespace should be formatted as\&. Potential FLBAS va
 .PP
 \-S, \-\-nsze\-si
 .RS 4
-The namespace size (NSZE) in standard SI units (aligned on 1Mib boundaries, unless the controller recommends a smaller value)\&. The value SI suffixed is divided by the namespace LBA size to set as NSZE\&. If the value not suffixed it is set as same with the nsze option\&.
+The namespace size (NSZE) in standard SI units (aligned on 1Mib boundaries, unless the controller recommends a different value, see namespace granularity)\&. The value SI suffixed is divided by the namespace LBA size to set as NSZE\&. If the value not suffixed it is set as same with the nsze option\&.
 .RE
 .PP
 \-C, \-\-ncap\-si
 .RS 4
-The namespace capacity (NCAP) in standard SI units (aligned on 1Mib boundaries, unless the controller recommends a smaller value)\&. The value SI suffixed is divided by the namespace LBA size to set as NCAP\&. If the value not suffixed it is set as same with the ncap option\&.
+The namespace capacity (NCAP) in standard SI units (aligned on 1Mib boundaries, unless the controller recommends a different value, see namespace granularity)\&. The value SI suffixed is divided by the namespace LBA size to set as NCAP\&. If the value not suffixed it is set as same with the ncap option\&.
 .RE
 .PP
 \-z, \-\-azr
diff --git a/Documentation/nvme-create-ns.html b/Documentation/nvme-create-ns.html
index cc37359..1ff7301 100644
--- a/Documentation/nvme-create-ns.html
+++ b/Documentation/nvme-create-ns.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-create-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -936,7 +936,8 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
 <dd>
 <p>
         The namespace size (NSZE) in standard SI units (aligned on 1Mib boundaries,
-        unless the controller recommends a smaller value).
+        unless the controller recommends a different value, see namespace
+        granularity).
         The value SI suffixed is divided by the namespace LBA size to set as NSZE.
         If the value not suffixed it is set as same with the nsze option.
 </p>
@@ -950,7 +951,8 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
 <dd>
 <p>
         The namespace capacity (NCAP) in standard SI units (aligned on 1Mib boundaries,
-        unless the controller recommends a smaller value).
+        unless the controller recommends a different value, see namespace
+        granularity).
         The value SI suffixed is divided by the namespace LBA size to set as NCAP.
         If the value not suffixed it is set as same with the ncap option.
 </p>
@@ -1082,7 +1084,7 @@ Create a namespace:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-create-ns.txt b/Documentation/nvme-create-ns.txt
index 95a514d..74ca237 100644
--- a/Documentation/nvme-create-ns.txt
+++ b/Documentation/nvme-create-ns.txt
@@ -99,14 +99,16 @@ OPTIONS
 -S::
 --nsze-si::
 	The namespace size (NSZE) in standard SI units (aligned on 1Mib boundaries,
-	unless the controller recommends a smaller value).
+	unless the controller recommends a different value, see namespace
+	granularity).
 	The value SI suffixed is divided by the namespace LBA size to set as NSZE.
 	If the value not suffixed it is set as same with the nsze option.
 
 -C::
 --ncap-si::
 	The namespace capacity (NCAP) in standard SI units (aligned on 1Mib boundaries,
-	unless the controller recommends a smaller value).
+	unless the controller recommends a different value, see namespace
+	granularity).
 	The value SI suffixed is divided by the namespace LBA size to set as NCAP.
 	If the value not suffixed it is set as same with the ncap option.
 
diff --git a/Documentation/nvme-dapustor-smart-log-add.1 b/Documentation/nvme-dapustor-smart-log-add.1
index 6750164..a5ef9a3 100644
--- a/Documentation/nvme-dapustor-smart-log-add.1
+++ b/Documentation/nvme-dapustor-smart-log-add.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-dapustor-smart-log-add
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DAPUSTOR\-SMAR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DAPUSTOR\-SMAR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dapustor-smart-log-add.html b/Documentation/nvme-dapustor-smart-log-add.html
index f7a5825..65d79ca 100644
--- a/Documentation/nvme-dapustor-smart-log-add.html
+++ b/Documentation/nvme-dapustor-smart-log-add.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-dapustor-smart-log-add(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -849,7 +849,7 @@ Print the raw DapuStor Additional SMART log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-delete-ns.1 b/Documentation/nvme-delete-ns.1
index 7ac1853..0c05766 100644
--- a/Documentation/nvme-delete-ns.1
+++ b/Documentation/nvme-delete-ns.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-id-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-delete-ns.html b/Documentation/nvme-delete-ns.html
index 6ee087b..de96e89 100644
--- a/Documentation/nvme-delete-ns.html
+++ b/Documentation/nvme-delete-ns.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-id-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -835,7 +835,7 @@ The <code>'--namespace-id'</code> option is mandatory.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-dera-stat.1 b/Documentation/nvme-dera-stat.1
index e56fb7b..017928c 100644
--- a/Documentation/nvme-dera-stat.1
+++ b/Documentation/nvme-dera-stat.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-dera-stat
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DERA\-STAT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DERA\-STAT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dera-stat.html b/Documentation/nvme-dera-stat.html
index ee45937..cda7572 100644
--- a/Documentation/nvme-dera-stat.html
+++ b/Documentation/nvme-dera-stat.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-dera-stat(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -797,7 +797,7 @@ Print the Dera Device status and Additional SMART log page in a human readable f
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-detach-ns.1 b/Documentation/nvme-detach-ns.1
index c9a8e1c..ee26c86 100644
--- a/Documentation/nvme-detach-ns.1
+++ b/Documentation/nvme-detach-ns.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-detach-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DETACH\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DETACH\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-detach-ns.html b/Documentation/nvme-detach-ns.html
index 025bf6a..630e452 100644
--- a/Documentation/nvme-detach-ns.html
+++ b/Documentation/nvme-detach-ns.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-detach-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -834,7 +834,7 @@ controller identifiers.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-device-self-test.1 b/Documentation/nvme-device-self-test.1
index d21ea59..646cda1 100644
--- a/Documentation/nvme-device-self-test.1
+++ b/Documentation/nvme-device-self-test.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-device-self-test
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DEVICE\-SELF\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DEVICE\-SELF\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-device-self-test.html b/Documentation/nvme-device-self-test.html
index 1f0c092..4b4e3c3 100644
--- a/Documentation/nvme-device-self-test.html
+++ b/Documentation/nvme-device-self-test.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-device-self-test(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -885,7 +885,7 @@ Abort the device self-test operation in the namespace-id 1:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-dim.1 b/Documentation/nvme-dim.1
index 6f62713..3fa8ab5 100644
--- a/Documentation/nvme-dim.1
+++ b/Documentation/nvme-dim.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-dim
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DIM" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DIM" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dim.html b/Documentation/nvme-dim.html
index 82c9f0c..a38c0f0 100644
--- a/Documentation/nvme-dim.html
+++ b/Documentation/nvme-dim.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-dim(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -885,7 +885,7 @@ Deregister from Central Discovery Controller (CDC) associated with nvme4
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-dir-receive.1 b/Documentation/nvme-dir-receive.1
index 49e182c..4c01fef 100644
--- a/Documentation/nvme-dir-receive.1
+++ b/Documentation/nvme-dir-receive.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-dir-receive
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DIR\-RECEIVE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DIR\-RECEIVE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dir-receive.html b/Documentation/nvme-dir-receive.html
index d425384..23d0d4d 100644
--- a/Documentation/nvme-dir-receive.html
+++ b/Documentation/nvme-dir-receive.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-dir-receive(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1001,7 +1001,7 @@ Get streams directive status :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-dir-send.1 b/Documentation/nvme-dir-send.1
index 6e16d68..94b48cf 100644
--- a/Documentation/nvme-dir-send.1
+++ b/Documentation/nvme-dir-send.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-dir-send
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DIR\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DIR\-SEND" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dir-send.html b/Documentation/nvme-dir-send.html
index 4168304..b669e9f 100644
--- a/Documentation/nvme-dir-send.html
+++ b/Documentation/nvme-dir-send.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-dir-send(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1014,7 +1014,7 @@ Release stream ID 3 :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-disconnect-all.1 b/Documentation/nvme-disconnect-all.1
index 49a6455..44a592d 100644
--- a/Documentation/nvme-disconnect-all.1
+++ b/Documentation/nvme-disconnect-all.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-disconnect-all
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DISCONNECT\-AL" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DISCONNECT\-AL" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-disconnect-all.html b/Documentation/nvme-disconnect-all.html
index b579049..67d0270 100644
--- a/Documentation/nvme-disconnect-all.html
+++ b/Documentation/nvme-disconnect-all.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-disconnect-all(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -825,7 +825,7 @@ Disconnect all existing nvme controllers:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-disconnect.1 b/Documentation/nvme-disconnect.1
index aa443e8..9b61741 100644
--- a/Documentation/nvme-disconnect.1
+++ b/Documentation/nvme-disconnect.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-disconnect
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DISCONNECT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DISCONNECT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-disconnect.html b/Documentation/nvme-disconnect.html
index 29bb6ed..2d3c83d 100644
--- a/Documentation/nvme-disconnect.html
+++ b/Documentation/nvme-disconnect.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-disconnect(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -862,7 +862,7 @@ Disconnect the controller nvme4
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-discover.1 b/Documentation/nvme-discover.1
index 8590c03..4202689 100644
--- a/Documentation/nvme-discover.1
+++ b/Documentation/nvme-discover.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-discover
 .\"    Author: [see the "AUTHORS" section]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DISCOVER" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DISCOVER" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-discover.html b/Documentation/nvme-discover.html
index 7ee02b4..b4e2a5e 100644
--- a/Documentation/nvme-discover.html
+++ b/Documentation/nvme-discover.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-discover(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1322,7 +1322,7 @@ nvme-connect-all(1)</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-dispersed-ns-participating-nss-log.txt b/Documentation/nvme-dispersed-ns-participating-nss-log.txt
new file mode 100644
index 0000000..93b0062
--- /dev/null
+++ b/Documentation/nvme-dispersed-ns-participating-nss-log.txt
@@ -0,0 +1,55 @@
+nvme-dispersed-ns-participating-nss-log(1)
+==========================================
+
+NAME
+----
+nvme-dispersed-ns-participating-nss-log - Retrieve Dispersed Namespace
+Participating NVM Subsystems Log, show it
+
+SYNOPSIS
+--------
+[verse]
+'nvme dispersed-ns-participating-nss-log' <device>
+			[--namespace-id=<nsid> | -n <nsid>] [--verbose | -v]
+			[--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it
+
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-n <nsid>::
+--namespace-id=<nsid>::
+	The namespace identifier to delete.
+	Retrieve the dispersed namespace participating NVM subsystems log for
+	the given nsid.
+
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Has the program issue a dispersed-ns-participating-nss-log
++
+------------
+# nvme dispersed-ns-participating-nss-log /dev/nvme0 --namespace-id=2
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-dsm.1 b/Documentation/nvme-dsm.1
index e7a8b58..30c5764 100644
--- a/Documentation/nvme-dsm.1
+++ b/Documentation/nvme-dsm.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-dsm
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-DSM" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DSM" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dsm.html b/Documentation/nvme-dsm.html
index 2761bee..65aeb0b 100644
--- a/Documentation/nvme-dsm.html
+++ b/Documentation/nvme-dsm.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-dsm(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -930,7 +930,7 @@ any settings from the flags may have provided.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-effects-log.1 b/Documentation/nvme-effects-log.1
index 5960677..3807cbf 100644
--- a/Documentation/nvme-effects-log.1
+++ b/Documentation/nvme-effects-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-effects-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-EFFECTS\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-EFFECTS\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-effects-log.html b/Documentation/nvme-effects-log.html
index 7f949af..5941a69 100644
--- a/Documentation/nvme-effects-log.html
+++ b/Documentation/nvme-effects-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-effects-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -869,7 +869,7 @@ Have the program return the raw structure in binary:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-endurance-event-agg-log.1 b/Documentation/nvme-endurance-event-agg-log.1
index 0c5e181..1d135ec 100644
--- a/Documentation/nvme-endurance-event-agg-log.1
+++ b/Documentation/nvme-endurance-event-agg-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-endurance-event-agg-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ENDURANCE\-EVE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ENDURANCE\-EVE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-endurance-event-agg-log.html b/Documentation/nvme-endurance-event-agg-log.html
index 9f426a2..5590987 100644
--- a/Documentation/nvme-endurance-event-agg-log.html
+++ b/Documentation/nvme-endurance-event-agg-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-endurance-event-agg-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -862,7 +862,7 @@ Print the raw Endurance log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-endurance-log.1 b/Documentation/nvme-endurance-log.1
index 26ff933..753ee30 100644
--- a/Documentation/nvme-endurance-log.1
+++ b/Documentation/nvme-endurance-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-endurance-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ENDURANCE\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ENDURANCE\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-endurance-log.html b/Documentation/nvme-endurance-log.html
index f72f35e..e96a936 100644
--- a/Documentation/nvme-endurance-log.html
+++ b/Documentation/nvme-endurance-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-endurance-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -845,7 +845,7 @@ Print the raw Endurance log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-error-log.1 b/Documentation/nvme-error-log.1
index 9a4b8a9..7267411 100644
--- a/Documentation/nvme-error-log.1
+++ b/Documentation/nvme-error-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-error-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ERROR\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ERROR\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-error-log.html b/Documentation/nvme-error-log.html
index 8db4c61..790a25f 100644
--- a/Documentation/nvme-error-log.html
+++ b/Documentation/nvme-error-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-error-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -860,7 +860,7 @@ Print the raw output to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fdp-configs.1 b/Documentation/nvme-fdp-configs.1
index 500375c..41bd295 100644
--- a/Documentation/nvme-fdp-configs.1
+++ b/Documentation/nvme-fdp-configs.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fdp-configs
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FDP\-CONFIGS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-CONFIGS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-configs.html b/Documentation/nvme-fdp-configs.html
index aa79a09..c1c5f29 100644
--- a/Documentation/nvme-fdp-configs.html
+++ b/Documentation/nvme-fdp-configs.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fdp-configs(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -826,7 +826,7 @@ the possible configurations for Flexible Data Placement.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fdp-events.1 b/Documentation/nvme-fdp-events.1
index 39d80c5..ff50ed7 100644
--- a/Documentation/nvme-fdp-events.1
+++ b/Documentation/nvme-fdp-events.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fdp-events
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FDP\-EVENTS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-EVENTS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-events.html b/Documentation/nvme-fdp-events.html
index fed22f9..8af3021 100644
--- a/Documentation/nvme-fdp-events.html
+++ b/Documentation/nvme-fdp-events.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fdp-events(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -825,7 +825,7 @@ Units and media usage in an Endurance Group.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fdp-feature.1 b/Documentation/nvme-fdp-feature.1
new file mode 100644
index 0000000..32d76ce
--- /dev/null
+++ b/Documentation/nvme-fdp-feature.1
@@ -0,0 +1,86 @@
+'\" t
+.\"     Title: nvme-fdp-feature
+.\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
+.\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
+.\"      Date: 03/17/2025
+.\"    Manual: NVMe Manual
+.\"    Source: NVMe
+.\"  Language: English
+.\"
+.TH "NVME\-FDP\-FEATURE" "1" "03/17/2025" "NVMe" "NVMe Manual"
+.\" -----------------------------------------------------------------
+.\" * Define some portability stuff
+.\" -----------------------------------------------------------------
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.\" http://bugs.debian.org/507673
+.\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html
+.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+.ie \n(.g .ds Aq \(aq
+.el       .ds Aq '
+.\" -----------------------------------------------------------------
+.\" * set default formatting
+.\" -----------------------------------------------------------------
+.\" disable hyphenation
+.nh
+.\" disable justification (adjust text to left margin only)
+.ad l
+.\" -----------------------------------------------------------------
+.\" * MAIN CONTENT STARTS HERE *
+.\" -----------------------------------------------------------------
+.SH "NAME"
+nvme-fdp-feature \- Show or change Flexible Data Placement (FDP) Feature
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme fdp\fR <device> [\-\-endgrp\-id=<NUM> | \-e <NUM>]
+                [\-\-enable\-conf\-idx=<NUM> | \-c <NUM>]
+                [\-\-disable | \-d]
+                [\-\-verbose | \-v]
+.fi
+.SH "DESCRIPTION"
+.sp
+For the NVMe device given, configure and manage the Flexible Data Placement (FDP) feature\&.
+.sp
+This command can be used to either show the current FDP feature configuration or change it\&.
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+ If no `\-\-enable\-conf\-idx` or `\-\-disable` options are provided, the current configuration is
+displayed\&.
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+If the \-\-enable\-conf\-idx or \-\-disable options are provided, configuration is changed accordingly\&. Device may refuse the change if there is a namespace\&.
+.sp
+The <device> parameter is mandatory and must be a NVMe character device (ex: /dev/nvme0)
+.SH "OPTIONS"
+.PP
+\-e <NUM>, \-\-endgrp\-id=<NUM>
+.RS 4
+Specify the endurance group ID\&. This option is mandatory if device supports endurance groups\&.
+.RE
+.PP
+\-c <NUM>, \-\-enable\-conf\-idx=<NUM>
+.RS 4
+Enable FDP feature with the specified configuration\&. The configuration index matches position listed by nvme\-fdp\-config(1)\&.
+.RE
+.PP
+\-d, \-\-disable
+.RS 4
+Disable the current FDP feature configuration\&.
+.RE
+.PP
+\-v, \-\-verbose
+.RS 4
+Increase verbosity of the output\&.
+.RE
+.SH "SEE ALSO"
+.sp
+nvme\-list\-endgrp(1) nvme\-fdp\-config(1)
+.SH "NVME"
+.sp
+Part of nvme\-cli
diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-fdp-feature.html
similarity index 86%
copy from Documentation/nvme-zns-close-zone.html
copy to Documentation/nvme-fdp-feature.html
index adef16b..d5a37b6 100644
--- a/Documentation/nvme-zns-close-zone.html
+++ b/Documentation/nvme-fdp-feature.html
@@ -4,8 +4,8 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
-<title>nvme-zns-close-zone(1)</title>
+<meta name="generator" content="AsciiDoc 10.2.0" />
+<title>nvme-fdp-feature(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
 
@@ -735,12 +735,12 @@ asciidoc.install();
 <body class="manpage">
 <div id="header">
 <h1>
-nvme-zns-close-zone(1) Manual Page
+nvme-fdp-feature(1) Manual Page
 </h1>
 <h2>NAME</h2>
 <div class="sectionbody">
-<p>nvme-zns-close-zone -
-   Closes one or all zones
+<p>nvme-fdp-feature -
+   Show or change Flexible Data Placement (FDP) Feature
 </p>
 </div>
 </div>
@@ -749,10 +749,10 @@ nvme-zns-close-zone(1) Manual Page
 <h2 id="_synopsis">SYNOPSIS</h2>
 <div class="sectionbody">
 <div class="verseblock">
-<pre class="content"><em>nvme zns close-zone</em> &lt;device&gt; [--namespace-id=&lt;NUM&gt; | -n &lt;NUM&gt;]
-                                                [--start-lba=&lt;LBA&gt; | -s &lt;LBA&gt;]
-                                                [--select-all | -a]
-                                                [--timeout=&lt;timeout&gt; | -t &lt;timeout&gt;]</pre>
+<pre class="content"><em>nvme fdp</em> &lt;device&gt; [--endgrp-id=&lt;NUM&gt; | -e &lt;NUM&gt;]
+                [--enable-conf-idx=&lt;NUM&gt; | -c &lt;NUM&gt;]
+                [--disable | -d]
+                [--verbose | -v]</pre>
 <div class="attribution">
 </div></div>
 </div>
@@ -760,10 +760,16 @@ nvme-zns-close-zone(1) Manual Page
 <div class="sect1">
 <h2 id="_description">DESCRIPTION</h2>
 <div class="sectionbody">
-<div class="paragraph"><p>For the NVMe device given, issues the Zone Management Send command with the
-"Close Zone" action. This will transition the zone to the closed state.</p></div>
-<div class="paragraph"><p>The &lt;device&gt; parameter is mandatory and may be either the NVMe character
-device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></div>
+<div class="paragraph"><p>For the NVMe device given, configure and manage the Flexible Data Placement (FDP) feature.</p></div>
+<div class="paragraph"><p>This command can be used to either show the current FDP feature configuration or change it.</p></div>
+<div class="literalblock">
+<div class="content">
+<pre><code> If no `--enable-conf-idx` or `--disable` options are provided, the current configuration is
+displayed.</code></pre>
+</div></div>
+<div class="paragraph"><p>If the <code>--enable-conf-idx</code> or <code>--disable</code> options are provided, configuration is changed
+accordingly. Device may refuse the change if there is a namespace.</p></div>
+<div class="paragraph"><p>The &lt;device&gt; parameter is mandatory and must be a NVMe character device (ex: /dev/nvme0)</p></div>
 </div>
 </div>
 <div class="sect1">
@@ -771,68 +777,58 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
 <div class="sectionbody">
 <div class="dlist"><dl>
 <dt class="hdlist1">
--n &lt;NUM&gt;
+-e &lt;NUM&gt;
 </dt>
 <dt class="hdlist1">
---namespace-id=&lt;NUM&gt;
+--endgrp-id=&lt;NUM&gt;
 </dt>
 <dd>
 <p>
-        Use the provided namespace id for the command. If not provided, the
-        namespace id of the block device will be used. If the command is issued
-        to a non-block device, the parameter is required.
+    Specify the endurance group ID. This option is mandatory if device supports endurance groups.
 </p>
 </dd>
 <dt class="hdlist1">
--s &lt;lba&gt;
+-c &lt;NUM&gt;
 </dt>
 <dt class="hdlist1">
---start-lba=&lt;lba&gt;
+--enable-conf-idx=&lt;NUM&gt;
 </dt>
 <dd>
 <p>
-        The starting LBA of the zone to close.
+    Enable FDP feature with the specified configuration. The configuration index matches position
+    listed by nvme-fdp-config(1).
 </p>
 </dd>
 <dt class="hdlist1">
--a
+-d
 </dt>
 <dt class="hdlist1">
---select-all
+--disable
 </dt>
 <dd>
 <p>
-        Select all zones for this action
+    Disable the current FDP feature configuration.
 </p>
 </dd>
 <dt class="hdlist1">
--t &lt;timeout&gt;
+-v
 </dt>
 <dt class="hdlist1">
---timeout=&lt;timeout&gt;
+--verbose
 </dt>
 <dd>
 <p>
-        Override default timeout value. In milliseconds.
+    Increase verbosity of the output.
 </p>
 </dd>
 </dl></div>
 </div>
 </div>
 <div class="sect1">
-<h2 id="_examples">EXAMPLES</h2>
+<h2 id="_see_also">SEE ALSO</h2>
 <div class="sectionbody">
-<div class="ulist"><ul>
-<li>
-<p>
-Close all zones on namespace 1:
-</p>
-<div class="listingblock">
-<div class="content">
-<pre><code># nvme zns close-zone /dev/nvme0 -a -n 1</code></pre>
-</div></div>
-</li>
-</ul></div>
+<div class="paragraph"><p>nvme-list-endgrp(1)
+nvme-fdp-config(1)</p></div>
 </div>
 </div>
 <div class="sect1">
@@ -846,7 +842,7 @@ Close all zones on namespace 1:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fdp-feature.txt b/Documentation/nvme-fdp-feature.txt
new file mode 100644
index 0000000..543c788
--- /dev/null
+++ b/Documentation/nvme-fdp-feature.txt
@@ -0,0 +1,56 @@
+nvme-fdp-feature(1)
+===================
+
+NAME
+----
+nvme-fdp-feature - Show or change Flexible Data Placement (FDP) Feature
+
+SYNOPSIS
+--------
+[verse]
+'nvme fdp' <device> [--endgrp-id=<NUM> | -e <NUM>]
+                [--enable-conf-idx=<NUM> | -c <NUM>]
+                [--disable | -d]
+                [--verbose | -v]
+
+DESCRIPTION
+-----------
+For the NVMe device given, configure and manage the Flexible Data Placement (FDP) feature.
+
+This command can be used to either show the current FDP feature configuration or change it.
+
+ If no `--enable-conf-idx` or `--disable` options are provided, the current configuration is
+displayed.
+
+If the `--enable-conf-idx` or `--disable` options are provided, configuration is changed
+accordingly. Device may refuse the change if there is a namespace.
+
+The <device> parameter is mandatory and must be a NVMe character device (ex: /dev/nvme0)
+
+OPTIONS
+-------
+-e <NUM>::
+--endgrp-id=<NUM>::
+    Specify the endurance group ID. This option is mandatory if device supports endurance groups.
+
+-c <NUM>::
+--enable-conf-idx=<NUM>::
+    Enable FDP feature with the specified configuration. The configuration index matches position
+    listed by nvme-fdp-config(1).
+
+-d::
+--disable::
+    Disable the current FDP feature configuration.
+
+-v::
+--verbose::
+    Increase verbosity of the output.
+
+SEE ALSO
+--------
+nvme-list-endgrp(1)
+nvme-fdp-config(1)
+
+NVME
+----
+Part of nvme-cli
\ No newline at end of file
diff --git a/Documentation/nvme-fdp-set-events.1 b/Documentation/nvme-fdp-set-events.1
index 1f0c9d9..6654b97 100644
--- a/Documentation/nvme-fdp-set-events.1
+++ b/Documentation/nvme-fdp-set-events.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fdp-set-events
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FDP\-SET\-EVEN" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-SET\-EVEN" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-set-events.html b/Documentation/nvme-fdp-set-events.html
index afd77fc..4a3e648 100644
--- a/Documentation/nvme-fdp-set-events.html
+++ b/Documentation/nvme-fdp-set-events.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fdp-set-events(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -816,7 +816,7 @@ Handle.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fdp-stats.1 b/Documentation/nvme-fdp-stats.1
index d0bebf0..dd67346 100644
--- a/Documentation/nvme-fdp-stats.1
+++ b/Documentation/nvme-fdp-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fdp-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FDP\-STATS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-STATS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-stats.html b/Documentation/nvme-fdp-stats.html
index dc431b2..14c5d22 100644
--- a/Documentation/nvme-fdp-stats.html
+++ b/Documentation/nvme-fdp-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fdp-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -814,7 +814,7 @@ the life of the FDP configuration in an Endurance Group.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fdp-status.1 b/Documentation/nvme-fdp-status.1
index 90f1de7..c809ef2 100644
--- a/Documentation/nvme-fdp-status.1
+++ b/Documentation/nvme-fdp-status.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fdp-status
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FDP\-STATUS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-STATUS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-status.html b/Documentation/nvme-fdp-status.html
index dbb9813..4942f42 100644
--- a/Documentation/nvme-fdp-status.html
+++ b/Documentation/nvme-fdp-status.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fdp-status(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -814,7 +814,7 @@ are accessible by the specified namespace.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fdp-update.1 b/Documentation/nvme-fdp-update.1
index a7d1eb5..876d4ff 100644
--- a/Documentation/nvme-fdp-update.1
+++ b/Documentation/nvme-fdp-update.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fdp-update
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FDP\-UPDATE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-UPDATE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-update.html b/Documentation/nvme-fdp-update.html
index ee9d309..8e6c2ff 100644
--- a/Documentation/nvme-fdp-update.html
+++ b/Documentation/nvme-fdp-update.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fdp-update(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -802,7 +802,7 @@ a different Reclaim Unit accessible by the specified namespace.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fdp-usage.1 b/Documentation/nvme-fdp-usage.1
index 82434cf..eaf6b6f 100644
--- a/Documentation/nvme-fdp-usage.1
+++ b/Documentation/nvme-fdp-usage.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fdp-usage
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FDP\-USAGE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-USAGE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-usage.html b/Documentation/nvme-fdp-usage.html
index 2d8531e..6589f0c 100644
--- a/Documentation/nvme-fdp-usage.html
+++ b/Documentation/nvme-fdp-usage.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fdp-usage(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -815,7 +815,7 @@ Endurance Group.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fid-support-effects-log.1 b/Documentation/nvme-fid-support-effects-log.1
index 70f3a0a..0e30c0d 100644
--- a/Documentation/nvme-fid-support-effects-log.1
+++ b/Documentation/nvme-fid-support-effects-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fid-support-effects-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FID\-SUPPORT\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FID\-SUPPORT\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fid-support-effects-log.html b/Documentation/nvme-fid-support-effects-log.html
index 58af505..84c7431 100644
--- a/Documentation/nvme-fid-support-effects-log.html
+++ b/Documentation/nvme-fid-support-effects-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fid-support-effects-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -825,7 +825,7 @@ raw buffer may be printed to stdout.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-flush.1 b/Documentation/nvme-flush.1
index 5e3e486..9d97671 100644
--- a/Documentation/nvme-flush.1
+++ b/Documentation/nvme-flush.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-flush
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FLUSH" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FLUSH" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-flush.html b/Documentation/nvme-flush.html
index 66fe2fa..61536cf 100644
--- a/Documentation/nvme-flush.html
+++ b/Documentation/nvme-flush.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-flush(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -824,7 +824,7 @@ any namespace.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-format.1 b/Documentation/nvme-format.1
index 6155bdf..cd81237 100644
--- a/Documentation/nvme-format.1
+++ b/Documentation/nvme-format.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-format
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FORMAT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FORMAT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-format.html b/Documentation/nvme-format.html
index a0ca75a..0c49c80 100644
--- a/Documentation/nvme-format.html
+++ b/Documentation/nvme-format.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-format(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1056,7 +1056,7 @@ information:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fw-commit.1 b/Documentation/nvme-fw-commit.1
index 01b0dbd..71a12be 100644
--- a/Documentation/nvme-fw-commit.1
+++ b/Documentation/nvme-fw-commit.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fw-commit
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FW\-COMMIT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FW\-COMMIT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fw-commit.html b/Documentation/nvme-fw-commit.html
index 6a813f8..49946dd 100644
--- a/Documentation/nvme-fw-commit.html
+++ b/Documentation/nvme-fw-commit.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fw-commit(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -941,7 +941,7 @@ commit the last downloaded fw to slot 1.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fw-download.1 b/Documentation/nvme-fw-download.1
index 8fef9d6..4d83d1d 100644
--- a/Documentation/nvme-fw-download.1
+++ b/Documentation/nvme-fw-download.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fw-download
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FW\-DOWNLOAD" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FW\-DOWNLOAD" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fw-download.html b/Documentation/nvme-fw-download.html
index a533b7f..6ac26c6 100644
--- a/Documentation/nvme-fw-download.html
+++ b/Documentation/nvme-fw-download.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fw-download(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -888,7 +888,7 @@ Transfer a firmware size 128KiB at a time:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-fw-log.1 b/Documentation/nvme-fw-log.1
index 6f1bd43..c6626d6 100644
--- a/Documentation/nvme-fw-log.1
+++ b/Documentation/nvme-fw-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-fw-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-FW\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FW\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fw-log.html b/Documentation/nvme-fw-log.html
index a06590d..aefeab6 100644
--- a/Documentation/nvme-fw-log.html
+++ b/Documentation/nvme-fw-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-fw-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -846,7 +846,7 @@ Print the log firmware to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-gen-hostnqn.1 b/Documentation/nvme-gen-hostnqn.1
index 9ef79e6..6d28eee 100644
--- a/Documentation/nvme-gen-hostnqn.1
+++ b/Documentation/nvme-gen-hostnqn.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-gen-hostnqn
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-GEN\-HOSTNQN" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GEN\-HOSTNQN" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-gen-hostnqn.html b/Documentation/nvme-gen-hostnqn.html
index 99fde8f..59d4007 100644
--- a/Documentation/nvme-gen-hostnqn.html
+++ b/Documentation/nvme-gen-hostnqn.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-gen-hostnqn(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -809,7 +809,7 @@ and prints it to stdout.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-get-feature.1 b/Documentation/nvme-get-feature.1
index 64a3631..3ce41cc 100644
--- a/Documentation/nvme-get-feature.1
+++ b/Documentation/nvme-get-feature.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-get-feature
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-GET\-FEATURE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-FEATURE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-feature.html b/Documentation/nvme-get-feature.html
index 2d2858b..d676d04 100644
--- a/Documentation/nvme-get-feature.html
+++ b/Documentation/nvme-get-feature.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-get-feature(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1027,7 +1027,7 @@ format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-get-lba-status.1 b/Documentation/nvme-get-lba-status.1
index 4f6ded9..a785a12 100644
--- a/Documentation/nvme-get-lba-status.1
+++ b/Documentation/nvme-get-lba-status.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-get-lba-status
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-GET\-LBA\-STAT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-LBA\-STAT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-lba-status.html b/Documentation/nvme-get-lba-status.html
index 8c5b02b..f8327b2 100644
--- a/Documentation/nvme-get-lba-status.html
+++ b/Documentation/nvme-get-lba-status.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-get-lba-status(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -907,7 +907,7 @@ Get LBA Status of the namespace 1 from SLBA 10 for the max Dwords of 0x1000
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-get-log.1 b/Documentation/nvme-get-log.1
index 933043e..cf038ab 100644
--- a/Documentation/nvme-get-log.1
+++ b/Documentation/nvme-get-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-get-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-GET\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-log.html b/Documentation/nvme-get-log.html
index 501bc80..08aeecc 100644
--- a/Documentation/nvme-get-log.html
+++ b/Documentation/nvme-get-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-get-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -997,7 +997,7 @@ Have the program return the raw log page in binary:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-get-ns-id.1 b/Documentation/nvme-get-ns-id.1
index 4d4e80e..8feae47 100644
--- a/Documentation/nvme-get-ns-id.1
+++ b/Documentation/nvme-get-ns-id.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-get-ns-id
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-GET\-NS\-ID" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-NS\-ID" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-ns-id.html b/Documentation/nvme-get-ns-id.html
index 648e70c..c0970ff 100644
--- a/Documentation/nvme-get-ns-id.html
+++ b/Documentation/nvme-get-ns-id.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-get-ns-id(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -818,7 +818,7 @@ Shows the namespace id for the given block device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-get-property.1 b/Documentation/nvme-get-property.1
index 764aaba..5d8a3af 100644
--- a/Documentation/nvme-get-property.1
+++ b/Documentation/nvme-get-property.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-get-property
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-GET\-PROPERTY" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-PROPERTY" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-property.html b/Documentation/nvme-get-property.html
index a8a6c80..0ae9f84 100644
--- a/Documentation/nvme-get-property.html
+++ b/Documentation/nvme-get-property.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-get-property(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -879,7 +879,7 @@ Then look for NVMe Fabrics command (0x7f) at trace
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-get-reg.txt b/Documentation/nvme-get-reg.txt
index 5e9cd95..74fe324 100644
--- a/Documentation/nvme-get-reg.txt
+++ b/Documentation/nvme-get-reg.txt
@@ -22,6 +22,9 @@ DESCRIPTION
 -----------
 Read and show the defined NVMe controller register.
 
+The <device> parameter is mandatory and must be the nvme admin character
+device (ex: /dev/nvme0).
+
 OPTIONS
 -------
 -O <offset>::
diff --git a/Documentation/nvme-help.1 b/Documentation/nvme-help.1
index 01dfdf0..5099550 100644
--- a/Documentation/nvme-help.1
+++ b/Documentation/nvme-help.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-help
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-HELP" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-HELP" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-help.html b/Documentation/nvme-help.html
index f5497af..f9a8bf9 100644
--- a/Documentation/nvme-help.html
+++ b/Documentation/nvme-help.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-help(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -794,7 +794,7 @@ Show help for nvme smart log:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-host-discovery-log.txt b/Documentation/nvme-host-discovery-log.txt
new file mode 100644
index 0000000..f99ee4f
--- /dev/null
+++ b/Documentation/nvme-host-discovery-log.txt
@@ -0,0 +1,57 @@
+nvme-host-discovery-log(1)
+==========================
+
+NAME
+----
+nvme-host-discovery-log - Retrieve Host Discovery Log, show it
+
+SYNOPSIS
+--------
+[verse]
+'nvme host-discovery-log' <device> [--all-host-entries | -a] [--rae | -r]
+			[--verbose | -v] [--output-format=<fmt> | -o <fmt>]
+			[--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve Host Discovery Log, show it
+
+The <device> parameter is mandatory NVMe MI device supported by the discovery
+controller (ex: mctp:<net>,<eid>[:ctrl-id]).
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-a::
+--all-host-entries::
+	All Host Entries.
+
+-r::
+--rae::
+	Retain an Asynchronous Event.
+
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Has the program issue a host-discovery-log
++
+------------
+# nvme host-discovery-log mctp:<net>,<eid>[:ctrl-id]
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-huawei-id-ctrl.1 b/Documentation/nvme-huawei-id-ctrl.1
index 31709d6..4cffaf5 100644
--- a/Documentation/nvme-huawei-id-ctrl.1
+++ b/Documentation/nvme-huawei-id-ctrl.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-huawei-id-ctrl
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-HUAWEI\-ID\-CT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-HUAWEI\-ID\-CT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-huawei-id-ctrl.html b/Documentation/nvme-huawei-id-ctrl.html
index 48f4a73..2203f88 100644
--- a/Documentation/nvme-huawei-id-ctrl.html
+++ b/Documentation/nvme-huawei-id-ctrl.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-huawei-id-ctrl(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -855,7 +855,7 @@ fields in a human readable format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-huawei-list.1 b/Documentation/nvme-huawei-list.1
index 482dd7e..2f3d4c2 100644
--- a/Documentation/nvme-huawei-list.1
+++ b/Documentation/nvme-huawei-list.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-list
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-LIST" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-huawei-list.html b/Documentation/nvme-huawei-list.html
index fdb6f05..8959f53 100644
--- a/Documentation/nvme-huawei-list.html
+++ b/Documentation/nvme-huawei-list.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-list(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -797,7 +797,7 @@ for those Huawei devices as well as some pertinent information about them.</p></
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-id-ctrl.1 b/Documentation/nvme-id-ctrl.1
index de28c6e..0b6e52d 100644
--- a/Documentation/nvme-id-ctrl.1
+++ b/Documentation/nvme-id-ctrl.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-id-ctrl
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-ctrl.html b/Documentation/nvme-id-ctrl.html
index 09e7967..c3c50b5 100644
--- a/Documentation/nvme-id-ctrl.html
+++ b/Documentation/nvme-id-ctrl.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-id-ctrl(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -921,7 +921,7 @@ int main(int argc, char **argv)
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-id-domain.1 b/Documentation/nvme-id-domain.1
index cba5c4b..24a6c5e 100644
--- a/Documentation/nvme-id-domain.1
+++ b/Documentation/nvme-id-domain.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-id-domain
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ID\-DOMAIN" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-DOMAIN" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-domain.html b/Documentation/nvme-id-domain.html
index 76eeaf5..6e127e6 100644
--- a/Documentation/nvme-id-domain.html
+++ b/Documentation/nvme-id-domain.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-id-domain(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -823,7 +823,7 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-id-iocs.1 b/Documentation/nvme-id-iocs.1
index 951f3cd..c8c3a9a 100644
--- a/Documentation/nvme-id-iocs.1
+++ b/Documentation/nvme-id-iocs.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-id-iocs
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ID\-IOCS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-IOCS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-iocs.html b/Documentation/nvme-id-iocs.html
index bd0410f..f5563e0 100644
--- a/Documentation/nvme-id-iocs.html
+++ b/Documentation/nvme-id-iocs.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-id-iocs(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -855,7 +855,7 @@ show the fields in human readable format
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-id-ns.1 b/Documentation/nvme-id-ns.1
index f3233c3..b268551 100644
--- a/Documentation/nvme-id-ns.1
+++ b/Documentation/nvme-id-ns.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-id-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-ns.html b/Documentation/nvme-id-ns.html
index 605c675..6b26e9b 100644
--- a/Documentation/nvme-id-ns.html
+++ b/Documentation/nvme-id-ns.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-id-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -966,7 +966,7 @@ int main(int argc, char **argv)
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-id-nvmset.1 b/Documentation/nvme-id-nvmset.1
index 0c31cc0..807433e 100644
--- a/Documentation/nvme-id-nvmset.1
+++ b/Documentation/nvme-id-nvmset.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-id-nvmset
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ID\-NVMSET" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NVMSET" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-nvmset.html b/Documentation/nvme-id-nvmset.html
index 2b1e118..6e5dff1 100644
--- a/Documentation/nvme-id-nvmset.html
+++ b/Documentation/nvme-id-nvmset.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-id-nvmset(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -862,7 +862,7 @@ as shown in the above example, or you can <code>'cat'</code> a saved output buff
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-inspur-nvme-vendor-log.1 b/Documentation/nvme-inspur-nvme-vendor-log.1
index 70d2c71..2319969 100644
--- a/Documentation/nvme-inspur-nvme-vendor-log.1
+++ b/Documentation/nvme-inspur-nvme-vendor-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-inspur-nvme-vendor-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-INSPUR\-NVME\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INSPUR\-NVME\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-inspur-nvme-vendor-log.html b/Documentation/nvme-inspur-nvme-vendor-log.html
index 523c223..033806f 100644
--- a/Documentation/nvme-inspur-nvme-vendor-log.html
+++ b/Documentation/nvme-inspur-nvme-vendor-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-inspur-nvme-vendor-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -796,7 +796,7 @@ Print the Inspur Device Vendor log page in a human readable format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-intel-id-ctrl.1 b/Documentation/nvme-intel-id-ctrl.1
index 0db9668..d7ef67d 100644
--- a/Documentation/nvme-intel-id-ctrl.1
+++ b/Documentation/nvme-intel-id-ctrl.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-intel-id-ctrl
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-INTEL\-ID\-CTR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-ID\-CTR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-id-ctrl.html b/Documentation/nvme-intel-id-ctrl.html
index 82a2c7c..3708840 100644
--- a/Documentation/nvme-intel-id-ctrl.html
+++ b/Documentation/nvme-intel-id-ctrl.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-intel-id-ctrl(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -853,7 +853,7 @@ fields in a human readable format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-intel-internal-log.1 b/Documentation/nvme-intel-internal-log.1
index f43c6d5..850d764 100644
--- a/Documentation/nvme-intel-internal-log.1
+++ b/Documentation/nvme-intel-internal-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-intel-internal-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-INTEL\-INTERNA" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-INTERNA" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-internal-log.html b/Documentation/nvme-intel-internal-log.html
index 6328ab8..af219ac 100644
--- a/Documentation/nvme-intel-internal-log.html
+++ b/Documentation/nvme-intel-internal-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-intel-internal-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -873,7 +873,7 @@ Gets the event log from the device and saves to defined file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-intel-lat-stats.1 b/Documentation/nvme-intel-lat-stats.1
index f29468c..daf80fa 100644
--- a/Documentation/nvme-intel-lat-stats.1
+++ b/Documentation/nvme-intel-lat-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-intel-lat-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-INTEL\-LAT\-ST" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-LAT\-ST" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-lat-stats.html b/Documentation/nvme-intel-lat-stats.html
index ce69e0a..f1f0a13 100644
--- a/Documentation/nvme-intel-lat-stats.html
+++ b/Documentation/nvme-intel-lat-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-intel-lat-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -832,7 +832,7 @@ Get the write statistics
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-intel-market-name.1 b/Documentation/nvme-intel-market-name.1
index 749565f..df6c86b 100644
--- a/Documentation/nvme-intel-market-name.1
+++ b/Documentation/nvme-intel-market-name.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-intel-market-name
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-INTEL\-MARKET\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-MARKET\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-market-name.html b/Documentation/nvme-intel-market-name.html
index 520f30a..c106278 100644
--- a/Documentation/nvme-intel-market-name.html
+++ b/Documentation/nvme-intel-market-name.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-intel-market-name(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -813,7 +813,7 @@ Get the marketing name
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-intel-smart-log-add.1 b/Documentation/nvme-intel-smart-log-add.1
index 4710e9b..8627a5f 100644
--- a/Documentation/nvme-intel-smart-log-add.1
+++ b/Documentation/nvme-intel-smart-log-add.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-intel-smart-log-add
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-INTEL\-SMART\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-SMART\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-smart-log-add.html b/Documentation/nvme-intel-smart-log-add.html
index 0814ab8..9dc601f 100644
--- a/Documentation/nvme-intel-smart-log-add.html
+++ b/Documentation/nvme-intel-smart-log-add.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-intel-smart-log-add(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -849,7 +849,7 @@ Print the raw Intel Additional SMART log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-intel-temp-stats.1 b/Documentation/nvme-intel-temp-stats.1
index 37f45c1..014bc4e 100644
--- a/Documentation/nvme-intel-temp-stats.1
+++ b/Documentation/nvme-intel-temp-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-intel-temp-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-INTEL\-TEMP\-S" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-TEMP\-S" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-temp-stats.html b/Documentation/nvme-intel-temp-stats.html
index 8ffaf6d..f979f8b 100644
--- a/Documentation/nvme-intel-temp-stats.html
+++ b/Documentation/nvme-intel-temp-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-intel-temp-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -822,7 +822,7 @@ Print the raw SMART log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-io-mgmt-recv.1 b/Documentation/nvme-io-mgmt-recv.1
index 8347cdf..82090af 100644
--- a/Documentation/nvme-io-mgmt-recv.1
+++ b/Documentation/nvme-io-mgmt-recv.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-io-mgmt-recv
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-IO\-MGMT\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-IO\-MGMT\-RECV" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-io-mgmt-recv.html b/Documentation/nvme-io-mgmt-recv.html
index 4563f32..dfc6646 100644
--- a/Documentation/nvme-io-mgmt-recv.html
+++ b/Documentation/nvme-io-mgmt-recv.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-io-mgmt-recv(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -881,7 +881,7 @@ a hex dump, or binary.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-io-mgmt-send.1 b/Documentation/nvme-io-mgmt-send.1
index c4e2b81..b97dfa0 100644
--- a/Documentation/nvme-io-mgmt-send.1
+++ b/Documentation/nvme-io-mgmt-send.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-io-mgmt-send
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-IO\-MGMT\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-IO\-MGMT\-SEND" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-io-mgmt-send.html b/Documentation/nvme-io-mgmt-send.html
index 139ba13..931407a 100644
--- a/Documentation/nvme-io-mgmt-send.html
+++ b/Documentation/nvme-io-mgmt-send.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-io-mgmt-send(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -880,7 +880,7 @@ convenience parameters to produce the binary payload.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-io-passthru.1 b/Documentation/nvme-io-passthru.1
index c179cf3..1e56ac0 100644
--- a/Documentation/nvme-io-passthru.1
+++ b/Documentation/nvme-io-passthru.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-io-passthru
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-IO\-PASSTHRU" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-IO\-PASSTHRU" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-io-passthru.html b/Documentation/nvme-io-passthru.html
index c0a83f8..404ef00 100644
--- a/Documentation/nvme-io-passthru.html
+++ b/Documentation/nvme-io-passthru.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-io-passthru(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1030,7 +1030,7 @@ printed to stdout for another program to parse.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-lba-status-log.1 b/Documentation/nvme-lba-status-log.1
index af7888b..b2fe155 100644
--- a/Documentation/nvme-lba-status-log.1
+++ b/Documentation/nvme-lba-status-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-lba-status-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-LBA\-STATUS\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LBA\-STATUS\-L" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-lba-status-log.html b/Documentation/nvme-lba-status-log.html
index 0c3c455..87d7b90 100644
--- a/Documentation/nvme-lba-status-log.html
+++ b/Documentation/nvme-lba-status-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-lba-status-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -843,7 +843,7 @@ NVME</code></pre>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-list-ctrl.1 b/Documentation/nvme-list-ctrl.1
index 98d5094..a1d780a 100644
--- a/Documentation/nvme-list-ctrl.1
+++ b/Documentation/nvme-list-ctrl.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-list-ctrl
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-LIST\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list-ctrl.html b/Documentation/nvme-list-ctrl.html
index 4d21a84..da3cd73 100644
--- a/Documentation/nvme-list-ctrl.html
+++ b/Documentation/nvme-list-ctrl.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-list-ctrl(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -842,7 +842,7 @@ identifier.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-list-endgrp.1 b/Documentation/nvme-list-endgrp.1
index 69778d8..ee091d5 100644
--- a/Documentation/nvme-list-endgrp.1
+++ b/Documentation/nvme-list-endgrp.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-list-endgrp
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-LIST\-ENDGRP" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST\-ENDGRP" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list-endgrp.html b/Documentation/nvme-list-endgrp.html
index fbd1d0a..19a9663 100644
--- a/Documentation/nvme-list-endgrp.html
+++ b/Documentation/nvme-list-endgrp.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-list-endgrp(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -826,7 +826,7 @@ than or equal to the value specified in the CDW11.ENDGID field.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-list-ns.1 b/Documentation/nvme-list-ns.1
index 49ef9fc..9fa37e2 100644
--- a/Documentation/nvme-list-ns.1
+++ b/Documentation/nvme-list-ns.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-id-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list-ns.html b/Documentation/nvme-list-ns.html
index ecb263b..39cdf56 100644
--- a/Documentation/nvme-list-ns.html
+++ b/Documentation/nvme-list-ns.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-id-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -883,7 +883,7 @@ Print the namespaces present for NVM Command Set in normal format
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-list-subsys.1 b/Documentation/nvme-list-subsys.1
index eca67df..92236ab 100644
--- a/Documentation/nvme-list-subsys.1
+++ b/Documentation/nvme-list-subsys.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-list-subsys
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-LIST\-SUBSYS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST\-SUBSYS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list-subsys.html b/Documentation/nvme-list-subsys.html
index ef5929d..523e7f6 100644
--- a/Documentation/nvme-list-subsys.html
+++ b/Documentation/nvme-list-subsys.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-list-subsys(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -865,7 +865,7 @@ nvme-subsys1 - NQN=nvmf-test2
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-list.1 b/Documentation/nvme-list.1
index 15ed041..4e674fd 100644
--- a/Documentation/nvme-list.1
+++ b/Documentation/nvme-list.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-list
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-LIST" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list.html b/Documentation/nvme-list.html
index 0520ff4..0a652a6 100644
--- a/Documentation/nvme-list.html
+++ b/Documentation/nvme-list.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-list(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -816,7 +816,7 @@ for those devices as well as some pertinent information about them.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-lockdown.1 b/Documentation/nvme-lockdown.1
index f1099a9..799ada4 100644
--- a/Documentation/nvme-lockdown.1
+++ b/Documentation/nvme-lockdown.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-lockdown
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-LOCKDOWN" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LOCKDOWN" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-lockdown.html b/Documentation/nvme-lockdown.html
index 1a39f6b..a69452c 100644
--- a/Documentation/nvme-lockdown.html
+++ b/Documentation/nvme-lockdown.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-lockdown(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -886,7 +886,7 @@ Identifier.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-mgmt-addr-list-log.txt b/Documentation/nvme-mgmt-addr-list-log.txt
new file mode 100644
index 0000000..645e1b7
--- /dev/null
+++ b/Documentation/nvme-mgmt-addr-list-log.txt
@@ -0,0 +1,47 @@
+nvme-mgmt-addr-list-log(1)
+==========================
+
+NAME
+----
+nvme-mgmt-addr-list-log - Retrieve Management Address List Log, show it
+
+SYNOPSIS
+--------
+[verse]
+'nvme mgmt-addr-list-log' <device> [--verbose | -v]
+			[--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve Management Address List Log, show it
+
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Has the program issue a mgmt-addr-list-log
++
+------------
+# nvme mgmt-addr-list-log /dev/nvme0
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-mi-cmd-support-effects-log.1 b/Documentation/nvme-mi-cmd-support-effects-log.1
index 421c80a..e29cb7a 100644
--- a/Documentation/nvme-mi-cmd-support-effects-log.1
+++ b/Documentation/nvme-mi-cmd-support-effects-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-mi-cmd-support-effects-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-MI\-CMD\-SUPPO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MI\-CMD\-SUPPO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-mi-cmd-support-effects-log.html b/Documentation/nvme-mi-cmd-support-effects-log.html
index 7fce134..c084dd5 100644
--- a/Documentation/nvme-mi-cmd-support-effects-log.html
+++ b/Documentation/nvme-mi-cmd-support-effects-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-mi-cmd-support-effects-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -826,7 +826,7 @@ raw buffer may be printed to stdout.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-micron-clear-pcie-errors.1 b/Documentation/nvme-micron-clear-pcie-errors.1
index 08c8056..179ec01 100644
--- a/Documentation/nvme-micron-clear-pcie-errors.1
+++ b/Documentation/nvme-micron-clear-pcie-errors.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-micron-clear-pcie-errors
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-MICRON\-CLEAR\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-CLEAR\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-clear-pcie-errors.html b/Documentation/nvme-micron-clear-pcie-errors.html
index aadd5de..d8b689e 100644
--- a/Documentation/nvme-micron-clear-pcie-errors.html
+++ b/Documentation/nvme-micron-clear-pcie-errors.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-micron-clear-pcie-errors(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -798,7 +798,7 @@ Retrieve NAND statistics information
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-micron-internal-log.1 b/Documentation/nvme-micron-internal-log.1
index baf0396..1daa593 100644
--- a/Documentation/nvme-micron-internal-log.1
+++ b/Documentation/nvme-micron-internal-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-micron-internal-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-MICRON\-INTERN" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-INTERN" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-internal-log.html b/Documentation/nvme-micron-internal-log.html
index 45b1e86..864f476 100644
--- a/Documentation/nvme-micron-internal-log.html
+++ b/Documentation/nvme-micron-internal-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-micron-internal-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -814,7 +814,7 @@ Gets the logs from the device and saves to micron_logs.zip file
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-micron-nand-stats.1 b/Documentation/nvme-micron-nand-stats.1
index ab5033e..6190be6 100644
--- a/Documentation/nvme-micron-nand-stats.1
+++ b/Documentation/nvme-micron-nand-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-micron-nand-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-MICRON\-NAND\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-NAND\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-nand-stats.html b/Documentation/nvme-micron-nand-stats.html
index 5c35508..4ec8d40 100644
--- a/Documentation/nvme-micron-nand-stats.html
+++ b/Documentation/nvme-micron-nand-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-micron-nand-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -799,7 +799,7 @@ Retrieve NAND statistics information
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-micron-pcie-stats.1 b/Documentation/nvme-micron-pcie-stats.1
index 66efdf5..6ac264e 100644
--- a/Documentation/nvme-micron-pcie-stats.1
+++ b/Documentation/nvme-micron-pcie-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-micron-pcie-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-MICRON\-PCIE\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-PCIE\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-pcie-stats.html b/Documentation/nvme-micron-pcie-stats.html
index 558b6e5..fea7aac 100644
--- a/Documentation/nvme-micron-pcie-stats.html
+++ b/Documentation/nvme-micron-pcie-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-micron-pcie-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -799,7 +799,7 @@ Retrieve PCIe error information
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-micron-selective-download.1 b/Documentation/nvme-micron-selective-download.1
index 90990f0..42db3c0 100644
--- a/Documentation/nvme-micron-selective-download.1
+++ b/Documentation/nvme-micron-selective-download.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-micron-selective-download
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-MICRON\-SELECT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-SELECT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-selective-download.html b/Documentation/nvme-micron-selective-download.html
index f692368..f523295 100644
--- a/Documentation/nvme-micron-selective-download.html
+++ b/Documentation/nvme-micron-selective-download.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-micron-selective-download(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -869,7 +869,7 @@ Update eeprom, OOB and main firmware
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-micron-smart-add-log.1 b/Documentation/nvme-micron-smart-add-log.1
index bf60df6..dbbde40 100644
--- a/Documentation/nvme-micron-smart-add-log.1
+++ b/Documentation/nvme-micron-smart-add-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-micron-smart-add-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-MICRON\-SMART\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-SMART\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-smart-add-log.html b/Documentation/nvme-micron-smart-add-log.html
index fa7a163..e6afa72 100644
--- a/Documentation/nvme-micron-smart-add-log.html
+++ b/Documentation/nvme-micron-smart-add-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-micron-smart-add-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -817,7 +817,7 @@ Retrieve NAND/extended SMART data and display in json format
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-micron-temperature-stats.1 b/Documentation/nvme-micron-temperature-stats.1
index f4f5851..8368448 100644
--- a/Documentation/nvme-micron-temperature-stats.1
+++ b/Documentation/nvme-micron-temperature-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-micron-temperature-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-MICRON\-TEMPER" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-TEMPER" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-temperature-stats.html b/Documentation/nvme-micron-temperature-stats.html
index b9488ed..30b71ae 100644
--- a/Documentation/nvme-micron-temperature-stats.html
+++ b/Documentation/nvme-micron-temperature-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-micron-temperature-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -799,7 +799,7 @@ Retrieve temperature information
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-netapp-ontapdevices.1 b/Documentation/nvme-netapp-ontapdevices.1
index c93669f..46dd4a6 100644
--- a/Documentation/nvme-netapp-ontapdevices.1
+++ b/Documentation/nvme-netapp-ontapdevices.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-netapp-ontapdevices
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-NETAPP\-ONTAPD" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NETAPP\-ONTAPD" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -32,7 +32,7 @@ nvme-netapp-ontapdevices \- Display information about ONTAP devices
 .SH "SYNOPSIS"
 .sp
 .nf
-\fInvme netapp ontapdevices\fR [\-\-output\-format=<fmt> | \-o <fmt>]
+\fInvme netapp ontapdevices\fR [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v]
 .fi
 .SH "DESCRIPTION"
 .sp
@@ -47,6 +47,11 @@ Set the reporting format to
 \fIcolumn\fR, or
 \fIjson\fR\&. Only one output format can be used at a time\&.
 .RE
+.PP
+\-v, \-\-verbose
+.RS 4
+Display additional information of ONTAP devices on the host\&.
+.RE
 .SH "EXAMPLES"
 .sp
 .RS 4
diff --git a/Documentation/nvme-netapp-ontapdevices.html b/Documentation/nvme-netapp-ontapdevices.html
index 2b734ea..8739793 100644
--- a/Documentation/nvme-netapp-ontapdevices.html
+++ b/Documentation/nvme-netapp-ontapdevices.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-netapp-ontapdevices(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -749,7 +749,7 @@ nvme-netapp-ontapdevices(1) Manual Page
 <h2 id="_synopsis">SYNOPSIS</h2>
 <div class="sectionbody">
 <div class="verseblock">
-<pre class="content"><em>nvme netapp ontapdevices</em> [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</pre>
+<pre class="content"><em>nvme netapp ontapdevices</em> [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;] [--verbose | -v]</pre>
 <div class="attribution">
 </div></div>
 </div>
@@ -777,6 +777,17 @@ identified using the Identify Controller data.</p></div>
         <em>json</em>. Only one output format can be used at a time.
 </p>
 </dd>
+<dt class="hdlist1">
+-v
+</dt>
+<dt class="hdlist1">
+--verbose
+</dt>
+<dd>
+<p>
+        Display additional information of ONTAP devices on the host.
+</p>
+</dd>
 </dl></div>
 </div>
 </div>
@@ -807,7 +818,7 @@ Display information, in a column-based format, for ONTAP devices.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-netapp-ontapdevices.txt b/Documentation/nvme-netapp-ontapdevices.txt
index fc28947..e56bae5 100644
--- a/Documentation/nvme-netapp-ontapdevices.txt
+++ b/Documentation/nvme-netapp-ontapdevices.txt
@@ -8,7 +8,7 @@ nvme-netapp-ontapdevices - Display information about ONTAP devices
 SYNOPSIS
 --------
 [verse]
-'nvme netapp ontapdevices' [--output-format=<fmt> | -o <fmt>]
+'nvme netapp ontapdevices' [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
 
 DESCRIPTION
 -----------
@@ -22,6 +22,10 @@ OPTIONS
 	Set the reporting format to 'normal' (default), 'column', or
 	'json'. Only one output format can be used at a time.
 
+-v::
+--verbose::
+	Display additional information of ONTAP devices on the host.
+
 EXAMPLES
 --------
 * Display information, in a column-based format, for ONTAP devices.
diff --git a/Documentation/nvme-netapp-smdevices.1 b/Documentation/nvme-netapp-smdevices.1
index 8a13c3e..c88e193 100644
--- a/Documentation/nvme-netapp-smdevices.1
+++ b/Documentation/nvme-netapp-smdevices.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-netapp-smdevices
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-NETAPP\-SMDEVI" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NETAPP\-SMDEVI" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -32,7 +32,7 @@ nvme-netapp-smdevices \- Display information for each NVMe path to an E\-Series
 .SH "SYNOPSIS"
 .sp
 .nf
-\fInvme netapp smdevices\fR [\-\-output\-format=<fmt> | \-o <fmt>]
+\fInvme netapp smdevices\fR [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v]
 .fi
 .SH "DESCRIPTION"
 .sp
@@ -47,6 +47,11 @@ Set the reporting format to
 \fIcolumn\fR, or
 \fIjson\fR\&. Only one output format can be used at a time\&.
 .RE
+.PP
+\-v, \-\-verbose
+.RS 4
+Display additional information of E\-Series devices on the host\&.
+.RE
 .SH "EXAMPLES"
 .sp
 .RS 4
diff --git a/Documentation/nvme-netapp-smdevices.html b/Documentation/nvme-netapp-smdevices.html
index 80cf2f7..4771dc2 100644
--- a/Documentation/nvme-netapp-smdevices.html
+++ b/Documentation/nvme-netapp-smdevices.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-netapp-smdevices(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -749,7 +749,7 @@ nvme-netapp-smdevices(1) Manual Page
 <h2 id="_synopsis">SYNOPSIS</h2>
 <div class="sectionbody">
 <div class="verseblock">
-<pre class="content"><em>nvme netapp smdevices</em> [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</pre>
+<pre class="content"><em>nvme netapp smdevices</em> [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;] [--verbose | -v]</pre>
 <div class="attribution">
 </div></div>
 </div>
@@ -778,6 +778,17 @@ NVMe nodes in /dev by sending an Identify Controller.</p></div>
               <em>json</em>. Only one output format can be used at a time.
 </p>
 </dd>
+<dt class="hdlist1">
+-v
+</dt>
+<dt class="hdlist1">
+--verbose
+</dt>
+<dd>
+<p>
+              Display additional information of E-Series devices on the host.
+</p>
+</dd>
 </dl></div>
 </div>
 </div>
@@ -809,7 +820,7 @@ namespace.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-netapp-smdevices.txt b/Documentation/nvme-netapp-smdevices.txt
index cb68acf..c135ff0 100644
--- a/Documentation/nvme-netapp-smdevices.txt
+++ b/Documentation/nvme-netapp-smdevices.txt
@@ -8,7 +8,7 @@ nvme-netapp-smdevices - Display information for each NVMe path to an E-Series vo
 SYNOPSIS
 --------
 [verse]
-'nvme netapp smdevices' [--output-format=<fmt> | -o <fmt>]
+'nvme netapp smdevices' [--output-format=<fmt> | -o <fmt>] [--verbose | -v]
 
 DESCRIPTION
 -----------
@@ -23,6 +23,10 @@ OPTIONS
               Set the reporting format to 'normal' (default), 'column', or
               'json'. Only one output format can be used at a time.
 
+-v::
+--verbose::
+	      Display additional information of E-Series devices on the host.
+
 EXAMPLES
 --------
 * Display information, in a column-based format, for each path to an E-Series
diff --git a/Documentation/nvme-ns-descs.1 b/Documentation/nvme-ns-descs.1
index b111cd2..fc1b2a2 100644
--- a/Documentation/nvme-ns-descs.1
+++ b/Documentation/nvme-ns-descs.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ns-descs
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-NS\-DESCS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NS\-DESCS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ns-descs.html b/Documentation/nvme-ns-descs.html
index f5ca975..9b8cb68 100644
--- a/Documentation/nvme-ns-descs.html
+++ b/Documentation/nvme-ns-descs.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ns-descs(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -867,7 +867,7 @@ Have the program return the raw structure in binary:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ns-rescan.1 b/Documentation/nvme-ns-rescan.1
index 113584e..4bbb80e 100644
--- a/Documentation/nvme-ns-rescan.1
+++ b/Documentation/nvme-ns-rescan.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ns-rescan
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-NS\-RESCAN" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NS\-RESCAN" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ns-rescan.html b/Documentation/nvme-ns-rescan.html
index 4d5c8f0..e7bf91c 100644
--- a/Documentation/nvme-ns-rescan.html
+++ b/Documentation/nvme-ns-rescan.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ns-rescan(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -818,7 +818,7 @@ Rescans the nvme namespaces.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-nvm-id-ctrl.1 b/Documentation/nvme-nvm-id-ctrl.1
index cfc43c4..a75a879 100644
--- a/Documentation/nvme-nvm-id-ctrl.1
+++ b/Documentation/nvme-nvm-id-ctrl.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-nvm-id-ctrl
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-NVM\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NVM\-ID\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-nvm-id-ctrl.html b/Documentation/nvme-nvm-id-ctrl.html
index d5f520b..0ab74b2 100644
--- a/Documentation/nvme-nvm-id-ctrl.html
+++ b/Documentation/nvme-nvm-id-ctrl.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-nvm-id-ctrl(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -832,7 +832,7 @@ Show the output in json format
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-nvme-mi-recv.1 b/Documentation/nvme-nvme-mi-recv.1
index ddb47f1..7906f29 100644
--- a/Documentation/nvme-nvme-mi-recv.1
+++ b/Documentation/nvme-nvme-mi-recv.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-nvme-mi-recv
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-NVME\-MI\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NVME\-MI\-RECV" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-nvme-mi-recv.html b/Documentation/nvme-nvme-mi-recv.html
index 7b5dd0b..07717a5 100644
--- a/Documentation/nvme-nvme-mi-recv.html
+++ b/Documentation/nvme-nvme-mi-recv.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-nvme-mi-recv(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -905,7 +905,7 @@ Has the program issue a nvme-mi-recv to execute the VPD read.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-nvme-mi-send.1 b/Documentation/nvme-nvme-mi-send.1
index 3ffe836..d2753f7 100644
--- a/Documentation/nvme-nvme-mi-send.1
+++ b/Documentation/nvme-nvme-mi-send.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-nvme-mi-send
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-NVME\-MI\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NVME\-MI\-SEND" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-nvme-mi-send.html b/Documentation/nvme-nvme-mi-send.html
index bbf737f..deb3ee4 100644
--- a/Documentation/nvme-nvme-mi-send.html
+++ b/Documentation/nvme-nvme-mi-send.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-nvme-mi-send(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -905,7 +905,7 @@ Has the program issue a nvme-mi-send to execute the VPD write.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.1 b/Documentation/nvme-ocp-clear-fw-activate-history.1
index a51ff5e..498937c 100644
--- a/Documentation/nvme-ocp-clear-fw-activate-history.1
+++ b/Documentation/nvme-ocp-clear-fw-activate-history.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-clear-fw-activate-history
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-CLEAR\-FW" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-CLEAR\-FW" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-clear-fw-activate-history.html b/Documentation/nvme-ocp-clear-fw-activate-history.html
index fc262f5..116414d 100644
--- a/Documentation/nvme-ocp-clear-fw-activate-history.html
+++ b/Documentation/nvme-ocp-clear-fw-activate-history.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-clear-fw-activate-history(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -817,7 +817,7 @@ Clears OCP Firmware Activation History Log for the device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1 b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1
index fea822e..732c7e7 100644
--- a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1
+++ b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-clear-pcie-correctable-error-counters
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-CLEAR\-PC" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-CLEAR\-PC" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html
index c90cc24..50b1c90 100644
--- a/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html
+++ b/Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-clear-pcie-correctable-error-counters(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -817,7 +817,7 @@ Clears PCIe correctable error counters Log for the device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-device-capability-log.1 b/Documentation/nvme-ocp-device-capability-log.1
index 353213f..bd4597a 100644
--- a/Documentation/nvme-ocp-device-capability-log.1
+++ b/Documentation/nvme-ocp-device-capability-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-device-capability-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-DEVICE\-C" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-DEVICE\-C" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-device-capability-log.html b/Documentation/nvme-ocp-device-capability-log.html
index 98a11b5..1cbb9a7 100644
--- a/Documentation/nvme-ocp-device-capability-log.html
+++ b/Documentation/nvme-ocp-device-capability-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-device-capability-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -811,7 +811,7 @@ Has the program issue a device-capability-log command to retrieve the 0xC4 log p
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.1 b/Documentation/nvme-ocp-eol-plp-failure-mode.1
index fa40b2f..fb2d319 100644
--- a/Documentation/nvme-ocp-eol-plp-failure-mode.1
+++ b/Documentation/nvme-ocp-eol-plp-failure-mode.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-eol-plp-failure-mode
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-EOL\-PLP\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-EOL\-PLP\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-eol-plp-failure-mode.html b/Documentation/nvme-ocp-eol-plp-failure-mode.html
index 4757eb3..ef50768 100644
--- a/Documentation/nvme-ocp-eol-plp-failure-mode.html
+++ b/Documentation/nvme-ocp-eol-plp-failure-mode.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-eol-plp-failure-mode(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -886,7 +886,7 @@ Has the program issue a eol-plp-failure-mode to retrieve the 0xC2 get features.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-error-recovery-log.1 b/Documentation/nvme-ocp-error-recovery-log.1
index c055e4f..e94ea7f 100644
--- a/Documentation/nvme-ocp-error-recovery-log.1
+++ b/Documentation/nvme-ocp-error-recovery-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-error-recovery-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-ERROR\-RE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-ERROR\-RE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-error-recovery-log.html b/Documentation/nvme-ocp-error-recovery-log.html
index 84f1f54..0fa518d 100644
--- a/Documentation/nvme-ocp-error-recovery-log.html
+++ b/Documentation/nvme-ocp-error-recovery-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-error-recovery-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -811,7 +811,7 @@ Has the program issue a error-recovery-log command to retrieve the 0xC1 log page
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-get-dssd-async-event-config.1 b/Documentation/nvme-ocp-get-dssd-async-event-config.1
index 46668a1..0936d5c 100644
--- a/Documentation/nvme-ocp-get-dssd-async-event-config.1
+++ b/Documentation/nvme-ocp-get-dssd-async-event-config.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-get-dssd-async-event-config
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-GET\-DSSD" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-GET\-DSSD" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-get-dssd-async-event-config.html b/Documentation/nvme-ocp-get-dssd-async-event-config.html
index 9386e3d..e684bb7 100644
--- a/Documentation/nvme-ocp-get-dssd-async-event-config.html
+++ b/Documentation/nvme-ocp-get-dssd-async-event-config.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-get-dssd-async-event-config(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -846,7 +846,7 @@ Has the program issue a get-dssd-async-event-config to retrieve the saved 0xC9 g
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-get-dssd-power-state-feature.1 b/Documentation/nvme-ocp-get-dssd-power-state-feature.1
index 45c2b92..3e2219d 100644
--- a/Documentation/nvme-ocp-get-dssd-power-state-feature.1
+++ b/Documentation/nvme-ocp-get-dssd-power-state-feature.1
@@ -2,12 +2,12 @@
 .\"     Title: get-dssd-power-state-feature
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "GET\-DSSD\-POWER\-ST" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "GET\-DSSD\-POWER\-ST" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-get-dssd-power-state-feature.html b/Documentation/nvme-ocp-get-dssd-power-state-feature.html
index 4569ce2..391d518 100644
--- a/Documentation/nvme-ocp-get-dssd-power-state-feature.html
+++ b/Documentation/nvme-ocp-get-dssd-power-state-feature.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>get-dssd-power-state-feature(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -883,7 +883,7 @@ Has the program issue a get-dssd-power-state-feature command to get all three DS
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-get-plp-health-check-interval.1 b/Documentation/nvme-ocp-get-plp-health-check-interval.1
index 3a050c3..a032827 100644
--- a/Documentation/nvme-ocp-get-plp-health-check-interval.1
+++ b/Documentation/nvme-ocp-get-plp-health-check-interval.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-get-plp-health-check-interval
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-GET\-PLP\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-GET\-PLP\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-get-plp-health-check-interval.html b/Documentation/nvme-ocp-get-plp-health-check-interval.html
index 7f04901..4f2630d 100644
--- a/Documentation/nvme-ocp-get-plp-health-check-interval.html
+++ b/Documentation/nvme-ocp-get-plp-health-check-interval.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-get-plp-health-check-interval(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -847,7 +847,7 @@ Has the program issue a get-plp-health-check-interval to retrieve the 0xC6 get f
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-hardware-component-log.txt b/Documentation/nvme-ocp-hardware-component-log.txt
index 6700e76..02ddd78 100644
--- a/Documentation/nvme-ocp-hardware-component-log.txt
+++ b/Documentation/nvme-ocp-hardware-component-log.txt
@@ -68,13 +68,13 @@ OPTIONS
 
 EXAMPLES
 --------
-* Has the program issue a set-error-injection
+* Has the program issue a ocp hardware-component-log
 +
 ------------
 # nvme ocp hardware-component-log /dev/nvme0
 ------------
 
-* Has the program issue a set-error-injection with the asic component list.
+* Has the program issue a ocp hardware-component-log with asic component list
 +
 ------------
 # nvme ocp hardware-component-log /dev/nvme0 -i asic -l
diff --git a/Documentation/nvme-ocp-internal-log.1 b/Documentation/nvme-ocp-internal-log.1
index e0bd8d9..a975d1d 100644
--- a/Documentation/nvme-ocp-internal-log.1
+++ b/Documentation/nvme-ocp-internal-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-internal-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-INTERNAL\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-INTERNAL\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -81,7 +81,12 @@ Retrieves the specific data area requested\&. Valid inputs are 1,2\&. If this op
 .PP
 \-t <type>, \-\-telemetry\-type=<type>
 .RS 4
-If set to 1, controller shall capture the Telemetry Host\-Initiated data representing the internal state of the controller at the time the associated Get Log Page command is processed\&. If cleared to 0, controller shall not update this data\&.
+Set the telemetry type to
+\fIhost\fR,
+\fIhost0\fR,
+\fIhost1\fR
+or
+\fIcontroller\fR\&. If set to host1, controller shall capture the Telemetry Host\-Initiated data representing the internal state of the controller at the time the associated Get Log Page command is processed\&. If set to host0, controller shall not update this data\&.
 .RE
 .SH "EXAMPLES"
 .sp
diff --git a/Documentation/nvme-ocp-internal-log.html b/Documentation/nvme-ocp-internal-log.html
index 08a0ff0..089b5e2 100644
--- a/Documentation/nvme-ocp-internal-log.html
+++ b/Documentation/nvme-ocp-internal-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-internal-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -847,9 +847,10 @@ Results for any other device are undefined.</p></div>
 </dt>
 <dd>
 <p>
-        If set to 1, controller shall capture the Telemetry Host-Initiated data
+        Set the telemetry type to <em>host</em>, <em>host0</em>, <em>host1</em> or <em>controller</em>.
+        If set to host1, controller shall capture the Telemetry Host-Initiated data
         representing the internal state of the controller at the time the associated
-        Get Log Page command is processed. If cleared to 0, controller shall not
+        Get Log Page command is processed. If set to host0, controller shall not
         update this data.
 </p>
 </dd>
@@ -918,7 +919,7 @@ Decode data-areas 1 and 2, and output in normal text format.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-internal-log.txt b/Documentation/nvme-ocp-internal-log.txt
index 7393349..26d78ac 100644
--- a/Documentation/nvme-ocp-internal-log.txt
+++ b/Documentation/nvme-ocp-internal-log.txt
@@ -64,9 +64,10 @@ OPTIONS
 
 -t <type>::
 --telemetry-type=<type>::
-	If set to 1, controller shall capture the Telemetry Host-Initiated data
+	Set the telemetry type to 'host', 'host0', 'host1' or 'controller'.
+	If set to host1, controller shall capture the Telemetry Host-Initiated data
 	representing the internal state of the controller at the time the associated
-	Get Log Page command is processed. If cleared to 0, controller shall not
+	Get Log Page command is processed. If set to host0, controller shall not
 	update this data.
 
 EXAMPLES
diff --git a/Documentation/nvme-ocp-latency-monitor-log.1 b/Documentation/nvme-ocp-latency-monitor-log.1
index 7da8390..f6b0d75 100644
--- a/Documentation/nvme-ocp-latency-monitor-log.1
+++ b/Documentation/nvme-ocp-latency-monitor-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-latency-monitor-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-LATENCY\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-LATENCY\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-latency-monitor-log.html b/Documentation/nvme-ocp-latency-monitor-log.html
index 03c2436..2fb1f02 100644
--- a/Documentation/nvme-ocp-latency-monitor-log.html
+++ b/Documentation/nvme-ocp-latency-monitor-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-latency-monitor-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -811,7 +811,7 @@ Displays the get latency monitor log for the device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-set-dssd-async-event-config.1 b/Documentation/nvme-ocp-set-dssd-async-event-config.1
index 72bfc01..27e9886 100644
--- a/Documentation/nvme-ocp-set-dssd-async-event-config.1
+++ b/Documentation/nvme-ocp-set-dssd-async-event-config.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-set-dssd-async-event-config
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-SET\-DSSD" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-SET\-DSSD" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-set-dssd-async-event-config.html b/Documentation/nvme-ocp-set-dssd-async-event-config.html
index 7a2418b..dcbc909 100644
--- a/Documentation/nvme-ocp-set-dssd-async-event-config.html
+++ b/Documentation/nvme-ocp-set-dssd-async-event-config.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-set-dssd-async-event-config(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -822,7 +822,7 @@ persisting through power states.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-set-dssd-power-state-feature.1 b/Documentation/nvme-ocp-set-dssd-power-state-feature.1
index a297fe0..6a25636 100644
--- a/Documentation/nvme-ocp-set-dssd-power-state-feature.1
+++ b/Documentation/nvme-ocp-set-dssd-power-state-feature.1
@@ -2,12 +2,12 @@
 .\"     Title: set-dssd-power-state-feature
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "SET\-DSSD\-POWER\-ST" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "SET\-DSSD\-POWER\-ST" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-set-dssd-power-state-feature.html b/Documentation/nvme-ocp-set-dssd-power-state-feature.html
index 28c1918..084ec6e 100644
--- a/Documentation/nvme-ocp-set-dssd-power-state-feature.html
+++ b/Documentation/nvme-ocp-set-dssd-power-state-feature.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>set-dssd-power-state-feature(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -812,7 +812,7 @@ Has the program issue a set-dssd-power-state-feature command to set DSSD Power S
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-set-plp-health-check-interval.1 b/Documentation/nvme-ocp-set-plp-health-check-interval.1
index ed41415..270c908 100644
--- a/Documentation/nvme-ocp-set-plp-health-check-interval.1
+++ b/Documentation/nvme-ocp-set-plp-health-check-interval.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-set-plp-health-check-interval
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-SET\-PLP\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-SET\-PLP\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-set-plp-health-check-interval.html b/Documentation/nvme-ocp-set-plp-health-check-interval.html
index 39ff461..940fd58 100644
--- a/Documentation/nvme-ocp-set-plp-health-check-interval.html
+++ b/Documentation/nvme-ocp-set-plp-health-check-interval.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-set-plp-health-check-interval(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -834,7 +834,7 @@ Has the program issue a set-plp-health-check-interval to retrieve the 0xC6 set f
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-set-telemetry-profile.1 b/Documentation/nvme-ocp-set-telemetry-profile.1
index db59df4..8f8d614 100644
--- a/Documentation/nvme-ocp-set-telemetry-profile.1
+++ b/Documentation/nvme-ocp-set-telemetry-profile.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-set-telemetry-profile
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-SET\-TELE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-SET\-TELE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-set-telemetry-profile.html b/Documentation/nvme-ocp-set-telemetry-profile.html
index 3d57fec..1b9fdde 100644
--- a/Documentation/nvme-ocp-set-telemetry-profile.html
+++ b/Documentation/nvme-ocp-set-telemetry-profile.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-set-telemetry-profile(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -812,7 +812,7 @@ Has the program issue a set-telemetry-profile command to use profile five.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-smart-add-log.1 b/Documentation/nvme-ocp-smart-add-log.1
index 296ff1e..2f300a4 100644
--- a/Documentation/nvme-ocp-smart-add-log.1
+++ b/Documentation/nvme-ocp-smart-add-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-smart-add-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-SMART\-AD" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-SMART\-AD" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -32,7 +32,7 @@ nvme-ocp-smart-add-log \- Retrieves Extended SMART information of given OCP comp
 .SH "SYNOPSIS"
 .sp
 .nf
-\fInvme ocp smart\-add\-log\fR <device> [\-\-output\-format=<fmt> | \-o <fmt>]
+\fInvme ocp smart\-add\-log\fR <device> [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-output\-format\-version=<version>]
 .fi
 .SH "DESCRIPTION"
 .sp
@@ -42,6 +42,8 @@ The <device> parameter is mandatory and may be either the NVMe character device
 .sp
 This will only work on OCP compliant devices supporting this feature\&. Results for any other device are undefined\&.
 .sp
+EXPERIMENTAL\&. The \-\-output\-format\-version can be set to 2 to generate field names for the outputs that are easier to process via scripts\&. Note this is experimental and the field names are subject to change\&.
+.sp
 On success it returns 0, error code otherwise\&.
 .SH "OPTIONS"
 .PP
@@ -52,6 +54,14 @@ Set the reporting format to
 or
 \fIjson\fR\&. Only one output format can be used at a time\&. The default is normal\&.
 .RE
+.PP
+\-\-output\-format\-version=<version>
+.RS 4
+Set the field labels in the reporting format to either
+\fI1\fR
+(the original) or
+\fI2\fR\&. The default is 1\&. Note this is experimental\&.
+.RE
 .SH "EXAMPLES"
 .sp
 .RS 4
diff --git a/Documentation/nvme-ocp-smart-add-log.html b/Documentation/nvme-ocp-smart-add-log.html
index 05d6663..367f842 100644
--- a/Documentation/nvme-ocp-smart-add-log.html
+++ b/Documentation/nvme-ocp-smart-add-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-smart-add-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -749,7 +749,7 @@ nvme-ocp-smart-add-log(1) Manual Page
 <h2 id="_synopsis">SYNOPSIS</h2>
 <div class="sectionbody">
 <div class="verseblock">
-<pre class="content"><em>nvme ocp smart-add-log</em> &lt;device&gt; [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</pre>
+<pre class="content"><em>nvme ocp smart-add-log</em> &lt;device&gt; [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;] [--output-format-version=&lt;version&gt;]</pre>
 <div class="attribution">
 </div></div>
 </div>
@@ -763,6 +763,9 @@ provide the additional smart log.</p></div>
 device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).</p></div>
 <div class="paragraph"><p>This will only work on OCP compliant devices supporting this feature.
 Results for any other device are undefined.</p></div>
+<div class="paragraph"><p>EXPERIMENTAL. The --output-format-version can be set to 2 to generate field names
+for the outputs that are easier to process via scripts. Note this is
+experimental and the field names are subject to change.</p></div>
 <div class="paragraph"><p>On success it returns 0, error code otherwise.</p></div>
 </div>
 </div>
@@ -782,6 +785,15 @@ Results for any other device are undefined.</p></div>
         can be used at a time. The default is normal.
 </p>
 </dd>
+<dt class="hdlist1">
+--output-format-version=&lt;version&gt;
+</dt>
+<dd>
+<p>
+        Set the field labels in the reporting format to either <em>1</em>
+        (the original) or <em>2</em>. The default is 1. Note this is experimental.
+</p>
+</dd>
 </dl></div>
 </div>
 </div>
@@ -812,7 +824,7 @@ Has the program issue a smart-add-log command to retrieve the 0xC0 log page.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-smart-add-log.txt b/Documentation/nvme-ocp-smart-add-log.txt
index 66a55a9..97192d6 100644
--- a/Documentation/nvme-ocp-smart-add-log.txt
+++ b/Documentation/nvme-ocp-smart-add-log.txt
@@ -9,7 +9,7 @@ compliant device
 SYNOPSIS
 --------
 [verse]
-'nvme ocp smart-add-log' <device> [--output-format=<fmt> | -o <fmt>]
+'nvme ocp smart-add-log' <device> [--output-format=<fmt> | -o <fmt>] [--output-format-version=<version>]
 
 DESCRIPTION
 -----------
@@ -22,6 +22,10 @@ device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).
 This will only work on OCP compliant devices supporting this feature.
 Results for any other device are undefined.
 
+EXPERIMENTAL. The --output-format-version can be set to 2 to generate field names
+for the outputs that are easier to process via scripts. Note this is
+experimental and the field names are subject to change.
+
 On success it returns 0, error code otherwise.
 
 OPTIONS
@@ -31,6 +35,10 @@ OPTIONS
 	Set the reporting format to 'normal' or 'json'. Only one output format
 	can be used at a time. The default is normal.
 
+--output-format-version=<version>::
+	Set the field labels in the reporting format to either '1'
+	(the original) or '2'. The default is 1. Note this is experimental.
+
 EXAMPLES
 --------
 * Has the program issue a smart-add-log command to retrieve the 0xC0 log page.
diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.1 b/Documentation/nvme-ocp-telemetry-string-log-page.1
index 758534e..534a22e 100644
--- a/Documentation/nvme-ocp-telemetry-string-log-page.1
+++ b/Documentation/nvme-ocp-telemetry-string-log-page.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-telemetry-string-log-page
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-TELEMETRY" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-TELEMETRY" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.html b/Documentation/nvme-ocp-telemetry-string-log-page.html
index 5aa0615..9c5b172 100644
--- a/Documentation/nvme-ocp-telemetry-string-log-page.html
+++ b/Documentation/nvme-ocp-telemetry-string-log-page.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-telemetry-string-log-page(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -811,7 +811,7 @@ Has the program issue a telemetry-string-log command to get the log page data fr
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-ocp-unsupported-reqs-log.1 b/Documentation/nvme-ocp-unsupported-reqs-log.1
index 01923a1..a0bfb13 100644
--- a/Documentation/nvme-ocp-unsupported-reqs-log.1
+++ b/Documentation/nvme-ocp-unsupported-reqs-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-ocp-unsupported-reqs-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-OCP\-UNSUPPORT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-UNSUPPORT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-unsupported-reqs-log.html b/Documentation/nvme-ocp-unsupported-reqs-log.html
index b65c733..fb4a8aa 100644
--- a/Documentation/nvme-ocp-unsupported-reqs-log.html
+++ b/Documentation/nvme-ocp-unsupported-reqs-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-ocp-unsupported-reqs-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -812,7 +812,7 @@ Has the program issue a unsupported-reqs-log command to retrieve the 0xC5 log pa
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-persistent-event-log.1 b/Documentation/nvme-persistent-event-log.1
index e9c0298..aecb2cd 100644
--- a/Documentation/nvme-persistent-event-log.1
+++ b/Documentation/nvme-persistent-event-log.1
@@ -2,12 +2,12 @@
 .\"     Title: persistent-event-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "PERSISTENT\-EVENT\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "PERSISTENT\-EVENT\-L" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-persistent-event-log.html b/Documentation/nvme-persistent-event-log.html
index a54207c..bc1c570 100644
--- a/Documentation/nvme-persistent-event-log.html
+++ b/Documentation/nvme-persistent-event-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>persistent-event-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -877,7 +877,7 @@ Print the raw persistent event log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-pred-lat-event-agg-log.1 b/Documentation/nvme-pred-lat-event-agg-log.1
index 91fd111..a0b39f9 100644
--- a/Documentation/nvme-pred-lat-event-agg-log.1
+++ b/Documentation/nvme-pred-lat-event-agg-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-pred-lat-event-agg-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-PRED\-LAT\-EVE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-PRED\-LAT\-EVE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-pred-lat-event-agg-log.html b/Documentation/nvme-pred-lat-event-agg-log.html
index ececd53..ef2a1f3 100644
--- a/Documentation/nvme-pred-lat-event-agg-log.html
+++ b/Documentation/nvme-pred-lat-event-agg-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-pred-lat-event-agg-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -864,7 +864,7 @@ Print the raw Predictable Latency Event Aggregate log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-predictable-lat-log.1 b/Documentation/nvme-predictable-lat-log.1
index 2222c53..b68e6af 100644
--- a/Documentation/nvme-predictable-lat-log.1
+++ b/Documentation/nvme-predictable-lat-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-predictable-lat-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-PREDICTABLE\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-PREDICTABLE\-L" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-predictable-lat-log.html b/Documentation/nvme-predictable-lat-log.html
index 6ddfbc4..7cbfbb3 100644
--- a/Documentation/nvme-predictable-lat-log.html
+++ b/Documentation/nvme-predictable-lat-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-predictable-lat-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -861,7 +861,7 @@ Print the raw Predictable latency per NVM set log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-primary-ctrl-caps.1 b/Documentation/nvme-primary-ctrl-caps.1
index 0019ce4..59e6e81 100644
--- a/Documentation/nvme-primary-ctrl-caps.1
+++ b/Documentation/nvme-primary-ctrl-caps.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-primary-ctrl-caps
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-PRIMARY\-CTRL\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-PRIMARY\-CTRL\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-primary-ctrl-caps.html b/Documentation/nvme-primary-ctrl-caps.html
index e4de979..5f2b93b 100644
--- a/Documentation/nvme-primary-ctrl-caps.html
+++ b/Documentation/nvme-primary-ctrl-caps.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-primary-ctrl-caps(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -846,7 +846,7 @@ fields in a human readable format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-pull-model-ddr-req-log.txt b/Documentation/nvme-pull-model-ddr-req-log.txt
new file mode 100644
index 0000000..dce5e56
--- /dev/null
+++ b/Documentation/nvme-pull-model-ddr-req-log.txt
@@ -0,0 +1,51 @@
+nvme-pull-model-ddr-req-log(1)
+==============================
+
+NAME
+----
+nvme-pull-model-ddr-req-log - Retrieve Pull Model DDC Request Log, show it
+
+SYNOPSIS
+--------
+[verse]
+'nvme pull-model-ddr-req-log' <device> [--rae | -r] [--verbose | -v]
+			[--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve Pull Model DDC Request Log, show it
+
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-r::
+--rae::
+	Retain an Asynchronous Event.
+
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Has the program issue a pull-model-ddr-req-log
++
+------------
+# nvme pull-model-ddr-req-log /dev/nvme0
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-reachability-associations-log.txt b/Documentation/nvme-reachability-associations-log.txt
new file mode 100644
index 0000000..6adf57b
--- /dev/null
+++ b/Documentation/nvme-reachability-associations-log.txt
@@ -0,0 +1,56 @@
+nvme-reachability-associations-log(1)
+=====================================
+
+NAME
+----
+nvme-reachability-associations-log - Retrieve Reachability Associations Log, show it
+
+SYNOPSIS
+--------
+[verse]
+'nvme reachability-associations-log' <device> [--associations-only | -a] [--rae | -r]
+			[--verbose | -v] [--output-format=<fmt> | -o <fmt>]
+			[--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve Reachability Associations Log, show it
+
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-a::
+--associations-only::
+	Return associations Only.
+
+-r::
+--rae::
+	Retain an Asynchronous Event.
+
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Has the program issue a reachability-associations-log
++
+------------
+# nvme reachability-associations-log /dev/nvme0
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-reachability-groups-log.txt b/Documentation/nvme-reachability-groups-log.txt
new file mode 100644
index 0000000..6d5379e
--- /dev/null
+++ b/Documentation/nvme-reachability-groups-log.txt
@@ -0,0 +1,56 @@
+nvme-reachability-groups-log(1)
+===============================
+
+NAME
+----
+nvme-reachability-groups-log - Retrieve Reachability Groups Log, show it
+
+SYNOPSIS
+--------
+[verse]
+'nvme reachability-groups-log' <device> [--groups-only | -g] [--rae | -r]
+			[--verbose | -v] [--output-format=<fmt> | -o <fmt>]
+			[--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve Reachability Groups Log, show it
+
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-g::
+--groups-only::
+	Return Groups Only.
+
+-r::
+--rae::
+	Retain an Asynchronous Event.
+
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Has the program issue a reachability-groups-log
++
+------------
+# nvme reachability-groups-log /dev/nvme0
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-read.1 b/Documentation/nvme-read.1
index 5c18811..685d591 100644
--- a/Documentation/nvme-read.1
+++ b/Documentation/nvme-read.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-read
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-READ" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-READ" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-read.html b/Documentation/nvme-read.html
index e1cf111..292e81a 100644
--- a/Documentation/nvme-read.html
+++ b/Documentation/nvme-read.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-read(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1096,7 +1096,7 @@ metadata is passes.</p></td>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-reset.1 b/Documentation/nvme-reset.1
index fbb272e..cbddc37 100644
--- a/Documentation/nvme-reset.1
+++ b/Documentation/nvme-reset.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-reset
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-RESET" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESET" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-reset.html b/Documentation/nvme-reset.html
index adda80f..0dcdf1b 100644
--- a/Documentation/nvme-reset.html
+++ b/Documentation/nvme-reset.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-reset(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -818,7 +818,7 @@ Resets the controller.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-resv-acquire.1 b/Documentation/nvme-resv-acquire.1
index 61b8d2f..cc5c9ab 100644
--- a/Documentation/nvme-resv-acquire.1
+++ b/Documentation/nvme-resv-acquire.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-resv-acquire
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-RESV\-ACQUIRE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-ACQUIRE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-acquire.html b/Documentation/nvme-resv-acquire.html
index f7eb726..56114a7 100644
--- a/Documentation/nvme-resv-acquire.html
+++ b/Documentation/nvme-resv-acquire.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-resv-acquire(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -980,7 +980,7 @@ cellspacing="0" cellpadding="4">
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-resv-notif-log.1 b/Documentation/nvme-resv-notif-log.1
index 8d9639a..5162a81 100644
--- a/Documentation/nvme-resv-notif-log.1
+++ b/Documentation/nvme-resv-notif-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-resv-notif-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-RESV\-NOTIF\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-NOTIF\-L" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-notif-log.html b/Documentation/nvme-resv-notif-log.html
index ecb207f..33197a1 100644
--- a/Documentation/nvme-resv-notif-log.html
+++ b/Documentation/nvme-resv-notif-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-resv-notif-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -833,7 +833,7 @@ Print the output in json format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-resv-register.1 b/Documentation/nvme-resv-register.1
index 0725746..ca1572e 100644
--- a/Documentation/nvme-resv-register.1
+++ b/Documentation/nvme-resv-register.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-resv-register
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-RESV\-REGISTER" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-REGISTER" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-register.html b/Documentation/nvme-resv-register.html
index 7774ec4..39ff79e 100644
--- a/Documentation/nvme-resv-register.html
+++ b/Documentation/nvme-resv-register.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-resv-register(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -972,7 +972,7 @@ cellspacing="0" cellpadding="4">
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-resv-release.1 b/Documentation/nvme-resv-release.1
index d8a0b71..a638af6 100644
--- a/Documentation/nvme-resv-release.1
+++ b/Documentation/nvme-resv-release.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-resv-release
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-RESV\-RELEASE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-RELEASE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-release.html b/Documentation/nvme-resv-release.html
index b2cf746..dae8c1a 100644
--- a/Documentation/nvme-resv-release.html
+++ b/Documentation/nvme-resv-release.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-resv-release(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -962,7 +962,7 @@ cellspacing="0" cellpadding="4">
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-resv-report.1 b/Documentation/nvme-resv-report.1
index a29046d..71a9f1a 100644
--- a/Documentation/nvme-resv-report.1
+++ b/Documentation/nvme-resv-report.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-resv-report
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-RESV\-REPORT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-REPORT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-report.html b/Documentation/nvme-resv-report.html
index 378ed6d..82b2a21 100644
--- a/Documentation/nvme-resv-report.html
+++ b/Documentation/nvme-resv-report.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-resv-report(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -877,7 +877,7 @@ Controller data structure for each such controller).</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-rotational-media-info-log.txt b/Documentation/nvme-rotational-media-info-log.txt
new file mode 100644
index 0000000..981cf4f
--- /dev/null
+++ b/Documentation/nvme-rotational-media-info-log.txt
@@ -0,0 +1,52 @@
+nvme-rotational-media-info-log(1)
+=================================
+
+NAME
+----
+nvme-rotational-media-info-log - Retrieve Rotational Media Information Log, show it
+
+SYNOPSIS
+--------
+[verse]
+'nvme rotational-media-info-log' <device> [--endg-id=<endgid> | -e <endgid>]
+			[--verbose | -v] [--output-format=<fmt> | -o <fmt>]
+			[--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve Rotational Media Information Log, show it
+
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-e <endgid>::
+--endg-id=<endgid>::
+	This field specifies the identifier of the endurance group.
+
+-v::
+--verbose::
+	Increase the information detail in the output.
+
+-o <fmt>::
+--output-format=<fmt>::
+	Set the reporting format to 'normal', 'json' or 'binary'. Only one
+	output format can be used at a time.
+
+-t <timeout>::
+--timeout=<timeout>::
+	Override default timeout value. In milliseconds.
+
+EXAMPLES
+--------
+* Has the program issue a rotational-media-info-log
++
+------------
+# nvme rotational-media-info-log /dev/nvme0 --endg-id=1
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-rpmb.1 b/Documentation/nvme-rpmb.1
index 63b32e3..673b34c 100644
--- a/Documentation/nvme-rpmb.1
+++ b/Documentation/nvme-rpmb.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-rpmb
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-RPMB" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RPMB" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-rpmb.html b/Documentation/nvme-rpmb.html
index 8101aa2..498db0f 100644
--- a/Documentation/nvme-rpmb.html
+++ b/Documentation/nvme-rpmb.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-rpmb(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1024,7 +1024,7 @@ data onto output.bin
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-sanitize-log.1 b/Documentation/nvme-sanitize-log.1
index 955b2f2..0d77457 100644
--- a/Documentation/nvme-sanitize-log.1
+++ b/Documentation/nvme-sanitize-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-sanitize-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SANITIZE\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SANITIZE\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-sanitize-log.html b/Documentation/nvme-sanitize-log.html
index 8caa336..cb1f6c0 100644
--- a/Documentation/nvme-sanitize-log.html
+++ b/Documentation/nvme-sanitize-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-sanitize-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -903,7 +903,7 @@ Has the program issue Sanitize-log Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-sanitize.1 b/Documentation/nvme-sanitize.1
index 2070cb4..d8e7481 100644
--- a/Documentation/nvme-sanitize.1
+++ b/Documentation/nvme-sanitize.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-sanitize
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SANITIZE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SANITIZE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-sanitize.html b/Documentation/nvme-sanitize.html
index 64f7e23..9627d7e 100644
--- a/Documentation/nvme-sanitize.html
+++ b/Documentation/nvme-sanitize.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-sanitize(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -980,7 +980,7 @@ Has the program issue Sanitize Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.1 b/Documentation/nvme-seagate-clear-fw-activate-history.1
index a48a7d8..65543b0 100644
--- a/Documentation/nvme-seagate-clear-fw-activate-history.1
+++ b/Documentation/nvme-seagate-clear-fw-activate-history.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-clear-fw-activate-history
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-CLEAR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-CLEAR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.html b/Documentation/nvme-seagate-clear-fw-activate-history.html
index 101b8d3..f3d8041 100644
--- a/Documentation/nvme-seagate-clear-fw-activate-history.html
+++ b/Documentation/nvme-seagate-clear-fw-activate-history.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-clear-fw-activate-history (1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -792,7 +792,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1 b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1
index afd18b9..d2be966 100644
--- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.1
+++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-clear-pcie-correctable-errors
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-CLEAR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-CLEAR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html
index fe60a6e..64c98a8 100644
--- a/Documentation/nvme-seagate-clear-pcie-correctable-errors.html
+++ b/Documentation/nvme-seagate-clear-pcie-correctable-errors.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-clear-pcie-correctable-errors(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1 b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1
index 63dcf18..62623bd 100644
--- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.1
+++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-cloud-SSD-plugin-version
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-CLOUD" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-CLOUD" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html
index 78a6dd4..1445731 100644
--- a/Documentation/nvme-seagate-cloud-SSD-plugin-version.html
+++ b/Documentation/nvme-seagate-cloud-SSD-plugin-version.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-cloud-SSD-plugin-version (1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -787,7 +787,7 @@ nvme-seagate-cloud-SSD-plugin-version (1) Manual Page
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-get-ctrl-tele.1 b/Documentation/nvme-seagate-get-ctrl-tele.1
index 087946a..6f64314 100644
--- a/Documentation/nvme-seagate-get-ctrl-tele.1
+++ b/Documentation/nvme-seagate-get-ctrl-tele.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-get-ctrl-tele
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-GET\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-GET\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-get-ctrl-tele.html b/Documentation/nvme-seagate-get-ctrl-tele.html
index 6881eb0..41d7844 100644
--- a/Documentation/nvme-seagate-get-ctrl-tele.html
+++ b/Documentation/nvme-seagate-get-ctrl-tele.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-get-ctrl-tele(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -813,7 +813,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-get-host-tele.1 b/Documentation/nvme-seagate-get-host-tele.1
index f06dd1e..2014d92 100644
--- a/Documentation/nvme-seagate-get-host-tele.1
+++ b/Documentation/nvme-seagate-get-host-tele.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-get-host-tele
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-GET\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-GET\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-get-host-tele.html b/Documentation/nvme-seagate-get-host-tele.html
index fd4a677..a334a87 100644
--- a/Documentation/nvme-seagate-get-host-tele.html
+++ b/Documentation/nvme-seagate-get-host-tele.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-get-host-tele(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -826,7 +826,7 @@ commands work across all product families.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-help.1 b/Documentation/nvme-seagate-help.1
index 010a03d..cc6d89a 100644
--- a/Documentation/nvme-seagate-help.1
+++ b/Documentation/nvme-seagate-help.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-help
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-HELP" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-HELP" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-help.html b/Documentation/nvme-seagate-help.html
index 9e8072e..d466791 100644
--- a/Documentation/nvme-seagate-help.html
+++ b/Documentation/nvme-seagate-help.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-help(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -812,7 +812,7 @@ help                            Display this help</code></pre>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-plugin-version.1 b/Documentation/nvme-seagate-plugin-version.1
index b6389f6..02fbec5 100644
--- a/Documentation/nvme-seagate-plugin-version.1
+++ b/Documentation/nvme-seagate-plugin-version.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-plugin-version
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-PLUGI" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-PLUGI" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-plugin-version.html b/Documentation/nvme-seagate-plugin-version.html
index d312489..645b48c 100644
--- a/Documentation/nvme-seagate-plugin-version.html
+++ b/Documentation/nvme-seagate-plugin-version.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-plugin-version(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -787,7 +787,7 @@ nvme-seagate-plugin-version(1) Manual Page
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-version.1 b/Documentation/nvme-seagate-version.1
index ce9cc90..d30477c 100644
--- a/Documentation/nvme-seagate-version.1
+++ b/Documentation/nvme-seagate-version.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-version
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-VERSI" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VERSI" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-version.html b/Documentation/nvme-seagate-version.html
index 8784599..e8c65e6 100644
--- a/Documentation/nvme-seagate-version.html
+++ b/Documentation/nvme-seagate-version.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-version(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -787,7 +787,7 @@ nvme-seagate-version(1) Manual Page
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.1 b/Documentation/nvme-seagate-vs-fw-activate-history.1
index 17b79be..1a77f8f 100644
--- a/Documentation/nvme-seagate-vs-fw-activate-history.1
+++ b/Documentation/nvme-seagate-vs-fw-activate-history.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-vs-fw-activate-history
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-VS\-F" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-F" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-vs-fw-activate-history.html b/Documentation/nvme-seagate-vs-fw-activate-history.html
index 943a8a4..f619ac5 100644
--- a/Documentation/nvme-seagate-vs-fw-activate-history.html
+++ b/Documentation/nvme-seagate-vs-fw-activate-history.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-vs-fw-activate-history (1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -813,7 +813,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-vs-internal-log.1 b/Documentation/nvme-seagate-vs-internal-log.1
index d65fb80..461e881 100644
--- a/Documentation/nvme-seagate-vs-internal-log.1
+++ b/Documentation/nvme-seagate-vs-internal-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-vs-internal-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-VS\-I" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-I" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-vs-internal-log.html b/Documentation/nvme-seagate-vs-internal-log.html
index d21652b..36336ef 100644
--- a/Documentation/nvme-seagate-vs-internal-log.html
+++ b/Documentation/nvme-seagate-vs-internal-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-vs-internal-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -814,7 +814,7 @@ specified device.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-vs-log-page-sup.1 b/Documentation/nvme-seagate-vs-log-page-sup.1
index f3a9137..4408d82 100644
--- a/Documentation/nvme-seagate-vs-log-page-sup.1
+++ b/Documentation/nvme-seagate-vs-log-page-sup.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-vs-log-page-sup
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-VS\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-L" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-vs-log-page-sup.html b/Documentation/nvme-seagate-vs-log-page-sup.html
index 511c06c..ec8a81d 100644
--- a/Documentation/nvme-seagate-vs-log-page-sup.html
+++ b/Documentation/nvme-seagate-vs-log-page-sup.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-vs-log-page-sup(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -814,7 +814,7 @@ LogPage-Id      LogPage-Name
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-vs-pcie-stats.1 b/Documentation/nvme-seagate-vs-pcie-stats.1
index e189aa6..8b62dd9 100644
--- a/Documentation/nvme-seagate-vs-pcie-stats.1
+++ b/Documentation/nvme-seagate-vs-pcie-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-vs-pcie-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-VS\-P" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-P" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-vs-pcie-stats.html b/Documentation/nvme-seagate-vs-pcie-stats.html
index 72a744e..42bb06e 100644
--- a/Documentation/nvme-seagate-vs-pcie-stats.html
+++ b/Documentation/nvme-seagate-vs-pcie-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-vs-pcie-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-vs-smart-add-log.1 b/Documentation/nvme-seagate-vs-smart-add-log.1
index 4347f7f..c9d12ea 100644
--- a/Documentation/nvme-seagate-vs-smart-add-log.1
+++ b/Documentation/nvme-seagate-vs-smart-add-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-vs-smart-add-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-VS\-S" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-S" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-vs-smart-add-log.html b/Documentation/nvme-seagate-vs-smart-add-log.html
index bf3fea6..b899ac6 100644
--- a/Documentation/nvme-seagate-vs-smart-add-log.html
+++ b/Documentation/nvme-seagate-vs-smart-add-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-vs-smart-add-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -830,7 +830,7 @@ all commands work across all product families.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-seagate-vs-temperature-stats.1 b/Documentation/nvme-seagate-vs-temperature-stats.1
index 16822b7..a018045 100644
--- a/Documentation/nvme-seagate-vs-temperature-stats.1
+++ b/Documentation/nvme-seagate-vs-temperature-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-seagate-vs-temperature-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SEAGATE\-VS\-T" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-T" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-vs-temperature-stats.html b/Documentation/nvme-seagate-vs-temperature-stats.html
index a40a93c..cdfec03 100644
--- a/Documentation/nvme-seagate-vs-temperature-stats.html
+++ b/Documentation/nvme-seagate-vs-temperature-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-seagate-vs-temperature-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -802,7 +802,7 @@ nvme block device (ex: /dev/nvme0n1).</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-security-recv.1 b/Documentation/nvme-security-recv.1
index cb3d5fa..d09ae0f 100644
--- a/Documentation/nvme-security-recv.1
+++ b/Documentation/nvme-security-recv.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-security-recv
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SECURITY\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SECURITY\-RECV" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-security-recv.html b/Documentation/nvme-security-recv.html
index a79ba03..3aa6a9a 100644
--- a/Documentation/nvme-security-recv.html
+++ b/Documentation/nvme-security-recv.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-security-recv(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -918,7 +918,7 @@ controller reset occurs.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-security-send.1 b/Documentation/nvme-security-send.1
index c1477a1..bbe0c87 100644
--- a/Documentation/nvme-security-send.1
+++ b/Documentation/nvme-security-send.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-security-send
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SECURITY\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SECURITY\-SEND" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-security-send.html b/Documentation/nvme-security-send.html
index 3133a47..1c656e0 100644
--- a/Documentation/nvme-security-send.html
+++ b/Documentation/nvme-security-send.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-security-send(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -905,7 +905,7 @@ Receive command is Security Protocol field dependent as defined in SPC-4.</p></d
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-self-test-log.1 b/Documentation/nvme-self-test-log.1
index 1c1f6b6..fc48243 100644
--- a/Documentation/nvme-self-test-log.1
+++ b/Documentation/nvme-self-test-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-self-test-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SELF\-TEST\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SELF\-TEST\-LO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-self-test-log.html b/Documentation/nvme-self-test-log.html
index 11ea9cb..bca44f0 100644
--- a/Documentation/nvme-self-test-log.html
+++ b/Documentation/nvme-self-test-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-self-test-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -858,7 +858,7 @@ Get the self-test-log and print it in a json format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-set-feature.1 b/Documentation/nvme-set-feature.1
index b4169ac..32a3bca 100644
--- a/Documentation/nvme-set-feature.1
+++ b/Documentation/nvme-set-feature.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-set-feature
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SET\-FEATURE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SET\-FEATURE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-set-feature.html b/Documentation/nvme-set-feature.html
index 51bf469..3b9a23a 100644
--- a/Documentation/nvme-set-feature.html
+++ b/Documentation/nvme-set-feature.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-set-feature(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -946,7 +946,7 @@ Sets the host id to the ascii string.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-set-property.1 b/Documentation/nvme-set-property.1
index 59342d6..d40714f 100644
--- a/Documentation/nvme-set-property.1
+++ b/Documentation/nvme-set-property.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-set-property
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SET\-PROPERTY" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SET\-PROPERTY" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-set-property.html b/Documentation/nvme-set-property.html
index 8752e9f..4ca7622 100644
--- a/Documentation/nvme-set-property.html
+++ b/Documentation/nvme-set-property.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-set-property(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -843,7 +843,7 @@ nvme-set-property(1) Manual Page
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-set-reg.txt b/Documentation/nvme-set-reg.txt
index 2978c82..bd86c3a 100644
--- a/Documentation/nvme-set-reg.txt
+++ b/Documentation/nvme-set-reg.txt
@@ -22,6 +22,9 @@ DESCRIPTION
 -----------
 Writes and shows the defined NVMe controller register.
 
+The <device> parameter is mandatory and must be the nvme admin character
+device (ex: /dev/nvme0).
+
 OPTIONS
 -------
 -O <offset>::
diff --git a/Documentation/nvme-show-hostnqn.1 b/Documentation/nvme-show-hostnqn.1
index ddfac92..5449f2d 100644
--- a/Documentation/nvme-show-hostnqn.1
+++ b/Documentation/nvme-show-hostnqn.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-show-hostnqn
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SHOW\-HOSTNQN" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SHOW\-HOSTNQN" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-show-hostnqn.html b/Documentation/nvme-show-hostnqn.html
index d8cc99c..39fc781 100644
--- a/Documentation/nvme-show-hostnqn.html
+++ b/Documentation/nvme-show-hostnqn.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-show-hostnqn(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -809,7 +809,7 @@ this will show the systemd-generated host NQN for the system.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-show-regs.1 b/Documentation/nvme-show-regs.1
index 8a5a968..4da57a5 100644
--- a/Documentation/nvme-show-regs.1
+++ b/Documentation/nvme-show-regs.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-id-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-show-regs.html b/Documentation/nvme-show-regs.html
index 533a092..b50418b 100644
--- a/Documentation/nvme-show-regs.html
+++ b/Documentation/nvme-show-regs.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-id-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -871,7 +871,7 @@ in a json format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-show-topology.1 b/Documentation/nvme-show-topology.1
index 58270f4..d33ab29 100644
--- a/Documentation/nvme-show-topology.1
+++ b/Documentation/nvme-show-topology.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-show-topology
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SHOW\-TOPOLOGY" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SHOW\-TOPOLOGY" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-show-topology.html b/Documentation/nvme-show-topology.html
index 3456383..fa2fe02 100644
--- a/Documentation/nvme-show-topology.html
+++ b/Documentation/nvme-show-topology.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-show-topology(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -845,7 +845,7 @@ nvme-show-topology(1) Manual Page
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-smart-log.1 b/Documentation/nvme-smart-log.1
index 61af9a4..ba085e9 100644
--- a/Documentation/nvme-smart-log.1
+++ b/Documentation/nvme-smart-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-smart-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SMART\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SMART\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-smart-log.html b/Documentation/nvme-smart-log.html
index 6bfe471..26d8592 100644
--- a/Documentation/nvme-smart-log.html
+++ b/Documentation/nvme-smart-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-smart-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -861,7 +861,7 @@ Print the raw SMART log to a file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-clear-fw-activate-history.1 b/Documentation/nvme-solidigm-clear-fw-activate-history.1
index a292844..eac7d88 100644
--- a/Documentation/nvme-solidigm-clear-fw-activate-history.1
+++ b/Documentation/nvme-solidigm-clear-fw-activate-history.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-clear-fw-activate-history
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-CLEA" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-CLEA" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-clear-fw-activate-history.html b/Documentation/nvme-solidigm-clear-fw-activate-history.html
index 7bb70ad..1a95db0 100644
--- a/Documentation/nvme-solidigm-clear-fw-activate-history.html
+++ b/Documentation/nvme-solidigm-clear-fw-activate-history.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-clear-fw-activate-history(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -824,7 +824,7 @@ Clear the firmware update history log for an OCP 1.0 device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1 b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1
index 8095476..2242a18 100644
--- a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1
+++ b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-clear-pcie-correctable-errors
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-CLEA" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-CLEA" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html
index 8c30f7e..9d60035 100644
--- a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html
+++ b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-clear-pcie-correctable-errors(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -825,7 +825,7 @@ Clear PCIe Correctable Error Counters for an OCP 1.0 device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-cloud-SSDplugin-version.1 b/Documentation/nvme-solidigm-cloud-SSDplugin-version.1
index 2c4ee66..328e6a3 100644
--- a/Documentation/nvme-solidigm-cloud-SSDplugin-version.1
+++ b/Documentation/nvme-solidigm-cloud-SSDplugin-version.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-cloud-SSDplugin-version
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-CLOU" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-CLOU" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-cloud-SSDplugin-version.html b/Documentation/nvme-solidigm-cloud-SSDplugin-version.html
index eef281a..4435030 100644
--- a/Documentation/nvme-solidigm-cloud-SSDplugin-version.html
+++ b/Documentation/nvme-solidigm-cloud-SSDplugin-version.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-cloud-SSDplugin-version(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -787,7 +787,7 @@ Display the OCP plugin version:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-garbage-collect-log.1 b/Documentation/nvme-solidigm-garbage-collect-log.1
index 637bf96..cc008a5 100644
--- a/Documentation/nvme-solidigm-garbage-collect-log.1
+++ b/Documentation/nvme-solidigm-garbage-collect-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-garbage-collect-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-GARB" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-GARB" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-garbage-collect-log.html b/Documentation/nvme-solidigm-garbage-collect-log.html
index 7c2ae05..9fc1847 100644
--- a/Documentation/nvme-solidigm-garbage-collect-log.html
+++ b/Documentation/nvme-solidigm-garbage-collect-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-garbage-collect-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -818,7 +818,7 @@ Retrieve the garbage collection log in JSON format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-id-ctrl.1 b/Documentation/nvme-solidigm-id-ctrl.1
index f5e9092..d70e9b9 100644
--- a/Documentation/nvme-solidigm-id-ctrl.1
+++ b/Documentation/nvme-solidigm-id-ctrl.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-id-ctrl
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-ID\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-ID\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-id-ctrl.html b/Documentation/nvme-solidigm-id-ctrl.html
index b6e657f..32a5d0d 100644
--- a/Documentation/nvme-solidigm-id-ctrl.html
+++ b/Documentation/nvme-solidigm-id-ctrl.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-id-ctrl(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -845,7 +845,7 @@ Use human-readable output:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-latency-tracking-log.1 b/Documentation/nvme-solidigm-latency-tracking-log.1
index 438583b..dc954e9 100644
--- a/Documentation/nvme-solidigm-latency-tracking-log.1
+++ b/Documentation/nvme-solidigm-latency-tracking-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-latency-tracking-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-LATE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-LATE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-latency-tracking-log.html b/Documentation/nvme-solidigm-latency-tracking-log.html
index af52bed..9861c25 100644
--- a/Documentation/nvme-solidigm-latency-tracking-log.html
+++ b/Documentation/nvme-solidigm-latency-tracking-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-latency-tracking-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -894,7 +894,7 @@ Specify a log type when retrieving latency statistics:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-log-page-directory.1 b/Documentation/nvme-solidigm-log-page-directory.1
index 9ae03b4..a7cba8e 100644
--- a/Documentation/nvme-solidigm-log-page-directory.1
+++ b/Documentation/nvme-solidigm-log-page-directory.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-log-page-directory
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-LOG\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-LOG\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-log-page-directory.html b/Documentation/nvme-solidigm-log-page-directory.html
index e6e7b18..158161d 100644
--- a/Documentation/nvme-solidigm-log-page-directory.html
+++ b/Documentation/nvme-solidigm-log-page-directory.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-log-page-directory(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -818,7 +818,7 @@ Retrieve the log page directory in JSON format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-market-log.1 b/Documentation/nvme-solidigm-market-log.1
index 9a70b25..3fc42cd 100644
--- a/Documentation/nvme-solidigm-market-log.1
+++ b/Documentation/nvme-solidigm-market-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-market-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-MARK" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-MARK" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-market-log.html b/Documentation/nvme-solidigm-market-log.html
index d9d315e..88796e4 100644
--- a/Documentation/nvme-solidigm-market-log.html
+++ b/Documentation/nvme-solidigm-market-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-market-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -816,7 +816,7 @@ Retrieve the raw binary data of the marketing name log:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-parse-telemetry-log.1 b/Documentation/nvme-solidigm-parse-telemetry-log.1
index 9764fdf..e09a560 100644
--- a/Documentation/nvme-solidigm-parse-telemetry-log.1
+++ b/Documentation/nvme-solidigm-parse-telemetry-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-parse-telemetry-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-PARS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-PARS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-parse-telemetry-log.html b/Documentation/nvme-solidigm-parse-telemetry-log.html
index d33d709..6ef6042 100644
--- a/Documentation/nvme-solidigm-parse-telemetry-log.html
+++ b/Documentation/nvme-solidigm-parse-telemetry-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-parse-telemetry-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -899,7 +899,7 @@ Parse a telemetry log from a binary file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-smart-log-add.1 b/Documentation/nvme-solidigm-smart-log-add.1
index a71787b..e48df55 100644
--- a/Documentation/nvme-solidigm-smart-log-add.1
+++ b/Documentation/nvme-solidigm-smart-log-add.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-smart-log-add
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-SMAR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-SMAR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-smart-log-add.html b/Documentation/nvme-solidigm-smart-log-add.html
index 178f6bf..a17dfce 100644
--- a/Documentation/nvme-solidigm-smart-log-add.html
+++ b/Documentation/nvme-solidigm-smart-log-add.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-smart-log-add(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -840,7 +840,7 @@ Retrieve the Solidigm SMART log in JSON format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-temp-stats.1 b/Documentation/nvme-solidigm-temp-stats.1
index 50e5b44..394ec22 100644
--- a/Documentation/nvme-solidigm-temp-stats.1
+++ b/Documentation/nvme-solidigm-temp-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-temp-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-TEMP" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-TEMP" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-temp-stats.html b/Documentation/nvme-solidigm-temp-stats.html
index d61c5fc..b273653 100644
--- a/Documentation/nvme-solidigm-temp-stats.html
+++ b/Documentation/nvme-solidigm-temp-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-temp-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -818,7 +818,7 @@ Retrieve the temperature statistics log in raw binary format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-vs-drive-info.1 b/Documentation/nvme-solidigm-vs-drive-info.1
index cd3b63e..5bf9457 100644
--- a/Documentation/nvme-solidigm-vs-drive-info.1
+++ b/Documentation/nvme-solidigm-vs-drive-info.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-vs-drive-info
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-VS\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-vs-drive-info.html b/Documentation/nvme-solidigm-vs-drive-info.html
index 04b0c74..65a518b 100644
--- a/Documentation/nvme-solidigm-vs-drive-info.html
+++ b/Documentation/nvme-solidigm-vs-drive-info.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-vs-drive-info(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -819,7 +819,7 @@ Retrieve the drive information in JSON format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-vs-fw-activate-history.1 b/Documentation/nvme-solidigm-vs-fw-activate-history.1
index b1d2e99..01ebd6f 100644
--- a/Documentation/nvme-solidigm-vs-fw-activate-history.1
+++ b/Documentation/nvme-solidigm-vs-fw-activate-history.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-vs-fw-activate-history
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-VS\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-vs-fw-activate-history.html b/Documentation/nvme-solidigm-vs-fw-activate-history.html
index 75a6c87..31737f2 100644
--- a/Documentation/nvme-solidigm-vs-fw-activate-history.html
+++ b/Documentation/nvme-solidigm-vs-fw-activate-history.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-vs-fw-activate-history(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -814,7 +814,7 @@ Print the firmware activation history log in JSON format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-vs-internal-log.1 b/Documentation/nvme-solidigm-vs-internal-log.1
index c30a350..36a1822 100644
--- a/Documentation/nvme-solidigm-vs-internal-log.1
+++ b/Documentation/nvme-solidigm-vs-internal-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-vs-internal-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-VS\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-vs-internal-log.html b/Documentation/nvme-solidigm-vs-internal-log.html
index 2ab4fab..9f6a272 100644
--- a/Documentation/nvme-solidigm-vs-internal-log.html
+++ b/Documentation/nvme-solidigm-vs-internal-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-vs-internal-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -850,7 +850,7 @@ Retrieve logs with verbose output:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-vs-smart-add-log.1 b/Documentation/nvme-solidigm-vs-smart-add-log.1
index 80f2bb5..6e5237e 100644
--- a/Documentation/nvme-solidigm-vs-smart-add-log.1
+++ b/Documentation/nvme-solidigm-vs-smart-add-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-vs-smart-add-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-VS\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-vs-smart-add-log.html b/Documentation/nvme-solidigm-vs-smart-add-log.html
index 24832aa..dad1642 100644
--- a/Documentation/nvme-solidigm-vs-smart-add-log.html
+++ b/Documentation/nvme-solidigm-vs-smart-add-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-vs-smart-add-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -814,7 +814,7 @@ Print the SMART / health extended log in JSON format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-solidigm-workload-tracker.1 b/Documentation/nvme-solidigm-workload-tracker.1
index 444a91d..764011c 100644
--- a/Documentation/nvme-solidigm-workload-tracker.1
+++ b/Documentation/nvme-solidigm-workload-tracker.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-solidigm-workload-tracker
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SOLIDIGM\-WORK" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SOLIDIGM\-WORK" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-solidigm-workload-tracker.html b/Documentation/nvme-solidigm-workload-tracker.html
index bea20d6..0a2f2f9 100644
--- a/Documentation/nvme-solidigm-workload-tracker.html
+++ b/Documentation/nvme-solidigm-workload-tracker.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-solidigm-workload-tracker(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -940,7 +940,7 @@ Capture Power tracker samples with a 10-second interval for 5 minutes:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-subsystem-reset.1 b/Documentation/nvme-subsystem-reset.1
index fb53f74..3f6ae83 100644
--- a/Documentation/nvme-subsystem-reset.1
+++ b/Documentation/nvme-subsystem-reset.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-subsystem-reset
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SUBSYSTEM\-RES" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SUBSYSTEM\-RES" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-subsystem-reset.html b/Documentation/nvme-subsystem-reset.html
index 95a2377..ecb44d8 100644
--- a/Documentation/nvme-subsystem-reset.html
+++ b/Documentation/nvme-subsystem-reset.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-subsystem-reset(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -819,7 +819,7 @@ Resets the subsystem.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-supported-log-pages.1 b/Documentation/nvme-supported-log-pages.1
index 9d690b4..99760da 100644
--- a/Documentation/nvme-supported-log-pages.1
+++ b/Documentation/nvme-supported-log-pages.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-supported-log-pages
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-SUPPORTED\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SUPPORTED\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-supported-log-pages.html b/Documentation/nvme-supported-log-pages.html
index dc88b89..ce50d5d 100644
--- a/Documentation/nvme-supported-log-pages.html
+++ b/Documentation/nvme-supported-log-pages.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-supported-log-pages(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -813,7 +813,7 @@ for each command that is supported.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-telemetry-log.1 b/Documentation/nvme-telemetry-log.1
index b8b1209..887b8f5 100644
--- a/Documentation/nvme-telemetry-log.1
+++ b/Documentation/nvme-telemetry-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-telemetry-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-TELEMETRY\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TELEMETRY\-LOG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-telemetry-log.html b/Documentation/nvme-telemetry-log.html
index f2dc0c5..7b0867f 100644
--- a/Documentation/nvme-telemetry-log.html
+++ b/Documentation/nvme-telemetry-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-telemetry-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -862,7 +862,7 @@ Retrieve Telemetry Host-Initiated data to telemetry_log.bin
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-tls-key.1 b/Documentation/nvme-tls-key.1
index 05f4347..d81e0bf 100644
--- a/Documentation/nvme-tls-key.1
+++ b/Documentation/nvme-tls-key.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-tls-key
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-TLS\-KEY" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TLS\-KEY" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-tls-key.html b/Documentation/nvme-tls-key.html
index c03c598..76e0e61 100644
--- a/Documentation/nvme-tls-key.html
+++ b/Documentation/nvme-tls-key.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-tls-key(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -951,7 +951,7 @@ Session Keyring
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1 b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1
index e4a4769..d30aa14 100644
--- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1
+++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-toshiba-clear-pcie-correctable-errors
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-TOSHIBA\-CLEAR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TOSHIBA\-CLEAR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html
index 532bda9..f4c2f30 100644
--- a/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html
+++ b/Documentation/nvme-toshiba-clear-pcie-correctable-errors.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-toshiba-clear-pcie-correctable-errors(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -791,7 +791,7 @@ Clear the PCIe correctable errors count:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-toshiba-vs-internal-log.1 b/Documentation/nvme-toshiba-vs-internal-log.1
index faa30e5..5f7174b 100644
--- a/Documentation/nvme-toshiba-vs-internal-log.1
+++ b/Documentation/nvme-toshiba-vs-internal-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-toshiba-vs-internal-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-TOSHIBA\-VS\-I" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TOSHIBA\-VS\-I" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-toshiba-vs-internal-log.html b/Documentation/nvme-toshiba-vs-internal-log.html
index 823806b..c098d1b 100644
--- a/Documentation/nvme-toshiba-vs-internal-log.html
+++ b/Documentation/nvme-toshiba-vs-internal-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-toshiba-vs-internal-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -837,7 +837,7 @@ Get the previous log from the device and save to a binary file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.1 b/Documentation/nvme-toshiba-vs-smart-add-log.1
index 32378c1..72b6241 100644
--- a/Documentation/nvme-toshiba-vs-smart-add-log.1
+++ b/Documentation/nvme-toshiba-vs-smart-add-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-toshiba-vs-smart-add-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-TOSHIBA\-VS\-S" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TOSHIBA\-VS\-S" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-toshiba-vs-smart-add-log.html b/Documentation/nvme-toshiba-vs-smart-add-log.html
index 5b7f9b0..644e539 100644
--- a/Documentation/nvme-toshiba-vs-smart-add-log.html
+++ b/Documentation/nvme-toshiba-vs-smart-add-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-toshiba-vs-smart-add-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -841,7 +841,7 @@ Get the contents of log page 0xC0 from the device and save to a binary file:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-transcend-badblock.1 b/Documentation/nvme-transcend-badblock.1
index ac520bb..95215b4 100644
--- a/Documentation/nvme-transcend-badblock.1
+++ b/Documentation/nvme-transcend-badblock.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-transcend-badblock
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-TRANSCEND\-BAD" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TRANSCEND\-BAD" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-transcend-badblock.html b/Documentation/nvme-transcend-badblock.html
index 1e7dcca..a21281d 100644
--- a/Documentation/nvme-transcend-badblock.html
+++ b/Documentation/nvme-transcend-badblock.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-transcend-badblock(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -796,7 +796,7 @@ Print the Transcend device&#8217;s bad blocks in a human readable format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-transcend-healthvalue.1 b/Documentation/nvme-transcend-healthvalue.1
index 00ffd98..e62057d 100644
--- a/Documentation/nvme-transcend-healthvalue.1
+++ b/Documentation/nvme-transcend-healthvalue.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-transcend-healthvalue
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-TRANSCEND\-HEA" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TRANSCEND\-HEA" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-transcend-healthvalue.html b/Documentation/nvme-transcend-healthvalue.html
index d96fb4a..42c34be 100644
--- a/Documentation/nvme-transcend-healthvalue.html
+++ b/Documentation/nvme-transcend-healthvalue.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-transcend-healthvalue(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -797,7 +797,7 @@ Print the Transcend Device health value in a human readable format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-verify.1 b/Documentation/nvme-verify.1
index b748619..94912a0 100644
--- a/Documentation/nvme-verify.1
+++ b/Documentation/nvme-verify.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-verify
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-VERIFY" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-VERIFY" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-verify.html b/Documentation/nvme-verify.html
index 4702552..c5127c9 100644
--- a/Documentation/nvme-verify.html
+++ b/Documentation/nvme-verify.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-verify(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -988,7 +988,7 @@ metadata is passes.</p></td>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.1 b/Documentation/nvme-virtium-save-smart-to-vtview-log.1
index 8b17025..6812a47 100644
--- a/Documentation/nvme-virtium-save-smart-to-vtview-log.1
+++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-virtium-save-smart-to-vtview-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-VIRTIUM\-SAVE\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-VIRTIUM\-SAVE\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-virtium-save-smart-to-vtview-log.html b/Documentation/nvme-virtium-save-smart-to-vtview-log.html
index aa8f3a0..7bc4fb0 100644
--- a/Documentation/nvme-virtium-save-smart-to-vtview-log.html
+++ b/Documentation/nvme-virtium-save-smart-to-vtview-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-virtium-save-smart-to-vtview-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -878,7 +878,7 @@ Just logging: Default logging is run for 20 hours and log every 10 hours.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-virtium-show-identify.1 b/Documentation/nvme-virtium-show-identify.1
index aaf0985..5c0204a 100644
--- a/Documentation/nvme-virtium-show-identify.1
+++ b/Documentation/nvme-virtium-show-identify.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-virtium-show-identify
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-VIRTIUM\-SHOW\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-VIRTIUM\-SHOW\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-virtium-show-identify.html b/Documentation/nvme-virtium-show-identify.html
index 69a8531..a713fa1 100644
--- a/Documentation/nvme-virtium-show-identify.html
+++ b/Documentation/nvme-virtium-show-identify.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-virtium-show-identify(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -798,7 +798,7 @@ Show Identify Device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-cap-diag.1 b/Documentation/nvme-wdc-cap-diag.1
index 696c4f3..4dca032 100644
--- a/Documentation/nvme-wdc-cap-diag.1
+++ b/Documentation/nvme-wdc-cap-diag.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-cap-diag
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-CAP\-DIAG" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CAP\-DIAG" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-cap-diag.html b/Documentation/nvme-wdc-cap-diag.html
index 59d7333..6f5bd5e 100644
--- a/Documentation/nvme-wdc-cap-diag.html
+++ b/Documentation/nvme-wdc-cap-diag.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-cap-diag(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -856,7 +856,7 @@ Gets the capture diagnostics log from the device transferring the data in 16k ch
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-capabilities.1 b/Documentation/nvme-wdc-capabilities.1
index 37ce4f0..1a85864 100644
--- a/Documentation/nvme-wdc-capabilities.1
+++ b/Documentation/nvme-wdc-capabilities.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-capabilities
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-CAPABILIT" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CAPABILIT" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-capabilities.html b/Documentation/nvme-wdc-capabilities.html
index ed5f430..61f6e60 100644
--- a/Documentation/nvme-wdc-capabilities.html
+++ b/Documentation/nvme-wdc-capabilities.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-capabilities(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -789,7 +789,7 @@ Displays the capabilities for the device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-clear-assert-dump.1 b/Documentation/nvme-wdc-clear-assert-dump.1
index b332c20..b3c9703 100644
--- a/Documentation/nvme-wdc-clear-assert-dump.1
+++ b/Documentation/nvme-wdc-clear-assert-dump.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-clear-assert-dump
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-CLEAR\-AS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLEAR\-AS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-clear-assert-dump.html b/Documentation/nvme-wdc-clear-assert-dump.html
index 1bfacbc..8f2984c 100644
--- a/Documentation/nvme-wdc-clear-assert-dump.html
+++ b/Documentation/nvme-wdc-clear-assert-dump.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-clear-assert-dump(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -798,7 +798,7 @@ Clears the assert dump (if present):
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.1 b/Documentation/nvme-wdc-clear-fw-activate-history.1
index 63cd477..d88c154 100644
--- a/Documentation/nvme-wdc-clear-fw-activate-history.1
+++ b/Documentation/nvme-wdc-clear-fw-activate-history.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-clear-fw-activate-history
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-CLEAR\-FW" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLEAR\-FW" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-clear-fw-activate-history.html b/Documentation/nvme-wdc-clear-fw-activate-history.html
index ed0aa7a..295d25e 100644
--- a/Documentation/nvme-wdc-clear-fw-activate-history.html
+++ b/Documentation/nvme-wdc-clear-fw-activate-history.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-clear-fw-activate-history(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -797,7 +797,7 @@ Clears the firmware activate history table:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1 b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1
index 64b3c9a..57d4c26 100644
--- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.1
+++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-clear-pcie-correctable-errors
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-CLEAR\-PC" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLEAR\-PC" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html
index 161b002..539a697 100644
--- a/Documentation/nvme-wdc-clear-pcie-correctable-errors.html
+++ b/Documentation/nvme-wdc-clear-pcie-correctable-errors.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-clear-pcie-correctable-errors(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -799,7 +799,7 @@ Clears the PCIe Correctable Error Count field returned in the smart-log-add comm
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1 b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1
index 7928060..9170edf 100644
--- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.1
+++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-cloud-SSD-plugin-version
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-CLOUD\-SS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLOUD\-SS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html
index baccafb..622abe1 100644
--- a/Documentation/nvme-wdc-cloud-SSD-plugin-version.html
+++ b/Documentation/nvme-wdc-cloud-SSD-plugin-version.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-cloud-SSD-plugin-version(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -790,7 +790,7 @@ Displays the cloud ssd plugin version for the device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.1 b/Documentation/nvme-wdc-cloud-boot-SSD-version.1
index fc4c7d3..733f076 100644
--- a/Documentation/nvme-wdc-cloud-boot-SSD-version.1
+++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-cloud-boot-SSD-version
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-CLOUD\-BO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLOUD\-BO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-cloud-boot-SSD-version.html b/Documentation/nvme-wdc-cloud-boot-SSD-version.html
index 9a7c972..d4ad9c8 100644
--- a/Documentation/nvme-wdc-cloud-boot-SSD-version.html
+++ b/Documentation/nvme-wdc-cloud-boot-SSD-version.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-cloud-boot-SSD-version(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -790,7 +790,7 @@ Displays the cloud boot ssd version for the device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-drive-essentials.1 b/Documentation/nvme-wdc-drive-essentials.1
index 8b582a7..3daa75b 100644
--- a/Documentation/nvme-wdc-drive-essentials.1
+++ b/Documentation/nvme-wdc-drive-essentials.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-drive-essentials
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-DRIVE\-ES" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-DRIVE\-ES" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-drive-essentials.html b/Documentation/nvme-wdc-drive-essentials.html
index 8bd99f4..c3c3d1c 100644
--- a/Documentation/nvme-wdc-drive-essentials.html
+++ b/Documentation/nvme-wdc-drive-essentials.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-drive-essentials(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -822,7 +822,7 @@ Gets the drive essentials data files from the device and saves the tar file to s
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-drive-log.1 b/Documentation/nvme-wdc-drive-log.1
index 33af818..37657cf 100644
--- a/Documentation/nvme-wdc-drive-log.1
+++ b/Documentation/nvme-wdc-drive-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-drive-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-DRIVE\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-DRIVE\-LO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-drive-log.html b/Documentation/nvme-wdc-drive-log.html
index 7bdc9be..7b44a9a 100644
--- a/Documentation/nvme-wdc-drive-log.html
+++ b/Documentation/nvme-wdc-drive-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-drive-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -829,7 +829,7 @@ Gets the drive log from the device and saves to defined file with pathname (e.g.
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-drive-resize.1 b/Documentation/nvme-wdc-drive-resize.1
index abe43f6..a2e6213 100644
--- a/Documentation/nvme-wdc-drive-resize.1
+++ b/Documentation/nvme-wdc-drive-resize.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-drive-resize
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-DRIVE\-RE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-DRIVE\-RE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-drive-resize.html b/Documentation/nvme-wdc-drive-resize.html
index edc448f..fc56eb1 100644
--- a/Documentation/nvme-wdc-drive-resize.html
+++ b/Documentation/nvme-wdc-drive-resize.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-drive-resize(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -810,7 +810,7 @@ Has the program issue WDC Resize Vendor Unique Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-enc-get-log.1 b/Documentation/nvme-wdc-enc-get-log.1
index ccb8e2c..6d3e09a 100644
--- a/Documentation/nvme-wdc-enc-get-log.1
+++ b/Documentation/nvme-wdc-enc-get-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-enc-get-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-ENC\-GET\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-ENC\-GET\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-enc-get-log.html b/Documentation/nvme-wdc-enc-get-log.html
index b8ddbae..cb51ae4 100644
--- a/Documentation/nvme-wdc-enc-get-log.html
+++ b/Documentation/nvme-wdc-enc-get-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-enc-get-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -837,7 +837,7 @@ Gets the enclosure log from the device based on the log id(0xd2) with default tr
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-get-crash-dump.1 b/Documentation/nvme-wdc-get-crash-dump.1
index 63e7a2b..6ed0da1 100644
--- a/Documentation/nvme-wdc-get-crash-dump.1
+++ b/Documentation/nvme-wdc-get-crash-dump.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-get-crash-dump
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-GET\-CRAS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-CRAS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-get-crash-dump.html b/Documentation/nvme-wdc-get-crash-dump.html
index 9746926..97742e4 100644
--- a/Documentation/nvme-wdc-get-crash-dump.html
+++ b/Documentation/nvme-wdc-get-crash-dump.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-get-crash-dump(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -830,7 +830,7 @@ Gets the crash dump from the device and saves to defined file with pathname (e.g
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.1 b/Documentation/nvme-wdc-get-dev-capabilities-log.1
index b9ad1bc..2f0ee07 100644
--- a/Documentation/nvme-wdc-get-dev-capabilities-log.1
+++ b/Documentation/nvme-wdc-get-dev-capabilities-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-get-dev-capabilities-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-GET\-DEV\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-DEV\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-get-dev-capabilities-log.html b/Documentation/nvme-wdc-get-dev-capabilities-log.html
index a82a8a7..945443b 100644
--- a/Documentation/nvme-wdc-get-dev-capabilities-log.html
+++ b/Documentation/nvme-wdc-get-dev-capabilities-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-get-dev-capabilities-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -815,7 +815,7 @@ Has the program issue WDC get-dev-capabilities-log plugin command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-get-drive-status.1 b/Documentation/nvme-wdc-get-drive-status.1
index 23584ec..e8729b4 100644
--- a/Documentation/nvme-wdc-get-drive-status.1
+++ b/Documentation/nvme-wdc-get-drive-status.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-get-drive-status
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-GET\-DRIV" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-DRIV" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-get-drive-status.html b/Documentation/nvme-wdc-get-drive-status.html
index 2bc68ed..5b4a21c 100644
--- a/Documentation/nvme-wdc-get-drive-status.html
+++ b/Documentation/nvme-wdc-get-drive-status.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-get-drive-status(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -836,7 +836,7 @@ Has the program issue WDC get-drive-status command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-get-error-recovery-log.1 b/Documentation/nvme-wdc-get-error-recovery-log.1
index af3c8d7..226fe6d 100644
--- a/Documentation/nvme-wdc-get-error-recovery-log.1
+++ b/Documentation/nvme-wdc-get-error-recovery-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-get-error-recovery-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-GET\-ERRO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-ERRO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-get-error-recovery-log.html b/Documentation/nvme-wdc-get-error-recovery-log.html
index 99cdcb5..b22b339 100644
--- a/Documentation/nvme-wdc-get-error-recovery-log.html
+++ b/Documentation/nvme-wdc-get-error-recovery-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-get-error-recovery-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -816,7 +816,7 @@ Has the program issue WDC get-error-recovery-log plugin command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.1 b/Documentation/nvme-wdc-get-latency-monitor-log.1
index f13884d..7148035 100644
--- a/Documentation/nvme-wdc-get-latency-monitor-log.1
+++ b/Documentation/nvme-wdc-get-latency-monitor-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-get-latency-monitor-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-GET\-LATE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-LATE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-get-latency-monitor-log.html b/Documentation/nvme-wdc-get-latency-monitor-log.html
index f48e7fa..4c7f565 100644
--- a/Documentation/nvme-wdc-get-latency-monitor-log.html
+++ b/Documentation/nvme-wdc-get-latency-monitor-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-get-latency-monitor-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -810,7 +810,7 @@ Displays the get latency monitor log for the device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-get-pfail-dump.1 b/Documentation/nvme-wdc-get-pfail-dump.1
index a407732..8637ba7 100644
--- a/Documentation/nvme-wdc-get-pfail-dump.1
+++ b/Documentation/nvme-wdc-get-pfail-dump.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-get-pfail-dump
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-GET\-PFAI" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-PFAI" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-get-pfail-dump.html b/Documentation/nvme-wdc-get-pfail-dump.html
index 9e982bc..f2d5cd3 100644
--- a/Documentation/nvme-wdc-get-pfail-dump.html
+++ b/Documentation/nvme-wdc-get-pfail-dump.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-get-pfail-dump(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -832,7 +832,7 @@ Gets the pfail crash dump from the device and saves to defined file with pathnam
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.1 b/Documentation/nvme-wdc-get-unsupported-reqs-log.1
index 7f93b78..defa5d2 100644
--- a/Documentation/nvme-wdc-get-unsupported-reqs-log.1
+++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-get-unsupported-reqs-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-GET\-UNSU" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-UNSU" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-get-unsupported-reqs-log.html b/Documentation/nvme-wdc-get-unsupported-reqs-log.html
index ccdf5a6..83a0424 100644
--- a/Documentation/nvme-wdc-get-unsupported-reqs-log.html
+++ b/Documentation/nvme-wdc-get-unsupported-reqs-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-get-unsupported-reqs-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -816,7 +816,7 @@ Has the program issue WDC get-unsupported-reqs-log plugin command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-id-ctrl.1 b/Documentation/nvme-wdc-id-ctrl.1
index 7582e1c..2b23668 100644
--- a/Documentation/nvme-wdc-id-ctrl.1
+++ b/Documentation/nvme-wdc-id-ctrl.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-id-ctrl
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-ID\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-id-ctrl.html b/Documentation/nvme-wdc-id-ctrl.html
index d24b6d3..0afbf04 100644
--- a/Documentation/nvme-wdc-id-ctrl.html
+++ b/Documentation/nvme-wdc-id-ctrl.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-id-ctrl(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -856,7 +856,7 @@ fields in a human readable format:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-log-page-directory.1 b/Documentation/nvme-wdc-log-page-directory.1
index ed68050..9120c9f 100644
--- a/Documentation/nvme-wdc-log-page-directory.1
+++ b/Documentation/nvme-wdc-log-page-directory.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-log-page-directory
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-LOG\-PAGE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-LOG\-PAGE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-log-page-directory.html b/Documentation/nvme-wdc-log-page-directory.html
index 4e7728a..633d871 100644
--- a/Documentation/nvme-wdc-log-page-directory.html
+++ b/Documentation/nvme-wdc-log-page-directory.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-log-page-directory(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -812,7 +812,7 @@ WDC log-page-directory example command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-namespace-resize.1 b/Documentation/nvme-wdc-namespace-resize.1
index dfe6550..b875940 100644
--- a/Documentation/nvme-wdc-namespace-resize.1
+++ b/Documentation/nvme-wdc-namespace-resize.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-namespace-resize
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-NAMESPACE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-NAMESPACE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-namespace-resize.html b/Documentation/nvme-wdc-namespace-resize.html
index 694138e..d56cc83 100644
--- a/Documentation/nvme-wdc-namespace-resize.html
+++ b/Documentation/nvme-wdc-namespace-resize.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-namespace-resize(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -836,7 +836,7 @@ Resizes namespace 2 to 7% of the original TNVMCAP reported value:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-purge-monitor.1 b/Documentation/nvme-wdc-purge-monitor.1
index 353b690..ce9dc02 100644
--- a/Documentation/nvme-wdc-purge-monitor.1
+++ b/Documentation/nvme-wdc-purge-monitor.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-purge-monitor
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-PURGE\-MO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-PURGE\-MO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-purge-monitor.html b/Documentation/nvme-wdc-purge-monitor.html
index 7bda2ad..75aa4bc 100644
--- a/Documentation/nvme-wdc-purge-monitor.html
+++ b/Documentation/nvme-wdc-purge-monitor.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-purge-monitor(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -837,7 +837,7 @@ Has the program issue WDC Purge-Monitor Vendor Unique Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-purge.1 b/Documentation/nvme-wdc-purge.1
index 67aef17..cca00b7 100644
--- a/Documentation/nvme-wdc-purge.1
+++ b/Documentation/nvme-wdc-purge.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-purge
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-PURGE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-PURGE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-purge.html b/Documentation/nvme-wdc-purge.html
index 1ddff04..b258a79 100644
--- a/Documentation/nvme-wdc-purge.html
+++ b/Documentation/nvme-wdc-purge.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-purge(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -799,7 +799,7 @@ Has the program issue WDC Purge Vendor Unique Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-cloud-log.1 b/Documentation/nvme-wdc-vs-cloud-log.1
index 67afd04..2b7c0b0 100644
--- a/Documentation/nvme-wdc-vs-cloud-log.1
+++ b/Documentation/nvme-wdc-vs-cloud-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-cloud-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-CLOUD" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-CLOUD" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-cloud-log.html b/Documentation/nvme-wdc-vs-cloud-log.html
index 9b7ae1a..58280e8 100644
--- a/Documentation/nvme-wdc-vs-cloud-log.html
+++ b/Documentation/nvme-wdc-vs-cloud-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-cloud-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -828,7 +828,7 @@ Has the program issue WDC vs-cloud-log Vendor Unique Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-device-waf.1 b/Documentation/nvme-wdc-vs-device-waf.1
index 33e1834..01d0094 100644
--- a/Documentation/nvme-wdc-vs-device-waf.1
+++ b/Documentation/nvme-wdc-vs-device-waf.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-device-waf
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-DEVIC" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-DEVIC" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-device-waf.html b/Documentation/nvme-wdc-vs-device-waf.html
index a96784f..20fd606 100644
--- a/Documentation/nvme-wdc-vs-device-waf.html
+++ b/Documentation/nvme-wdc-vs-device-waf.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-device-waf(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -828,7 +828,7 @@ Has the program issue WDC vs-device-waf plugin Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-drive-info.1 b/Documentation/nvme-wdc-vs-drive-info.1
index 375ac29..bcf015a 100644
--- a/Documentation/nvme-wdc-vs-drive-info.1
+++ b/Documentation/nvme-wdc-vs-drive-info.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-drive-info
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-DRIVE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-DRIVE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-drive-info.html b/Documentation/nvme-wdc-vs-drive-info.html
index 6a8fca3..edc55e4 100644
--- a/Documentation/nvme-wdc-vs-drive-info.html
+++ b/Documentation/nvme-wdc-vs-drive-info.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-drive-info(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -795,7 +795,7 @@ on the drive:</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.1 b/Documentation/nvme-wdc-vs-error-reason-identifier.1
index 5e1808c..d266072 100644
--- a/Documentation/nvme-wdc-vs-error-reason-identifier.1
+++ b/Documentation/nvme-wdc-vs-error-reason-identifier.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-error-reason-identifier
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-ERROR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-ERROR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-error-reason-identifier.html b/Documentation/nvme-wdc-vs-error-reason-identifier.html
index efb7800..972d60f 100644
--- a/Documentation/nvme-wdc-vs-error-reason-identifier.html
+++ b/Documentation/nvme-wdc-vs-error-reason-identifier.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-error-reason-identifier(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -836,7 +836,7 @@ Retrieves the controller initiated error reason identifier field and save it in
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.1 b/Documentation/nvme-wdc-vs-fw-activate-history.1
index f5f66f6..b28f8c8 100644
--- a/Documentation/nvme-wdc-vs-fw-activate-history.1
+++ b/Documentation/nvme-wdc-vs-fw-activate-history.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-fw-activate-history
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-FW\-A" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-FW\-A" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-fw-activate-history.html b/Documentation/nvme-wdc-vs-fw-activate-history.html
index 8e46a87..cc35488 100644
--- a/Documentation/nvme-wdc-vs-fw-activate-history.html
+++ b/Documentation/nvme-wdc-vs-fw-activate-history.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-fw-activate-history(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -868,7 +868,7 @@ Has the program issue WDC vs-fw-activate-history Vendor Unique Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.1 b/Documentation/nvme-wdc-vs-hw-rev-log.1
index 7e63b81..adab4b3 100644
--- a/Documentation/nvme-wdc-vs-hw-rev-log.1
+++ b/Documentation/nvme-wdc-vs-hw-rev-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-hw-rev-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-HW\-R" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-HW\-R" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-hw-rev-log.html b/Documentation/nvme-wdc-vs-hw-rev-log.html
index 69db3de..86e34ed 100644
--- a/Documentation/nvme-wdc-vs-hw-rev-log.html
+++ b/Documentation/nvme-wdc-vs-hw-rev-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-hw-rev-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -827,7 +827,7 @@ Has the program issue WDC vs-hw-rev-log plugin Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-internal-log.1 b/Documentation/nvme-wdc-vs-internal-log.1
index ed338ad..130033e 100644
--- a/Documentation/nvme-wdc-vs-internal-log.1
+++ b/Documentation/nvme-wdc-vs-internal-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-internal-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-INTER" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-INTER" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-internal-log.html b/Documentation/nvme-wdc-vs-internal-log.html
index 9d81655..b4a916c 100644
--- a/Documentation/nvme-wdc-vs-internal-log.html
+++ b/Documentation/nvme-wdc-vs-internal-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-internal-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -958,7 +958,7 @@ Gets the controller telemetry log page to data area 3 from the device and stores
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-nand-stats.1 b/Documentation/nvme-wdc-vs-nand-stats.1
index 327b06d..3626a35 100644
--- a/Documentation/nvme-wdc-vs-nand-stats.1
+++ b/Documentation/nvme-wdc-vs-nand-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-nand-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-NAND\" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-NAND\" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-nand-stats.html b/Documentation/nvme-wdc-vs-nand-stats.html
index 453b602..aea6639 100644
--- a/Documentation/nvme-wdc-vs-nand-stats.html
+++ b/Documentation/nvme-wdc-vs-nand-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-nand-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -814,7 +814,7 @@ Has the program issue WDC vs-nand-stats Vendor Unique Command :
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-smart-add-log.1 b/Documentation/nvme-wdc-vs-smart-add-log.1
index 100628d..9c1ecaf 100644
--- a/Documentation/nvme-wdc-vs-smart-add-log.1
+++ b/Documentation/nvme-wdc-vs-smart-add-log.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-smart-add-log
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-SMART" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-SMART" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-smart-add-log.html b/Documentation/nvme-wdc-vs-smart-add-log.html
index 190cd46..75e1e07 100644
--- a/Documentation/nvme-wdc-vs-smart-add-log.html
+++ b/Documentation/nvme-wdc-vs-smart-add-log.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-smart-add-log(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -928,7 +928,7 @@ Has the program issue WDC vs-smart-add-log Vendor Unique Command for 0xC0 and 0x
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.1 b/Documentation/nvme-wdc-vs-telemetry-controller-option.1
index e6b5e07..afb7230 100644
--- a/Documentation/nvme-wdc-vs-telemetry-controller-option.1
+++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-telemetry-controller-option
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-TELEM" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-TELEM" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-telemetry-controller-option.html b/Documentation/nvme-wdc-vs-telemetry-controller-option.html
index 8432d5d..c1de20a 100644
--- a/Documentation/nvme-wdc-vs-telemetry-controller-option.html
+++ b/Documentation/nvme-wdc-vs-telemetry-controller-option.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-telemetry-controller-option(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -855,7 +855,7 @@ Gets the current status (enabled or disabled) of the controller initiated option
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-wdc-vs-temperature-stats.1 b/Documentation/nvme-wdc-vs-temperature-stats.1
index e363abc..40afa78 100644
--- a/Documentation/nvme-wdc-vs-temperature-stats.1
+++ b/Documentation/nvme-wdc-vs-temperature-stats.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-wdc-vs-temperature-stats
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WDC\-VS\-TEMPE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-TEMPE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-vs-temperature-stats.html b/Documentation/nvme-wdc-vs-temperature-stats.html
index 273bb7e..cfab9f5 100644
--- a/Documentation/nvme-wdc-vs-temperature-stats.html
+++ b/Documentation/nvme-wdc-vs-temperature-stats.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-wdc-vs-temperature-stats(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -857,7 +857,7 @@ Displays the temperature stats for the device:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-write-uncor.1 b/Documentation/nvme-write-uncor.1
index 426f210..42254d7 100644
--- a/Documentation/nvme-write-uncor.1
+++ b/Documentation/nvme-write-uncor.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-uncor
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-UNCOR" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-UNCOR" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-write-uncor.html b/Documentation/nvme-write-uncor.html
index 4c59b6a..8e5ddd0 100644
--- a/Documentation/nvme-write-uncor.html
+++ b/Documentation/nvme-write-uncor.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-uncor(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -880,7 +880,7 @@ blocks.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-write-zeroes.1 b/Documentation/nvme-write-zeroes.1
index 7880eca..ffe19ea 100644
--- a/Documentation/nvme-write-zeroes.1
+++ b/Documentation/nvme-write-zeroes.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-write-zeroes
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WRITE\-ZEROES" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WRITE\-ZEROES" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -43,7 +43,7 @@ nvme-write-zeroes \- Send an NVMe write zeroes command, return results
                         [\-\-storage\-tag<storage\-tag> | \-S <storage\-tag>]
                         [\-\-storage\-tag\-check<storage\-tag\-check> | \-C <storage\-tag\-check>]
                         [\-\-dir\-type=<dtype> | \-T <dtype>]
-                        [\-\-dir\-spec=<dspec> | \-D <dspec>]
+                        [\-\-dir\-spec=<dspec> | \-D <dspec>] [\-\-namespace\-zeroes | \-Z]
                         [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v]
                         [\-\-timeout=<timeout> | \-t <timeout>]
 .fi
@@ -162,6 +162,11 @@ Directive type
 Directive specific
 .RE
 .PP
+\-Z, \-\-namespace\-zeroes
+.RS 4
+If set, then the controller clear all logical blocks to zero in the entire namespace\&.
+.RE
+.PP
 \-o <fmt>, \-\-output\-format=<fmt>
 .RS 4
 Set the reporting format to
diff --git a/Documentation/nvme-write-zeroes.html b/Documentation/nvme-write-zeroes.html
index 75edeea..2d81dc2 100644
--- a/Documentation/nvme-write-zeroes.html
+++ b/Documentation/nvme-write-zeroes.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-write-zeroes(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -760,7 +760,7 @@ nvme-write-zeroes(1) Manual Page
                         [--storage-tag&lt;storage-tag&gt; | -S &lt;storage-tag&gt;]
                         [--storage-tag-check&lt;storage-tag-check&gt; | -C &lt;storage-tag-check&gt;]
                         [--dir-type=&lt;dtype&gt; | -T &lt;dtype&gt;]
-                        [--dir-spec=&lt;dspec&gt; | -D &lt;dspec&gt;]
+                        [--dir-spec=&lt;dspec&gt; | -D &lt;dspec&gt;] [--namespace-zeroes | -Z]
                         [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;] [--verbose | -v]
                         [--timeout=&lt;timeout&gt; | -t &lt;timeout&gt;]</pre>
 <div class="attribution">
@@ -970,6 +970,17 @@ metadata is passes.</p></td>
 </p>
 </dd>
 <dt class="hdlist1">
+-Z
+</dt>
+<dt class="hdlist1">
+--namespace-zeroes
+</dt>
+<dd>
+<p>
+        If set, then the controller clear all logical blocks to zero in the entire namespace.
+</p>
+</dd>
+<dt class="hdlist1">
 -o &lt;fmt&gt;
 </dt>
 <dt class="hdlist1">
@@ -1023,7 +1034,7 @@ metadata is passes.</p></td>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-write-zeroes.txt b/Documentation/nvme-write-zeroes.txt
index 3cfdb24..1e0d4d2 100644
--- a/Documentation/nvme-write-zeroes.txt
+++ b/Documentation/nvme-write-zeroes.txt
@@ -19,7 +19,7 @@ SYNOPSIS
 			[--storage-tag<storage-tag> | -S <storage-tag>]
 			[--storage-tag-check<storage-tag-check> | -C <storage-tag-check>]
 			[--dir-type=<dtype> | -T <dtype>]
-			[--dir-spec=<dspec> | -D <dspec>]
+			[--dir-spec=<dspec> | -D <dspec>] [--namespace-zeroes | -Z]
 			[--output-format=<fmt> | -o <fmt>] [--verbose | -v]
 			[--timeout=<timeout> | -t <timeout>]
 
@@ -97,6 +97,9 @@ metadata is passes.
 -D <dspec>::
 --dir-spec=<dspec>::
 	Directive specific
+-Z::
+--namespace-zeroes::
+	If set, then the controller clear all logical blocks to zero in the entire namespace.
 
 -o <fmt>::
 --output-format=<fmt>::
diff --git a/Documentation/nvme-write.1 b/Documentation/nvme-write.1
index 332f4c9..83ab658 100644
--- a/Documentation/nvme-write.1
+++ b/Documentation/nvme-write.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-write
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-WRITE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WRITE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-write.html b/Documentation/nvme-write.html
index 8019c3e..002e4b5 100644
--- a/Documentation/nvme-write.html
+++ b/Documentation/nvme-write.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-write(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1118,7 +1118,7 @@ metadata is passes.</p></td>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-changed-zone-list.1 b/Documentation/nvme-zns-changed-zone-list.1
index d535898..7dfcb1a 100644
--- a/Documentation/nvme-zns-changed-zone-list.1
+++ b/Documentation/nvme-zns-changed-zone-list.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-changed-zone-list
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-CHANGED\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-CHANGED\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-changed-zone-list.html b/Documentation/nvme-zns-changed-zone-list.html
index e4219c9..b12d5c1 100644
--- a/Documentation/nvme-zns-changed-zone-list.html
+++ b/Documentation/nvme-zns-changed-zone-list.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-changed-zone-list(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -832,7 +832,7 @@ Show the output in json format
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-close-zone.1 b/Documentation/nvme-zns-close-zone.1
index 52ca2d3..0796a23 100644
--- a/Documentation/nvme-zns-close-zone.1
+++ b/Documentation/nvme-zns-close-zone.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-close-zone
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-zns-close-zone.html
index adef16b..cd5fa50 100644
--- a/Documentation/nvme-zns-close-zone.html
+++ b/Documentation/nvme-zns-close-zone.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-close-zone(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -846,7 +846,7 @@ Close all zones on namespace 1:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-finish-zone.1 b/Documentation/nvme-zns-finish-zone.1
index c4ebf76..a738cbf 100644
--- a/Documentation/nvme-zns-finish-zone.1
+++ b/Documentation/nvme-zns-finish-zone.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-finish-zone
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-FINISH\-Z" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-FINISH\-Z" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-finish-zone.html b/Documentation/nvme-zns-finish-zone.html
index 0dd18ff..507199b 100644
--- a/Documentation/nvme-zns-finish-zone.html
+++ b/Documentation/nvme-zns-finish-zone.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-finish-zone(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -847,7 +847,7 @@ Finish all zones on namespace 1:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-id-ctrl.1 b/Documentation/nvme-zns-id-ctrl.1
index 75d17d6..4e1077f 100644
--- a/Documentation/nvme-zns-id-ctrl.1
+++ b/Documentation/nvme-zns-id-ctrl.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-id-ctrl
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ID\-CTRL" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-id-ctrl.html b/Documentation/nvme-zns-id-ctrl.html
index 4395bd0..755c3b0 100644
--- a/Documentation/nvme-zns-id-ctrl.html
+++ b/Documentation/nvme-zns-id-ctrl.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-id-ctrl(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -821,7 +821,7 @@ Show the output in json format
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-id-ns.1 b/Documentation/nvme-zns-id-ns.1
index c780325..3caf8d1 100644
--- a/Documentation/nvme-zns-id-ns.1
+++ b/Documentation/nvme-zns-id-ns.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-id-ns
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ID\-NS" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-id-ns.html b/Documentation/nvme-zns-id-ns.html
index 84220a2..c13878b 100644
--- a/Documentation/nvme-zns-id-ns.html
+++ b/Documentation/nvme-zns-id-ns.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-id-ns(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -846,7 +846,7 @@ Show the output in json format with extra details
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-offline-zone.1 b/Documentation/nvme-zns-offline-zone.1
index 80ca32a..a0fac52 100644
--- a/Documentation/nvme-zns-offline-zone.1
+++ b/Documentation/nvme-zns-offline-zone.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-offline-zone
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-OFFLINE\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-OFFLINE\-" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-offline-zone.html b/Documentation/nvme-zns-offline-zone.html
index f5367f5..5be0991 100644
--- a/Documentation/nvme-zns-offline-zone.html
+++ b/Documentation/nvme-zns-offline-zone.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-offline-zone(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -846,7 +846,7 @@ Offline all zones on namespace 1:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-open-zone.1 b/Documentation/nvme-zns-open-zone.1
index c0e8f50..13896ee 100644
--- a/Documentation/nvme-zns-open-zone.1
+++ b/Documentation/nvme-zns-open-zone.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-open-zone
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-OPEN\-ZON" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-OPEN\-ZON" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-open-zone.html b/Documentation/nvme-zns-open-zone.html
index d5aad26..bebe57b 100644
--- a/Documentation/nvme-zns-open-zone.html
+++ b/Documentation/nvme-zns-open-zone.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-open-zone(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -856,7 +856,7 @@ Open the first zone on namespace 1:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-report-zones.1 b/Documentation/nvme-zns-report-zones.1
index 1ae1eea..12c316d 100644
--- a/Documentation/nvme-zns-report-zones.1
+++ b/Documentation/nvme-zns-report-zones.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-report-zones
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-REPORT\-Z" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-REPORT\-Z" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-report-zones.html b/Documentation/nvme-zns-report-zones.html
index 652aa2f..84d89cc 100644
--- a/Documentation/nvme-zns-report-zones.html
+++ b/Documentation/nvme-zns-report-zones.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-report-zones(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -957,7 +957,7 @@ Show the output in json format with extra details
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-reset-zone.1 b/Documentation/nvme-zns-reset-zone.1
index 357486d..67e8c89 100644
--- a/Documentation/nvme-zns-reset-zone.1
+++ b/Documentation/nvme-zns-reset-zone.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-reset-zone
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-RESET\-ZO" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-RESET\-ZO" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-reset-zone.html b/Documentation/nvme-zns-reset-zone.html
index 2a21a7e..230c426 100644
--- a/Documentation/nvme-zns-reset-zone.html
+++ b/Documentation/nvme-zns-reset-zone.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-reset-zone(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -847,7 +847,7 @@ Reset the first zone on namespace 1:
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-set-zone-desc.1 b/Documentation/nvme-zns-set-zone-desc.1
index 58c2b1f..a8c4d3d 100644
--- a/Documentation/nvme-zns-set-zone-desc.1
+++ b/Documentation/nvme-zns-set-zone-desc.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-set-zone-desc
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-SET\-ZONE" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-SET\-ZONE" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-set-zone-desc.html b/Documentation/nvme-zns-set-zone-desc.html
index e79ecf9..b2bc3b5 100644
--- a/Documentation/nvme-zns-set-zone-desc.html
+++ b/Documentation/nvme-zns-set-zone-desc.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-set-zone-desc(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -859,7 +859,7 @@ Write "hello world" into the zone descriptor for namespace 1&#8217;s first zone
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-zone-append.1 b/Documentation/nvme-zns-zone-append.1
index abee69d..4d85b8e 100644
--- a/Documentation/nvme-zns-zone-append.1
+++ b/Documentation/nvme-zns-zone-append.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-zone-append
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-ZONE\-APP" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ZONE\-APP" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-zone-append.html b/Documentation/nvme-zns-zone-append.html
index b21ae62..117da03 100644
--- a/Documentation/nvme-zns-zone-append.html
+++ b/Documentation/nvme-zns-zone-append.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-zone-append(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -940,7 +940,7 @@ Append the data "hello world" into 4k worth of blocks into the zone starting
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-zone-mgmt-recv.1 b/Documentation/nvme-zns-zone-mgmt-recv.1
index 2713a1f..a60543c 100644
--- a/Documentation/nvme-zns-zone-mgmt-recv.1
+++ b/Documentation/nvme-zns-zone-mgmt-recv.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-zone-mgmt-recv
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-ZONE\-MGM" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ZONE\-MGM" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-zone-mgmt-recv.html b/Documentation/nvme-zns-zone-mgmt-recv.html
index ec99011..aa3c978 100644
--- a/Documentation/nvme-zns-zone-mgmt-recv.html
+++ b/Documentation/nvme-zns-zone-mgmt-recv.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-zone-mgmt-recv(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -880,7 +880,7 @@ Binary dump of a report all zones
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme-zns-zone-mgmt-send.1 b/Documentation/nvme-zns-zone-mgmt-send.1
index 25442eb..35c406c 100644
--- a/Documentation/nvme-zns-zone-mgmt-send.1
+++ b/Documentation/nvme-zns-zone-mgmt-send.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme-zns-zone-mgmt-send
 .\"    Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME\-ZNS\-ZONE\-MGM" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ZONE\-MGM" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-zone-mgmt-send.html b/Documentation/nvme-zns-zone-mgmt-send.html
index 4b531f0..ff6fdf5 100644
--- a/Documentation/nvme-zns-zone-mgmt-send.html
+++ b/Documentation/nvme-zns-zone-mgmt-send.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme-zns-zone-mgmt-send(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -914,7 +914,7 @@ Write "hello world" into the zone descriptor for namespace 1&#8217;s first zone
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Documentation/nvme.1 b/Documentation/nvme.1
index c6a07b8..61787c1 100644
--- a/Documentation/nvme.1
+++ b/Documentation/nvme.1
@@ -2,12 +2,12 @@
 .\"     Title: nvme
 .\"    Author: [see the "Authors" section]
 .\" Generator: DocBook XSL Stylesheets vsnapshot <http://docbook.sf.net/>
-.\"      Date: 10/31/2024
+.\"      Date: 03/17/2025
 .\"    Manual: NVMe Manual
 .\"    Source: NVMe
 .\"  Language: English
 .\"
-.TH "NVME" "1" "10/31/2024" "NVMe" "NVMe Manual"
+.TH "NVME" "1" "03/17/2025" "NVMe" "NVMe Manual"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -863,6 +863,61 @@ NVMe Inspur Device Vendor log page request
 .RS 4
 NVMe DapuStor Additional SMART log page
 .RE
+.PP
+\fBnvme-solidigm-id-ctrl\fR(1)
+.RS 4
+Solidigm \- NVMe Identify Controller
+.RE
+.PP
+\fBnvme-solidigm-smart-log-add\fR(1)
+.RS 4
+Retrieve Solidigm SMART Log
+.RE
+.PP
+\fBnvme-solidigm-vs-internal-log\fR(1)
+.RS 4
+Retrieve Debug log binaries
+.RE
+.PP
+\fBnvme-solidigm-garbage-collect-log\fR(1)
+.RS 4
+Retrieve Garbage Collection Log
+.RE
+.PP
+\fBnvme-solidigm-market-log\fR(1)
+.RS 4
+Retrieve Market Log
+.RE
+.PP
+\fBnvme-solidigm-latency-tracking-log\fR(1)
+.RS 4
+Enable/Retrieve Latency tracking Log
+.RE
+.PP
+\fBnvme-solidigm-parse-telemetry-log\fR(1)
+.RS 4
+Parse Telemetry Log binary
+.RE
+.PP
+\fBnvme-solidigm-log-page-directory\fR(1)
+.RS 4
+Retrieve log page directory
+.RE
+.PP
+\fBnvme-solidigm-temp-stats\fR(1)
+.RS 4
+Retrieve Temperature Statistics log
+.RE
+.PP
+\fBnvme-solidigm-vs-drive-info\fR(1)
+.RS 4
+Retrieve drive information
+.RE
+.PP
+\fBnvme-solidigm-workload-tracker\fR(1)
+.RS 4
+Real Time capture Workload Tracker samples
+.RE
 .SH "RETURNS"
 .sp
 All commands will behave the same, they will return 0 on success and 1 on failure\&.
diff --git a/Documentation/nvme.html b/Documentation/nvme.html
index 5c7b2f6..ef8ce66 100644
--- a/Documentation/nvme.html
+++ b/Documentation/nvme.html
@@ -4,7 +4,7 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
 <head>
 <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
-<meta name="generator" content="AsciiDoc 10.2.1" />
+<meta name="generator" content="AsciiDoc 10.2.0" />
 <title>nvme(1)</title>
 <style type="text/css">
 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -2087,6 +2087,94 @@ available, run "nvme help".</p></div>
         NVMe DapuStor Additional SMART log page
 </p>
 </dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-id-ctrl.html">nvme-solidigm-id-ctrl(1)</a>
+</dt>
+<dd>
+<p>
+        Solidigm - NVMe Identify Controller
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-smart-log-add.html">nvme-solidigm-smart-log-add(1)</a>
+</dt>
+<dd>
+<p>
+        Retrieve Solidigm SMART Log
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-vs-internal-log.html">nvme-solidigm-vs-internal-log(1)</a>
+</dt>
+<dd>
+<p>
+        Retrieve Debug log binaries
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-garbage-collect-log.html">nvme-solidigm-garbage-collect-log(1)</a>
+</dt>
+<dd>
+<p>
+        Retrieve Garbage Collection Log
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-market-log.html">nvme-solidigm-market-log(1)</a>
+</dt>
+<dd>
+<p>
+        Retrieve Market Log
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-latency-tracking-log.html">nvme-solidigm-latency-tracking-log(1)</a>
+</dt>
+<dd>
+<p>
+        Enable/Retrieve Latency tracking Log
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-parse-telemetry-log.html">nvme-solidigm-parse-telemetry-log(1)</a>
+</dt>
+<dd>
+<p>
+        Parse Telemetry Log binary
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-log-page-directory.html">nvme-solidigm-log-page-directory(1)</a>
+</dt>
+<dd>
+<p>
+        Retrieve log page directory
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-temp-stats.html">nvme-solidigm-temp-stats(1)</a>
+</dt>
+<dd>
+<p>
+        Retrieve Temperature Statistics log
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-vs-drive-info.html">nvme-solidigm-vs-drive-info(1)</a>
+</dt>
+<dd>
+<p>
+        Retrieve drive information
+</p>
+</dd>
+<dt class="hdlist1">
+<a href="nvme-solidigm-workload-tracker.html">nvme-solidigm-workload-tracker(1)</a>
+</dt>
+<dd>
+<p>
+        Real Time capture Workload Tracker samples
+</p>
+</dd>
 </dl></div>
 </div>
 </div>
@@ -2130,7 +2218,7 @@ NVM-Express Site</a>.</p></div>
 <div id="footer">
 <div id="footer-text">
 Last updated
- 2024-10-31 10:38:40 CET
+ 2025-03-17 10:39:49 CET
 </div>
 </div>
 </body>
diff --git a/Makefile b/Makefile
index 1838a0f..eb4283d 100644
--- a/Makefile
+++ b/Makefile
@@ -9,6 +9,10 @@ NAME          := nvme
 .DEFAULT_GOAL := ${NAME}
 BUILD-DIR     := .build
 
+.PHONY: update-subprojects
+update-subprojects:
+	meson subprojects update
+
 ${BUILD-DIR}:
 	meson setup $@
 	@echo "Configuration located in: $@"
@@ -28,19 +32,29 @@ endif
 purge:
 ifneq ("$(wildcard ${BUILD-DIR})","")
 	rm -rf ${BUILD-DIR}
+	meson subprojects purge --confirm
 endif
 
-.PHONY: install dist
-install dist: ${BUILD-DIR}
-	cd ${BUILD-DIR} && meson $@
+.PHONY: install
+install: ${NAME}
+	meson install -C ${BUILD-DIR} --skip-subprojects
 
 .PHONY: uninstall
 uninstall:
 	cd ${BUILD-DIR} && meson --internal uninstall
 
+.PHONY: dist
+dist: ${NAME}
+	meson dist -C ${BUILD-DIR} --formats gztar
+
 .PHONY: test
-test: ${BUILD-DIR}
-	ninja -C ${BUILD-DIR} $@
+test: ${NAME}
+	meson test -C ${BUILD-DIR}
+
+# Test strictly nvme-cli (do not run tests on all the subprojects)
+.PHONY: test-strict
+test-strict: ${NAME}
+	meson test -C ${BUILD-DIR} --suite nvme-cli
 
 .PHONY: rpm
 rpm:
diff --git a/completions/_nvme b/completions/_nvme
index f34b36b..157555b 100644
--- a/completions/_nvme
+++ b/completions/_nvme
@@ -89,6 +89,7 @@ _nvme () {
 	'lockdown:submit a lockdown command'
 	'media-unit-stat-log:retrieve media unit status log pages details'
 	'supported-cap-config-log:retrieve the list of Supported Capacity Configuration Descriptors'
+	'rotational-media-info-log:retrieve rotational media information log'
 	'discover:send Get Log Page request to Discovery Controller'
 	'connect-all:discover NVMeoF subsystems and connect to them'
 	'connect:connect to NVMeoF subsystem'
@@ -109,9 +110,18 @@ _nvme () {
 	'set-reg:write and show the defined NVMe controller register'
 	'io-mgmt-recv:send an I/O management receive command'
 	'io-mgmt-send:send an I/O management send command'
+	'mgmt-addr-list-log:retrieve management address list log'
+	'changed-ns-list-log:retrieve changed allocated namespaces log'
+	'dispersed-ns-participating-nss-log:retrieve dispersed namespace participating NVM subsystems log'
+	'reachability-groups-log:retrieve reachability groups log'
+	'reachability-associations-log:retrieve reachability associations log'
+	'host-discovery-log:retrieve host discovery log'
+	'ave-discovery-log:retrieve ave discovery log'
+	'pull-model-ddr-req-log:retrieve pull model ddr req log'
 	'version:show the program version'
 	'ocp:OCP cloud SSD extensions'
 	'solidigm:Solidigm plug-in extensions'
+	'fdp:FDP plug-in extensions'
 	'micron:Micron plug-in extensions'
 	'dapustor:DapuStor plug-in extensions'
 	'help:print brief descriptions of all nvme commands'
@@ -181,7 +191,7 @@ _nvme () {
 				local _internal_log
 				_internal_log=(
 				/dev/nvme':supply a device to use (required)'
-				--telemetry-type=':Telemetry Type; host or controller generated'
+				--telemetry-type=':Telemetry Type; host, host0, host1 or controller generated'
 				-t':alias for --telemetry-type'
 				--data-area=':Telemetry Data Area; 1 or 2'
 				-a':alias for --data-area'
@@ -366,7 +376,7 @@ _nvme () {
 				--comp-id=':component identifier'
 				-i':alias for --comp-id'
 				--list':list component descriptions'
-				-v':alias for --list'
+				-l':alias for --list'
 				--verbose':Increase the information detail in the output.'
 				-v':alias for --verbose'
 				--output-format=':Output format: normal|json|binary'
@@ -597,6 +607,28 @@ _nvme () {
 				;;
 			esac
 			;;
+		(fdp)
+			case ${words[2]} in
+			(feature)
+				local _feature
+				_feature=(
+				--endgrp-id=':Endurance group ID'
+				-e':alias for --endgrp-id'
+				--enable-conf-idx=':FDP configuration index to enable'
+				-c':alias for --enable-conf-idx'
+				--disable=':Disable current FDP configuration'
+				-d':alias for --disable'
+				--verbose=':Increase output verbosity'
+				-v':alias for --verbose'
+				)
+				_arguments '*:: :->subcmds'
+				_describe -t commands "nvme fdp feature options" _feature
+				;;
+			(*)
+				_files
+				;;
+			esac
+			;;
 		(dapustor)
 			case ${words[2]} in
 			(smart-log-add)
@@ -1455,6 +1487,8 @@ _nvme () {
 			-C':alias of --storage-tag-check'
 			--dir-spec=':directive specific'
 			-D':alias of --dir-spec'
+			--namespace-zeroes':If set, then the controller clear all logical blocks to zero in the entire namespace'
+			-Z':alias of --namespace-zeroes'
 			--timeout=':value for timeout'
 			-t':alias of --timeout'
 			)
@@ -2585,7 +2619,7 @@ _nvme () {
 			-t':alias of --timeout'
 			)
 			_arguments '*:: :->subcmds'
-			_describe -t commands "nvme set-reg options" _io_mgmt_recv
+			_describe -t commands "nvme io-mgmt-recv-reg options" _io_mgmt_recv
 			;;
 		(io-mgmt-send)
 			local _io_mgmt_send
@@ -2609,7 +2643,153 @@ _nvme () {
 			-t':alias of --timeout'
 			)
 			_arguments '*:: :->subcmds'
-			_describe -t commands "nvme set-reg options" _io_mgmt_send
+			_describe -t commands "nvme io-mgmt-send options" _io_mgmt_send
+			;;
+		(mgmt-addr-list-log)
+			local _mal_log
+			_mal_log=(
+			/dev/nvme':supply a device to use (required)'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--output-format=':Output format: normal|json|binary'
+			-o ':alias for --output-format'
+			--timeout=':value for timeout'
+			-t ':alias for --timeout'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme mgmt-addr-list-log" _mal_log
+			;;
+		(rotational-media-info-log)
+			local _rmi_log
+			_rmi_log=(
+			/dev/nvme':supply a device to use (required)'
+			--endg-id=':Endurance Group Identifier'
+			-e':alias of --endg-id'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--output-format=':Output format: normal|json|binary'
+			-o ':alias for --output-format'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme rotational-media-info-log" _rmi_log
+			;;
+		(changed-alloc-ns-list-log)
+			local _changed_alloc_ns_list_log
+			_changed_alloc_ns_list_log=(
+			/dev/nvme':supply a device to use (required)'
+			--output-format=':Output format: normal|json|binary'
+			-o':alias for --output-format'
+			--raw-binary':dump infos in binary format'
+			-b':alias of --raw-binary'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--timeout=':value for timeout'
+			-t ':alias for --timeout'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme changed-alloc-ns-list-log options" _changed_alloc_ns_list_log
+			;;
+		(dispersed-ns-participating-nss-log)
+			local _dns_psub_log
+			_dns_psub_log=(
+			/dev/nvme':supply a device to use (required)'
+			--namespace-id=':show infos for namespace <nsid>'
+			-n':alias of --namespace-id'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--output-format=':Output format: normal|json|binary'
+			-o ':alias for --output-format'
+			--timeout=':value for timeout'
+			-t ':alias for --timeout'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme dispersed-ns-participating-nss-log" _dns_psub_log
+			;;
+		(reachability-groups-log)
+			local _rg_log
+			_rg_log=(
+			/dev/nvme':supply a device to use (required)'
+			--groups-only':Return Groups Only'
+			-g':alias for --groups-only'
+			--rae':Retain an Asynchronous Event'
+			-r':alias for --rae'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--output-format=':Output format: normal|json|binary'
+			-o ':alias for --output-format'
+			--timeout=':value for timeout'
+			-t ':alias for --timeout'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme reachability-groups-log" _rg_log
+			;;
+		(reachability-associations-log)
+			local _ra_log
+			_ra_log=(
+			/dev/nvme':supply a device to use (required)'
+			--associations-only':Return Associations Only'
+			-a':alias for --associations-only'
+			--rae':Retain an Asynchronous Event'
+			-r':alias for --rae'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--output-format=':Output format: normal|json|binary'
+			-o ':alias for --output-format'
+			--timeout=':value for timeout'
+			-t ':alias for --timeout'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme reachability-associationsroups-log" _ra_log
+			;;
+		(host-discovery-log)
+			local _hd_log
+			_hd_log=(
+			/dev/nvme':supply a device to use (required)'
+			--all-host-entries':All Host Entries'
+			-a':alias for --all-host-entries'
+			--rae':Retain an Asynchronous Event'
+			-r':alias for --rae'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--output-format=':Output format: normal|json|binary'
+			-o ':alias for --output-format'
+			--timeout=':value for timeout'
+			-t ':alias for --timeout'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme host-discovery-log" _hd_log
+			;;
+		(ave-discovery-log)
+			local _ad_log
+			_ad_log=(
+			/dev/nvme':supply a device to use (required)'
+			--rae':Retain an Asynchronous Event'
+			-r':alias for --rae'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--output-format=':Output format: normal|json|binary'
+			-o ':alias for --output-format'
+			--timeout=':value for timeout'
+			-t ':alias for --timeout'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme ave-discovery-log" _ad_log
+			;;
+		(pull-model-ddr-req-log)
+			local _pmdr_log
+			_pmdr_log=(
+			/dev/nvme':supply a device to use (required)'
+			--rae':Retain an Asynchronous Event'
+			-r':alias for --rae'
+			--verbose':Increase the information detail in the output.'
+			-v':alias for --verbose'
+			--output-format=':Output format: normal|json|binary'
+			-o ':alias for --output-format'
+			--timeout=':value for timeout'
+			-t ':alias for --timeout'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme pull-model-ddr-req-log" _pmdr_log
 			;;
 		(version)
 			local _version
@@ -2667,6 +2847,16 @@ _nvme () {
 			_arguments '*:: :->subcmds'
 			_describe -t commands "nvme solidigm options" _solidigm
 			;;
+		(fdp)
+			local _fdp
+			_fdp=(
+			feature':Show, enable or disable FDP configuration'
+			version':Shows the plug-in version'
+			help':Display this help'
+			)
+			_arguments '*:: :->subcmds'
+			_describe -t commands "nvme fdp options" _fdp
+			;;
 		(micron)
 			local micron
 			_micron=(
@@ -2722,7 +2912,8 @@ _nvme () {
 			get-property write-zeroes write-uncor verify sanitize sanitize-log reset
 			subsystem-reset ns-rescan get-lba-status dsm discover connect-all connect
 			dim disconnect disconnect-all gen-hostnqn show-hostnqn tls-key dir-receive
-			dir-send virt-mgmt rpmb version ocp solidigm dapustor
+			dir-send virt-mgmt rpmb version ocp solidigm dapustor mgmt-addr-list-log
+			rotational-media-info-log changed-alloc-ns-list-log fdp
 			)
 			_arguments '*:: :->subcmds'
 			_describe -t commands "help: infos on a specific nvme command, or provide no option to see a synopsis of all nvme commands" _h
diff --git a/completions/bash-nvme-completion.sh b/completions/bash-nvme-completion.sh
index a6c6f42..6b870c9 100644
--- a/completions/bash-nvme-completion.sh
+++ b/completions/bash-nvme-completion.sh
@@ -340,7 +340,8 @@ nvme_list_opts () {
 			--force-unit-access -f --prinfo= -p --ref-tag= -r \
 			--app-tag-mask= -m --app-tag= -a \
 			--storage-tag= -S --storage-tag-check -C \
-			--dir-type= -T --dir-spec= -S --timeout= -t"
+			--dir-type= -T --dir-spec= -S --namespace-zeroes -Z \
+			--timeout= -t"
 			;;
 		"write-uncor")
 		opts+=" --namespace-id= -n --start-block= -s \
@@ -464,7 +465,7 @@ nvme_list_opts () {
 			--nmimt= -m --nmd0= -0 --nmd1= -1 --input-file= -i"
 			;;
 		"get-reg")
-		opts+=" --offset, -O --human-readable -H --cap --vs --cmbloc \
+		opts+=" --offset= -O --human-readable -H --cap --vs --cmbloc \
 			--cmbsz --bpinfo --cmbsts --cmbebs --cmbswtp --crto \
 			--pmrcap --pmrsts --pmrebs --pmrswtp --intms --intmc \
 			--cc --csts --nssr --aqa --asq --acq --bprsel --bpmbl \
@@ -472,10 +473,55 @@ nvme_list_opts () {
 			--output-format -o --verbose -v --timeout= -t"
 			;;
 		"set-reg")
-		opts+=" --offset, -O --value= -V --mmio32 -m --intms= --intmc= \
+		opts+=" --offset= -O --value= -V --mmio32 -m --intms= --intmc= \
 			--cc= --csts= --nssr= --aqa= --asq= --acq= --bprsel= \
 			--bpmbl= --cmbmsc= --nssd= --pmrctl= --pmrmscl= \
-			--pmrmscu= --output-format= -o --verbose= -v \
+			--pmrmscu= --output-format= -o --verbose -v \
+			--timeout= -t"
+			;;
+		"io-mgmt-recv")
+		opts+=" --namespace-id= -n --mos= -s --mo= -m --data= -d \
+			--data-len= -l --output-format= -o --verbose -v \
+			--timeout= -t"
+			;;
+		"io-mgmt-send")
+		opts+=" --namespace-id= -n --mos= -s --mo= -m --data= -d \
+			--data-len= -l --output-format= -o --verbose -v \
+			--timeout= -t"
+			;;
+		"mgmt-addr-list-log")
+		opts+=" --verbose -v --output-format= -o --timeout= -t"
+			;;
+		"rotational-media-info-log")
+		opts+=" --endg-id= -e --verbose -v --output-format= -o \
+			--timeout= -t"
+			;;
+		"changed-alloc-cns-list-log")
+		opts+=" --output-format= -o --raw-binary -b  --verbose -v \
+			--timeout= -t"
+			;;
+		"dispersed-ns-participating-nss-log")
+		opts+=" --namespace-id= -n --verbose -v --output-format= -o \
+			--timeout= -t"
+			;;
+		"reachability-groups-log")
+		opts+=" --groups-only -g --rae -r --verbose -v \
+			--output-format= -o --timeout= -t"
+			;;
+		"reachability-associations-log")
+		opts+=" --associations-only -a --rae -r --verbose -v \
+			--output-format= -o --timeout= -t"
+			;;
+		"host-discovery-log")
+		opts+=" --all-host-entries -a --rae -r --verbose -v \
+			--output-format= -o --timeout= -t"
+			;;
+		"ave-discovery-log")
+		opts+=" --rae -r --verbose -v --output-format= -o \
+			--timeout= -t"
+			;;
+		"pull--ddc-req-log")
+		opts+=" --rae -r --verbose -v --output-format= -o \
 			--timeout= -t"
 			;;
 		"version")
@@ -1202,6 +1248,41 @@ plugin_solidigm_opts () {
 	return 0
 }
 
+plugin_fdp_opts () {
+	local opts=""
+	local compargs=""
+
+	local nonopt_args=0
+	for (( i=0; i < ${#words[@]}-1; i++ )); do
+		if [[ ${words[i]} != -* ]]; then
+			let nonopt_args+=1
+		fi
+	done
+
+	if [ $nonopt_args -eq 3 ]; then
+		opts="/dev/nvme* "
+	fi
+
+	opts+=" "
+
+	case "$1" in
+		"feature")
+		opts+=" --endgrp-id= -e --enable-conf-idx= -c \
+		--disable -d --verbose -v"
+			;;
+		"version")
+		opts+=$NO_OPTS
+			;;
+		"help")
+		opts+=$NO_OPTS
+			;;
+	esac
+
+	COMPREPLY+=( $( compgen $compargs -W "$opts" -- $cur ) )
+
+	return 0
+}
+
 plugin_transcend_opts () {
 	local opts=""
 	local compargs=""
@@ -1597,6 +1678,7 @@ _nvme_subcmds () {
 			clear-fw-activate-history vs-fw-activate-history log-page-directory \
 			vs-drive-info cloud-SSDplugin-version market-log \
 			smart-log-add temp-stats workload-tracker version help"
+		[fdp]="feature version help"
 		[transcend]="healthvalue badblock"
 		[dapustor]="smart-log-add"
 		[zns]="id-ctrl id-ns zone-mgmt-recv \
@@ -1633,6 +1715,7 @@ _nvme_subcmds () {
 		[dera]="plugin_dera_opts"
 		[sfx]="plugin_sfx_opts"
 		[solidigm]="plugin_solidigm_opts"
+		[fdp]="plugin_fdp_opts"
 		[transcend]="plugin_transcend_opts"
 		[dapustor]="plugin_dapustor_opts"
 		[zns]="plugin_zns_opts"
@@ -1660,7 +1743,7 @@ _nvme_subcmds () {
 		security-send security-recv get-lba-status \
 		resv-acquire resv-register resv-release \
 		resv-report dsm copy flush compare read \
-		write write-zeros write-uncor verify \
+		write write-zeroes write-uncor verify \
 		sanitize sanitize-log reset subsystem-reset \
 		ns-rescan show-regs discover connect-all \
 		connect disconnect disconnect-all gen-hostnqn \
@@ -1668,7 +1751,11 @@ _nvme_subcmds () {
 		rpmb boot-part-log fid-support-effects-log \
 		supported-log-pages lockdown media-unit-stat-log \
 		supported-cap-config-log dim show-topology list-endgrp \
-		nvme-mi-recv nvme-mi-send get-reg set-reg"
+		nvme-mi-recv nvme-mi-send get-reg set-reg mgmt-addr-list-log \
+		rotational-media-info-log changed-alloc-ns-list-log \
+		io-mgmt-recv io-mgmt-send dispersed-ns-participating-nss-log \
+		reachability-groups-log reachability-associations-log \
+		host-discovery-log ave-discovery-log pull--ddc-req-log"
 
 	# Add plugins:
 	for plugin in "${!_plugin_subcmds[@]}"; do
diff --git a/fabrics.c b/fabrics.c
index eb90d98..ab17e17 100644
--- a/fabrics.c
+++ b/fabrics.c
@@ -681,6 +681,7 @@ static int nvme_read_config_checked(nvme_root_t r, const char *filename)
 	return 0;
 }
 
+/* returns negative errno values */
 int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
 {
 	char *subsysnqn = NVME_DISC_SUBSYS_NAME;
@@ -757,7 +758,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
 	if (ret < 0) {
 		fprintf(stderr, "Failed to scan topology: %s\n",
 			nvme_strerror(errno));
-		return ret;
+		return -errno;
 	}
 
 	ret = nvme_host_get_ids(r, hostnqn, hostid, &hnqn, &hid);
@@ -766,7 +767,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
 
 	h = nvme_lookup_host(r, hnqn, hid);
 	if (!h) {
-		ret = ENOMEM;
+		ret = -ENOMEM;
 		goto out_free;
 	}
 
@@ -781,10 +782,9 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
 
 	if (!device && !transport && !traddr) {
 		if (!nonbft)
-			discover_from_nbft(r, hostnqn, hostid,
-					   hnqn, hid, desc, connect,
-					   &cfg, nbft_path, flags, verbose);
-
+			ret = discover_from_nbft(r, hostnqn, hostid,
+						  hnqn, hid, desc, connect,
+						  &cfg, nbft_path, flags, verbose);
 		if (nbft)
 			goto out_free;
 
@@ -876,7 +876,7 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
 				fprintf(stderr,
 					"failed to add controller, error %s\n",
 					nvme_strerror(errno));
-			ret = errno;
+			ret = -errno;
 			goto out_free;
 		}
 	}
@@ -1189,6 +1189,11 @@ int nvmf_disconnect(const char *desc, int argc, char **argv)
 	if (ret)
 		return ret;
 
+	if (cfg.nqn && cfg.device) {
+		fprintf(stderr,
+			"Both device name [--device | -d] and NQN [--nqn | -n] are specified\n");
+		return -EINVAL;
+	}
 	if (!cfg.nqn && !cfg.device) {
 		fprintf(stderr,
 			"Neither device name [--device | -d] nor NQN [--nqn | -n] provided\n");
@@ -1430,7 +1435,7 @@ int nvmf_config(const char *desc, int argc, char **argv)
 	return 0;
 }
 
-static void dim_operation(nvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name)
+static int dim_operation(nvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name)
 {
 	static const char * const task[] = {
 		[NVMF_DIM_TAS_REGISTER]   = "register",
@@ -1451,6 +1456,8 @@ static void dim_operation(nvme_ctrl_t c, enum nvmf_dim_tas tas, const char *name
 		fprintf(stderr, "%s DIM %s command error. Result:0x%04x, Status:0x%04x - %s\n",
 			name, t, result, status, nvme_status_to_string(status, false));
 	}
+
+	return nvme_status_to_errno(status, true);
 }
 
 int nvmf_dim(const char *desc, int argc, char **argv)
@@ -1530,9 +1537,8 @@ int nvmf_dim(const char *desc, int argc, char **argv)
 				nvme_for_each_subsystem(h, s) {
 					if (strcmp(nvme_subsystem_get_nqn(s), p))
 						continue;
-					nvme_subsystem_for_each_ctrl(s, c) {
-						dim_operation(c, tas, p);
-					}
+					nvme_subsystem_for_each_ctrl(s, c)
+						ret = dim_operation(c, tas, p);
 				}
 			}
 		}
@@ -1551,9 +1557,9 @@ int nvmf_dim(const char *desc, int argc, char **argv)
 					p, nvme_strerror(errno));
 				return -errno;
 			}
-			dim_operation(c, tas, p);
+			ret = dim_operation(c, tas, p);
 		}
 	}
 
-	return 0;
+	return ret;
 }
diff --git a/meson.build b/meson.build
index 0a9f690..b72368a 100644
--- a/meson.build
+++ b/meson.build
@@ -4,7 +4,7 @@ project(
     'nvme-cli', ['c'],
     meson_version: '>= 0.50.0',
     license: 'GPL-2.0-only',
-    version: '2.11',
+    version: '2.12',
     default_options: [
       'c_std=gnu99',
       'buildtype=debugoptimized',
@@ -48,7 +48,7 @@ conf.set('SYSCONFDIR', '"@0@"'.format(sysconfdir))
 conf.set('RUNDIR', '"@0@"'.format(rundir))
 
 # Check for libnvme availability
-libnvme_dep = dependency('libnvme', version: '>=1.11', required: true,
+libnvme_dep = dependency('libnvme', version: '>=1.12', required: true,
                          fallback : ['libnvme', 'libnvme_dep'])
 libnvme_mi_dep = dependency('libnvme-mi', required: true,
                          fallback : ['libnvme', 'libnvme_mi_dep'])
diff --git a/nbft.c b/nbft.c
index f93b4a5..5c85245 100644
--- a/nbft.c
+++ b/nbft.c
@@ -282,6 +282,7 @@ static int do_discover(struct nbft_info_discovery *dd,
 	return 0;
 }
 
+/* returns negative errno values */
 int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
 		       char *hostnqn_sys, char *hostid_sys,
 		       const char *desc, bool connect,
@@ -290,7 +291,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
 {
 	char *hostnqn = NULL, *hostid = NULL, *host_traddr = NULL;
 	nvme_host_t h;
-	int ret, i;
+	int ret, rr, i;
 	struct list_head nbft_list;
 	struct nbft_file_entry *entry = NULL;
 	struct nbft_info_subsystem_ns **ss;
@@ -298,7 +299,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
 	struct nbft_info_discovery **dd;
 
 	if (!connect)
-		/* to do: print discovery-type info from NBFT tables */
+		/* TODO: print discovery-type info from NBFT tables */
 		return 0;
 
 	list_head_init(&nbft_list);
@@ -306,6 +307,8 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
 	if (ret) {
 		if (ret != -ENOENT)
 			nvme_show_perror("Failed to access ACPI tables directory");
+		else
+			ret = 0;  /* nothing to connect */
 		goto out_free;
 	}
 
@@ -327,8 +330,10 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
 		}
 
 		h = nvme_lookup_host(r, hostnqn, hostid);
-		if (!h)
+		if (!h) {
+			ret = -ENOENT;
 			goto out_free;
+		}
 
 		/* Subsystem Namespace Descriptor List */
 		for (ss = entry->nbft->subsystem_ns_list; ss && *ss; ss++)
@@ -358,34 +363,37 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
 					.trsvcid	= (*ss)->trsvcid,
 				};
 
-				ret = do_connect(r, h, NULL, *ss, &trcfg,
-						 cfg, flags, verbose);
+				rr = do_connect(r, h, NULL, *ss, &trcfg,
+						cfg, flags, verbose);
 
 				/*
 				 * With TCP/DHCP, it can happen that the OS
 				 * obtains a different local IP address than the
 				 * firmware had. Retry without host_traddr.
 				 */
-				if (ret == -ENVME_CONNECT_ADDRNOTAVAIL &&
+				if (rr == -ENVME_CONNECT_ADDRNOTAVAIL &&
 				    !strcmp(trcfg.transport, "tcp") &&
 				    strlen(hfi->tcp_info.dhcp_server_ipaddr) > 0) {
 					trcfg.host_traddr = NULL;
 
-					ret = do_connect(r, h, NULL, *ss, &trcfg,
-							 cfg, flags, verbose);
+					rr = do_connect(r, h, NULL, *ss, &trcfg,
+							cfg, flags, verbose);
 
-					if (ret == 0 && verbose >= 1)
+					if (rr == 0 && verbose >= 1)
 						fprintf(stderr,
 							"SSNS %d: connect with host_traddr=\"%s\" failed, success after omitting host_traddr\n",
 							(*ss)->index,
 							host_traddr);
 				}
 
-				if (ret)
+				if (rr) {
 					fprintf(stderr, "SSNS %d: no controller found\n",
 						(*ss)->index);
+					/* report an error */
+					ret = rr;
+				}
 
-				if (ret == -ENOMEM)
+				if (rr == -ENOMEM)
 					goto out_free;
 			}
 
@@ -423,7 +431,7 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
 				host_traddr = hfi->tcp_info.ipaddr;
 			if (uri->port > 0) {
 				if (asprintf(&trsvcid, "%d", uri->port) < 0) {
-					errno = ENOMEM;
+					ret = -ENOMEM;
 					goto out_free;
 				}
 			} else
@@ -458,21 +466,25 @@ int discover_from_nbft(nvme_root_t r, char *hostnqn_arg, char *hostid_arg,
 					"Discovery Descriptor %d: failed to add discovery controller: %s\n",
 					(*dd)->index,
 					nvme_strerror(errno));
-				if (errno == ENOMEM)
+				if (errno == ENOMEM) {
+					ret = -ENOMEM;
 					goto out_free;
+				}
 				continue;
 			}
 
-			ret = do_discover(*dd, r, h, c, cfg, &trcfg,
-					  flags, verbose);
+			rr = do_discover(*dd, r, h, c, cfg, &trcfg,
+					 flags, verbose);
 			if (!persistent)
 				nvme_disconnect_ctrl(c);
 			nvme_free_ctrl(c);
-			if (ret == -ENOMEM)
+			if (rr == -ENOMEM) {
+				ret = rr;
 				goto out_free;
+			}
 		}
 	}
 out_free:
 	free_nbfts(&nbft_list);
-	return errno;
+	return ret;
 }
diff --git a/nvme-builtin.h b/nvme-builtin.h
index 00e361c..684f3fd 100644
--- a/nvme-builtin.h
+++ b/nvme-builtin.h
@@ -36,7 +36,7 @@ COMMAND_LIST(
 	ENTRY("get-log", "Generic NVMe get log, returns log in raw format", get_log)
 	ENTRY("telemetry-log", "Retrieve FW Telemetry log write to file", get_telemetry_log)
 	ENTRY("fw-log", "Retrieve FW Log, show it", get_fw_log)
-	ENTRY("changed-ns-list-log", "Retrieve Changed Namespace List, show it", get_changed_ns_list_log)
+	ENTRY("changed-ns-list-log", "Retrieve Changed Attached Namespace List, show it", get_changed_attach_ns_list_log)
 	ENTRY("smart-log", "Retrieve SMART Log, show it", get_smart_log)
 	ENTRY("ana-log", "Retrieve ANA Log, show it", get_ana_log)
 	ENTRY("error-log", "Retrieve Error Log, show it", get_error_log)
@@ -58,6 +58,15 @@ COMMAND_LIST(
 	ENTRY("mi-cmd-support-effects-log", "Retrieve MI Command Support and Effects log and show it", get_mi_cmd_support_effects_log)
 	ENTRY("media-unit-stat-log", "Retrieve the configuration and wear of media units, show it", get_media_unit_stat_log)
 	ENTRY("supported-cap-config-log", "Retrieve the list of Supported Capacity Configuration Descriptors", get_supp_cap_config_log)
+	ENTRY("mgmt-addr-list-log", "Retrieve Management Address List Log, show it", get_mgmt_addr_list_log)
+	ENTRY("rotational-media-info-log", "Retrieve Rotational Media Information Log, show it", get_rotational_media_info_log)
+	ENTRY("changed-alloc-ns-list-log", "Retrieve Changed Allocated Namespace List, show it", get_changed_alloc_ns_list_log)
+	ENTRY("dispersed-ns-participating-nss-log", "Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it", get_dispersed_ns_participating_nss_log)
+	ENTRY("reachability-groups-log", "Retrieve Reachability Groups Log, show it", get_reachability_groups_log)
+	ENTRY("reachability-associations-log", "Retrieve Reachability Associations Log, show it", get_reachability_associations_log)
+	ENTRY("host-discovery-log", "Retrieve Host Discovery Log, show it", get_host_discovery_log)
+	ENTRY("ave-discovery-log", "Retrieve AVE Discovery Log, show it", get_ave_discovery_log)
+	ENTRY("pull-model-ddc-req-log", "Retrieve Pull Model DDC Request Log, show it", get_pull_model_ddc_req_log)
 	ENTRY("set-feature", "Set a feature and show the resulting value", set_feature)
 	ENTRY("set-property", "Set a property and show the resulting value", set_property)
 	ENTRY("get-property", "Get a property and show the resulting value", get_property)
diff --git a/nvme-print-binary.c b/nvme-print-binary.c
index 33804f1..17dfb85 100644
--- a/nvme-print-binary.c
+++ b/nvme-print-binary.c
@@ -1,6 +1,8 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 
 #include "nvme-print.h"
+#include "util/logging.h"
+#include "common.h"
 
 static struct print_ops binary_print_ops;
 
@@ -63,14 +65,12 @@ static void binary_boot_part_log(void *bp_log, const char *devname,
 	d_raw((unsigned char *)bp_log, size);
 }
 
-static void binary_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log,
-	__u16 controller)
+static void binary_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controller)
 {
-	size_t len;
+	size_t len = le16_to_cpu(log->hsize);
+
 	if (log->eomip == NVME_PHY_RX_EOM_COMPLETED)
-		len = log->hsize + log->dsize * log->nd;
-	else
-		len = log->hsize;
+		len += (size_t)le32_to_cpu(log->dsize) * le16_to_cpu(log->nd);
 
 	d_raw((unsigned char *)log, len);
 }
@@ -233,8 +233,7 @@ static void binary_fw_log(struct nvme_firmware_slot *fw_log,
 	d_raw((unsigned char *)fw_log, sizeof(*fw_log));
 }
 
-static void binary_changed_ns_list_log(struct nvme_ns_list *log,
-				   const char *devname)
+static void binary_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc)
 {
 	d_raw((unsigned char *)log, sizeof(*log));
 }
@@ -307,6 +306,47 @@ static void binary_effects_log_pages(struct list_head *list)
 	}
 }
 
+static void binary_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list)
+{
+	d_raw((unsigned char *)ma_list, sizeof(*ma_list));
+}
+
+static void binary_rotational_media_info_log(struct nvme_rotational_media_info_log *info)
+{
+	d_raw((unsigned char *)info, sizeof(*info));
+}
+
+static void binary_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log)
+{
+	d_raw((unsigned char *)log, sizeof(*log) + le64_to_cpu(log->numpsub) * NVME_NQN_LENGTH);
+}
+
+static void binary_reachability_groups_log(struct nvme_reachability_groups_log *log, __u64 len)
+{
+	d_raw((unsigned char *)log, len);
+}
+
+static void binary_reachability_associations_log(struct nvme_reachability_associations_log *log,
+						 __u64 len)
+{
+	d_raw((unsigned char *)log, len);
+}
+
+static void binary_host_discovery_log(struct nvme_host_discover_log *log)
+{
+	d_raw((unsigned char *)log, le32_to_cpu(log->thdlpl));
+}
+
+static void binary_ave_discovery_log(struct nvme_ave_discover_log *log)
+{
+	d_raw((unsigned char *)log, le32_to_cpu(log->tadlpl));
+}
+
+static void binary_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log)
+{
+	d_raw((unsigned char *)log, le32_to_cpu(log->tpdrpl));
+}
+
 static struct print_ops binary_print_ops = {
 	/* libnvme types.h print functions */
 	.ana_log			= binary_ana_log,
@@ -373,6 +413,14 @@ static struct print_ops binary_print_ops = {
 	.d				= NULL,
 	.show_init			= NULL,
 	.show_finish			= NULL,
+	.mgmt_addr_list_log		= binary_mgmt_addr_list_log,
+	.rotational_media_info_log	= binary_rotational_media_info_log,
+	.dispersed_ns_psub_log		= binary_dispersed_ns_psub_log,
+	.reachability_groups_log	= binary_reachability_groups_log,
+	.reachability_associations_log	= binary_reachability_associations_log,
+	.host_discovery_log		= binary_host_discovery_log,
+	.ave_discovery_log		= binary_ave_discovery_log,
+	.pull_model_ddc_req_log		= binary_pull_model_ddc_req_log,
 
 	/* libnvme tree print functions */
 	.list_item			= NULL,
diff --git a/nvme-print-json.c b/nvme-print-json.c
index 412eb20..4ac2414 100644
--- a/nvme-print-json.c
+++ b/nvme-print-json.c
@@ -3,10 +3,15 @@
 #include <assert.h>
 #include <errno.h>
 #include <time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <ccan/ccan/compiler/compiler.h>
 
 #include "nvme-print.h"
 
 #include "util/json.h"
+#include "util/logging.h"
 #include "nvme.h"
 #include "common.h"
 
@@ -28,6 +33,13 @@
 #define obj_add_uint json_object_add_value_uint
 #define obj_add_uint128 json_object_add_value_uint128
 #define obj_add_uint64 json_object_add_value_uint64
+#define obj_add_str json_object_add_value_string
+#define obj_add_uint_02x json_object_add_uint_02x
+#define obj_add_uint_0x json_object_add_uint_0x
+#define obj_add_byte_array json_object_add_byte_array
+#define obj_add_nprix64 json_object_add_nprix64
+#define obj_add_uint_0nx json_object_add_uint_0nx
+#define obj_add_0nprix64 json_object_add_0nprix64
 
 static const uint8_t zero_uuid[16] = { 0 };
 static struct print_ops json_print_ops;
@@ -74,27 +86,6 @@ static void obj_add_uint_x(struct json_object *o, const char *k, __u32 v)
 	obj_add_str(o, k, str);
 }
 
-void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v)
-{
-	char str[STR_LEN];
-
-	sprintf(str, "0x%x", v);
-	obj_add_str(o, k, str);
-}
-
-void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width)
-{
-	char str[STR_LEN];
-
-	sprintf(str, "0x%0*x", width, v);
-	obj_add_str(o, k, str);
-}
-
-void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v)
-{
-	obj_add_uint_0nx(o, k, v, 2);
-}
-
 static void obj_add_uint_nx(struct json_object *o, const char *k, __u32 v)
 {
 	char str[STR_LEN];
@@ -103,14 +94,6 @@ static void obj_add_uint_nx(struct json_object *o, const char *k, __u32 v)
 	obj_add_str(o, k, str);
 }
 
-void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v)
-{
-	char str[STR_LEN];
-
-	sprintf(str, "%#"PRIx64"", v);
-	obj_add_str(o, k, str);
-}
-
 static void obj_add_prix64(struct json_object *o, const char *k, uint64_t v)
 {
 	char str[STR_LEN];
@@ -203,9 +186,27 @@ static void obj_print(struct json_object *o)
 		json_print(o);
 }
 
+static void json_id_iocs_iocsc(struct json_object *obj_iocsc, __u64 iocsc)
+{
+	__u8 cpncs = NVME_GET(iocsc, IOCS_IOCSC_CPNCS);
+	__u8 slmcs = NVME_GET(iocsc, IOCS_IOCSC_SLMCS);
+	__u8 znscs = NVME_GET(iocsc, IOCS_IOCSC_ZNSCS);
+	__u8 kvcs = NVME_GET(iocsc, IOCS_IOCSC_KVCS);
+	__u8 nvmcs = NVME_GET(iocsc, IOCS_IOCSC_NVMCS);
+
+	obj_add_str(obj_iocsc, "Computational Programs Namespace Command Set", cpncs ?
+		    "Selected" : "Not selected");
+	obj_add_str(obj_iocsc, "Subsystem Local Memory Command Set", slmcs ?
+		    "Selected" : "Not selected");
+	obj_add_str(obj_iocsc, "Zoned Namespace Command Set", znscs ? "Selected" : "Not selected");
+	obj_add_str(obj_iocsc, "Key Value Command Set", kvcs ? "Selected" : "Not selected");
+	obj_add_str(obj_iocsc, "NVM Command Set", nvmcs ? "Selected" : "Not selected");
+}
+
 static void json_id_iocs(struct nvme_id_iocs *iocs)
 {
 	struct json_object *r = json_create_object();
+	struct json_object *obj_iocsc;
 	char json_str[STR_LEN];
 	__u16 i;
 
@@ -213,6 +214,11 @@ static void json_id_iocs(struct nvme_id_iocs *iocs)
 		if (iocs->iocsc[i]) {
 			sprintf(json_str, "I/O Command Set Combination[%u]", i);
 			obj_add_uint64(r, json_str, le64_to_cpu(iocs->iocsc[i]));
+
+			obj_iocsc = json_create_object();
+			sprintf(json_str, "IOCSC%u", i);
+			json_id_iocs_iocsc(obj_iocsc, le64_to_cpu(iocs->iocsc[i]));
+			obj_add_obj(r, json_str, obj_iocsc);
 		}
 	}
 
@@ -260,8 +266,6 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
 		obj_add_int(r, "nabspf", le16_to_cpu(ns->nabspf));
 		obj_add_int(r, "noiob", le16_to_cpu(ns->noiob));
 		obj_add_uint128(r, "nvmcap", nvmcap);
-		obj_add_int(r, "nsattr", ns->nsattr);
-		obj_add_int(r, "nvmsetid", le16_to_cpu(ns->nvmsetid));
 
 		if (ns->nsfeat & 0x30) {
 			obj_add_int(r, "npwg", le16_to_cpu(ns->npwg));
@@ -275,12 +279,16 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
 		obj_add_int(r, "mssrl", le16_to_cpu(ns->mssrl));
 		obj_add_uint(r, "mcl", le32_to_cpu(ns->mcl));
 		obj_add_int(r, "msrc", ns->msrc);
+		obj_add_uint(r, "kpios", ns->kpios);
 	}
 
 	obj_add_int(r, "nulbaf", ns->nulbaf);
 
 	if (!cap_only) {
+		obj_add_uint(r, "kpiodaag", le32_to_cpu(ns->kpiodaag));
 		obj_add_uint(r, "anagrpid", le32_to_cpu(ns->anagrpid));
+		obj_add_int(r, "nsattr", ns->nsattr);
+		obj_add_int(r, "nvmsetid", le16_to_cpu(ns->nvmsetid));
 		obj_add_int(r, "endgid", le16_to_cpu(ns->endgid));
 
 		memset(eui64, 0, sizeof(eui64_buf));
@@ -293,8 +301,8 @@ static void json_nvme_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
 		for (i = 0; i < sizeof(ns->nguid); i++)
 			nguid += sprintf(nguid, "%02x", ns->nguid[i]);
 
-		obj_add_str(r, "eui64", eui64_buf);
 		obj_add_str(r, "nguid", nguid_buf);
+		obj_add_str(r, "eui64", eui64_buf);
 	}
 
 	obj_add_array(r, "lbafs", lbafs);
@@ -350,11 +358,15 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
 	obj_add_uint(r, "oaes", le32_to_cpu(ctrl->oaes));
 	obj_add_uint(r, "ctratt", le32_to_cpu(ctrl->ctratt));
 	obj_add_int(r, "rrls", le16_to_cpu(ctrl->rrls));
+	obj_add_int(r, "bpcap", ctrl->bpcap);
+	obj_add_uint(r, "nssl", le32_to_cpu(ctrl->nssl));
+	obj_add_int(r, "plsi", ctrl->plsi);
 	obj_add_int(r, "cntrltype", ctrl->cntrltype);
 	obj_add_str(r, "fguid", util_uuid_to_string(ctrl->fguid));
 	obj_add_int(r, "crdt1", le16_to_cpu(ctrl->crdt1));
 	obj_add_int(r, "crdt2", le16_to_cpu(ctrl->crdt2));
 	obj_add_int(r, "crdt3", le16_to_cpu(ctrl->crdt3));
+	obj_add_int(r, "crcap", ctrl->crcap);
 	obj_add_int(r, "nvmsr", ctrl->nvmsr);
 	obj_add_int(r, "vwci", ctrl->vwci);
 	obj_add_int(r, "mec", ctrl->mec);
@@ -393,8 +405,11 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
 	obj_add_uint(r, "nanagrpid", le32_to_cpu(ctrl->nanagrpid));
 	obj_add_uint(r, "pels", le32_to_cpu(ctrl->pels));
 	obj_add_int(r, "domainid", le16_to_cpu(ctrl->domainid));
+	obj_add_int(r, "kpioc", ctrl->kpioc);
+	obj_add_int(r, "mptfawr", le16_to_cpu(ctrl->mptfawr));
 	obj_add_uint128(r, "megcap", megcap);
 	obj_add_int(r, "tmpthha", ctrl->tmpthha);
+	obj_add_int(r, "cqt", le16_to_cpu(ctrl->cqt));
 	obj_add_int(r, "sqes", ctrl->sqes);
 	obj_add_int(r, "cqes", ctrl->cqes);
 	obj_add_int(r, "maxcmd", le16_to_cpu(ctrl->maxcmd));
@@ -414,6 +429,18 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
 	obj_add_uint128(r, "maxdna", maxdna);
 	obj_add_uint(r, "maxcna", le32_to_cpu(ctrl->maxcna));
 	obj_add_uint(r, "oaqd", le32_to_cpu(ctrl->oaqd));
+	obj_add_int(r, "rhiri", ctrl->rhiri);
+	obj_add_int(r, "hirt", ctrl->hirt);
+	obj_add_int(r, "cmmrtd", le16_to_cpu(ctrl->cmmrtd));
+	obj_add_int(r, "nmmrtd", le16_to_cpu(ctrl->nmmrtd));
+	obj_add_int(r, "minmrtg", ctrl->minmrtg);
+	obj_add_int(r, "maxmrtg", ctrl->maxmrtg);
+	obj_add_int(r, "trattr", ctrl->trattr);
+	obj_add_int(r, "mcudmq", le16_to_cpu(ctrl->mcudmq));
+	obj_add_int(r, "mnsudmq", le16_to_cpu(ctrl->mnsudmq));
+	obj_add_int(r, "mcmr", le16_to_cpu(ctrl->mcmr));
+	obj_add_int(r, "nmcmr", le16_to_cpu(ctrl->nmcmr));
+	obj_add_int(r, "mcdqpc", le16_to_cpu(ctrl->mcdqpc));
 
 	if (strlen(subnqn))
 		obj_add_str(r, "subnqn", subnqn);
@@ -431,8 +458,9 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
 		struct json_object *psd = json_create_object();
 
 		obj_add_int(psd, "max_power", le16_to_cpu(ctrl->psd[i].mp));
-		obj_add_int(psd, "max_power_scale", ctrl->psd[i].flags & 0x1);
-		obj_add_int(psd, "non-operational_state", (ctrl->psd[i].flags & 2) >> 1);
+		obj_add_int(psd, "max_power_scale", ctrl->psd[i].flags & NVME_PSD_FLAGS_MXPS);
+		obj_add_int(psd, "non-operational_state",
+			    !!(ctrl->psd[i].flags & NVME_PSD_FLAGS_NOPS));
 		obj_add_uint(psd, "entry_lat", le32_to_cpu(ctrl->psd[i].enlat));
 		obj_add_uint(psd, "exit_lat", le32_to_cpu(ctrl->psd[i].exlat));
 		obj_add_int(psd, "read_tput", ctrl->psd[i].rrt);
@@ -444,6 +472,12 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
 		obj_add_int(psd, "active_power", le16_to_cpu(ctrl->psd[i].actp));
 		obj_add_int(psd, "active_power_work", ctrl->psd[i].apws & 7);
 		obj_add_int(psd, "active_scale", nvme_psd_power_scale(ctrl->psd[i].apws));
+		obj_add_int(psd, "emerg_power_fail_recover_time", ctrl->psd[i].epfrt);
+		obj_add_int(psd, "emerg_power_fail_recover_scale", ctrl->psd[i].epfr_fqv_ts & 0xf);
+		obj_add_int(psd, "force_quiesce_vault_time", ctrl->psd[i].fqvt);
+		obj_add_int(psd, "force_quiesce_vault_scale", ctrl->psd[i].epfr_fqv_ts >> 4);
+		obj_add_int(psd, "emerg_power_fail_vault_time", ctrl->psd[i].epfvt);
+		obj_add_int(psd, "emerg_power_fail_vault_scale", ctrl->psd[i].epfvts & 0xf);
 
 		array_add_obj(psds, psd);
 	}
@@ -577,8 +611,7 @@ void json_fw_log(struct nvme_firmware_slot *fw_log, const char *devname)
 	json_print(r);
 }
 
-void json_changed_ns_list_log(struct nvme_ns_list *log,
-			      const char *devname)
+void json_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc)
 {
 	struct json_object *r = json_create_object();
 	struct json_object *nsi = json_create_object();
@@ -587,10 +620,13 @@ void json_changed_ns_list_log(struct nvme_ns_list *log,
 	__u32 nsid;
 	int i;
 
+	_cleanup_free_ char *k = NULL;
+
 	if (log->ns[0] == cpu_to_le32(0xffffffff))
 		return;
 
-	obj_add_str(r, "Changed Namespace List Log", devname);
+	if (asprintf(&k, "Changed %s Namespace List Log", alloc ? "Allocated" : "Attached") > 0)
+		obj_add_str(r, k, devname);
 
 	for (i = 0; i < NVME_ID_NS_LIST_MAX; i++) {
 		nsid = le32_to_cpu(log->ns[i]);
@@ -1137,42 +1173,43 @@ static void json_registers_bpinfo(uint32_t bpinfo, struct json_object *r)
 {
 	obj_add_uint_x(r, "bpinfo", bpinfo);
 
-	obj_add_uint(r, "Active Boot Partition ID (ABPID)", (bpinfo & 0x80000000) >> 31);
-	json_registers_bpinfo_brs((bpinfo & 0x3000000) >> 24, r);
-	obj_add_uint(r, "Boot Partition Size (BPSZ)", bpinfo & 0x7fff);
+	obj_add_uint(r, "Active Boot Partition ID (ABPID)", NVME_BPINFO_ABPID(bpinfo));
+	json_registers_bpinfo_brs(NVME_BPINFO_BRS(bpinfo), r);
+	obj_add_uint(r, "Boot Partition Size (BPSZ)", NVME_BPINFO_BPSZ(bpinfo));
 }
 
 static void json_registers_bprsel(uint32_t bprsel, struct json_object *r)
 {
 	obj_add_uint_x(r, "bprsel", bprsel);
 
-	obj_add_uint(r, "Boot Partition Identifier (BPID)", (bprsel & 0x80000000) >> 31);
-	obj_add_uint_x(r, "Boot Partition Read Offset (BPROF)", (bprsel & 0x3ffffc00) >> 10);
-	obj_add_uint_x(r, "Boot Partition Read Size (BPRSZ)", bprsel & 0x3ff);
+	obj_add_uint(r, "Boot Partition Identifier (BPID)", NVME_BPRSEL_BPID(bprsel));
+	obj_add_uint_x(r, "Boot Partition Read Offset (BPROF)", NVME_BPRSEL_BPROF(bprsel));
+	obj_add_uint_x(r, "Boot Partition Read Size (BPRSZ)", NVME_BPRSEL_BPRSZ(bprsel));
 }
 
 static void json_registers_bpmbl(uint64_t bpmbl, struct json_object *r)
 {
 	obj_add_prix64(r, "bpmbl", bpmbl);
 
-	obj_add_prix64(r, "Boot Partition Memory Buffer Base Address (BMBBA)", bpmbl);
+	obj_add_prix64(r, "Boot Partition Memory Buffer Base Address (BMBBA)",
+		       (uint64_t)NVME_BPMBL_BMBBA(bpmbl));
 }
 
 static void json_registers_cmbmsc(uint64_t cmbmsc, struct json_object *r)
 {
 	obj_add_prix64(r, "cmbmsc", cmbmsc);
 
-	obj_add_prix64(r, "Controller Base Address (CBA)", (cmbmsc & 0xfffffffffffff000) >> 12);
-	obj_add_prix64(r, "Controller Memory Space Enable (CMSE)", (cmbmsc & 2) >> 1);
+	obj_add_prix64(r, "Controller Base Address (CBA)", (uint64_t)NVME_CMBMSC_CBA(cmbmsc));
+	obj_add_prix64(r, "Controller Memory Space Enable (CMSE)", NVME_CMBMSC_CMSE(cmbmsc));
 	obj_add_str(r, "Capabilities Registers Enabled (CRE)",
-		     cmbmsc & 1 ? "Enabled" : "Not enabled");
+		    NVME_CMBMSC_CRE(cmbmsc) ? "Enabled" : "Not enabled");
 }
 
 static void json_registers_cmbsts(uint32_t cmbsts, struct json_object *r)
 {
 	obj_add_uint_x(r, "cmbsts", cmbsts);
 
-	obj_add_uint_x(r, "Controller Base Address Invalid (CBAI)", cmbsts & 1);
+	obj_add_uint_x(r, "Controller Base Address Invalid (CBAI)", NVME_CMBSTS_CBAI(cmbsts));
 }
 
 static void json_registers_cmbebs(uint32_t cmbebs, struct json_object *r)
@@ -1181,11 +1218,11 @@ static void json_registers_cmbebs(uint32_t cmbebs, struct json_object *r)
 
 	obj_add_uint_nx(r, "cmbebs", cmbebs);
 
-	obj_add_uint_nx(r, "CMB Elasticity Buffer Size Base (CMBWBZ)", cmbebs >> 8);
-	sprintf(buffer, "%s", cmbebs & 0x10 ? "shall" : "may");
+	obj_add_uint_nx(r, "CMB Elasticity Buffer Size Base (CMBWBZ)", NVME_CMBEBS_CMBWBZ(cmbebs));
+	sprintf(buffer, "%s", NVME_CMBEBS_RBB(cmbebs) ? "shall" : "may");
 	obj_add_str(r, "CMB Read Bypass Behavior (CMBRBB)", buffer);
 	obj_add_str(r, "CMB Elasticity Buffer Size Units (CMBSZU)",
-			nvme_register_unit_to_string(cmbebs & 0xf));
+		    nvme_register_unit_to_string(NVME_CMBEBS_CMBSZU(cmbebs)));
 }
 
 static void json_registers_cmbswtp(uint32_t cmbswtp, struct json_object *r)
@@ -1194,8 +1231,9 @@ static void json_registers_cmbswtp(uint32_t cmbswtp, struct json_object *r)
 
 	obj_add_uint_nx(r, "cmbswtp", cmbswtp);
 
-	obj_add_uint_nx(r, "CMB Sustained Write Throughput (CMBSWTV)", cmbswtp >> 8);
-	sprintf(str, "%s/second", nvme_register_unit_to_string(cmbswtp & 0xf));
+	obj_add_uint_nx(r, "CMB Sustained Write Throughput (CMBSWTV)",
+			NVME_CMBSWTP_CMBSWTV(cmbswtp));
+	sprintf(str, "%s/second", nvme_register_unit_to_string(NVME_CMBSWTP_CMBSWTU(cmbswtp)));
 	obj_add_str(r, "CMB Sustained Write Throughput Units (CMBSWTU)", str);
 }
 
@@ -1375,19 +1413,22 @@ static void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log,
 	struct json_object *r = json_create_object();
 	struct json_object *dev = json_create_object();
 	struct json_object *sstat = json_create_object();
+	struct json_object *ssi = json_create_object();
 	const char *status_str;
+	__u16 status, sos;
+	__u8 fails, sans;
 	char str[128];
-	__u16 status = le16_to_cpu(sanitize_log->sstat);
+
+	status = le16_to_cpu(sanitize_log->sstat);
 
 	obj_add_int(dev, "sprog", le16_to_cpu(sanitize_log->sprog));
-	obj_add_int(sstat, "global_erased", (status & NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED) >> 8);
-	obj_add_int(sstat, "no_cmplted_passes",
-		    (status >> NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT) &
-		    NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK);
+	obj_add_int(sstat, "media_verification_canceled", NVME_GET(status, SANITIZE_SSTAT_MVCNCLD));
+	obj_add_int(sstat, "global_erased", NVME_GET(status, SANITIZE_SSTAT_GLOBAL_DATA_ERASED));
+	obj_add_int(sstat, "no_cmplted_passes", NVME_GET(status, SANITIZE_SSTAT_COMPLETED_PASSES));
 
+	sos = NVME_GET(status, SANITIZE_SSTAT_STATUS);
 	status_str = nvme_sstat_status_to_string(status);
-	sprintf(str, "(%d) %s", status & NVME_SANITIZE_SSTAT_STATUS_MASK,
-		status_str);
+	sprintf(str, "(%d) %s", sos, status_str);
 	obj_add_str(sstat, "status", str);
 
 	obj_add_obj(dev, "sstat", sstat);
@@ -1398,7 +1439,21 @@ static void json_sanitize_log(struct nvme_sanitize_log_page *sanitize_log,
 	obj_add_uint(dev, "time_over_write_no_dealloc", le32_to_cpu(sanitize_log->etond));
 	obj_add_uint(dev, "time_block_erase_no_dealloc", le32_to_cpu(sanitize_log->etbend));
 	obj_add_uint(dev, "time_crypto_erase_no_dealloc", le32_to_cpu(sanitize_log->etcend));
+	obj_add_uint(dev, "time_post_verification_dealloc", le32_to_cpu(sanitize_log->etpvds));
 
+	sans = NVME_GET(sanitize_log->ssi, SANITIZE_SSI_SANS);
+	status_str = nvme_ssi_state_to_string(sans);
+	sprintf(str, "(%d) %s", sans, status_str);
+	obj_add_str(ssi, "sanitize_state", str);
+
+	if (sos == NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED) {
+		fails = NVME_GET(sanitize_log->ssi, SANITIZE_SSI_FAILS);
+		status_str = nvme_ssi_state_to_string(fails);
+		sprintf(str, "(%d) %s", fails, status_str);
+		obj_add_str(ssi, "failure_state", str);
+	}
+
+	obj_add_obj(dev, "sanitize_state_information", ssi);
 	obj_add_obj(r, devname, dev);
 
 	json_print(r);
@@ -2944,6 +2999,8 @@ static void json_nvme_id_ns_descs(void *data, unsigned int nsid)
 static void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
 {
 	struct json_object *r = json_create_object();
+	__u16 rsvd = (ctrl_nvm->aocs & 0xfffe) >> 1;
+	__u8 ralbas = ctrl_nvm->aocs & 0x1;
 
 	obj_add_uint(r, "vsl", ctrl_nvm->vsl);
 	obj_add_uint(r, "wzsl", ctrl_nvm->wzsl);
@@ -2951,15 +3008,17 @@ static void json_nvme_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
 	obj_add_uint(r, "dmrl", ctrl_nvm->dmrl);
 	obj_add_uint(r, "dmrsl", le32_to_cpu(ctrl_nvm->dmrsl));
 	obj_add_uint64(r, "dmsl", le64_to_cpu(ctrl_nvm->dmsl));
+	obj_add_uint(r, "kpiocap", ctrl_nvm->kpiocap);
+	obj_add_uint(r, "wzdsl", ctrl_nvm->wzdsl);
 	obj_add_uint(r, "aocs", le16_to_cpu(ctrl_nvm->aocs));
 
-	__u16 rsvd = (ctrl_nvm->aocs & 0xfffe) >> 1;
-	__u8 ralbas = ctrl_nvm->aocs & 0x1;
-
 	if (rsvd)
 		obj_add_uint(r, "[15:1]: Reserved", rsvd);
 	obj_add_uint(r, "[0:0]: Reporting Allocated LBA Supported", ralbas);
 
+	obj_add_uint(r, "ver", le32_to_cpu(ctrl_nvm->ver));
+	obj_add_uint(r, "lbamqf", ctrl_nvm->lbamqf);
+
 	json_print(r);
 }
 
@@ -3294,24 +3353,36 @@ static void json_feature_show_fields_write_atomic(struct json_object *r, unsigne
 
 static void json_feature_show_fields_async_event(struct json_object *r, unsigned int result)
 {
-	obj_add_str(r, "Discovery Log Page Change Notices", (result & 0x80000000) >> 31 ?
-		     "Send async event" : "Do not send async event");
-	obj_add_str(r, "Endurance Group Event Aggregate Log Change Notices", (result & 0x4000) >> 14 ?
-		     "Send async event" : "Do not send async event");
-	obj_add_str(r, "LBA Status Information Notices", (result & 0x2000) >> 13 ?
-		     "Send async event" : "Do not send async event");
+	const char *async = "Send async event";
+	const char *no_async = "Do not send async event";
+
+	obj_add_str(r, "Discovery Log Page Change Notices", NVME_FEAT_AE_DLPCN(result) ?
+			async : no_async);
+	obj_add_str(r, "Host Discovery Log Page Change Notification", NVME_FEAT_AE_HDLPCN(result) ?
+			async : no_async);
+	obj_add_str(r, "AVE Discovery Log Page Change Notification", NVME_FEAT_AE_ADLPCN(result) ?
+			async : no_async);
+	obj_add_str(r, "Pull Model DDC Request Log Page Change Notification",
+			NVME_FEAT_AE_PMDRLPCN(result) ? async : no_async);
+	obj_add_str(r, "Zone Descriptor Changed Notices", NVME_FEAT_AE_ZDCN(result) ?
+			async : no_async);
+	obj_add_str(r, "Reachability Group", NVME_FEAT_AE_RGRP0(result) ? async : no_async);
+	obj_add_str(r, "Reachability Association", NVME_FEAT_AE_RASSN(result) ? async : no_async);
+	obj_add_str(r, "Normal NVM Subsystem Shutdown", NVME_FEAT_AE_NNSSHDN(result) ?
+			async : no_async);
+	obj_add_str(r, "Endurance Group Event Aggregate Log Change Notices",
+			NVME_FEAT_AE_EGA(result) ? async : no_async);
+	obj_add_str(r, "LBA Status Information Notices", NVME_FEAT_AE_LBAS(result) ?
+			async : no_async);
 	obj_add_str(r, "Predictable Latency Event Aggregate Log Change Notices",
-		     (result & 0x1000) >> 12 ? "Send async event" : "Do not send async event");
-	obj_add_str(r, "Asymmetric Namespace Access Change Notices", (result & 0x800) >> 11 ?
-		     "Send async event" : "Do not send async event");
-	obj_add_str(r, "Telemetry Log Notices", (result & 0x400) >> 10 ? "Send async event" :
-		     "Do not send async event");
-	obj_add_str(r, "Firmware Activation Notices", (result & 0x200) >> 9 ? "Send async event" :
-		     "Do not send async event");
-	obj_add_str(r, "Namespace Attribute Notices", (result & 0x100) >> 8 ? "Send async event" :
-		     "Do not send async event");
-	obj_add_str(r, "SMART / Health Critical Warnings", result & 0xff ? "Send async event" :
-		     "Do not send async event");
+			NVME_FEAT_AE_PLA(result) ? async : no_async);
+	obj_add_str(r, "Asymmetric Namespace Access Change Notices", NVME_FEAT_AE_ANA(result) ?
+			async : no_async);
+	obj_add_str(r, "Telemetry Log Notices", NVME_FEAT_AE_TELEM(result) ? async : no_async);
+	obj_add_str(r, "Firmware Activation Notices", NVME_FEAT_AE_FW(result) ? async : no_async);
+	obj_add_str(r, "Namespace Attribute Notices", NVME_FEAT_AE_NAN(result) ? async : no_async);
+	obj_add_str(r, "SMART / Health Critical Warnings", NVME_FEAT_AE_SMART(result) ?
+			async : no_async);
 }
 
 static void json_auto_pst(struct nvme_feat_auto_pst *apst, struct json_object *r)
@@ -3470,8 +3541,25 @@ static void json_feature_show_fields_lba_sts_interval(struct json_object *r, uns
 
 static void json_feature_show_fields_host_behavior(struct json_object *r, unsigned char *buf)
 {
-	if (buf)
+	if (buf) {
+		struct nvme_feat_host_behavior *host = (struct nvme_feat_host_behavior *)buf;
+
 		obj_add_str(r, "Host Behavior Support", buf[0] & 0x1 ? "True" : "False");
+		obj_add_str(r, "Advanced Command Retry Enable (ACRE)", host->acre ?
+			    "True" : "False");
+		obj_add_str(r, "Extended Telemetry Data Area 4 Supported (ETDAS)", host->etdas ?
+			    "True" : "False");
+		obj_add_str(r, "LBA Format Extension Enable (LBAFEE)", host->lbafee ?
+			    "True" : "False");
+		obj_add_str(r, "Host Dispersed Namespace Support (HDISNS)", host->hdisns ?
+			    "Enabled" : "Disabled");
+		obj_add_str(r, "Copy Descriptor Format 2h Enable (CDF2E)", host->cdfe & (1 << 2) ?
+			    "True" : "False");
+		obj_add_str(r, "Copy Descriptor Format 3h Enable (CDF3E)", host->cdfe & (1 << 3) ?
+			    "True" : "False");
+		obj_add_str(r, "Copy Descriptor Format 4h Enable (CDF4E)", host->cdfe & (1 << 4) ?
+			    "True" : "False");
+	}
 }
 
 static void json_feature_show_fields_sanitize(struct json_object *r, unsigned int result)
@@ -3495,6 +3583,12 @@ static void json_feature_show_fields_spinup_control(struct json_object *r, unsig
 	obj_add_str(r, "Spinup control feature Enabled", result & 1 ? "True" : "False");
 }
 
+static void json_feature_show_fields_power_loss_signal(struct json_object *r, unsigned int result)
+{
+	obj_add_str(r, "Power Loss Signaling Mode (PLSM)",
+		    nvme_pls_mode_to_string(NVME_GET(result, FEAT_PLS_MODE)));
+}
+
 static void json_host_metadata(struct json_object *r, enum nvme_features_id fid,
 			       struct nvme_host_metadata *data)
 {
@@ -3705,6 +3799,9 @@ static void json_feature_show_fields(enum nvme_features_id fid, unsigned int res
 	case NVME_FEAT_FID_SPINUP_CONTROL:
 		json_feature_show_fields_spinup_control(r, result);
 		break;
+	case NVME_FEAT_FID_POWER_LOSS_SIGNAL:
+		json_feature_show_fields_power_loss_signal(r, result);
+		break;
 	case NVME_FEAT_FID_ENH_CTRL_METADATA:
 	case NVME_FEAT_FID_CTRL_METADATA:
 	case NVME_FEAT_FID_NS_METADATA:
@@ -4568,6 +4665,268 @@ void json_show_finish(void)
 	json_r = NULL;
 }
 
+static void json_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list)
+{
+	int i;
+	bool reserved = true;
+	struct json_object *r = json_create_object();
+	struct json_object *mad;
+	struct json_object *mat;
+	char json_str[STR_LEN];
+
+	for (i = 0; i < ARRAY_SIZE(ma_list->mad); i++) {
+		switch (ma_list->mad[i].mat) {
+		case 1:
+		case 2:
+			mad = json_create_object();
+			mat = json_create_object();
+			obj_add_str(mat, "definition", ma_list->mad[i].mat == 1 ?
+				    "NVM subsystem management agent" : "fabric interface manager");
+			snprintf(json_str, sizeof(json_str), "type: %d", ma_list->mad[i].mat);
+			obj_add_obj(mad, json_str, mat);
+			obj_add_str(mad, "address", (const char *)ma_list->mad[i].madrs);
+			snprintf(json_str, sizeof(json_str), "descriptor: %d", i);
+			obj_add_obj(r, json_str, mad);
+			reserved = false;
+			break;
+		case 0xff:
+			goto out;
+		default:
+			break;
+		}
+	}
+
+out:
+	if (reserved)
+		obj_add_str(r, "list", "All management address descriptors reserved");
+
+	json_print(r);
+}
+
+static void json_rotational_media_info_log(struct nvme_rotational_media_info_log *info)
+{
+	struct json_object *r = json_create_object();
+
+	obj_add_uint(r, "endgid", le16_to_cpu(info->endgid));
+	obj_add_uint(r, "numa", le16_to_cpu(info->numa));
+	obj_add_uint(r, "nrs", le16_to_cpu(info->nrs));
+	obj_add_uint(r, "spinc", le32_to_cpu(info->spinc));
+	obj_add_uint(r, "fspinc", le32_to_cpu(info->fspinc));
+	obj_add_uint(r, "ldc", le32_to_cpu(info->ldc));
+	obj_add_uint(r, "fldc", le32_to_cpu(info->fldc));
+
+	json_print(r);
+}
+
+static void json_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log)
+{
+	struct json_object *r = json_create_object();
+	__u64 numpsub = le64_to_cpu(log->numpsub);
+	__u64 i;
+	char json_str[STR_LEN];
+	char psub[NVME_NQN_LENGTH + 1];
+
+	obj_add_uint64(r, "genctr", le64_to_cpu(log->genctr));
+	obj_add_uint64(r, "numpsub", numpsub);
+	for (i = 0; i < numpsub; i++) {
+		snprintf(json_str, sizeof(json_str), "participating_nss %"PRIu64"", (uint64_t)i);
+		snprintf(psub, sizeof(psub), "%-.*s", NVME_NQN_LENGTH,
+			 &log->participating_nss[i * NVME_NQN_LENGTH]);
+		obj_add_str(r, json_str, psub);
+	}
+
+	json_print(r);
+}
+
+static void json_reachability_groups_log(struct nvme_reachability_groups_log *log, __u64 len UNUSED)
+{
+	struct json_object *r = json_create_object();
+	__u16 i;
+	__u32 j;
+	char json_str[STR_LEN];
+	struct json_object *rgd;
+
+	obj_add_uint64(r, "chngc", le64_to_cpu(log->chngc));
+	obj_add_uint(r, "nrgd", le16_to_cpu(log->nrgd));
+
+	for (i = 0; i < le16_to_cpu(log->nrgd); i++) {
+		snprintf(json_str, sizeof(json_str), "rgid: %u", le32_to_cpu(log->rgd[i].rgid));
+		rgd = json_create_object();
+		obj_add_uint(rgd, "nnid", le32_to_cpu(log->rgd[i].nnid));
+		obj_add_uint64(rgd, "chngc", le64_to_cpu(log->rgd[i].chngc));
+		for (j = 0; j < le32_to_cpu(log->rgd[i].nnid); j++)
+			obj_add_uint(rgd, "nnid", le32_to_cpu(log->rgd[i].nsid[j]));
+		obj_add_obj(r, json_str, rgd);
+	}
+
+	json_print(r);
+}
+
+static void json_reachability_associations_log(struct nvme_reachability_associations_log *log,
+					       __u64 len UNUSED)
+{
+	struct json_object *r = json_create_object();
+	__u16 i;
+	__u32 j;
+	char json_str[STR_LEN];
+	struct json_object *rad;
+
+	obj_add_uint64(r, "chngc", le64_to_cpu(log->chngc));
+	obj_add_uint(r, "nrad", le16_to_cpu(log->nrad));
+
+	for (i = 0; i < le16_to_cpu(log->nrad); i++) {
+		snprintf(json_str, sizeof(json_str), "rasid: %u", le32_to_cpu(log->rad[i].rasid));
+		rad = json_create_object();
+		obj_add_uint(rad, "nrid", le32_to_cpu(log->rad[i].nrid));
+		obj_add_uint64(rad, "chngc", le64_to_cpu(log->rad[i].chngc));
+		obj_add_uint(rad, "rac", log->rad[i].rac);
+		for (j = 0; j < le32_to_cpu(log->rad[i].nrid); j++)
+			obj_add_uint(rad, "rgid", le32_to_cpu(log->rad[i].rgid[j]));
+		obj_add_obj(r, json_str, rad);
+	}
+
+	json_print(r);
+}
+
+static void json_host_discovery_log(struct nvme_host_discover_log *log)
+{
+	struct json_object *r = json_create_object();
+	__u32 i;
+	__u16 j;
+	struct nvme_host_ext_discover_log *hedlpe;
+	struct nvmf_ext_attr *exat;
+	__u32 thdlpl = le32_to_cpu(log->thdlpl);
+	__u32 tel;
+	__u16 numexat;
+	char json_str[STR_LEN];
+	struct json_object *hedlpe_o;
+	struct json_object *tsas_o;
+	struct json_object *exat_o;
+	int n = 0;
+
+	obj_add_uint64(r, "genctr", le64_to_cpu(log->genctr));
+	obj_add_uint64(r, "numrec", le64_to_cpu(log->numrec));
+	obj_add_uint(r, "recfmt", le16_to_cpu(log->recfmt));
+	obj_add_uint_02x(r, "hdlpf", log->hdlpf);
+	obj_add_uint(r, "thdlpl", thdlpl);
+
+	for (i = sizeof(*log); i < le32_to_cpu(log->thdlpl); i += tel) {
+		hedlpe_o = json_create_object();
+		hedlpe = (void *)log + i;
+		tel = le32_to_cpu(hedlpe->tel);
+		numexat = le16_to_cpu(hedlpe->numexat);
+		obj_add_str(hedlpe_o, "trtype", nvmf_trtype_str(hedlpe->trtype));
+		obj_add_str(hedlpe_o, "adrfam",
+			    strlen(hedlpe->traddr) ? nvmf_adrfam_str(hedlpe->adrfam) : "");
+		obj_add_str(hedlpe_o, "eflags", nvmf_eflags_str(le16_to_cpu(hedlpe->eflags)));
+		obj_add_str(hedlpe_o, "hostnqn", hedlpe->hostnqn);
+		obj_add_str(hedlpe_o, "traddr", hedlpe->traddr);
+		tsas_o = json_create_object();
+		switch (hedlpe->trtype) {
+		case NVMF_TRTYPE_RDMA:
+			obj_add_str(tsas_o, "prtype", nvmf_prtype_str(hedlpe->tsas.rdma.prtype));
+			obj_add_str(tsas_o, "qptype", nvmf_qptype_str(hedlpe->tsas.rdma.qptype));
+			obj_add_str(tsas_o, "cms", nvmf_cms_str(hedlpe->tsas.rdma.cms));
+			obj_add_uint_0nx(tsas_o, "pkey", le16_to_cpu(hedlpe->tsas.rdma.pkey), 4);
+			break;
+		case NVMF_TRTYPE_TCP:
+			obj_add_str(tsas_o, "sectype", nvmf_sectype_str(hedlpe->tsas.tcp.sectype));
+			break;
+		default:
+			obj_d(tsas_o, "common", (unsigned char *)hedlpe->tsas.common,
+			      sizeof(hedlpe->tsas.common), 16, 1);
+			break;
+		}
+		obj_add_obj(hedlpe_o, "tsas", tsas_o);
+		obj_add_uint(hedlpe_o, "tel", tel);
+		obj_add_uint(hedlpe_o, "numexat", numexat);
+
+		exat = hedlpe->exat;
+		for (j = 0; j < numexat; j++) {
+			exat_o = json_create_object();
+			snprintf(json_str, sizeof(json_str), "exat: %d", j);
+			obj_add_uint(exat_o, "exattype", le16_to_cpu(exat->exattype));
+			obj_add_uint(exat_o, "exatlen", le16_to_cpu(exat->exatlen));
+			obj_d(exat_o, "exatval", (unsigned char *)exat->exatval,
+			      le16_to_cpu(exat->exatlen), 16, 1);
+			obj_add_obj(hedlpe_o, json_str, exat_o);
+			exat = nvmf_exat_ptr_next(exat);
+		}
+		snprintf(json_str, sizeof(json_str), "hedlpe: %d", n++);
+		obj_add_obj(r, json_str, hedlpe_o);
+	}
+}
+
+static void obj_add_traddr(struct json_object *o, const char *k, __u8 adrfam, __u8 *traddr)
+{
+	int af = AF_INET;
+	socklen_t size = INET_ADDRSTRLEN;
+	char dst[INET6_ADDRSTRLEN];
+
+	if (adrfam == NVMF_ADDR_FAMILY_IP6) {
+		af = AF_INET6;
+		size = INET6_ADDRSTRLEN;
+	}
+
+	if (inet_ntop(af, nvmf_adrfam_str(adrfam), dst, size))
+		obj_add_str(o, k, dst);
+}
+
+static void json_ave_discovery_log(struct nvme_ave_discover_log *log)
+{
+	struct json_object *r = json_create_object();
+	__u32 i;
+	__u8 j;
+	struct nvme_ave_discover_log_entry *adlpe;
+	struct nvme_ave_tr_record *atr;
+	__u32 tadlpl = le32_to_cpu(log->tadlpl);
+	__u32 tel;
+	__u8 numatr;
+	int n = 0;
+	char json_str[STR_LEN];
+	struct json_object *adlpe_o;
+	struct json_object *atr_o;
+
+	obj_add_uint64(r, "genctr", le64_to_cpu(log->genctr));
+	obj_add_uint64(r, "numrec", le64_to_cpu(log->numrec));
+	obj_add_uint(r, "recfmt", le16_to_cpu(log->recfmt));
+	obj_add_uint(r, "thdlpl", tadlpl);
+
+	for (i = sizeof(*log); i < le32_to_cpu(log->tadlpl); i += tel) {
+		adlpe_o = json_create_object();
+		adlpe = (void *)log + i;
+		tel = le32_to_cpu(adlpe->tel);
+		numatr = adlpe->numatr;
+		obj_add_uint(adlpe_o, "tel", tel);
+		obj_add_str(adlpe_o, "avenqn", adlpe->avenqn);
+		obj_add_uint(adlpe_o, "numatr", numatr);
+
+		atr = adlpe->atr;
+		for (j = 0; j < numatr; j++) {
+			atr_o = json_create_object();
+			snprintf(json_str, sizeof(json_str), "atr: %d", j);
+			obj_add_str(atr_o, "aveadrfam", nvmf_adrfam_str(atr->aveadrfam));
+			obj_add_uint(atr_o, "avetrsvcid", le16_to_cpu(atr->avetrsvcid));
+			obj_add_traddr(atr_o, "avetraddr", atr->aveadrfam, atr->avetraddr);
+			obj_add_obj(adlpe_o, json_str, atr_o);
+			atr++;
+		}
+		snprintf(json_str, sizeof(json_str), "adlpe: %d", n++);
+		obj_add_obj(r, json_str, adlpe_o);
+	}
+}
+
+static void json_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log)
+{
+	struct json_object *r = json_create_object();
+	__u32 tpdrpl = le32_to_cpu(log->tpdrpl);
+	__u32 osp_len = tpdrpl - offsetof(struct nvme_pull_model_ddc_req_log, osp);
+
+	obj_add_uint(r, "ori", log->ori);
+	printf("tpdrpl: %u\n", tpdrpl);
+	obj_d(r, "osp", (unsigned char *)log->osp, osp_len, 16, 1);
+}
+
 static struct print_ops json_print_ops = {
 	/* libnvme types.h print functions */
 	.ana_log			= json_ana_log,
@@ -4635,6 +4994,14 @@ static struct print_ops json_print_ops = {
 	.d				= json_d,
 	.show_init			= json_show_init,
 	.show_finish			= json_show_finish,
+	.mgmt_addr_list_log		= json_mgmt_addr_list_log,
+	.rotational_media_info_log	= json_rotational_media_info_log,
+	.dispersed_ns_psub_log		= json_dispersed_ns_psub_log,
+	.reachability_groups_log	= json_reachability_groups_log,
+	.reachability_associations_log	= json_reachability_associations_log,
+	.host_discovery_log		= json_host_discovery_log,
+	.ave_discovery_log		= json_ave_discovery_log,
+	.pull_model_ddc_req_log		= json_pull_model_ddc_req_log,
 
 	/* libnvme tree print functions */
 	.list_item			= json_list_item,
@@ -4656,36 +5023,3 @@ struct print_ops *nvme_get_json_print_ops(nvme_print_flags_t flags)
 	json_print_ops.flags = flags;
 	return &json_print_ops;
 }
-
-void obj_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len)
-{
-	int i;
-
-	_cleanup_free_ char *value = NULL;
-
-	if (!buf || !len) {
-		obj_add_str(o, k, "No information provided");
-		return;
-	}
-
-	value = calloc(1, (len + 1) * 2 + 1);
-
-	if (!value) {
-		obj_add_str(o, k, "Could not allocate string");
-		return;
-	}
-
-	sprintf(value, "0x");
-	for (i = 1; i <= len; i++)
-		sprintf(&value[i * 2], "%02x", buf[len - i]);
-
-	obj_add_str(o, k, value);
-}
-
-void obj_add_0nprix64(struct json_object *o, const char *k, uint64_t v, int width)
-{
-	char str[STR_LEN];
-
-	sprintf(str, "0x%0*"PRIx64"", width, v);
-	obj_add_str(o, k, str);
-}
diff --git a/nvme-print-stdout.c b/nvme-print-stdout.c
index 1fdcb9b..e87c605 100644
--- a/nvme-print-stdout.c
+++ b/nvme-print-stdout.c
@@ -6,7 +6,9 @@
 #include <stdlib.h>
 #include <time.h>
 #include <sys/stat.h>
-
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
 #include <ccan/ccan/strset/strset.h>
 #include <ccan/ccan/htable/htable_type.h>
 #include <ccan/ccan/htable/htable.h>
@@ -18,6 +20,7 @@
 #include "nvme-models.h"
 #include "util/suffix.h"
 #include "util/types.h"
+#include "util/logging.h"
 #include "common.h"
 
 static const uint8_t zero_uuid[16] = { 0 };
@@ -246,91 +249,255 @@ static void stdout_add_bitmap(int i, __u8 seb)
 	}
 }
 
-static void stdout_persistent_event_log_fdp_events(unsigned int cdw11,
-						   unsigned int cdw12,
+static void stdout_persistent_event_log_fdp_events(unsigned int cdw11, unsigned int cdw12,
 						   unsigned char *buf)
 {
-	unsigned int num = (cdw11 >> 16) & 0xff;
+	unsigned int num = NVME_GET(cdw11, FEAT_FDPE_NOET);
 
 	for (unsigned int i = 0; i < num; i++) {
-		printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(buf[0]),
-				cdw12 & 0x1 ? "" : "Not ");
+		printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(buf[i]),
+		       NVME_GET(cdw12, FDP_SUPP_EVENT_ENABLED) ? "" : "Not ");
 	}
 }
 
-static void stdout_persistent_event_log(void *pevent_log_info,
-					__u8 action, __u32 size,
+static void pel_header(struct nvme_persistent_event_log *pevent_log_head, int human)
+{
+	printf("Log Identifier: %u\n", pevent_log_head->lid);
+	printf("Total Number of Events: %u\n", le32_to_cpu(pevent_log_head->tnev));
+	printf("Total Log Length : %"PRIu64"\n", le64_to_cpu(pevent_log_head->tll));
+	printf("Log Revision: %u\n", pevent_log_head->rv);
+	printf("Log Header Length: %u\n", pevent_log_head->lhl);
+	printf("Timestamp: %"PRIu64"\n", le64_to_cpu(pevent_log_head->ts));
+	printf("Power On Hours (POH): %s",
+	       uint128_t_to_l10n_string(le128_to_cpu(pevent_log_head->poh)));
+	printf("Power Cycle Count: %"PRIu64"\n", le64_to_cpu(pevent_log_head->pcc));
+	printf("PCI Vendor ID (VID): %u\n", le16_to_cpu(pevent_log_head->vid));
+	printf("PCI Subsystem Vendor ID (SSVID): %u\n", le16_to_cpu(pevent_log_head->ssvid));
+	printf("Serial Number (SN): %-.*s\n", (int)sizeof(pevent_log_head->sn),
+	       pevent_log_head->sn);
+	printf("Model Number (MN): %-.*s\n", (int)sizeof(pevent_log_head->mn), pevent_log_head->mn);
+	printf("NVM Subsystem NVMe Qualified Name (SUBNQN): %-.*s\n",
+	       (int)sizeof(pevent_log_head->subnqn), pevent_log_head->subnqn);
+	printf("Generation Number: %u\n", le16_to_cpu(pevent_log_head->gen_number));
+	printf("Reporting Context Information (RCI): %u\n", le32_to_cpu(pevent_log_head->rci));
+
+	if (human)
+		stdout_persistent_event_log_rci(pevent_log_head->rci);
+
+	printf("Supported Events Bitmap:\n");
+	for (int i = 0; i < 32; i++) {
+		if (!pevent_log_head->seb[i])
+			continue;
+		stdout_add_bitmap(i, pevent_log_head->seb[i]);
+	}
+}
+
+static void pel_event_header(int i, struct nvme_persistent_event_entry *pevent_entry_head,
+			     int human)
+{
+	printf("Event Number: %u\n", i);
+	printf("Event Type: %s\n", nvme_pel_event_to_string(pevent_entry_head->etype));
+	printf("Event Type Revision: %u\n", pevent_entry_head->etype_rev);
+	printf("Event Header Length: %u\n", pevent_entry_head->ehl);
+	printf("Event Header Additional Info: %u\n", pevent_entry_head->ehai);
+
+	if (human)
+		stdout_persistent_event_entry_ehai(pevent_entry_head->ehai);
+
+	printf("Controller Identifier: %u\n", le16_to_cpu(pevent_entry_head->cntlid));
+	printf("Event Timestamp: %"PRIu64"\n", le64_to_cpu(pevent_entry_head->ets));
+	printf("Port Identifier: %u\n", le16_to_cpu(pevent_entry_head->pelpid));
+	printf("Vendor Specific Information Length: %u\n", le16_to_cpu(pevent_entry_head->vsil));
+	printf("Event Length: %u\n", le16_to_cpu(pevent_entry_head->el));
+}
+
+static void pel_smart_health_event(void *pevent_log_info, __u32 offset, const char *devname)
+{
+	struct nvme_smart_log *smart_event = pevent_log_info + offset;
+
+	printf("Smart Health Event Entry:\n");
+	stdout_smart_log(smart_event, NVME_NSID_ALL, devname);
+}
+
+static void pel_fw_commit_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_fw_commit_event *fw_commit_event = pevent_log_info + offset;
+
+	printf("FW Commit Event Entry:\n");
+	printf("Old Firmware Revision: %"PRIu64" (%s)\n", le64_to_cpu(fw_commit_event->old_fw_rev),
+	       util_fw_to_string((char *)&fw_commit_event->old_fw_rev));
+	printf("New Firmware Revision: %"PRIu64" (%s)\n", le64_to_cpu(fw_commit_event->new_fw_rev),
+	       util_fw_to_string((char *)&fw_commit_event->new_fw_rev));
+	printf("FW Commit Action: %u\n", fw_commit_event->fw_commit_action);
+	printf("FW Slot: %u\n", fw_commit_event->fw_slot);
+	printf("Status Code Type for Firmware Commit Command: %u\n", fw_commit_event->sct_fw);
+	printf("Status Returned for Firmware Commit Command: %u\n", fw_commit_event->sc_fw);
+	printf("Vendor Assigned Firmware Commit Result Code: %u\n",
+	       le16_to_cpu(fw_commit_event->vndr_assign_fw_commit_rc));
+}
+
+static void pel_timestamp_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_time_stamp_change_event *ts_change_event = pevent_log_info + offset;
+
+	printf("Time Stamp Change Event Entry:\n");
+	printf("Previous Timestamp: %"PRIu64"\n", le64_to_cpu(ts_change_event->previous_timestamp));
+	printf("Milliseconds Since Reset: %"PRIu64"\n",
+	       le64_to_cpu(ts_change_event->ml_secs_since_reset));
+}
+
+static void pel_power_on_reset_event(void *pevent_log_info, __u32 offset,
+				     struct nvme_persistent_event_entry *pevent_entry_head)
+{
+	__u64 *fw_rev;
+	__u32 por_info_len = le16_to_cpu(pevent_entry_head->el) -
+			     le16_to_cpu(pevent_entry_head->vsil) - sizeof(*fw_rev);
+	struct nvme_power_on_reset_info_list *por_event;
+	__u32 por_info_list = por_info_len / sizeof(*por_event);
+
+	printf("Power On Reset Event Entry:\n");
+	fw_rev = pevent_log_info + offset;
+	printf("Firmware Revision: %"PRIu64" (%s)\n", le64_to_cpu(*fw_rev),
+	       util_fw_to_string((char *)fw_rev));
+	printf("Reset Information List:\n");
+
+	for (int i = 0; i < por_info_list; i++) {
+		por_event = pevent_log_info + offset + sizeof(*fw_rev) + i * sizeof(*por_event);
+		printf("Controller ID: %u\n", le16_to_cpu(por_event->cid));
+		printf("Firmware Activation: %u\n", por_event->fw_act);
+		printf("Operation in Progress: %u\n", por_event->op_in_prog);
+		printf("Controller Power Cycle: %u\n", le32_to_cpu(por_event->ctrl_power_cycle));
+		printf("Power on milliseconds: %"PRIu64"\n",
+		       le64_to_cpu(por_event->power_on_ml_seconds));
+		printf("Controller Timestamp: %"PRIu64"\n",
+		       le64_to_cpu(por_event->ctrl_time_stamp));
+	}
+}
+
+static void pel_nss_hw_error_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_nss_hw_err_event *nss_hw_err_event = pevent_log_info + offset;
+
+	printf("NVM Subsystem Hardware Error Event Code Entry: %u, %s\n",
+	       le16_to_cpu(nss_hw_err_event->nss_hw_err_event_code),
+	       nvme_nss_hw_error_to_string(nss_hw_err_event->nss_hw_err_event_code));
+}
+
+static void pel_change_ns_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_change_ns_event *ns_event = pevent_log_info + offset;
+
+	printf("Change Namespace Event Entry:\n");
+	printf("Namespace Management CDW10: %u\n", le32_to_cpu(ns_event->nsmgt_cdw10));
+	printf("Namespace Size: %"PRIu64"\n", le64_to_cpu(ns_event->nsze));
+	printf("Namespace Capacity: %"PRIu64"\n", le64_to_cpu(ns_event->nscap));
+	printf("Formatted LBA Size: %u\n", ns_event->flbas);
+	printf("End-to-end Data Protection Type Settings: %u\n", ns_event->dps);
+	printf("Namespace Multi-path I/O and Namespace Sharing Capabilities: %u\n", ns_event->nmic);
+	printf("ANA Group Identifier: %u\n", le32_to_cpu(ns_event->ana_grp_id));
+	printf("NVM Set Identifier: %u\n", le16_to_cpu(ns_event->nvmset_id));
+	printf("Namespace ID: %u\n", le32_to_cpu(ns_event->nsid));
+}
+
+static void pel_format_start_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_format_nvm_start_event *format_start_event = pevent_log_info + offset;
+
+	printf("Format NVM Start Event Entry:\n");
+	printf("Namespace Identifier: %u\n", le32_to_cpu(format_start_event->nsid));
+	printf("Format NVM Attributes: %u\n", format_start_event->fna);
+	printf("Format NVM CDW10: %u\n", le32_to_cpu(format_start_event->format_nvm_cdw10));
+}
+
+static void pel_format_completion_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_format_nvm_compln_event *format_cmpln_event = pevent_log_info + offset;
+
+	printf("Format NVM Completion Event Entry:\n");
+	printf("Namespace Identifier: %u\n", le32_to_cpu(format_cmpln_event->nsid));
+	printf("Smallest Format Progress Indicator: %u\n", format_cmpln_event->smallest_fpi);
+	printf("Format NVM Status: %u\n", format_cmpln_event->format_nvm_status);
+	printf("Completion Information: %u\n", le16_to_cpu(format_cmpln_event->compln_info));
+	printf("Status Field: %u\n", le32_to_cpu(format_cmpln_event->status_field));
+}
+
+static void pel_sanitize_start_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_sanitize_start_event *sanitize_start_event = pevent_log_info + offset;
+
+	printf("Sanitize Start Event Entry:\n");
+	printf("SANICAP: %u\n", sanitize_start_event->sani_cap);
+	printf("Sanitize CDW10: %u\n", le32_to_cpu(sanitize_start_event->sani_cdw10));
+	printf("Sanitize CDW11: %u\n", le32_to_cpu(sanitize_start_event->sani_cdw11));
+}
+
+static void pel_sanitize_completion_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_sanitize_compln_event *sanitize_cmpln_event = pevent_log_info + offset;
+
+	printf("Sanitize Completion Event Entry:\n");
+	printf("Sanitize Progress: %u\n", le16_to_cpu(sanitize_cmpln_event->sani_prog));
+	printf("Sanitize Status: %u\n", le16_to_cpu(sanitize_cmpln_event->sani_status));
+	printf("Completion Information: %u\n", le16_to_cpu(sanitize_cmpln_event->cmpln_info));
+}
+
+static void pel_set_feature_event(void *pevent_log_info, __u32 offset)
+{
+	int fid, cdw11, cdw12, dword_cnt;
+	unsigned char *mem_buf;
+	struct nvme_set_feature_event *set_feat_event = pevent_log_info + offset;
+
+	printf("Set Feature Event Entry:\n");
+	dword_cnt = NVME_SET_FEAT_EVENT_DW_COUNT(set_feat_event->layout);
+	fid = NVME_GET(le32_to_cpu(set_feat_event->cdw_mem[0]), FEATURES_CDW10_FID);
+	cdw11 = le32_to_cpu(set_feat_event->cdw_mem[1]);
+
+	printf("Set Feature ID: 0x%02x (%s), value: 0x%08x\n", fid, nvme_feature_to_string(fid),
+	       cdw11);
+
+	if (!NVME_SET_FEAT_EVENT_MB_COUNT(set_feat_event->layout))
+		return;
+
+	mem_buf = (unsigned char *)set_feat_event + 4 + dword_cnt * 4;
+	if (fid == NVME_FEAT_FID_FDP_EVENTS) {
+		cdw12 = le32_to_cpu(set_feat_event->cdw_mem[2]);
+		stdout_persistent_event_log_fdp_events(cdw11, cdw12, mem_buf);
+	} else {
+		stdout_feature_show_fields(fid, cdw11, mem_buf);
+	}
+}
+
+static void pel_thermal_excursion_event(void *pevent_log_info, __u32 offset)
+{
+	struct nvme_thermal_exc_event *thermal_exc_event = pevent_log_info + offset;
+
+	printf("Thermal Excursion Event Entry:\n");
+	printf("Over Temperature: %u\n", thermal_exc_event->over_temp);
+	printf("Threshold: %u\n", thermal_exc_event->threshold);
+}
+
+static void stdout_persistent_event_log(void *pevent_log_info, __u8 action, __u32 size,
 					const char *devname)
 {
-	__u32 offset, por_info_len, por_info_list;
-	__u64 *fw_rev;
-	int fid, cdw11, cdw12, dword_cnt;
-	unsigned char *mem_buf = NULL;
-	struct nvme_smart_log *smart_event;
-	struct nvme_fw_commit_event *fw_commit_event;
-	struct nvme_time_stamp_change_event *ts_change_event;
-	struct nvme_power_on_reset_info_list *por_event;
-	struct nvme_nss_hw_err_event *nss_hw_err_event;
-	struct nvme_change_ns_event	*ns_event;
-	struct nvme_format_nvm_start_event *format_start_event;
-	struct nvme_format_nvm_compln_event *format_cmpln_event;
-	struct nvme_sanitize_start_event *sanitize_start_event;
-	struct nvme_sanitize_compln_event *sanitize_cmpln_event;
-	struct nvme_set_feature_event *set_feat_event;
-	struct nvme_thermal_exc_event *thermal_exc_event;
 	struct nvme_persistent_event_log *pevent_log_head;
+	__u32 offset = sizeof(*pevent_log_head);
 	struct nvme_persistent_event_entry *pevent_entry_head;
-
 	int human = stdout_print_ops.flags & VERBOSE;
 
-	offset = sizeof(*pevent_log_head);
-
 	printf("Persistent Event Log for device: %s\n", devname);
 	printf("Action for Persistent Event Log: %u\n", action);
-	if (size >= offset) {
-		pevent_log_head = pevent_log_info;
-		printf("Log Identifier: %u\n", pevent_log_head->lid);
-		printf("Total Number of Events: %u\n",
-			le32_to_cpu(pevent_log_head->tnev));
-		printf("Total Log Length : %"PRIu64"\n",
-			le64_to_cpu(pevent_log_head->tll));
-		printf("Log Revision: %u\n", pevent_log_head->rv);
-		printf("Log Header Length: %u\n", pevent_log_head->lhl);
-		printf("Timestamp: %"PRIu64"\n",
-			le64_to_cpu(pevent_log_head->ts));
-		printf("Power On Hours (POH): %s",
-			uint128_t_to_l10n_string(le128_to_cpu(pevent_log_head->poh)));
-		printf("Power Cycle Count: %"PRIu64"\n",
-			le64_to_cpu(pevent_log_head->pcc));
-		printf("PCI Vendor ID (VID): %u\n",
-			le16_to_cpu(pevent_log_head->vid));
-		printf("PCI Subsystem Vendor ID (SSVID): %u\n",
-			le16_to_cpu(pevent_log_head->ssvid));
-		printf("Serial Number (SN): %-.*s\n",
-			(int)sizeof(pevent_log_head->sn), pevent_log_head->sn);
-		printf("Model Number (MN): %-.*s\n",
-			(int)sizeof(pevent_log_head->mn), pevent_log_head->mn);
-		printf("NVM Subsystem NVMe Qualified Name (SUBNQN): %-.*s\n",
-			(int)sizeof(pevent_log_head->subnqn),
-			pevent_log_head->subnqn);
-		printf("Generation Number: %u\n",
-			le16_to_cpu(pevent_log_head->gen_number));
-		printf("Reporting Context Information (RCI): %u\n",
-			le32_to_cpu(pevent_log_head->rci));
-		if (human)
-			stdout_persistent_event_log_rci(pevent_log_head->rci);
-		printf("Supported Events Bitmap:\n");
-		for (int i = 0; i < 32; i++) {
-			if (pevent_log_head->seb[i] == 0)
-				continue;
-			stdout_add_bitmap(i, pevent_log_head->seb[i]);
-		}
-	} else {
+
+	if (size < offset) {
 		printf("No log data can be shown with this log len at least " \
-			"512 bytes is required or can be 0 to read the complete "\
-			"log page after context established\n");
+		       "512 bytes is required or can be 0 to read the complete " \
+		       "log page after context established\n");
 		return;
 	}
+
+	pevent_log_head = pevent_log_info;
+
+	pel_header(pevent_log_head, human);
+
 	printf("\n");
 	printf("\nPersistent Event Entries:\n");
 	for (int i = 0; i < le32_to_cpu(pevent_log_head->tnev); i++) {
@@ -342,181 +509,50 @@ static void stdout_persistent_event_log(void *pevent_log_info,
 		if ((offset + pevent_entry_head->ehl + 3 +
 			le16_to_cpu(pevent_entry_head->el)) >= size)
 			break;
-		printf("Event Number: %u\n", i);
-		printf("Event Type: %s\n", nvme_pel_event_to_string(pevent_entry_head->etype));
-		printf("Event Type Revision: %u\n", pevent_entry_head->etype_rev);
-		printf("Event Header Length: %u\n", pevent_entry_head->ehl);
-		printf("Event Header Additional Info: %u\n", pevent_entry_head->ehai);
-		if (human)
-			stdout_persistent_event_entry_ehai(pevent_entry_head->ehai);
-		printf("Controller Identifier: %u\n",
-			le16_to_cpu(pevent_entry_head->cntlid));
-		printf("Event Timestamp: %"PRIu64"\n",
-			le64_to_cpu(pevent_entry_head->ets));
-		printf("Port Identifier: %u\n",
-			le16_to_cpu(pevent_entry_head->pelpid));
-		printf("Vendor Specific Information Length: %u\n",
-			le16_to_cpu(pevent_entry_head->vsil));
-		printf("Event Length: %u\n", le16_to_cpu(pevent_entry_head->el));
+
+		pel_event_header(i, pevent_entry_head, human);
 
 		offset += pevent_entry_head->ehl + 3;
 
 		switch (pevent_entry_head->etype) {
 		case NVME_PEL_SMART_HEALTH_EVENT:
-			smart_event = pevent_log_info + offset;
-			printf("Smart Health Event Entry:\n");
-			stdout_smart_log(smart_event, NVME_NSID_ALL, devname);
+			pel_smart_health_event(pevent_log_info, offset, devname);
 			break;
 		case NVME_PEL_FW_COMMIT_EVENT:
-			fw_commit_event = pevent_log_info + offset;
-			printf("FW Commit Event Entry:\n");
-			printf("Old Firmware Revision: %"PRIu64" (%s)\n",
-				le64_to_cpu(fw_commit_event->old_fw_rev),
-				util_fw_to_string((char *)&fw_commit_event->old_fw_rev));
-			printf("New Firmware Revision: %"PRIu64" (%s)\n",
-				le64_to_cpu(fw_commit_event->new_fw_rev),
-				util_fw_to_string((char *)&fw_commit_event->new_fw_rev));
-			printf("FW Commit Action: %u\n",
-				fw_commit_event->fw_commit_action);
-			printf("FW Slot: %u\n", fw_commit_event->fw_slot);
-			printf("Status Code Type for Firmware Commit Command: %u\n",
-				fw_commit_event->sct_fw);
-			printf("Status Returned for Firmware Commit Command: %u\n",
-				fw_commit_event->sc_fw);
-			printf("Vendor Assigned Firmware Commit Result Code: %u\n",
-				le16_to_cpu(fw_commit_event->vndr_assign_fw_commit_rc));
+			pel_fw_commit_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_TIMESTAMP_EVENT:
-			ts_change_event = pevent_log_info + offset;
-			printf("Time Stamp Change Event Entry:\n");
-			printf("Previous Timestamp: %"PRIu64"\n",
-				le64_to_cpu(ts_change_event->previous_timestamp));
-			printf("Milliseconds Since Reset: %"PRIu64"\n",
-				le64_to_cpu(ts_change_event->ml_secs_since_reset));
+			pel_timestamp_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_POWER_ON_RESET_EVENT:
-			por_info_len = (le16_to_cpu(pevent_entry_head->el) -
-				le16_to_cpu(pevent_entry_head->vsil) - sizeof(*fw_rev));
-
-			por_info_list = por_info_len / sizeof(*por_event);
-
-			printf("Power On Reset Event Entry:\n");
-			fw_rev = pevent_log_info + offset;
-			printf("Firmware Revision: %"PRIu64" (%s)\n", le64_to_cpu(*fw_rev),
-				util_fw_to_string((char *)fw_rev));
-			printf("Reset Information List:\n");
-
-			for (int i = 0; i < por_info_list; i++) {
-				por_event = pevent_log_info + offset +
-					sizeof(*fw_rev) + i * sizeof(*por_event);
-				printf("Controller ID: %u\n", le16_to_cpu(por_event->cid));
-				printf("Firmware Activation: %u\n",
-					por_event->fw_act);
-				printf("Operation in Progress: %u\n",
-					por_event->op_in_prog);
-				printf("Controller Power Cycle: %u\n",
-					le32_to_cpu(por_event->ctrl_power_cycle));
-				printf("Power on milliseconds: %"PRIu64"\n",
-					le64_to_cpu(por_event->power_on_ml_seconds));
-				printf("Controller Timestamp: %"PRIu64"\n",
-					le64_to_cpu(por_event->ctrl_time_stamp));
-			}
+			pel_power_on_reset_event(pevent_log_info, offset, pevent_entry_head);
 			break;
 		case NVME_PEL_NSS_HW_ERROR_EVENT:
-			nss_hw_err_event = pevent_log_info + offset;
-			printf("NVM Subsystem Hardware Error Event Code Entry: %u, %s\n",
-				le16_to_cpu(nss_hw_err_event->nss_hw_err_event_code),
-				nvme_nss_hw_error_to_string(nss_hw_err_event->nss_hw_err_event_code));
+			pel_nss_hw_error_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_CHANGE_NS_EVENT:
-			ns_event = pevent_log_info + offset;
-			printf("Change Namespace Event Entry:\n");
-			printf("Namespace Management CDW10: %u\n",
-				le32_to_cpu(ns_event->nsmgt_cdw10));
-			printf("Namespace Size: %"PRIu64"\n",
-				le64_to_cpu(ns_event->nsze));
-			printf("Namespace Capacity: %"PRIu64"\n",
-				le64_to_cpu(ns_event->nscap));
-			printf("Formatted LBA Size: %u\n", ns_event->flbas);
-			printf("End-to-end Data Protection Type Settings: %u\n",
-				ns_event->dps);
-			printf("Namespace Multi-path I/O and Namespace Sharing" \
-				" Capabilities: %u\n", ns_event->nmic);
-			printf("ANA Group Identifier: %u\n",
-				le32_to_cpu(ns_event->ana_grp_id));
-			printf("NVM Set Identifier: %u\n", le16_to_cpu(ns_event->nvmset_id));
-			printf("Namespace ID: %u\n", le32_to_cpu(ns_event->nsid));
+			pel_change_ns_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_FORMAT_START_EVENT:
-			format_start_event = pevent_log_info + offset;
-			printf("Format NVM Start Event Entry:\n");
-			printf("Namespace Identifier: %u\n",
-				le32_to_cpu(format_start_event->nsid));
-			printf("Format NVM Attributes: %u\n",
-				format_start_event->fna);
-			printf("Format NVM CDW10: %u\n",
-				le32_to_cpu(format_start_event->format_nvm_cdw10));
+			pel_format_start_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_FORMAT_COMPLETION_EVENT:
-			format_cmpln_event = pevent_log_info + offset;
-			printf("Format NVM Completion Event Entry:\n");
-			printf("Namespace Identifier: %u\n",
-				le32_to_cpu(format_cmpln_event->nsid));
-			printf("Smallest Format Progress Indicator: %u\n",
-				format_cmpln_event->smallest_fpi);
-			printf("Format NVM Status: %u\n",
-				format_cmpln_event->format_nvm_status);
-			printf("Completion Information: %u\n",
-				le16_to_cpu(format_cmpln_event->compln_info));
-			printf("Status Field: %u\n",
-				le32_to_cpu(format_cmpln_event->status_field));
+			pel_format_completion_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_SANITIZE_START_EVENT:
-			sanitize_start_event = pevent_log_info + offset;
-			printf("Sanitize Start Event Entry:\n");
-			printf("SANICAP: %u\n", sanitize_start_event->sani_cap);
-			printf("Sanitize CDW10: %u\n",
-				le32_to_cpu(sanitize_start_event->sani_cdw10));
-			printf("Sanitize CDW11: %u\n",
-				le32_to_cpu(sanitize_start_event->sani_cdw11));
+			pel_sanitize_start_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_SANITIZE_COMPLETION_EVENT:
-			sanitize_cmpln_event = pevent_log_info + offset;
-			printf("Sanitize Completion Event Entry:\n");
-			printf("Sanitize Progress: %u\n",
-				le16_to_cpu(sanitize_cmpln_event->sani_prog));
-			printf("Sanitize Status: %u\n",
-				le16_to_cpu(sanitize_cmpln_event->sani_status));
-			printf("Completion Information: %u\n",
-				le16_to_cpu(sanitize_cmpln_event->cmpln_info));
+			pel_sanitize_completion_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_SET_FEATURE_EVENT:
-			set_feat_event = pevent_log_info + offset;
-			printf("Set Feature Event Entry:\n");
-			dword_cnt = NVME_SET_FEAT_EVENT_DW_COUNT(set_feat_event->layout);
-			fid = NVME_GET(le32_to_cpu(set_feat_event->cdw_mem[0]), FEATURES_CDW10_FID);
-			cdw11 = le32_to_cpu(set_feat_event->cdw_mem[1]);
-
-			printf("Set Feature ID  :%#02x (%s),  value:%#08x\n", fid,
-				nvme_feature_to_string(fid), cdw11);
-			if (NVME_SET_FEAT_EVENT_MB_COUNT(set_feat_event->layout)) {
-				mem_buf = (unsigned char *)set_feat_event + 4 + dword_cnt * 4;
-				if (fid == NVME_FEAT_FID_FDP_EVENTS) {
-					cdw12 = le32_to_cpu(set_feat_event->cdw_mem[2]);
-					stdout_persistent_event_log_fdp_events(cdw11, cdw12,
-									       mem_buf);
-				} else
-					stdout_feature_show_fields(fid, cdw11, mem_buf);
-			}
+			pel_set_feature_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_TELEMETRY_CRT:
 			d(pevent_log_info + offset, 512, 16, 1);
 			break;
 		case NVME_PEL_THERMAL_EXCURSION_EVENT:
-			thermal_exc_event = pevent_log_info + offset;
-			printf("Thermal Excursion Event Entry:\n");
-			printf("Over Temperature: %u\n", thermal_exc_event->over_temp);
-			printf("Threshold: %u\n", thermal_exc_event->threshold);
+			pel_thermal_excursion_event(pevent_log_info, offset);
 			break;
 		case NVME_PEL_SANITIZE_MEDIA_VERIF_EVENT:
 			printf("Sanitize Media Verification Event\n");
@@ -1139,7 +1175,7 @@ static void stdout_registers_cap(struct nvme_bar_cap *cap)
 	printf("\tDoorbell Stride                   (DSTRD): %u bytes\n", 1 << (2 + cap->dstrd));
 	printf("\tTimeout                              (TO): %u ms\n", cap->to * 500);
 	printf("\tArbitration Mechanism Supported     (AMS): Weighted Round Robin with Urgent Priority Class is %s\n",
-	       cap->ams & 0x02 ? "Supported" : "Not supported");
+	       cap->ams & 0x01 ? "Supported" : "Not supported");
 	printf("\tContiguous Queues Required          (CQR): %s\n", cap->cqr ? "Yes" : "No");
 	printf("\tMaximum Queue Entries Supported    (MQES): %u\n\n", cap->mqes + 1);
 }
@@ -1691,29 +1727,38 @@ static void stdout_id_ctrl_cmic(__u8 cmic)
 static void stdout_id_ctrl_oaes(__le32 ctrl_oaes)
 {
 	__u32 oaes = le32_to_cpu(ctrl_oaes);
-	__u32 disc = (oaes & NVME_CTRL_OAES_DL) >> 31;
-	__u32 rsvd0 = (oaes & 0x70000000) >> 28;
-	__u32 zicn = (oaes & NVME_CTRL_OAES_ZD) >> 27;
-	__u32 rsvd1 = (oaes & 0x7fe0000) >> 17;
-	__u32 tthr = (oaes & 0x10000) >> 16;
+	__u32 dlpcn = (oaes & NVME_CTRL_OAES_DL) >> 31;
+	__u32 rsvd28 = (oaes & 0x70000000) >> 28;
+	__u32 zdcn = (oaes & NVME_CTRL_OAES_ZD) >> 27;
+	__u32 rsvd20 = (oaes & 0x7fe0000) >> 20;
+	__u32 ansan = (oaes & NVME_CTRL_OAES_ANSAN) >> 19;
+	__u32 rsvd18 = (oaes >> 18) & 0x1;
+	__u32 rgcns = (oaes & NVME_CTRL_OAES_RGCNS) >> 17;
+	__u32 tthr = (oaes & NVME_CTRL_OAES_TTH) >> 16;
 	__u32 normal_shn = (oaes & NVME_CTRL_OAES_NS) >> 15;
 	__u32 egealpcn = (oaes & NVME_CTRL_OAES_EGE) >> 14;
 	__u32 lbasin = (oaes & NVME_CTRL_OAES_LBAS) >> 13;
 	__u32 plealcn = (oaes & NVME_CTRL_OAES_PLEA) >> 12;
 	__u32 anacn = (oaes & NVME_CTRL_OAES_ANA) >> 11;
-	__u32 rsvd2 = (oaes >> 10) & 0x1;
+	__u32 rsvd10 = (oaes >> 10) & 0x1;
 	__u32 fan = (oaes & NVME_CTRL_OAES_FA) >> 9;
 	__u32 nace = (oaes & NVME_CTRL_OAES_NA) >> 8;
-	__u32 rsvd3 = oaes & 0xFF;
+	__u32 rsvd0 = oaes & 0xFF;
 
 	printf("  [31:31] : %#x\tDiscovery Log Change Notice %sSupported\n",
-			disc, disc ? "" : "Not ");
-	if (rsvd0)
-		printf("  [30:28] : %#x\tReserved\n", rsvd0);
+			dlpcn, dlpcn ? "" : "Not ");
+	if (rsvd28)
+		printf("  [30:28] : %#x\tReserved\n", rsvd28);
 	printf("  [27:27] : %#x\tZone Descriptor Changed Notices %sSupported\n",
-			zicn, zicn ? "" : "Not ");
-	if (rsvd1)
-		printf("  [26:17] : %#x\tReserved\n", rsvd1);
+			zdcn, zdcn ? "" : "Not ");
+	if (rsvd20)
+		printf("  [26:20] : %#x\tReserved\n", rsvd20);
+	printf("  [19:19] : %#x\tAllocated Namespace Attribute Notices %sSupported\n",
+			ansan, ansan ? "" : "Not ");
+	if (rsvd18)
+		printf("  [18:18] : %#x\tReserved\n", rsvd18);
+	printf("  [17:17] : %#x\tReachability Groups Change Notices %sSupported\n",
+			rgcns, rgcns ? "" : "Not ");
 	printf("  [16:16] : %#x\tTemperature Threshold Hysteresis Recovery %sSupported\n",
 		tthr, tthr ? "" : "Not ");
 	printf("  [15:15] : %#x\tNormal NSS Shutdown Event %sSupported\n",
@@ -1728,14 +1773,14 @@ static void stdout_id_ctrl_oaes(__le32 ctrl_oaes)
 			plealcn, plealcn ? "" : "Not ");
 	printf("  [11:11] : %#x\tAsymmetric Namespace Access Change Notices"\
 			" %sSupported\n", anacn, anacn ? "" : "Not ");
-	if (rsvd2)
-		printf("  [10:10] : %#x\tReserved\n", rsvd2);
+	if (rsvd10)
+		printf("  [10:10] : %#x\tReserved\n", rsvd10);
 	printf("  [9:9] : %#x\tFirmware Activation Notices %sSupported\n",
 		fan, fan ? "" : "Not ");
 	printf("  [8:8] : %#x\tNamespace Attribute Changed Event %sSupported\n",
 		nace, nace ? "" : "Not ");
-	if (rsvd3)
-		printf("  [7:0] : %#x\tReserved\n", rsvd3);
+	if (rsvd0)
+		printf("  [7:0] : %#x\tReserved\n", rsvd0);
 	printf("\n");
 }
 
@@ -1743,33 +1788,33 @@ static void stdout_id_ctrl_ctratt(__le32 ctrl_ctratt)
 {
 	__u32 ctratt = le32_to_cpu(ctrl_ctratt);
 	__u32 rsvd20 = (ctratt >> 20);
-	__u32 fdps = (ctratt >> 19) & 0x1;
-	__u32 rsvd18 = (ctratt >> 18) & 0x1;
-	__u32 hmbr = (ctratt >> 17) & 0x1;
-	__u32 mem = (ctratt >> 16) & 0x1;
-	__u32 elbas = (ctratt >> 15) & 0x1;
-	__u32 delnvmset = (ctratt >> 14) & 0x1;
-	__u32 delegrp = (ctratt >> 13) & 0x1;
-	__u32 vcap = (ctratt >> 12) & 0x1;
-	__u32 fcap = (ctratt >> 11) & 0x1;
-	__u32 mds = (ctratt >> 10) & 0x1;
-	__u32 hostid128 = (ctratt & NVME_CTRL_CTRATT_128_ID) >> 0;
-	__u32 psp = (ctratt & NVME_CTRL_CTRATT_NON_OP_PSP) >> 1;
-	__u32 sets = (ctratt & NVME_CTRL_CTRATT_NVM_SETS) >> 2;
-	__u32 rrl = (ctratt & NVME_CTRL_CTRATT_READ_RECV_LVLS) >> 3;
-	__u32 eg = (ctratt & NVME_CTRL_CTRATT_ENDURANCE_GROUPS) >> 4;
-	__u32 iod = (ctratt & NVME_CTRL_CTRATT_PREDICTABLE_LAT) >> 5;
-	__u32 tbkas = (ctratt & NVME_CTRL_CTRATT_TBKAS) >> 6;
-	__u32 ng = (ctratt & NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY) >> 7;
+	__u32 fdps = (ctratt & NVME_CTRL_CTRATT_FDPS) >> 19;
+	__u32 rhii = (ctratt & NVME_CTRL_CTRATT_RHII) >> 18;
+	__u32 hmbr = (ctratt & NVME_CTRL_CTRATT_HMBR) >> 17;
+	__u32 mem = (ctratt & NVME_CTRL_CTRATT_MEM) >> 16;
+	__u32 elbas = (ctratt & NVME_CTRL_CTRATT_ELBAS) >> 15;
+	__u32 dnvms = (ctratt & NVME_CTRL_CTRATT_DEL_NVM_SETS) >> 14;
+	__u32 deg = (ctratt & NVME_CTRL_CTRATT_DEL_ENDURANCE_GROUPS) >> 13;
+	__u32 vcm = (ctratt & NVME_CTRL_CTRATT_VARIABLE_CAP) >> 12;
+	__u32 fcm = (ctratt & NVME_CTRL_CTRATT_FIXED_CAP) >> 11;
+	__u32 mds = (ctratt & NVME_CTRL_CTRATT_MDS) >> 10;
+	__u32 ulist = (ctratt & NVME_CTRL_CTRATT_UUID_LIST) >> 9;
 	__u32 sqa = (ctratt & NVME_CTRL_CTRATT_SQ_ASSOCIATIONS) >> 8;
-	__u32 uuidlist = (ctratt & NVME_CTRL_CTRATT_UUID_LIST) >> 9;
+	__u32 ng = (ctratt & NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY) >> 7;
+	__u32 tbkas = (ctratt & NVME_CTRL_CTRATT_TBKAS) >> 6;
+	__u32 plm = (ctratt & NVME_CTRL_CTRATT_PREDICTABLE_LAT) >> 5;
+	__u32 egs = (ctratt & NVME_CTRL_CTRATT_ENDURANCE_GROUPS) >> 4;
+	__u32 rrlvls = (ctratt & NVME_CTRL_CTRATT_READ_RECV_LVLS) >> 3;
+	__u32 nsets = (ctratt & NVME_CTRL_CTRATT_NVM_SETS) >> 2;
+	__u32 nopspm = (ctratt & NVME_CTRL_CTRATT_NON_OP_PSP) >> 1;
+	__u32 hids = (ctratt & NVME_CTRL_CTRATT_128_ID) >> 0;
 
 	if (rsvd20)
 		printf(" [31:20] : %#x\tReserved\n", rsvd20);
 	printf("  [19:19] : %#x\tFlexible Data Placement %sSupported\n",
 		fdps, fdps ? "" : "Not ");
-	if (rsvd18)
-		printf("  [18:18] : %#x\tReserved\n", rsvd18);
+	printf("  [18:18] : %#x\tReservations and Host Identifier Interaction %sSupported\n",
+		rhii, rhii ? "" : "Not ");
 	printf("  [17:17] : %#x\tHMB Restrict Non-Operational Power State Access %sSupported\n",
 		hmbr, hmbr ? "" : "Not ");
 	printf("  [16:16] : %#x\tMDTS and Size Limits Exclude Metadata %sSupported\n",
@@ -1777,17 +1822,17 @@ static void stdout_id_ctrl_ctratt(__le32 ctrl_ctratt)
 	printf("  [15:15] : %#x\tExtended LBA Formats %sSupported\n",
 		elbas, elbas ? "" : "Not ");
 	printf("  [14:14] : %#x\tDelete NVM Set %sSupported\n",
-		delnvmset, delnvmset ? "" : "Not ");
+		dnvms, dnvms ? "" : "Not ");
 	printf("  [13:13] : %#x\tDelete Endurance Group %sSupported\n",
-		delegrp, delegrp ? "" : "Not ");
+		deg, deg ? "" : "Not ");
 	printf("  [12:12] : %#x\tVariable Capacity Management %sSupported\n",
-		vcap, vcap ? "" : "Not ");
+		vcm, vcm ? "" : "Not ");
 	printf("  [11:11] : %#x\tFixed Capacity Management %sSupported\n",
-		fcap, fcap ? "" : "Not ");
+		fcm, fcm ? "" : "Not ");
 	printf("  [10:10] : %#x\tMulti Domain Subsystem %sSupported\n",
 		mds, mds ? "" : "Not ");
 	printf("  [9:9] : %#x\tUUID List %sSupported\n",
-		uuidlist, uuidlist ? "" : "Not ");
+		ulist, ulist ? "" : "Not ");
 	printf("  [8:8] : %#x\tSQ Associations %sSupported\n",
 		sqa, sqa ? "" : "Not ");
 	printf("  [7:7] : %#x\tNamespace Granularity %sSupported\n",
@@ -1795,17 +1840,70 @@ static void stdout_id_ctrl_ctratt(__le32 ctrl_ctratt)
 	printf("  [6:6] : %#x\tTraffic Based Keep Alive %sSupported\n",
 		tbkas, tbkas ? "" : "Not ");
 	printf("  [5:5] : %#x\tPredictable Latency Mode %sSupported\n",
-		iod, iod ? "" : "Not ");
+		plm, plm ? "" : "Not ");
 	printf("  [4:4] : %#x\tEndurance Groups %sSupported\n",
-		eg, eg ? "" : "Not ");
+		egs, egs ? "" : "Not ");
 	printf("  [3:3] : %#x\tRead Recovery Levels %sSupported\n",
-		rrl, rrl ? "" : "Not ");
+		rrlvls, rrlvls ? "" : "Not ");
 	printf("  [2:2] : %#x\tNVM Sets %sSupported\n",
-		sets, sets ? "" : "Not ");
+		nsets, nsets ? "" : "Not ");
 	printf("  [1:1] : %#x\tNon-Operational Power State Permissive %sSupported\n",
-		psp, psp ? "" : "Not ");
+		nopspm, nopspm ? "" : "Not ");
 	printf("  [0:0] : %#x\t128-bit Host Identifier %sSupported\n",
-		hostid128, hostid128 ? "" : "Not ");
+		hids, hids ? "" : "Not ");
+	printf("\n");
+}
+
+static void stdout_id_ctrl_bpcap(__u8 ctrl_bpcap)
+{
+	__u8 rsvd3 = (ctrl_bpcap >> 3);
+	__u8 sfbpwps = NVME_GET(ctrl_bpcap, CTRL_BACAP_SFBPWPS);
+	__u8 rpmbbpwps = NVME_GET(ctrl_bpcap, CTRL_BACAP_RPMBBPWPS);
+	static const char * const rpmbbpwps_def[] = {
+		"Support Not Specified",
+		"Not Supported",
+		"Supported"
+	};
+
+	if (rsvd3)
+		printf(" [7:3] : %#x\tReserved\n", rsvd3);
+
+	printf("  [2:2] : %#x\tSet Features Boot Partition Write Protection %sSupported\n",
+		sfbpwps, sfbpwps ? "" : "Not ");
+	printf("  [1:0] : %#x\tRPMB Boot Partition Write Protection %s\n",
+		rpmbbpwps, rpmbbpwps_def[rpmbbpwps]);
+	printf("\n");
+}
+
+static void stdout_id_ctrl_plsi(__u8 ctrl_plsi)
+{
+	__u8 rsvd2 = (ctrl_plsi >> 2);
+	__u8 plsfq = NVME_GET(ctrl_plsi, CTRL_PLSI_PLSFQ);
+	__u8 plsepf = NVME_GET(ctrl_plsi, CTRL_PLSI_PLSEPF);
+
+	if (rsvd2)
+		printf(" [7:2] : %#x\tReserved\n", rsvd2);
+
+	printf("  [1:1] : %#x\tPower Loss Signaling with Forced Quiescence %sSupported\n",
+		plsfq, plsfq ? "" : "Not ");
+	printf("  [0:0] : %#x\tPower Loss Signaling with Emergency Power Fail %sSupported\n",
+		plsepf, plsepf ? "" : "Not ");
+	printf("\n");
+}
+
+static void stdout_id_ctrl_crcap(__u8 ctrl_crcap)
+{
+	__u8 rsvd2 = (ctrl_crcap >> 2);
+	__u8 rgidc = NVME_GET(ctrl_crcap, CTRL_CRCAP_RGIDC);
+	__u8 rrsup = NVME_GET(ctrl_crcap, CTRL_CRCAP_RRSUP);
+
+	if (rsvd2)
+		printf(" [7:2] : %#x\tReserved\n", rsvd2);
+
+	printf("  [1:1] : %#x\tRGRPID %s while the namespace is attached to any controller.\n",
+		rgidc, rgidc ? "does not change" : "may change");
+	printf("  [0:0] : %#x\tReachability Reporting %sSupported\n",
+		rrsup, rrsup ? "" : "Not ");
 	printf("\n");
 }
 
@@ -1871,21 +1969,24 @@ static void stdout_id_ctrl_mec(__u8 mec)
 static void stdout_id_ctrl_oacs(__le16 ctrl_oacs)
 {
 	__u16 oacs = le16_to_cpu(ctrl_oacs);
-	__u16 rsvd = (oacs & 0xF800) >> 11;
-	__u16 lock = (oacs >> 10) & 0x1;
-	__u16 glbas = (oacs & 0x200) >> 9;
-	__u16 dbc = (oacs & 0x100) >> 8;
-	__u16 vir = (oacs & 0x80) >> 7;
-	__u16 nmi = (oacs & 0x40) >> 6;
-	__u16 dir = (oacs & 0x20) >> 5;
-	__u16 sft = (oacs & 0x10) >> 4;
-	__u16 nsm = (oacs & 0x8) >> 3;
-	__u16 fwc = (oacs & 0x4) >> 2;
-	__u16 fmt = (oacs & 0x2) >> 1;
-	__u16 sec = oacs & 0x1;
+	__u16 rsvd = (oacs & 0xF000) >> 12;
+	__u16 hmlms = (oacs & 0x800) >> 11;
+	__u16 lock = (oacs & NVME_CTRL_OACS_CMD_FEAT_LD) >> 10;
+	__u16 glbas = (oacs & NVME_CTRL_OACS_LBA_STATUS) >> 9;
+	__u16 dbc = (oacs & NVME_CTRL_OACS_DBBUF_CFG) >> 8;
+	__u16 vir = (oacs & NVME_CTRL_OACS_VIRT_MGMT) >> 7;
+	__u16 nmi = (oacs & NVME_CTRL_OACS_NVME_MI) >> 6;
+	__u16 dir = (oacs & NVME_CTRL_OACS_DIRECTIVES) >> 5;
+	__u16 sft = (oacs & NVME_CTRL_OACS_SELF_TEST) >> 4;
+	__u16 nsm = (oacs & NVME_CTRL_OACS_NS_MGMT) >> 3;
+	__u16 fwc = (oacs & NVME_CTRL_OACS_FW) >> 2;
+	__u16 fmt = (oacs & NVME_CTRL_OACS_FORMAT) >> 1;
+	__u16 sec = oacs & NVME_CTRL_OACS_SECURITY;
 
 	if (rsvd)
-		printf(" [15:11] : %#x\tReserved\n", rsvd);
+		printf(" [15:12] : %#x\tReserved\n", rsvd);
+	printf("  [11:11] : %#x\tHost Managed Live Migration %sSupported\n",
+		hmlms, hmlms ? "" : "Not ");
 	printf("  [10:10] : %#x\tLockdown Command and Feature %sSupported\n",
 		lock, lock ? "" : "Not ");
 	printf("  [9:9] : %#x\tGet LBA Status Capability %sSupported\n",
@@ -2043,6 +2144,22 @@ void stdout_id_ctrl_rpmbs(__le32 ctrl_rpmbs)
 	printf("\n");
 }
 
+static void stdout_id_ctrl_dsto(__u8 dsto)
+{
+	__u8 rsvd2 = (dsto & 0xfc) >> 2;
+	__u8 hirs = (dsto & 0x2) >> 1;
+	__u8 sdso = dsto & 0x1;
+
+	if (rsvd2)
+		printf("  [7:2] : %#x\tReserved\n", rsvd2);
+	printf("  [1:1] : %#x\tHost-Initiated Refresh capability %sSupported\n",
+		hirs, hirs ? "" : "Not ");
+	printf("  [0:0] : %#x\tNVM subsystem supports %s at a time\n", sdso,
+		sdso ? "only one device self-test operation in progress" :
+		"one device self-test operation per controller");
+	printf("\n");
+}
+
 static void stdout_id_ctrl_hctma(__le16 ctrl_hctma)
 {
 	__u16 hctma = le16_to_cpu(ctrl_hctma);
@@ -2134,6 +2251,22 @@ static void stdout_id_ctrl_anacap(__u8 anacap)
 	printf("\n");
 }
 
+static void stdout_id_ctrl_kpioc(__u8 ctrl_kpioc)
+{
+	__u8 rsvd2 = (ctrl_kpioc >> 2);
+	__u8 kpiosc = NVME_GET(ctrl_kpioc, CTRL_KPIOC_KPIOSC);
+	__u8 kpios = NVME_GET(ctrl_kpioc, CTRL_KPIOC_KPIOS);
+
+	if (rsvd2)
+		printf(" [7:2] : %#x\tReserved\n", rsvd2);
+
+	printf("  [1:1] : %#x\tKey Per I/O capability %s to all namespaces\n",
+		kpiosc, kpiosc ? "applies" : "Not apply");
+	printf("  [0:0] : %#x\tKey Per I/O capability %sSupported\n",
+		kpios, kpios ? "" : "Not ");
+	printf("\n");
+}
+
 static void stdout_id_ctrl_tmpthha(__u8 tmpthha)
 {
 	__u8 rsvd3 = (tmpthha & 0xf8) >> 3;
@@ -2169,7 +2302,9 @@ static void stdout_id_ctrl_cqes(__u8 cqes)
 static void stdout_id_ctrl_oncs(__le16 ctrl_oncs)
 {
 	__u16 oncs = le16_to_cpu(ctrl_oncs);
-	__u16 rsvd = oncs >> 11;
+	__u16 rsvd13 = oncs >> 13;
+	bool nszs = !!(oncs & NVME_CTRL_ONCS_NAMESPACE_ZEROES);
+	bool maxwzd = !!(oncs & NVME_CTRL_ONCS_WRITE_ZEROES_DEALLOCATE);
 	bool afc  = !!(oncs & NVME_CTRL_ONCS_ALL_FAST_COPY);
 	bool csa  = !!(oncs & NVME_CTRL_ONCS_COPY_SINGLE_ATOMICITY);
 	bool copy = !!(oncs & NVME_CTRL_ONCS_COPY);
@@ -2182,8 +2317,12 @@ static void stdout_id_ctrl_oncs(__le16 ctrl_oncs)
 	bool wunc = !!(oncs & NVME_CTRL_ONCS_WRITE_UNCORRECTABLE);
 	bool cmp  = !!(oncs & NVME_CTRL_ONCS_COMPARE);
 
-	if (rsvd)
-		printf(" [15:11] : %#x\tReserved\n", rsvd);
+	if (rsvd13)
+		printf("  [15:13] : %#x\tReserved\n", rsvd13);
+	printf("  [12:12] : %#x\tNamespace Zeroes %sSupported\n",
+		nszs, nszs ? "" : "Not ");
+	printf("  [11:11] : %#x\tMaximum Write Zeroes with Deallocate %sSupported\n",
+		maxwzd, maxwzd ? "" : "Not ");
 	printf("  [10:10] : %#x\tAll Fast Copy %sSupported\n",
 		afc, afc ? "" : "Not ");
 	printf("  [9:9] : %#x\tCopy Single Atomicity %sSupported\n",
@@ -2366,6 +2505,24 @@ static void stdout_id_ctrl_sgls(__le32 ctrl_sgls)
 	printf("\n");
 }
 
+static void stdout_id_ctrl_trattr(__u8 ctrl_trattr)
+{
+	__u8 rsvd3 = (ctrl_trattr >> 3);
+	__u8 mrtll = NVME_GET(ctrl_trattr, CTRL_TRATTR_MRTLL);
+	__u8 tudcs = NVME_GET(ctrl_trattr, CTRL_TRATTR_TUDCS);
+	__u8 thmcs = NVME_GET(ctrl_trattr, CTRL_TRATTR_THMCS);
+
+	if (rsvd3)
+		printf(" [7:3] : %#x\tReserved\n", rsvd3);
+
+	printf("  [2:2] : %#x\tMemory Range Tracking Length Limit\n", mrtll);
+	printf("  [1:1] : %#x\tTracking User Data Changes %sSupported\n",
+		tudcs, tudcs ? "" : "Not ");
+	printf("  [0:0] : %#x\tTrack Host Memory Changes %sSupported\n",
+		thmcs, thmcs ? "" : "Not ");
+	printf("\n");
+}
+
 static void stdout_id_ctrl_fcatt(__u8 fcatt)
 {
 	__u8 rsvd = (fcatt & 0xFE) >> 1;
@@ -2391,17 +2548,30 @@ static void stdout_id_ctrl_ofcs(__le16 ofcs)
 
 }
 
+static void stdout_id_ns_size(uint64_t nsze, uint64_t ncap, uint64_t nuse)
+{
+	printf("nsze    : %#"PRIx64"\tTotal size in logical blocks\n",
+			le64_to_cpu(nsze));
+	printf("ncap    : %#"PRIx64"\tMaximum size in logical blocks\n",
+			le64_to_cpu(ncap));
+	printf("nuse    : %#"PRIx64"\tCurrent size in logical blocks\n",
+			le64_to_cpu(nuse));
+}
+
 static void stdout_id_ns_nsfeat(__u8 nsfeat)
 {
-	__u8 rsvd = (nsfeat & 0xC0) >> 6;
+	__u8 optrperf = (nsfeat & 0x80) >> 7;
+	__u8 mam = (nsfeat & 0x40) >> 6;
 	__u8 optperf = (nsfeat & 0x30) >> 4;
 	__u8 uidreuse = (nsfeat & 0x8) >> 3;
 	__u8 dulbe = (nsfeat & 0x4) >> 2;
 	__u8 na = (nsfeat & 0x2) >> 1;
 	__u8 thin = nsfeat & 0x1;
 
-	if (rsvd)
-		printf("  [7:6] : %#x\tReserved\n", rsvd);
+	printf("  [7:7] : %#x\tNPRG, NPRA and NORS are %sSupported\n",
+		optrperf, optrperf ? "" : "Not ");
+	printf("  [6:6] : %#x\t%s Atomicity Mode applies to write operations\n",
+		mam, mam ? "Multiple" : "Single");
 	printf("  [5:4] : %#x\tNPWG, NPWA, %s%sNPDA, and NOWS are %sSupported\n",
 		optperf, ((optperf & 0x1) || (!optperf)) ? "NPDG, " : "",
 		((optperf & 0x2) || (!optperf)) ? "NPDGL, " : "", optperf ? "" : "Not ");
@@ -2493,13 +2663,16 @@ static void stdout_id_ns_dps(__u8 dps)
 
 static void stdout_id_ns_nmic(__u8 nmic)
 {
-	__u8 rsvd = (nmic & 0xFE) >> 1;
-	__u8 mp = nmic & 0x1;
+	__u8 rsvd = (nmic & 0xfc) >> 2;
+	__u8 disns = (nmic & 0x2) >> 1;
+	__u8 shrns = nmic & 0x1;
 
 	if (rsvd)
-		printf("  [7:1] : %#x\tReserved\n", rsvd);
+		printf("  [7:2] : %#x\tReserved\n", rsvd);
+	printf("  [1:1] : %#x\tNamespace is %sa Dispersed Namespace\n",
+		disns, disns ? "" : "Not ");
 	printf("  [0:0] : %#x\tNamespace Multipath %sCapable\n",
-		mp, mp ? "" : "Not ");
+		shrns, shrns ? "" : "Not ");
 	printf("\n");
 }
 
@@ -2578,6 +2751,21 @@ static void stdout_id_ns_dlfeat(__u8 dlfeat)
 	printf("\n");
 }
 
+static void stdout_id_ns_kpios(__u8 kpios)
+{
+	__u8 rsvd = (kpios & 0xfc) >> 2;
+	__u8 kpiosns = (kpios & 0x2) >> 1;
+	__u8 kpioens = kpios & 0x1;
+
+	if (rsvd)
+		printf("  [7:2] : %#x\tReserved\n", rsvd);
+	printf("  [1:1] : %#x\tKey Per I/O Capability %sSupported\n",
+		kpiosns, kpiosns ? "" : "Not ");
+	printf("  [0:0] : %#x\tKey Per I/O Capability %s\n", kpioens,
+		kpioens ? "Enabled" : "Disabled");
+	printf("\n");
+}
+
 static void stdout_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
 			 unsigned int lba_index, bool cap_only)
 {
@@ -2589,9 +2777,15 @@ static void stdout_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
 
 	if (!cap_only) {
 		printf("NVME Identify Namespace %d:\n", nsid);
-		printf("nsze    : %#"PRIx64"\n", le64_to_cpu(ns->nsze));
-		printf("ncap    : %#"PRIx64"\n", le64_to_cpu(ns->ncap));
-		printf("nuse    : %#"PRIx64"\n", le64_to_cpu(ns->nuse));
+
+		if (human)
+			stdout_id_ns_size(ns->nsze, ns->ncap, ns->nuse);
+		else {
+			printf("nsze    : %#"PRIx64"\n", le64_to_cpu(ns->nsze));
+			printf("ncap    : %#"PRIx64"\n", le64_to_cpu(ns->ncap));
+			printf("nuse    : %#"PRIx64"\n", le64_to_cpu(ns->nuse));
+		}
+
 		printf("nsfeat  : %#x\n", ns->nsfeat);
 		if (human)
 			stdout_id_ns_nsfeat(ns->nsfeat);
@@ -2648,11 +2842,17 @@ static void stdout_id_ns(struct nvme_id_ns *ns, unsigned int nsid,
 		printf("mssrl   : %u\n", le16_to_cpu(ns->mssrl));
 		printf("mcl     : %u\n", le32_to_cpu(ns->mcl));
 		printf("msrc    : %u\n", ns->msrc);
+		printf("kpios   : %u\n", ns->kpios);
+		if (human)
+			stdout_id_ns_kpios(ns->kpios);
 	}
 	printf("nulbaf  : %u\n", ns->nulbaf);
 	if (!cap_only) {
+		printf("kpiodaag: %u\n", le32_to_cpu(ns->kpiodaag));
 		printf("anagrpid: %u\n", le32_to_cpu(ns->anagrpid));
 		printf("nsattr	: %u\n", ns->nsattr);
+		if (human)
+			stdout_id_ns_nsattr(ns->nsattr);
 		printf("nvmsetid: %d\n", le16_to_cpu(ns->nvmsetid));
 		printf("endgid  : %d\n", le16_to_cpu(ns->endgid));
 
@@ -2866,6 +3066,27 @@ static void print_ps_power_and_scale(__le16 ctr_power, __u8 scale)
 	}
 }
 
+static void print_psd_time(const char *desc, __u8 time, __u8 ts)
+{
+	int width = 12 + strlen(desc);
+	char value[STR_LEN] = { 0 };
+
+	switch (time) {
+	case 0:
+		snprintf(value, sizeof(value), "-");
+		break;
+	case 1 ... 99:
+		snprintf(value, sizeof(value), "%d (unit: %s)", time,
+			 nvme_time_scale_to_string(ts));
+		break;
+	default:
+		snprintf(value, sizeof(value), "reserved");
+		break;
+	}
+
+	printf("%*s: %s\n", width, desc, value);
+}
+
 static void stdout_id_ctrl_power(struct nvme_id_ctrl *ctrl)
 {
 	int i;
@@ -2897,7 +3118,12 @@ static void stdout_id_ctrl_power(struct nvme_id_ctrl *ctrl)
 		printf("\n            active_power_workload:");
 		print_psd_workload(ctrl->psd[i].apws);
 		printf("\n");
-
+		print_psd_time("emergency power fail recovery time", ctrl->psd[i].epfrt,
+			       ctrl->psd[i].epfr_fqv_ts & 0xf);
+		print_psd_time("forced quiescence vault time", ctrl->psd[i].fqvt,
+			       ctrl->psd[i].epfr_fqv_ts >> 4);
+		print_psd_time("emergency power fail vault time", ctrl->psd[i].epfvt,
+			       ctrl->psd[i].epfvts & 0xf);
 	}
 }
 
@@ -2930,6 +3156,13 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl,
 	if (human)
 		stdout_id_ctrl_ctratt(ctrl->ctratt);
 	printf("rrls      : %#x\n", le16_to_cpu(ctrl->rrls));
+	printf("bpcap     : %#x\n", le16_to_cpu(ctrl->bpcap));
+	if (human)
+		stdout_id_ctrl_bpcap(ctrl->bpcap);
+	printf("nssl      : %#x\n", le32_to_cpu(ctrl->nssl));
+	printf("plsi      : %u\n", ctrl->plsi);
+	if (human)
+		stdout_id_ctrl_plsi(ctrl->plsi);
 	printf("cntrltype : %d\n", ctrl->cntrltype);
 	if (human)
 		stdout_id_ctrl_cntrltype(ctrl->cntrltype);
@@ -2937,6 +3170,9 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl,
 	printf("crdt1     : %u\n", le16_to_cpu(ctrl->crdt1));
 	printf("crdt2     : %u\n", le16_to_cpu(ctrl->crdt2));
 	printf("crdt3     : %u\n", le16_to_cpu(ctrl->crdt3));
+	printf("crcap     : %u\n", ctrl->crcap);
+	if (human)
+		stdout_id_ctrl_crcap(ctrl->crcap);
 	printf("nvmsr     : %u\n", ctrl->nvmsr);
 	if (human)
 		stdout_id_ctrl_nvmsr(ctrl->nvmsr);
@@ -2992,6 +3228,8 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl,
 		stdout_id_ctrl_rpmbs(ctrl->rpmbs);
 	printf("edstt     : %d\n", le16_to_cpu(ctrl->edstt));
 	printf("dsto      : %d\n", ctrl->dsto);
+	if (human)
+		stdout_id_ctrl_dsto(ctrl->dsto);
 	printf("fwug      : %d\n", ctrl->fwug);
 	printf("kas       : %d\n", le16_to_cpu(ctrl->kas));
 	printf("hctma     : %#x\n", le16_to_cpu(ctrl->hctma));
@@ -3018,11 +3256,16 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl,
 	printf("nanagrpid : %u\n", le32_to_cpu(ctrl->nanagrpid));
 	printf("pels      : %u\n", le32_to_cpu(ctrl->pels));
 	printf("domainid  : %d\n", le16_to_cpu(ctrl->domainid));
+	printf("kpioc     : %u\n", ctrl->kpioc);
+	if (human)
+		stdout_id_ctrl_kpioc(ctrl->kpioc);
+	printf("mptfawr   : %d\n", le16_to_cpu(ctrl->mptfawr));
 	printf("megcap    : %s\n",
 		uint128_t_to_l10n_string(le128_to_cpu(ctrl->megcap)));
 	printf("tmpthha   : %#x\n", ctrl->tmpthha);
 	if (human)
 		stdout_id_ctrl_tmpthha(ctrl->tmpthha);
+	printf("cqt       : %d\n", le16_to_cpu(ctrl->cqt));
 	printf("sqes      : %#x\n", ctrl->sqes);
 	if (human)
 		stdout_id_ctrl_sqes(ctrl->sqes);
@@ -3063,6 +3306,20 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl,
 		uint128_t_to_l10n_string(le128_to_cpu(ctrl->maxdna)));
 	printf("maxcna    : %u\n", le32_to_cpu(ctrl->maxcna));
 	printf("oaqd      : %u\n", le32_to_cpu(ctrl->oaqd));
+	printf("rhiri     : %d\n", ctrl->rhiri);
+	printf("hirt      : %d\n", ctrl->hirt);
+	printf("cmmrtd    : %d\n", le16_to_cpu(ctrl->cmmrtd));
+	printf("nmmrtd    : %d\n", le16_to_cpu(ctrl->nmmrtd));
+	printf("minmrtg   : %d\n", ctrl->minmrtg);
+	printf("maxmrtg   : %d\n", ctrl->maxmrtg);
+	printf("trattr    : %d\n", ctrl->trattr);
+	if (human)
+		stdout_id_ctrl_trattr(ctrl->trattr);
+	printf("mcudmq    : %d\n", le16_to_cpu(ctrl->mcudmq));
+	printf("mnsudmq   : %d\n", le16_to_cpu(ctrl->mnsudmq));
+	printf("mcmr      : %d\n", le16_to_cpu(ctrl->mcmr));
+	printf("nmcmr     : %d\n", le16_to_cpu(ctrl->nmcmr));
+	printf("mcdqpc    : %d\n", le16_to_cpu(ctrl->mcdqpc));
 	printf("subnqn    : %-.*s\n", (int)sizeof(ctrl->subnqn), ctrl->subnqn);
 	printf("ioccsz    : %u\n", le32_to_cpu(ctrl->ioccsz));
 	printf("iorcsz    : %u\n", le32_to_cpu(ctrl->iorcsz));
@@ -3084,6 +3341,20 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl,
 	}
 }
 
+static void stdout_id_ctrl_nvm_kpiocap(__u8 kpiocap)
+{
+	__u8 rsvd2 = (kpiocap & 0xfc) >> 2;
+	__u8 kpiosc = (kpiocap & 0x2) >> 1;
+	__u8 kpios = kpiocap & 0x1;
+
+	if (rsvd2)
+		printf("  [7:2] : %#x\tReserved\n", rsvd2);
+	printf("  [1:1] : %#x\tKey Per I/O capability enabled and disabled %s in the"
+		"NVM subsystem\n", kpiosc, kpiosc ? "all namespaces" : "each namespace");
+	printf("  [0:0] : %#x\tKey Per I/O capability %sSupported\n", kpios,
+		kpios ? "" : "Not ");
+}
+
 static void stdout_id_ctrl_nvm_aocs(__u16 aocs)
 {
 	__u16 rsvd = (aocs & 0xfffe) >> 1;
@@ -3096,6 +3367,29 @@ static void stdout_id_ctrl_nvm_aocs(__u16 aocs)
 	printf("\n");
 }
 
+static void stdout_id_ctrl_nvm_ver(__u32 ver)
+{
+	printf("  NVM command set specification: %d.%d.%d\n\n", NVME_MAJOR(ver), NVME_MINOR(ver),
+	       NVME_TERTIARY(ver));
+}
+
+static void stdout_id_ctrl_nvm_lbamqf(__u8 lbamqf)
+{
+	printf("  0x%x: ", lbamqf);
+
+	switch (lbamqf) {
+	case NVME_ID_CTRL_NVM_LBAMQF_TYPE_0:
+		printf("LBA Migration Queue Entry Type 0\n\n");
+		break;
+	case NVME_ID_CTRL_NVM_LBAMQF_VENDOR_MIN ... NVME_ID_CTRL_NVM_LBAMQF_VENDOR_MAX:
+		printf("Vendor Specific\n\n");
+		break;
+	default:
+		printf("Reserved\n\n");
+		break;
+	}
+}
+
 static void stdout_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
 {
 	int verbose = stdout_print_ops.flags & VERBOSE;
@@ -3107,9 +3401,19 @@ static void stdout_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
 	printf("dmrl   : %u\n", ctrl_nvm->dmrl);
 	printf("dmrsl  : %u\n", le32_to_cpu(ctrl_nvm->dmrsl));
 	printf("dmsl   : %"PRIu64"\n", le64_to_cpu(ctrl_nvm->dmsl));
+	printf("kpiocap: %u\n", ctrl_nvm->kpiocap);
+	if (verbose)
+		stdout_id_ctrl_nvm_kpiocap(ctrl_nvm->kpiocap);
+	printf("wzdsl  : %u\n", ctrl_nvm->wzdsl);
 	printf("aocs   : %u\n", le16_to_cpu(ctrl_nvm->aocs));
 	if (verbose)
 		stdout_id_ctrl_nvm_aocs(le16_to_cpu(ctrl_nvm->aocs));
+	printf("ver    : 0x%x\n", le32_to_cpu(ctrl_nvm->ver));
+	if (verbose)
+		stdout_id_ctrl_nvm_ver(le32_to_cpu(ctrl_nvm->ver));
+	printf("lbamqf : %u\n", ctrl_nvm->lbamqf);
+	if (verbose)
+		stdout_id_ctrl_nvm_lbamqf(ctrl_nvm->lbamqf);
 }
 
 static void stdout_nvm_id_ns_pic(__u8 pic)
@@ -3357,11 +3661,18 @@ static void stdout_zns_id_ns(struct nvme_zns_id_ns *ns,
 
 static void stdout_list_ns(struct nvme_ns_list *ns_list)
 {
-	int i;
+	int i, verbose = stdout_print_ops.flags & VERBOSE;
 
+	printf("NVME Namespace List:\n");
 	for (i = 0; i < 1024; i++) {
-		if (ns_list->ns[i])
-			printf("[%4u]:%#x\n", i, le32_to_cpu(ns_list->ns[i]));
+		if (ns_list->ns[i]) {
+			if (verbose)
+				printf("Identifier %4u: NSID %#x\n",
+						i, le32_to_cpu(ns_list->ns[i]));
+			else
+				printf("[%4u]:%#x\n",
+						i, le32_to_cpu(ns_list->ns[i]));
+		}
 	}
 }
 
@@ -3643,14 +3954,38 @@ static void stdout_endurance_group_list(struct nvme_id_endurance_group_list *end
 		printf("[%4u]:%#x\n", i, le16_to_cpu(endgrp_list->identifier[i]));
 }
 
+static void stdout_id_iocs_iocsc(__u64 iocsc)
+{
+	__u8 cpncs = NVME_GET(iocsc, IOCS_IOCSC_CPNCS);
+	__u8 slmcs = NVME_GET(iocsc, IOCS_IOCSC_SLMCS);
+	__u8 znscs = NVME_GET(iocsc, IOCS_IOCSC_ZNSCS);
+	__u8 kvcs = NVME_GET(iocsc, IOCS_IOCSC_KVCS);
+	__u8 nvmcs = NVME_GET(iocsc, IOCS_IOCSC_NVMCS);
+
+	printf("  [4:4] : %#x\tComputational Programs Namespace Command Set %sSelected\n",
+		cpncs, cpncs ? "" : "Not ");
+	printf("  [3:3] : %#x\tSubsystem Local Memory Command Set %sSelected\n", slmcs,
+		slmcs ? "" : "Not ");
+	printf("  [2:2] : %#x\tZoned Namespace Command Set %sSelected\n", znscs,
+		znscs ? "" : "Not ");
+	printf("  [1:1] : %#x\tKey Value Command Set %sSelected\n", kvcs, kvcs ? "" : "Not ");
+	printf("  [0:0] : %#x\tNVM Command Set %sSelected\n", nvmcs, nvmcs ? "" : "Not ");
+	printf("\n");
+}
+
 static void stdout_id_iocs(struct nvme_id_iocs *iocs)
 {
+	bool human = stdout_print_ops.flags & VERBOSE;
 	__u16 i;
 
-	for (i = 0; i < ARRAY_SIZE(iocs->iocsc); i++)
-		if (iocs->iocsc[i])
+	for (i = 0; i < ARRAY_SIZE(iocs->iocsc); i++) {
+		if (iocs->iocsc[i]) {
 			printf("I/O Command Set Combination[%u]:%"PRIx64"\n", i,
 				(uint64_t)le64_to_cpu(iocs->iocsc[i]));
+			if (human)
+				stdout_id_iocs_iocsc(le64_to_cpu(iocs->iocsc[i]));
+		}
+	}
 }
 
 static void stdout_error_log(struct nvme_error_log_page *err_log, int entries,
@@ -3767,8 +4102,7 @@ static void stdout_fw_log(struct nvme_firmware_slot *fw_log,
 	}
 }
 
-static void stdout_changed_ns_list_log(struct nvme_ns_list *log,
-				       const char *devname)
+static void stdout_changed_ns_list_log(struct nvme_ns_list *log, const char *devname, bool alloc)
 {
 	__u32 nsid;
 	int i;
@@ -3911,12 +4245,34 @@ static void stdout_support_log_human(__u32 support, __u8 lid)
 {
 	const char *set = "supported";
 	const char *clr = "not supported";
+	__u16 lidsp = support >> 16;
 
 	printf("  LSUPP is %s\n", (support & 0x1) ? set : clr);
 	printf("  IOS is %s\n", ((support >> 0x1) & 0x1) ? set : clr);
-	if (lid == NVME_LOG_LID_PERSISTENT_EVENT) {
+
+	switch (lid) {
+	case NVME_LOG_LID_TELEMETRY_HOST:
+		printf("  Maximum Created Data Area is %s\n",
+			(lidsp & 0x1) ? set : clr);
+		break;
+	case NVME_LOG_LID_PERSISTENT_EVENT:
 		printf("  Establish Context and Read 512 Bytes of Header is %s\n",
-			((support >> 0x16) & 0x1) ? set : clr);
+			(lidsp & 0x1) ? set : clr);
+		break;
+	case NVME_LOG_LID_DISCOVER:
+		printf("  Extended Discovery Log Page Entry is %s\n",
+			(lidsp & 0x1) ? set : clr);
+		printf("  Port Local Entries Only is %s\n",
+			(lidsp & 0x2) ? set : clr);
+		printf("  All NVM Subsystem Entries is %s\n",
+			(lidsp & 0x4) ? set : clr);
+		break;
+	case NVME_LOG_LID_HOST_DISCOVER:
+		printf("  All Host Entries is %s\n",
+			(lidsp & 0x1) ? set : clr);
+		break;
+	default:
+		break;
 	}
 }
 
@@ -4123,6 +4479,9 @@ static void stdout_self_test_result(struct nvme_st_result *res)
 		case NVME_ST_CODE_EXTENDED:
 			printf(" Extended device self-test operation");
 			break;
+		case NVME_ST_CODE_HOST_INIT:
+			printf(" Host-Initiated Refresh operation");
+			break;
 		case NVME_ST_CODE_VS:
 			printf(" Vendor specific");
 			break;
@@ -4187,23 +4546,26 @@ static void stdout_sanitize_log_sprog(__u32 sprog)
 static void stdout_sanitize_log_sstat(__u16 status)
 {
 	const char *str = nvme_sstat_status_to_string(status);
+	__u16 gde, mvcncld;
 
-	printf("\t[2:0]\t%s\n", str);
-	str = "Number of completed passes if most recent operation was overwrite";
-	printf("\t[7:3]\t%s:\t%u\n", str,
-		(status >> NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT) &
-			NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK);
+	printf("  [2:0] : Sanitize Operation Status  : %#x\t%s\n",
+		NVME_GET(status, SANITIZE_SSTAT_STATUS), str);
+	printf("  [7:3] : Overwrite Passes Completed : %u\n",
+		NVME_GET(status, SANITIZE_SSTAT_COMPLETED_PASSES));
 
-	printf("\t  [8]\t");
-	if (status & NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED)
-		str = "Global Data Erased set: no NS LB in the NVM subsystem "\
-			"has been written to and no PMR in the NVM subsystem "\
-			"has been enabled";
+	gde = NVME_GET(status, SANITIZE_SSTAT_GLOBAL_DATA_ERASED);
+	if (gde)
+		str = "No user data has been written in the NVM subsystem and"\
+		       " no PMR has been enabled in the NVM subsystem";
 	else
-		str = "Global Data Erased cleared: a NS LB in the NVM "\
-			"subsystem has been written to or a PMR in the NVM "\
-			"subsystem has been enabled";
-	printf("%s\n", str);
+		str = "User data has been written in the NVM subsystem or"\
+		       " PMR has been enabled in the NVM subsystem";
+	printf("  [8:8] : Global Data Erased         : %#x\t%s\n", gde, str);
+
+	mvcncld = NVME_GET(status, SANITIZE_SSTAT_MVCNCLD);
+	printf("  [9:9] : Media Verification Canceled: %#x\t%scanceled\n",
+		mvcncld, mvcncld ? "" : "Not ");
+	printf("\n");
 }
 
 static void stdout_estimate_sanitize_time(const char *text, uint32_t value)
@@ -4212,6 +4574,23 @@ static void stdout_estimate_sanitize_time(const char *text, uint32_t value)
 		value == 0xffffffff ? " (No time period reported)" : "");
 }
 
+static void stdout_sanitize_log_ssi(__u8 ssi, __u16 status)
+{
+	__u8 sans, fails;
+	const char *str;
+
+	sans = NVME_GET(ssi, SANITIZE_SSI_SANS);
+	str = nvme_ssi_state_to_string(sans);
+	printf("  [3:0] : Sanitize State : %#x\t%s\n", sans, str);
+
+	if (status == NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED) {
+		fails = NVME_GET(ssi, SANITIZE_SSI_FAILS);
+		str = nvme_ssi_state_to_string(fails);
+		printf("  [7:4] : Failure State  : %#x\t%s\n", fails, str);
+	}
+	printf("\n");
+}
+
 static void stdout_sanitize_log(struct nvme_sanitize_log_page *sanitize,
 				const char *devname)
 {
@@ -4245,6 +4624,12 @@ static void stdout_sanitize_log(struct nvme_sanitize_log_page *sanitize,
 		le32_to_cpu(sanitize->etbend));
 	stdout_estimate_sanitize_time("Estimated Time For Crypto Erase (No-Deallocate)",
 		le32_to_cpu(sanitize->etcend));
+	stdout_estimate_sanitize_time("Estimated Time For Post-Verification Deallocation",
+		le32_to_cpu(sanitize->etpvds));
+
+	printf("Sanitize State Information               (SSI) : %#x\n", sanitize->ssi);
+	if (human)
+		stdout_sanitize_log_ssi(sanitize->ssi, status);
 }
 
 static void stdout_select_result(enum nvme_features_id fid, __u32 result)
@@ -4513,6 +4898,8 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
 				       unsigned int result,
 				       unsigned char *buf)
 {
+	const char *async = "Send async event";
+	const char *no_async = "Do not send async event";
 	__u8 field;
 	uint64_t ull;
 
@@ -4583,23 +4970,41 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
 		break;
 	case NVME_FEAT_FID_ASYNC_EVENT:
 		printf("\tDiscovery Log Page Change Notices                         : %s\n",
-			((result & 0x80000000) >> 31) ? "Send async event" : "Do not send async event");
+			NVME_FEAT_AE_DLPCN(result) ? async : no_async);
+		printf("\tHost Discovery Log Page Change Notification               : %s\n",
+			NVME_FEAT_AE_HDLPCN(result) ? async : no_async);
+		printf("\tAVE Discovery Log Page Change Notification                : %s\n",
+			NVME_FEAT_AE_ADLPCN(result) ? async : no_async);
+		printf("\tPull Model DDC Request Log Page Change Notification       : %s\n",
+			NVME_FEAT_AE_PMDRLPCN(result) ? async : no_async);
+		printf("\tZone Descriptor Changed Notices                           : %s\n",
+			NVME_FEAT_AE_ZDCN(result) ? async : no_async);
+		printf("\tAllocated Namespace Attribute Notices                     : %s\n",
+			NVME_FEAT_AE_ANSAN(result) ? async : no_async);
+		printf("\tReachability Group                                        : %s\n",
+			NVME_FEAT_AE_RGRP0(result) ? async : no_async);
+		printf("\tReachability Association                                  : %s\n",
+			NVME_FEAT_AE_RASSN(result) ? async : no_async);
+		printf("\tTemperature Threshold Hysteresis Recovery                 : %s\n",
+			NVME_FEAT_AE_TTHRY(result) ? async : no_async);
+		printf("\tNormal NVM Subsystem Shutdown                             : %s\n",
+			NVME_FEAT_AE_NNSSHDN(result) ? async : no_async);
 		printf("\tEndurance Group Event Aggregate Log Change Notices        : %s\n",
-		       NVME_FEAT_AE_EGA(result) ? "Send async event" : "Do not send async event");
+		       NVME_FEAT_AE_EGA(result) ? async : no_async);
 		printf("\tLBA Status Information Notices                            : %s\n",
-		       NVME_FEAT_AE_LBAS(result) ? "Send async event" : "Do not send async event");
+		       NVME_FEAT_AE_LBAS(result) ? async : no_async);
 		printf("\tPredictable Latency Event Aggregate Log Change Notices    : %s\n",
-		       NVME_FEAT_AE_PLA(result) ? "Send async event" : "Do not send async event");
+		       NVME_FEAT_AE_PLA(result) ? async : no_async);
 		printf("\tAsymmetric Namespace Access Change Notices                : %s\n",
-		       NVME_FEAT_AE_ANA(result) ? "Send async event" : "Do not send async event");
+		       NVME_FEAT_AE_ANA(result) ? async : no_async);
 		printf("\tTelemetry Log Notices                                     : %s\n",
-		       NVME_FEAT_AE_TELEM(result) ? "Send async event" : "Do not send async event");
+		       NVME_FEAT_AE_TELEM(result) ? async : no_async);
 		printf("\tFirmware Activation Notices                               : %s\n",
-		       NVME_FEAT_AE_FW(result) ? "Send async event" : "Do not send async event");
+		       NVME_FEAT_AE_FW(result) ? async : no_async);
 		printf("\tNamespace Attribute Notices                               : %s\n",
-		       NVME_FEAT_AE_NAN(result) ? "Send async event" : "Do not send async event");
+		       NVME_FEAT_AE_NAN(result) ? async : no_async);
 		printf("\tSMART / Health Critical Warnings                          : %s\n",
-		       NVME_FEAT_AE_SMART(result) ? "Send async event" : "Do not send async event");
+		       NVME_FEAT_AE_SMART(result) ? async : no_async);
 		break;
 	case NVME_FEAT_FID_AUTO_PST:
 		printf("\tAutonomous Power State Transition Enable (APSTE): %s\n",
@@ -4661,10 +5066,14 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
 			       host_behavior->etdas ? "True" : "False");
 			printf("\tLBA Format Extension Enable (LBAFEE): %s\n",
 			       host_behavior->lbafee ? "True" : "False");
-			printf("\tCopy Descriptor Format 2h Enabled (CDFE): %s\n",
+			printf("\tHost Dispersed Namespace Support (HDISNS) : %s\n",
+			       host_behavior->hdisns ? "Enabled" : "Disabled");
+			printf("\tCopy Descriptor Format 2h Enabled (CDF2E) : %s\n",
 			       host_behavior->cdfe & (1 << 2) ? "True" : "False");
-			printf("\tCopy Descriptor Format 3h Enabled (CDFE): %s\n",
+			printf("\tCopy Descriptor Format 3h Enabled (CDF3E) : %s\n",
 			       host_behavior->cdfe & (1 << 3) ? "True" : "False");
+			printf("\tCopy Descriptor Format 4h Enabled (CDF4E) : %s\n",
+			       host_behavior->cdfe & (1 << 4) ? "True" : "False");
 		}
 		break;
 	case NVME_FEAT_FID_SANITIZE:
@@ -4680,6 +5089,10 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
 	case NVME_FEAT_FID_SPINUP_CONTROL:
 		printf("\tSpinup control feature Enabled: %s\n", (result & 1) ? "True" : "False");
 		break;
+	case NVME_FEAT_FID_POWER_LOSS_SIGNAL:
+		printf("\tPower Loss Signaling Mode (PLSM): %s\n",
+		       nvme_pls_mode_to_string(NVME_GET(result, FEAT_PLS_MODE)));
+		break;
 	case NVME_FEAT_FID_ENH_CTRL_METADATA:
 	case NVME_FEAT_FID_CTRL_METADATA:
 	case NVME_FEAT_FID_NS_METADATA:
@@ -5244,6 +5657,216 @@ static void stdout_connect_msg(nvme_ctrl_t c)
 	printf("connecting to device: %s\n", nvme_ctrl_get_name(c));
 }
 
+static void stdout_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list)
+{
+	int i;
+	bool reserved = true;
+
+	printf("Management Address List:\n");
+	for (i = 0; i < ARRAY_SIZE(ma_list->mad); i++) {
+		switch (ma_list->mad[i].mat) {
+		case 1:
+		case 2:
+			printf("Descriptor: %d, Type: %d (%s), Address: %s\n", i,
+			       ma_list->mad[i].mat,
+			       ma_list->mad[i].mat == 1 ? "NVM subsystem management agent" :
+			       "fabric interface manager", ma_list->mad[i].madrs);
+			reserved = false;
+			break;
+		case 0xff:
+			goto out;
+		default:
+			break;
+		}
+	}
+out:
+	if (reserved)
+		printf("All management address descriptors reserved\n");
+}
+
+static void stdout_rotational_media_info_log(struct nvme_rotational_media_info_log *info)
+{
+	printf("endgid: %u\n", le16_to_cpu(info->endgid));
+	printf("numa: %u\n", le16_to_cpu(info->numa));
+	printf("nrs: %u\n", le16_to_cpu(info->nrs));
+	printf("spinc: %u\n", le32_to_cpu(info->spinc));
+	printf("fspinc: %u\n", le32_to_cpu(info->fspinc));
+	printf("ldc: %u\n", le32_to_cpu(info->ldc));
+	printf("fldc: %u\n", le32_to_cpu(info->fldc));
+}
+
+static void stdout_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log)
+{
+	__u64 numpsub = le64_to_cpu(log->numpsub);
+	__u64 i;
+
+	printf("genctr: %"PRIu64"\n", le64_to_cpu(log->genctr));
+	printf("numpsub: %"PRIu64"\n", (uint64_t)numpsub);
+	for (i = 0; i < numpsub; i++)
+		printf("participating_nss %"PRIu64": %-.*s\n", (uint64_t)i, NVME_NQN_LENGTH,
+		       &log->participating_nss[i * NVME_NQN_LENGTH]);
+}
+
+static void stdout_reachability_groups_log(struct nvme_reachability_groups_log *log, __u64 len)
+{
+	__u16 i;
+	__u32 j;
+
+	print_debug("len: %"PRIu64"\n", (uint64_t)len);
+	printf("chngc: %"PRIu64"\n", le64_to_cpu(log->chngc));
+	printf("nrgd: %u\n", le16_to_cpu(log->nrgd));
+
+	for (i = 0; i < le16_to_cpu(log->nrgd); i++) {
+		printf("rgid: %u\n", le32_to_cpu(log->rgd[i].rgid));
+		printf("nnid: %u\n", le32_to_cpu(log->rgd[i].nnid));
+		printf("chngc: %"PRIu64"\n", le64_to_cpu(log->rgd[i].chngc));
+		for (j = 0; j < le32_to_cpu(log->rgd[i].nnid); j++)
+			printf("nsid%u: %u\n", j, le32_to_cpu(log->rgd[i].nsid[j]));
+	}
+}
+
+static void stdout_reachability_associations_log(struct nvme_reachability_associations_log *log,
+						 __u64 len)
+{
+	__u16 i;
+	__u32 j;
+
+	print_debug("len: %"PRIu64"\n", (uint64_t)len);
+	printf("chngc: %"PRIu64"\n", le64_to_cpu(log->chngc));
+	printf("nrad: %u\n", le16_to_cpu(log->nrad));
+
+	for (i = 0; i < le16_to_cpu(log->nrad); i++) {
+		printf("rasid: %u\n", le32_to_cpu(log->rad[i].rasid));
+		printf("nrid: %u\n", le32_to_cpu(log->rad[i].nrid));
+		printf("chngc: %"PRIu64"\n", le64_to_cpu(log->rad[i].chngc));
+		printf("rac: %u\n", log->rad[i].rac);
+		for (j = 0; j < le32_to_cpu(log->rad[i].nrid); j++)
+			printf("rgid%u: %u\n", j, le32_to_cpu(log->rad[i].rgid[j]));
+	}
+}
+
+static void stdout_host_discovery_log(struct nvme_host_discover_log *log)
+{
+	__u32 i;
+	__u16 j;
+	struct nvme_host_ext_discover_log *hedlpe;
+	struct nvmf_ext_attr *exat;
+	__u32 thdlpl = le32_to_cpu(log->thdlpl);
+	__u32 tel;
+	__u16 numexat;
+	int n = 0;
+
+	printf("genctr: %"PRIu64"\n", le64_to_cpu(log->genctr));
+	printf("numrec: %"PRIu64"\n", le64_to_cpu(log->numrec));
+	printf("recfmt: %u\n", le16_to_cpu(log->recfmt));
+	printf("hdlpf: %02x\n", log->hdlpf);
+	printf("thdlpl: %u\n", thdlpl);
+
+	for (i = sizeof(*log); i < le32_to_cpu(log->thdlpl); i += tel) {
+		printf("hedlpe: %d\n", n++);
+		hedlpe = (void *)log + i;
+		tel = le32_to_cpu(hedlpe->tel);
+		numexat = le16_to_cpu(hedlpe->numexat);
+		printf("trtype: %s\n", nvmf_trtype_str(hedlpe->trtype));
+		printf("adrfam: %s\n",
+		       strlen(hedlpe->traddr) ? nvmf_adrfam_str(hedlpe->adrfam) : "");
+		printf("eflags: %s\n", nvmf_eflags_str(le16_to_cpu(hedlpe->eflags)));
+		printf("hostnqn: %s\n", hedlpe->hostnqn);
+		printf("traddr: %s\n", hedlpe->traddr);
+		printf("tsas: ");
+		switch (hedlpe->trtype) {
+		case NVMF_TRTYPE_RDMA:
+			printf("prtype: %s, qptype: %s, cms: %s, pkey: 0x%04x\n",
+			       nvmf_prtype_str(hedlpe->tsas.rdma.prtype),
+			       nvmf_qptype_str(hedlpe->tsas.rdma.qptype),
+			       nvmf_cms_str(hedlpe->tsas.rdma.cms),
+			       le16_to_cpu(hedlpe->tsas.rdma.pkey));
+			break;
+		case NVMF_TRTYPE_TCP:
+			printf("sectype: %s\n", nvmf_sectype_str(hedlpe->tsas.tcp.sectype));
+			break;
+		default:
+			printf("common:\n");
+			d((unsigned char *)hedlpe->tsas.common, sizeof(hedlpe->tsas.common), 16, 1);
+			break;
+		}
+		printf("tel: %u\n", tel);
+		printf("numexat: %u\n", numexat);
+
+		exat = hedlpe->exat;
+		for (j = 0; j < numexat; j++) {
+			printf("exat: %d\n", j);
+			printf("exattype: %u\n", le16_to_cpu(exat->exattype));
+			printf("exatlen: %u\n", le16_to_cpu(exat->exatlen));
+			printf("exatval:\n");
+			d((unsigned char *)exat->exatval, le16_to_cpu(exat->exatlen), 16, 1);
+			exat = nvmf_exat_ptr_next(exat);
+		}
+	}
+}
+
+static void print_traddr(char *field, __u8 adrfam, __u8 *traddr)
+{
+	int af = AF_INET;
+	socklen_t size = INET_ADDRSTRLEN;
+	char dst[INET6_ADDRSTRLEN];
+
+	if (adrfam == NVMF_ADDR_FAMILY_IP6) {
+		af = AF_INET6;
+		size = INET6_ADDRSTRLEN;
+	}
+
+	if (inet_ntop(af, nvmf_adrfam_str(adrfam), dst, size))
+		printf("%s: %s\n", field, dst);
+}
+
+static void stdout_ave_discovery_log(struct nvme_ave_discover_log *log)
+{
+	__u32 i;
+	__u8 j;
+	struct nvme_ave_discover_log_entry *adlpe;
+	struct nvme_ave_tr_record *atr;
+	__u32 tadlpl = le32_to_cpu(log->tadlpl);
+	__u32 tel;
+	__u8 numatr;
+	int n = 0;
+
+	printf("genctr: %"PRIu64"\n", le64_to_cpu(log->genctr));
+	printf("numrec: %"PRIu64"\n", le64_to_cpu(log->numrec));
+	printf("recfmt: %u\n", le16_to_cpu(log->recfmt));
+	printf("tadlpl: %u\n", tadlpl);
+
+	for (i = sizeof(*log); i < le32_to_cpu(log->tadlpl); i += tel) {
+		printf("adlpe: %d\n", n++);
+		adlpe = (void *)log + i;
+		tel = le32_to_cpu(adlpe->tel);
+		numatr = adlpe->numatr;
+		printf("tel: %u\n", tel);
+		printf("avenqn: %s\n", adlpe->avenqn);
+		printf("numatr: %u\n", numatr);
+
+		atr = adlpe->atr;
+		for (j = 0; j < numatr; j++) {
+			printf("atr: %d\n", j);
+			printf("aveadrfam: %s\n", nvmf_adrfam_str(atr->aveadrfam));
+			printf("avetrsvcid: %u\n", le16_to_cpu(atr->avetrsvcid));
+			print_traddr("avetraddr", atr->aveadrfam, atr->avetraddr);
+			atr++;
+		}
+	}
+}
+
+static void stdout_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log)
+{
+	__u32 tpdrpl = le32_to_cpu(log->tpdrpl);
+	__u32 osp_len = tpdrpl - offsetof(struct nvme_pull_model_ddc_req_log, osp);
+
+	printf("ori: %u\n", log->ori);
+	printf("tpdrpl: %u\n", tpdrpl);
+	printf("osp:\n");
+	d((unsigned char *)log->osp, osp_len, 16, 1);
+}
+
 static struct print_ops stdout_print_ops = {
 	/* libnvme types.h print functions */
 	.ana_log			= stdout_ana_log,
@@ -5311,6 +5934,14 @@ static struct print_ops stdout_print_ops = {
 	.d				= stdout_d,
 	.show_init			= NULL,
 	.show_finish			= NULL,
+	.mgmt_addr_list_log		= stdout_mgmt_addr_list_log,
+	.rotational_media_info_log	= stdout_rotational_media_info_log,
+	.dispersed_ns_psub_log		= stdout_dispersed_ns_psub_log,
+	.reachability_groups_log	= stdout_reachability_groups_log,
+	.reachability_associations_log	= stdout_reachability_associations_log,
+	.host_discovery_log		= stdout_host_discovery_log,
+	.ave_discovery_log		= stdout_ave_discovery_log,
+	.pull_model_ddc_req_log		= stdout_pull_model_ddc_req_log,
 
 	/* libnvme tree print functions */
 	.list_item			= stdout_list_item,
diff --git a/nvme-print.c b/nvme-print.c
index 170e5c1..8492225 100644
--- a/nvme-print.c
+++ b/nvme-print.c
@@ -82,12 +82,34 @@ const char *nvme_cmd_to_string(int admin, __u8 opcode)
 		case nvme_admin_virtual_mgmt:	return "Virtualization Management";
 		case nvme_admin_nvme_mi_send:	return "NVMe-MI Send";
 		case nvme_admin_nvme_mi_recv:	return "NVMe-MI Receive";
+		case nvme_admin_capacity_mgmt:	return "Capacity Management";
+		case nvme_admin_discovery_info_mgmt:return "Discovery Information Management (DIM)";
+		case nvme_admin_fabric_zoning_recv:return "Fabric Zoning Receive";
+		case nvme_admin_lockdown:	return "Lockdown";
+		case nvme_admin_fabric_zoning_lookup:return "Fabric Zoning Lookup";
+		case nvme_admin_clear_export_nvm_res:
+						return "Clear Exported NVM Resource Configuration";
+		case nvme_admin_fabric_zoning_send:return "Fabric Zoning Send";
+		case nvme_admin_create_export_nvms:return "Create Exported NVM Subsystem";
+		case nvme_admin_manage_export_nvms:return "Manage Exported NVM Subsystem";
+		case nvme_admin_manage_export_ns:return "Manage Exported Namespace";
+		case nvme_admin_manage_export_port:return "Manage Exported Port";
+		case nvme_admin_send_disc_log_page:return "Send Discovery Log Page";
+		case nvme_admin_track_send:	return "Track Send";
+		case nvme_admin_track_receive:	return "Track Receive";
+		case nvme_admin_migration_send:	return "Migration Send";
+		case nvme_admin_migration_receive:return "Migration Receive";
+		case nvme_admin_ctrl_data_queue:return "Controller Data Queue";
 		case nvme_admin_dbbuf:		return "Doorbell Buffer Config";
+		case nvme_admin_fabrics:	return "Fabrics Commands";
 		case nvme_admin_format_nvm:	return "Format NVM";
 		case nvme_admin_security_send:	return "Security Send";
 		case nvme_admin_security_recv:	return "Security Receive";
 		case nvme_admin_sanitize_nvm:	return "Sanitize";
+		case nvme_admin_load_program:	return "Load Program";
 		case nvme_admin_get_lba_status:	return "Get LBA Status";
+		case nvme_admin_program_act_mgmt:return "Program Activation Management";
+		case nvme_admin_mem_range_set_mgmt:return "Memory Range Set Management";
 		}
 	} else {
 		switch (opcode) {
@@ -718,11 +740,10 @@ void nvme_show_fw_log(struct nvme_firmware_slot *fw_log,
 	nvme_print(fw_log, flags, fw_log, devname);
 }
 
-void nvme_show_changed_ns_list_log(struct nvme_ns_list *log,
-				   const char *devname,
-				   nvme_print_flags_t flags)
+void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, const char *devname,
+				   nvme_print_flags_t flags, bool alloc)
 {
-	nvme_print(ns_list_log, flags, log, devname);
+	nvme_print(ns_list_log, flags, log, devname, alloc);
 }
 
 void nvme_print_effects_log_pages(struct list_head *list,
@@ -756,11 +777,21 @@ const char *nvme_log_to_string(__u8 lid)
 	case NVME_LOG_LID_MI_CMD_SUPPORTED_EFFECTS:	return "NVMe-MI Commands Supported and Effects";
 	case NVME_LOG_LID_CMD_AND_FEAT_LOCKDOWN:	return "Command and Feature Lockdown";
 	case NVME_LOG_LID_BOOT_PARTITION:		return "Boot Partition";
+	case NVME_LOG_LID_ROTATIONAL_MEDIA_INFO:	return "Rotational Media Information";
+	case NVME_LOG_LID_DISPERSED_NS_PARTICIPATING_NSS:return "Dispersed Namespace Participating NVM Subsystems";
+	case NVME_LOG_LID_MGMT_ADDR_LIST:		return "Management Address List";
+	case NVME_LOG_LID_PHY_RX_EOM:			return "Physical Interface Receiver Eye Opening Measurement";
+	case NVME_LOG_LID_REACHABILITY_GROUPS:		return "Reachability Groups";
+	case NVME_LOG_LID_REACHABILITY_ASSOCIATIONS:	return "Reachability Associations";
+	case NVME_LOG_LID_CHANGED_ALLOC_NS_LIST:	return "Changed Allocated Namespace List";
 	case NVME_LOG_LID_FDP_CONFIGS:			return "FDP Configurations";
 	case NVME_LOG_LID_FDP_RUH_USAGE:		return "Reclaim Unit Handle Usage";
 	case NVME_LOG_LID_FDP_STATS:			return "FDP Statistics";
 	case NVME_LOG_LID_FDP_EVENTS:			return "FDP Events";
 	case NVME_LOG_LID_DISCOVER:			return "Discovery";
+	case NVME_LOG_LID_HOST_DISCOVER:		return "Host Discovery";
+	case NVME_LOG_LID_AVE_DISCOVER:			return "AVE Discovery";
+	case NVME_LOG_LID_PULL_MODEL_DDC_REQ:		return "Pull Model DDC Request";
 	case NVME_LOG_LID_RESERVATION:			return "Reservation Notification";
 	case NVME_LOG_LID_SANITIZE:			return "Sanitize Status";
 	case NVME_LOG_LID_ZNS_CHANGED_ZONES:		return "Changed Zone List";
@@ -797,6 +828,10 @@ static bool is_fahrenheit_country(const char *country)
 	return false;
 }
 
+#ifndef LC_MEASUREMENT
+#define LC_MEASUREMENT LC_ALL
+#endif
+
 static bool is_temperature_fahrenheit(void)
 {
 	const char *locale, *underscore;
@@ -861,42 +896,50 @@ void nvme_show_sanitize_log(struct nvme_sanitize_log_page *sanitize,
 const char *nvme_feature_to_string(enum nvme_features_id feature)
 {
 	switch (feature) {
-	case NVME_FEAT_FID_ARBITRATION:	return "Arbitration";
-	case NVME_FEAT_FID_POWER_MGMT:	return "Power Management";
-	case NVME_FEAT_FID_LBA_RANGE:	return "LBA Range Type";
-	case NVME_FEAT_FID_TEMP_THRESH:	return "Temperature Threshold";
-	case NVME_FEAT_FID_ERR_RECOVERY:return "Error Recovery";
-	case NVME_FEAT_FID_VOLATILE_WC:	return "Volatile Write Cache";
-	case NVME_FEAT_FID_NUM_QUEUES:	return "Number of Queues";
-	case NVME_FEAT_FID_IRQ_COALESCE:return "Interrupt Coalescing";
-	case NVME_FEAT_FID_IRQ_CONFIG:	return "Interrupt Vector Configuration";
-	case NVME_FEAT_FID_WRITE_ATOMIC:return "Write Atomicity Normal";
-	case NVME_FEAT_FID_ASYNC_EVENT:	return "Async Event Configuration";
-	case NVME_FEAT_FID_AUTO_PST:	return "Autonomous Power State Transition";
-	case NVME_FEAT_FID_HOST_MEM_BUF:return "Host Memory Buffer";
-	case NVME_FEAT_FID_TIMESTAMP:	return "Timestamp";
-	case NVME_FEAT_FID_KATO:	return "Keep Alive Timer";
-	case NVME_FEAT_FID_HCTM:	return "Host Controlled Thermal Management";
-	case NVME_FEAT_FID_NOPSC:	return "Non-Operational Power State Config";
-	case NVME_FEAT_FID_RRL:		return "Read Recovery Level";
-	case NVME_FEAT_FID_PLM_CONFIG:	return "Predictable Latency Mode Config";
-	case NVME_FEAT_FID_PLM_WINDOW:	return "Predictable Latency Mode Window";
+	case NVME_FEAT_FID_ARBITRATION:		return "Arbitration";
+	case NVME_FEAT_FID_POWER_MGMT:		return "Power Management";
+	case NVME_FEAT_FID_LBA_RANGE:		return "LBA Range Type";
+	case NVME_FEAT_FID_TEMP_THRESH:		return "Temperature Threshold";
+	case NVME_FEAT_FID_ERR_RECOVERY:	return "Error Recovery";
+	case NVME_FEAT_FID_VOLATILE_WC:		return "Volatile Write Cache";
+	case NVME_FEAT_FID_NUM_QUEUES:		return "Number of Queues";
+	case NVME_FEAT_FID_IRQ_COALESCE:	return "Interrupt Coalescing";
+	case NVME_FEAT_FID_IRQ_CONFIG:		return "Interrupt Vector Configuration";
+	case NVME_FEAT_FID_WRITE_ATOMIC:	return "Write Atomicity Normal";
+	case NVME_FEAT_FID_ASYNC_EVENT:		return "Async Event Configuration";
+	case NVME_FEAT_FID_AUTO_PST:		return "Autonomous Power State Transition";
+	case NVME_FEAT_FID_HOST_MEM_BUF:	return "Host Memory Buffer";
+	case NVME_FEAT_FID_TIMESTAMP:		return "Timestamp";
+	case NVME_FEAT_FID_KATO:		return "Keep Alive Timer";
+	case NVME_FEAT_FID_HCTM:		return "Host Controlled Thermal Management";
+	case NVME_FEAT_FID_NOPSC:		return "Non-Operational Power State Config";
+	case NVME_FEAT_FID_RRL:			return "Read Recovery Level";
+	case NVME_FEAT_FID_PLM_CONFIG:		return "Predictable Latency Mode Config";
+	case NVME_FEAT_FID_PLM_WINDOW:		return "Predictable Latency Mode Window";
 	case NVME_FEAT_FID_LBA_STS_INTERVAL:	return "LBA Status Interval";
 	case NVME_FEAT_FID_HOST_BEHAVIOR:	return "Host Behavior";
-	case NVME_FEAT_FID_SANITIZE:	return "Sanitize";
+	case NVME_FEAT_FID_SANITIZE:		return "Sanitize";
 	case NVME_FEAT_FID_ENDURANCE_EVT_CFG:	return "Endurance Event Group Configuration";
 	case NVME_FEAT_FID_IOCS_PROFILE:	return "I/O Command Set Profile";
 	case NVME_FEAT_FID_SPINUP_CONTROL:	return "Spinup Control";
+	case NVME_FEAT_FID_POWER_LOSS_SIGNAL:	return "Power Loss Signaling Config";
+	case NVME_FEAT_FID_PERF_CHARACTERISTICS:return "Performance Characteristics";
+	case NVME_FEAT_FID_FDP:			return "Flexible Direct Placement";
+	case NVME_FEAT_FID_FDP_EVENTS:		return "Flexible Direct Placement Events";
+	case NVME_FEAT_FID_NS_ADMIN_LABEL:	return "Namespace Admin Label";
+	case NVME_FEAT_FID_KEY_VALUE:		return "Key Value Configuration";
+	case NVME_FEAT_FID_CTRL_DATA_QUEUE:	return "Controller Data Queue";
+	case NVME_FEAT_FID_EMB_MGMT_CTRL_ADDR:	return "Embedded Management Controller Address";
+	case NVME_FEAT_FID_HOST_MGMT_AGENT_ADDR:return "Host Management Agent Address";
 	case NVME_FEAT_FID_ENH_CTRL_METADATA:	return "Enhanced Controller Metadata";
 	case NVME_FEAT_FID_CTRL_METADATA:	return "Controller Metadata";
-	case NVME_FEAT_FID_NS_METADATA: return "Namespace Metadata";
-	case NVME_FEAT_FID_SW_PROGRESS:	return "Software Progress";
-	case NVME_FEAT_FID_HOST_ID:	return "Host Identifier";
-	case NVME_FEAT_FID_RESV_MASK:	return "Reservation Notification Mask";
-	case NVME_FEAT_FID_RESV_PERSIST:return "Reservation Persistence";
+	case NVME_FEAT_FID_NS_METADATA:		return "Namespace Metadata";
+	case NVME_FEAT_FID_SW_PROGRESS:		return "Software Progress";
+	case NVME_FEAT_FID_HOST_ID:		return "Host Identifier";
+	case NVME_FEAT_FID_RESV_MASK:		return "Reservation Notification Mask";
+	case NVME_FEAT_FID_RESV_PERSIST:	return "Reservation Persistence";
 	case NVME_FEAT_FID_WRITE_PROTECT:	return "Namespace Write Protect";
-	case NVME_FEAT_FID_FDP:		return "Flexible Direct Placement";
-	case NVME_FEAT_FID_FDP_EVENTS:	return "Flexible Direct Placement Events";
+	case NVME_FEAT_FID_BP_WRITE_PROTECT:	return "Boot Partition Write Protection Config";
 	}
 	/*
 	 * We don't use the "default:" statement to let the compiler warning if
@@ -1181,6 +1224,28 @@ const char *nvme_pel_ehai_pit_to_string(enum nvme_pel_ehai_pit pit)
 	return "Reserved";
 }
 
+const char *nvme_ssi_state_to_string(__u8 state)
+{
+	switch (state) {
+	case NVME_SANITIZE_SSI_IDLE:
+		return "Idle state";
+	case NVME_SANITIZE_SSI_RESTRICT_PROCESSING:
+		return "Restricted Processing State";
+	case NVME_SANITIZE_SSI_RESTRICT_FAILURE:
+		return "Restricted Failure State";
+	case NVME_SANITIZE_SSI_UNRESTRICT_PROCESSING:
+		return "Unrestricted Processing State";
+	case NVME_SANITIZE_SSI_UNRESTRICT_FAILURE:
+		return "Unrestricted Failure State";
+	case NVME_SANITIZE_SSI_MEDIA_VERIFICATION:
+		return "Media Verification State";
+	case NVME_SANITIZE_SSI_POST_VERIF_DEALLOC:
+		return "Post-Verification Deallocation State";
+	default:
+		return "Reserved";
+	}
+}
+
 const char *nvme_register_symbol_to_string(int offset)
 {
 	switch (offset) {
@@ -1247,6 +1312,58 @@ const char *nvme_register_symbol_to_string(int offset)
 	return "unknown";
 }
 
+const char *nvme_time_scale_to_string(__u8 ts)
+{
+	switch (ts) {
+	case 0:
+		return "1 microsecond";
+	case 1:
+		return "10 microseconds";
+	case 2:
+		return "100 microseconds";
+	case 3:
+		return "1 millisecond";
+	case 4:
+		return "10 milliseconds";
+	case 5:
+		return "100 milliseconds";
+	case 6:
+		return "1 second";
+	case 7:
+		return "10 seconds";
+	case 8:
+		return "100 seconds";
+	case 9:
+		return "1,000 seconds";
+	case 0xa:
+		return "10,000 seconds";
+	case 0xb:
+		return "100,000 seconds";
+	case 0xc:
+		return "1,000,000 seconds";
+	default:
+		break;
+	}
+
+	return "Reserved";
+}
+
+const char *nvme_pls_mode_to_string(__u8 mode)
+{
+	switch (mode) {
+	case 0:
+		return "not enabled";
+	case 1:
+		return "enabled with Emergency Power Fail";
+	case 2:
+		return "enabled with Forced Quiescence";
+	default:
+		break;
+	}
+
+	return "Reserved";
+}
+
 void nvme_feature_show(enum nvme_features_id fid, int sel, unsigned int result)
 {
 	nvme_print(show_feature, NORMAL, fid, sel, result);
@@ -1374,3 +1491,48 @@ void nvme_show_finish(void)
 {
 	nvme_print_output_format(show_finish);
 }
+
+void nvme_show_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list, nvme_print_flags_t flags)
+{
+	nvme_print(mgmt_addr_list_log, flags, ma_list);
+}
+
+void nvme_show_rotational_media_info_log(struct nvme_rotational_media_info_log *info,
+					 nvme_print_flags_t flags)
+{
+	nvme_print(rotational_media_info_log, flags, info);
+}
+
+void nvme_show_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log,
+				     nvme_print_flags_t flags)
+{
+	nvme_print(dispersed_ns_psub_log, flags, log);
+}
+
+void nvme_show_reachability_groups_log(struct nvme_reachability_groups_log *log,
+				       __u64 len, nvme_print_flags_t flags)
+{
+	nvme_print(reachability_groups_log, flags, log, len);
+}
+
+void nvme_show_reachability_associations_log(struct nvme_reachability_associations_log *log,
+					     __u64 len, nvme_print_flags_t flags)
+{
+	nvme_print(reachability_associations_log, flags, log, len);
+}
+
+void nvme_show_host_discovery_log(struct nvme_host_discover_log *log, nvme_print_flags_t flags)
+{
+	nvme_print(host_discovery_log, flags, log);
+}
+
+void nvme_show_ave_discovery_log(struct nvme_ave_discover_log *log, nvme_print_flags_t flags)
+{
+	nvme_print(ave_discovery_log, flags, log);
+}
+
+void nvme_show_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log,
+				      nvme_print_flags_t flags)
+{
+	nvme_print(pull_model_ddc_req_log, flags, log);
+}
diff --git a/nvme-print.h b/nvme-print.h
index 6107df9..ad5d4c8 100644
--- a/nvme-print.h
+++ b/nvme-print.h
@@ -18,10 +18,6 @@ typedef struct nvme_effects_log_node {
 
 #define POWER_OF_TWO(exponent) (1 << (exponent))
 
-#define STR_LEN 100
-
-#define obj_add_str json_object_add_value_string
-
 void d(unsigned char *buf, int len, int width, int group);
 void d_raw(unsigned char *buf, unsigned len);
 
@@ -62,7 +58,7 @@ struct print_ops {
 	void (*media_unit_stat_log)(struct nvme_media_unit_stat_log *mus);
 	void (*mi_cmd_support_effects_log)(struct nvme_mi_cmd_supported_effects_log *mi_cmd_log, const char *devname);
 	void (*ns_list)(struct nvme_ns_list *ns_list);
-	void (*ns_list_log)(struct nvme_ns_list *log, const char *devname);
+	void (*ns_list_log)(struct nvme_ns_list *log, const char *devname, bool alloc);
 	void (*nvm_id_ns)(struct nvme_nvm_id_ns *nvm_ns, unsigned int nsid, struct nvme_id_ns *ns, unsigned int lba_index, bool cap_only);
 	void (*persistent_event_log)(void *pevent_log_info, __u8 action, __u32 size, const char *devname);
 	void (*predictable_latency_event_agg_log)(struct nvme_aggregate_predictable_lat_event *pea_log, __u64 log_entries, __u32 size, const char *devname);
@@ -92,6 +88,15 @@ struct print_ops {
 	void (*d)(unsigned char *buf, int len, int width, int group);
 	void (*show_init)(void);
 	void (*show_finish)(void);
+	void (*mgmt_addr_list_log)(struct nvme_mgmt_addr_list_log *ma_log);
+	void (*rotational_media_info_log)(struct nvme_rotational_media_info_log *info);
+	void (*dispersed_ns_psub_log)(struct nvme_dispersed_ns_participating_nss_log *log);
+	void (*reachability_groups_log)(struct nvme_reachability_groups_log *log, __u64 len);
+	void (*reachability_associations_log)(struct nvme_reachability_associations_log *log,
+					      __u64 len);
+	void (*host_discovery_log)(struct nvme_host_discover_log *log);
+	void (*ave_discovery_log)(struct nvme_ave_discover_log *log);
+	void (*pull_model_ddc_req_log)(struct nvme_pull_model_ddc_req_log *log);
 
 	/* libnvme tree print functions */
 	void (*list_item)(nvme_ns_t n);
@@ -176,8 +181,8 @@ void nvme_show_fw_log(struct nvme_firmware_slot *fw_log, const char *devname,
 	nvme_print_flags_t flags);
 void nvme_print_effects_log_pages(struct list_head *list,
 				  nvme_print_flags_t flags);
-void nvme_show_changed_ns_list_log(struct nvme_ns_list *log,
-	const char *devname, nvme_print_flags_t flags);
+void nvme_show_changed_ns_list_log(struct nvme_ns_list *log, const char *devname,
+				   nvme_print_flags_t flags, bool alloc);
 void nvme_show_endurance_log(struct nvme_endurance_group_log *endurance_log,
 	__u16 group_id, const char *devname, nvme_print_flags_t flags);
 void nvme_show_sanitize_log(struct nvme_sanitize_log_page *sanitize,
@@ -314,6 +319,9 @@ const char *nvme_plm_window_to_string(__u32 plm);
 const char *nvme_ns_wp_cfg_to_string(enum nvme_ns_write_protect_cfg state);
 const char *nvme_pel_rci_rcpit_to_string(enum nvme_pel_rci_rcpit rcpit);
 const char *nvme_pel_ehai_pit_to_string(enum nvme_pel_ehai_pit pit);
+const char *nvme_ssi_state_to_string(__u8 state);
+const char *nvme_time_scale_to_string(__u8 ts);
+const char *nvme_pls_mode_to_string(__u8 mode);
 
 void nvme_dev_full_path(nvme_ns_t n, char *path, size_t len);
 void nvme_generic_full_path(nvme_ns_t n, char *path, size_t len);
@@ -328,12 +336,20 @@ bool nvme_registers_cmbloc_support(__u32 cmbsz);
 bool nvme_registers_pmrctl_ready(__u32 pmrctl);
 const char *nvme_degrees_string(long t);
 void print_array(char *name, __u8 *data, int size);
-void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v);
 void json_print(struct json_object *r);
-void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v);
-void obj_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len);
-void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v);
 struct json_object *obj_create_array_obj(struct json_object *o, const char *k);
-void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width);
-void obj_add_0nprix64(struct json_object *o, const char *k, uint64_t v, int width);
+void nvme_show_mgmt_addr_list_log(struct nvme_mgmt_addr_list_log *ma_list,
+				  nvme_print_flags_t flags);
+void nvme_show_rotational_media_info_log(struct nvme_rotational_media_info_log *info,
+					 nvme_print_flags_t flags);
+void nvme_show_dispersed_ns_psub_log(struct nvme_dispersed_ns_participating_nss_log *log,
+				     nvme_print_flags_t flags);
+void nvme_show_reachability_groups_log(struct nvme_reachability_groups_log *log,
+				       __u64 len, nvme_print_flags_t flags);
+void nvme_show_reachability_associations_log(struct nvme_reachability_associations_log *log,
+					     __u64 len, nvme_print_flags_t flags);
+void nvme_show_host_discovery_log(struct nvme_host_discover_log *log, nvme_print_flags_t flags);
+void nvme_show_ave_discovery_log(struct nvme_ave_discover_log *log, nvme_print_flags_t flags);
+void nvme_show_pull_model_ddc_req_log(struct nvme_pull_model_ddc_req_log *log,
+				      nvme_print_flags_t flags);
 #endif /* NVME_PRINT_H */
diff --git a/nvme-wrap.c b/nvme-wrap.c
index 2a18d4d..ca24028 100644
--- a/nvme-wrap.c
+++ b/nvme-wrap.c
@@ -119,6 +119,11 @@ int nvme_cli_get_features(struct nvme_dev *dev,
 	return do_admin_args_op(get_features, dev, args);
 }
 
+int nvme_cli_set_features(struct nvme_dev *dev, struct nvme_set_features_args *args)
+{
+	return do_admin_args_op(set_features, dev, args);
+}
+
 int nvme_cli_ns_mgmt_delete(struct nvme_dev *dev, __u32 nsid, __u32 timeout)
 {
 	if (dev->type == NVME_DEV_DIRECT)
@@ -209,6 +214,12 @@ int nvme_cli_get_log_changed_ns_list(struct nvme_dev *dev, bool rae,
 	return do_admin_op(get_log_changed_ns_list, dev, rae, ns_log);
 }
 
+int nvme_cli_get_log_changed_alloc_ns_list(struct nvme_dev *dev, bool rae, __u32 len,
+					   struct nvme_ns_list *ns_log)
+{
+	return do_admin_op(get_log_changed_alloc_ns_list, dev, rae, len, ns_log);
+}
+
 int nvme_cli_get_log_cmd_effects(struct nvme_dev *dev, enum nvme_csi csi,
 				 struct nvme_cmd_effects_log *effects_log)
 {
@@ -221,10 +232,11 @@ int nvme_cli_get_log_device_self_test(struct nvme_dev *dev,
 	return do_admin_op(get_log_device_self_test, dev, log);
 }
 
-int nvme_cli_get_log_create_telemetry_host(struct nvme_dev *dev,
+int nvme_cli_get_log_create_telemetry_host_mcda(struct nvme_dev *dev,
+					   enum nvme_telemetry_da mcda,
 					   struct nvme_telemetry_log *log)
 {
-	return do_admin_op(get_log_create_telemetry_host, dev, log);
+	return do_admin_op(get_log_create_telemetry_host_mcda, dev, mcda, log);
 }
 
 int nvme_cli_get_log_telemetry_host(struct nvme_dev *dev, __u64 offset,
@@ -424,3 +436,54 @@ int nvme_cli_security_receive(struct nvme_dev *dev,
 
 	return -ENODEV;
 }
+
+int nvme_cli_get_log_mgmt_addr_list(struct nvme_dev *dev, __u32 len,
+				    struct nvme_mgmt_addr_list_log *ma_list)
+{
+	return do_admin_op(get_log_mgmt_addr_list, dev, len, ma_list);
+}
+
+int nvme_cli_get_log_rotational_media_info(struct nvme_dev *dev, __u16 endgid, __u32 len,
+					   struct nvme_rotational_media_info_log *info)
+{
+	if (dev->type == NVME_DEV_DIRECT)
+		return nvme_get_log_rotational_media_info(dev->direct.fd, endgid, len, info);
+
+	return -ENODEV;
+}
+
+int nvme_cli_get_log_dispersed_ns_participating_nss(struct nvme_dev *dev, __u32 nsid, __u32 len,
+	struct nvme_dispersed_ns_participating_nss_log *log)
+{
+	return do_admin_op(get_log_dispersed_ns_participating_nss, dev, nsid, len, log);
+}
+
+int nvme_cli_get_log_reachability_groups(struct nvme_dev *dev, bool rgo, bool rae, __u32 len,
+					 struct nvme_reachability_groups_log *log)
+{
+	return do_admin_op(get_log_reachability_groups, dev, rgo, rae, len, log);
+}
+
+int nvme_cli_get_log_reachability_associations(struct nvme_dev *dev, bool rao, bool rae, __u32 len,
+					       struct nvme_reachability_associations_log *log)
+{
+	return do_admin_op(get_log_reachability_associations, dev, rao, rae, len, log);
+}
+
+int nvme_cli_get_log_host_discovery(struct nvme_dev *dev, bool allhoste, bool rae, __u32 len,
+				    struct nvme_host_discover_log *log)
+{
+	return do_admin_op(get_log_host_discover, dev, allhoste, rae, len, log);
+}
+
+int nvme_cli_get_log_ave_discovery(struct nvme_dev *dev, bool rae, __u32 len,
+				   struct nvme_ave_discover_log *log)
+{
+	return do_admin_op(get_log_ave_discover, dev, rae, len, log);
+}
+
+int nvme_cli_get_log_pull_model_ddc_req(struct nvme_dev *dev, bool rae, __u32 len,
+					struct nvme_pull_model_ddc_req_log *log)
+{
+	return do_admin_op(get_log_pull_model_ddc_req, dev, rae, len, log);
+}
diff --git a/nvme-wrap.h b/nvme-wrap.h
index 67807b0..43f4f80 100644
--- a/nvme-wrap.h
+++ b/nvme-wrap.h
@@ -49,6 +49,7 @@ int nvme_cli_sanitize_nvm(struct nvme_dev *dev,
 int nvme_cli_get_features(struct nvme_dev *dev,
 			  struct nvme_get_features_args *args);
 
+int nvme_cli_set_features(struct nvme_dev *dev, struct nvme_set_features_args *args);
 
 int nvme_cli_get_log(struct nvme_dev *dev, struct nvme_get_log_args *args);
 int nvme_cli_get_log_page(struct nvme_dev *dev,
@@ -71,11 +72,14 @@ int nvme_cli_get_log_fw_slot(struct nvme_dev *dev, bool rae,
 			     struct nvme_firmware_slot *fw_log);
 int nvme_cli_get_log_changed_ns_list(struct nvme_dev *dev, bool rae,
 				     struct nvme_ns_list *ns_log);
+int nvme_cli_get_log_changed_alloc_ns_list(struct nvme_dev *dev, bool rae, __u32 len,
+					   struct nvme_ns_list *ns_log);
 int nvme_cli_get_log_cmd_effects(struct nvme_dev *dev, enum nvme_csi csi,
 				 struct nvme_cmd_effects_log *effects_log);
 int nvme_cli_get_log_device_self_test(struct nvme_dev *dev,
 				      struct nvme_self_test_log *log);
-int nvme_cli_get_log_create_telemetry_host(struct nvme_dev *dev,
+int nvme_cli_get_log_create_telemetry_host_mcda(struct nvme_dev *dev,
+					   enum nvme_telemetry_da mcda,
 					   struct nvme_telemetry_log *log);
 int nvme_cli_get_log_telemetry_host(struct nvme_dev *dev, __u64 offset,
 				    __u32 len, void *log);
@@ -144,4 +148,27 @@ int nvme_cli_security_send(struct nvme_dev *dev,
 int nvme_cli_security_receive(struct nvme_dev *dev,
 			      struct nvme_security_receive_args* args);
 
+int nvme_cli_get_log_mgmt_addr_list(struct nvme_dev *dev, __u32 len,
+				    struct nvme_mgmt_addr_list_log *ma_list);
+
+int nvme_cli_get_log_rotational_media_info(struct nvme_dev *dev, __u16 endgid, __u32 len,
+					   struct nvme_rotational_media_info_log *info);
+
+int nvme_cli_get_log_dispersed_ns_participating_nss(struct nvme_dev *dev, __u32 nsid, __u32 len,
+	struct nvme_dispersed_ns_participating_nss_log *log);
+
+int nvme_cli_get_log_reachability_groups(struct nvme_dev *dev, bool rgo, bool rae, __u32 len,
+					 struct nvme_reachability_groups_log *log);
+
+int nvme_cli_get_log_reachability_associations(struct nvme_dev *dev, bool rgo, bool rae, __u32 len,
+					       struct nvme_reachability_associations_log *log);
+
+int nvme_cli_get_log_host_discovery(struct nvme_dev *dev, bool allhoste, bool rae, __u32 len,
+				    struct nvme_host_discover_log *log);
+
+int nvme_cli_get_log_ave_discovery(struct nvme_dev *dev, bool rae, __u32 len,
+				   struct nvme_ave_discover_log *log);
+
+int nvme_cli_get_log_pull_model_ddc_req(struct nvme_dev *dev, bool rae, __u32 len,
+					struct nvme_pull_model_ddc_req_log *log);
 #endif /* _NVME_WRAP_H */
diff --git a/nvme.c b/nvme.c
index ea0590f..bb41284 100644
--- a/nvme.c
+++ b/nvme.c
@@ -185,7 +185,11 @@ static struct program nvme = {
 	.extensions = &builtin,
 };
 
+#ifdef CONFIG_JSONC
 const char *output_format = "Output format: normal|json|binary";
+#else /* CONFIG_JSONC */
+const char *output_format = "Output format: normal|binary";
+#endif /* CONFIG_JSONC */
 const char *timeout = "timeout value, in milliseconds";
 const char *verbose = "Increase output verbosity";
 
@@ -200,6 +204,7 @@ static const char *doper = "directive operation";
 static const char *dry = "show command instead of sending";
 static const char *dspec_w_dtype = "directive specification associated with directive type";
 static const char *dtype = "directive type";
+static const char *endgid = "Endurance Group Identifier (ENDGID)";
 static const char *force_unit_access = "force device to commit data before command completes";
 static const char *human_readable_directive = "show directive in readable format";
 static const char *human_readable_identify = "show identify in readable format";
@@ -480,8 +485,10 @@ int validate_output_format(const char *format, nvme_print_flags_t *flags)
 
 	if (!strcmp(format, "normal"))
 		f = NORMAL;
+#ifdef CONFIG_JSONC
 	else if (!strcmp(format, "json"))
 		f = JSON;
+#endif /* CONFIG_JSONC */
 	else if (!strcmp(format, "binary"))
 		f = BINARY;
 	else
@@ -655,31 +662,41 @@ static int parse_telemetry_da(struct nvme_dev *dev,
 
 {
 	_cleanup_free_ struct nvme_id_ctrl *id_ctrl = NULL;
-	size_t dalb = 0;
+	size_t dalb, da1lb = le16_to_cpu(telem->dalb1), da2lb = le16_to_cpu(telem->dalb2),
+		da3lb = le16_to_cpu(telem->dalb3), da4lb = le32_to_cpu(telem->dalb4);
+	bool data_area_4_support;
 
 	id_ctrl = nvme_alloc(sizeof(*id_ctrl));
 	if (!id_ctrl)
 		return -ENOMEM;
 
+	if (nvme_cli_identify_ctrl(dev, id_ctrl)) {
+		perror("identify-ctrl");
+		return -errno;
+	}
+
+	data_area_4_support = id_ctrl->lpa & 0x40;
+
 	switch (da) {
+	case NVME_TELEMETRY_DA_CTRL_DETERMINE:
+		if (data_area_4_support)
+			dalb = da4lb;
+		else
+			dalb = da3lb;
+		break;
 	case NVME_TELEMETRY_DA_1:
-		dalb = le16_to_cpu(telem->dalb1);
+		dalb = da1lb;
 		break;
 	case NVME_TELEMETRY_DA_2:
-		dalb = le16_to_cpu(telem->dalb2);
+		dalb = da2lb;
 		break;
 	case NVME_TELEMETRY_DA_3:
 		/* dalb3 >= dalb2 >= dalb1 */
-		dalb = le16_to_cpu(telem->dalb3);
+		dalb = da3lb;
 		break;
 	case NVME_TELEMETRY_DA_4:
-		if (nvme_cli_identify_ctrl(dev, id_ctrl)) {
-			perror("identify-ctrl");
-			return -errno;
-		}
-
-		if (id_ctrl->lpa & 0x40) {
-			dalb = le32_to_cpu(telem->dalb4);
+		if (data_area_4_support) {
+			dalb = da4lb;
 		} else {
 			nvme_show_error(
 			    "Data area 4 unsupported, bit 6 of Log Page Attributes not set");
@@ -757,7 +774,7 @@ static int __create_telemetry_log_host(struct nvme_dev *dev,
 	if (!log)
 		return -ENOMEM;
 
-	err = nvme_cli_get_log_create_telemetry_host(dev, log);
+	err = nvme_cli_get_log_create_telemetry_host_mcda(dev, da, log);
 	if (err) {
 		if (errno)
 			return -errno;
@@ -854,6 +871,8 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd,
 	const char *hgen = "Have the host tell the controller to generate the report";
 	const char *cgen = "Gather report generated by the controller.";
 	const char *dgen = "Pick which telemetry data area to report. Default is 3 to fetch areas 1-3. Valid options are 1, 2, 3, 4.";
+	const char *mcda = "Host-init Maximum Created Data Area. Valid options are 0 ~ 4 "
+		"If given, This option will override dgen. 0 : controller determines data area";
 
 	_cleanup_free_ struct nvme_telemetry_log *log = NULL;
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
@@ -862,6 +881,7 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd,
 	size_t total_size;
 	__u8 *data_ptr = NULL;
 	int data_written = 0, data_remaining = 0;
+	nvme_print_flags_t flags;
 
 	struct config {
 		char	*file_name;
@@ -869,13 +889,15 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd,
 		bool	ctrl_init;
 		int	data_area;
 		bool	rae;
+		__u8	mcda;
 	};
 	struct config cfg = {
 		.file_name	= NULL,
 		.host_gen	= 1,
 		.ctrl_init	= false,
 		.data_area	= 3,
-		.rae		= true,
+		.rae		= false,
+		.mcda		= 0xff,
 	};
 
 	NVME_ARGS(opts,
@@ -883,18 +905,34 @@ static int get_telemetry_log(int argc, char **argv, struct command *cmd,
 		  OPT_UINT("host-generate",   'g', &cfg.host_gen,  hgen),
 		  OPT_FLAG("controller-init", 'c', &cfg.ctrl_init, cgen),
 		  OPT_UINT("data-area",       'd', &cfg.data_area, dgen),
-		  OPT_FLAG("rae",             'r', &cfg.rae,       rae));
+		  OPT_FLAG("rae",             'r', &cfg.rae,       rae),
+		  OPT_BYTE("mcda",            'm', &cfg.mcda,      mcda));
 
 	err = parse_and_open(&dev, argc, argv, desc, opts);
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!cfg.file_name) {
 		nvme_show_error("Please provide an output file!");
 		return -EINVAL;
 	}
 
 	cfg.host_gen = !!cfg.host_gen;
+
+	if (cfg.mcda != 0xff) {
+		if (cfg.ctrl_init || !cfg.host_gen) {
+			nvme_show_error("mcda allowed for Host-init Creation!");
+			return -EINVAL;
+		}
+		cfg.data_area = cfg.mcda;
+	}
+
 	output = open(cfg.file_name, O_WRONLY | O_CREAT | O_TRUNC, 0666);
 	if (output < 0) {
 		nvme_show_error("Failed to open output file %s: %s!",
@@ -1075,7 +1113,10 @@ static int get_effects_log(int argc, char **argv, struct command *cmd, struct pl
 
 	if (cfg.csi < 0) {
 		__u64 cap;
-
+		if (is_blkdev(dev)) {
+			nvme_show_error("Block device isn't allowed without csi");
+			return -EINVAL;
+		}
 		bar = mmap_registers(dev, false);
 
 		if (bar) {
@@ -1280,10 +1321,9 @@ static int get_fw_log(int argc, char **argv, struct command *cmd, struct plugin
 	return err;
 }
 
-static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+static int get_changed_ns_list_log(int argc, char **argv, bool alloc)
 {
-	const char *desc = "Retrieve Changed Namespaces log for the given device "
-		"in either decoded format (default) or binary.";
+	_cleanup_free_ char *desc = NULL;
 
 	_cleanup_free_ struct nvme_ns_list *changed_ns_list_log = NULL;
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
@@ -1301,6 +1341,11 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s
 	NVME_ARGS(opts,
 		  OPT_FLAG("raw-binary",   'b', &cfg.raw_binary,    raw_output));
 
+	if (asprintf(&desc, "Retrieve Changed %s Namespaces log for the given device %s",
+		     alloc ? "Allocated" : "Attached",
+		     "in either decoded format (default) or binary.") < 0)
+		desc = NULL;
+
 	err = parse_and_open(&dev, argc, argv, desc, opts);
 	if (err)
 		return err;
@@ -1318,19 +1363,36 @@ static int get_changed_ns_list_log(int argc, char **argv, struct command *cmd, s
 	if (!changed_ns_list_log)
 		return -ENOMEM;
 
-	err = nvme_cli_get_log_changed_ns_list(dev, true,
-					       changed_ns_list_log);
+	if (alloc)
+		err = nvme_cli_get_log_changed_alloc_ns_list(dev, true,
+							     sizeof(*changed_ns_list_log),
+							     changed_ns_list_log);
+	else
+		err = nvme_cli_get_log_changed_ns_list(dev, true,
+						       changed_ns_list_log);
 	if (!err)
-		nvme_show_changed_ns_list_log(changed_ns_list_log,
-					      dev->name, flags);
+		nvme_show_changed_ns_list_log(changed_ns_list_log, dev->name, flags, alloc);
 	else if (err > 0)
 		nvme_show_status(err);
 	else
-		nvme_show_error("changed ns list log: %s", nvme_strerror(errno));
+		nvme_show_error("changed %s ns list log: %s", alloc ? "allocated" : "attached",
+				nvme_strerror(errno));
 
 	return err;
 }
 
+static int get_changed_attach_ns_list_log(int argc, char **argv, struct command *cmd,
+					  struct plugin *plugin)
+{
+	return get_changed_ns_list_log(argc, argv, false);
+}
+
+static int get_changed_alloc_ns_list_log(int argc, char **argv, struct command *cmd,
+					 struct plugin *plugin)
+{
+	return get_changed_ns_list_log(argc, argv, true);
+}
+
 static int get_pred_lat_per_nvmset_log(int argc, char **argv,
 	struct command *cmd, struct plugin *plugin)
 {
@@ -2253,6 +2315,7 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	_cleanup_free_ unsigned char *log = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -2305,6 +2368,12 @@ static int get_log(int argc, char **argv, struct command *cmd, struct plugin *pl
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.aen) {
 		cfg.log_len = 4096;
 		cfg.log_id = (cfg.aen >> 16) & 0xff;
@@ -2621,6 +2690,9 @@ static int list_ns(int argc, char **argv, struct command *cmd, struct plugin *pl
 		return -EINVAL;
 	}
 
+	if (argconfig_parse_seen(opts, "verbose"))
+		flags |= VERBOSE;
+
 	ns_list = nvme_alloc(sizeof(*ns_list));
 	if (!ns_list)
 		return -ENOMEM;
@@ -2753,6 +2825,32 @@ static int id_endurance_grp_list(int argc, char **argv, struct command *cmd,
 	return err;
 }
 
+static void ns_mgmt_show_error(struct nvme_dev *dev, int err, const char *cmd)
+{
+	_cleanup_free_ struct nvme_id_ctrl *ctrl = NULL;
+
+	if (err < 0) {
+		nvme_show_error("%s namespace: %s", cmd, nvme_strerror(errno));
+		return;
+	}
+
+	nvme_show_init();
+
+	nvme_show_status(err);
+
+	ctrl = nvme_alloc(sizeof(*ctrl));
+	if (!ctrl)
+		return;
+
+	err = nvme_cli_identify_ctrl(dev, ctrl);
+	if (!err) {
+		if (!(le16_to_cpu(ctrl->oacs) & NVME_CTRL_OACS_NS_MGMT))
+			nvme_show_result("NS management and attachment not supported");
+	}
+
+	nvme_show_finish();
+}
+
 static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin *plugin)
 {
 	const char *desc = "Delete the given namespace by "
@@ -2765,6 +2863,7 @@ static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin *
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -2783,6 +2882,12 @@ static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin *
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!cfg.namespace_id) {
 		err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id);
 		if (err < 0) {
@@ -2794,10 +2899,8 @@ static int delete_ns(int argc, char **argv, struct command *cmd, struct plugin *
 	err = nvme_cli_ns_mgmt_delete(dev, cfg.namespace_id, nvme_cfg.timeout);
 	if (!err)
 		printf("%s: Success, deleted nsid:%d\n", cmd->name, cfg.namespace_id);
-	else if (err > 0)
-		nvme_show_status(err);
 	else
-		nvme_show_error("delete namespace: %s", nvme_strerror(errno));
+		ns_mgmt_show_error(dev, err, "delete");
 
 	return err;
 }
@@ -2808,6 +2911,7 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err, num;
 	__u16 list[NVME_ID_CTRL_LIST_MAX];
+	nvme_print_flags_t flags;
 
 	const char *namespace_id = "namespace to attach";
 	const char *cont = "optional comma-sep controller id list";
@@ -2830,6 +2934,18 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (is_blkdev(dev)) {
+		nvme_show_error("%s: a block device opened (dev: %s, nsid: %d)", cmd->name,
+				dev->name, cfg.namespace_id);
+		return -EINVAL;
+	}
+
 	if (!cfg.namespace_id) {
 		nvme_show_error("%s: namespace-id parameter required", cmd->name);
 		return -EINVAL;
@@ -2860,10 +2976,8 @@ static int nvme_attach_ns(int argc, char **argv, int attach, const char *desc, s
 
 	if (!err)
 		printf("%s: Success, nsid:%d\n", cmd->name, cfg.namespace_id);
-	else if (err > 0)
-		nvme_show_status(err);
 	else
-		nvme_show_perror(attach ? "attach namespace" : "detach namespace");
+		ns_mgmt_show_error(dev, err, attach ? "attach" : "detach");
 
 	return err;
 }
@@ -2890,7 +3004,7 @@ static int detach_ns(int argc, char **argv, struct command *cmd, struct plugin *
 }
 
 static int parse_lba_num_si(struct nvme_dev *dev, const char *opt,
-			    const char *val, __u8 flbas, __u64 *num, __u32 align)
+			    const char *val, __u8 flbas, __u64 *num, __u64 align)
 {
 	_cleanup_free_ struct nvme_ns_list *ns_list = NULL;
 	_cleanup_free_ struct nvme_id_ctrl *ctrl = NULL;
@@ -3001,7 +3115,6 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin *
 	const char *nmic = "multipath and sharing capabilities (NMIC)";
 	const char *anagrpid = "ANA Group Identifier (ANAGRPID)";
 	const char *nvmsetid = "NVM Set Identifier (NVMSETID)";
-	const char *endgid = "Endurance Group Identifier (ENDGID)";
 	const char *csi = "command set identifier (CSI)";
 	const char *lbstm = "logical block storage tag mask (LBSTM)";
 	const char *nphndls = "Number of Placement Handles (NPHNDLS)";
@@ -3024,8 +3137,9 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin *
 	uint16_t phndl[128] = { 0, };
 	_cleanup_free_ struct nvme_id_ctrl *id = NULL;
 	_cleanup_free_ struct nvme_id_ns_granularity_list *gr_list = NULL;
-	__u32 align_nsze = 1 << 20; /* Default 1 MiB */
-	__u32 align_ncap = align_nsze;
+	__u64 align_nsze = 1 << 20; /* Default 1 MiB */
+	__u64 align_ncap = align_nsze;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u64	nsze;
@@ -3080,8 +3194,8 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin *
 		  OPT_BYTE("dps",          'd', &cfg.dps,      dps),
 		  OPT_BYTE("nmic",         'm', &cfg.nmic,     nmic),
 		  OPT_UINT("anagrp-id",    'a', &cfg.anagrpid, anagrpid),
-		  OPT_UINT("nvmset-id",    'i', &cfg.nvmsetid, nvmsetid),
-		  OPT_UINT("endg-id",      'e', &cfg.endgid,   endgid),
+		  OPT_SHRT("nvmset-id",    'i', &cfg.nvmsetid, nvmsetid),
+		  OPT_SHRT("endg-id",      'e', &cfg.endgid,   endgid),
 		  OPT_SUFFIX("block-size", 'b', &cfg.bs,       bs),
 		  OPT_BYTE("csi",          'y', &cfg.csi,      csi),
 		  OPT_SUFFIX("lbstm",      'l', &cfg.lbstm,    lbstm),
@@ -3098,6 +3212,12 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin *
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.flbas != 0xff && cfg.bs != 0x00) {
 		nvme_show_error(
 		    "Invalid specification of both FLBAS and Block Size, please specify only one");
@@ -3167,7 +3287,7 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin *
 			int index = cfg.flbas;
 
 			/* FIXME: add a proper bitmask to libnvme */
-			if (!(gr_list->attributes & 1)) {
+			if (!(le32_to_cpu(gr_list->attributes) & 1)) {
 				/* Only the first descriptor is valid */
 				index = 0;
 			} else if (index > gr_list->num_descriptors) {
@@ -3179,10 +3299,18 @@ static int create_ns(int argc, char **argv, struct command *cmd, struct plugin *
 			}
 			desc = &gr_list->entry[index];
 
-			if (desc->nszegran && desc->nszegran < align_nsze)
-				align_nsze = desc->nszegran;
-			if (desc->ncapgran && desc->ncapgran < align_ncap)
-				align_ncap = desc->ncapgran;
+			if (desc->nszegran) {
+				print_info("enforce nsze alignment to %"PRIx64
+					   " because of namespace granularity requirements\n",
+					   le64_to_cpu(desc->nszegran));
+				align_nsze = le64_to_cpu(desc->nszegran);
+			}
+			if (desc->ncapgran) {
+				print_info("enforce ncap alignment to %"PRIx64
+					   " because of namespace granularity requirements\n",
+					   le64_to_cpu(desc->ncapgran));
+				align_ncap = le64_to_cpu(desc->ncapgran);
+			}
 		}
 	}
 
@@ -3231,10 +3359,8 @@ parse_lba:
 	err = nvme_cli_ns_mgmt_create(dev, data, &nsid, nvme_cfg.timeout, cfg.csi);
 	if (!err)
 		printf("%s: Success, created nsid:%d\n", cmd->name, nsid);
-	else if (err > 0)
-		nvme_show_status(err);
 	else
-		nvme_show_error("create namespace: %s", nvme_strerror(errno));
+		ns_mgmt_show_error(dev, err, "create");
 
 	return err;
 }
@@ -3676,7 +3802,7 @@ static int ns_descs(int argc, char **argv, struct command *cmd, struct plugin *p
 		}
 	}
 
-	nsdescs = nvme_alloc(sizeof(*nsdescs));
+	nsdescs = nvme_alloc(NVME_IDENTIFY_DATA_SIZE);
 	if (!nsdescs)
 		return -ENOMEM;
 
@@ -3997,6 +4123,7 @@ static int id_iocs(int argc, char **argv, struct command *cmd, struct plugin *pl
 
 	_cleanup_free_ struct nvme_id_iocs *iocs = NULL;
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	nvme_print_flags_t flags;
 	int err;
 
 	struct config {
@@ -4014,6 +4141,15 @@ static int id_iocs(int argc, char **argv, struct command *cmd, struct plugin *pl
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (argconfig_parse_seen(opts, "verbose"))
+		flags |= VERBOSE;
+
 	iocs = nvme_alloc(sizeof(*iocs));
 	if (!iocs)
 		return -ENOMEM;
@@ -4021,7 +4157,7 @@ static int id_iocs(int argc, char **argv, struct command *cmd, struct plugin *pl
 	err = nvme_identify_iocs(dev_fd(dev), cfg.cntid, iocs);
 	if (!err) {
 		printf("NVMe Identify I/O Command Set:\n");
-		nvme_show_id_iocs(iocs, 0);
+		nvme_show_id_iocs(iocs, flags);
 	} else if (err > 0) {
 		nvme_show_status(err);
 	} else {
@@ -4089,6 +4225,7 @@ static int get_ns_id(int argc, char **argv, struct command *cmd, struct plugin *
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	unsigned int nsid;
 	int err;
+	nvme_print_flags_t flags;
 
 	NVME_ARGS(opts);
 
@@ -4096,6 +4233,12 @@ static int get_ns_id(int argc, char **argv, struct command *cmd, struct plugin *
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	err = nvme_get_nsid(dev_fd(dev), &nsid);
 	if (err < 0) {
 		nvme_show_error("get namespace ID: %s", nvme_strerror(errno));
@@ -4399,12 +4542,14 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p
 		"0h Show current state of device self-test operation\n"
 		"1h Start a short device self-test operation\n"
 		"2h Start a extended device self-test operation\n"
+		"3h Start a Host-Initiated Refresh operation\n"
 		"eh Start a vendor specific device self-test operation\n"
 		"fh Abort the device self-test operation";
 	const char *wait = "Wait for the test to finish";
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -4427,6 +4572,12 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.stc == NVME_ST_CODE_RESERVED) {
 		_cleanup_free_ struct nvme_self_test_log *log = NULL;
 
@@ -4471,6 +4622,8 @@ static int device_self_test(int argc, char **argv, struct command *cmd, struct p
 			printf("Extended Device self-test started\n");
 		else if (cfg.stc == NVME_ST_CODE_SHORT)
 			printf("Short Device self-test started\n");
+		else if (cfg.stc == NVME_ST_CODE_HOST_INIT)
+			printf("Host-Initiated Refresh started\n");
 
 		if (cfg.wait && cfg.stc != NVME_ST_CODE_ABORT)
 			err = wait_self_test(dev);
@@ -4580,13 +4733,14 @@ static int get_feature_id(struct nvme_dev *dev, struct feat_cfg *cfg,
 
 static int filter_out_flags(int status)
 {
-	return status & (NVME_GET(NVME_SCT_MASK, SCT) |
-			 NVME_GET(NVME_SC_MASK, SC));
+	return status & (NVME_VAL(SCT) | NVME_VAL(SC));
 }
 
-static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, void *buf)
+static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result,
+		void *buf, nvme_print_flags_t flags)
 {
 	int status = filter_out_flags(err);
+	int verbose = flags & VERBOSE;
 	enum nvme_status_type type = NVME_STATUS_TYPE_NVME;
 
 	if (!err) {
@@ -4594,7 +4748,7 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, voi
 			nvme_feature_show(cfg.feature_id, cfg.sel, result);
 			if (NVME_CHECK(cfg.sel, GET_FEATURES_SEL, SUPPORTED))
 				nvme_show_select_result(cfg.feature_id, result);
-			else if (cfg.human_readable)
+			else if (verbose || !strcmp(nvme_cfg.output_format, "json"))
 				nvme_feature_show_fields(cfg.feature_id, result, buf);
 			else if (buf)
 				d(buf, cfg.data_len, 16, 1);
@@ -4610,7 +4764,8 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result, voi
 	}
 }
 
-static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg)
+static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg,
+		nvme_print_flags_t flags)
 {
 	int err;
 	int err_def = 0;
@@ -4631,12 +4786,13 @@ static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg)
 
 	if (err || !cfg.changed || err_def || result != result_def ||
 	    (buf && buf_def && !strcmp(buf, buf_def)))
-		get_feature_id_print(cfg, err, result, buf);
+		get_feature_id_print(cfg, err, result, buf, flags);
 
 	return err;
 }
 
-static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg)
+static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg,
+		nvme_print_flags_t flags)
 {
 	int err = 0;
 	int i;
@@ -4650,7 +4806,7 @@ static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg)
 
 	for (i = cfg.feature_id; i < feat_max; i++, feat_num++) {
 		cfg.feature_id = i;
-		err = get_feature_id_changed(dev, cfg);
+		err = get_feature_id_changed(dev, cfg, flags);
 		if (!err)
 			continue;
 		status = filter_out_flags(err);
@@ -4686,6 +4842,7 @@ static int get_feature(int argc, char **argv, struct command *cmd,
 	const char *cdw11 = "feature specific dword 11";
 	const char *human_readable = "show feature in readable format";
 	const char *changed = "show feature changed";
+	nvme_print_flags_t flags = NORMAL;
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
@@ -4716,6 +4873,12 @@ static int get_feature(int argc, char **argv, struct command *cmd,
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!argconfig_parse_seen(opts, "namespace-id")) {
 		err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id);
 		if (err < 0) {
@@ -4737,9 +4900,12 @@ static int get_feature(int argc, char **argv, struct command *cmd,
 		return -1;
 	}
 
+	if (cfg.human_readable || argconfig_parse_seen(opts, "verbose"))
+		flags |= VERBOSE;
+
 	nvme_show_init();
 
-	err = get_feature_ids(dev, cfg);
+	err = get_feature_ids(dev, cfg, flags);
 
 	nvme_show_finish();
 
@@ -4867,6 +5033,7 @@ static int fw_download(int argc, char **argv, struct command *cmd, struct plugin
 	struct stat sb;
 	void *fw_buf;
 	struct nvme_id_ctrl ctrl = { 0 };
+	nvme_print_flags_t flags;
 
 	struct config {
 		char	*fw;
@@ -4895,6 +5062,12 @@ static int fw_download(int argc, char **argv, struct command *cmd, struct plugin
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	fw_fd = open(cfg.fw, O_RDONLY);
 	cfg.offset <<= 2;
 	if (fw_fd < 0) {
@@ -5024,6 +5197,7 @@ static int fw_commit(int argc, char **argv, struct command *cmd, struct plugin *
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	__u32 result;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u8	slot;
@@ -5046,6 +5220,12 @@ static int fw_commit(int argc, char **argv, struct command *cmd, struct plugin *
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.slot > 7) {
 		nvme_show_error("invalid slot:%d", cfg.slot);
 		return -EINVAL;
@@ -5125,7 +5305,8 @@ static int subsystem_reset(int argc, char **argv, struct command *cmd, struct pl
 			nvme_show_error("Subsystem-reset: NVM Subsystem Reset not supported.");
 		else
 			nvme_show_error("Subsystem-reset: %s", nvme_strerror(errno));
-	}
+	} else if (argconfig_parse_seen(opts, "verbose"))
+		printf("resetting subsystem through %s\n", dev->name);
 
 	return err;
 }
@@ -5146,6 +5327,8 @@ static int reset(int argc, char **argv, struct command *cmd, struct plugin *plug
 	err = nvme_ctrl_reset(dev_fd(dev));
 	if (err < 0)
 		nvme_show_error("Reset: %s", nvme_strerror(errno));
+	else if (argconfig_parse_seen(opts, "verbose"))
+		printf("resetting controller %s\n", dev->name);
 
 	return err;
 }
@@ -5156,6 +5339,7 @@ static int ns_rescan(int argc, char **argv, struct command *cmd, struct plugin *
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	NVME_ARGS(opts);
 
@@ -5163,9 +5347,17 @@ static int ns_rescan(int argc, char **argv, struct command *cmd, struct plugin *
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	err = nvme_ns_rescan(dev_fd(dev));
 	if (err < 0)
 		nvme_show_error("Namespace Rescan: %s\n", nvme_strerror(errno));
+	else if (argconfig_parse_seen(opts, "verbose"))
+		printf("rescanning namespaces through %s\n", dev->name);
 
 	return err;
 }
@@ -5184,6 +5376,7 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		bool	no_dealloc;
@@ -5227,6 +5420,12 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	switch (cfg.sanact) {
 	case NVME_SANITIZE_SANACT_EXIT_FAILURE:
 	case NVME_SANITIZE_SANACT_START_BLOCK_ERASE:
@@ -5415,6 +5614,11 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu
 	if (err)
 		return err;
 
+	if (is_blkdev(dev)) {
+		nvme_show_error("Only character device is allowed");
+		return -EINVAL;
+	}
+
 	err = validate_output_format(nvme_cfg.output_format, &flags);
 	if (err < 0) {
 		nvme_show_error("Invalid output format");
@@ -5691,6 +5895,11 @@ static int get_register(int argc, char **argv, struct command *cmd, struct plugi
 	if (err)
 		return err;
 
+	if (is_blkdev(dev)) {
+		nvme_show_error("Only character device is allowed");
+		return -EINVAL;
+	}
+
 	err = validate_output_format(nvme_cfg.output_format, &flags);
 	if (err < 0) {
 		nvme_show_error("Invalid output format");
@@ -5995,6 +6204,11 @@ static int set_register(int argc, char **argv, struct command *cmd, struct plugi
 	if (err)
 		return err;
 
+	if (is_blkdev(dev)) {
+		nvme_show_error("Only character device is allowed");
+		return -EINVAL;
+	}
+
 	bar = mmap_registers(dev, true);
 
 	if (argconfig_parse_seen(opts, "offset"))
@@ -6020,6 +6234,7 @@ static int get_property(int argc, char **argv, struct command *cmd, struct plugi
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	__u64 value;
 	int err;
+	nvme_print_flags_t flags = NORMAL;
 
 	struct get_reg_config cfg = {
 		.offset		= -1,
@@ -6035,14 +6250,23 @@ static int get_property(int argc, char **argv, struct command *cmd, struct plugi
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.offset == -1) {
 		nvme_show_error("offset required param");
 		return -EINVAL;
 	}
 
+	if (cfg.human_readable || argconfig_parse_seen(opts, "verbose"))
+		flags |= VERBOSE;
+
 	err = nvme_get_single_property(dev_fd(dev), &cfg, &value);
 	if (!err)
-		nvme_show_single_property(cfg.offset, value, cfg.human_readable);
+		nvme_show_single_property(cfg.offset, value, flags);
 
 	return err;
 }
@@ -6056,6 +6280,7 @@ static int set_property(int argc, char **argv, struct command *cmd, struct plugi
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct set_reg_config cfg = {
 		.offset	= -1,
@@ -6070,6 +6295,12 @@ static int set_property(int argc, char **argv, struct command *cmd, struct plugi
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.offset == -1) {
 		nvme_show_error("offset required param");
 		return -EINVAL;
@@ -6358,6 +6589,7 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
 	_cleanup_fd_ int ffd = STDIN_FILENO;
 	int err;
 	__u32 result;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -6394,6 +6626,12 @@ static int set_feature(int argc, char **argv, struct command *cmd, struct plugin
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!argconfig_parse_seen(opts, "namespace-id")) {
 		err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id);
 		if (err < 0) {
@@ -6509,6 +6747,7 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p
 	_cleanup_fd_ int sec_fd = -1;
 	unsigned int sec_size;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -6540,6 +6779,12 @@ static int sec_send(int argc, char **argv, struct command *cmd, struct plugin *p
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.tl == 0) {
 		nvme_show_error("--tl unspecified or zero");
 		return -EINVAL;
@@ -6871,6 +7116,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	__u8 sts = 0, pif = 0;
 	__u16 control = 0;
+	__u32 result = 0;
 	int err;
 
 	const char *desc =
@@ -6880,6 +7126,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi
 	const char *storage_tag_check =
 	    "This bit specifies the Storage Tag field shall be checked as\n"
 	    "part of end-to-end data protection processing";
+	const char *nsz = "Clear all logical blocks to zero in the entire namespace";
 
 	struct config {
 		__u32	namespace_id;
@@ -6896,23 +7143,25 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi
 		__u64	storage_tag;
 		bool	storage_tag_check;
 		__u16	dspec;
+		bool	nsz;
 	};
 
 	struct config cfg = {
 		.namespace_id		= 0,
 		.start_block		= 0,
 		.block_count		= 0,
-		.dtype				= 0,
-		.deac				= false,
+		.dtype			= 0,
+		.deac			= false,
 		.limited_retry		= false,
 		.force_unit_access	= false,
-		.prinfo				= 0,
-		.ref_tag			= 0,
+		.prinfo			= 0,
+		.ref_tag		= 0,
 		.app_tag_mask		= 0,
-		.app_tag			= 0,
+		.app_tag		= 0,
 		.storage_tag		= 0,
 		.storage_tag_check	= false,
-		.dspec				= 0,
+		.dspec			= 0,
+		.nsz			= false,
 	};
 
 	NVME_ARGS(opts,
@@ -6929,7 +7178,8 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi
 		  OPT_SHRT("app-tag",           'a', &cfg.app_tag,           app_tag),
 		  OPT_SUFFIX("storage-tag",     'S', &cfg.storage_tag,       storage_tag),
 		  OPT_FLAG("storage-tag-check", 'C', &cfg.storage_tag_check, storage_tag_check),
-		  OPT_SHRT("dir-spec",          'D', &cfg.dspec,             dspec_w_dtype));
+		  OPT_SHRT("dir-spec",          'D', &cfg.dspec,             dspec_w_dtype),
+		  OPT_FLAG("namespace-zeroes",  'Z', &cfg.nsz,               nsz));
 
 	err = parse_and_open(&dev, argc, argv, desc, opts);
 	if (err)
@@ -6938,7 +7188,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi
 	if (cfg.prinfo > 0xf)
 		return -EINVAL;
 
-	if (cfg.dtype > 0xf) {
+	if (cfg.dtype > 0x7) {
 		nvme_show_error("Invalid directive type, %x", cfg.dtype);
 		return -EINVAL;
 	}
@@ -6952,6 +7202,8 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi
 		control |= NVME_IO_DEAC;
 	if (cfg.storage_tag_check)
 		control |= NVME_IO_STC;
+	if (cfg.nsz)
+		control |= NVME_IO_NSZ;
 	control |= (cfg.dtype << 4);
 	if (!cfg.namespace_id) {
 		err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id);
@@ -6988,7 +7240,7 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi
 
 	struct nvme_io_args args = {
 		.args_size	= sizeof(args),
-		.fd			= dev_fd(dev),
+		.fd		= dev_fd(dev),
 		.nsid		= cfg.namespace_id,
 		.slba		= cfg.start_block,
 		.nlb		= cfg.block_count,
@@ -7001,15 +7253,22 @@ static int write_zeroes(int argc, char **argv, struct command *cmd, struct plugi
 		.storage_tag	= cfg.storage_tag,
 		.dspec		= cfg.dspec,
 		.timeout	= nvme_cfg.timeout,
-		.result		= NULL,
+		.result		= &result,
 	};
 	err = nvme_write_zeros(&args);
 	if (err < 0)
 		nvme_show_error("write-zeroes: %s", nvme_strerror(errno));
 	else if (err != 0)
 		nvme_show_status(err);
-	else
+	else {
 		printf("NVME Write Zeroes Success\n");
+		if (cfg.nsz && argconfig_parse_seen(opts, "verbose")) {
+			if (result & 0x1)
+				printf("All logical blocks in the entire namespace cleared to zero\n");
+			else
+				printf("%d logical blocks cleared to zero\n", cfg.block_count);
+		}
+	}
 
 	return err;
 }
@@ -7035,6 +7294,7 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin
 	__u32 nlbs[256] = {0,};
 	__u64 slbas[256] = {0,};
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -7072,6 +7332,12 @@ static int dsm(int argc, char **argv, struct command *cmd, struct plugin *plugin
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	nc = argconfig_parse_comma_sep_array_u32(cfg.ctx_attrs, ctx_attrs, ARRAY_SIZE(ctx_attrs));
 	nb = argconfig_parse_comma_sep_array_u32(cfg.blocks, nlbs, ARRAY_SIZE(nlbs));
 	ns = argconfig_parse_comma_sep_array_u64(cfg.slbas, slbas, ARRAY_SIZE(slbas));
@@ -7378,6 +7644,7 @@ static int resv_acquire(int argc, char **argv, struct command *cmd, struct plugi
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -7409,6 +7676,12 @@ static int resv_acquire(int argc, char **argv, struct command *cmd, struct plugi
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!cfg.namespace_id) {
 		err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id);
 		if (err < 0) {
@@ -7455,6 +7728,7 @@ static int resv_register(int argc, char **argv, struct command *cmd, struct plug
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -7485,6 +7759,12 @@ static int resv_register(int argc, char **argv, struct command *cmd, struct plug
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!cfg.namespace_id) {
 		err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id);
 		if (err < 0) {
@@ -7539,6 +7819,7 @@ static int resv_release(int argc, char **argv, struct command *cmd, struct plugi
 
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -7567,6 +7848,12 @@ static int resv_release(int argc, char **argv, struct command *cmd, struct plugi
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!cfg.namespace_id) {
 		err = nvme_get_nsid(dev_fd(dev), &cfg.namespace_id);
 		if (err < 0) {
@@ -7611,6 +7898,7 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin
 	const char *eds = "request extended data structure";
 
 	_cleanup_free_ struct nvme_resv_status *status = NULL;
+	_cleanup_free_ struct nvme_id_ctrl *ctrl = NULL;
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	nvme_print_flags_t flags;
 	int err, size;
@@ -7663,6 +7951,19 @@ static int resv_report(int argc, char **argv, struct command *cmd, struct plugin
 
 	size = (cfg.numd + 1) << 2;
 
+	ctrl = nvme_alloc(sizeof(*ctrl));
+	if (!ctrl)
+		return -ENOMEM;
+
+	err = nvme_cli_identify_ctrl(dev, ctrl);
+	if (err) {
+		nvme_show_error("identify-ctrl: %s", nvme_strerror(errno));
+		return -errno;
+	}
+
+	if (ctrl->ctratt & NVME_CTRL_CTRATT_128_ID)
+		cfg.eds = true;
+
 	status = nvme_alloc(size);
 	if (!status)
 		return -ENOMEM;
@@ -8218,6 +8519,7 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	_cleanup_free_ void *sec_buf = NULL;
 	int err;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u32	namespace_id;
@@ -8252,6 +8554,12 @@ static int sec_recv(int argc, char **argv, struct command *cmd, struct plugin *p
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.size) {
 		sec_buf = nvme_alloc(cfg.size);
 		if (!sec_buf)
@@ -8389,6 +8697,7 @@ static int capacity_mgmt(int argc, char **argv, struct command *cmd, struct plug
 	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
 	int err = -1;
 	__u32 result;
+	nvme_print_flags_t flags;
 
 	struct config {
 		__u8	operation;
@@ -8414,6 +8723,12 @@ static int capacity_mgmt(int argc, char **argv, struct command *cmd, struct plug
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.operation > 0xf) {
 		nvme_show_error("invalid operation field: %u", cfg.operation);
 		return -1;
@@ -8721,6 +9036,7 @@ static int passthru(int argc, char **argv, bool admin,
 	__u32 result;
 	const char *cmd_name = NULL;
 	struct timeval start_time, end_time;
+	nvme_print_flags_t flags_t;
 
 	struct passthru_config cfg = {
 		.opcode		= 0,
@@ -8777,6 +9093,12 @@ static int passthru(int argc, char **argv, bool admin,
 	if (err)
 		return err;
 
+	err = validate_output_format(nvme_cfg.output_format, &flags_t);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (cfg.opcode & 0x01) {
 		cfg.write = true;
 		flags = O_RDONLY;
@@ -9911,6 +10233,660 @@ static int nmi_send(int argc, char **argv, struct command *cmd, struct plugin *p
 	return nvme_mi(argc, argv, nvme_admin_nvme_mi_send, desc);
 }
 
+static int get_mgmt_addr_list_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+	const char *desc = "Retrieve Management Address List Log, show it";
+	nvme_print_flags_t flags;
+	int err = -1;
+
+	_cleanup_free_ struct nvme_mgmt_addr_list_log *ma_log = NULL;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	NVME_ARGS(opts);
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	ma_log = nvme_alloc(sizeof(*ma_log));
+	if (!ma_log)
+		return -ENOMEM;
+
+	err = nvme_cli_get_log_mgmt_addr_list(dev, sizeof(*ma_log), ma_log);
+	if (!err)
+		nvme_show_mgmt_addr_list_log(ma_log, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		nvme_show_perror("management address list log");
+
+	return err;
+}
+
+static int get_rotational_media_info_log(int argc, char **argv, struct command *cmd,
+					 struct plugin *plugin)
+{
+	const char *desc = "Retrieve Rotational Media Information Log, show it";
+	nvme_print_flags_t flags;
+	int err = -1;
+
+	_cleanup_free_ struct nvme_rotational_media_info_log *info = NULL;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	struct config {
+		__u16 endgid;
+	};
+
+	struct config cfg = {
+		.endgid = 0,
+	};
+
+	NVME_ARGS(opts,
+		  OPT_UINT("endg-id", 'e', &cfg.endgid, endgid));
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	info = nvme_alloc(sizeof(*info));
+	if (!info)
+		return -ENOMEM;
+
+	err = nvme_cli_get_log_rotational_media_info(dev, cfg.endgid, sizeof(*info), info);
+	if (!err)
+		nvme_show_rotational_media_info_log(info, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		nvme_show_perror("rotational media info log");
+
+	return err;
+}
+
+static int get_dispersed_ns_psub(struct nvme_dev *dev, __u32 nsid,
+				 struct nvme_dispersed_ns_participating_nss_log **logp)
+{
+	int err;
+	__u64 header_len = sizeof(**logp);
+	__u64 psub_list_len;
+	struct nvme_get_log_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.lid = NVME_LOG_LID_DISPERSED_NS_PARTICIPATING_NSS,
+		.nsid = nsid,
+		.lpo = header_len,
+	};
+	struct nvme_dispersed_ns_participating_nss_log *log = nvme_alloc(header_len);
+
+	if (!log)
+		return -ENOMEM;
+
+	err = nvme_cli_get_log_dispersed_ns_participating_nss(dev, nsid, header_len, log);
+	if (err)
+		goto err_free;
+
+	psub_list_len = le64_to_cpu(log->numpsub) * NVME_NQN_LENGTH;
+
+	log = nvme_realloc(log, header_len + psub_list_len);
+	if (!log) {
+		err = -ENOMEM;
+		goto err_free;
+	}
+
+	args.log = log->participating_nss,
+	args.len = psub_list_len;
+
+	err = nvme_cli_get_log_page(dev, NVME_LOG_PAGE_PDU_SIZE, &args);
+	if (err)
+		goto err_free;
+
+	*logp = log;
+	return 0;
+
+err_free:
+	free(log);
+	return err;
+}
+
+static int get_dispersed_ns_participating_nss_log(int argc, char **argv, struct command *cmd,
+						  struct plugin *plugin)
+{
+	const char *desc = "Retrieve Dispersed Namespace Participating NVM Subsystems Log, show it";
+	nvme_print_flags_t flags;
+	int err;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	_cleanup_free_ struct nvme_dispersed_ns_participating_nss_log *log = NULL;
+
+	struct config {
+		__u32 namespace_id;
+	};
+
+	struct config cfg = {
+		.namespace_id = 1,
+	};
+
+	NVME_ARGS(opts, OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace_id_desired));
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	err = get_dispersed_ns_psub(dev, cfg.namespace_id, &log);
+	if (!err)
+		nvme_show_dispersed_ns_psub_log(log, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		nvme_show_perror("dispersed ns participating nss log");
+
+	return err;
+}
+
+static int get_log_offset(struct nvme_dev *dev, struct nvme_get_log_args *args, __u64 *offset,
+			  __u32 len, void **log)
+{
+	args->lpo = *offset,
+	args->log = *log + *offset,
+	args->len = len;
+	*offset += args->len;
+	*log = nvme_realloc(*log, *offset);
+	if (!*log)
+		return -ENOMEM;
+	return nvme_cli_get_log_page(dev, NVME_LOG_PAGE_PDU_SIZE, args);
+}
+
+static int get_reachability_group_desc(struct nvme_dev *dev, struct nvme_get_log_args *args,
+				       __u64 *offset, struct nvme_reachability_groups_log **logp)
+{
+	int err;
+	struct nvme_reachability_groups_log *log = *logp;
+	__u16 i;
+	__u32 len;
+
+	for (i = 0; i < le16_to_cpu(log->nrgd); i++) {
+		len = sizeof(*log->rgd);
+		err = get_log_offset(dev, args, offset, len, (void **)&log);
+		if (err)
+			goto err_free;
+		len = le32_to_cpu(log->rgd[i].nnid) * sizeof(*log->rgd[i].nsid);
+		err = get_log_offset(dev, args, offset, len, (void **)&log);
+		if (err)
+			goto err_free;
+	}
+
+	*logp = log;
+	return 0;
+
+err_free:
+	free(log);
+	*logp = NULL;
+	return err;
+}
+
+static int get_reachability_groups(struct nvme_dev *dev, bool rgo, bool rae,
+				   struct nvme_reachability_groups_log **logp,
+				   __u64 *lenp)
+{
+	int err;
+	struct nvme_reachability_groups_log *log;
+	__u64 log_len = sizeof(*log);
+	struct nvme_get_log_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.lid = NVME_LOG_LID_REACHABILITY_GROUPS,
+		.nsid = NVME_NSID_ALL,
+		.lsp = rgo,
+		.rae = rae,
+	};
+
+	log = nvme_alloc(log_len);
+	if (!log)
+		return -ENOMEM;
+
+	err = nvme_cli_get_log_reachability_groups(dev, rgo, rae, log_len, log);
+	if (err)
+		goto err_free;
+
+	err = get_reachability_group_desc(dev, &args, &log_len, &log);
+	if (err)
+		goto err_free;
+
+	*logp = log;
+	*lenp = log_len;
+	return 0;
+
+err_free:
+	free(log);
+	return err;
+}
+
+static int get_reachability_groups_log(int argc, char **argv, struct command *cmd,
+				       struct plugin *plugin)
+{
+	const char *desc = "Retrieve Reachability Groups Log, show it";
+	const char *rgo = "Return Groups Only";
+	nvme_print_flags_t flags;
+	int err;
+	__u64 len = 0;
+
+	_cleanup_free_ struct nvme_reachability_groups_log *log = NULL;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	struct config {
+		bool rgo;
+		bool rae;
+	};
+
+	struct config cfg = {
+		.rgo = false,
+		.rae = false,
+	};
+
+	NVME_ARGS(opts,
+		  OPT_FLAG("groups-only", 'g', &cfg.rgo, rgo),
+		  OPT_FLAG("rae", 'r', &cfg.rae, rae));
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	err = get_reachability_groups(dev, cfg.rgo, cfg.rae, &log, &len);
+	if (!err)
+		nvme_show_reachability_groups_log(log, len, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		nvme_show_perror("reachability groups log");
+
+	return err;
+}
+
+static int get_reachability_association_desc(struct nvme_dev *dev, struct nvme_get_log_args *args,
+					     __u64 *offset,
+					     struct nvme_reachability_associations_log **logp)
+{
+	int err;
+	struct nvme_reachability_associations_log *log = *logp;
+	__u16 i;
+	__u32 len;
+
+	for (i = 0; i < le16_to_cpu(log->nrad); i++) {
+		len = sizeof(*log->rad);
+		err = get_log_offset(dev, args, offset, len, (void **)&log);
+		if (err)
+			goto err_free;
+		len = le32_to_cpu(log->rad[i].nrid) * sizeof(*log->rad[i].rgid);
+		err = get_log_offset(dev, args, offset, len, (void **)&log);
+		if (err)
+			goto err_free;
+	}
+
+	*logp = log;
+	return 0;
+
+err_free:
+	free(log);
+	*logp = NULL;
+	return err;
+}
+
+static int get_reachability_associations(struct nvme_dev *dev, bool rao, bool rae,
+					 struct nvme_reachability_associations_log **logp,
+					 __u64 *lenp)
+{
+	int err;
+	struct nvme_reachability_associations_log *log;
+	__u64 log_len = sizeof(*log);
+	struct nvme_get_log_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.lid = NVME_LOG_LID_REACHABILITY_ASSOCIATIONS,
+		.nsid = NVME_NSID_ALL,
+		.lsp = rao,
+		.rae = rae,
+	};
+
+	log = nvme_alloc(log_len);
+	if (!log)
+		return -ENOMEM;
+
+	err = nvme_cli_get_log_reachability_associations(dev, rao, rae, log_len, log);
+	if (err)
+		goto err_free;
+
+	err = get_reachability_association_desc(dev, &args, &log_len, &log);
+	if (err)
+		goto err_free;
+
+	*logp = log;
+	*lenp = log_len;
+	return 0;
+
+err_free:
+	free(log);
+	return err;
+}
+
+static int get_reachability_associations_log(int argc, char **argv, struct command *cmd,
+					     struct plugin *plugin)
+{
+	const char *desc = "Retrieve Reachability Associations Log, show it";
+	const char *rao = "Return Associations Only";
+	nvme_print_flags_t flags;
+	int err;
+	__u64 len = 0;
+
+	_cleanup_free_ struct nvme_reachability_associations_log *log = NULL;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	struct config {
+		bool rao;
+		bool rae;
+	};
+
+	struct config cfg = {
+		.rao = false,
+		.rae = false,
+	};
+
+	NVME_ARGS(opts,
+		  OPT_FLAG("associations-only", 'a', &cfg.rao, rao),
+		  OPT_FLAG("rae", 'r', &cfg.rae, rae));
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	err = get_reachability_associations(dev, cfg.rao, cfg.rae, &log, &len);
+	if (!err)
+		nvme_show_reachability_associations_log(log, len, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		nvme_show_perror("reachability associations log");
+
+	return err;
+}
+
+static int get_host_discovery(struct nvme_dev *dev, bool allhoste, bool rae,
+			      struct nvme_host_discover_log **logp)
+{
+	int err;
+	struct nvme_host_discover_log *log;
+	__u64 log_len = sizeof(*log);
+	struct nvme_get_log_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.lid = NVME_LOG_LID_HOST_DISCOVER,
+		.nsid = NVME_NSID_ALL,
+		.lsp = allhoste,
+		.rae = rae,
+	};
+
+	log = nvme_alloc(log_len);
+	if (!log)
+		return -ENOMEM;
+
+	err = nvme_cli_get_log_host_discovery(dev, allhoste, rae, log_len, log);
+	if (err)
+		goto err_free;
+
+	log_len = le32_to_cpu(log->thdlpl);
+	err = get_log_offset(dev, &args, &log_len, le32_to_cpu(log->thdlpl) - log_len,
+			     (void **)&log);
+	if (err)
+		goto err_free;
+
+	*logp = log;
+	return 0;
+
+err_free:
+	free(log);
+	return err;
+}
+
+static int get_host_discovery_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+	const char *desc = "Retrieve Host Discovery Log, show it";
+	const char *allhoste = "All Host Entries";
+	nvme_print_flags_t flags;
+	int err;
+
+	_cleanup_free_ struct nvme_host_discover_log *log = NULL;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	struct config {
+		bool allhoste;
+		bool rae;
+	};
+
+	struct config cfg = {
+		.allhoste = false,
+		.rae = false,
+	};
+
+	NVME_ARGS(opts,
+		  OPT_FLAG("all-host-entries", 'a', &cfg.allhoste, allhoste),
+		  OPT_FLAG("rae", 'r', &cfg.rae, rae));
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	err = get_host_discovery(dev, cfg.allhoste, cfg.rae, &log);
+	if (!err)
+		nvme_show_host_discovery_log(log, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		nvme_show_perror("host discovery log");
+
+	return err;
+}
+
+static int get_ave_discovery(struct nvme_dev *dev, bool rae, struct nvme_ave_discover_log **logp)
+{
+	int err;
+	struct nvme_ave_discover_log *log;
+	__u64 log_len = sizeof(*log);
+	struct nvme_get_log_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.lid = NVME_LOG_LID_AVE_DISCOVER,
+		.nsid = NVME_NSID_ALL,
+		.rae = rae,
+	};
+
+	log = nvme_alloc(log_len);
+	if (!log)
+		return -ENOMEM;
+
+	err = nvme_cli_get_log_ave_discovery(dev, rae, log_len, log);
+	if (err)
+		goto err_free;
+
+	log_len = le32_to_cpu(log->tadlpl);
+	err = get_log_offset(dev, &args, &log_len, le32_to_cpu(log->tadlpl) - log_len,
+			     (void **)&log);
+	if (err)
+		goto err_free;
+
+	*logp = log;
+	return 0;
+
+err_free:
+	free(log);
+	return err;
+}
+
+static int get_ave_discovery_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+	const char *desc = "Retrieve AVE Discovery Log, show it";
+	nvme_print_flags_t flags;
+	int err;
+
+	_cleanup_free_ struct nvme_ave_discover_log *log = NULL;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	struct config {
+		bool rae;
+	};
+
+	struct config cfg = {
+		.rae = false,
+	};
+
+	NVME_ARGS(opts, OPT_FLAG("rae", 'r', &cfg.rae, rae));
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	err = get_ave_discovery(dev, cfg.rae, &log);
+	if (!err)
+		nvme_show_ave_discovery_log(log, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		nvme_show_perror("ave discovery log");
+
+	return err;
+}
+
+static int get_pull_model_ddc_req(struct nvme_dev *dev,
+				  bool rae, struct nvme_pull_model_ddc_req_log **logp)
+{
+	int err;
+	struct nvme_pull_model_ddc_req_log *log;
+	__u64 log_len = sizeof(*log);
+	struct nvme_get_log_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.lid = NVME_LOG_LID_PULL_MODEL_DDC_REQ,
+		.nsid = NVME_NSID_ALL,
+		.rae = rae,
+	};
+
+	log = nvme_alloc(log_len);
+	if (!log)
+		return -ENOMEM;
+
+	err = nvme_cli_get_log_pull_model_ddc_req(dev, rae, log_len, log);
+	if (err)
+		goto err_free;
+
+	log_len = le32_to_cpu(log->tpdrpl);
+	err = get_log_offset(dev, &args, &log_len, le32_to_cpu(log->tpdrpl) - log_len,
+			     (void **)&log);
+	if (err)
+		goto err_free;
+
+	*logp = log;
+	return 0;
+
+err_free:
+	free(log);
+	return err;
+}
+
+static int get_pull_model_ddc_req_log(int argc, char **argv, struct command *cmd,
+				      struct plugin *plugin)
+{
+	const char *desc = "Retrieve Pull Model DDC Request Log, show it";
+	nvme_print_flags_t flags;
+	int err;
+
+	_cleanup_free_ struct nvme_pull_model_ddc_req_log *log = NULL;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	struct config {
+		bool rae;
+	};
+
+	struct config cfg = {
+		.rae = false,
+	};
+
+	NVME_ARGS(opts, OPT_FLAG("rae", 'r', &cfg.rae, rae));
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	err = get_pull_model_ddc_req(dev, cfg.rae, &log);
+	if (!err)
+		nvme_show_pull_model_ddc_req_log(log, flags);
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		nvme_show_perror("pull model ddc req log");
+
+	return err;
+}
+
 void register_extension(struct plugin *plugin)
 {
 	plugin->parent = &nvme;
diff --git a/nvme.h b/nvme.h
index cae4345..363a82d 100644
--- a/nvme.h
+++ b/nvme.h
@@ -31,6 +31,7 @@
 #include "util/mem.h"
 #include "util/argconfig.h"
 #include "util/cleanup.h"
+#include "util/types.h"
 
 enum nvme_print_flags {
 	NORMAL		= 0,
@@ -147,7 +148,6 @@ const char *nvme_select_to_string(int sel);
 
 void d(unsigned char *buf, int len, int width, int group);
 void d_raw(unsigned char *buf, unsigned len);
-uint64_t int48_to_long(uint8_t *data);
 
 int get_reg_size(int offset);
 bool nvme_is_ctrl_reg(int offset);
diff --git a/nvme.spec.in b/nvme.spec.in
index 43fc930..551c9b7 100644
--- a/nvme.spec.in
+++ b/nvme.spec.in
@@ -32,6 +32,7 @@ touch %{buildroot}@SYSCONFDIR@/nvme/hostid
 %ghost @SYSCONFDIR@/nvme/config.json
 @UDEVRULESDIR@/65-persistent-net-nbft.rules
 @UDEVRULESDIR@/70-nvmf-autoconnect.rules
+@UDEVRULESDIR@/70-nvmf-keys.rules
 @UDEVRULESDIR@/71-nvmf-netapp.rules
 @DRACUTRILESDIR@/70-nvmf-autoconnect.conf
 @SYSTEMDDIR@/nvmf-connect@.service
diff --git a/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in b/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in
index 0b175be..13b0eba 100644
--- a/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in
+++ b/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in
@@ -4,4 +4,4 @@
 #   the PSK keyring module gets loaded.
 #
 #
-ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvme_tcp", TEST=="@SYSCONFDIR@/tls-keys", RUN+="@SBINDIR@/nvme tls --import --keyfile @SYSCONFDIR@/tls-keys"
+ACTION=="add", SUBSYSTEM=="module", KERNEL=="nvme_tcp", TEST=="@SYSCONFDIR@/nvme/tls-keys", RUN+="@SBINDIR@/nvme tls --import --keyfile @SYSCONFDIR@/nvme/tls-keys"
diff --git a/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in b/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
index 99b6a8b..c76a3c4 100644
--- a/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
+++ b/nvmf-autoconnect/udev-rules/71-nvmf-netapp.rules.in
@@ -1,5 +1,5 @@
-# Enable round-robin for NetApp ONTAP and NetApp E-Series
-ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="round-robin"
+# Set appropriate iopolicy for NetApp ONTAP and NetApp E-Series
+ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp ONTAP Controller", ATTR{iopolicy}="queue-depth"
 ACTION=="add", SUBSYSTEM=="nvme-subsystem", ATTR{subsystype}=="nvm", ATTR{model}=="NetApp E-Series", ATTR{iopolicy}="round-robin"
 
 # Set ctrl_loss_tmo to -1 for NetApp ONTAP NVMe/TCP
diff --git a/plugins/amzn/amzn-nvme.c b/plugins/amzn/amzn-nvme.c
index d359cc3..983c31b 100644
--- a/plugins/amzn/amzn-nvme.c
+++ b/plugins/amzn/amzn-nvme.c
@@ -10,15 +10,59 @@
 #include "nvme.h"
 #include "libnvme.h"
 #include "plugin.h"
+#include "nvme-print.h"
 
 #define CREATE_CMD
 #include "amzn-nvme.h"
 
+#define AMZN_NVME_STATS_LOGPAGE_ID 0xD0
+#define AMZN_NVME_STATS_MAGIC 0x3C23B510
+
+#define array_add_obj json_array_add_value_object
+#define obj_add_array json_object_add_value_array
+#define obj_add_obj json_object_add_value_object
+#define obj_add_uint json_object_add_value_uint
+#define obj_add_uint64 json_object_add_value_uint64
+
 struct nvme_vu_id_ctrl_field {
 	__u8			bdev[32];
 	__u8			reserved0[992];
 };
 
+struct amzn_latency_histogram_bin {
+	__u64 lower;
+	__u64 upper;
+	__u32 count;
+	__u32 reserved;
+} __packed;
+
+struct amzn_latency_histogram {
+	__u64 num_bins;
+	struct amzn_latency_histogram_bin bins[64];
+} __packed;
+
+struct amzn_latency_log_page {
+	__u32 magic;
+	__u32 reserved0;
+	__u64 total_read_ops;
+	__u64 total_write_ops;
+	__u64 total_read_bytes;
+	__u64 total_write_bytes;
+	__u64 total_read_time;
+	__u64 total_write_time;
+	__u64 ebs_volume_performance_exceeded_iops;
+	__u64 ebs_volume_performance_exceeded_tp;
+	__u64 ec2_instance_ebs_performance_exceeded_iops;
+	__u64 ec2_instance_ebs_performance_exceeded_tp;
+	__u64 volume_queue_length;
+	__u8 reserved1[416];
+
+	struct amzn_latency_histogram read_io_latency_histogram;
+	struct amzn_latency_histogram write_io_latency_histogram;
+
+	__u8 reserved2[496];
+} __packed;
+
 static void json_amzn_id_ctrl(struct nvme_vu_id_ctrl_field *id,
 	char *bdev,
 	struct json_object *root)
@@ -52,3 +96,180 @@ static int id_ctrl(int argc, char **argv, struct command *cmd, struct plugin *pl
 {
 	return __id_ctrl(argc, argv, cmd, plugin, amzn_id_ctrl);
 }
+
+static void amzn_print_latency_histogram(struct amzn_latency_histogram *hist)
+{
+	printf("=================================\n");
+	printf("Lower       Upper        IO Count\n");
+	printf("=================================\n");
+
+	for (int b = 0; b < hist->num_bins && b < 64; b++) {
+		struct amzn_latency_histogram_bin *bin = &hist->bins[b];
+
+		printf("[%-8"PRIu64" - %-8"PRIu64"] => %-8u\n",
+		       (uint64_t)bin->lower, (uint64_t)bin->upper, bin->count);
+	}
+
+	printf("=================================\n\n");
+}
+
+#ifdef CONFIG_JSONC
+static void amzn_json_add_histogram(struct json_object *root,
+				    struct amzn_latency_histogram *hist)
+{
+	struct json_object *bins = json_create_array();
+
+	obj_add_uint64(root, "num_bins", hist->num_bins);
+	obj_add_array(root, "bins", bins);
+
+	for (int b = 0; b < hist->num_bins && b < 64; b++) {
+		struct amzn_latency_histogram_bin *bin = &hist->bins[b];
+		struct json_object *json_bin = json_create_object();
+
+		obj_add_uint64(json_bin, "lower", bin->lower);
+		obj_add_uint64(json_bin, "upper", bin->upper);
+		obj_add_uint(json_bin, "count", bin->count);
+
+		array_add_obj(bins, json_bin);
+	}
+}
+
+static void amzn_print_json_stats(struct amzn_latency_log_page *log)
+{
+	struct json_object *root = json_create_object();
+	struct json_object *r_hist = json_create_object();
+	struct json_object *w_hist = json_create_object();
+
+	obj_add_uint64(root, "total_read_ops", log->total_read_ops);
+	obj_add_uint64(root, "total_write_ops", log->total_write_ops);
+	obj_add_uint64(root, "total_read_bytes", log->total_read_bytes);
+	obj_add_uint64(root, "total_write_bytes", log->total_write_bytes);
+	obj_add_uint64(root, "total_read_time", log->total_read_time);
+	obj_add_uint64(root, "total_write_time", log->total_write_time);
+	obj_add_uint64(root, "ebs_volume_performance_exceeded_iops",
+		       log->ebs_volume_performance_exceeded_iops);
+	obj_add_uint64(root, "ebs_volume_performance_exceeded_tp",
+		       log->ebs_volume_performance_exceeded_tp);
+	obj_add_uint64(root,
+		       "ec2_instance_ebs_performance_exceeded_iops",
+		       log->ec2_instance_ebs_performance_exceeded_iops);
+	obj_add_uint64(root, "ec2_instance_ebs_performance_exceeded_tp",
+		       log->ec2_instance_ebs_performance_exceeded_tp);
+	obj_add_uint64(root, "volume_queue_length", log->volume_queue_length);
+
+	amzn_json_add_histogram(r_hist, &log->read_io_latency_histogram);
+	obj_add_obj(root, "read_io_latency_histogram", r_hist);
+	amzn_json_add_histogram(w_hist, &log->write_io_latency_histogram);
+	obj_add_obj(root, "write_io_latency_histogram", w_hist);
+
+	json_print_object(root, NULL);
+	printf("\n");
+
+	json_free_object(root);
+}
+#else /* CONFIG_JSONC */
+#define amzn_print_json_stats(log)
+#endif /* CONFIG_JSONC */
+
+static void amzn_print_normal_stats(struct amzn_latency_log_page *log)
+{
+	printf("Total Ops:\n");
+	printf("  Read: %"PRIu64"\n", (uint64_t)log->total_read_ops);
+	printf("  Write: %"PRIu64"\n", (uint64_t)log->total_write_ops);
+	printf("Total Bytes:\n");
+	printf("  Read: %"PRIu64"\n", (uint64_t)log->total_read_bytes);
+	printf("  Write: %"PRIu64"\n", (uint64_t)log->total_write_bytes);
+	printf("Total Time (us):\n");
+	printf("  Read: %"PRIu64"\n", (uint64_t)log->total_read_time);
+	printf("  Write: %"PRIu64"\n\n", (uint64_t)log->total_write_time);
+
+	printf("EBS Volume Performance Exceeded (us):\n");
+	printf("  IOPS: %"PRIu64"\n", (uint64_t)log->ebs_volume_performance_exceeded_iops);
+	printf("  Throughput: %"PRIu64"\n\n",
+	       (uint64_t)log->ebs_volume_performance_exceeded_tp);
+	printf("EC2 Instance EBS Performance Exceeded (us):\n");
+	printf("  IOPS: %"PRIu64"\n",
+	       (uint64_t)log->ec2_instance_ebs_performance_exceeded_iops);
+	printf("  Throughput: %"PRIu64"\n\n",
+	       (uint64_t)log->ec2_instance_ebs_performance_exceeded_tp);
+
+	printf("Queue Length (point in time): %"PRIu64"\n\n",
+	       (uint64_t)log->volume_queue_length);
+
+	printf("Read IO Latency Histogram\n");
+	amzn_print_latency_histogram(&log->read_io_latency_histogram);
+
+	printf("Write IO Latency Histogram\n");
+	amzn_print_latency_histogram(&log->write_io_latency_histogram);
+}
+
+static int get_stats(int argc, char **argv, struct command *cmd,
+		     struct plugin *plugin)
+{
+	const char *desc = "display command latency statistics";
+	struct nvme_dev *dev;
+	struct amzn_latency_log_page log = { 0 };
+	int rc;
+	nvme_print_flags_t flags;
+	int err;
+
+	struct config {
+		char *output_format;
+	};
+
+	struct config cfg = {
+		.output_format = "normal",
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_FMT("output-format", 'o', &cfg.output_format,
+			"Output Format: normal|json"),
+		OPT_END()};
+
+	rc = parse_and_open(&dev, argc, argv, desc, opts);
+	if (rc)
+		return rc;
+
+	struct nvme_get_log_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.lid = AMZN_NVME_STATS_LOGPAGE_ID,
+		.nsid = 1,
+		.lpo = 0,
+		.lsp = NVME_LOG_LSP_NONE,
+		.lsi = 0,
+		.rae = false,
+		.uuidx = 0,
+		.csi = NVME_CSI_NVM,
+		.ot = false,
+		.len = sizeof(log),
+		.log = &log,
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.result = NULL,
+	};
+
+	rc = nvme_get_log(&args);
+	if (rc != 0) {
+		fprintf(stderr, "[ERROR] %s: Failed to get log page, rc = %d",
+			__func__, rc);
+		return rc;
+	}
+
+	if (log.magic != AMZN_NVME_STATS_MAGIC) {
+		fprintf(stderr, "[ERROR] %s: Not an EBS device", __func__);
+		return -ENOTSUP;
+	}
+
+	err = validate_output_format(cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (flags & JSON)
+		amzn_print_json_stats(&log);
+	else
+		amzn_print_normal_stats(&log);
+
+	return 0;
+}
diff --git a/plugins/amzn/amzn-nvme.h b/plugins/amzn/amzn-nvme.h
index f6c4f8b..19f209b 100644
--- a/plugins/amzn/amzn-nvme.h
+++ b/plugins/amzn/amzn-nvme.h
@@ -10,6 +10,7 @@
 PLUGIN(NAME("amzn", "Amazon vendor specific extensions", NVME_VERSION),
 	COMMAND_LIST(
 		ENTRY("id-ctrl", "Send NVMe Identify Controller", id_ctrl)
+		ENTRY("stats", "Get EBS volume stats", get_stats)
 	)
 );
 
diff --git a/plugins/dapustor/dapustor-nvme.c b/plugins/dapustor/dapustor-nvme.c
index 1f96a62..b98b1a0 100644
--- a/plugins/dapustor/dapustor-nvme.c
+++ b/plugins/dapustor/dapustor-nvme.c
@@ -505,7 +505,9 @@ static int dapustor_additional_smart_log(int argc, char **argv, struct command *
 	const char *desc = "Get DapuStor vendor specific additional smart log, and show it.";
 	const char *namespace = "(optional) desired namespace";
 	const char *raw = "Dump output in binary format";
+#ifdef CONFIG_JSONC
 	const char *json = "Dump output in json format";
+#endif /* CONFIG_JSONC */
 
 	struct nvme_additional_smart_log smart_log;
 	struct nvme_extended_additional_smart_log ext_smart_log;
@@ -526,7 +528,7 @@ static int dapustor_additional_smart_log(int argc, char **argv, struct command *
 	OPT_ARGS(opts) = {
 		OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace),
 		OPT_FLAG("raw-binary",   'b', &cfg.raw_binary,   raw),
-		OPT_FLAG("json",         'j', &cfg.json,         json),
+		OPT_FLAG_JSON("json",    'j', &cfg.json,         json),
 		OPT_END()
 	};
 
diff --git a/plugins/fdp/fdp.c b/plugins/fdp/fdp.c
index cac0b2b..1aec757 100644
--- a/plugins/fdp/fdp.c
+++ b/plugins/fdp/fdp.c
@@ -215,6 +215,12 @@ static int fdp_stats(int argc, char **argv, struct command *cmd, struct plugin *
 	if (cfg.raw_binary)
 		flags = BINARY;
 
+	if (!cfg.egid) {
+		fprintf(stderr, "endurance group identifier required\n");
+		err = -EINVAL;
+		goto out;
+	}
+
 	memset(&stats, 0x0, sizeof(stats));
 
 	err = nvme_get_log_fdp_stats(dev->direct.fd, cfg.egid, 0, sizeof(stats), &stats);
@@ -276,6 +282,12 @@ static int fdp_events(int argc, char **argv, struct command *cmd, struct plugin
 	if (cfg.raw_binary)
 		flags = BINARY;
 
+	if (!cfg.egid) {
+		fprintf(stderr, "endurance group identifier required\n");
+		err = -EINVAL;
+		goto out;
+	}
+
 	memset(&events, 0x0, sizeof(events));
 
 	err = nvme_get_log_fdp_events(dev->direct.fd, cfg.egid,
@@ -539,3 +551,99 @@ out:
 
 	return err;
 }
+
+static int fdp_feature(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+	const char *desc = "Show, enable or disable FDP configuration";
+	const char *enable_conf_idx = "FDP configuration index to enable";
+	const char *endurance_group = "Endurance group ID";
+	const char *disable = "Disable current FDP configuration";
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	int err = -1;
+	__u32 result;
+	bool enabling_conf_idx = false;
+	struct nvme_set_features_args setf_args = {
+		.args_size	= sizeof(setf_args),
+		.fd		= -1,
+		.fid		= NVME_FEAT_FID_FDP,
+		.save		= 1,
+		.nsid		= NVME_NSID_ALL,
+		.data_len	= 0,
+		.data		= NULL,
+		.timeout	= NVME_DEFAULT_IOCTL_TIMEOUT,
+	};
+
+	struct config {
+		bool disable;
+		__u8 fdpcidx;
+		__u16 endgid;
+	};
+
+	struct config cfg = {
+		.disable = false,
+		.fdpcidx = 0,
+		.endgid = 0,
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_SHRT("endgrp-id", 'e', &cfg.endgid, endurance_group),
+		OPT_BYTE("enable-conf-idx", 'c', &cfg.fdpcidx, enable_conf_idx),
+		OPT_FLAG("disable", 'd', &cfg.disable, disable),
+		OPT_INCR("verbose",      'v', &nvme_cfg.verbose, verbose),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	enabling_conf_idx = argconfig_parse_seen(opts, "enable-conf-idx");
+	if (enabling_conf_idx && cfg.disable) {
+		nvme_show_error("Cannot enable and disable at the same time");
+		return -EINVAL;
+	}
+
+	if (!enabling_conf_idx && !cfg.disable) {
+		struct nvme_get_features_args getf_args = {
+			.args_size	= sizeof(getf_args),
+			.fd		= dev_fd(dev),
+			.fid		= NVME_FEAT_FID_FDP,
+			.nsid		= NVME_NSID_ALL,
+			.sel		= NVME_GET_FEATURES_SEL_CURRENT,
+			.cdw11		= cfg.endgid,
+			.uuidx		= 0,
+			.data_len	= 0,
+			.data		= NULL,
+			.timeout	= NVME_DEFAULT_IOCTL_TIMEOUT,
+			.result		= &result,
+		};
+
+		nvme_show_result("Endurance Group                               : %d", cfg.endgid);
+
+		err = nvme_get_features(&getf_args);
+		if (err) {
+			nvme_show_status(err);
+			return err;
+		}
+
+		nvme_show_result("Flexible Direct Placement Enable (FDPE)       : %s",
+				(result & 0x1) ? "Yes" : "No");
+		nvme_show_result("Flexible Direct Placement Configuration Index : %u",
+				(result >> 8) & 0xf);
+		return err;
+	}
+
+	setf_args.fd		= dev_fd(dev);
+	setf_args.cdw11		= cfg.endgid;
+	setf_args.cdw12		= cfg.fdpcidx << 8 | (!cfg.disable);
+
+	err = nvme_set_features(&setf_args);
+	if (err) {
+		nvme_show_status(err);
+		return err;
+	}
+	nvme_show_result("Success %s Endurance Group: %d, FDP configuration index: %d",
+	       (cfg.disable) ? "disabling" : "enabling", cfg.endgid, cfg.fdpcidx);
+	return err;
+}
diff --git a/plugins/fdp/fdp.h b/plugins/fdp/fdp.h
index f162b32..0cd44fb 100644
--- a/plugins/fdp/fdp.h
+++ b/plugins/fdp/fdp.h
@@ -15,7 +15,8 @@ PLUGIN(NAME("fdp", "Manage Flexible Data Placement enabled devices", NVME_VERSIO
 		ENTRY("events", "List events affecting reclaim units and media usage", fdp_events)
 		ENTRY("status", "Show reclaim unit handle status", fdp_status)
 		ENTRY("update", "Update a reclaim unit handle", fdp_update)
-		ENTRY("set-events", "Enabled or disable events", fdp_set_events)
+		ENTRY("set-events", "Enable or disable events", fdp_set_events)
+		ENTRY("feature", "Show, enable or disable FDP configuration", fdp_feature)
 	)
 );
 
diff --git a/plugins/huawei/huawei-nvme.c b/plugins/huawei/huawei-nvme.c
index c09d8d3..5de0d3b 100644
--- a/plugins/huawei/huawei-nvme.c
+++ b/plugins/huawei/huawei-nvme.c
@@ -117,6 +117,7 @@ static int huawei_get_nvme_info(int fd, struct huawei_list_item *item, const cha
 	return 0;
 }
 
+#ifdef CONFIG_JSONC
 static void format(char *formatter, size_t fmt_sz, char *tofmt, size_t tofmtsz)
 {
 	fmt_sz = snprintf(formatter, fmt_sz, "%-*.*s", (int)tofmtsz, (int)tofmtsz, tofmt);
@@ -177,6 +178,7 @@ static void huawei_json_print_list_items(struct huawei_list_item *list_items,
 	printf("\n");
 	json_free_object(root);
 }
+#endif /* CONFIG_JSONC */
 
 static void huawei_print_list_head(struct huawei_list_element_len element_len)
 {
@@ -351,9 +353,11 @@ static int huawei_list(int argc, char **argv, struct command *command,
 	}
 
 	if (huawei_num > 0) {
+#ifdef CONFIG_JSONC
 		if (fmt == JSON)
 			huawei_json_print_list_items(list_items, huawei_num);
 		else
+#endif /* CONFIG_JSONC */
 			huawei_print_list_items(list_items, huawei_num);
 	}
 out_free_list_items:
diff --git a/plugins/intel/intel-nvme.c b/plugins/intel/intel-nvme.c
index 378ecc0..faf1a15 100644
--- a/plugins/intel/intel-nvme.c
+++ b/plugins/intel/intel-nvme.c
@@ -336,7 +336,9 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
 	    "Get Intel vendor specific additional smart log (optionally, for the specified namespace), and show it.";
 	const char *namespace = "(optional) desired namespace";
 	const char *raw = "Dump output in binary format";
+#ifdef CONFIG_JSONC
 	const char *json = "Dump output in json format";
+#endif /* CONFIG_JSONC */
 
 	struct nvme_additional_smart_log smart_log;
 	struct nvme_dev *dev;
@@ -355,7 +357,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
 	OPT_ARGS(opts) = {
 		OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace),
 		OPT_FLAG("raw-binary",   'b', &cfg.raw_binary,   raw),
-		OPT_FLAG("json",         'j', &cfg.json,         json),
+		OPT_FLAG_JSON("json",    'j', &cfg.json,         json),
 		OPT_END()
 	};
 
@@ -1032,7 +1034,9 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
 
 	const char *desc = "Get Intel Latency Statistics log and show it.";
 	const char *raw = "Dump output in binary format";
+#ifdef CONFIG_JSONC
 	const char *json = "Dump output in json format";
+#endif /* CONFIG_JSONC */
 	const char *write = "Get write statistics (read default)";
 
 	struct config {
@@ -1047,7 +1051,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
 	OPT_ARGS(opts) = {
 		OPT_FLAG("write",	'w', &cfg.write,	write),
 		OPT_FLAG("raw-binary",	'b', &cfg.raw_binary,	raw),
-		OPT_FLAG("json",	'j', &cfg.json,		json),
+		OPT_FLAG_JSON("json",	'j', &cfg.json,		json),
 		OPT_END()
 	};
 
diff --git a/plugins/lm/lm-nvme.c b/plugins/lm/lm-nvme.c
new file mode 100644
index 0000000..47ea8a4
--- /dev/null
+++ b/plugins/lm/lm-nvme.c
@@ -0,0 +1,669 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., LTD.
+ *
+ * Authors: Nate Thornton <n.thornton@samsung.com>
+ */
+
+#include <assert.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <linux/fs.h>
+#include <inttypes.h>
+#include <asm/byteorder.h>
+#include <sys/mman.h>
+#include <sys/shm.h>
+#include <sys/sysinfo.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <dirent.h>
+#include <time.h>
+
+#include "common.h"
+#include "nvme.h"
+#include "nvme-print.h"
+#include "libnvme.h"
+#include "plugin.h"
+#include "linux/types.h"
+#include "nvme-wrap.h"
+#include "util/cleanup.h"
+
+#define CREATE_CMD
+#include "lm-nvme.h"
+
+#include "lm-print.h"
+
+static inline const char *arg_str(const char * const *strings, size_t array_size, size_t idx)
+{
+	if (idx < array_size && strings[idx])
+		return strings[idx];
+	return "unrecognized";
+}
+
+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
+#define ARGSTR(s, i) arg_str(s, ARRAY_SIZE(s), i)
+
+static int lm_create_cdq(int argc, char **argv, struct command *command, struct plugin *plugin)
+{
+	const char *desc = "Create Controller Data Queue for controller of specific type and size";
+	const char *sz = "CDQ Size (in dwords)";
+	const char *cntlid = "Controller ID";
+	const char *qt = "Queue Type (default: 0 = User Data Migration Queue)";
+	const char *consent = "I consent this will not work and understand a CDQ cannot be mapped "
+			      "to user space. If I proceed with the creation of a CDQ, the device "
+			      "will write to invalid memory, inevitably leading to MMU faults or "
+			      "worse.";
+
+	_cleanup_huge_ struct nvme_mem_huge mh = { 0, };
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	struct lba_migration_queue_entry_type_0 *queue = NULL;
+	int err = -1;
+
+	struct config {
+		__u32	sz;
+		__u16	cntlid;
+		__u8	qt;
+		bool	consent;
+		char	*file;
+	};
+
+	struct config cfg = {
+		.sz = 0,
+		.cntlid = 0,
+		.qt = 0,
+		.consent = false,
+		.file = NULL,
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_UINT("size",	's', &cfg.sz,		sz),
+		OPT_SHRT("cntlid",	'c', &cfg.cntlid,	cntlid),
+		OPT_BYTE("queue-type",	'q', &cfg.qt,		qt),
+		OPT_FLAG("consent",	  0, &cfg.consent,	consent),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	if (!consent) {
+		nvme_show_error("ERROR: consent required");
+		return -EINVAL;
+	}
+
+	// Not that it really matters, but we setup memory as if the CDQ can be held
+	// in user space regardless.
+	queue = nvme_alloc_huge(cfg.sz << 2, &mh);
+	if (!queue) {
+		nvme_show_error("ERROR: nvme_alloc of size %dB failed %s", cfg.sz << 2,
+				strerror(errno));
+		return -ENOMEM;
+	}
+
+	struct nvme_lm_cdq_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.sel = NVME_LM_SEL_CREATE_CDQ,
+		.mos = NVME_SET(cfg.qt, LM_QT),
+		.cntlid = cfg.cntlid,
+		.sz = cfg.sz,
+		.data = queue
+	};
+
+	err = nvme_lm_cdq(&args);
+	if (err < 0)
+		nvme_show_error("ERROR: nvme_lm_cdq() failed: %s", nvme_strerror(errno));
+	else if (err)
+		nvme_show_status(err);
+	else
+		printf("Create CDQ Successful: CDQID=0x%04x\n", args.cdqid);
+
+	return err;
+}
+
+static int lm_delete_cdq(int argc, char **argv, struct command *command, struct plugin *plugin)
+{
+	const char *desc = "Delete Controller Data Queue";
+	const char *cdqid = "Controller Data Queue ID";
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	int err = -1;
+
+	struct config {
+		__u16	cdqid;
+	};
+
+	struct config cfg = {
+		.cdqid = 0
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_SHRT("cdqid", 'C', &cfg.cdqid, cdqid),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	struct nvme_lm_cdq_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.sel = NVME_LM_SEL_DELETE_CDQ,
+		.cdqid = cfg.cdqid,
+	};
+
+	err = nvme_lm_cdq(&args);
+	if (err < 0)
+		nvme_show_error("ERROR: nvme_lm_cdq() failed: %s", nvme_strerror(errno));
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		printf("Delete CDQ Successful: CDQID=0x%04x\n", cfg.cdqid);
+
+	return err;
+}
+
+static const char * const lm_track_send_select_argstr[] = {
+	[NVME_LM_SEL_LOG_USER_DATA_CHANGES] = "Log User Data Changes",
+	[NVME_LM_SEL_TRACK_MEMORY_CHANGES] = "Track Memory Changes"
+};
+
+static int lm_track_send(int argc, char **argv, struct command *command, struct plugin *plugin)
+{
+	const char *desc = "Track Send command used to manage the tracking of information by a "
+			   "controller";
+	const char *sel = "Type of management operation to perform\n"
+				 "  0h = Log User Data Changes\n"
+				 "  1h = Track Memory Changes";
+	const char *mos = "Management operation specific";
+	const char *cdqid = "Controller Data Queue ID";
+	const char *start = "Equivalent to start tracking with defaults";
+	const char *stop = "Equivalent to stop tracking with defaults";
+
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	int err = -1;
+
+	struct config {
+		__s8  sel;
+		__u8  mos;
+		__u16 cdqid;
+		bool  start;
+		bool  stop;
+	};
+
+	struct config cfg = {
+		.sel = -1,
+		.mos = 0,
+		.cdqid = 0,
+		.start = false,
+		.stop = false,
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_BYTE("sel",		's', &cfg.sel,   sel),
+		OPT_BYTE("mos",		'm', &cfg.mos,   mos),
+		OPT_SHRT("cdqid",	'C', &cfg.cdqid, cdqid),
+		OPT_FLAG("start",	  0, &cfg.start, start),
+		OPT_FLAG("stop",	  0, &cfg.stop,  stop),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	if (cfg.sel == -1) {
+		nvme_show_error("Select field required");
+		return -EINVAL;
+	}
+
+	if (cfg.sel != NVME_LM_SEL_LOG_USER_DATA_CHANGES) {
+		nvme_show_error("Unsupported select option %d (%s)", cfg.sel,
+				ARGSTR(lm_track_send_select_argstr, cfg.sel));
+		return -EINVAL;
+	}
+
+	if (cfg.start && cfg.stop) {
+		nvme_show_error("Must select one of start & stop, not both");
+		return -EINVAL;
+	} else if (cfg.sel == NVME_LM_SEL_LOG_USER_DATA_CHANGES) {
+		if (cfg.start)
+			cfg.mos = NVME_SET(NVME_LM_LACT_START_LOGGING, LM_LACT);
+		else if (cfg.stop)
+			cfg.mos = NVME_SET(NVME_LM_LACT_STOP_LOGGING, LM_LACT);
+	}
+
+	struct nvme_lm_track_send_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.cdqid = cfg.cdqid,
+		.sel = cfg.sel,
+		.mos = cfg.mos,
+	};
+
+	err = nvme_lm_track_send(&args);
+	if (err < 0)
+		nvme_show_error("ERROR: nvme_lm_track_send() failed %s", strerror(errno));
+	else if (err)
+		nvme_show_status(err);
+	else
+		printf("Track Send (%s) Successful\n",
+		       ARGSTR(lm_track_send_select_argstr, cfg.sel));
+
+	return err;
+}
+
+static const char * const lm_migration_send_select_argstr[] = {
+	[NVME_LM_SEL_SUSPEND] = "Suspend",
+	[NVME_LM_SEL_RESUME] = "Resume",
+	[NVME_LM_SEL_SET_CONTROLLER_STATE] = "Set Controller State"
+};
+
+static int lm_migration_send(int argc, char **argv, struct command *command, struct plugin *plugin)
+{
+	const char *desc = "Migration Send command is used to manage the migration of a controller";
+	const char *sel = "Select (SEL) the type of management operation to perform "
+			   "(CDW10[07:00])\n"
+			   "  0h = Suspend\n"
+			   "  1h = Resume\n"
+			   "  2h = Set Controller State";
+	const char *cntlid = "Controller Identifier (CDW11[15:00])";
+	const char *stype = "Type of suspend (STYPE) (CDW11[23:16]\n"
+			    "  0h = Suspend Notification\n"
+			    "  1h = Suspend";
+	const char *dudmq = "Delete user data migration queue (DUDMQ) as part of suspend operation "
+			     "(CDW11[31])";
+	const char *seqind = "Sequence Indicator (CDW11[17:16])\n"
+			     "  0h = Not first not last\n"
+			     "  1h = First in two or more\n"
+			     "  2h = Last in two or more\n"
+			     "  3h = Entire state info";
+	const char *csuuidi = "Controller State UUID Index (CSUUIDI) (CDW11[31:24])";
+	const char *csvi = "Controller State Version Index (CSVI) (CDW11[23:16])";
+	const char *uidx = "UUID Index (UIDX) (CDW14[16:00])";
+	const char *offset = "Controller State Offset";
+	const char *numd = "Number of Dwords (NUMD)";
+	const char *input = "Controller State Data input file";
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	_cleanup_file_ FILE *file = NULL;
+	_cleanup_huge_ struct nvme_mem_huge mh = { 0, };
+	void *data = NULL;
+	int err = -1;
+
+	struct config {
+		__s8 sel;
+		__u16 cntlid;
+		__u8 stype;
+		__u8 seqind;
+		__u8 csuuidi;
+		__u8 csvi;
+		__u8 uidx;
+		__u64 offset;
+		__u32 numd;
+		char  *input;
+		bool  dudmq;
+	};
+
+	struct config cfg = {
+		.sel = -1,
+		.cntlid = 0,
+		.stype = 0,
+		.seqind = 0,
+		.csuuidi = 0,
+		.csvi = 0,
+		.uidx = 0,
+		.offset = 0,
+		.numd = 0,
+		.input = NULL,
+		.dudmq = false
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_BYTE("sel",		's', &cfg.sel, sel),
+		OPT_SHRT("cntlid",	'c', &cfg.cntlid, cntlid),
+		OPT_BYTE("stype",	't', &cfg.stype, stype),
+		OPT_FLAG("dudmq",	'd', &cfg.dudmq, dudmq),
+		OPT_BYTE("seq-ind",	'S', &cfg.seqind, seqind),
+		OPT_BYTE("csuuidi",	'U', &cfg.csuuidi, csuuidi),
+		OPT_BYTE("csvi",	'V', &cfg.csvi, csvi),
+		OPT_BYTE("uidx",	'u', &cfg.uidx, uidx),
+		OPT_LONG("offset",	'o', &cfg.offset, offset),
+		OPT_UINT("numd",	'n', &cfg.numd, numd),
+		OPT_FILE("input-file",	'f', &cfg.input, input),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	if (cfg.sel == -1) {
+		nvme_show_error("Select field required");
+		return -EINVAL;
+	}
+
+	// Sanity check input parameters
+	if (cfg.sel == NVME_LM_SEL_SUSPEND || cfg.sel == NVME_LM_SEL_RESUME) {
+		if (cfg.csuuidi != 0 || cfg.csvi != 0) {
+			nvme_show_error("Unexpected fields for %s",
+					ARGSTR(lm_migration_send_select_argstr, cfg.sel));
+			return -EINVAL;
+		}
+	} else if (cfg.sel == NVME_LM_SEL_SET_CONTROLLER_STATE) {
+		if (cfg.dudmq || cfg.stype != 0) {
+			nvme_show_error("Unexpected fields for %s",
+					ARGSTR(lm_migration_send_select_argstr, cfg.sel));
+			return -EINVAL;
+		} else if (!strlen(cfg.input)) {
+			nvme_show_error("Expected file for %s",
+					ARGSTR(lm_migration_send_select_argstr, cfg.sel));
+			return -EINVAL;
+		}
+	}
+
+	if (cfg.input && strlen(cfg.input)) {
+		file = fopen(cfg.input, "r");
+		if (file == NULL) {
+			nvme_show_perror(cfg.input);
+			return -EINVAL;
+		}
+
+		data = nvme_alloc_huge(cfg.numd << 2, &mh);
+		if (!data)
+			return -ENOMEM;
+
+		size_t n_data = fread(data, 1, cfg.numd << 2, file);
+
+		fclose(file);
+
+		if (n_data != (size_t)(cfg.numd << 2)) {
+			nvme_show_error("failed to read controller state data %s", strerror(errno));
+			return -errno;
+		}
+	}
+
+	struct nvme_lm_migration_send_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.sel = cfg.sel,
+		.mos = NVME_SET(cfg.seqind, LM_MIGRATION_SEND_MOS),
+		.cntlid = cfg.cntlid,
+		.csuuidi = cfg.csuuidi,
+		.uidx = cfg.uidx,
+		.stype = cfg.stype,
+		.offset = cfg.offset,
+		.dudmq = cfg.dudmq,
+		.numd = cfg.numd,
+		.data = data,
+	};
+
+	err = nvme_lm_migration_send(&args);
+	if (err < 0)
+		nvme_show_error("ERROR: nvme_lm_migration_send() failed %s", strerror(errno));
+	else if (err > 0)
+		nvme_show_status(err);
+	else
+		printf("Migration Send (%s) Successful\n",
+		       ARGSTR(lm_migration_send_select_argstr, cfg.sel));
+
+
+	return err;
+}
+
+static int lm_migration_recv(int argc, char **argv, struct command *command, struct plugin *plugin)
+{
+	const char *desc = "Migration Receive command is used to obtain information used to manage "
+			   " a migratable controller";
+	const char *sel = "Select (SEL) the type of management operation to perform "
+			   "(CDW10[07:00])\n"
+			   "  0h = Get Controller State";
+	const char *cntlid = "Controller Identifier (CDW10[31:16])";
+	const char *csuuidi = "Controller State UUID Index (CSUUIDI) (CDW11[23:16])";
+	const char *csvi = "Controller State Version Index (CSVI) (CDW11[7:0])";
+	const char *uidx = "UUID Index (UIDX) (CDW14[16:00])";
+	const char *offset = "Controller State Offset";
+	const char *numd = "Number of Dwords (NUMD)";
+	const char *output = "Controller State Data output file";
+	const char *human_readable_info = "show info in readable format";
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	_cleanup_file_ FILE *fd = NULL;
+	_cleanup_huge_ struct nvme_mem_huge mh = { 0, };
+	nvme_print_flags_t flags;
+	void *data = NULL;
+	int err = -1;
+
+	struct config {
+		__u8 sel;
+		__u16 cntlid;
+		__u8  csuuidi;
+		__u8  csvi;
+		__u8  uidx;
+		__u64 offset;
+		__u32 numd;
+		char  *output;
+		char  *output_format;
+		bool  human_readable;
+	};
+
+	struct config cfg = {
+		.sel = -1,
+		.cntlid = 0,
+		.csuuidi = 0,
+		.csvi = 0,
+		.uidx = 0,
+		.offset = 0,
+		.numd = 0,
+		.output = NULL,
+		.output_format = "normal",
+		.human_readable = false
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_BYTE("sel",			's', &cfg.sel, sel),
+		OPT_SHRT("cntlid",		'c', &cfg.cntlid, cntlid),
+		OPT_BYTE("csuuidi",		'U', &cfg.csuuidi, csuuidi),
+		OPT_BYTE("csvi",		'V', &cfg.csvi, csvi),
+		OPT_BYTE("uidx",		'u', &cfg.uidx, uidx),
+		OPT_LONG("offset",		'o', &cfg.offset, offset),
+		OPT_UINT("numd",		'n', &cfg.numd, numd),
+		OPT_FILE("output-file",		'f', &cfg.output, output),
+		OPT_FMT("output-format",	  0,   &cfg.output_format, output_format),
+		OPT_FLAG("human-readable",	'H', &cfg.human_readable, human_readable_info),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (cfg.output_format && cfg.offset != 0 && !(flags & BINARY)) {
+		nvme_show_error("cannot parse non-zero offset");
+		return -EINVAL;
+	}
+
+	if (cfg.human_readable)
+		flags |= VERBOSE;
+
+	if (cfg.output && strlen(cfg.output)) {
+		fd = fopen(cfg.output, "w");
+		if (fd < 0) {
+			nvme_show_perror(cfg.output);
+			return -errno;
+		}
+	}
+
+	data = nvme_alloc_huge((cfg.numd + 1) << 2, &mh);
+	if (!data)
+		return -ENOMEM;
+
+	__u32 result = 0;
+	struct nvme_lm_migration_recv_args args = {
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.sel = cfg.sel,
+		.mos = NVME_SET(cfg.csvi, LM_GET_CONTROLLER_STATE_CSVI),
+		.uidx = cfg.uidx,
+		.csuuidi = cfg.csuuidi,
+		.offset = cfg.offset,
+		.cntlid = cfg.cntlid,
+		.data = data,
+		.result = &result,
+	};
+
+	err = nvme_lm_migration_recv(&args);
+	if (err < 0)
+		nvme_show_error("ERROR: nvme_lm_migration_recv() failed %s", strerror(errno));
+	else if (err)
+		nvme_show_status(err);
+	else if (cfg.sel == NVME_LM_SEL_GET_CONTROLLER_STATE) {
+		if (flags == NORMAL)
+			printf("CDW0: 0x%x: Controller %sSuspended\n", result,
+			       (result & NVME_LM_GET_CONTROLLER_STATE_CSUP) ? "" : "NOT ");
+
+		if (cfg.output && strlen(cfg.output)) {
+			if (fwrite(data, 1, cfg.numd << 2, fd) != (cfg.numd << 2)) {
+				nvme_show_error("ERROR: %s: failed to write buffer to output file",
+						strerror(errno));
+				err = -errno;
+			}
+		} else {
+			lm_show_controller_state_data((struct nvme_lm_controller_state_data *)data,
+						      (cfg.numd + 1) << 2, cfg.offset, flags);
+		}
+	}
+
+	return 0;
+}
+
+enum lm_controller_data_queue_feature_id {
+	lm_cdq_feature_id = 0x21
+};
+
+static int lm_set_cdq(int argc, char **argv, struct command *command, struct plugin *plugin)
+{
+	const char *desc = "This Feature allows a host to update the status of the head pointer "
+			   "of a CDQ and specify the configuration of a CDQ Tail event.";
+	const char *cdqid = "Controller Data Queue ID";
+	const char *hp = "The slot of the head pointer for the specified CDQ";
+	const char *tpt = "If specified, the slot that causes the controller "
+			  " to issue a CDQ Tail Pointer event";
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	int err = -1;
+
+	struct config {
+		__u16 cdqid;
+		__u32 hp;
+		__s32 tpt;
+	};
+
+	struct config cfg = {
+		.cdqid = 0,
+		.hp = 0,
+		.tpt = -1,
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_SHRT("cdqid",	'C', &cfg.cdqid, cdqid),
+		OPT_UINT("hp",		'H', &cfg.hp, hp),
+		OPT_UINT("tpt",		'T', &cfg.tpt, tpt),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	struct nvme_set_features_args args = {
+		.args_size	= sizeof(args),
+		.fd		= dev_fd(dev),
+		.fid		= lm_cdq_feature_id,
+		.cdw11		= cfg.cdqid |
+				  ((cfg.tpt >= 0) ? NVME_SET(1, LM_CTRL_DATA_QUEUE_ETPT) : 0),
+		.cdw12		= cfg.hp,
+		.cdw13		= cfg.tpt
+	};
+
+	err = nvme_set_features(&args);
+	if (err < 0)
+		nvme_show_error("ERROR: nvme_set_features() failed %s", nvme_strerror(errno));
+	else if (err)
+		nvme_show_status(err);
+	else
+		printf("Success. Head Pointer: %d\n", cfg.hp);
+
+	return err;
+}
+
+static int lm_get_cdq(int argc, char **argv, struct command *command, struct plugin *plugin)
+{
+	const char *desc = "This Feature allows a host to retrieve the status of the head pointer "
+			   "of a CDQ and specify the configuration of a CDQ Tail event.";
+	const char *cdqid = "Controller Data Queue ID";
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+	nvme_print_flags_t flags;
+	int err = -1;
+
+	struct config {
+		__u16 cdqid;
+		char *output_format;
+	};
+
+	struct config cfg = {
+		.cdqid = 0,
+		.output_format  = "normal",
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_SHRT("cdqid",	 'C', &cfg.cdqid,	  cdqid),
+		OPT_FMT("output-format", 'o', &cfg.output_format, output_format),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+	if (err)
+		return err;
+
+	err = validate_output_format(cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	struct nvme_lm_ctrl_data_queue_fid_data data;
+
+	struct nvme_get_features_args args = {
+		.args_size	= sizeof(args),
+		.fd		= dev_fd(dev),
+		.fid		= lm_cdq_feature_id,
+		.cdw11		= cfg.cdqid,
+		.data		= &data,
+		.data_len	= sizeof(data)
+	};
+
+	err = nvme_get_features(&args);
+	if (err < 0)
+		nvme_show_error("ERROR: nvme_get_features() failed %s", nvme_strerror(errno));
+	else if (err)
+		nvme_show_status(err);
+	else
+		lm_show_controller_data_queue(&data, flags);
+
+	return err;
+}
diff --git a/plugins/lm/lm-nvme.h b/plugins/lm/lm-nvme.h
new file mode 100644
index 0000000..56b3a89
--- /dev/null
+++ b/plugins/lm/lm-nvme.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (c) 2024 Samsung Electronics Co., LTD.
+ *
+ * Authors: Nate Thornton <n.thornton@samsung.com>
+ */
+
+#undef CMD_INC_FILE
+#define CMD_INC_FILE plugins/lm/lm-nvme
+
+#if !defined(LIVE_MIGRATION_NVME) || defined(CMD_HEADER_MULTI_READ)
+#define LIVE_MIGRATION_NVME
+
+#include "cmd.h"
+
+PLUGIN(NAME("lm", "Live Migration NVMe extensions", NVME_VERSION),
+	COMMAND_LIST(
+		ENTRY("create-cdq",	"Create Controller Data Queue", lm_create_cdq)
+		ENTRY("delete-cdq",	"Delete Controller Data Queue", lm_delete_cdq)
+		ENTRY("track-send",	"Track Send Command", lm_track_send)
+		ENTRY("migration-send",	"Migration Send", lm_migration_send)
+		ENTRY("migration-recv",	"Migration Receive", lm_migration_recv)
+		ENTRY("set-cdq",	"Set Feature - Controller Data Queue (FID 21h)", lm_set_cdq)
+		ENTRY("get-cdq",	"Get Feature - Controller Data Queue (FID 21h)", lm_get_cdq)
+	)
+);
+
+#endif
+
+#include "define_cmd.h"
diff --git a/plugins/lm/lm-print-binary.c b/plugins/lm/lm-print-binary.c
new file mode 100644
index 0000000..9b48144
--- /dev/null
+++ b/plugins/lm/lm-print-binary.c
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "lm-print.h"
+
+static void binary_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len,
+					 __u32 offset)
+{
+	d_raw((unsigned char *)data, len);
+}
+
+static void binary_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data)
+{
+	d_raw((unsigned char *)data, sizeof(*data));
+}
+
+static struct lm_print_ops binary_print_ops = {
+	.controller_state_data = binary_controller_state_data,
+	.controller_data_queue = binary_controller_data_queue,
+};
+
+struct lm_print_ops *lm_get_binary_print_ops(nvme_print_flags_t flags)
+{
+	binary_print_ops.flags = flags;
+	return &binary_print_ops;
+}
diff --git a/plugins/lm/lm-print-json.c b/plugins/lm/lm-print-json.c
new file mode 100644
index 0000000..1990b96
--- /dev/null
+++ b/plugins/lm/lm-print-json.c
@@ -0,0 +1,109 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "lm-print.h"
+#include "common.h"
+
+static void json_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len,
+				      __u32 offset)
+{
+	if (offset) {
+		fprintf(stderr, "cannot understand non-zero offset\n");
+		return;
+	}
+
+	struct json_object *root = json_create_object();
+	struct json_object *nvmecs = json_create_object();
+	struct json_object *iosqs = json_create_array();
+	struct json_object *iocqs = json_create_array();
+
+	json_object_add_value_uint(root, "version",
+				   le16_to_cpu(data->hdr.ver));
+	json_object_add_value_uint(root, "controller state attributes",
+				   data->hdr.csattr);
+	json_object_add_value_uint128(root, "nvme controller state size",
+				      le128_to_cpu(data->hdr.nvmecss));
+	json_object_add_value_uint128(root, "vendor specific size",
+				      le128_to_cpu(data->hdr.vss));
+
+	json_object_add_value_object(root, "nvme controller state", nvmecs);
+
+	json_object_add_value_uint(nvmecs, "version",
+				   le16_to_cpu(data->data.hdr.ver));
+	json_object_add_value_uint(nvmecs, "number of io submission queues",
+				   le16_to_cpu(data->data.hdr.niosq));
+	json_object_add_value_uint(nvmecs, "number of io completion queues",
+				   le16_to_cpu(data->data.hdr.niocq));
+
+	json_object_add_value_array(nvmecs, "io submission queue list", iosqs);
+
+	for (int i = 0; i < data->data.hdr.niosq; i++) {
+		struct nvme_lm_io_submission_queue_data *sq = &data->data.sqs[i];
+		struct json_object *sq_obj = json_create_object();
+
+		json_object_add_value_uint64(sq_obj, "io submission prp entry 1",
+					     le64_to_cpu(sq->iosqprp1));
+		json_object_add_value_uint(sq_obj, "io submission queue size",
+					   le16_to_cpu(sq->iosqqsize));
+		json_object_add_value_uint(sq_obj, "io submission queue identifier",
+					   le16_to_cpu(sq->iosqqid));
+		json_object_add_value_uint(sq_obj, "io completion queue identifier",
+					   le16_to_cpu(sq->iosqcqid));
+		json_object_add_value_uint(sq_obj, "io submission queue attributes",
+					   le16_to_cpu(sq->iosqa));
+		json_object_add_value_uint(sq_obj, "io submission queue head pointer",
+					   le16_to_cpu(sq->iosqhp));
+		json_object_add_value_uint(sq_obj, "io submission queue tail pointer",
+					   le16_to_cpu(sq->iosqtp));
+
+		json_array_add_value_object(iosqs, sq_obj);
+	}
+
+	json_object_add_value_array(nvmecs, "io completion queue list", iocqs);
+
+	for (int i = 0; i < data->data.hdr.niocq; i++) {
+		struct nvme_lm_io_completion_queue_data *cq = &data->data.cqs[i];
+		struct json_object *cq_obj = json_create_object();
+
+		json_object_add_value_uint64(cq_obj, "io completion prp entry 1",
+					     le64_to_cpu(cq->iocqprp1));
+		json_object_add_value_uint(cq_obj, "io completion queue size",
+					   le16_to_cpu(cq->iocqqsize));
+		json_object_add_value_uint(cq_obj, "io completion queue identifier",
+					   le16_to_cpu(cq->iocqqid));
+		json_object_add_value_uint(cq_obj, "io completion queue head pointer",
+					   le16_to_cpu(cq->iocqhp));
+		json_object_add_value_uint(cq_obj, "io completion queue tail pointer",
+					   le16_to_cpu(cq->iocqtp));
+		json_object_add_value_uint(cq_obj, "io completion queue attributes",
+					   le32_to_cpu(cq->iocqa));
+
+		json_array_add_value_object(iocqs, cq_obj);
+	}
+
+	json_print_object(root, NULL);
+	printf("\n");
+	json_free_object(root);
+}
+
+static void json_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data)
+{
+	struct json_object *root = json_create_object();
+
+	json_object_add_value_uint(root, "head_pointer", le32_to_cpu(data->hp));
+	json_object_add_value_uint(root, "tail_pointer_trigger", le32_to_cpu(data->tpt));
+
+	json_print_object(root, NULL);
+	printf("\n");
+	json_free_object(root);
+}
+
+static struct lm_print_ops json_print_ops = {
+	.controller_state_data = json_controller_state_data,
+	.controller_data_queue = json_controller_data_queue
+};
+
+struct lm_print_ops *lm_get_json_print_ops(nvme_print_flags_t flags)
+{
+	json_print_ops.flags = flags;
+	return &json_print_ops;
+}
diff --git a/plugins/lm/lm-print-stdout.c b/plugins/lm/lm-print-stdout.c
new file mode 100644
index 0000000..4495199
--- /dev/null
+++ b/plugins/lm/lm-print-stdout.c
@@ -0,0 +1,145 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "lm-print.h"
+
+#include <inttypes.h>
+
+#include "common.h"
+#include "util/types.h"
+
+static struct lm_print_ops stdout_print_ops;
+
+static void stdout_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len,
+					 __u32 offset)
+{
+	if (offset) {
+		fprintf(stderr, "cannot understand non-zero offset\n");
+		return;
+	}
+
+	int human = stdout_print_ops.flags & VERBOSE;
+
+	if (sizeof(struct nvme_lm_controller_state_data_header) <= len) {
+		printf("Header:\n");
+		printf("%-45s: 0x%x\n", "Version (VER)", data->hdr.ver);
+		printf("%-45s: 0x%x\n", "Controller State Attributes (CSATTR)", data->hdr.csattr);
+		if (human)
+			printf("  [0:0] : 0x%x Controller %sSuspended\n",
+				data->hdr.csattr & 1, data->hdr.csattr & 1 ? "" : "NOT ");
+		printf("%-45s: %s\n", "NVMe Controller State Size (NVMECSS)",
+		       uint128_t_to_string(le128_to_cpu(data->hdr.nvmecss)));
+		printf("%-45s: %s\n", "Vendor Specific Size (VSS)",
+		       uint128_t_to_string(le128_to_cpu(data->hdr.vss)));
+
+		len -= sizeof(struct nvme_lm_controller_state_data_header);
+	} else {
+		fprintf(stderr, "WARNING: Header truncated\n");
+		len = 0;
+	}
+
+	if (!len)
+		return;
+
+	if (sizeof(struct nvme_lm_nvme_controller_state_data_header) <= len) {
+		int niosq = data->data.hdr.niosq;
+		int niocq = data->data.hdr.niocq;
+
+		printf("\nNVMe Controller State Data Structure:\n");
+		printf("%-45s: 0x%x\n", "Version (VER)",
+		       le16_to_cpu(data->data.hdr.ver));
+		printf("%-45s: %d\n", "Number of I/O Submission Queues (NIOSQ)",
+		       le16_to_cpu(niosq));
+		printf("%-45s: %d\n", "Number of I/O Completion Queues (NIOCQ)",
+		       le16_to_cpu(niocq));
+
+		len -= sizeof(struct nvme_lm_nvme_controller_state_data_header);
+
+		if (len < niosq * sizeof(struct nvme_lm_io_submission_queue_data)) {
+			fprintf(stderr, "WARNING: I/O Submission Queues truncated\n");
+			niosq = len / sizeof(struct nvme_lm_io_submission_queue_data);
+		}
+
+		for (int i = 0; i < niosq; ++i) {
+			struct nvme_lm_io_submission_queue_data *sq = &(data->data.sqs[i]);
+			__u16 iosqa = le16_to_cpu(sq->iosqa);
+
+			printf("\nNVMe I/O Submission Queue Data [%d]:\n", i);
+			printf("%-45s: 0x%"PRIu64"\n", "PRP Entry 1 (IOSQPRP1)",
+			       le64_to_cpu(sq->iosqprp1));
+			printf("%-45s: 0x%x\n", "Queue Size (IOSQQSIZE)",
+			       le16_to_cpu(sq->iosqqsize));
+			printf("%-45s: 0x%x\n", "Identifier (IOSQQID)",
+			       le16_to_cpu(sq->iosqqid));
+			printf("%-45s: 0x%x\n", "Completion Queue Identifier (IOSQCQID)",
+			       le16_to_cpu(sq->iosqcqid));
+			printf("%-45s: 0x%x\n", "Attributes (IOSQA)", iosqa);
+			if (human) {
+				printf("  [2:1] : 0x%x Queue Priority (IOSQQPRIO)\n",
+				       NVME_GET(iosqa, LM_IOSQPRIO));
+				printf("  [0:0] : 0x%x Queue %sPhysically Contiguous (IOSQPC)\n",
+				       NVME_GET(iosqa, LM_IOSQPC),
+				       NVME_GET(iosqa, LM_IOSQPC) ? "" : "NOT ");
+			}
+			printf("%-45s: 0x%x\n", "I/O Submission Queue Head Pointer (IOSQHP)",
+			       le16_to_cpu(sq->iosqhp));
+			printf("%-45s: 0x%x\n", "I/O Submission Queue Tail Pointer (IOSQTP)",
+			       le16_to_cpu(sq->iosqtp));
+		}
+
+		len -= niosq * sizeof(struct nvme_lm_io_submission_queue_data);
+
+		if (len < niocq * sizeof(struct nvme_lm_io_completion_queue_data)) {
+			fprintf(stderr, "WARNING: I/O Completion Queues truncated\n");
+			niocq = len / sizeof(struct nvme_lm_io_completion_queue_data);
+		}
+
+		for (int i = 0; i < niocq; ++i) {
+			struct nvme_lm_io_completion_queue_data *cq = &data->data.cqs[niosq + i];
+			__u32 iocqa = le32_to_cpu(cq->iocqa);
+
+			printf("\nNVMe I/O Completion Queue Data [%d]:\n", i);
+			printf("%-45s: 0x%"PRIu64"\n", "I/O Completion PRP Entry 1 (IOCQPRP1)",
+			       le64_to_cpu(cq->iocqprp1));
+			printf("%-45s: 0x%x\n", "I/O Completion Queue Size (IOCQQSIZE)",
+			       le16_to_cpu(cq->iocqqsize));
+			printf("%-45s: 0x%x\n", "I/O Completion Queue Identifier (IOCQQID)",
+			       le16_to_cpu(cq->iocqqid));
+			printf("%-45s: 0x%x\n", "I/O Completion Queue Head Pointer (IOSQHP)",
+			       le16_to_cpu(cq->iocqhp));
+			printf("%-45s: 0x%x\n", "I/O Completion Queue Tail Pointer (IOSQTP)",
+			       le16_to_cpu(cq->iocqtp));
+			printf("%-45s: 0x%x\n", "I/O Completion Queue Attributes (IOCQA)", iocqa);
+			if (human) {
+				printf("  [31:16] : 0x%x I/O Completion Queue Interrupt Vector "
+				       "(IOCQIV)\n",
+				       NVME_GET(iocqa, LM_IOCQIEN));
+				printf("  [2:2] : 0x%x Slot 0 Phase Tag (S0PT)\n",
+				       NVME_GET(iocqa, LM_S0PT));
+				printf("  [1:1] : 0x%x Interrupts %sEnabled (IOCQIEN)\n",
+				       NVME_GET(iocqa, LM_IOCQIEN),
+				       NVME_GET(iocqa, LM_IOCQIEN) ? "" : "NOT ");
+				printf("  [0:0] : 0x%x Queue %sPhysically Contiguous (IOCQPC)\n",
+				       NVME_GET(iocqa, LM_IOCQPC),
+				       NVME_GET(iocqa, LM_IOCQPC) ? "" : "NOT ");
+			}
+		}
+	} else
+		fprintf(stderr, "WARNING: NVMe Controller State Data Structure truncated\n");
+}
+
+static void stdout_show_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data)
+{
+	printf("Head Pointer: 0x%x\n", le32_to_cpu(data->hp));
+	printf("Tail Pointer Trigger: 0x%x\n", le32_to_cpu(data->tpt));
+}
+
+static struct lm_print_ops stdout_print_ops = {
+	.controller_state_data = stdout_controller_state_data,
+	.controller_data_queue = stdout_show_controller_data_queue
+};
+
+struct lm_print_ops *lm_get_stdout_print_ops(nvme_print_flags_t flags)
+{
+	stdout_print_ops.flags = flags;
+	return &stdout_print_ops;
+}
diff --git a/plugins/lm/lm-print.c b/plugins/lm/lm-print.c
new file mode 100644
index 0000000..7019af8
--- /dev/null
+++ b/plugins/lm/lm-print.c
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "lm-print.h"
+
+#define lm_print(name, flags, ...) \
+	do { \
+		struct lm_print_ops *ops = lm_print_ops(flags); \
+		if (ops && ops->name) \
+			ops->name(__VA_ARGS__); \
+		else \
+			fprintf(stderr, "unhandled output format\n"); \
+	} while (false)
+
+static struct lm_print_ops *lm_print_ops(nvme_print_flags_t flags)
+{
+	struct lm_print_ops *ops = NULL;
+
+	if (flags & JSON || nvme_is_output_format_json())
+		ops = lm_get_json_print_ops(flags);
+	else if (flags & BINARY)
+		ops = lm_get_binary_print_ops(flags);
+	else
+		ops = lm_get_stdout_print_ops(flags);
+
+	return ops;
+}
+
+void lm_show_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len,
+				   __u32 offset, nvme_print_flags_t flags)
+{
+	lm_print(controller_state_data, flags, data, len, offset);
+}
+
+void lm_show_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data,
+				   nvme_print_flags_t flags)
+{
+	lm_print(controller_data_queue, flags, data);
+}
diff --git a/plugins/lm/lm-print.h b/plugins/lm/lm-print.h
new file mode 100644
index 0000000..8a64702
--- /dev/null
+++ b/plugins/lm/lm-print.h
@@ -0,0 +1,31 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#ifndef LM_PRINT_H
+#define LM_PRINT_H
+
+#include "nvme.h"
+#include "libnvme.h"
+
+struct lm_print_ops {
+	void (*controller_state_data)(struct nvme_lm_controller_state_data *data, size_t len,
+				      __u32 offset);
+	void (*controller_data_queue)(struct nvme_lm_ctrl_data_queue_fid_data *data);
+	nvme_print_flags_t flags;
+};
+
+struct lm_print_ops *lm_get_stdout_print_ops(nvme_print_flags_t flags);
+struct lm_print_ops *lm_get_binary_print_ops(nvme_print_flags_t flags);
+
+#ifdef CONFIG_JSONC
+struct lm_print_ops *lm_get_json_print_ops(nvme_print_flags_t flags);
+#else
+static inline struct lm_print_ops *lm_get_json_print_ops(nvme_print_flags_t flags)
+{
+	return NULL;
+}
+#endif
+
+void lm_show_controller_state_data(struct nvme_lm_controller_state_data *data, size_t len,
+				   __u32 offset, nvme_print_flags_t flags);
+void lm_show_controller_data_queue(struct nvme_lm_ctrl_data_queue_fid_data *data,
+				   nvme_print_flags_t flags);
+#endif /* LM_PRINT_H */
diff --git a/plugins/lm/meson.build b/plugins/lm/meson.build
new file mode 100644
index 0000000..a161431
--- /dev/null
+++ b/plugins/lm/meson.build
@@ -0,0 +1,12 @@
+sources += [
+  'plugins/lm/lm-nvme.c',
+  'plugins/lm/lm-print.c',
+  'plugins/lm/lm-print-stdout.c',
+  'plugins/lm/lm-print-binary.c',
+]
+
+if json_c_dep.found()
+  sources += [
+    'plugins/lm/lm-print-json.c',
+  ]
+endif
\ No newline at end of file
diff --git a/plugins/meson.build b/plugins/meson.build
index 35a9604..3f49bf2 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -2,37 +2,42 @@
 
 if json_c_dep.found()
   sources += [
-    'plugins/amzn/amzn-nvme.c',
-    'plugins/dapustor/dapustor-nvme.c',
-    'plugins/dell/dell-nvme.c',
-    'plugins/dera/dera-nvme.c',
-    'plugins/fdp/fdp.c',
-    'plugins/huawei/huawei-nvme.c',
-    'plugins/innogrit/innogrit-nvme.c',
-    'plugins/inspur/inspur-nvme.c',
-    'plugins/intel/intel-nvme.c',
-    'plugins/memblaze/memblaze-nvme.c',
-    'plugins/micron/micron-nvme.c',
-    'plugins/nbft/nbft-plugin.c',
-    'plugins/netapp/netapp-nvme.c',
-    'plugins/nvidia/nvidia-nvme.c',
-    'plugins/scaleflux/sfx-nvme.c',
-    'plugins/seagate/seagate-nvme.c',
-    'plugins/shannon/shannon-nvme.c',
     'plugins/solidigm/solidigm-nvme.c',
-    'plugins/toshiba/toshiba-nvme.c',
-    'plugins/transcend/transcend-nvme.c',
-    'plugins/virtium/virtium-nvme.c',
-    'plugins/wdc/wdc-nvme.c',
-    'plugins/wdc/wdc-utils.c',
-    'plugins/ymtc/ymtc-nvme.c',
-    'plugins/zns/zns.c',
-    'plugins/ssstc/ssstc-nvme.c',
   ]
   subdir('solidigm')
-  if conf.get('HAVE_SED_OPAL') != 0
-    subdir('sed')
-  endif
 endif
 
+sources += [
+  'plugins/amzn/amzn-nvme.c',
+  'plugins/dapustor/dapustor-nvme.c',
+  'plugins/dell/dell-nvme.c',
+  'plugins/dera/dera-nvme.c',
+  'plugins/fdp/fdp.c',
+  'plugins/huawei/huawei-nvme.c',
+  'plugins/innogrit/innogrit-nvme.c',
+  'plugins/inspur/inspur-nvme.c',
+  'plugins/intel/intel-nvme.c',
+  'plugins/memblaze/memblaze-nvme.c',
+  'plugins/micron/micron-nvme.c',
+  'plugins/nbft/nbft-plugin.c',
+  'plugins/netapp/netapp-nvme.c',
+  'plugins/nvidia/nvidia-nvme.c',
+  'plugins/scaleflux/sfx-nvme.c',
+  'plugins/seagate/seagate-nvme.c',
+  'plugins/shannon/shannon-nvme.c',
+  'plugins/ssstc/ssstc-nvme.c',
+  'plugins/toshiba/toshiba-nvme.c',
+  'plugins/transcend/transcend-nvme.c',
+  'plugins/virtium/virtium-nvme.c',
+  'plugins/wdc/wdc-nvme.c',
+  'plugins/wdc/wdc-utils.c',
+  'plugins/ymtc/ymtc-nvme.c',
+  'plugins/zns/zns.c',
+]
+
 subdir('ocp')
+subdir('lm')
+
+if conf.get('HAVE_SED_OPAL') != 0
+  subdir('sed')
+endif
diff --git a/plugins/micron/micron-nvme.c b/plugins/micron/micron-nvme.c
index 2782595..c3fcb64 100644
--- a/plugins/micron/micron-nvme.c
+++ b/plugins/micron/micron-nvme.c
@@ -737,10 +737,12 @@ static int micron_temp_stats(int argc, char **argv, struct command *cmd,
 	struct format cfg = {
 		.fmt = "normal",
 	};
+
 	bool is_json = false;
 	struct json_object *root;
 	struct json_object *logPages;
 	struct nvme_dev *dev;
+	nvme_print_flags_t flags;
 
 	OPT_ARGS(opts) = {
 		OPT_FMT("format", 'f', &cfg.fmt, fmt),
@@ -753,7 +755,13 @@ static int micron_temp_stats(int argc, char **argv, struct command *cmd,
 		return -1;
 	}
 
-	if (!strcmp(cfg.fmt, "json"))
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (flags & JSON)
 		is_json = true;
 
 	err = nvme_get_log_smart(dev_fd(dev), 0xffffffff, false, &smart_log);
@@ -764,6 +772,7 @@ static int micron_temp_stats(int argc, char **argv, struct command *cmd,
 			tempSensors[i] = le16_to_cpu(smart_log.temp_sensor[i]);
 			tempSensors[i] = tempSensors[i] ? tempSensors[i] - 273 : 0;
 		}
+
 		if (is_json) {
 			struct json_object *stats = json_create_object();
 			char tempstr[64] = { 0 };
@@ -840,6 +849,7 @@ static int micron_pcie_stats(int argc, char **argv,
 		__u16 ecrc_error;
 		__u16 unsupported_request_error;
 	} pcie_error_counters = { 0 };
+	nvme_print_flags_t flags;
 
 	struct {
 		char *err;
@@ -905,7 +915,13 @@ static int micron_pcie_stats(int argc, char **argv,
 		goto out;
 	}
 
-	if (!strcmp(cfg.fmt, "normal"))
+	err = validate_output_format(cfg.fmt, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (flags & NORMAL)
 		is_json = false;
 
 	if (eModel == M5407) {
@@ -1546,12 +1562,20 @@ static int micron_smart_ext_log(int argc, char **argv,
 		OPT_FMT("format", 'f', &cfg.fmt, fmt),
 		OPT_END()
 	};
+	nvme_print_flags_t flags;
 
 	err = parse_and_open(&dev, argc, argv, desc, opts);
 	if (err) {
 		printf("\nDevice not found\n");
 		return -1;
 	}
+
+	err = validate_output_format(nvme_cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!strcmp(cfg.fmt, "normal"))
 		is_json = false;
 
@@ -1956,6 +1980,7 @@ static int micron_drive_info(int argc, char **argv, struct command *cmd,
 		char *fmt;
 	};
 	int err = 0;
+	nvme_print_flags_t flags;
 
 	const char *fmt = "output format normal";
 	struct format cfg = {
@@ -1972,11 +1997,17 @@ static int micron_drive_info(int argc, char **argv, struct command *cmd,
 		return err;
 
 	if (model == UNKNOWN_MODEL) {
-		fprintf(stderr, "ERROR : Unsupported drive for vs-drive-info cmd");
+		fprintf(stderr, "ERROR : Unsupported drive for vs-drive-info cmd\n");
 		dev_close(dev);
 		return -1;
 	}
 
+	err = validate_output_format(cfg.fmt, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
 	if (!strcmp(cfg.fmt, "json"))
 		is_json = true;
 
diff --git a/plugins/nbft/nbft-plugin.c b/plugins/nbft/nbft-plugin.c
index f25941a..01d9222 100644
--- a/plugins/nbft/nbft-plugin.c
+++ b/plugins/nbft/nbft-plugin.c
@@ -47,6 +47,7 @@ static char *mac_addr_to_string(unsigned char mac_addr[6])
 	return mac_string;
 }
 
+#ifdef CONFIG_JSONC
 static json_object *hfi_to_json(struct nbft_info_hfi *hfi)
 {
 	struct json_object *hfi_json;
@@ -348,6 +349,9 @@ fail:
 	json_free_object(nbft_json_array);
 	return -ENOMEM;
 }
+#else /* CONFIG_JSONC */
+#define json_show_nbfts(nbft_list, show_subsys, show_hfi, show_discovery) -EINVAL
+#endif /* CONFIG_JSONC */
 
 static void print_nbft_hfi_info(struct nbft_info *nbft)
 {
diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c
index 5c2e3d4..95fde41 100644
--- a/plugins/netapp/netapp-nvme.c
+++ b/plugins/netapp/netapp-nvme.c
@@ -22,6 +22,7 @@
 #include <unistd.h>
 #include <errno.h>
 #include <string.h>
+#include <libgen.h>
 
 #include "common.h"
 #include "nvme.h"
@@ -118,6 +119,43 @@ static void netapp_get_ns_size(char *size, unsigned long long *lba,
 	sprintf(size, "%.2f%sB", nsze, s_suffix);
 }
 
+static void netapp_get_ns_attrs(char *size, char *used, char *blk_size,
+		char *version, unsigned long long *lba,
+		struct nvme_id_ctrl *ctrl, struct nvme_id_ns *ns)
+{
+	__u8 lba_index;
+
+	nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &lba_index);
+	*lba = 1ULL << ns->lbaf[lba_index].ds;
+
+	/* get the namespace size */
+	double nsze = le64_to_cpu(ns->nsze) * (*lba);
+	const char *s_suffix = suffix_si_get(&nsze);
+
+	sprintf(size, "%.2f%sB", nsze, s_suffix);
+
+	/* get the namespace utilization */
+	double nuse = le64_to_cpu(ns->nuse) * (*lba);
+	const char *u_suffix = suffix_si_get(&nuse);
+
+	sprintf(used, "%.2f%sB", nuse, u_suffix);
+
+	/* get the namespace block size */
+	long long addr = 1LL << ns->lbaf[lba_index].ds;
+	const char *l_suffix = suffix_binary_get(&addr);
+
+	sprintf(blk_size, "%u%sB", (unsigned int)addr, l_suffix);
+
+	/* get the firmware version */
+	int i, max = sizeof(ctrl->fr);
+
+	memcpy(version, ctrl->fr, max);
+	version[max] = '\0';
+	/* strip trailing whitespaces */
+	for (i = max - 1; i >= 0 && version[i] == ' '; i--)
+		version[i] = '\0';
+}
+
 static void ontap_labels_to_str(char *dst, char *src, int count)
 {
 	int i;
@@ -212,10 +250,11 @@ static void netapp_get_ontap_labels(char *vsname, char *nspath,
 
 static void netapp_smdevice_json(struct json_object *devices, char *devname,
 		char *arrayname, char *volname, int nsid, char *nguid,
-		char *ctrl, char *astate, char *size, long long lba,
-		long long nsze)
+		char *ctrl, char *astate, char *version, unsigned long long lba,
+		unsigned long long nsze, unsigned long long nuse)
 {
 	struct json_object *device_attrs;
+	unsigned long long ns_size = nsze * lba;
 
 	device_attrs = json_create_object();
 	json_object_add_value_string(device_attrs, "Device", devname);
@@ -225,18 +264,21 @@ static void netapp_smdevice_json(struct json_object *devices, char *devname,
 	json_object_add_value_string(device_attrs, "Volume_ID", nguid);
 	json_object_add_value_string(device_attrs, "Controller", ctrl);
 	json_object_add_value_string(device_attrs, "Access_State", astate);
-	json_object_add_value_string(device_attrs, "Size", size);
-	json_object_add_value_int(device_attrs, "LBA_Data_Size", lba);
-	json_object_add_value_int(device_attrs, "Namespace_Size", nsze);
+	json_object_add_value_uint64(device_attrs, "LBA_Size", lba);
+	json_object_add_value_uint64(device_attrs, "Namespace_Size", ns_size);
+	json_object_add_value_string(device_attrs, "Version", version);
 
 	json_array_add_value_object(devices, device_attrs);
 }
 
 static void netapp_ontapdevice_json(struct json_object *devices, char *devname,
 		char *vsname, char *nspath, int nsid, char *uuid,
-		char *size, long long lba, long long nsze)
+		unsigned long long lba, char *version,
+		unsigned long long nsze, unsigned long long nuse)
 {
 	struct json_object *device_attrs;
+	unsigned long long ns_size = nsze * lba;
+	unsigned long long used_size = nuse * lba;
 
 	device_attrs = json_create_object();
 	json_object_add_value_string(device_attrs, "Device", devname);
@@ -244,13 +286,93 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname,
 	json_object_add_value_string(device_attrs, "Namespace_Path", nspath);
 	json_object_add_value_int(device_attrs, "NSID", nsid);
 	json_object_add_value_string(device_attrs, "UUID", uuid);
-	json_object_add_value_string(device_attrs, "Size", size);
-	json_object_add_value_int(device_attrs, "LBA_Data_Size", lba);
-	json_object_add_value_int(device_attrs, "Namespace_Size", nsze);
+	json_object_add_value_uint64(device_attrs, "LBA_Size", lba);
+	json_object_add_value_uint64(device_attrs, "Namespace_Size", ns_size);
+	json_object_add_value_uint64(device_attrs, "UsedBytes", used_size);
+	json_object_add_value_string(device_attrs, "Version", version);
 
 	json_array_add_value_object(devices, device_attrs);
 }
 
+static void netapp_smdevices_print_verbose(struct smdevice_info *devices,
+		int count, int format, const char *devname)
+{
+	int i, slta;
+	char array_label[ARRAY_LABEL_LEN / 2 + 1];
+	char volume_label[VOLUME_LABEL_LEN / 2 + 1];
+	char nguid_str[33];
+	unsigned long long lba;
+	char size[128], used[128];
+	char blk_size[128], version[9];
+
+	char *formatstr = NULL;
+	char basestr[] =
+		"%s, Array Name %s, Volume Name %s, NSID %d, Volume ID %s, "
+		"Controller %c, Access State %s, Size %s, Format %s, Version %s\n";
+	char columnstr[] =
+		"%-16s %-30s %-30s %4d %32s  %c   %-12s %-9s %-9s %-9s\n";
+
+	if (format == NNORMAL)
+		formatstr = basestr;
+	else if (format == NCOLUMN) {
+		/* print column headers and change the output string */
+		printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s %-9s %-9s\n",
+			"Device", "Array Name", "Volume Name", "NSID",
+			"Volume ID", "Ctrl", "Access State", " Size",
+			"Format", "Version");
+		printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s %-9s %-9s\n",
+			"----------------", "------------------------------",
+			"------------------------------", "----",
+			"--------------------------------", "----",
+			"------------", "---------",
+			"---------", "---------");
+		formatstr = columnstr;
+	}
+
+	for (i = 0; i < count; i++) {
+		if (devname && !strcmp(devname, basename(devices[i].dev))) {
+			/* found the device, fetch info for that alone */
+			netapp_get_ns_attrs(size, used, blk_size, version,
+					&lba, &devices[i].ctrl, &devices[i].ns);
+			netapp_convert_string(array_label,
+					(char *)&devices[i].ctrl.vs[20],
+					ARRAY_LABEL_LEN / 2);
+			slta = devices[i].ctrl.vs[0] & 0x1;
+			netapp_convert_string(volume_label,
+					(char *)devices[i].ns.vs,
+					VOLUME_LABEL_LEN / 2);
+			netapp_nguid_to_str(nguid_str, devices[i].ns.nguid);
+
+			printf(formatstr, devices[i].dev, array_label,
+					volume_label, devices[i].nsid,
+					nguid_str,
+					slta ? 'A' : 'B', "unknown", size,
+					blk_size, version);
+			return;
+		}
+	}
+
+	for (i = 0; i < count; i++) {
+		/* fetch info and print for all devices */
+		netapp_get_ns_attrs(size, used, blk_size, version,
+				&lba, &devices[i].ctrl, &devices[i].ns);
+		netapp_convert_string(array_label,
+				(char *)&devices[i].ctrl.vs[20],
+				ARRAY_LABEL_LEN / 2);
+		slta = devices[i].ctrl.vs[0] & 0x1;
+		netapp_convert_string(volume_label,
+				(char *)devices[i].ns.vs,
+				VOLUME_LABEL_LEN / 2);
+		netapp_nguid_to_str(nguid_str, devices[i].ns.nguid);
+
+		printf(formatstr, devices[i].dev, array_label,
+				volume_label, devices[i].nsid,
+				nguid_str,
+				slta ? 'A' : 'B', "unknown", size,
+				blk_size, version);
+	}
+}
+
 static void netapp_smdevices_print_regular(struct smdevice_info *devices,
 		int count, int format, const char *devname)
 {
@@ -258,7 +380,8 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices,
 	char array_label[ARRAY_LABEL_LEN / 2 + 1];
 	char volume_label[VOLUME_LABEL_LEN / 2 + 1];
 	char nguid_str[33];
-	__u8 lba_index;
+	unsigned long long lba;
+	char size[128];
 
 	char *formatstr = NULL;
 	char basestr[] =
@@ -268,7 +391,7 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices,
 	if (format == NNORMAL)
 		formatstr = basestr;
 	else if (format == NCOLUMN) {
-		/* change output string and print column headers */
+		/* print column headers and change the output string */
 		printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s\n",
 			"Device", "Array Name", "Volume Name", "NSID",
 			"Volume ID", "Ctrl", "Access State", " Size");
@@ -283,15 +406,7 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices,
 	for (i = 0; i < count; i++) {
 		if (devname && !strcmp(devname, basename(devices[i].dev))) {
 			/* found the device, fetch info for that alone */
-			nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas,
-					&lba_index);
-			unsigned long long lba = 1ULL <<
-				devices[i].ns.lbaf[lba_index].ds;
-			double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
-			const char *s_suffix = suffix_si_get(&nsze);
-			char size[128];
-
-			sprintf(size, "%.2f%sB", nsze, s_suffix);
+			netapp_get_ns_size(size, &lba, &devices[i].ns);
 			netapp_convert_string(array_label,
 					(char *)&devices[i].ctrl.vs[20],
 					ARRAY_LABEL_LEN / 2);
@@ -311,14 +426,7 @@ static void netapp_smdevices_print_regular(struct smdevice_info *devices,
 
 	for (i = 0; i < count; i++) {
 		/* fetch info for all devices */
-		nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index);
-		unsigned long long lba = 1ULL <<
-			devices[i].ns.lbaf[lba_index].ds;
-		double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
-		const char *s_suffix = suffix_si_get(&nsze);
-		char size[128];
-
-		sprintf(size, "%.2f%sB", nsze, s_suffix);
+		netapp_get_ns_size(size, &lba, &devices[i].ns);
 		netapp_convert_string(array_label,
 				(char *)&devices[i].ctrl.vs[20],
 				ARRAY_LABEL_LEN / 2);
@@ -342,7 +450,9 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
 	char array_label[ARRAY_LABEL_LEN / 2 + 1];
 	char volume_label[VOLUME_LABEL_LEN / 2 + 1];
 	char nguid_str[33];
-	__u8 lba_index;
+	unsigned long long lba;
+	char size[128], used[128];
+	char blk_size[128], version[9];
 
 	/* prepare for the json output */
 	root = json_create_object();
@@ -351,15 +461,8 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
 	for (i = 0; i < count; i++) {
 		if (devname && !strcmp(devname, basename(devices[i].dev))) {
 			/* found the device, fetch info for that alone */
-			nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas,
-					&lba_index);
-			unsigned long long lba = 1ULL <<
-				devices[i].ns.lbaf[lba_index].ds;
-			double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
-			const char *s_suffix = suffix_si_get(&nsze);
-			char size[128];
-
-			sprintf(size, "%.2f%sB", nsze, s_suffix);
+			netapp_get_ns_attrs(size, used, blk_size, version,
+					&lba, &devices[i].ctrl, &devices[i].ns);
 			netapp_convert_string(array_label,
 					(char *)&devices[i].ctrl.vs[20],
 					ARRAY_LABEL_LEN / 2);
@@ -371,22 +474,18 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
 			netapp_smdevice_json(json_devices, devices[i].dev,
 					array_label, volume_label,
 					devices[i].nsid, nguid_str,
-					slta ? "A" : "B", "unknown", size, lba,
-					le64_to_cpu(devices[i].ns.nsze));
+					slta ? "A" : "B", "unknown",
+					version, lba,
+					le64_to_cpu(devices[i].ns.nsze),
+					le64_to_cpu(devices[i].ns.nuse));
 			goto out;
 		}
 	}
 
 	for (i = 0; i < count; i++) {
 		/* fetch info for all devices */
-		nvme_id_ns_flbas_to_lbaf_inuse(devices[i].ns.flbas, &lba_index);
-		unsigned long long lba = 1ULL <<
-			devices[i].ns.lbaf[lba_index].ds;
-		double nsze = le64_to_cpu(devices[i].ns.nsze) * lba;
-		const char *s_suffix = suffix_si_get(&nsze);
-		char size[128];
-
-		sprintf(size, "%.2f%sB", nsze, s_suffix);
+		netapp_get_ns_attrs(size, used, blk_size, version,
+				&lba, &devices[i].ctrl, &devices[i].ns);
 		netapp_convert_string(array_label,
 				(char *)&devices[i].ctrl.vs[20],
 				ARRAY_LABEL_LEN / 2);
@@ -398,7 +497,9 @@ static void netapp_smdevices_print_json(struct smdevice_info *devices,
 		netapp_smdevice_json(json_devices, devices[i].dev,
 				array_label, volume_label, devices[i].nsid,
 				nguid_str, slta ? "A" : "B", "unknown",
-				size, lba, le64_to_cpu(devices[i].ns.nsze));
+				version, lba,
+				le64_to_cpu(devices[i].ns.nsze),
+				le64_to_cpu(devices[i].ns.nuse));
 	}
 
 out:
@@ -409,6 +510,67 @@ out:
 	json_free_object(root);
 }
 
+static void netapp_ontapdevices_print_verbose(struct ontapdevice_info *devices,
+		int count, int format, const char *devname)
+{
+	char vsname[ONTAP_LABEL_LEN] = " ";
+	char nspath[ONTAP_NS_PATHLEN] = " ";
+	unsigned long long lba;
+	char size[128], used[128];
+	char blk_size[128], version[9];
+	char uuid_str[37] = " ";
+	int i;
+
+	char *formatstr = NULL;
+	char basestr[] =
+		"%s, Vserver %s, Namespace Path %s, NSID %d, UUID %s, "
+		"Size %s, Used %s, Format %s, Version %s\n";
+	char columnstr[] = "%-16s %-25s %-50s %-4d %-38s %-9s %-9s %-9s %-9s\n";
+
+	if (format == NNORMAL)
+		formatstr = basestr;
+	else if (format == NCOLUMN) {
+		printf("%-16s %-25s %-50s %-4s %-38s %-9s %-9s %-9s %-9s\n",
+				"Device", "Vserver", "Namespace Path",
+				"NSID", "UUID", "Size", "Used",
+				"Format", "Version");
+		printf("%-16s %-25s %-50s %-4s %-38s %-9s %-9s %-9s %-9s\n",
+			"----------------", "-------------------------",
+			"--------------------------------------------------",
+			"----", "--------------------------------------",
+			"---------", "---------", "---------", "---------");
+		formatstr = columnstr;
+	}
+
+	for (i = 0; i < count; i++) {
+		if (devname && !strcmp(devname, basename(devices[i].dev))) {
+			/* found the device, fetch and print for that alone */
+			netapp_get_ns_attrs(size, used, blk_size, version,
+					&lba, &devices[i].ctrl, &devices[i].ns);
+			nvme_uuid_to_string(devices[i].uuid, uuid_str);
+			netapp_get_ontap_labels(vsname, nspath,
+					devices[i].log_data);
+
+			printf(formatstr, devices[i].dev, vsname, nspath,
+					devices[i].nsid, uuid_str, size, used,
+					blk_size, version);
+			return;
+		}
+	}
+
+	for (i = 0; i < count; i++) {
+		/* fetch info and print for all devices */
+		netapp_get_ns_attrs(size, used, blk_size, version,
+				&lba, &devices[i].ctrl, &devices[i].ns);
+		nvme_uuid_to_string(devices[i].uuid, uuid_str);
+		netapp_get_ontap_labels(vsname, nspath, devices[i].log_data);
+
+		printf(formatstr, devices[i].dev, vsname, nspath,
+				devices[i].nsid, uuid_str, size, used,
+				blk_size, version);
+	}
+}
+
 static void netapp_ontapdevices_print_regular(struct ontapdevice_info *devices,
 		int count, int format, const char *devname)
 {
@@ -471,7 +633,8 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices,
 	char vsname[ONTAP_LABEL_LEN] = " ";
 	char nspath[ONTAP_NS_PATHLEN] = " ";
 	unsigned long long lba;
-	char size[128];
+	char size[128], used[128];
+	char blk_size[128], version[9];
 	char uuid_str[37] = " ";
 	int i;
 
@@ -482,28 +645,33 @@ static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices,
 	for (i = 0; i < count; i++) {
 		if (devname && !strcmp(devname, basename(devices[i].dev))) {
 			/* found the device, fetch info for that alone */
-			netapp_get_ns_size(size, &lba, &devices[i].ns);
+			netapp_get_ns_attrs(size, used, blk_size, version,
+					&lba, &devices[i].ctrl, &devices[i].ns);
 			nvme_uuid_to_string(devices[i].uuid, uuid_str);
-			netapp_get_ontap_labels(vsname, nspath, devices[i].log_data);
+			netapp_get_ontap_labels(vsname, nspath,
+					devices[i].log_data);
 
 			netapp_ontapdevice_json(json_devices, devices[i].dev,
 					vsname, nspath, devices[i].nsid,
-					uuid_str, size, lba,
-					le64_to_cpu(devices[i].ns.nsze));
+					uuid_str, lba, version,
+					le64_to_cpu(devices[i].ns.nsze),
+					le64_to_cpu(devices[i].ns.nuse));
 			goto out;
 		}
 	}
 
 	for (i = 0; i < count; i++) {
 		/* fetch info for all devices */
-		netapp_get_ns_size(size, &lba, &devices[i].ns);
+		netapp_get_ns_attrs(size, used, blk_size, version,
+				&lba, &devices[i].ctrl, &devices[i].ns);
 		nvme_uuid_to_string(devices[i].uuid, uuid_str);
 		netapp_get_ontap_labels(vsname, nspath, devices[i].log_data);
 
 		netapp_ontapdevice_json(json_devices, devices[i].dev,
 				vsname, nspath, devices[i].nsid,
-				uuid_str, size, lba,
-				le64_to_cpu(devices[i].ns.nsze));
+				uuid_str, lba, version,
+				le64_to_cpu(devices[i].ns.nsze),
+				le64_to_cpu(devices[i].ns.nuse));
 	}
 
 out:
@@ -663,8 +831,10 @@ static int netapp_output_format(char *format)
 		return -EINVAL;
 	if (!strcmp(format, "normal"))
 		return NNORMAL;
+#ifdef CONFIG_JSONC
 	if (!strcmp(format, "json"))
 		return NJSON;
+#endif /* CONFIG_JSONC */
 	if (!strcmp(format, "column"))
 		return NCOLUMN;
 	return -EINVAL;
@@ -684,6 +854,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
 	int num_smdevices = 0;
 
 	struct config {
+		bool verbose;
 		char *output_format;
 	};
 
@@ -692,6 +863,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
 	};
 
 	OPT_ARGS(opts) = {
+		OPT_FLAG("verbose", 'v', &cfg.verbose, "Increase output verbosity"),
 		OPT_FMT("output-format", 'o', &cfg.output_format, "Output Format: normal|json|column"),
 		OPT_END()
 	};
@@ -708,7 +880,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
 
 	num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort);
 	if (num <= 0) {
-		fprintf(stderr, "No NVMe devices detected.\n");
+		fprintf(stderr, "No smdevices detected\n");
 		return num;
 	}
 
@@ -726,7 +898,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
 
 	smdevices = calloc(num, sizeof(*smdevices));
 	if (!smdevices) {
-		fprintf(stderr, "Unable to allocate memory for devices.\n");
+		fprintf(stderr, "Unable to allocate memory for devices\n");
 		return -ENOMEM;
 	}
 
@@ -746,9 +918,14 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
 	}
 
 	if (num_smdevices) {
-		if (fmt == NNORMAL || fmt == NCOLUMN)
-			netapp_smdevices_print_regular(smdevices,
-					num_smdevices, fmt, devname);
+		if (fmt == NNORMAL || fmt == NCOLUMN) {
+			if (argconfig_parse_seen(opts, "verbose"))
+				netapp_smdevices_print_verbose(smdevices,
+						num_smdevices, fmt, devname);
+			else
+				netapp_smdevices_print_regular(smdevices,
+						num_smdevices, fmt, devname);
+		}
 		else if (fmt == NJSON)
 			netapp_smdevices_print_json(smdevices,
 					num_smdevices, devname);
@@ -775,6 +952,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
 	int num_ontapdevices = 0;
 
 	struct config {
+		bool verbose;
 		char *output_format;
 	};
 
@@ -783,6 +961,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
 	};
 
 	OPT_ARGS(opts) = {
+		OPT_FLAG("verbose", 'v', &cfg.verbose, "Increase output verbosity"),
 		OPT_FMT("output-format", 'o', &cfg.output_format, "Output Format: normal|json|column"),
 		OPT_END()
 	};
@@ -811,13 +990,13 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
 
 	num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort);
 	if (num <= 0) {
-		fprintf(stderr, "No NVMe devices detected.\n");
+		fprintf(stderr, "No ontapdevices detected\n");
 		return num;
 	}
 
 	ontapdevices = calloc(num, sizeof(*ontapdevices));
 	if (!ontapdevices) {
-		fprintf(stderr, "Unable to allocate memory for devices.\n");
+		fprintf(stderr, "Unable to allocate memory for devices\n");
 		return -ENOMEM;
 	}
 
@@ -838,9 +1017,14 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
 	}
 
 	if (num_ontapdevices) {
-		if (fmt == NNORMAL || fmt == NCOLUMN)
-			netapp_ontapdevices_print_regular(ontapdevices,
-					num_ontapdevices, fmt, devname);
+		if (fmt == NNORMAL || fmt == NCOLUMN) {
+			if (argconfig_parse_seen(opts, "verbose"))
+				netapp_ontapdevices_print_verbose(ontapdevices,
+						num_ontapdevices, fmt, devname);
+			else
+				netapp_ontapdevices_print_regular(ontapdevices,
+						num_ontapdevices, fmt, devname);
+		}
 		else if (fmt == NJSON)
 			netapp_ontapdevices_print_json(ontapdevices,
 					num_ontapdevices, devname);
diff --git a/plugins/ocp/ocp-clear-features.c b/plugins/ocp/ocp-clear-features.c
index 731dfea..6686f85 100644
--- a/plugins/ocp/ocp-clear-features.c
+++ b/plugins/ocp/ocp-clear-features.c
@@ -7,12 +7,11 @@
  */
 
 #include <unistd.h>
+#include "util/types.h"
+#include "ocp-nvme.h"
 #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;
@@ -80,14 +79,13 @@ int ocp_clear_fw_update_history(int argc, char **argv, struct command *cmd, stru
 {
 	const char *desc = "OCP Clear Firmware Update History";
 
-	return ocp_clear_feature(argc, argv, desc, OCP_FID_CLEAR_FW_ACTIVATION_HISTORY);
+	return ocp_clear_feature(argc, argv, desc, OCP_FID_CFUH);
 }
 
 int ocp_clear_pcie_correctable_errors(int argc, char **argv, struct command *cmd,
-					     struct plugin *plugin)
+				      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_feature(argc, argv, desc, OCP_FID_CPCIE);
 }
diff --git a/plugins/ocp/ocp-fw-activation-history.c b/plugins/ocp/ocp-fw-activation-history.c
index 79c03b2..d3eb60c 100644
--- a/plugins/ocp/ocp-fw-activation-history.c
+++ b/plugins/ocp/ocp-fw-activation-history.c
@@ -13,6 +13,7 @@
 #include "common.h"
 #include "nvme-print.h"
 
+#include "ocp-nvme.h"
 #include "ocp-utils.h"
 #include "ocp-print.h"
 
@@ -26,7 +27,6 @@ static const unsigned char ocp_fw_activation_history_guid[GUID_LEN] = {
 int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd,
 				  struct plugin *plugin)
 {
-	const __u8 log_id = 0xC2;
 	const char *description = "Retrieves the OCP firmware activation history log.";
 
 	char *format = "normal";
@@ -59,7 +59,7 @@ int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd,
 		.args_size = sizeof(args),
 		.fd = dev_fd(dev),
 		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
-		.lid = log_id,
+		.lid = (enum nvme_cmd_get_log_lid)OCP_LID_FAHL_OBSOLETE,
 		.len = sizeof(fw_history),
 		.nsid = NVME_NSID_ALL,
 		.csi = NVME_CSI_NVM,
diff --git a/plugins/ocp/ocp-fw-activation-history.h b/plugins/ocp/ocp-fw-activation-history.h
index 15733a3..fa37e4b 100644
--- a/plugins/ocp/ocp-fw-activation-history.h
+++ b/plugins/ocp/ocp-fw-activation-history.h
@@ -4,6 +4,7 @@
  *
  * Authors: karl.dedow@solidigm.com
  */
+#include <libnvme.h>
 #include "common.h"
 #include "linux/types.h"
 
@@ -18,7 +19,7 @@ struct __packed fw_activation_history_entry {
 	__u8 entry_length;
 	__le16 reserved1;
 	__le16 activation_count;
-	__le64 timestamp;
+	struct nvme_timestamp ts;
 	__le64 reserved2;
 	__le64 power_cycle_count;
 	char previous_fw[8];
diff --git a/plugins/ocp/ocp-hardware-component-log.c b/plugins/ocp/ocp-hardware-component-log.c
index 73f1452..e4a8e06 100644
--- a/plugins/ocp/ocp-hardware-component-log.c
+++ b/plugins/ocp/ocp-hardware-component-log.c
@@ -11,6 +11,7 @@
 #include "nvme-print.h"
 #include "ocp-hardware-component-log.h"
 #include "ocp-print.h"
+#include "ocp-utils.h"
 
 //#define HWCOMP_DUMMY
 
@@ -154,6 +155,8 @@ const char *hwcomp_id_to_string(__u32 id)
 		return "Country of Origin";
 	case HWCOMP_ID_HW_REV:
 		return "Global Device Hardware Revision";
+	case HWCOMP_ID_BORN_ON_DATE:
+		return "Born on Date";
 	case HWCOMP_ID_VENDOR ... HWCOMP_ID_MAX:
 		return "Vendor Unique Component";
 	case HWCOMP_ID_RSVD:
@@ -168,39 +171,59 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log)
 {
 	int ret = 0;
 	size_t desc_offset = offsetof(struct hwcomp_log, desc);
+	long double log_bytes;
+	nvme_uint128_t log_size;
+
 	struct nvme_get_log_args args = {
-		.lpo = desc_offset,
 		.args_size = sizeof(args),
 		.fd = dev_fd(dev),
 		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
-		.lid = LID_HWCOMP,
+		.lid = (enum nvme_cmd_get_log_lid)OCP_LID_HWCOMP,
 		.nsid = NVME_NSID_ALL,
+		.log = log,
+		.len = desc_offset,
 	};
 
+	ocp_get_uuid_index(dev, &args.uuidx);
+
 #ifdef HWCOMP_DUMMY
 	memcpy(log, hwcomp_dummy, desc_offset);
 #else /* HWCOMP_DUMMY */
-	ret = nvme_get_log_simple(dev_fd(dev), LID_HWCOMP, desc_offset, log);
+	ret = nvme_get_log_page(dev_fd(dev), NVME_LOG_PAGE_PDU_SIZE, &args);
 	if (ret) {
-		print_info_error("error: ocp: failed to get log simple (hwcomp: %02X, ret: %d)\n",
-				 LID_HWCOMP, ret);
+		print_info_error("error: ocp: failed to get hwcomp log size (ret: %d)\n", ret);
 		return ret;
 	}
 #endif /* HWCOMP_DUMMY */
 
-	print_info("id: %02Xh\n", LID_HWCOMP);
+	log_size = le128_to_cpu(log->size);
+
+	print_info("id: %02Xh\n", OCP_LID_HWCOMP);
 	print_info("version: %04Xh\n", log->ver);
 	print_info_array("guid", log->guid, ARRAY_SIZE(log->guid));
-	print_info("size: %s\n", uint128_t_to_string(le128_to_cpu(log->size)));
+	print_info("size: %s\n", uint128_t_to_string(log_size));
+
+	log_bytes = uint128_t_to_double(log_size);
+	if (log->ver == 1)
+		log_bytes *= sizeof(__le32);
+
+	if (log_bytes <= desc_offset) {
+		print_info_error("error: ocp: invalid hwcomp log size bytes: %.0Lf\n", log_bytes);
+		return -EINVAL;
+	}
+
+	args.len = log_bytes - desc_offset;
+
+	print_info("args.len: %u\n", args.len);
 
-	args.len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32);
 	log->desc = calloc(1, args.len);
 	if (!log->desc) {
 		fprintf(stderr, "error: ocp: calloc: %s\n", strerror(errno));
-		return -1;
+		return -errno;
 	}
 
 	args.log = log->desc,
+	args.lpo = desc_offset,
 
 #ifdef HWCOMP_DUMMY
 	memcpy(log->desc, &hwcomp_dummy[desc_offset], args.len);
@@ -208,7 +231,8 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log)
 	ret = nvme_get_log_page(dev_fd(dev), NVME_LOG_PAGE_PDU_SIZE, &args);
 	if (ret) {
 		print_info_error("error: ocp: failed to get log page (hwcomp: %02X, ret: %d)\n",
-				 LID_HWCOMP, ret);
+				 OCP_LID_HWCOMP, ret);
+		free(log->desc);
 		return ret;
 	}
 #endif /* HWCOMP_DUMMY */
@@ -218,12 +242,10 @@ static int get_hwcomp_log_data(struct nvme_dev *dev, struct hwcomp_log *log)
 
 static int get_hwcomp_log(struct nvme_dev *dev, __u32 id, bool list)
 {
-	_cleanup_free_ __u8 *desc = NULL;
-
 	int ret;
 	nvme_print_flags_t fmt;
 	struct hwcomp_log log = {
-		.desc = (struct hwcomp_desc *)desc,
+		.desc = NULL,
 	};
 
 	ret = validate_output_format(nvme_cfg.output_format, &fmt);
@@ -235,12 +257,14 @@ static int get_hwcomp_log(struct nvme_dev *dev, __u32 id, bool list)
 	ret = get_hwcomp_log_data(dev, &log);
 	if (ret) {
 		print_info_error("error: ocp: failed get hwcomp log: %02X data, ret: %d\n",
-				 LID_HWCOMP, ret);
+				 OCP_LID_HWCOMP, ret);
 		return ret;
 	}
 
 	ocp_show_hwcomp_log(&log, id, list, fmt);
 
+	free(log.desc);
+
 	return 0;
 }
 
@@ -268,6 +292,7 @@ int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *pl
 		VAL_LONG("sn", HWCOMP_ID_SN),
 		VAL_LONG("country", HWCOMP_ID_COUNTRY),
 		VAL_LONG("hw-rev", HWCOMP_ID_HW_REV),
+		VAL_LONG("born-on-date", HWCOMP_ID_BORN_ON_DATE),
 		VAL_LONG("vendor", HWCOMP_ID_VENDOR),
 		VAL_END()
 	};
@@ -281,8 +306,8 @@ int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *pl
 
 	ret = get_hwcomp_log(dev, cfg.id, cfg.list);
 	if (ret)
-		fprintf(stderr, "error: ocp: failed to get hwcomp log: %02X, ret: %d\n", LID_HWCOMP,
-			ret);
+		fprintf(stderr, "error: ocp: failed to get hwcomp log: %02X, ret: %d\n",
+			OCP_LID_HWCOMP, ret);
 
 	return ret;
 }
diff --git a/plugins/ocp/ocp-hardware-component-log.h b/plugins/ocp/ocp-hardware-component-log.h
index f5e5162..1755388 100644
--- a/plugins/ocp/ocp-hardware-component-log.h
+++ b/plugins/ocp/ocp-hardware-component-log.h
@@ -9,7 +9,6 @@
 #ifndef OCP_HARDWARE_COMPONENT_LOG_H
 #define OCP_HARDWARE_COMPONENT_LOG_H
 
-#define LID_HWCOMP 0xc6
 #define HWCOMP_RSVD2_LEN 14
 #define HWCOMP_SIZE_LEN 16
 #define HWCOMP_RSVD48_LEN 16
@@ -54,6 +53,7 @@ enum hwcomp_id {
 	HWCOMP_ID_SN,
 	HWCOMP_ID_COUNTRY,
 	HWCOMP_ID_HW_REV,
+	HWCOMP_ID_BORN_ON_DATE,
 	HWCOMP_ID_VENDOR = 0x8000,
 	HWCOMP_ID_MAX = 0xffff,
 };
diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c
index 6f05750..94ef06e 100644
--- a/plugins/ocp/ocp-nvme.c
+++ b/plugins/ocp/ocp-nvme.c
@@ -32,6 +32,7 @@
 #include "ocp-telemetry-decode.h"
 #include "ocp-hardware-component-log.h"
 #include "ocp-print.h"
+#include "ocp-types.h"
 
 #define CREATE_CMD
 #include "ocp-nvme.h"
@@ -44,8 +45,6 @@
 /// Latency Monitor Log
 
 #define C3_LATENCY_MON_LOG_BUF_LEN		0x200
-#define C3_LATENCY_MON_OPCODE			0xC3
-#define NVME_FEAT_OCP_LATENCY_MONITOR		0xC5
 
 static __u8 lat_mon_guid[GUID_LEN] = {
 	0x92, 0x7a, 0xc0, 0x8c,
@@ -104,6 +103,17 @@ enum erri_type {
 	ERRI_TYPE_HW_MALFUNCTION,
 	ERRI_TYPE_NO_MORE_NAND_SPARES,
 	ERRI_TYPE_INCOMPLETE_SHUTDOWN,
+	ERRI_TYPE_METADATA_CORRUPTION,
+	ERRI_TYPE_CRITICAL_GC,
+	ERRI_TYPE_LATENCY_SPIKE,
+	ERRI_TYPE_IO_CMD_FAILURE,
+	ERRI_TYPE_IO_CMD_TIMEOUT,
+	ERRI_TYPE_ADMIN_CMD_FAILURE,
+	ERRI_TYPE_ADMIN_CMD_TIMEOUT,
+	ERRI_TYPE_THERMAL_THROTTLE_ENGAGED,
+	ERRI_TYPE_THERMAL_THROTTLE_DISENGAGED,
+	ERRI_TYPE_CRITICAL_TEMPERATURE_EVENT,
+	ERRI_TYPE_DIE_OFFLINE,
 };
 
 const char *erri_type_to_string(__le16 type)
@@ -131,6 +141,28 @@ const char *erri_type_to_string(__le16 type)
 		return "no more NAND spares available";
 	case ERRI_TYPE_INCOMPLETE_SHUTDOWN:
 		return "incomplete shutdown";
+	case ERRI_TYPE_METADATA_CORRUPTION:
+		return "Metadata Corruption";
+	case ERRI_TYPE_CRITICAL_GC:
+		return "Critical Garbage Collection";
+	case ERRI_TYPE_LATENCY_SPIKE:
+		return "Latency Spike";
+	case ERRI_TYPE_IO_CMD_FAILURE:
+		return "I/O command failure";
+	case ERRI_TYPE_IO_CMD_TIMEOUT:
+		return "I/O command timeout";
+	case ERRI_TYPE_ADMIN_CMD_FAILURE:
+		return "Admin command failure";
+	case ERRI_TYPE_ADMIN_CMD_TIMEOUT:
+		return "Admin command timeout";
+	case ERRI_TYPE_THERMAL_THROTTLE_ENGAGED:
+		return "Thermal Throttle Engaged";
+	case ERRI_TYPE_THERMAL_THROTTLE_DISENGAGED:
+		return "Thermal Throttle Disengaged";
+	case ERRI_TYPE_CRITICAL_TEMPERATURE_EVENT:
+		return "Critical Temperature Event";
+	case ERRI_TYPE_DIE_OFFLINE:
+		return "Die Offline";
 	default:
 		break;
 	}
@@ -161,6 +193,8 @@ const char *data = "Error injection data structure entries";
 const char *number = "Number of valid error injection data entries";
 static const char *type = "Error injection type";
 static const char *nrtdp = "Number of reads to trigger device panic";
+static const char *save = "Specifies that the controller shall save the attribute";
+static const char *enable_ieee1667_silo = "enable IEEE1667 silo";
 
 static int get_c3_log_page(struct nvme_dev *dev, char *format)
 {
@@ -183,8 +217,7 @@ static int get_c3_log_page(struct nvme_dev *dev, char *format)
 	}
 	memset(data, 0, sizeof(__u8) * C3_LATENCY_MON_LOG_BUF_LEN);
 
-	ret = nvme_get_log_simple(dev_fd(dev), C3_LATENCY_MON_OPCODE,
-		C3_LATENCY_MON_LOG_BUF_LEN, data);
+	ret = ocp_get_log_simple(dev, OCP_LID_LMLOG, C3_LATENCY_MON_LOG_BUF_LEN, data);
 
 	if (strcmp(format, "json"))
 		fprintf(stderr, "NVMe Status:%s(%x)\n", nvme_status_to_string(ret, false), ret);
@@ -305,7 +338,7 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd,
 		.active_latency_minimum_window = 0xA,
 		.debug_log_trigger_enable = 0,
 		.discard_debug_log = 0,
-		.latency_monitor_feature_enable = 0x7,
+		.latency_monitor_feature_enable = 0x1,
 	};
 
 	OPT_ARGS(opts) = {
@@ -356,7 +389,7 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd,
 	struct nvme_set_features_args args = {
 		.args_size = sizeof(args),
 		.fd = dev_fd(dev),
-		.fid = NVME_FEAT_OCP_LATENCY_MONITOR,
+		.fid = OCP_FID_LM,
 		.nsid = 0,
 		.cdw12 = 0,
 		.save = 1,
@@ -370,7 +403,7 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd,
 	if (err < 0) {
 		perror("set-feature");
 	} else if (!err) {
-		printf("NVME_FEAT_OCP_LATENCY_MONITOR: 0x%02x\n", NVME_FEAT_OCP_LATENCY_MONITOR);
+		printf("NVME_FEAT_OCP_LATENCY_MONITOR: 0x%02x\n", OCP_FID_LM);
 		printf("active bucket timer threshold: 0x%x\n",
 		       le16_to_cpu(buf.active_bucket_timer_threshold));
 		printf("active threshold a: 0x%x\n", buf.active_threshold_a);
@@ -511,10 +544,8 @@ static int eol_plp_failure_mode(int argc, char **argv, struct command *cmd,
 	const char *desc = "Define EOL or PLP circuitry failure mode.\n"
 			   "No argument prints current mode.";
 	const char *mode = "[0-3]: default/rom/wtm/normal";
-	const char *save = "Specifies that the controller shall save the attribute";
-	const char *sel = "[0-3]: current/default/saved/supported";
 	const __u32 nsid = 0;
-	const __u8 fid = 0xc2;
+	const __u8 fid = OCP_FID_ROWTM;
 	struct nvme_dev *dev;
 	int err;
 
@@ -1252,8 +1283,7 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b
 	}
 	memset(header_data, 0, sizeof(__u8) * C9_TELEMETRY_STR_LOG_LEN);
 
-	ret = nvme_get_log_simple(dev_fd(dev), C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE,
-				  C9_TELEMETRY_STR_LOG_LEN, header_data);
+	ret = ocp_get_log_simple(dev, OCP_LID_TELSLG, C9_TELEMETRY_STR_LOG_LEN, header_data);
 
 	if (!ret) {
 		log_data = (struct telemetry_str_log_format *)header_data;
@@ -1295,8 +1325,7 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b
 		}
 		memset(pC9_string_buffer, 0, sizeof(__u8) * total_log_page_sz);
 
-		ret = nvme_get_log_simple(dev_fd(dev), C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE,
-					  total_log_page_sz, pC9_string_buffer);
+		ret = ocp_get_log_simple(dev, OCP_LID_TELSLG, total_log_page_sz, pC9_string_buffer);
 	} else {
 		fprintf(stderr, "ERROR : OCP : Unable to read C9 data.\n");
 	}
@@ -1385,7 +1414,7 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, struct
 	const char *output_format = "output format normal|json";
 	const char *data_area = "Telemetry Data Area; 1 or 2;\n"
 			"e.g. '-a 1 for Data Area 1.'\n'-a 2 for Data Areas 1 and 2.';\n";
-	const char *telemetry_type = "Telemetry Type; 'host' or 'controller'";
+	const char *telemetry_type = "Telemetry Type; 'host', 'host0', 'host1' or 'controller'";
 
 	struct nvme_dev *dev;
 	int err = 0;
@@ -1453,7 +1482,8 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, struct
 		else if (!strcmp(opt.telemetry_type, "controller"))
 			tele_type = TELEMETRY_TYPE_CONTROLLER;
 		else {
-			nvme_show_error("telemetry-type should be host or controller.\n");
+			nvme_show_error(
+			    "telemetry-type should be host, host0, host1 or controller.\n");
 			goto out;
 		}
 	} else {
@@ -1504,60 +1534,6 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, struct
 				nvme_show_result("Status:(%x)\n", err);
 		}
 		break;
-	case TELEMETRY_TYPE_NONE:
-		printf("\n-------------------------------------------------------------\n");
-		/* Host 0 (lsp == 0) must be executed before Host 1 (lsp == 1). */
-		printf("\nExtracting Telemetry Host 0 Dump (Data Area 1)...\n");
-
-		err = get_telemetry_dump(dev, opt.output_file, sn,
-				TELEMETRY_TYPE_HOST_0, 1, true);
-		if (err)
-			fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
-				err);
-
-		printf("\n-------------------------------------------------------------\n");
-
-		printf("\nExtracting Telemetry Host 0 Dump (Data Area 3)...\n");
-
-		err = get_telemetry_dump(dev, opt.output_file, sn,
-				TELEMETRY_TYPE_HOST_0, 3, false);
-		if (err)
-			fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
-				err);
-
-		printf("\n-------------------------------------------------------------\n");
-
-		printf("\nExtracting Telemetry Host 1 Dump (Data Area 1)...\n");
-
-		err = get_telemetry_dump(dev, opt.output_file, sn,
-				TELEMETRY_TYPE_HOST_1, 1, true);
-		if (err)
-			fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
-				err);
-
-		printf("\n-------------------------------------------------------------\n");
-
-		printf("\nExtracting Telemetry Host 1 Dump (Data Area 3)...\n");
-
-		err = get_telemetry_dump(dev, opt.output_file, sn,
-				TELEMETRY_TYPE_HOST_1, 3, false);
-		if (err)
-			fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
-				err);
-
-		printf("\n-------------------------------------------------------------\n");
-
-		printf("\nExtracting Telemetry Controller Dump (Data Area 3)...\n");
-
-		if (is_support_telemetry_controller == true) {
-			err = get_telemetry_dump(dev, opt.output_file, sn,
-					TELEMETRY_TYPE_CONTROLLER, 3, true);
-			if (err)
-				fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err);
-		}
-
-		printf("\n-------------------------------------------------------------\n");
-		break;
 	case TELEMETRY_TYPE_HOST_0:
 	case TELEMETRY_TYPE_HOST_1:
 	default:
@@ -1585,7 +1561,6 @@ out:
 
 /* C5 Unsupported Requirement Log Page */
 #define C5_UNSUPPORTED_REQS_LEN            4096
-#define C5_UNSUPPORTED_REQS_OPCODE         0xC5
 
 static __u8 unsupported_req_guid[GUID_LEN] = {
 	0x2F, 0x72, 0x9C, 0x0E,
@@ -1620,8 +1595,7 @@ static int get_c5_log_page(struct nvme_dev *dev, char *format)
 	}
 	memset(data, 0, sizeof(__u8) * C5_UNSUPPORTED_REQS_LEN);
 
-	ret = nvme_get_log_simple(dev_fd(dev), C5_UNSUPPORTED_REQS_OPCODE,
-				  C5_UNSUPPORTED_REQS_LEN, data);
+	ret = ocp_get_log_simple(dev, OCP_LID_URLP, C5_UNSUPPORTED_REQS_LEN, data);
 	if (!ret) {
 		log_data = (struct unsupported_requirement_log *)data;
 
@@ -1693,7 +1667,6 @@ static int ocp_unsupported_requirements_log(int argc, char **argv, struct comman
 /// Error Recovery Log Page(0xC1)
 
 #define C1_ERROR_RECOVERY_LOG_BUF_LEN       0x200
-#define C1_ERROR_RECOVERY_OPCODE            0xC1
 
 static __u8 error_recovery_guid[GUID_LEN] = {
 	0x44, 0xd9, 0x31, 0x21,
@@ -1726,7 +1699,7 @@ static int get_c1_log_page(struct nvme_dev *dev, char *format)
 	}
 	memset(data, 0, sizeof(__u8) * C1_ERROR_RECOVERY_LOG_BUF_LEN);
 
-	ret = nvme_get_log_simple(dev_fd(dev), C1_ERROR_RECOVERY_OPCODE, C1_ERROR_RECOVERY_LOG_BUF_LEN, data);
+	ret = ocp_get_log_simple(dev, OCP_LID_EREC, C1_ERROR_RECOVERY_LOG_BUF_LEN, data);
 
 	if (!ret) {
 		log_data = (struct ocp_error_recovery_log_page *)data;
@@ -1797,7 +1770,6 @@ static int ocp_error_recovery_log(int argc, char **argv, struct command *cmd, st
 /// Device Capabilities (Log Identifier C4h) Requirements
 
 #define C4_DEV_CAP_REQ_LEN			0x1000
-#define C4_DEV_CAP_REQ_OPCODE		0xC4
 static __u8 dev_cap_req_guid[GUID_LEN] = {
 	0x97, 0x42, 0x05, 0x0d,
 	0xd1, 0xe1, 0xc9, 0x98,
@@ -1829,7 +1801,7 @@ static int get_c4_log_page(struct nvme_dev *dev, char *format)
 	}
 	memset(data, 0, sizeof(__u8) * C4_DEV_CAP_REQ_LEN);
 
-	ret = nvme_get_log_simple(dev_fd(dev), C4_DEV_CAP_REQ_OPCODE, C4_DEV_CAP_REQ_LEN, data);
+	ret = ocp_get_log_simple(dev, OCP_LID_DCLP, C4_DEV_CAP_REQ_LEN, data);
 
 	if (!ret) {
 		log_data = (struct ocp_device_capabilities_log_page *)data;
@@ -1915,7 +1887,7 @@ static int ocp_set_telemetry_profile(struct nvme_dev *dev, __u8 tps)
 	struct nvme_set_features_args args = {
 		.args_size = sizeof(args),
 		.fd = dev_fd(dev),
-		.fid = 0xC8,
+		.fid = OCP_FID_TEL_CFG,
 		.nsid = 0xFFFFFFFF,
 		.cdw11 = tps,
 		.cdw12 = 0,
@@ -2038,7 +2010,6 @@ static int set_dssd_power_state_feature(int argc, char **argv, struct command *c
 	const char *power_state = "DSSD Power State to set in watts";
 	const char *save = "Specifies that the controller shall save the attribute";
 	const __u32 nsid = 0;
-	const __u8 fid = 0xC7;
 	struct nvme_dev *dev;
 	int err;
 
@@ -2065,9 +2036,8 @@ static int set_dssd_power_state_feature(int argc, char **argv, struct command *c
 		return err;
 
 	if (argconfig_parse_seen(opts, "power-state"))
-		err = set_dssd_power_state(dev, nsid, fid, cfg.power_state,
-					       cfg.save,
-					       !argconfig_parse_seen(opts, "no-uuid"));
+		err = set_dssd_power_state(dev, nsid, OCP_FID_DSSDPS, cfg.power_state, cfg.save,
+					   !argconfig_parse_seen(opts, "no-uuid"));
 
 	dev_close(dev);
 
@@ -2130,7 +2100,7 @@ static int get_dssd_power_state_feature(int argc, char **argv, struct command *c
 	const char *all = "Print out all 3 values at once - Current, Default, and Saved";
 	const char *sel = "[0-3]: current/default/saved/supported/";
 	const __u32 nsid = 0;
-	const __u8 fid = 0xC7;
+	const __u8 fid = OCP_FID_DSSDPS;
 	struct nvme_dev *dev;
 	int i, err;
 
@@ -2188,7 +2158,6 @@ static int set_plp_health_check_interval(int argc, char **argv, struct command *
 	const char *plp_health_interval = "[31:16]:PLP Health Check Interval";
 	const char *save = "Specifies that the controller shall save the attribute";
 	const __u32 nsid = 0;
-	const __u8 fid = 0xc6;
 	struct nvme_dev *dev;
 	int err;
 	__u32 result;
@@ -2230,7 +2199,7 @@ static int set_plp_health_check_interval(int argc, char **argv, struct command *
 	struct nvme_set_features_args args = {
 		.args_size = sizeof(args),
 		.fd = dev_fd(dev),
-		.fid = fid,
+		.fid = OCP_FID_PLPI,
 		.nsid = nsid,
 		.cdw11 = cfg.plp_health_interval << 16,
 		.cdw12 = 0,
@@ -2262,7 +2231,6 @@ static int get_plp_health_check_interval(int argc, char **argv, struct command *
 {
 
 	const char *desc = "Define Issue Get Feature command (FID : 0xC6) PLP Health Check Interval";
-	const char *sel = "[0-3,8]: current/default/saved/supported/changed";
 	const __u32 nsid = 0;
 	const __u8 fid = 0xc6;
 	struct nvme_dev *dev;
@@ -2290,7 +2258,7 @@ static int get_plp_health_check_interval(int argc, char **argv, struct command *
 	struct nvme_get_features_args args = {
 		.args_size  = sizeof(args),
 		.fd         = dev_fd(dev),
-		.fid        = fid,
+		.fid        = OCP_FID_PLPI,
 		.nsid       = nsid,
 		.sel        = cfg.sel,
 		.cdw11      = 0,
@@ -2328,7 +2296,6 @@ static int set_dssd_async_event_config(int argc, char **argv, struct command *cm
 	const char *epn = "[0]:Enable Panic Notices";
 	const char *save = "Specifies that the controller shall save the attribute";
 	const __u32 nsid = 0;
-	const __u8 fid = 0xc9;
 	struct nvme_dev *dev;
 	int err;
 	__u32 result;
@@ -2364,7 +2331,7 @@ static int set_dssd_async_event_config(int argc, char **argv, struct command *cm
 	struct nvme_set_features_args args = {
 		.args_size = sizeof(args),
 		.fd = dev_fd(dev),
-		.fid = fid,
+		.fid = OCP_FID_DAEC,
 		.nsid = nsid,
 		.cdw11 = cfg.epn ? 1 : 0,
 		.cdw12 = 0,
@@ -2398,7 +2365,7 @@ static int get_dssd_async_event_config(int argc, char **argv, struct command *cm
 	const char *desc = "Issue Get Feature command (FID : 0xC9) DSSD Async Event Config";
 	const char *sel = "[0-3]: current/default/saved/supported";
 	const __u32 nsid = 0;
-	const __u8 fid = 0xc9;
+	const __u8 fid = OCP_FID_DAEC;
 	struct nvme_dev *dev;
 	__u32 result;
 	int err;
@@ -2469,7 +2436,11 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format)
 		return ret;
 	}
 
-	ret = get_c9_log_page_data(dev, 1, 0);
+	if (fmt == BINARY)
+		ret = get_c9_log_page_data(dev, 0, 1);
+	else
+		ret = get_c9_log_page_data(dev, 0, 0);
+
 	if (!ret) {
 		ocp_c9_log(log_data, pC9_string_buffer, total_log_page_sz, fmt);
 	} else {
@@ -2496,7 +2467,8 @@ static int ocp_telemetry_str_log_format(int argc, char **argv, struct command *c
 	};
 
 	OPT_ARGS(opts) = {
-		OPT_FMT("output-format", 'o', &cfg.output_format, "output Format: normal|json"),
+		OPT_FMT("output-format", 'o', &cfg.output_format,
+				"output Format:normal|json|binary"),
 		OPT_END()
 	};
 
@@ -2521,7 +2493,6 @@ static int ocp_telemetry_str_log_format(int argc, char **argv, struct command *c
 
 /* C7 TCG Configuration Log Page */
 #define C7_TCG_CONFIGURATION_LEN           512
-#define C7_TCG_CONFIGURATION_OPCODE        0xC7
 
 static __u8 tcg_configuration_guid[GUID_LEN] = {
 	0x06, 0x40, 0x24, 0xBD,
@@ -2556,8 +2527,7 @@ static int get_c7_log_page(struct nvme_dev *dev, char *format)
 	}
 	memset(data, 0, sizeof(__u8) * C7_TCG_CONFIGURATION_LEN);
 
-	ret = nvme_get_log_simple(dev_fd(dev), C7_TCG_CONFIGURATION_OPCODE,
-				  C7_TCG_CONFIGURATION_LEN, data);
+	ret = ocp_get_log_simple(dev, OCP_LID_TCGL, C7_TCG_CONFIGURATION_LEN, data);
 	if (!ret) {
 		log_data = (struct tcg_configuration_log *)data;
 
@@ -2657,7 +2627,7 @@ static int error_injection_get(struct nvme_dev *dev, const __u8 sel, bool uuid)
 	struct erri_get_cq_entry cq_entry;
 	int err;
 	int i;
-	const __u8 fid = 0xc0;
+	const __u8 fid = OCP_FID_ERRI;
 
 	_cleanup_free_ struct erri_entry *entry = NULL;
 
@@ -2738,7 +2708,7 @@ static int error_injection_set(struct nvme_dev *dev, struct erri_config *cfg, bo
 	struct nvme_set_features_args args = {
 		.args_size = sizeof(args),
 		.fd = dev_fd(dev),
-		.fid = 0xc0,
+		.fid = OCP_FID_ERRI,
 		.cdw11 = cfg->number,
 		.data_len = cfg->number * sizeof(struct erri_entry),
 		.timeout = nvme_cfg.timeout,
@@ -2830,7 +2800,7 @@ static int enable_ieee1667_silo_get(struct nvme_dev *dev, const __u8 sel, bool u
 {
 	struct ieee1667_get_cq_entry cq_entry;
 	int err;
-	const __u8 fid = 0xc4;
+	const __u8 fid = OCP_FID_1667;
 
 	struct nvme_get_features_args args = {
 		.result = (__u32 *)&cq_entry,
@@ -2890,6 +2860,70 @@ static int get_enable_ieee1667_silo(int argc, char **argv, struct command *cmd,
 	return enable_ieee1667_silo_get(dev, cfg.sel, !argconfig_parse_seen(opts, "no-uuid"));
 }
 
+static int enable_ieee1667_silo_set(struct nvme_dev *dev,
+				    struct argconfig_commandline_options *opts)
+{
+	struct ieee1667_get_cq_entry cq_entry;
+	int err;
+	const __u8 fid = OCP_FID_1667;
+	bool enable = argconfig_parse_seen(opts, "enable");
+
+	struct nvme_set_features_args args = {
+		.result = (__u32 *)&cq_entry,
+		.args_size = sizeof(args),
+		.fd = dev_fd(dev),
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.cdw11 = OCP_SET(enable, ENABLE_IEEE1667_SILO),
+		.save = argconfig_parse_seen(opts, "save"),
+		.fid = fid,
+	};
+
+	if (!argconfig_parse_seen(opts, "no-uuid")) {
+		/* OCP 2.0 requires UUID index support */
+		err = ocp_get_uuid_index(dev, &args.uuidx);
+		if (err || !args.uuidx) {
+			nvme_show_error("ERROR: No OCP UUID index found");
+			return err;
+		}
+	}
+
+	err = nvme_cli_set_features(dev, &args);
+	if (err > 0) {
+		nvme_show_status(err);
+	} else if (err < 0) {
+		nvme_show_perror(enable_ieee1667_silo);
+		fprintf(stderr, "Command failed while parsing.\n");
+	} else {
+		enable = OCP_GET(args.cdw11, ENABLE_IEEE1667_SILO);
+		nvme_show_result("Successfully set enable (feature: 0x%02x): %d (%s: %s).", fid,
+				 enable, args.save ? "Save" : "Not save",
+				 enable ? "Enabled" : "Disabled");
+	}
+
+	return err;
+}
+
+static int set_enable_ieee1667_silo(int argc, char **argv, struct command *cmd,
+				    struct plugin *plugin)
+{
+	int err;
+
+	_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+	OPT_ARGS(opts) = {
+		OPT_FLAG("enable", 'e', NULL, no_uuid),
+		OPT_FLAG("save", 's', NULL, save),
+		OPT_FLAG("no-uuid", 'n', NULL, no_uuid),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, enable_ieee1667_silo, opts);
+	if (err)
+		return err;
+
+	return enable_ieee1667_silo_set(dev, opts);
+}
+
 static int hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
 {
 	return ocp_hwcomp_log(argc, argv, cmd, plugin);
diff --git a/plugins/ocp/ocp-nvme.h b/plugins/ocp/ocp-nvme.h
index 04acbfc..4e697f2 100644
--- a/plugins/ocp/ocp-nvme.h
+++ b/plugins/ocp/ocp-nvme.h
@@ -11,7 +11,7 @@
 #if !defined(OCP_NVME) || defined(CMD_HEADER_MULTI_READ)
 #define OCP_NVME
 
-#define OCP_PLUGIN_VERSION   "2.9.2"
+#define OCP_PLUGIN_VERSION   "2.11.0"
 #include "cmd.h"
 
 PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION),
@@ -40,6 +40,7 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION),
 		ENTRY("set-error-injection", "Inject error conditions", set_error_injection)
 		ENTRY("get-enable-ieee1667-silo", "return set of enable IEEE1667 silo",
 		      get_enable_ieee1667_silo)
+		ENTRY("set-enable-ieee1667-silo", "enable IEEE1667 silo", set_enable_ieee1667_silo)
 		ENTRY("hardware-component-log", "retrieve hardware component log", hwcomp_log)
 	)
 );
@@ -50,6 +51,8 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION),
 
 #ifndef OCP_NVME_H
 #define OCP_NVME_H
+#include "common.h"
+
 struct __packed ssd_latency_monitor_log {
 	__u8	feature_status;			/* 0x00 */
 	__u8	rsvd1;				/* 0x01 */
@@ -73,8 +76,9 @@ struct __packed ssd_latency_monitor_log {
 	__le64	static_latency_timestamp[4][3];	/* 0x130 - 0x18F */
 	__le16	static_measured_latency[4][3];	/* 0x190 - 0x1A7 */
 	__le16	static_latency_stamp_units;	/* 0x1A8 */
-	__u8	rsvd4[0x16];			/* 0x1AA */
+	__u8	rsvd4[0x0A];			/* 0x1AA */
 
+	__u8	latency_monitor_debug_log_size[0x0C]; /* 0x1B4 */
 	__le16	debug_log_trigger_enable;	/* 0x1C0 */
 	__le16	debug_log_measured_latency;	/* 0x1C2 */
 	__le64	debug_log_latency_stamp;	/* 0x1C4 */
@@ -195,7 +199,7 @@ struct __packed ocp_device_capabilities_log_page {
 /*
  * struct tcg_configuration_log - TCG Configuration Log Page Structure
  * @state:                            state
- * @rsvd1:                            Reserved1
+ * @rsvd1:                            Reserved
  * @locking_sp_act_count:             Locking SP Activation Count
  * @type_rev_count:                   Tper Revert Count
  * @locking_sp_rev_count:             Locking SP Revert Count.
@@ -207,13 +211,14 @@ struct __packed ocp_device_capabilities_log_page {
  * @no_of_write_lock_locking_obj:     Number of Write Locked Locking Objects
  * @no_of_read_unlock_locking_obj:    Number of Read Unlocked Locking Objects
  * @no_of_read_unlock_locking_obj:    Number of Write Unlocked Locking Objects
- * @rsvd2:                            Reserved2
+ * @rsvd15:                           Reserved
  * @sid_auth_try_count:               SID Authentication Try Count
  * @sid_auth_try_limit:               SID Authentication Try Limit
  * @pro_tcg_rc:                       Programmatic TCG Reset Count
  * @pro_rlc:                          Programmatic Reset Lock Count
  * @tcg_ec:                           TCG Error Count
- * @rsvd3:                            Reserved3
+ * @no_of_ns_prov_locking_obj_ext:    Number of Namespace Provisioned Locking Objects Extended
+ * @rsvd38:                           Reserved
  * @log_page_version:                 Log Page Version
  */
 struct __packed tcg_configuration_log {
@@ -230,15 +235,43 @@ struct __packed tcg_configuration_log {
 	__u8    no_of_write_lock_locking_obj;
 	__u8    no_of_read_unlock_locking_obj;
 	__u8    no_of_write_unlock_locking_obj;
-	__u8    rsvd2;
+	__u8    rsvd15;
 	__le32  sid_auth_try_count;
 	__le32  sid_auth_try_limit;
 	__le32  pro_tcg_rc;
 	__le32  pro_rlc;
 	__le32  tcg_ec;
-	__u8    rsvd3[458];
+	__le16  no_of_ns_prov_locking_obj_ext;
+	__u8    rsvd38[456];
 	__le16  log_page_version;
 	__u8    log_page_guid[GUID_LEN];
 
 };
+
+enum ocp_dssd_log_id {
+	OCP_LID_SMART = 0xc0, /* SMART / Helth Information Extended */
+	OCP_LID_EREC, /* Error Recovery */
+	OCP_LID_FAHL_OBSOLETE, /* Firmware Activation History (Obsolete) */
+	OCP_LID_LMLOG, /* Latency Monitor */
+	OCP_LID_DCLP, /* Device Capabilities */
+	OCP_LID_URLP, /* Unsupported Requirements */
+	OCP_LID_HWCOMP, /* Hardware Component */
+	OCP_LID_TCGL, /* TCG Configuration */
+	OCP_LID_RESERVED, /* Reserved for future use */
+	OCP_LID_TELSLG, /* Telemetry String */
+	OCP_LID_LMLOG_DEBUG, /* Latency Monitor Debug Telemetry */
+};
+
+enum ocp_dssd_feature_id {
+	OCP_FID_ERRI = 0xc0, /* Error Injection */
+	OCP_FID_CFUH, /* Clear Firmware Update History (Obsolete) */
+	OCP_FID_ROWTM, /* EOL/PLP Failure Mode */
+	OCP_FID_CPCIE, /* Clear PCIe Correctable Error Counters */
+	OCP_FID_1667, /* Enable IEEE1667 Silo */
+	OCP_FID_LM, /* Latency Monitor */
+	OCP_FID_PLPI, /* PLP Health Check Interval */
+	OCP_FID_DSSDPS, /* DSSD Power State */
+	OCP_FID_TEL_CFG, /* Telemetry Profile */
+	OCP_FID_DAEC, /* DSSD Asynchronous Event Configuration */
+};
 #endif /* OCP_NVME_H */
diff --git a/plugins/ocp/ocp-print-binary.c b/plugins/ocp/ocp-print-binary.c
index 64e1246..c966b47 100644
--- a/plugins/ocp/ocp-print-binary.c
+++ b/plugins/ocp/ocp-print-binary.c
@@ -7,9 +7,12 @@
 
 static void binary_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list)
 {
-	long double desc_len = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32);
+	long double log_bytes = uint128_t_to_double(le128_to_cpu(log->size));
 
-	d_raw((unsigned char *)log, offsetof(struct hwcomp_log, desc) + desc_len);
+	if (log->ver == 1)
+		log_bytes *= sizeof(__le32);
+
+	d_raw((unsigned char *)log, log_bytes);
 }
 
 static void binary_c5_log(struct nvme_dev *dev, struct unsupported_requirement_log *log_data)
diff --git a/plugins/ocp/ocp-print-json.c b/plugins/ocp/ocp-print-json.c
index a600628..e3ce2da 100644
--- a/plugins/ocp/ocp-print-json.c
+++ b/plugins/ocp/ocp-print-json.c
@@ -11,15 +11,16 @@
 
 static void print_hwcomp_desc_json(struct hwcomp_desc_entry *e, struct json_object *r)
 {
-	obj_add_str(r, "Description", hwcomp_id_to_string(le32_to_cpu(e->desc->id)));
-	obj_add_nprix64(r, "Date/Lot Size", e->date_lot_size);
-	obj_add_nprix64(r, "Additional Information Size", e->add_info_size);
-	obj_add_uint_0nx(r, "Identifier", le32_to_cpu(e->desc->id), 8);
-	obj_add_0nprix64(r, "Manufacture", le64_to_cpu(e->desc->mfg), 16);
-	obj_add_0nprix64(r, "Revision", le64_to_cpu(e->desc->rev), 16);
-	obj_add_0nprix64(r, "Manufacture Code", le64_to_cpu(e->desc->mfg_code), 16);
-	obj_add_byte_array(r, "Date/Lot Code", e->date_lot_code, e->date_lot_size);
-	obj_add_byte_array(r, "Additional Information", e->add_info, e->add_info_size);
+	json_object_add_value_string(r, "Description",
+				     hwcomp_id_to_string(le32_to_cpu(e->desc->id)));
+	json_object_add_nprix64(r, "Date/Lot Size", e->date_lot_size);
+	json_object_add_nprix64(r, "Additional Information Size", e->add_info_size);
+	json_object_add_uint_0nx(r, "Identifier", le32_to_cpu(e->desc->id), 8);
+	json_object_add_0nprix64(r, "Manufacture", le64_to_cpu(e->desc->mfg), 16);
+	json_object_add_0nprix64(r, "Revision", le64_to_cpu(e->desc->rev), 16);
+	json_object_add_0nprix64(r, "Manufacture Code", le64_to_cpu(e->desc->mfg_code), 16);
+	json_object_add_byte_array(r, "Date/Lot Code", e->date_lot_code, e->date_lot_size);
+	json_object_add_byte_array(r, "Additional Information", e->add_info, e->add_info_size);
 }
 
 static void print_hwcomp_desc_list_json(struct json_object *r, struct hwcomp_desc_entry *e,
@@ -31,7 +32,8 @@ static void print_hwcomp_desc_list_json(struct json_object *r, struct hwcomp_des
 		return;
 
 	if (list) {
-		obj_add_str(r, k, hwcomp_id_to_string(le32_to_cpu(e->desc->id)));
+		json_object_add_value_string(r, k,
+					     hwcomp_id_to_string(le32_to_cpu(e->desc->id)));
 		return;
 	}
 
@@ -63,17 +65,19 @@ static void print_hwcomp_descs_json(struct hwcomp_desc *desc, long double log_si
 
 static void json_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list)
 {
+	long double log_bytes = uint128_t_to_double(le128_to_cpu(log->size));
 	struct json_object *r = json_create_object();
 
-	long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32);
+	if (log->ver == 1)
+		log_bytes *= sizeof(__le32);
 
-	obj_add_uint_02x(r, "Log Identifier", LID_HWCOMP);
-	obj_add_uint_0x(r, "Log Page Version", le16_to_cpu(log->ver));
-	obj_add_byte_array(r, "Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2));
-	obj_add_byte_array(r, "Log page GUID", log->guid, ARRAY_SIZE(log->guid));
-	obj_add_nprix64(r, "Hardware Component Log Size", (unsigned long long)log_size);
-	obj_add_byte_array(r, "Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48));
-	print_hwcomp_descs_json(log->desc, log_size, id, list,
+	json_object_add_uint_02x(r, "Log Identifier", OCP_LID_HWCOMP);
+	json_object_add_uint_0x(r, "Log Page Version", le16_to_cpu(log->ver));
+	json_object_add_byte_array(r, "Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2));
+	json_object_add_byte_array(r, "Log page GUID", log->guid, ARRAY_SIZE(log->guid));
+	json_object_add_nprix64(r, "Hardware Component Log Size", (unsigned long long)log_bytes);
+	json_object_add_byte_array(r, "Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48));
+	print_hwcomp_descs_json(log->desc, log_bytes - offsetof(struct hwcomp_log, desc), id, list,
 				obj_create_array_obj(r, "Component Descriptions"));
 
 	json_print(r);
@@ -97,7 +101,7 @@ static void json_fw_activation_history(const struct fw_activation_history *fw_hi
 		json_object_add_value_uint(entry_obj, "activation count",
 					   le16_to_cpu(entry->activation_count));
 		json_object_add_value_uint64(entry_obj, "timestamp",
-				(0x0000FFFFFFFFFFFF & le64_to_cpu(entry->timestamp)));
+					     int48_to_long(entry->ts.timestamp));
 		json_object_add_value_uint(entry_obj, "power cycle count",
 					   le64_to_cpu(entry->power_cycle_count));
 
@@ -134,85 +138,88 @@ static void json_fw_activation_history(const struct fw_activation_history *fw_hi
 	printf("\n");
 }
 
-static void json_smart_extended_log(void *data)
+static void json_smart_extended_log_v1(struct ocp_smart_extended_log *log)
 {
 	struct json_object *root;
 	struct json_object *pmuw;
 	struct json_object *pmur;
 	uint16_t smart_log_ver = 0;
-	__u8 *log_data = data;
+	uint16_t dssd_version = 0;
+	int i = 0;
 	char guid[40];
+	char ascii_arr[65];
+	char *ascii = ascii_arr;
 
 	root = json_create_object();
 	pmuw = json_create_object();
 	pmur = json_create_object();
 
 	json_object_add_value_uint64(pmuw, "hi",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW + 8] & 0xFFFFFFFFFFFFFFFF));
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_written[8]));
 	json_object_add_value_uint64(pmuw, "lo",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF));
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_written));
 	json_object_add_value_object(root, "Physical media units written", pmuw);
 	json_object_add_value_uint64(pmur, "hi",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR + 8] & 0xFFFFFFFFFFFFFFFF));
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_read[8]));
 	json_object_add_value_uint64(pmur, "lo",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF));
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_read));
 	json_object_add_value_object(root, "Physical media units read", pmur);
 	json_object_add_value_uint64(root, "Bad user nand blocks - Raw",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF));
+		int48_to_long(log->bad_user_nand_blocks_raw));
 	json_object_add_value_uint(root, "Bad user nand blocks - Normalized",
-		(uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
+		le16_to_cpu(log->bad_user_nand_blocks_normalized));
 	json_object_add_value_uint64(root, "Bad system nand blocks - Raw",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
+		int48_to_long(log->bad_system_nand_blocks_raw));
 	json_object_add_value_uint(root, "Bad system nand blocks - Normalized",
-		(uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
+		le16_to_cpu(log->bad_system_nand_blocks_normalized));
 	json_object_add_value_uint64(root, "XOR recovery count",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
+		le64_to_cpu(log->xor_recovery_count));
 	json_object_add_value_uint64(root, "Uncorrectable read error count",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
+		le64_to_cpu(log->uncorrectable_read_err_count));
 	json_object_add_value_uint64(root, "Soft ecc error count",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
+		le64_to_cpu(log->soft_ecc_err_count));
 	json_object_add_value_uint(root, "End to end detected errors",
-		(uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
+		le32_to_cpu(log->end_to_end_detected_err));
 	json_object_add_value_uint(root, "End to end corrected errors",
-		(uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
+		le32_to_cpu(log->end_to_end_corrected_err));
 	json_object_add_value_uint(root, "System data percent used",
-		(__u8)log_data[SCAO_SDPU]);
+		log->system_data_used_percent);
 	json_object_add_value_uint64(root, "Refresh counts",
-		(uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
+		int56_to_long(log->refresh_counts));
 	json_object_add_value_uint(root, "Max User data erase counts",
-		(uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
+		le32_to_cpu(log->user_data_erase_count_max));
 	json_object_add_value_uint(root, "Min User data erase counts",
-		(uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
+		le32_to_cpu(log->user_data_erase_count_min));
 	json_object_add_value_uint(root, "Number of Thermal throttling events",
-		(__u8)log_data[SCAO_NTTE]);
+		log->thermal_throttling_event_count);
 	json_object_add_value_uint(root, "Current throttling status",
-		(__u8)log_data[SCAO_CTS]);
+		log->thermal_throttling_current_status);
 	json_object_add_value_uint64(root, "PCIe correctable error count",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
+		le64_to_cpu(log->pcie_correctable_err_count));
 	json_object_add_value_uint(root, "Incomplete shutdowns",
-		(uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
+		le32_to_cpu(log->incomplete_shoutdowns));
 	json_object_add_value_uint(root, "Percent free blocks",
-		(__u8)log_data[SCAO_PFB]);
+		log->percent_free_blocks);
 	json_object_add_value_uint(root, "Capacitor health",
-		(uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
+		le16_to_cpu(log->capacitor_health));
 	json_object_add_value_uint64(root, "Unaligned I/O",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
+		le64_to_cpu(log->unaligned_io));
 	json_object_add_value_uint64(root, "Security Version Number",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
+		le64_to_cpu(log->security_version));
 	json_object_add_value_uint64(root, "NUSE - Namespace utilization",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
+		le64_to_cpu(log->total_nuse));
 	json_object_add_value_uint128(root, "PLP start count",
-		le128_to_cpu(&log_data[SCAO_PSC]));
+		le128_to_cpu(log->plp_start_count));
 	json_object_add_value_uint128(root, "Endurance estimate",
-		le128_to_cpu(&log_data[SCAO_EEST]));
-	smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]);
+		le128_to_cpu(log->endurance_estimate));
+	smart_log_ver = le16_to_cpu(log->log_page_version);
 
 	json_object_add_value_uint(root, "Log page version", smart_log_ver);
 
 	memset((void *)guid, 0, 40);
 	sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"",
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]),
-		(uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG]));
+		le64_to_cpu(*(uint64_t *)&log->log_page_guid[8]),
+		le64_to_cpu(*(uint64_t *)&log->log_page_guid));
 	json_object_add_value_string(root, "Log page GUID", guid);
 
 	switch (smart_log_ver) {
@@ -221,31 +228,251 @@ static void json_smart_extended_log(void *data)
 	default:
 	case 4:
 		json_object_add_value_uint(root, "NVMe Command Set Errata Version",
-					   (__u8)log_data[SCAO_NCSEV]);
+						log->nvme_cmdset_errata_version);
 		json_object_add_value_uint(root, "Lowest Permitted Firmware Revision",
-					   le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+						le64_to_cpu(log->lowest_permitted_fw_rev));
+		json_object_add_value_uint(root, "NVMe Over Pcie Errata Version",
+						log->nvme_over_pcie_errate_version);
+		json_object_add_value_uint(root, "NVMe Mi Errata Version",
+						log->nvme_mi_errata_version);
+		json_object_add_value_uint(root, "Total media dies",
+						le16_to_cpu(log->total_media_dies));
+		json_object_add_value_uint(root, "Total die failure tolerance",
+						le16_to_cpu(log->total_die_failure_tolerance));
+		json_object_add_value_uint(root, "Media dies offline",
+						le16_to_cpu(log->media_dies_offline));
+		json_object_add_value_uint(root, "Max temperature recorded",
+						log->max_temperature_recorded);
+		json_object_add_value_uint64(root, "Nand avg erase count",
+						le64_to_cpu(log->nand_avg_erase_count));
+		json_object_add_value_uint(root, "Command timeouts",
+						le32_to_cpu(log->command_timeouts));
+		json_object_add_value_uint(root, "Sys area program fail count raw",
+						le32_to_cpu(log->sys_area_program_fail_count_raw));
+		json_object_add_value_uint(root, "Sys area program fail count noralized",
+						log->sys_area_program_fail_count_normalized);
+		json_object_add_value_uint(root, "Sys area uncorrectable read count raw",
+						le32_to_cpu(log->sys_area_uncorr_read_count_raw));
+		json_object_add_value_uint(root, "Sys area uncorrectable read count noralized",
+						log->sys_area_uncorr_read_count_normalized);
+		json_object_add_value_uint(root, "Sys area erase fail count raw",
+						le32_to_cpu(log->sys_area_erase_fail_count_raw));
+		json_object_add_value_uint(root, "Sys area erase fail count noralized",
+						log->sys_area_erase_fail_count_normalized);
+		json_object_add_value_uint(root, "Max peak power capability",
+						le16_to_cpu(log->max_peak_power_capability));
+		json_object_add_value_uint(root, "Current max avg power",
+						le16_to_cpu(log->current_max_avg_power));
+		json_object_add_value_uint64(root, "Lifetime power consumed",
+						int48_to_long(log->lifetime_power_consumed));
+		memset((void *)ascii, 0, 65);
+		for (i = 0; i < 8; i++)
+			ascii += sprintf(ascii, "%c", log->dssd_firmware_revision[i]);
+		json_object_add_value_string(root, "Dssd firmware revision", ascii_arr);
+		json_object_add_value_string(root, "Dssd firmware build UUID",
+						util_uuid_to_string(log->dssd_firmware_build_uuid));
+		ascii = ascii_arr;
+		memset((void *)ascii, 0, 65);
+		for (i = 0; i < 64; i++)
+			ascii += sprintf(ascii, "%c", log->dssd_firmware_build_label[i]);
+		json_object_add_value_string(root, "Dssd firmware build label", ascii_arr);
 		fallthrough;
 	case 2 ... 3:
 		json_object_add_value_uint(root, "Errata Version Field",
-					   (__u8)log_data[SCAO_EVF]);
+						log->dssd_errata_version);
+		memcpy(&dssd_version, log->dssd_point_version, sizeof(dssd_version));
 		json_object_add_value_uint(root, "Point Version Field",
-					   le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
+						le16_to_cpu(dssd_version));
+		memcpy(&dssd_version, log->dssd_minor_version, sizeof(dssd_version));
 		json_object_add_value_uint(root, "Minor Version Field",
-					   le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
+						le16_to_cpu(dssd_version));
 		json_object_add_value_uint(root, "Major Version Field",
-					   (__u8)log_data[SCAO_MAVF]);
+						log->dssd_major_version);
 		json_object_add_value_uint(root, "NVMe Base Errata Version",
-					   (__u8)log_data[SCAO_NBEV]);
+						log->nvme_base_errata_version);
 		json_object_add_value_uint(root, "PCIe Link Retraining Count",
-					   le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
+						le64_to_cpu(log->pcie_link_retaining_count));
 		json_object_add_value_uint(root, "Power State Change Count",
-					   le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+						le64_to_cpu(log->power_state_change_count));
 	}
 	json_print_object(root, NULL);
 	printf("\n");
 	json_free_object(root);
 }
 
+static void json_smart_extended_log_v2(struct ocp_smart_extended_log *log)
+{
+	struct json_object *root;
+	struct json_object *pmuw;
+	struct json_object *pmur;
+	int i = 0;
+	uint16_t smart_log_ver = 0;
+	uint16_t dssd_version = 0;
+	char guid[40];
+	char ascii_arr[65];
+	char *ascii = ascii_arr;
+
+	root = json_create_object();
+	pmuw = json_create_object();
+	pmur = json_create_object();
+
+	json_object_add_value_uint64(pmuw, "hi",
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_written[8]));
+	json_object_add_value_uint64(pmuw, "lo",
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_written));
+	json_object_add_value_object(root, "physical_media_units_written", pmuw);
+	json_object_add_value_uint64(pmur, "hi",
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_read[8]));
+	json_object_add_value_uint64(pmur, "lo",
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_read));
+	json_object_add_value_object(root, "physical_media_units_read", pmur);
+	json_object_add_value_uint64(root, "bad_user_nand_blocks_raw",
+		int48_to_long(log->bad_user_nand_blocks_raw));
+	json_object_add_value_uint(root, "bad_user_nand_blocks_normalized",
+		le16_to_cpu(log->bad_user_nand_blocks_normalized));
+	json_object_add_value_uint64(root, "bad_system_nand_blocks_raw",
+		int48_to_long(log->bad_system_nand_blocks_raw));
+	json_object_add_value_uint(root, "bad_system_nand_blocks_normalized",
+		le16_to_cpu(log->bad_system_nand_blocks_normalized));
+	json_object_add_value_uint64(root, "xor_recovery_count",
+		le64_to_cpu(log->xor_recovery_count));
+	json_object_add_value_uint64(root, "uncorrectable_read_errors",
+		le64_to_cpu(log->uncorrectable_read_err_count));
+	json_object_add_value_uint64(root, "soft_ecc_error_count",
+		le64_to_cpu(log->soft_ecc_err_count));
+	json_object_add_value_uint(root, "end_to_end_detected_errors",
+		le32_to_cpu(log->end_to_end_detected_err));
+	json_object_add_value_uint(root, "end_to_end_corrected_errors",
+		le32_to_cpu(log->end_to_end_corrected_err));
+	json_object_add_value_uint(root, "system_data_percent_used",
+		log->system_data_used_percent);
+	json_object_add_value_uint64(root, "refresh_count",
+		int56_to_long(log->refresh_counts));
+	json_object_add_value_uint(root, "max_user_data_erase_count",
+		le32_to_cpu(log->user_data_erase_count_max));
+	json_object_add_value_uint(root, "min_user_data_erase_count",
+		le32_to_cpu(log->user_data_erase_count_min));
+	json_object_add_value_uint(root, "thermal_throttling_events",
+		log->thermal_throttling_event_count);
+	json_object_add_value_uint(root, "current_throttling_status",
+		log->thermal_throttling_current_status);
+	json_object_add_value_uint64(root, "pcie_correctable_errors",
+		le64_to_cpu(log->pcie_correctable_err_count));
+	json_object_add_value_uint(root, "incomplete_shutdowns",
+		le32_to_cpu(log->incomplete_shoutdowns));
+	json_object_add_value_uint(root, "percent_free_blocks",
+		log->percent_free_blocks);
+	json_object_add_value_uint(root, "capacitor_health",
+		le16_to_cpu(log->capacitor_health));
+	json_object_add_value_uint64(root, "unaligned_io",
+		le64_to_cpu(log->unaligned_io));
+	json_object_add_value_uint64(root, "security_version_number",
+		le64_to_cpu(log->security_version));
+	json_object_add_value_uint64(root, "nuse_namespace_utilization",
+		le64_to_cpu(log->total_nuse));
+	json_object_add_value_uint128(root, "plp_start_count",
+		le128_to_cpu(log->plp_start_count));
+	json_object_add_value_uint128(root, "endurance_estimate",
+		le128_to_cpu(log->endurance_estimate));
+	smart_log_ver = le16_to_cpu(log->log_page_version);
+
+	json_object_add_value_uint(root, "log_page_version", smart_log_ver);
+
+	memset((void *)guid, 0, 40);
+	sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"",
+		le64_to_cpu(*(uint64_t *)&log->log_page_guid[8]),
+		le64_to_cpu(*(uint64_t *)&log->log_page_guid));
+	json_object_add_value_string(root, "log_page_guid", guid);
+
+	switch (smart_log_ver) {
+	case 0 ... 1:
+		break;
+	default:
+	case 4:
+		json_object_add_value_uint(root, "nvme_command_set_errata_version",
+						log->nvme_cmdset_errata_version);
+		json_object_add_value_uint(root, "lowest_permitted_firmware_revision",
+						le64_to_cpu(log->lowest_permitted_fw_rev));
+		json_object_add_value_uint(root, "nvme_over_pcie_errata_version",
+						log->nvme_over_pcie_errate_version);
+		json_object_add_value_uint(root, "nvme_mi_errata_version",
+						log->nvme_mi_errata_version);
+		json_object_add_value_uint(root, "total_media_dies",
+						le16_to_cpu(log->total_media_dies));
+		json_object_add_value_uint(root, "total_die_failure_tolerance",
+						le16_to_cpu(log->total_die_failure_tolerance));
+		json_object_add_value_uint(root, "media_dies_offline",
+						le16_to_cpu(log->media_dies_offline));
+		json_object_add_value_uint(root, "max_temperature_recorded",
+						log->max_temperature_recorded);
+		json_object_add_value_uint64(root, "nand_avg_erase_count",
+						le64_to_cpu(log->nand_avg_erase_count));
+		json_object_add_value_uint(root, "command_timeouts",
+						le32_to_cpu(log->command_timeouts));
+		json_object_add_value_uint(root, "sys_area_program_fail_count_raw",
+						le32_to_cpu(log->sys_area_program_fail_count_raw));
+		json_object_add_value_uint(root, "sys_area_program_fail_count_noralized",
+						log->sys_area_program_fail_count_normalized);
+		json_object_add_value_uint(root, "sys_area_uncorrectable_read_count_raw",
+						le32_to_cpu(log->sys_area_uncorr_read_count_raw));
+		json_object_add_value_uint(root, "sys_area_uncorrectable_read_count_noralized",
+						log->sys_area_uncorr_read_count_normalized);
+		json_object_add_value_uint(root, "sys_area_erase_fail_count_raw",
+						le32_to_cpu(log->sys_area_erase_fail_count_raw));
+		json_object_add_value_uint(root, "sys_area_erase_fail_count_noralized",
+						log->sys_area_erase_fail_count_normalized);
+		json_object_add_value_uint(root, "max_peak_power_capability",
+						le16_to_cpu(log->max_peak_power_capability));
+		json_object_add_value_uint(root, "current_max_avg_power",
+						le16_to_cpu(log->current_max_avg_power));
+		json_object_add_value_uint64(root, "lifetime_power_consumed",
+						int48_to_long(log->lifetime_power_consumed));
+		memset((void *)ascii, 0, 65);
+		for (i = 0; i < 8; i++)
+			ascii += sprintf(ascii, "%c", log->dssd_firmware_revision[i]);
+		json_object_add_value_string(root, "dssd_firmware_revision", ascii_arr);
+		json_object_add_value_string(root, "dssd_firmware_build_uuid",
+						util_uuid_to_string(log->dssd_firmware_build_uuid));
+		ascii = ascii_arr;
+		memset((void *)ascii, 0, 65);
+		for (i = 0; i < 64; i++)
+			ascii += sprintf(ascii, "%c", log->dssd_firmware_build_label[i]);
+		json_object_add_value_string(root, "dssd_firmware_build_label", ascii_arr);
+		fallthrough;
+	case 2 ... 3:
+		json_object_add_value_uint(root, "errata_version_field",
+						log->dssd_errata_version);
+		memcpy(&dssd_version, log->dssd_point_version, sizeof(dssd_version));
+		json_object_add_value_uint(root, "point_version_field",
+						le16_to_cpu(dssd_version));
+		memcpy(&dssd_version, log->dssd_minor_version, sizeof(dssd_version));
+		json_object_add_value_uint(root, "minor_version_field",
+						le16_to_cpu(dssd_version));
+		json_object_add_value_uint(root, "major_version_field",
+						log->dssd_major_version);
+		json_object_add_value_uint(root, "nvme_base_errata_version",
+						log->nvme_base_errata_version);
+		json_object_add_value_uint(root, "pcie_link_retraining_count",
+						le64_to_cpu(log->pcie_link_retaining_count));
+		json_object_add_value_uint(root, "power_state_change_count",
+						le64_to_cpu(log->power_state_change_count));
+	}
+	json_print_object(root, NULL);
+	printf("\n");
+	json_free_object(root);
+}
+
+static void json_smart_extended_log(struct ocp_smart_extended_log *log, unsigned int version)
+{
+	switch (version) {
+	default:
+	case 1:
+		json_smart_extended_log_v1(log);
+		break;
+	case 2:
+		json_smart_extended_log_v2(log);
+	}
+}
 static void json_telemetry_log(struct ocp_telemetry_parse_options *options)
 {
 	print_ocp_telemetry_json(options);
@@ -258,6 +485,7 @@ static void json_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *lo
 	char buf[128];
 	int i, j;
 	char *operation[3] = {"Trim", "Write", "Read"};
+	__u16 log_page_version = le16_to_cpu(log_data->log_page_version);
 
 	root = json_create_object();
 
@@ -374,6 +602,21 @@ static void json_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *lo
 
 	json_object_add_value_uint(root, "Static Latency Stamp Units",
 		le16_to_cpu(log_data->static_latency_stamp_units));
+
+	if (log_page_version >= 0x4) {
+		strcpy(buf, "0x");
+		for (i = ARRAY_SIZE(log_data->latency_monitor_debug_log_size) - 1;
+			i > 0 && (log_data->latency_monitor_debug_log_size[i] == 0); i--)
+			;
+		while (i >= 0) {
+			char hex_string[3];
+
+			sprintf(hex_string, "%02x", log_data->latency_monitor_debug_log_size[i--]);
+			strcat(buf, hex_string);
+		}
+		json_object_add_value_string(root, "Debug Telemetry Log Size", buf);
+	}
+
 	json_object_add_value_uint(root, "Debug Log Trigger Enable",
 		le16_to_cpu(log_data->debug_log_trigger_enable));
 	json_object_add_value_uint(root, "Debug Log Measured Latency",
@@ -390,8 +633,7 @@ static void json_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *lo
 		le16_to_cpu(log_data->debug_log_counter_trigger));
 	json_object_add_value_uint(root, "Debug Log Stamp Units",
 		le16_to_cpu(log_data->debug_log_stamp_units));
-	json_object_add_value_uint(root, "Log Page Version",
-		le16_to_cpu(log_data->log_page_version));
+	json_object_add_value_uint(root, "Log Page Version", log_page_version);
 
 	char guid[(GUID_LEN * 2) + 1];
 	char *ptr = &guid[0];
@@ -552,7 +794,7 @@ static void json_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_dat
 	json_object_add_value_int(root, "Log Page Version",
 				  le16_to_cpu(log_data->log_page_version));
 
-	memset((__u8 *)res, 0, 15);
+	memset((__u8 *)res, 0, 48);
 	for (j = 0; j < 15; j++)
 		res += sprintf(res, "%d", log_data->reserved1[j]);
 	json_object_add_value_string(root, "Reserved", res_arr);
@@ -564,7 +806,8 @@ static void json_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_dat
 
 	json_object_add_value_int(root, "Telemetry String Log Size", le64_to_cpu(log_data->sls));
 
-	memset((__u8 *)res, 0, 24);
+	res = res_arr;
+	memset((__u8 *)res, 0, 48);
 	for (j = 0; j < 24; j++)
 		res += sprintf(res, "%d", log_data->reserved2[j]);
 	json_object_add_value_string(root, "Reserved", res_arr);
@@ -587,81 +830,97 @@ static void json_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_dat
 		fifo += sprintf(fifo, "%c", log_data->fifo1[j]);
 	json_object_add_value_string(root, "FIFO 1 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo2[j]);
 	json_object_add_value_string(root, "FIFO 2 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo3[j]);
 	json_object_add_value_string(root, "FIFO 3 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo4[j]);
 	json_object_add_value_string(root, "FIFO 4 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo5[j]);
 	json_object_add_value_string(root, "FIFO 5 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo6[j]);
 	json_object_add_value_string(root, "FIFO 6 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo7[j]);
 	json_object_add_value_string(root, "FIFO 7 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo8[j]);
 	json_object_add_value_string(root, "FIFO 8 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo9[j]);
 	json_object_add_value_string(root, "FIFO 9 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo10[j]);
 	json_object_add_value_string(root, "FIFO 10 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo11[j]);
 	json_object_add_value_string(root, "FIFO 11 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo12[j]);
 	json_object_add_value_string(root, "FIFO 12 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo13[j]);
 	json_object_add_value_string(root, "FIFO 13 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo14[j]);
 	json_object_add_value_string(root, "FIFO 14 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo15[j]);
 	json_object_add_value_string(root, "FIFO 15 ASCII String", fifo_arr);
 
+	fifo = fifo_arr;
 	memset((void *)fifo, 0, 16);
 	for (j = 0; j < 16; j++)
 		fifo += sprintf(fifo, "%c", log_data->fifo16[j]);
 	json_object_add_value_string(root, "FIFO 16 ASCII String", fifo_arr);
 
+	res = res_arr;
 	memset((__u8 *)res, 0, 48);
 	for (j = 0; j < 48; j++)
 		res += sprintf(res, "%d", log_data->reserved3[j]);
@@ -772,6 +1031,7 @@ static void json_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_
 	char *guid = guid_buf;
 	char res_arr[458];
 	char *res = res_arr;
+	__u16 log_page_version = le16_to_cpu(log_data->log_page_version);
 
 	root = json_create_object();
 
@@ -800,7 +1060,7 @@ static void json_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_
 				  log_data->no_of_read_unlock_locking_obj);
 	json_object_add_value_int(root, "Number of Write Unlocked Locking Objects",
 				  log_data->no_of_write_unlock_locking_obj);
-	json_object_add_value_int(root, "Reserved2", log_data->rsvd2);
+	json_object_add_value_int(root, "Reserved2", log_data->rsvd15);
 
 	json_object_add_value_int(root, "SID Authentication Try Count",
 				  le32_to_cpu(log_data->sid_auth_try_count));
@@ -813,12 +1073,20 @@ static void json_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_
 	json_object_add_value_int(root, "TCG Error Count", le32_to_cpu(log_data->tcg_ec));
 
 	memset((__u8 *)res, 0, 458);
-	for (j = 0; j < 458; j++)
-		res += sprintf(res, "%d", log_data->rsvd3[j]);
+	if (log_page_version == 1) {
+		res += sprintf(res, "%d%d", *(__u8 *)&log_data->no_of_ns_prov_locking_obj_ext,
+			*((__u8 *)&log_data->no_of_ns_prov_locking_obj_ext + 1));
+	} else {
+		json_object_add_value_int(root,
+			"Number of Namespace Provisioned Locking Objects Extended",
+			log_data->no_of_ns_prov_locking_obj_ext);
+	}
+
+	for (j = 0; j < 456; j++)
+		res += sprintf(res, "%d", log_data->rsvd38[j]);
 	json_object_add_value_string(root, "Reserved3", res_arr);
 
-	json_object_add_value_int(root, "Log Page Version",
-				  le16_to_cpu(log_data->log_page_version));
+	json_object_add_value_int(root, "Log Page Version", log_page_version);
 
 	memset((void *)guid, 0, GUID_LEN);
 	for (j = GUID_LEN - 1; j >= 0; j--)
diff --git a/plugins/ocp/ocp-print-stdout.c b/plugins/ocp/ocp-print-stdout.c
index e48c171..5e13587 100644
--- a/plugins/ocp/ocp-print-stdout.c
+++ b/plugins/ocp/ocp-print-stdout.c
@@ -30,18 +30,21 @@ static void stdout_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list)
 {
 	size_t date_lot_code_offset = sizeof(struct hwcomp_desc);
 	int num = 1;
+	long double log_bytes = uint128_t_to_double(le128_to_cpu(log->size));
 	struct hwcomp_desc_entry e = { log->desc };
 
-	long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32);
+	if (log->ver == 1)
+		log_bytes *= sizeof(__le32);
 
-	printf("Log Identifier: 0x%02xh\n", LID_HWCOMP);
+	printf("Log Identifier: 0x%02xh\n", OCP_LID_HWCOMP);
 	printf("Log Page Version: 0x%x\n", le16_to_cpu(log->ver));
 	print_array("Reserved2", log->rsvd2, ARRAY_SIZE(log->rsvd2));
 	print_array("Log page GUID", log->guid, ARRAY_SIZE(log->guid));
-	printf("Hardware Component Log Size: 0x%"PRIx64"\n", (uint64_t)log_size);
+	printf("Hardware Component Log Size: 0x%"PRIx64"\n", (uint64_t)log_bytes);
 	print_array("Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48));
 	printf("Component Descriptions\n");
-	while (log_size > 0) {
+	log_bytes -= offsetof(struct hwcomp_log, desc);
+	while (log_bytes > 0) {
 		e.date_lot_size = le64_to_cpu(e.desc->date_lot_size) * sizeof(__le32);
 		e.date_lot_code = e.date_lot_size ? (__u8 *)e.desc + date_lot_code_offset : NULL;
 		e.add_info_size = le64_to_cpu(e.desc->add_info_size) * sizeof(__le32);
@@ -51,7 +54,7 @@ static void stdout_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list)
 			print_hwcomp_desc(&e, list, num++);
 		e.desc_size = date_lot_code_offset + e.date_lot_size + e.add_info_size;
 		e.desc = (struct hwcomp_desc *)((__u8 *)e.desc + e.desc_size);
-		log_size -= e.desc_size;
+		log_bytes -= e.desc_size;
 	}
 }
 
@@ -72,8 +75,7 @@ static void stdout_fw_activation_history(const struct fw_activation_history *fw_
 		printf("      %-22s%d\n", "entry length:", entry->entry_length);
 		printf("      %-22s%d\n", "activation count:",
 		       le16_to_cpu(entry->activation_count));
-		printf("      %-22s%"PRIu64"\n", "timestamp:",
-				(0x0000FFFFFFFFFFFF & le64_to_cpu(entry->timestamp)));
+		printf("      %-22s%"PRIu64"\n", "timestamp:", int48_to_long(entry->ts.timestamp));
 		printf("      %-22s%"PRIu64"\n", "power cycle count:",
 		       le64_to_cpu(entry->power_cycle_count));
 		printf("      %-22s%.*s\n", "previous firmware:", (int)sizeof(entry->previous_fw),
@@ -95,101 +97,144 @@ static void stdout_fw_activation_history(const struct fw_activation_history *fw_
 	printf("\n");
 }
 
-static void stdout_smart_extended_log(void *data)
+static void stdout_smart_extended_log(struct ocp_smart_extended_log *log, unsigned int version)
 {
 	uint16_t smart_log_ver = 0;
-	__u8 *log_data = data;
+	uint16_t dssd_version = 0;
+	int i = 0;
 
 	printf("SMART Cloud Attributes :-\n");
 
 	printf("  Physical media units written -		%"PRIu64" %"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW + 8] & 0xFFFFFFFFFFFFFFFF),
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF));
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_written[8]),
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_written));
 	printf("  Physical media units read    -		%"PRIu64" %"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR + 8] & 0xFFFFFFFFFFFFFFFF),
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF));
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_read[8]),
+		le64_to_cpu(*(uint64_t *)&log->physical_media_units_read));
 	printf("  Bad user nand blocks - Raw			%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF));
+		int48_to_long(log->bad_user_nand_blocks_raw));
 	printf("  Bad user nand blocks - Normalized		%d\n",
-	       (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
+		le16_to_cpu(log->bad_user_nand_blocks_normalized));
 	printf("  Bad system nand blocks - Raw			%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
+		int48_to_long(log->bad_system_nand_blocks_raw));
 	printf("  Bad system nand blocks - Normalized		%d\n",
-	       (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
+		le16_to_cpu(log->bad_system_nand_blocks_normalized));
 	printf("  XOR recovery count				%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
+		le64_to_cpu(log->xor_recovery_count));
 	printf("  Uncorrectable read error count		%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
+		le64_to_cpu(log->uncorrectable_read_err_count));
 	printf("  Soft ecc error count				%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
+		le64_to_cpu(log->soft_ecc_err_count));
 	printf("  End to end detected errors			%"PRIu32"\n",
-	       (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
+		le32_to_cpu(log->end_to_end_detected_err));
 	printf("  End to end corrected errors			%"PRIu32"\n",
-	       (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
+		le32_to_cpu(log->end_to_end_corrected_err));
 	printf("  System data percent used			%d\n",
-	       (__u8)log_data[SCAO_SDPU]);
+		log->system_data_used_percent);
 	printf("  Refresh counts				%"PRIu64"\n",
-	       (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
+		int56_to_long(log->refresh_counts));
 	printf("  Max User data erase counts			%"PRIu32"\n",
-	       (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
+		le32_to_cpu(log->user_data_erase_count_max));
 	printf("  Min User data erase counts			%"PRIu32"\n",
-	       (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
+		le32_to_cpu(log->user_data_erase_count_min));
 	printf("  Number of Thermal throttling events		%d\n",
-	       (__u8)log_data[SCAO_NTTE]);
+		log->thermal_throttling_event_count);
 	printf("  Current throttling status			0x%x\n",
-	       (__u8)log_data[SCAO_CTS]);
+		log->thermal_throttling_current_status);
 	printf("  PCIe correctable error count			%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
+		le64_to_cpu(log->pcie_correctable_err_count));
 	printf("  Incomplete shutdowns				%"PRIu32"\n",
-	       (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
+		le32_to_cpu(log->incomplete_shoutdowns));
 	printf("  Percent free blocks				%d\n",
-	       (__u8)log_data[SCAO_PFB]);
+		log->percent_free_blocks);
 	printf("  Capacitor health				%"PRIu16"\n",
-	       (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
-	printf("  NVMe base errata version			%c\n",
-	       (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
-	printf("  NVMe command set errata version		%c\n",
-	       (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
+		le16_to_cpu(log->capacitor_health));
 	printf("  Unaligned I/O					%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
+		le64_to_cpu(log->unaligned_io));
 	printf("  Security Version Number			%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
+		le64_to_cpu(log->security_version));
 	printf("  NUSE - Namespace utilization			%"PRIu64"\n",
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
+		le64_to_cpu(log->total_nuse));
 	printf("  PLP start count				%s\n",
-	       uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC])));
+		uint128_t_to_string(le128_to_cpu(log->plp_start_count)));
 	printf("  Endurance estimate				%s\n",
-	       uint128_t_to_string(le128_to_cpu(&log_data[SCAO_EEST])));
-	smart_log_ver = (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_LPV]);
+		uint128_t_to_string(le128_to_cpu(log->endurance_estimate)));
+	smart_log_ver = le16_to_cpu(log->log_page_version);
 	printf("  Log page version				%"PRIu16"\n", smart_log_ver);
 	printf("  Log page GUID					0x");
-	printf("%"PRIx64"%"PRIx64"\n", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG + 8]),
-	       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_LPG]));
+	printf("%"PRIx64"%"PRIx64"\n", le64_to_cpu(*(uint64_t *)&log->log_page_guid[8]),
+		le64_to_cpu(*(uint64_t *)&log->log_page_guid));
 	switch (smart_log_ver) {
 	case 0 ... 1:
 		break;
 	default:
 	case 4:
 		printf("  NVMe Command Set Errata Version               %d\n",
-		       (__u8)log_data[SCAO_NCSEV]);
+			log->nvme_cmdset_errata_version);
 		printf("  Lowest Permitted Firmware Revision            %"PRIu64"\n",
-		       le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+			le64_to_cpu(log->lowest_permitted_fw_rev));
+		printf("  NVMe Over Pcie Errata Version			%d\n",
+			log->nvme_over_pcie_errate_version);
+		printf("  NVMe Mi Errata Version			%d\n",
+			log->nvme_mi_errata_version);
+		printf("  Total media dies				%"PRIu16"\n",
+			le16_to_cpu(log->total_media_dies));
+		printf("  Total die failure tolerance			%"PRIu16"\n",
+			le16_to_cpu(log->total_die_failure_tolerance));
+		printf("  Media dies offline				%"PRIu16"\n",
+			le16_to_cpu(log->media_dies_offline));
+		printf("  Max temperature recorded			%d\n",
+			log->max_temperature_recorded);
+		printf("  Nand avg erase count				%"PRIu64"\n",
+			le64_to_cpu(log->nand_avg_erase_count));
+		printf("  Command timeouts				%"PRIu32"\n",
+			le32_to_cpu(log->command_timeouts));
+		printf("  Sys area program fail count raw		%"PRIu32"\n",
+			le32_to_cpu(log->sys_area_program_fail_count_raw));
+		printf("  Sys area program fail count noralized		%d\n",
+			le32_to_cpu(log->sys_area_program_fail_count_normalized));
+		printf("  Sys area uncorrectable read count raw		%"PRIu32"\n",
+			le32_to_cpu(log->sys_area_uncorr_read_count_raw));
+		printf("  Sys area uncorrectable read count noralized	%d\n",
+			le32_to_cpu(log->sys_area_uncorr_read_count_normalized));
+		printf("  Sys area erase fail count raw			%"PRIu32"\n",
+			le32_to_cpu(log->sys_area_erase_fail_count_raw));
+		printf("  Sys area erase fail count noralized		%d\n",
+			le32_to_cpu(log->sys_area_erase_fail_count_normalized));
+		printf("  Max peak power capability			%"PRIu16"\n",
+			le16_to_cpu(log->max_peak_power_capability));
+		printf("  Current max avg power				%"PRIu16"\n",
+			le16_to_cpu(log->current_max_avg_power));
+		printf("  Lifetime power consumed			%"PRIu64"\n",
+			int48_to_long(log->lifetime_power_consumed));
+		printf("  Dssd firmware revision			");
+		for (i = 0; i < sizeof(log->dssd_firmware_revision); i++)
+			printf("%c", log->dssd_firmware_revision[i]);
+		printf("\n");
+		printf("  Dssd firmware build UUID			%s\n",
+			util_uuid_to_string(log->dssd_firmware_build_uuid));
+		printf("  Dssd firmware build label			");
+		for (i = 0; i < sizeof(log->dssd_firmware_build_label); i++)
+			printf("%c", log->dssd_firmware_build_label[i]);
+		printf("\n");
 		fallthrough;
 	case 2 ... 3:
 		printf("  Errata Version Field                          %d\n",
-		       (__u8)log_data[SCAO_EVF]);
+			log->dssd_errata_version);
+		memcpy(&dssd_version, log->dssd_point_version, sizeof(dssd_version));
 		printf("  Point Version Field                           %"PRIu16"\n",
-		       le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
+			le16_to_cpu(dssd_version));
+		memcpy(&dssd_version, log->dssd_minor_version, sizeof(dssd_version));
 		printf("  Minor Version Field                           %"PRIu16"\n",
-		       le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
+			le16_to_cpu(dssd_version));
 		printf("  Major Version Field                           %d\n",
-		       (__u8)log_data[SCAO_MAVF]);
+			log->dssd_major_version);
 		printf("  NVMe Base Errata Version                      %d\n",
-		       (__u8)log_data[SCAO_NBEV]);
+			log->nvme_base_errata_version);
 		printf("  PCIe Link Retraining Count                    %"PRIu64"\n",
-		       (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
+			le64_to_cpu(log->pcie_link_retaining_count));
 		printf("  Power State Change Count                      %"PRIu64"\n",
-		       le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+			le64_to_cpu(log->power_state_change_count));
 	}
 	printf("\n");
 }
@@ -205,6 +250,7 @@ static void stdout_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *
 {
 	char ts_buf[128];
 	int i, j;
+	__u16 log_page_version = le16_to_cpu(log_data->log_page_version);
 
 	printf("-Latency Monitor/C3 Log Page Data-\n");
 	printf("  Controller   :  %s\n", dev->name);
@@ -237,6 +283,17 @@ static void stdout_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *
 	       le16_to_cpu(log_data->active_latency_stamp_units));
 	printf("  Static Latency Stamp Units         %d\n",
 	       le16_to_cpu(log_data->static_latency_stamp_units));
+
+	if (log_page_version >= 0x4) {
+		printf("    Debug Telemetry Log Size         0x");
+		for (i = ARRAY_SIZE(log_data->latency_monitor_debug_log_size) - 1;
+			i > 0 && (log_data->latency_monitor_debug_log_size[i] == 0); i--)
+			;
+		while (i >= 0)
+			printf("%02x", log_data->latency_monitor_debug_log_size[i--]);
+		printf("\n");
+	}
+
 	printf("  Debug Log Trigger Enable           %d\n",
 	       le16_to_cpu(log_data->debug_log_trigger_enable));
 	printf("  Debug Log Measured Latency         %d\n",
@@ -253,8 +310,7 @@ static void stdout_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *
 	       le16_to_cpu(log_data->debug_log_counter_trigger));
 	printf("  Debug Log Stamp Units              %d\n",
 	       le16_to_cpu(log_data->debug_log_stamp_units));
-	printf("  Log Page Version                   %d\n",
-	       le16_to_cpu(log_data->log_page_version));
+	printf("  Log Page Version                   %d\n", log_page_version);
 
 	char guid[(GUID_LEN * 2) + 1];
 	char *ptr = &guid[0];
@@ -632,59 +688,67 @@ static void stdout_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_d
 static void stdout_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_data)
 {
 	int j;
+	__u16 log_page_version = le16_to_cpu(log_data->log_page_version);
 
 	printf("TCG Configuration C7 Log Page Data-\n");
 
-	printf("  State                                                  : 0x%x\n",
-	       log_data->state);
-	printf("  Reserved1                                              : 0x");
+	printf("  State                                                    : 0x%x\n",
+		log_data->state);
+	printf("  Reserved1                                              : ");
 	for (j = 0; j < 3; j++)
 		printf("%d", log_data->rsvd1[j]);
 	printf("\n");
-	printf("  Locking SP Activation Count                            : 0x%x\n",
+	printf("  Locking SP Activation Count                              : 0x%x\n",
 	       log_data->locking_sp_act_count);
-	printf("  Tper Revert Count                                      : 0x%x\n",
+	printf("  Tper Revert Count                                        : 0x%x\n",
 	       log_data->type_rev_count);
-	printf("  Locking SP Revert Count                                : 0x%x\n",
+	printf("  Locking SP Revert Count                                  : 0x%x\n",
 	       log_data->locking_sp_rev_count);
-	printf("  Number of Locking Objects                              : 0x%x\n",
+	printf("  Number of Locking Objects                                : 0x%x\n",
 	       log_data->no_of_locking_obj);
-	printf("  Number of Single User Mode Locking Objects             : 0x%x\n",
+	printf("  Number of Single User Mode Locking Objects               : 0x%x\n",
 	       log_data->no_of_single_um_locking_obj);
-	printf("  Number of Range Provisioned Locking Objects            : 0x%x\n",
+	printf("  Number of Range Provisioned Locking Objects              : 0x%x\n",
 	       log_data->no_of_range_prov_locking_obj);
-	printf("  Number of Namespace Provisioned Locking Objects        : 0x%x\n",
+	printf("  Number of Namespace Provisioned Locking Objects          : 0x%x\n",
 	       log_data->no_of_ns_prov_locking_obj);
-	printf("  Number of Read Locked Locking Objects                  : 0x%x\n",
+	printf("  Number of Read Locked Locking Objects                    : 0x%x\n",
 	       log_data->no_of_read_lock_locking_obj);
-	printf("  Number of Write Locked Locking Objects                 : 0x%x\n",
+	printf("  Number of Write Locked Locking Objects                   : 0x%x\n",
 	       log_data->no_of_write_lock_locking_obj);
-	printf("  Number of Read Unlocked Locking Objects                : 0x%x\n",
+	printf("  Number of Read Unlocked Locking Objects                  : 0x%x\n",
 	       log_data->no_of_read_unlock_locking_obj);
-	printf("  Number of Write Unlocked Locking Objects               : 0x%x\n",
+	printf("  Number of Write Unlocked Locking Objects                 : 0x%x\n",
 	       log_data->no_of_write_unlock_locking_obj);
-	printf("  Reserved2                                              : 0x%x\n",
-	       log_data->rsvd2);
-
-	printf("  SID Authentication Try Count                           : 0x%x\n",
+	printf("  Reserved2                                              : %x\n",
+		log_data->rsvd15);
+	printf("  SID Authentication Try Count                             : 0x%x\n",
 	       le32_to_cpu(log_data->sid_auth_try_count));
-	printf("  SID Authentication Try Limit                           : 0x%x\n",
+	printf("  SID Authentication Try Limit                             : 0x%x\n",
 	       le32_to_cpu(log_data->sid_auth_try_limit));
-	printf("  Programmatic TCG Reset Count                           : 0x%x\n",
+	printf("  Programmatic TCG Reset Count                             : 0x%x\n",
 	       le32_to_cpu(log_data->pro_tcg_rc));
-	printf("  Programmatic Reset Lock Count                          : 0x%x\n",
+	printf("  Programmatic Reset Lock Count                            : 0x%x\n",
 	       le32_to_cpu(log_data->pro_rlc));
-	printf("  TCG Error Count                                        : 0x%x\n",
+	printf("  TCG Error Count                                          : 0x%x\n",
 	       le32_to_cpu(log_data->tcg_ec));
 
-	printf("  Reserved3                                              : 0x");
-	for (j = 0; j < 458; j++)
-		printf("%d", log_data->rsvd3[j]);
+	if (log_page_version == 1) {
+		printf("  Reserved3                                                : %d%d",
+			*(__u8 *)&log_data->no_of_ns_prov_locking_obj_ext,
+			*((__u8 *)&log_data->no_of_ns_prov_locking_obj_ext + 1));
+	} else {
+		printf("  Number of Namespace Provisioned Locking Objects Extended : 0x%x\n",
+			le16_to_cpu(log_data->no_of_ns_prov_locking_obj_ext));
+		printf("  Reserved3                                                : ");
+	}
+	for (j = 0; j < 456; j++)
+		printf("%d", log_data->rsvd38[j]);
 	printf("\n");
 
-	printf("  Log Page Version                                       : 0x%x\n",
-	       le16_to_cpu(log_data->log_page_version));
-	printf("  Log page GUID                                          : 0x");
+	printf("  Log Page Version                                         : 0x%x\n",
+	       log_page_version);
+	printf("  Log page GUID                                            : 0x");
 	for (j = GUID_LEN - 1; j >= 0; j--)
 		printf("%02x", log_data->log_page_guid[j]);
 	printf("\n");
diff --git a/plugins/ocp/ocp-print.c b/plugins/ocp/ocp-print.c
index 916c653..31037db 100644
--- a/plugins/ocp/ocp-print.c
+++ b/plugins/ocp/ocp-print.c
@@ -36,9 +36,10 @@ void ocp_fw_act_history(const struct fw_activation_history *fw_history, nvme_pri
 	ocp_print(fw_act_history, flags, fw_history);
 }
 
-void ocp_smart_extended_log(void *data, nvme_print_flags_t flags)
+void ocp_smart_extended_log(struct ocp_smart_extended_log *log, unsigned int version,
+		nvme_print_flags_t flags)
 {
-	ocp_print(smart_extended_log, flags, data);
+	ocp_print(smart_extended_log, flags, log, version);
 }
 
 void ocp_show_telemetry_log(struct ocp_telemetry_parse_options *options, nvme_print_flags_t flags)
diff --git a/plugins/ocp/ocp-print.h b/plugins/ocp/ocp-print.h
index 85655b9..e9ede1c 100644
--- a/plugins/ocp/ocp-print.h
+++ b/plugins/ocp/ocp-print.h
@@ -4,13 +4,14 @@
 
 #include "ocp-hardware-component-log.h"
 #include "ocp-fw-activation-history.h"
+#include "ocp-smart-extended-log.h"
 #include "ocp-telemetry-decode.h"
 #include "ocp-nvme.h"
 
 struct ocp_print_ops {
 	void (*hwcomp_log)(struct hwcomp_log *log, __u32 id, bool list);
 	void (*fw_act_history)(const struct fw_activation_history *fw_history);
-	void (*smart_extended_log)(void *data);
+	void (*smart_extended_log)(struct ocp_smart_extended_log *log, unsigned int version);
 	void (*telemetry_log)(struct ocp_telemetry_parse_options *options);
 	void (*c3_log)(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data);
 	void (*c5_log)(struct nvme_dev *dev, struct unsupported_requirement_log *log_data);
@@ -36,7 +37,8 @@ static inline struct ocp_print_ops *ocp_get_json_print_ops(nvme_print_flags_t fl
 
 void ocp_show_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list, nvme_print_flags_t flags);
 void ocp_fw_act_history(const struct fw_activation_history *fw_history, nvme_print_flags_t flags);
-void ocp_smart_extended_log(void *data, nvme_print_flags_t flags);
+void ocp_smart_extended_log(struct ocp_smart_extended_log *log, unsigned int version,
+		nvme_print_flags_t flags);
 void ocp_show_telemetry_log(struct ocp_telemetry_parse_options *options, nvme_print_flags_t flags);
 void ocp_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data,
 		nvme_print_flags_t flags);
diff --git a/plugins/ocp/ocp-smart-extended-log.c b/plugins/ocp/ocp-smart-extended-log.c
index 5f84191..5e081c9 100644
--- a/plugins/ocp/ocp-smart-extended-log.c
+++ b/plugins/ocp/ocp-smart-extended-log.c
@@ -14,10 +14,10 @@
 #include "common.h"
 #include "nvme-print.h"
 #include "ocp-print.h"
+#include "ocp-utils.h"
 
 /* C0 SCAO Log Page */
 #define C0_SMART_CLOUD_ATTR_LEN			0x200
-#define C0_SMART_CLOUD_ATTR_OPCODE		0xC0
 
 static __u8 scao_guid[GUID_LEN] = {
 	0xC5, 0xAF, 0x10, 0x28,
@@ -26,12 +26,21 @@ static __u8 scao_guid[GUID_LEN] = {
 	0xC9, 0x14, 0xD5, 0xAF
 };
 
-static int get_c0_log_page(int fd, char *format)
+static int get_c0_log_page(struct nvme_dev *dev, char *format,
+			   unsigned int format_version)
 {
 	nvme_print_flags_t fmt;
-	__u8 *data;
+	struct ocp_smart_extended_log *data;
 	int i;
 	int ret;
+	int fd = dev_fd(dev);
+	struct nvme_get_log_args args = {
+		.args_size = sizeof(args),
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.lid = (enum nvme_cmd_get_log_lid)OCP_LID_SMART,
+		.nsid = NVME_NSID_ALL,
+		.len = C0_SMART_CLOUD_ATTR_LEN,
+	};
 
 	ret = validate_output_format(format, &fmt);
 	if (ret < 0) {
@@ -46,8 +55,9 @@ static int get_c0_log_page(int fd, char *format)
 	}
 	memset(data, 0, sizeof(__u8) * C0_SMART_CLOUD_ATTR_LEN);
 
-	ret = nvme_get_log_simple(fd, C0_SMART_CLOUD_ATTR_OPCODE,
-		C0_SMART_CLOUD_ATTR_LEN, data);
+	args.log = data;
+	ocp_get_uuid_index(dev, &args.uuidx);
+	ret = nvme_get_log_page(fd, NVME_LOG_PAGE_PDU_SIZE, &args);
 
 	if (strcmp(format, "json"))
 		fprintf(stderr, "NVMe Status:%s(%x)\n",
@@ -57,7 +67,7 @@ static int get_c0_log_page(int fd, char *format)
 		/* check log page guid */
 		/* Verify GUID matches */
 		for (i = 0; i < 16; i++) {
-			if (scao_guid[i] != data[SCAO_LPG + i])	{
+			if (scao_guid[i] != data->log_page_guid[i]) {
 				int j;
 
 				fprintf(stderr, "ERROR : OCP : Unknown GUID in C0 Log Page data\n");
@@ -67,7 +77,7 @@ static int get_c0_log_page(int fd, char *format)
 
 				fprintf(stderr, "\nERROR : OCP : Actual GUID:    0x");
 				for (j = 0; j < 16; j++)
-					fprintf(stderr, "%x", data[SCAO_LPG + j]);
+					fprintf(stderr, "%x", data->log_page_guid[j]);
 				fprintf(stderr, "\n");
 
 				ret = -1;
@@ -76,7 +86,7 @@ static int get_c0_log_page(int fd, char *format)
 		}
 
 		/* print the data */
-		ocp_smart_extended_log(data, fmt);
+		ocp_smart_extended_log(data, format_version, fmt);
 	} else {
 		fprintf(stderr, "ERROR : OCP : Unable to read C0 data from buffer\n");
 	}
@@ -95,14 +105,17 @@ int ocp_smart_add_log(int argc, char **argv, struct command *cmd,
 
 	struct config {
 		char *output_format;
+		unsigned int output_format_version;
 	};
 
 	struct config cfg = {
 		.output_format = "normal",
+		.output_format_version = 1,
 	};
 
 	OPT_ARGS(opts) = {
 		OPT_FMT("output-format", 'o', &cfg.output_format, "output Format: normal|json"),
+		OPT_UINT("output-format-version", 0, &cfg.output_format_version, "output Format version: 1|2"),
 		OPT_END()
 	};
 
@@ -110,7 +123,8 @@ int ocp_smart_add_log(int argc, char **argv, struct command *cmd,
 	if (ret)
 		return ret;
 
-	ret = get_c0_log_page(dev_fd(dev), cfg.output_format);
+	ret = get_c0_log_page(dev, cfg.output_format,
+			      cfg.output_format_version);
 	if (ret)
 		fprintf(stderr, "ERROR : OCP : Failure reading the C0 Log Page, ret = %d\n",
 			ret);
diff --git a/plugins/ocp/ocp-smart-extended-log.h b/plugins/ocp/ocp-smart-extended-log.h
index 3e64b1b..df33809 100644
--- a/plugins/ocp/ocp-smart-extended-log.h
+++ b/plugins/ocp/ocp-smart-extended-log.h
@@ -6,50 +6,149 @@
  *          Venkat Ramesh <venkatraghavan@fb.com>
  */
 
+#include "common.h"
+#include "linux/types.h"
+
 #ifndef OCP_SMART_EXTENDED_LOG_H
 #define OCP_SMART_EXTENDED_LOG_H
 
 struct command;
 struct plugin;
 
-enum {
-	SCAO_PMUW	= 0,	/* Physical media units written */
-	SCAO_PMUR	= 16,	/* Physical media units read */
-	SCAO_BUNBR	= 32,	/* Bad user nand blocks raw */
-	SCAO_BUNBN	= 38,	/* Bad user nand blocks normalized */
-	SCAO_BSNBR	= 40,	/* Bad system nand blocks raw */
-	SCAO_BSNBN	= 46,	/* Bad system nand blocks normalized */
-	SCAO_XRC	= 48,	/* XOR recovery count */
-	SCAO_UREC	= 56,	/* Uncorrectable read error count */
-	SCAO_SEEC	= 64,	/* Soft ecc error count */
-	SCAO_EEDC	= 72,	/* End to end detected errors */
-	SCAO_EECE	= 76,	/* End to end corrected errors */
-	SCAO_SDPU	= 80,	/* System data percent used */
-	SCAO_RFSC	= 81,	/* Refresh counts */
-	SCAO_MXUDEC	= 88,	/* Max User data erase counts */
-	SCAO_MNUDEC	= 92,	/* Min User data erase counts */
-	SCAO_NTTE	= 96,	/* Number of Thermal throttling events */
-	SCAO_CTS	= 97,	/* Current throttling status */
-	SCAO_EVF	= 98,	/* Errata Version Field */
-	SCAO_PVF	= 99,	/* Point Version Field */
-	SCAO_MIVF	= 101,	/* Minor Version Field */
-	SCAO_MAVF	= 103,	/* Major Version Field */
-	SCAO_PCEC	= 104,	/* PCIe correctable error count */
-	SCAO_ICS	= 112,	/* Incomplete shutdowns */
-	SCAO_PFB	= 120,	/* Percent free blocks */
-	SCAO_CPH	= 128,	/* Capacitor health */
-	SCAO_NBEV	= 130,  /* NVMe Base Errata Version */
-	SCAO_NCSEV	= 131,  /* NVMe Command Set Errata Version */
-	SCAO_UIO	= 136,	/* Unaligned I/O */
-	SCAO_SVN	= 144,	/* Security Version Number */
-	SCAO_NUSE	= 152,	/* NUSE - Namespace utilization */
-	SCAO_PSC	= 160,	/* PLP start count */
-	SCAO_EEST	= 176,	/* Endurance estimate */
-	SCAO_PLRC	= 192,	/* PCIe Link Retraining Count */
-	SCAO_PSCC	= 200,	/* Power State Change Count */
-	SCAO_LPFR	= 208,	/* Lowest Permitted Firmware Revision */
-	SCAO_LPV	= 494,	/* Log page version */
-	SCAO_LPG	= 496,	/* Log page GUID */
+/**
+ * struct ocp_smart_extended_log -		SMART / Health Information Extended
+ * @physical_media_units_written:		Physical Media Units Written
+ * @physical_media_units_read:			Physical Media Units Read
+ * @bad_user_nand_blocks_raw:			Bad User NAND Blocks raw
+ * @bad_user_nand_blocks_normalized:		Bad User NAND Blocks normalized
+ * @bad_system_nand_blocks_raw:			Bad System NAND Blocks raw
+ * @bad_system_nand_blocks_normalized:		Bad System NAND Blocks normalized
+ * @xor_recovery_count:				XOR Recovery Count
+ * @uncorrectable_read_err_count:		Uncorrectable Read Error Count
+ * @soft_ecc_err_count:				Soft ECC Error Count
+ * @end_to_end_detected_err:			End to End detected errors
+ * @end_to_end_corrected_err:			End to End corrected errors
+ * @system_data_used_percent:			System data percent used
+ * @refresh_counts:				Refresh Counts
+ * @user_data_erase_count_max:			Max User data erase counts
+ * @user_data_erase_count_min:			Min User data erase counts
+ * @thermal_throttling_event_count:		Number of Thermal throttling events
+ * @dssd_errata_version:			DSSD Errata Version
+ * @dssd_point_version:				DSSD Point Version
+ * @dssd_minor_version:				DSSD Minor Version
+ * @dssd_major_version:				DSSD Major Version
+ * @pcie_correctable_err_count:			PCIe Correctable Error Count
+ * @incomplete_shoutdowns:			Incomplete Shutdowns
+ * @rsvd116:					Reserved
+ * @percent_free_blocks:			Percent free blocks
+ * @rsvd121:					Reserved
+ * @capacitor_health:				Capacitor health
+ * @nvme_base_errata_version:			NVM Express Base Errata Version
+ * @nvme_cmdset_errata_version:			NVMe Command Set Errata Version
+ * @rsvd132:					Reserved
+ * @nvme_over_pcie_errate_version:		NVMe Over Pcie Errata Version
+ * @nvme_mi_errata_version:			NVMe MI Errata Version
+ * @unaligned_io:				Unaligned I/O
+ * @security_version:				Security Version Number
+ * @total_nuse:					Total NUSE - Namespace utilization
+ * @plp_start_count:				PLP start count
+ * @endurance_estimate:				Endurance Estimate
+ * @pcie_link_retaining_count:			PCIe Link Retraining Count
+ * @power_state_change_count:			Power State Change Count
+ * @lowest_permitted_fw_rev:			Lowest Permitted Firmware Revision -------------
+ * @rsvd216:					Reserved
+ * @total_media_dies:				Total media dies
+ * @total_die_failure_tolerance:		Total die failure tolerance
+ * @media_dies_offline:				Media dies offline
+ * @max_temperature_recorded:			Max temperature recorded
+ * @rsvd223:					Reserved
+ * @nand_avg_erase_count:			Nand avg erase count
+ * @command_timeouts:				Command timeouts
+ * @sys_area_program_fail_count_raw:		Sys area program fail count raw
+ * @sys_area_program_fail_count_normalized:	Sys area program fail count noralized
+ * @revd241:					Reserved
+ * @sys_area_uncorr_read_count_raw:		Sys area uncorrectable read count raw
+ * @sys_area_uncorr_read_count_normalized:	Sys area uncorrectable read count noralized
+ * @revd249:					Reserved
+ * @sys_area_erase_fail_count_raw:		Sys area erase fail count raw
+ * @sys_area_erase_fail_count_normalized:	Sys area erase fail count noralized
+ * @revd257:					Reserved
+ * @max_peak_power_capability:			Max peak power capability
+ * @current_max_avg_power:			Current max avg power
+ * @lifetime_power_consumed:			Lifetime power consumed
+ * @dssd_firmware_revision:			Dssd firmware revision
+ * @dssd_firmware_build_uuid:			Dssd firmware build UUID
+ * @dssd_firmware_build_label:			Dssd firmware build label
+ * @revd358:					Reserved
+ * @log_page_version:				Log page version
+ * @log_page_guid:				Log page GUID
+ */
+struct ocp_smart_extended_log {
+	__u8   physical_media_units_written[16];	/* [15:0] */
+	__u8   physical_media_units_read[16];		/* [31:16] */
+	__u8   bad_user_nand_blocks_raw[6];		/* [37:32] */
+	__le16 bad_user_nand_blocks_normalized;		/* [39:38] */
+	__u8   bad_system_nand_blocks_raw[6];		/* [45:40] */
+	__le16 bad_system_nand_blocks_normalized;	/* [47:46] */
+	__le64 xor_recovery_count;			/* [55:48] */
+	__le64 uncorrectable_read_err_count;		/* [63:56] */
+	__le64 soft_ecc_err_count;			/* [71:64] */
+	__le32 end_to_end_detected_err;			/* [75:72] */
+	__le32 end_to_end_corrected_err;		/* [79:76] */
+	__u8   system_data_used_percent;		/* [80] */
+	__u8   refresh_counts[7];			/* [87:81] */
+	__le32 user_data_erase_count_max;		/* [91:88] */
+	__le32 user_data_erase_count_min;		/* [95:92] */
+	__u8   thermal_throttling_event_count;		/* [96] */
+	__u8   thermal_throttling_current_status;	/* [97] */
+	__u8   dssd_errata_version;			/* [98] */
+	__u8   dssd_point_version[2];			/* [100:99] */
+	__u8   dssd_minor_version[2];			/* [102:101] */
+	__u8   dssd_major_version;			/* [103] */
+	__le64 pcie_correctable_err_count;		/* [111:104] */
+	__le32 incomplete_shoutdowns;			/* [115:112] */
+	__u8   rsvd116[4];				/* [119:116] */
+	__u8   percent_free_blocks;			/* [120] */
+	__u8   rsvd121[7];				/* [127:121] */
+	__le16 capacitor_health;			/* [129:128] */
+	__u8   nvme_base_errata_version;		/* [130] */
+	__u8   nvme_cmdset_errata_version;		/* [131] */
+	__u8   nvme_over_pcie_errate_version;		/* [132] */
+	__u8   nvme_mi_errata_version;			/* [133] */
+	__u8   rsvd134[2];				/* [135:134] */
+	__le64 unaligned_io;				/* [143:136] */
+	__le64 security_version;			/* [151:144] */
+	__le64 total_nuse;				/* [159:152] */
+	__u8   plp_start_count[16];			/* [175:160] */
+	__u8   endurance_estimate[16];			/* [191:176] */
+	__le64 pcie_link_retaining_count;		/* [199:192] */
+	__le64 power_state_change_count;		/* [207:200] */
+	__le64 lowest_permitted_fw_rev;			/* [215:208] */
+	__le16 total_media_dies;			/* [217:216] */
+	__le16 total_die_failure_tolerance;		/* [219:218] */
+	__le16 media_dies_offline;			/* [221:220] */
+	__u8   max_temperature_recorded;		/* [222] */
+	__u8   rsvd223;					/* [223] */
+	__le64 nand_avg_erase_count;			/* [231:224] */
+	__le32 command_timeouts;			/* [235:232] */
+	__le32 sys_area_program_fail_count_raw;		/* [239:236] */
+	__u8   sys_area_program_fail_count_normalized;	/* [240] */
+	__u8   rsvd241[3];				/* [243:241] */
+	__le32 sys_area_uncorr_read_count_raw;		/* [247:244] */
+	__u8   sys_area_uncorr_read_count_normalized;	/* [248] */
+	__u8   rsvd249[3];				/* [251:249] */
+	__le32 sys_area_erase_fail_count_raw;		/* [255:252] */
+	__u8   sys_area_erase_fail_count_normalized;	/* [256] */
+	__u8   rsvd257[3];				/* [259:257] */
+	__le16 max_peak_power_capability;		/* [261:260] */
+	__le16 current_max_avg_power;			/* [263:262] */
+	__u8   lifetime_power_consumed[6];		/* [269:264] */
+	__u8   dssd_firmware_revision[8];		/* [277:270] */
+	__u8   dssd_firmware_build_uuid[16];		/* [293:278] */
+	__u8   dssd_firmware_build_label[64];		/* [375:294] */
+	__u8   rsvd358[136];				/* [493:358] */
+	__le16 log_page_version;			/* [495:494] */
+	__u8   log_page_guid[16];			/* [511:496] */
 };
 
 int ocp_smart_add_log(int argc, char **argv, struct command *cmd,
diff --git a/plugins/ocp/ocp-telemetry-decode.c b/plugins/ocp/ocp-telemetry-decode.c
index 1a6ebe3..57375f5 100644
--- a/plugins/ocp/ocp-telemetry-decode.c
+++ b/plugins/ocp/ocp-telemetry-decode.c
@@ -39,6 +39,7 @@ void print_stats_desc(struct telemetry_stats_desc *stat_desc)
 	printf("Statistics info               : 0x%x\n", stat_desc->info);
 	printf("NS info                       : 0x%x\n", stat_desc->ns_info);
 	printf("Statistic Data Size           : 0x%x\n", le16_to_cpu(stat_data_sz));
+	printf("Namespace ID[15:0]            : 0x%x\n", stat_desc->nsid);
 
 	if (stat_data_sz > 0) {
 		printf("%s  : 0x",
@@ -109,13 +110,18 @@ void print_telemetry_fifo_event(__u8 class_type,
 		if ((id == ADMIN_QUEUE_NONZERO_STATUS) ||
 			(id == IO_QUEUE_NONZERO_STATUS)) {
 			printf("  Cmd Op Code   : 0x%02x\n", data[0]);
-			__u16 status = *(__u16 *)&data[1];
-			__u16 cmd_id = *(__u16 *)&data[3];
-			__u16 sq_id = *(__u16 *)&data[5];
+			__u16 status;
+			__u16 cmd_id;
+			__u16 sq_id;
+
+			memcpy(&status, &data[1], sizeof(status));
+			memcpy(&cmd_id, &data[3], sizeof(cmd_id));
+			memcpy(&sq_id, &data[5], sizeof(sq_id));
 
 			printf("  Status Code   : 0x%04x\n", le16_to_cpu(status));
 			printf("  Cmd ID        : 0x%04x\n", le16_to_cpu(cmd_id));
 			printf("  SQ ID         : 0x%04x\n", le16_to_cpu(sq_id));
+			printf("  LID,FID,Other Cmd Reserved         : 0x%02x\n", data[7]);
 		} else if (id == CC_REGISTER_CHANGED) {
 			__u32 cc_reg_data = *(__u32 *)data;
 
@@ -126,6 +132,20 @@ void print_telemetry_fifo_event(__u8 class_type,
 
 			printf("  CSTS Reg Data : 0x%08x\n",
 					le32_to_cpu(csts_reg_data));
+		} else if (id == OOB_COMMAND) {
+			printf("  Cmd Op Code   : 0x%02x\n", data[0]);
+			__u16 status;
+			memcpy(&status, &data[1], sizeof(status));
+
+			printf("  Admin Cmd Status   : 0x%04x\n", le16_to_cpu(status));
+			printf("  NVMe MI SC         : 0x%02x\n", data[3]);
+			printf("  Byte1 Req Msg      : 0x%02x\n", data[4]);
+			printf("  Byte2 Req Msg      : 0x%02x\n", data[5]);
+		} else if (id == OOB_AER_EVENT_MSG_TRANS) {
+			__u64 aem = *(__u64 *)data;
+
+			printf("  AEM   : 0x%016"PRIx64"\n",
+					le64_to_cpu(aem));
 		}
 		if (size > 8)
 			print_vu_event_data((size-8), (__u8 *)&data[8]);
@@ -168,7 +188,7 @@ void print_telemetry_fifo_event(__u8 class_type,
 
 	case TELEMETRY_MEDIA_WEAR_CLASS:
 		printf("  Event ID          : 0x%04x %s\n",
-			id, telemetry_media_debug_event_id_to_string(id));
+			id, telemetry_media_wear_event_id_to_string(id));
 		__u32 host_tb_written = *(__u32 *)&data[0];
 		__u32 media_tb_written = *(__u32 *)&data[4];
 		__u32 media_tb_erased = *(__u32 *)&data[8];
@@ -190,6 +210,16 @@ void print_telemetry_fifo_event(__u8 class_type,
 		print_stats_desc((struct telemetry_stats_desc *)data);
 		break;
 
+	case TELEMETRY_VIRTUAL_FIFO_EVENT_CLASS:
+		printf("  Event ID : 0x%04x %s\n",
+			id, telemetry_virtual_fifo_event_id_to_string(id));
+
+		__u16 vu_event_id = *(__u16 *)data;
+
+		printf("  VU Virtual FIFO Event ID   : 0x%02x\n", le16_to_cpu(vu_event_id));
+		printf("\n");
+		break;
+
 	default:
 		/*
 		 * printf("Unknown Event Class Type\n");
@@ -489,9 +519,9 @@ int get_telemetry_das_offset_and_size(
 	return 0;
 }
 
-int get_static_id_ascii_string(int identifier, char *description)
+int get_statistic_id_ascii_string(int identifier, char *description)
 {
-	if (pstring_buffer == NULL)
+	if (!pstring_buffer || !description)
 		return -1;
 
 	struct nvme_ocp_telemetry_string_header *pocp_ts_header =
@@ -522,16 +552,17 @@ int get_static_id_ascii_string(int identifier, char *description)
 			memcpy(description, pdescription,
 			       peach_statistic_entry->ascii_id_length + 1);
 
-			// If ASCII string isn't found, see in our internal Map
-			// for 2.5 Spec defined strings (id < 0x1D).
-			if ((description == NULL) && (identifier < 0x1D))
-				memcpy(description,
-				       statistic_identifiers_map[identifier].description,
-				       peach_statistic_entry->ascii_id_length + 1);
 			return 0;
 		}
 	}
 
+	// If ASCII string isn't found, see in our internal Map
+	// for 2.5 Spec defined strings
+	if (identifier <= 0x1D) {
+		strcpy(description, statistic_identifiers_map[identifier].description);
+		return 0;
+	}
+
 	return -1;
 }
 
@@ -629,10 +660,10 @@ int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug
 	}
 
 	if (string_table == STATISTICS_IDENTIFIER_STRING)
-		get_static_id_ascii_string(identifier, description);
-	else if (string_table == EVENT_STRING)
+		get_statistic_id_ascii_string(identifier, description);
+	else if (string_table == EVENT_STRING && debug_event_class < 0x80)
 		get_event_id_ascii_string(identifier, debug_event_class, description);
-	else if (string_table == VU_EVENT_STRING)
+	else if (string_table == VU_EVENT_STRING || debug_event_class >= 0x80)
 		get_vu_event_id_ascii_string(identifier, debug_event_class, description);
 
 	return 0;
@@ -1204,10 +1235,15 @@ int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_e
 		    struct json_object *pstats_array, FILE *fp)
 {
 	if (pstatistic_entry == NULL) {
-		nvme_show_error("Input buffer was NULL");
+		nvme_show_error("Statistics Input buffer was NULL");
 		return -1;
 	}
 
+	if (pstatistic_entry->statistic_id == STATISTICS_RESERVED_ID)
+		/* End of statistics entries, return -1 to stop processing the buffer */
+		return -1;
+
+
 	unsigned int data_size = pstatistic_entry->statistic_data_size * SIZE_OF_DWORD;
 	__u8 *pdata = (__u8 *)pstatistic_entry +
 		sizeof(struct nvme_ocp_telemetry_statistic_descriptor);
@@ -1236,8 +1272,33 @@ int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_e
 			pstatistic_entry->statistic_data_size);
 		json_add_formatted_u32_str(pstatistics_object, STR_RESERVED,
 			pstatistic_entry->reserved);
-		json_add_formatted_var_size_str(pstatistics_object, STR_STATISTICS_SPECIFIC_DATA,
-			pdata, data_size);
+		if (pstatistic_entry->statistic_id == MAX_DIE_BAD_BLOCK_ID) {
+			json_add_formatted_u32_str(pstatistics_object,
+					STR_STATISTICS_WORST_DIE_PERCENT,
+					pdata[0]);
+			json_add_formatted_u32_str(pstatistics_object,
+					STR_STATISTICS_WORST_DIE_RAW,
+					*(__u16 *)&pdata[2]);
+		} else if (pstatistic_entry->statistic_id == MAX_NAND_CHANNEL_BAD_BLOCK_ID) {
+			json_add_formatted_u32_str(pstatistics_object,
+					STR_STATISTICS_WORST_NAND_CHANNEL_PERCENT,
+					pdata[0]);
+			json_add_formatted_u32_str(pstatistics_object,
+					STR_STATISTICS_WORST_NAND_CHANNEL_RAW,
+					*(__u16 *)&pdata[2]);
+		} else if (pstatistic_entry->statistic_id == MIN_NAND_CHANNEL_BAD_BLOCK_ID) {
+			json_add_formatted_u32_str(pstatistics_object,
+					STR_STATISTICS_BEST_NAND_CHANNEL_PERCENT,
+					pdata[0]);
+			json_add_formatted_u32_str(pstatistics_object,
+					STR_STATISTICS_BEST_NAND_CHANNEL_RAW,
+					*(__u16 *)&pdata[2]);
+		} else {
+			json_add_formatted_var_size_str(pstatistics_object,
+					STR_STATISTICS_SPECIFIC_DATA,
+					pdata,
+					data_size);
+		}
 
 		if (pstatistics_object != NULL)
 			json_array_add_value_object(pstats_array, pstatistics_object);
@@ -1257,8 +1318,33 @@ int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_e
 			fprintf(fp, "%s: 0x%x\n", STR_STATISTICS_DATA_SIZE,
 				pstatistic_entry->statistic_data_size);
 			fprintf(fp, "%s: 0x%x\n", STR_RESERVED, pstatistic_entry->reserved);
-			print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, pdata,
-				data_size, fp);
+			if (pstatistic_entry->statistic_id == MAX_DIE_BAD_BLOCK_ID) {
+				fprintf(fp, "%s: 0x%02x\n", STR_STATISTICS_WORST_DIE_PERCENT,
+						pdata[0]);
+				fprintf(fp, "%s: 0x%04x\n", STR_STATISTICS_WORST_DIE_RAW,
+						*(__u16 *)&pdata[2]);
+			} else if (pstatistic_entry->statistic_id ==
+					MAX_NAND_CHANNEL_BAD_BLOCK_ID) {
+				fprintf(fp, "%s: 0x%02x\n",
+						STR_STATISTICS_WORST_NAND_CHANNEL_PERCENT,
+						pdata[0]);
+				fprintf(fp, "%s: 0x%04x\n",
+						STR_STATISTICS_WORST_NAND_CHANNEL_RAW,
+						*(__u16 *)&pdata[2]);
+			} else if (pstatistic_entry->statistic_id ==
+					MIN_NAND_CHANNEL_BAD_BLOCK_ID) {
+				fprintf(fp, "%s: 0x%02x\n",
+						STR_STATISTICS_BEST_NAND_CHANNEL_PERCENT,
+						pdata[0]);
+				fprintf(fp, "%s: 0x%04x\n",
+						STR_STATISTICS_BEST_NAND_CHANNEL_RAW,
+						*(__u16 *)&pdata[2]);
+			} else {
+				print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA,
+						pdata,
+						data_size,
+						fp);
+			}
 			fprintf(fp, STR_LINE2);
 		} else {
 			printf("%s: 0x%x\n", STR_STATISTICS_IDENTIFIER,
@@ -1275,8 +1361,33 @@ int parse_statistic(struct nvme_ocp_telemetry_statistic_descriptor *pstatistic_e
 			printf("%s: 0x%x\n", STR_STATISTICS_DATA_SIZE,
 			       pstatistic_entry->statistic_data_size);
 			printf("%s: 0x%x\n", STR_RESERVED, pstatistic_entry->reserved);
-			print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA, pdata,
-						data_size, fp);
+			if (pstatistic_entry->statistic_id == MAX_DIE_BAD_BLOCK_ID) {
+				printf("%s: 0x%02x\n", STR_STATISTICS_WORST_DIE_PERCENT,
+						pdata[0]);
+				printf("%s: 0x%04x\n", STR_STATISTICS_WORST_DIE_RAW,
+						*(__u16 *)&pdata[2]);
+			} else if (pstatistic_entry->statistic_id ==
+					MAX_NAND_CHANNEL_BAD_BLOCK_ID) {
+				printf("%s: 0x%02x\n",
+						STR_STATISTICS_WORST_NAND_CHANNEL_PERCENT,
+						pdata[0]);
+				printf("%s: 0x%04x\n",
+						STR_STATISTICS_WORST_NAND_CHANNEL_RAW,
+						*(__u16 *)&pdata[2]);
+			} else if (pstatistic_entry->statistic_id ==
+					MIN_NAND_CHANNEL_BAD_BLOCK_ID) {
+				printf("%s: 0x%02x\n",
+						STR_STATISTICS_BEST_NAND_CHANNEL_PERCENT,
+						pdata[0]);
+				printf("%s: 0x%04x\n",
+						STR_STATISTICS_BEST_NAND_CHANNEL_RAW,
+						*(__u16 *)&pdata[2]);
+			} else {
+				print_formatted_var_size_str(STR_STATISTICS_SPECIFIC_DATA,
+						pdata,
+						data_size,
+						fp);
+			}
 			printf(STR_LINE2);
 		}
 	}
@@ -1297,6 +1408,7 @@ int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets
 	__u32 stats_da_1_start_dw = 0, stats_da_1_size_dw = 0;
 	__u32 stats_da_2_start_dw = 0, stats_da_2_size_dw = 0;
 	__u8 *pstats_offset = NULL;
+	int parse_rc = 0;
 
 	if (poffsets->data_area == 1) {
 		__u32 stats_da_1_start = *(__u32 *)(pda1_ocp_header_offset +
@@ -1336,7 +1448,11 @@ int parse_statistics(struct json_object *root, struct nvme_ocp_telemetry_offsets
 			(struct nvme_ocp_telemetry_statistic_descriptor *)
 			(pstats_offset + offset_to_move);
 
-		parse_statistic(pstatistic_entry, pstats_array, fp);
+		parse_rc = parse_statistic(pstatistic_entry, pstats_array, fp);
+		if (parse_rc < 0)
+			/* end of stats entries or null pointer, so break */
+			break;
+
 		offset_to_move += (pstatistic_entry->statistic_data_size * SIZE_OF_DWORD +
 			stat_des_size);
 	}
diff --git a/plugins/ocp/ocp-telemetry-decode.h b/plugins/ocp/ocp-telemetry-decode.h
index ce7de75..21c5b03 100644
--- a/plugins/ocp/ocp-telemetry-decode.h
+++ b/plugins/ocp/ocp-telemetry-decode.h
@@ -48,6 +48,83 @@ enum TELEMETRY_STATISTIC_ID {
 	TELEMETRY_STAT_ID_MAXDBB	= 0x1B, /* Max Die Bad Block  */
 	TELEMETRY_STAT_ID_MAXCBB	= 0x1C, /* Max NAND Channel Bad Block  */
 	TELEMETRY_STAT_ID_MINCBB	= 0x1D, /* Min NAND Channel Bad Block  */
+	TELEMETRY_STAT_ID_PMUW		= 0x1E, /* Physical Media Units Written  */
+	TELEMETRY_STAT_ID_PMUR		= 0x1F, /* Physical Media Units Read  */
+	TELEMETRY_STAT_ID_BUNB		= 0x20, /* Bad User NAND Blocks  */
+	TELEMETRY_STAT_ID_BSNB		= 0x21, /* Bad System NAND Blocks  */
+	TELEMETRY_STAT_ID_XORRC		= 0x22, /* XOR Recovery Count  */
+	TELEMETRY_STAT_ID_UNREC		= 0x23, /* Uncorrectable Read Error Count  */
+	TELEMETRY_STAT_ID_SECCEC	= 0x24, /* Soft ECC Error Count  */
+	TELEMETRY_STAT_ID_ETOECC	= 0x25, /* End To End Correction Counts  */
+	TELEMETRY_STAT_ID_SDU		= 0x26, /* System Data % Used  */
+	TELEMETRY_STAT_ID_RC		= 0x27, /* Refresh Count  */
+	TELEMETRY_STAT_ID_UDEC		= 0x28, /* User Data Erase Counts  */
+	TELEMETRY_STAT_ID_TTSC		= 0x29, /* Thremal Throttling Status and Count  */
+	TELEMETRY_STAT_ID_DSSDSV	= 0x2A, /* DSSD Specification Version  */
+	TELEMETRY_STAT_ID_PCIECEC	= 0x2B, /* PCIe Correctable Error Count  */
+	TELEMETRY_STAT_ID_IS		= 0x2C, /* Incomplete Shutdown  */
+	TELEMETRY_STAT_ID_FB		= 0x2D, /* % Free Block  */
+	TELEMETRY_STAT_ID_CH		= 0x2E, /* Capacitor Health  */
+	TELEMETRY_STAT_ID_NVMEBEV	= 0x2F, /* NVM Express Base Errata Version  */
+	TELEMETRY_STAT_ID_NVMCSEV	= 0x30, /* NVM Command Set Errata Version  */
+	TELEMETRY_STAT_ID_NVMEMIEV	= 0x31, /* NVM Exp Mgmt Interface Err Version  */
+	TELEMETRY_STAT_ID_UIO		= 0x32, /* Unaligned IO  */
+	TELEMETRY_STAT_ID_SVN		= 0x33, /* Security Version Number  */
+	TELEMETRY_STAT_ID_TNUSE		= 0x34, /* Total NUSE  */
+	TELEMETRY_STAT_ID_PLPSC		= 0x35, /* PLP Start Count  */
+	TELEMETRY_STAT_ID_EE		= 0x36, /* Endurance Estimate  */
+	TELEMETRY_STAT_ID_PCIELRC	= 0x37, /* PCIe Link Retraining Count  */
+	TELEMETRY_STAT_ID_PSCC		= 0x38, /* Power State Change Count  */
+	TELEMETRY_STAT_ID_LPFR		= 0x39, /* Lowest Permitted Firmware Revision  */
+	TELEMETRY_STAT_ID_LPV		= 0x3A, /* Log Page Version  */
+	TELEMETRY_STAT_ID_MDO		= 0x3B, /* Media Dies Offline  */
+	TELEMETRY_STAT_ID_MTR		= 0x3C, /* Max Temperature Recorded  */
+	TELEMETRY_STAT_ID_NAEC		= 0x3D, /* Nand Avg Erase Count  */
+	TELEMETRY_STAT_ID_CT		= 0x3E, /* Command Timeout  */
+	TELEMETRY_STAT_ID_SAPFC		= 0x3F, /* System Area Program Fail Count  */
+	TELEMETRY_STAT_ID_SARFC		= 0x40, /* System Area Read Fail Count  */
+	TELEMETRY_STAT_ID_SAEFC		= 0x41, /* System Area Erase Fail Count  */
+	TELEMETRY_STAT_ID_MPPC		= 0x42, /* Max Peak Power Capability  */
+	TELEMETRY_STAT_ID_CMAP		= 0x43, /* Current Max Average Power  */
+	TELEMETRY_STAT_ID_LPC		= 0x44, /* Lifetime Power Consumed  */
+	TELEMETRY_STAT_ID_PAC		= 0x45, /* Panic Asset Count  */
+	TELEMETRY_STAT_ID_DBT		= 0x46, /* Device Busy Time  */
+	TELEMETRY_STAT_ID_CW		= 0x47, /* Critical Warning  */
+	TELEMETRY_STAT_ID_COMTEMP	= 0x48, /* Composite Temperature  */
+	TELEMETRY_STAT_ID_AS		= 0x49, /* Available Spare  */
+	TELEMETRY_STAT_ID_AST		= 0x4A, /* Available Spare Threshold  */
+	TELEMETRY_STAT_ID_PU		= 0x4B, /* Percentage Used  */
+	TELEMETRY_STAT_ID_EGCWS		= 0x4C, /* Endurance Gp CW Summary  */
+	TELEMETRY_STAT_ID_DUR		= 0x4D, /* Data Units Read  */
+	TELEMETRY_STAT_ID_DUW		= 0x4E, /* Data Units Written  */
+	TELEMETRY_STAT_ID_HRC		= 0x4F, /* Host Read Commands  */
+	TELEMETRY_STAT_ID_HWC		= 0x50, /* Host Write Commands  */
+	TELEMETRY_STAT_ID_CBT		= 0x51, /* Controller Busy Time  */
+	TELEMETRY_STAT_ID_PC		= 0x52, /* Power Cycles  */
+	TELEMETRY_STAT_ID_POH		= 0x53, /* Power On Hours  */
+	TELEMETRY_STAT_ID_US		= 0x54, /* Unsafe Shutdowns  */
+	TELEMETRY_STAT_ID_MDIE		= 0x55, /* Media and Data Integrity Er  */
+	TELEMETRY_STAT_ID_NEILE		= 0x56, /* No of Error Info Entries  */
+	TELEMETRY_STAT_ID_WCTT		= 0x57, /* Warning Composite Temp Time  */
+	TELEMETRY_STAT_ID_CCTT		= 0x58, /* Critical Comp Temp Time  */
+	TELEMETRY_STAT_ID_TS1		= 0x59, /* Temperature Sensor 1  */
+	TELEMETRY_STAT_ID_TS2		= 0x5A, /* Temperature Sensor 2  */
+	TELEMETRY_STAT_ID_TS3		= 0x5B, /* Temperature Sensor 3  */
+	TELEMETRY_STAT_ID_TS4		= 0x5C, /* Temperature Sensor 4  */
+	TELEMETRY_STAT_ID_TS5		= 0x5D, /* Temperature Sensor 5  */
+	TELEMETRY_STAT_ID_TS6		= 0x5E, /* Temperature Sensor 6  */
+	TELEMETRY_STAT_ID_TS7		= 0x5F, /* Temperature Sensor 7  */
+	TELEMETRY_STAT_ID_TS8		= 0x60, /* Temperature Sensor 8  */
+	TELEMETRY_STAT_ID_TMT1TC	= 0x61, /* Thermal Mgmt Temp1 TC  */
+	TELEMETRY_STAT_ID_TMT2TC	= 0x62, /* Thermal Mgmt Temp2 TC  */
+	TELEMETRY_STAT_ID_TTTMT1	= 0x63, /* Total Time TMT1  */
+	TELEMETRY_STAT_ID_TTTMT2	= 0x64, /* Total Time TMT2  */
+	TELEMETRY_STAT_ID_EEE		= 0x65, /* Endurance Estimate  */
+	TELEMETRY_STAT_ID_EDUR		= 0x66, /* Endurance Data Units Read  */
+	TELEMETRY_STAT_ID_EDUW		= 0x67, /* Endurance Data Units Written  */
+	TELEMETRY_STAT_ID_EMUW		= 0x68, /* Endurance Media Units Written  */
+	TELEMETRY_STAT_ID_ENEILE	= 0x69, /* Endurance No Of Err Info Log Entries  */
+
 };
 
 static const char * const telemetry_stat_id_str[] = {
@@ -80,50 +157,128 @@ static const char * const telemetry_stat_id_str[] = {
 	[TELEMETRY_STAT_ID_MAXDBB]	= "Max Die Bad Block",
 	[TELEMETRY_STAT_ID_MAXCBB]	= "Max NAND Channel Bad Block",
 	[TELEMETRY_STAT_ID_MINCBB]	= "Min NAND Channel Bad Block",
+	[TELEMETRY_STAT_ID_PMUW]	 = "Physical Media Units Written",
+	[TELEMETRY_STAT_ID_PMUR]	 = "Physical Media Units Read",
+	[TELEMETRY_STAT_ID_BUNB]	 = "Bad User NAND Blocks",
+	[TELEMETRY_STAT_ID_BSNB]	 = "Bad System NAND Blocks",
+	[TELEMETRY_STAT_ID_XORRC]	 = "XOR Recovery Count",
+	[TELEMETRY_STAT_ID_UNREC]	 = "Uncorrectable Read Error Count",
+	[TELEMETRY_STAT_ID_SECCEC]	 = "Soft ECC Error Count",
+	[TELEMETRY_STAT_ID_ETOECC]	 = "End To End Correction Counts",
+	[TELEMETRY_STAT_ID_SDU]		 = "System Data Used",
+	[TELEMETRY_STAT_ID_RC]		 = "Refresh Count",
+	[TELEMETRY_STAT_ID_UDEC]	 = "User Data Erase Counts",
+	[TELEMETRY_STAT_ID_TTSC]	 = "Thremal Throttling Status and Count",
+	[TELEMETRY_STAT_ID_DSSDSV]	 = "DSSD Specification Version",
+	[TELEMETRY_STAT_ID_PCIECEC]	 = "PCIe Correctable Error Count",
+	[TELEMETRY_STAT_ID_IS]		 = "Incomplete Shutdown",
+	[TELEMETRY_STAT_ID_FB]		 = "Free Block",
+	[TELEMETRY_STAT_ID_CH]		 = "Capacitor Health",
+	[TELEMETRY_STAT_ID_NVMEBEV]	 = "NVM Express Base Errata Version",
+	[TELEMETRY_STAT_ID_NVMCSEV]	 = "NVM Command Set Errata Version",
+	[TELEMETRY_STAT_ID_NVMEMIEV] = "NVM Express Management Interface Errata Version",
+	[TELEMETRY_STAT_ID_UIO]		 = "Unaligned IO",
+	[TELEMETRY_STAT_ID_SVN]		 = "Security Version Number",
+	[TELEMETRY_STAT_ID_TNUSE]	 = "Total NUSE",
+	[TELEMETRY_STAT_ID_PLPSC]	 = "PLP Start Count",
+	[TELEMETRY_STAT_ID_EE]		 = "Endurance Estimate",
+	[TELEMETRY_STAT_ID_PCIELRC]	 = "PCIe Link Retraining Count",
+	[TELEMETRY_STAT_ID_PSCC]	 = "Power State Change Count",
+	[TELEMETRY_STAT_ID_LPFR]	 = "Lowest Permitted Firmware Revision",
+	[TELEMETRY_STAT_ID_LPV]		 = "Log Page Version",
+	[TELEMETRY_STAT_ID_MDO]		 = "Media Dies Offline",
+	[TELEMETRY_STAT_ID_MTR]		 = "Max Temperature Recorded",
+	[TELEMETRY_STAT_ID_NAEC]	 = "Nand Avg Erase Count",
+	[TELEMETRY_STAT_ID_CT]		 = "Command Timeout",
+	[TELEMETRY_STAT_ID_SAPFC]	 = "System Area Program Fail Count",
+	[TELEMETRY_STAT_ID_SARFC]	 = "System Area Read Fail Count",
+	[TELEMETRY_STAT_ID_SAEFC]	 = "System Area Erase Fail Count",
+	[TELEMETRY_STAT_ID_MPPC]	 = "Max Peak Power Capability",
+	[TELEMETRY_STAT_ID_CMAP]	 = "Current Max Average Power",
+	[TELEMETRY_STAT_ID_LPC]		 = "Lifetime Power Consumed",
+	[TELEMETRY_STAT_ID_PAC]		 = "Panic Asset Count",
+	[TELEMETRY_STAT_ID_DBT]		 = "Device Busy Time",
+	[TELEMETRY_STAT_ID_CW]		 = "Critical Warning",
+	[TELEMETRY_STAT_ID_COMTEMP]	 = "Composite Temperature",
+	[TELEMETRY_STAT_ID_AS]		 = "Available Spare",
+	[TELEMETRY_STAT_ID_AST]		 = "Available Spare Threshold",
+	[TELEMETRY_STAT_ID_PU]		 = "Percentage Used",
+	[TELEMETRY_STAT_ID_EGCWS]	 = "Endurance Gp CW Summary",
+	[TELEMETRY_STAT_ID_DUR]		 = "Data Units Read",
+	[TELEMETRY_STAT_ID_DUW]		 = "Data Units Written",
+	[TELEMETRY_STAT_ID_HRC]		 = "Host Read Commands",
+	[TELEMETRY_STAT_ID_HWC]		 = "Host Write Commands",
+	[TELEMETRY_STAT_ID_CBT]		 = "Controller Busy Time",
+	[TELEMETRY_STAT_ID_PC]		 = "Power Cycles",
+	[TELEMETRY_STAT_ID_POH]		 = "Power On Hours",
+	[TELEMETRY_STAT_ID_US]		 = "Unsafe Shutdowns",
+	[TELEMETRY_STAT_ID_MDIE]	 = "Media and Data Integrity Er",
+	[TELEMETRY_STAT_ID_NEILE]	 = "No of Error Info Entries",
+	[TELEMETRY_STAT_ID_WCTT]	 = "Warning Composite Temp Time",
+	[TELEMETRY_STAT_ID_CCTT]	 = "Critical Comp Temp Time",
+	[TELEMETRY_STAT_ID_TS1]		 = "Temperature Sensor 1",
+	[TELEMETRY_STAT_ID_TS2]		 = "Temperature Sensor 2",
+	[TELEMETRY_STAT_ID_TS3]		 = "Temperature Sensor 3",
+	[TELEMETRY_STAT_ID_TS4]		 = "Temperature Sensor 4",
+	[TELEMETRY_STAT_ID_TS5]		 = "Temperature Sensor 5",
+	[TELEMETRY_STAT_ID_TS6]		 = "Temperature Sensor 6",
+	[TELEMETRY_STAT_ID_TS7]		 = "Temperature Sensor 7",
+	[TELEMETRY_STAT_ID_TS8]		 = "Temperature Sensor 8",
+	[TELEMETRY_STAT_ID_TMT1TC]	 = "Thermal Mgmt Temp1 TC",
+	[TELEMETRY_STAT_ID_TMT2TC]	 = "Thermal Mgmt Temp2 TC",
+	[TELEMETRY_STAT_ID_TTTMT1]	 = "Total Time TMT1",
+	[TELEMETRY_STAT_ID_TTTMT2]	 = "Total Time TMT2",
+	[TELEMETRY_STAT_ID_EEE]		 = "Endurance Estimate",
+	[TELEMETRY_STAT_ID_EDUR]	 = "Endurance Data Units Read",
+	[TELEMETRY_STAT_ID_EDUW]	 = "Endurance Data Units Written",
+	[TELEMETRY_STAT_ID_EMUW]	 = "Endurance Media Units Written",
+	[TELEMETRY_STAT_ID_ENEILE]	 = "Endurance No Of Err Info Log Entries",
 };
 
 /*****************************************************************************
  * Telemetry FIFO Event Class ID's and Strings
  *****************************************************************************/
 enum TELEMETRY_EVENT_CLASS_TYPE {
-	TELEMETRY_TIMESTAMP_CLASS      = 0x1,
-	TELEMETRY_PCIE_CLASS           = 0x2,
-	TELEMETRY_NVME_CLASS           = 0x3,
-	TELEMETRY_RESET_CLASS          = 0x4,
-	TELEMETRY_BOOT_SEQ_CLASS       = 0x5,
-	TELEMETRY_FW_ASSERT_CLASS      = 0x6,
-	TELEMETRY_TEMPERATURE_CLASS    = 0x7,
-	TELEMETRY_MEDIA_DBG_CLASS      = 0x8,
-	TELEMETRY_MEDIA_WEAR_CLASS     = 0x9,
-	TELEMETRY_STAT_SNAPSHOT_CLASS  = 0xA,
+	TELEMETRY_TIMESTAMP_CLASS           = 0x1,
+	TELEMETRY_PCIE_CLASS                = 0x2,
+	TELEMETRY_NVME_CLASS                = 0x3,
+	TELEMETRY_RESET_CLASS               = 0x4,
+	TELEMETRY_BOOT_SEQ_CLASS            = 0x5,
+	TELEMETRY_FW_ASSERT_CLASS           = 0x6,
+	TELEMETRY_TEMPERATURE_CLASS         = 0x7,
+	TELEMETRY_MEDIA_DBG_CLASS           = 0x8,
+	TELEMETRY_MEDIA_WEAR_CLASS          = 0x9,
+	TELEMETRY_STAT_SNAPSHOT_CLASS       = 0xA,
+	TELEMETRY_VIRTUAL_FIFO_EVENT_CLASS  = 0xB,
 };
 
 static const char * const telemetry_event_class_str[] = {
-	[TELEMETRY_TIMESTAMP_CLASS]		= "Timestamp Class",
-	[TELEMETRY_PCIE_CLASS]			= "PCIe Class",
-	[TELEMETRY_NVME_CLASS]			= "NVMe Class",
-	[TELEMETRY_RESET_CLASS]			= "Reset Class",
-	[TELEMETRY_BOOT_SEQ_CLASS]		= "Boot Sequence Class",
-	[TELEMETRY_FW_ASSERT_CLASS]		= "FW Assert Class",
-	[TELEMETRY_TEMPERATURE_CLASS]	= "Temperature Class",
-	[TELEMETRY_MEDIA_DBG_CLASS]		= "Media Debug Class",
-	[TELEMETRY_MEDIA_WEAR_CLASS]	= "Media Wear Class",
-	[TELEMETRY_STAT_SNAPSHOT_CLASS]	= "Statistic Snapshot Class",
+	[TELEMETRY_TIMESTAMP_CLASS]          = "Timestamp Class",
+	[TELEMETRY_PCIE_CLASS]               = "PCIe Class",
+	[TELEMETRY_NVME_CLASS]               = "NVMe Class",
+	[TELEMETRY_RESET_CLASS]              = "Reset Class",
+	[TELEMETRY_BOOT_SEQ_CLASS]           = "Boot Sequence Class",
+	[TELEMETRY_FW_ASSERT_CLASS]          = "FW Assert Class",
+	[TELEMETRY_TEMPERATURE_CLASS]        = "Temperature Class",
+	[TELEMETRY_MEDIA_DBG_CLASS]          = "Media Debug Class",
+	[TELEMETRY_MEDIA_WEAR_CLASS]         = "Media Wear Class",
+	[TELEMETRY_STAT_SNAPSHOT_CLASS]      = "Statistic Snapshot Class",
+	[TELEMETRY_VIRTUAL_FIFO_EVENT_CLASS] = "Virtual FIFO Event Class",
 };
 
 /*****************************************************************************
  * Telemetry Timestamp Class (01h) Event ID's and Strings
  *****************************************************************************/
 enum TELEMETRY_TIMESTAMP_EVENT_ID {
-	TIMESTAMP_HOST_CMD_ISSUED      = 0x0000,
-	TIMESTAMP_SNAPSHOT             = 0x0001,
-	TIMESTAMP_POWER_ON_HOURS       = 0x0002,
+	TIMESTAMP_FEATURE_HOST_ISSUED    = 0x0000,
+	TIMESTAMP_FW_INTIATED_SNAPSHOT   = 0x0001,
+	TIMESTAMP_OBSOLETE               = 0x0002,
 };
 
 static const char * const telemetry_timestamp_event_id_str[] = {
-	[TIMESTAMP_HOST_CMD_ISSUED]		= "Timestamp Host Cmd Issued",
-	[TIMESTAMP_SNAPSHOT]			= "Timestamp Snapshot",
-	[TIMESTAMP_POWER_ON_HOURS]		= "Timestamp Power on Hours",
+	[TIMESTAMP_FEATURE_HOST_ISSUED]		= "Host Issued Timestamp Set Feature Cmd",
+	[TIMESTAMP_FW_INTIATED_SNAPSHOT]	= "Fw Initiated Timestamp Snapshot",
+	[TIMESTAMP_OBSOLETE]                = "TimeStamp Obsolete",
 };
 
 /*****************************************************************************
@@ -217,6 +372,8 @@ enum TELEMETRY_NVME_EVENT_ID {
 	CC_REGISTER_CHANGED				= 0x000B,
 	CSTS_REGISTER_CHANGED			= 0x000C,
 	DELETE_IO_QUEUE_PROCESSED		= 0x000D,
+	OOB_COMMAND	                    = 0x000E,
+	OOB_AER_EVENT_MSG_TRANS			= 0x000F
 };
 
 static const char * const telemetry_nvme_event_id_str[] = {
@@ -226,14 +383,16 @@ static const char * const telemetry_nvme_event_id_str[] = {
 	[CSTS_RDY_1_TO_0]				= "CSTS.RDY Transitions from 1 to 0",
 	[NVME_EVENT_ID_RESERVED]		= "Reserved NVMe Event ID",
 	[CREATE_IO_QUEUE_PROCESSED]		= "Create IO SQ or CQ Command Processed",
-	[ADMIN_QUEUE_CMD_PROCESSED]		= "Other Admin Queue Command Processed",
+	[ADMIN_QUEUE_CMD_PROCESSED]		= "Inb-Admin Que Cmd Proc other than Cr IO SQ/CQ",
 	[ADMIN_QUEUE_NONZERO_STATUS]	= "Admin Command Returned Non-zero Status",
 	[IO_QUEUE_NONZERO_STATUS]		= "IO Command Returned Non-zero Status",
 	[CSTS_CFS_0_TO_1]				= "CSTS.CFS Transitions from 0 to 1",
 	[ADMIN_QUEUE_BASE_WRITTEN]		= "Admin SQ or CQ Base Address Written",
 	[CC_REGISTER_CHANGED]			= "CC Register Changed",
-	[CSTS_REGISTER_CHANGED]			= "CTS Register Changed",
+	[CSTS_REGISTER_CHANGED]			= "CSTS Register Changed",
 	[DELETE_IO_QUEUE_PROCESSED]		= "Delete IO SQ or CQ Command Processed",
+	[OOB_COMMAND]			        = "Out of Band Command Process",
+	[OOB_AER_EVENT_MSG_TRANS]		= "Out of Band AER Event Msg Transition"
 };
 
 /*****************************************************************************
@@ -292,7 +451,7 @@ static const char * const telemetry_fw_assert_event_id_str[] = {
 	[ASSERT_BACKGROUND_CODE]		= "Assert in Background Services Code",
 	[FTL_REBUILD_FAILED]			= "FTL Rebuild Failed",
 	[FTL_DATA_MISMATCH]				= "FTL Data Mismatch",
-	[ASSERT_OTHER_CODE]				= "FTL Other Code",
+	[ASSERT_OTHER_CODE]		        = "Assert in Other Code",
 };
 
 /*****************************************************************************
@@ -342,6 +501,19 @@ static const char * const telemetry_media_wear_event_id_str[] = {
 	[MEDIA_WEAR]					= "Media Wear",
 };
 
+/*****************************************************************************
+ * Telemetry Virtual FIFO (0Bh) Event ID's and Strings
+ *****************************************************************************/
+enum TELEMETRY_VIRTUAL_FIFO_EVENT_ID {
+	VIRTUAL_FIFO_START			= 0x0000,
+	VIRTUAL_FIFO_END			= 0x0002,
+};
+
+static const char * const telemetry_virtual_fifo_event_id_str[] = {
+	[VIRTUAL_FIFO_START]			= "Virtual FIFO Start",
+	[VIRTUAL_FIFO_END]				= "Virtual FIFO End",
+};
+
 
 /*****************************************************************************
  * Telemetry Data Structures
@@ -353,7 +525,6 @@ static const char * const telemetry_media_wear_event_id_str[] = {
 #define FILE_NAME_SIZE 2048
 
 enum TELEMETRY_TYPE {
-	TELEMETRY_TYPE_NONE       = 0,
 	TELEMETRY_TYPE_HOST       = 7,
 	TELEMETRY_TYPE_CONTROLLER = 8,
 	TELEMETRY_TYPE_HOST_0     = 9,
@@ -381,7 +552,7 @@ struct telemetry_stats_desc {
 	__u8 info;
 	__u8 ns_info;
 	__le16 size;
-	__le16 rsvd1;
+	__le16 nsid;
 	__u8 data[];
 };
 
@@ -438,7 +609,6 @@ struct telemetry_data_area_1 {
 #define DEFAULT_OUTPUT_FORMAT_JSON "json"
 
 /* C9 Telemetry String Log Format Log Page */
-#define C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE    0xC9
 #define C9_TELEMETRY_STR_LOG_LEN                 432
 #define C9_TELEMETRY_STR_LOG_SIST_OFST           431
 
@@ -460,6 +630,12 @@ struct telemetry_data_area_1 {
 #define STR_STATISTICS_DATA_SIZE "Statistic Data Size"
 #define STR_RESERVED "Reserved"
 #define STR_STATISTICS_SPECIFIC_DATA "Statistic Specific Data"
+#define STR_STATISTICS_WORST_DIE_PERCENT "Worst die % of bad blocks"
+#define STR_STATISTICS_WORST_DIE_RAW "Worst die raw number of bad blocks"
+#define STR_STATISTICS_WORST_NAND_CHANNEL_PERCENT "Worst NAND channel % of bad blocks"
+#define STR_STATISTICS_WORST_NAND_CHANNEL_RAW "Worst NAND channel number of bad blocks"
+#define STR_STATISTICS_BEST_NAND_CHANNEL_PERCENT "Best NAND channel % of bad blocks"
+#define STR_STATISTICS_BEST_NAND_CHANNEL_RAW "Best NAND channel number of bad blocks"
 #define STR_CLASS_SPECIFIC_DATA "Class Specific Data"
 #define STR_DBG_EVENT_CLASS_TYPE "Debug Event Class type"
 #define STR_EVENT_IDENTIFIER "Event Identifier"
@@ -497,6 +673,47 @@ enum ocp_telemetry_string_tables {
 	VU_EVENT_STRING
 };
 
+/**
+ * enum ocp_telemetry_statistics_identifiers - OCP Statistics Identifiers
+ */
+enum ocp_telemetry_statistic_identifiers {
+	STATISTICS_RESERVED_ID = 0x00,
+	OUTSTANDING_ADMIN_CMDS_ID = 0x01,
+	HOST_WRTIE_BANDWIDTH_ID = 0x02,
+	GW_WRITE_BANDWITH_ID = 0x03,
+	ACTIVE_NAMESPACES_ID = 0x04,
+	INTERNAL_WRITE_WORKLOAD_ID = 0x05,
+	INTERNAL_READ_WORKLOAD_ID = 0x06,
+	INTERNAL_WRITE_QUEUE_DEPTH_ID = 0x07,
+	INTERNAL_READ_QUEUE_DEPTH_ID = 0x08,
+	PENDING_TRIM_LBA_COUNT_ID = 0x09,
+	HOST_TRIM_LBA_REQUEST_COUNT_ID = 0x0A,
+	CURRENT_NVME_POWER_STATE_ID = 0x0B,
+	CURRENT_DSSD_POWER_STATE_ID = 0x0C,
+	PROGRAM_FAIL_COUNT_ID = 0x0D,
+	ERASE_FAIL_COUNT_ID = 0x0E,
+	READ_DISTURB_WRITES_ID = 0x0F,
+
+	RETENTION_WRITES_ID = 0x10,
+	WEAR_LEVELING_WRITES_ID = 0x11,
+	READ_RECOVERY_WRITES_ID = 0x12,
+	GC_WRITES_ID = 0x13,
+	SRAM_CORRECTABLE_COUNT_ID = 0x14,
+	DRAM_CORRECTABLE_COUNT_ID = 0x15,
+	SRAM_UNCORRECTABLE_COUNT_ID = 0x16,
+	DRAM_UNCORRECTABLE_COUNT_ID = 0x17,
+	DATA_INTEGRITY_ERROR_COUNT_ID = 0x18,
+	READ_RETRY_ERROR_COUNT_ID = 0x19,
+	PERST_EVENTS_COUNT_ID = 0x1A,
+	MAX_DIE_BAD_BLOCK_ID = 0x1B,
+	MAX_NAND_CHANNEL_BAD_BLOCK_ID = 0x1C,
+	MIN_NAND_CHANNEL_BAD_BLOCK_ID = 0x1D,
+
+	//RESERVED = 7FFFh-1Eh,
+	//VENDOR_UNIQUE_CLASS_TYPE = FFFFh-8000h,
+};
+
+
 /**
  * enum ocp_telemetry_debug_event_class_types - OCP Debug Event Class types
  * @RESERVED_CLASS_TYPE:	       Reserved class
@@ -1018,6 +1235,10 @@ static inline const char *telemetry_media_wear_event_id_to_string(int event_id)
 {
 	return ARGSTR(telemetry_media_wear_event_id_str, event_id);
 }
+static inline const char *telemetry_virtual_fifo_event_id_to_string(int event_id)
+{
+	return ARGSTR(telemetry_virtual_fifo_event_id_str, event_id);
+}
 
 /**
  * @brief parse the ocp telemetry host or controller log binary file
@@ -1129,7 +1350,7 @@ int print_ocp_telemetry_json(struct ocp_telemetry_parse_options *options);
  *
  * @return 0 success
  */
-int get_static_id_ascii_string(int identifier, char *description);
+int get_statistic_id_ascii_string(int identifier, char *description);
 
 /**
  * @brief gets event id ascii string
diff --git a/plugins/ocp/ocp-types.h b/plugins/ocp/ocp-types.h
new file mode 100644
index 0000000..63fa4d7
--- /dev/null
+++ b/plugins/ocp/ocp-types.h
@@ -0,0 +1,13 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#ifndef OCP_TYPES_H
+#define OCP_TYPES_H
+
+#define OCP_GET(value, name) NVME_GET(value, OCP_##name)
+#define OCP_SET(value, name) NVME_SET(value, OCP_##name)
+
+enum nvme_ocp_enable_ieee1667_silo {
+	NVME_OCP_ENABLE_IEEE1667_SILO_SHIFT	= 31,
+	NVME_OCP_ENABLE_IEEE1667_SILO_MASK	= 1,
+};
+
+#endif /* OCP_TYPES_H */
diff --git a/plugins/ocp/ocp-utils.c b/plugins/ocp/ocp-utils.c
index 8a1462e..e3c0747 100644
--- a/plugins/ocp/ocp-utils.c
+++ b/plugins/ocp/ocp-utils.c
@@ -7,6 +7,8 @@
 
 #include <unistd.h>
 #include <errno.h>
+#include "util/types.h"
+#include "ocp-nvme.h"
 #include "ocp-utils.h"
 
 const unsigned char ocp_uuid[NVME_UUID_LEN] = {
@@ -37,3 +39,23 @@ int ocp_get_uuid_index(struct nvme_dev *dev, __u8 *index)
 
 	return ocp_find_uuid_index(&uuid_list, index);
 }
+
+int ocp_get_log_simple(struct nvme_dev *dev, enum ocp_dssd_log_id lid, __u32 len, void *log)
+{
+	int fd = dev_fd(dev);
+	struct nvme_get_log_args args = {
+		.log = log,
+		.args_size = sizeof(args),
+		.fd = fd,
+		.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+		.lid = (enum nvme_cmd_get_log_lid)lid,
+		.len = len,
+		.nsid = NVME_NSID_ALL,
+		.lsi = NVME_LOG_LSI_NONE,
+		.lsp = NVME_LOG_LSP_NONE,
+	};
+
+	ocp_get_uuid_index(dev, &args.uuidx);
+
+	return nvme_get_log_page(fd, NVME_LOG_PAGE_PDU_SIZE, &args);
+}
diff --git a/plugins/ocp/ocp-utils.h b/plugins/ocp/ocp-utils.h
index 1512db8..9832474 100644
--- a/plugins/ocp/ocp-utils.h
+++ b/plugins/ocp/ocp-utils.h
@@ -4,7 +4,6 @@
  *
  * Author: leonardo.da.cunha@solidigm.com
  */
-
 #include "nvme.h"
 
 /*
@@ -30,3 +29,5 @@ int ocp_get_uuid_index(struct nvme_dev *dev, __u8 *index);
  * Return: Zero if nvme device has UUID list log page, Negative POSIX error code otherwise.
  */
 int ocp_find_uuid_index(struct nvme_id_uuid_list *uuid_list, __u8 *index);
+
+int ocp_get_log_simple(struct nvme_dev *dev, enum ocp_dssd_log_id lid, __u32 len, void *log);
diff --git a/plugins/scaleflux/sfx-nvme.c b/plugins/scaleflux/sfx-nvme.c
index f752d5d..63e0e2e 100644
--- a/plugins/scaleflux/sfx-nvme.c
+++ b/plugins/scaleflux/sfx-nvme.c
@@ -22,9 +22,11 @@
 #include "nvme-wrap.h"
 #include "nvme-print.h"
 #include "util/cleanup.h"
+#include "util/types.h"
 
 #define CREATE_CMD
 #include "sfx-nvme.h"
+#include "sfx-types.h"
 
 #define SFX_PAGE_SHIFT						12
 #define SECTOR_SHIFT						9
@@ -32,8 +34,10 @@
 #define SFX_GET_FREESPACE			_IOWR('N', 0x240, struct sfx_freespace_ctx)
 #define NVME_IOCTL_CLR_CARD			_IO('N', 0x47)
 
+//See IDEMA LBA1-03
 #define IDEMA_CAP(exp_GB)			(((__u64)exp_GB - 50ULL) * 1953504ULL + 97696368ULL)
-#define IDEMA_CAP2GB(exp_sector)		(((__u64)exp_sector - 97696368ULL) / 1953504ULL + 50ULL)
+#define IDEMA_CAP2GB(exp_sector)	(((__u64)exp_sector - 97696368ULL) / 1953504ULL + 50ULL)
+#define IDEMA_CAP2GB_LDS(exp_sector)	(((__u64)exp_sector - 12212046ULL) / 244188ULL + 50ULL)
 
 #define VANDA_MAJOR_IDX		0
 #define VANDA_MINOR_IDX		0
@@ -41,93 +45,7 @@
 #define MYRTLE_MAJOR_IDX        4
 #define MYRTLE_MINOR_IDX        1
 
-enum {
-	SFX_LOG_LATENCY_READ_STATS	= 0xc1,
-	SFX_LOG_SMART			= 0xc2,
-	SFX_LOG_LATENCY_WRITE_STATS	= 0xc3,
-	SFX_LOG_QUAL			= 0xc4,
-	SFX_LOG_MISMATCHLBA		= 0xc5,
-	SFX_LOG_MEDIA			= 0xc6,
-	SFX_LOG_BBT			= 0xc7,
-	SFX_LOG_IDENTIFY		= 0xcc,
-	SFX_FEAT_ATOMIC			= 0x01,
-	SFX_FEAT_UP_P_CAP		= 0xac,
-	SFX_FEAT_CLR_CARD		= 0xdc,
-};
 
-enum sfx_nvme_admin_opcode {
-	nvme_admin_query_cap_info	= 0xd3,
-	nvme_admin_change_cap		= 0xd4,
-	nvme_admin_sfx_set_features	= 0xd5,
-	nvme_admin_sfx_get_features	= 0xd6,
-};
-
-struct sfx_freespace_ctx {
-	__u64 free_space;
-	__u64 phy_cap;		/* physical capacity, in unit of sector */
-	__u64 phy_space;	/* physical space considering OP, in unit of sector */
-	__u64 user_space;	/* user required space, in unit of sector*/
-	__u64 hw_used;		/* hw space used in 4K */
-	__u64 app_written;	/* app data written in 4K */
-	__u64 out_of_space;
-	__u64 map_unit;
-	__u64 max_user_space;
-	__u64 extendible_user_cap_lba_count;
-	__u64 friendly_change_cap_support;
-};
-
-struct nvme_capacity_info {
-	__u64 lba_sec_sz;
-	__u64 phy_sec_sz;
-	__u64 used_space;
-	__u64 free_space;
-};
-
-struct __packed nvme_additional_smart_log_item {
-	__u8			key;
-	__u8			_kp[2];
-	__u8			norm;
-	__u8			_np;
-	union __packed {
-		__u8		raw[6];
-		struct __packed  wear_level {
-			__le16	min;
-			__le16	max;
-			__le16	avg;
-		} wear_level;
-		struct __packed thermal_throttle {
-			__u8	pct;
-			__u32	count;
-		} thermal_throttle;
-	};
-	__u8			_rp;
-};
-
-struct nvme_additional_smart_log {
-	struct nvme_additional_smart_log_item program_fail_cnt;
-	struct nvme_additional_smart_log_item erase_fail_cnt;
-	struct nvme_additional_smart_log_item wear_leveling_cnt;
-	struct nvme_additional_smart_log_item e2e_err_cnt;
-	struct nvme_additional_smart_log_item crc_err_cnt;
-	struct nvme_additional_smart_log_item timed_workload_media_wear;
-	struct nvme_additional_smart_log_item timed_workload_host_reads;
-	struct nvme_additional_smart_log_item timed_workload_timer;
-	struct nvme_additional_smart_log_item thermal_throttle_status;
-	struct nvme_additional_smart_log_item retry_buffer_overflow_cnt;
-	struct nvme_additional_smart_log_item pll_lock_loss_cnt;
-	struct nvme_additional_smart_log_item nand_bytes_written;
-	struct nvme_additional_smart_log_item host_bytes_written;
-	struct nvme_additional_smart_log_item raid_recover_cnt; /* errors which can be recovered by RAID */
-	struct nvme_additional_smart_log_item prog_timeout_cnt;
-	struct nvme_additional_smart_log_item erase_timeout_cnt;
-	struct nvme_additional_smart_log_item read_timeout_cnt;
-	struct nvme_additional_smart_log_item read_ecc_cnt; /* retry cnt */
-	struct nvme_additional_smart_log_item non_media_crc_err_cnt;
-	struct nvme_additional_smart_log_item compression_path_err_cnt;
-	struct nvme_additional_smart_log_item out_of_space_flag;
-	struct nvme_additional_smart_log_item physical_usage_ratio;
-	struct nvme_additional_smart_log_item grown_bb; /* grown bad block */
-};
 
 int nvme_query_cap(int fd, __u32 nsid, __u32 data_len, void *data)
 {
@@ -183,13 +101,14 @@ int nvme_sfx_get_features(int fd, __u32 nsid, __u32 fid, __u32 *result)
 	return err;
 }
 
+#ifdef CONFIG_JSONC
 static void show_sfx_smart_log_jsn(struct nvme_additional_smart_log *smart,
 		unsigned int nsid, const char *devname)
 {
 	struct json_object *root, *entry_stats, *dev_stats, *multi;
 
 	root = json_create_object();
-	json_object_add_value_string(root, "Intel Smart log", devname);
+	json_object_add_value_string(root, "ScaleFlux Smart log", devname);
 
 	dev_stats = json_create_object();
 
@@ -318,9 +237,12 @@ static void show_sfx_smart_log_jsn(struct nvme_additional_smart_log *smart,
 	json_object_add_value_object(root, "Device stats", dev_stats);
 
 	json_print_object(root, NULL);
-	printf("/n");
+	printf("\n");
 	json_free_object(root);
 }
+#else /* CONFIG_JSONC */
+#define show_sfx_smart_log_jsn(smart, nsid, devname)
+#endif /* CONFIG_JSONC */
 
 static void show_sfx_smart_log(struct nvme_additional_smart_log *smart,
 		unsigned int nsid, const char *devname)
@@ -410,7 +332,9 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
 	    "Get ScaleFlux vendor specific additional smart log (optionally, for the specified namespace), and show it.";
 	const char *namespace = "(optional) desired namespace";
 	const char *raw = "dump output in binary format";
+#ifdef CONFIG_JSONC
 	const char *json = "Dump output in json format";
+#endif /* CONFIG_JSONC */
 	struct nvme_dev *dev;
 	struct config {
 		__u32 namespace_id;
@@ -420,17 +344,16 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
 	int err;
 
 	struct config cfg = {
-		.namespace_id = 0xffffffff,
+		.namespace_id = NVME_NSID_ALL,
 	};
 
 	OPT_ARGS(opts) = {
 		OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace),
 		OPT_FLAG("raw-binary",	 'b', &cfg.raw_binary,	 raw),
-		OPT_FLAG("json",		 'j', &cfg.json,		 json),
+		OPT_FLAG_JSON("json",	 'j', &cfg.json,	 json),
 		OPT_END()
 	};
 
-
 	err = parse_and_open(&dev, argc, argv, desc, opts);
 	if (err)
 		return err;
@@ -453,56 +376,6 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
 	return err;
 }
 
-struct __packed sfx_lat_stats_vanda {
-	__u16    maj;
-	__u16    min;
-	__u32	 bucket_1[32];	/* 0~1ms, step 32us */
-	__u32	 bucket_2[31];	/* 1~32ms, step 1ms */
-	__u32	 bucket_3[31];	/* 32ms~1s, step 32ms */
-	__u32	 bucket_4[1];	/* 1s~2s, specifically 1024ms~2047ms */
-	__u32	 bucket_5[1];	/* 2s~4s, specifically 2048ms~4095ms */
-	__u32	 bucket_6[1];	/* 4s+, specifically 4096ms+ */
-};
-
-struct __packed sfx_lat_stats_myrtle {
-	__u16    maj;
-	__u16    min;
-	__u32	 bucket_1[64];	/* 0us~63us, step 1us */
-	__u32	 bucket_2[64];	/* 63us~127us, step 1us */
-	__u32	 bucket_3[64];	/* 127us~255us, step 2us */
-	__u32	 bucket_4[64];	/* 255us~510us, step 4us */
-	__u32	 bucket_5[64];	/* 510us~1.02ms step 8us */
-	__u32	 bucket_6[64];	/* 1.02ms~2.04ms step 16us */
-	__u32    bucket_7[64];  /* 2.04ms~4.08ms step 32us */
-	__u32    bucket_8[64];  /* 4.08ms~8.16ms step 64us */
-	__u32    bucket_9[64];  /* 8.16ms~16.32ms step 128us */
-	__u32    bucket_10[64]; /* 16.32ms~32.64ms step 256us */
-	__u32    bucket_11[64]; /* 32.64ms~65.28ms step 512us */
-	__u32    bucket_12[64]; /* 65.28ms~130.56ms step 1.024ms */
-	__u32    bucket_13[64]; /* 130.56ms~261.12ms step 2.048ms */
-	__u32    bucket_14[64]; /* 261.12ms~522.24ms step 4.096ms */
-	__u32    bucket_15[64]; /* 522.24ms~1.04s step 8.192ms */
-	__u32    bucket_16[64]; /* 1.04s~2.09s step 16.384ms */
-	__u32    bucket_17[64]; /* 2.09s~4.18s step 32.768ms */
-	__u32    bucket_18[64]; /* 4.18s~8.36s step 65.536ms */
-	__u32    bucket_19[64]; /* 8.36s~ step 131.072ms */
-	__u64    average; /* average latency statistics */
-};
-
-
-struct __packed sfx_lat_status_ver {
-	__u16 maj;
-	__u16 min;
-};
-
-struct sfx_lat_stats {
-	union {
-		struct sfx_lat_status_ver   ver;
-		struct sfx_lat_stats_vanda  vanda;
-		struct sfx_lat_stats_myrtle myrtle;
-	};
-};
-
 static void show_lat_stats_vanda(struct sfx_lat_stats_vanda *stats, int write)
 {
 	int i;
@@ -713,7 +586,7 @@ static int get_bb_table(int fd, __u32 nsid, unsigned char *buf, __u64 size)
 /**
  * @brief display bb table
  *
- * @param bd_table		buffer that contain bb table dumped from drvier
+ * @param bd_table		buffer that contain bb table dumped from driver
  * @param table_size	buffer size (BYTES), should at least has 8 bytes for mf_bb_count and grown_bb_count
  */
 static void bd_table_show(unsigned char *bd_table, __u64 table_size)
@@ -796,7 +669,7 @@ static int sfx_get_bad_block(int argc, char **argv, struct command *cmd, struct
 		return -1;
 	}
 
-	err = get_bb_table(dev_fd(dev), 0xffffffff, data_buf, buf_size);
+	err = get_bb_table(dev_fd(dev), NVME_NSID_ALL, data_buf, buf_size);
 	if (err < 0) {
 		perror("get-bad-block");
 	} else if (err) {
@@ -847,7 +720,7 @@ static int query_cap_info(int argc, char **argv, struct command *cmd, struct plu
 	if (err)
 		return err;
 
-	if (nvme_query_cap(dev_fd(dev), 0xffffffff, sizeof(ctx), &ctx)) {
+	if (nvme_query_cap(dev_fd(dev), NVME_NSID_ALL, sizeof(ctx), &ctx)) {
 		perror("sfx-query-cap");
 		err = -1;
 	}
@@ -868,22 +741,22 @@ static int change_sanity_check(int fd, __u64 trg_in_4k, int *shrink)
 	struct sysinfo s_info;
 	__u64 mem_need = 0;
 	__u64 cur_in_4k = 0;
-	__u64 provisoned_cap_4k = 0;
+	__u64 provisioned_cap_4k = 0;
 	int extend = 0;
 
-	if (nvme_query_cap(fd, 0xffffffff, sizeof(freespace_ctx), &freespace_ctx))
+	if (nvme_query_cap(fd, NVME_NSID_ALL, sizeof(freespace_ctx), &freespace_ctx))
 		return -1;
 
 	/*
 	 * capacity illegal check
 	 */
-	provisoned_cap_4k = freespace_ctx.phy_space >>
+	provisioned_cap_4k = freespace_ctx.phy_space >>
 			    (SFX_PAGE_SHIFT - SECTOR_SHIFT);
-	if (trg_in_4k < provisoned_cap_4k ||
-	    trg_in_4k > ((__u64)provisoned_cap_4k * 4)) {
+	if (trg_in_4k < provisioned_cap_4k ||
+	    trg_in_4k > ((__u64)provisioned_cap_4k * 4)) {
 		fprintf(stderr,
 			"WARNING: Only support 1.0~4.0 x provisioned capacity!\n");
-		if (trg_in_4k < provisoned_cap_4k)
+		if (trg_in_4k < provisioned_cap_4k)
 			fprintf(stderr,
 				"WARNING: The target capacity is less than 1.0 x provisioned capacity!\n");
 		else
@@ -891,7 +764,7 @@ static int change_sanity_check(int fd, __u64 trg_in_4k, int *shrink)
 				"WARNING: The target capacity is larger than 4.0 x provisioned capacity!\n");
 		return -1;
 	}
-	if (trg_in_4k > ((__u64)provisoned_cap_4k*4)) {
+	if (trg_in_4k > ((__u64)provisioned_cap_4k*4)) {
 		fprintf(stderr, "WARNING: the target capacity is too large\n");
 		return -1;
 	}
@@ -997,7 +870,7 @@ static int change_cap(int argc, char **argv, struct command *cmd, struct plugin
 		return 0;
 	}
 
-	err = nvme_change_cap(dev_fd(dev), 0xffffffff, cap_in_4k);
+	err = nvme_change_cap(dev_fd(dev), NVME_NSID_ALL, cap_in_4k);
 	if (err < 0) {
 		perror("sfx-change-cap");
 	} else if (err) {
@@ -1112,7 +985,7 @@ static int sfx_set_feature(int argc, char **argv, struct command *cmd, struct pl
 	}
 
 	if (cfg.feature_id == SFX_FEAT_ATOMIC && cfg.value) {
-		if (cfg.namespace_id != 0xffffffff) {
+		if (cfg.namespace_id != NVME_NSID_ALL) {
 			err = nvme_identify_ns(dev_fd(dev), cfg.namespace_id,
 					       &ns);
 			if (err) {
@@ -1506,7 +1379,7 @@ static int sfx_dump_evtlog(int argc, char **argv, struct command *cmd, struct pl
 	};
 	struct config cfg = {
 		.file = NULL,
-		.namespace_id = 0xffffffff,
+		.namespace_id = NVME_NSID_ALL,
 		.storage_medium = 0,
 		.parse = false,
 		.output = NULL,
@@ -1634,7 +1507,7 @@ static int sfx_expand_cap(int argc, char **argv, struct command *cmd, struct plu
 		__u32 units;
 	};
 	struct config cfg = {
-		.namespace_id = 0xffffffff,
+		.namespace_id = NVME_NSID_ALL,
 		.lbaf = 0,
 		.units = 0,
 	};
@@ -1652,7 +1525,7 @@ static int sfx_expand_cap(int argc, char **argv, struct command *cmd, struct plu
 	if (err)
 		goto ret;
 
-	if (cfg.namespace_id == 0xffffffff) {
+	if (cfg.namespace_id == NVME_NSID_ALL) {
 		if (S_ISCHR(dev->direct.stat.st_mode)) {
 			fprintf(stderr, "namespace_id or blk device required\n");
 			err = EINVAL;
@@ -1685,3 +1558,528 @@ close_dev:
 ret:
 	return err;
 }
+
+static int sfx_status(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+	const char *desc				= "Get ScaleFlux specific status information and print it";
+	const char *json_desc			= "Print output in JSON format, otherwise human readable";
+	struct nvme_dev *dev;
+	struct nvme_id_ctrl id_ctrl = { 0 };
+	struct extended_health_info_myrtle sfx_smart = { 0 };
+	struct nvme_smart_log smart_log = { 0 };
+	struct nvme_additional_smart_log additional_smart_log = { 0 };
+	struct sfx_freespace_ctx sfx_freespace = { 0 };
+	struct nvme_get_features_args get_feat_args = { 0 };
+	unsigned int get_feat_result, pcie_correctable, pcie_fatal, pcie_nonfatal;
+	unsigned long long capacity;
+	bool capacity_valid = false;
+	int err, fd, len, sector_size;
+	char pci_vid[7], pci_did[7], pci_ssvid[7], link_speed[20], link_width[5], link_string[40];
+	char path[512], numa_node[5], vendor[10], form_factor[15], temperature[10], io_speed[15];
+	char chr_dev[8], serial_number[21], model_number[41], firmware_revision[9], pcie_status[9];
+	struct json_object *root, *dev_stats, *link_stats, *crit_stats;
+	double write_amp;
+
+	struct config {
+		bool json;
+	};
+	struct config cfg = {
+		.json = false
+	};
+
+	OPT_ARGS(opts) = {
+		OPT_FLAG("json-print",	    'j',	&cfg.json,	json_desc),
+		OPT_END()
+	};
+
+	err = parse_and_open(&dev, argc, argv, desc, opts);
+
+	if (err)
+		goto ret;
+
+	//Calculate formatted capacity, not concerned with errors, we may have a char device
+	memset(&path, 0, 512);
+	snprintf(path, 512, "/dev/%s", dev->name);
+	fd = open(path, O_RDONLY | O_NONBLOCK);
+	if (fd >= 0) {
+		err = ioctl(fd, BLKSSZGET, &sector_size);
+		if (!err)
+			err = ioctl(fd, BLKGETSIZE64, &capacity);
+		capacity_valid = (!err);
+	}
+
+	if (capacity_valid && sector_size == 512)
+		capacity = IDEMA_CAP2GB(capacity/sector_size);
+	else if (capacity_valid &&  sector_size == 4096)
+		capacity = IDEMA_CAP2GB_LDS(capacity/sector_size);
+	else
+		capacity = capacity / (1000 * 1000 * 1000); //B --> GB
+
+	memset(&chr_dev, 0, 8);
+	strcpy(chr_dev, dev->name);
+	for (len = 2; len < 8; len++) {
+		if (chr_dev[len] == 'n')
+			chr_dev[len] = '\0';
+	}
+
+	// Populate PCIe VID/DID/SS_VID, link speed/width, and NUMA node from /sys/
+	snprintf(path, 512, "/sys/class/nvme/%s/device/vendor", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open PCIe VID in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+	memset(&pci_vid, 0, 7);
+	len = read(fd, pci_vid, 6);
+	if (len < 1) {
+		perror("Could not read PCIe VID in /sys/");
+		close(fd);
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+
+	snprintf(path, 512, "/sys/class/nvme/%s/device/device", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open PCIe DID in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+	memset(&pci_did, 0, 7);
+	len = read(fd, pci_did, 6);
+	if (len < 1) {
+		perror("Could not read PCIe DID in /sys/");
+		close(fd);
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+
+	if (strncmp("0xcc53", pci_vid, 6) == 0)
+		strncpy(vendor, "ScaleFlux", 10);
+	else if (strncmp("0x1dfd", pci_vid, 6) == 0)
+		strncpy(vendor, "DIGISTOR", 10);
+	else {
+		fprintf(stderr, "Please use on a ScaleFlux device\n");
+		err = -1;
+		goto close_dev;
+	}
+
+	snprintf(path, 512, "/sys/class/nvme/%s/device/subsystem_vendor", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open PCIe Subsystem Vendor ID in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+	memset(&pci_ssvid, 0, 7);
+	len = read(fd, pci_ssvid, 6);
+	if (len < 1) {
+		perror("could not read PCIe Subsystem Vendor ID in /sys/");
+		close(fd);
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+
+	snprintf(path, 512, "/sys/class/nvme/%s/device/current_link_speed", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open link speed in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+	memset(&link_speed, 0, 20);
+	len = read(fd, link_speed, 20);
+	if (len < 1) {
+		perror("Could not read link speed in /sys/");
+		close(fd);
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+	// Ending string before "PCIe" and newline
+	for (len = 0; (len+2) < 20 && link_speed[len+2] != '\0'; ++len) {
+		if (link_speed[len] == '/' && link_speed[len+1] == 's')
+			link_speed[len+2] = '\0';
+	}
+
+	snprintf(path, 512, "/sys/class/nvme/%s/device/current_link_width", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open link width in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+	memset(&link_width, 0, 5);
+	len = read(fd, link_width, 5);
+	if (len < 1) {
+		perror("Could not read link width in /sys/");
+		close(fd);
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+	// Ending string before newline
+	for (len = 0; (len) < 5 ; ++len) {
+		if (link_width[len] == '\n')
+			link_width[len] = '\0';
+	}
+
+	snprintf(link_string, 40, "Speed %s, Width x%s", link_speed, link_width);
+
+	snprintf(path, 512, "/sys/class/nvme/%s/device/numa_node", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open NUMA node in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+	memset(&numa_node, 0, 5);
+	len = read(fd, numa_node, 5);
+	if (len < 1) {
+		perror("Could not read NUMA node in /sys/");
+		close(fd);
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+
+	for (len = 0; len < 5; ++len) {
+		if (numa_node[len] == '\n')
+			numa_node[len] =  '\0';
+	}
+
+	//Populate PCIe AER errors from /sys/
+	snprintf(path, 512, "/sys/class/nvme/%s/device/aer_dev_correctable", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open PCIe AER Correctable errors in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+	len = read(fd, path, 512);
+	if (len < 1) {
+		perror("Could not read PCIe AER Correctable errors in /sys/");
+		close(fd);
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+	len = sscanf(path, "%*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d TOTAL_ERR_COR %d", &pcie_correctable);
+	len = 1;
+	if (len < 1 || len == EOF) {
+		perror("Could not parse PCIe AER Correctable errors in /sys/");
+		err = -1;
+		goto close_dev;
+	}
+
+	snprintf(path, 512, "/sys/class/nvme/%s/device/aer_dev_nonfatal", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open PCIe AER Non-Fatal errors in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+
+	len = read(fd, path, 512);
+	if (len < 1) {
+		perror("Could not read PCIe AER Non-Fatal errors in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+	len = sscanf(path, "%*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d TOTAL_ERR_NONFATAL %d", &pcie_nonfatal);
+	if (len < 1) {
+		perror("Could not parse PCIe AER Non-Fatal errors in /sys/");
+		err = -1;
+		goto close_dev;
+	}
+
+	snprintf(path, 512, "/sys/class/nvme/%s/device/aer_dev_fatal", chr_dev);
+	fd = open(path, O_RDONLY);
+	if (fd < 0) {
+		perror("Could not open PCIe AER Fatal errors in /sys/");
+		err = errno;
+		goto close_dev;
+	}
+
+	len = read(fd, path, 512);
+	if (len < 1) {
+		perror("Could not read PCIe AER Fatal errors in /sys/");
+		close(fd);
+		err = errno;
+		goto close_dev;
+	}
+	close(fd);
+	len = sscanf(path, "%*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d %*s %*d TOTAL_ERR_FATAL %d", &pcie_fatal);
+	if (len < 1) {
+		perror("Could not parse PCIe AER Fatal errors in /sys/");
+		close(fd);
+		err = -1;
+		goto close_dev;
+	}
+
+	snprintf(pcie_status, 9, "%s", (pcie_fatal != 0 || pcie_nonfatal != 0 || pcie_correctable != 0) ? "Warning":"Good");
+
+	//Populate id-ctrl
+	err = nvme_identify_ctrl(dev_fd(dev), &id_ctrl);
+	if (err) {
+		fprintf(stderr, "Unable to read nvme_identify_ctrl() error code:%x\n", err);
+		goto close_dev;
+	}
+	//Re-format specific fields so they can be safely treated as strings later
+	serial_number[20] = '\0';
+	memcpy(serial_number, id_ctrl.sn, 20);
+	model_number[40] = '\0';
+	memcpy(model_number, id_ctrl.mn, 40);
+	firmware_revision[8] = '\0';
+	memcpy(firmware_revision, id_ctrl.fr, 8);
+
+	//Populate SMART log (0x02)
+	err = nvme_cli_get_log_smart(dev, NVME_NSID_ALL, false, &smart_log);
+	if (err < 0) {
+		perror("Could not read SMART log (0x02)");
+		err = errno;
+		goto close_dev;
+	} else if (err > 0) {
+		nvme_show_status(err);
+		goto close_dev;
+	}
+
+	snprintf(temperature, 10, "%li", kelvin_to_celsius(smart_log.temperature[1]<<8 | smart_log.temperature[0]));
+
+	//Populate SFX Extended Health log (0xC2) or if PCIe DID ==0x20 (Quince) use 0xD2
+	if (strncmp("0x0020", pci_did, 6) == 0)
+		err = nvme_get_log_simple(dev_fd(dev), SFX_LOG_EXTENDED_HEALTH_ALT, sizeof(sfx_smart), (void *)&sfx_smart);
+	else
+		err = nvme_get_log_simple(dev_fd(dev), SFX_LOG_EXTENDED_HEALTH, sizeof(sfx_smart), (void *)&sfx_smart);
+	if (err < 0) {
+		perror("Could not read ScaleFlux SMART log");
+		err = errno;
+		goto close_dev;
+	} else if (err > 0) {
+		nvme_show_status(err);
+		goto close_dev;
+	}
+
+	//Make sure the OPN can be printed safely
+	sfx_smart.opn[10] = '\0';
+
+	switch (sfx_smart.opn[3]) {
+	case 'P':
+		snprintf(form_factor, 15, "%s", "AIC");
+		break;
+	case 'U':
+		snprintf(form_factor, 15, "%s", (sfx_smart.opn[4] == '8')?"U.3":"U.2");
+		break;
+	case 'E':
+		snprintf(form_factor, 15, "%s", "E1.S");
+		break;
+	default:
+		snprintf(form_factor, 15, "%s", "Incorrect OPN");
+	}
+
+	//Populate Additional SMART log (0xCA)
+	err = nvme_get_nsid_log(dev_fd(dev), false, 0xca, NVME_NSID_ALL, sizeof(struct nvme_additional_smart_log), (void *)&additional_smart_log);
+	if (err < 0) {
+		perror("Could not read ScaleFlux SMART log");
+		err = errno;
+		goto close_dev;
+	} else if (err > 0) {
+		nvme_show_status(err);
+		goto close_dev;
+	}
+
+	//OK with the '-nan' if host_bytes_written is zero
+	write_amp = int48_to_long(additional_smart_log.nand_bytes_written.raw)/(1.0 * int48_to_long(additional_smart_log.host_bytes_written.raw));
+
+	//Get SFX freespace information
+	err = nvme_query_cap(dev_fd(dev), NVME_NSID_ALL, sizeof(sfx_freespace), &sfx_freespace);
+	if (err < 0) {
+		perror("Could not query freespace information (0xD6)");
+		err = errno;
+		goto close_dev;
+	} else if (err > 0) {
+		nvme_show_status(err);
+		goto close_dev;
+	}
+
+	//Parse IO Speed information
+	memset(&io_speed, 0, 15);
+	switch (sfx_smart.io_speed) {
+	case '1':
+		if (strncmp("0x0020", pci_did, 6))
+			strncpy(io_speed, "2.5MB/s", 15);
+		else
+			strncpy(io_speed, "10MB/s", 15);
+		break;
+	case '2':
+		if (strncmp("0x0020", pci_did, 6))
+			strncpy(io_speed, "128KB/s", 15);
+		else
+			strncpy(io_speed, "512KB/s", 15);
+		break;
+	case '3':
+		strncpy(io_speed, "Write Reject", 15);
+		break;
+	default:
+		strncpy(io_speed, "Normal", 15);
+	}
+
+	if (sfx_smart.comp_ratio < 100)
+		sfx_smart.comp_ratio = 100;
+	else if (sfx_smart.comp_ratio > 800)
+		sfx_smart.comp_ratio = 800;
+
+	//Get status of atomic write feature
+	get_feat_args.args_size	= sizeof(get_feat_args);
+	get_feat_args.fid		= 0x0A;
+	get_feat_args.timeout	= NVME_DEFAULT_IOCTL_TIMEOUT;
+	get_feat_args.result	= &get_feat_result;
+	err =  nvme_cli_get_features(dev, &get_feat_args);
+	if (err < 0) {
+		perror("Could not get feature (0x0A)");
+		err = errno;
+		goto close_dev;
+	} else if (err > 0) {
+		nvme_show_status(err);
+		goto close_dev;
+	}
+
+	if (cfg.json) {
+		root = json_create_object();
+		json_object_add_value_string(root, "ScaleFlux Status", dev->name);
+
+		dev_stats = json_create_object();
+		link_stats = json_create_object();
+		crit_stats = json_create_object();
+
+		json_object_add_value_string(dev_stats, "PCIe Vendor ID", pci_vid);
+		json_object_add_value_string(dev_stats, "PCIe Subsystem Vendor ID", pci_ssvid);
+		json_object_add_value_string(dev_stats, "Manufacturer", vendor);
+		json_object_add_value_string(dev_stats, "Model", model_number);
+		json_object_add_value_string(dev_stats, "Serial Number", serial_number);
+		json_object_add_value_string(dev_stats, "OPN", (char *)sfx_smart.opn);
+		json_object_add_value_string(dev_stats, "Drive Type", form_factor);
+		json_object_add_value_string(dev_stats, "Firmware Revision", firmware_revision);
+		json_object_add_value_string(dev_stats, "Temperature [C]", temperature);
+		json_object_add_value_uint(dev_stats, "Power Consumption [mW]", sfx_smart.power_mw_consumption);
+		json_object_add_value_uint(dev_stats, "Atomic Write Mode", (get_feat_result));
+		json_object_add_value_int(dev_stats, "Percentage Used", smart_log.percent_used);
+		json_object_add_value_string(dev_stats, "Data Read", uint128_t_to_si_string(le128_to_cpu(smart_log.data_units_read), 1000 * 512));
+		json_object_add_value_string(dev_stats, "Data Written", uint128_t_to_si_string(le128_to_cpu(smart_log.data_units_written), 1000 * 512));
+		json_object_add_value_int(dev_stats, "Correctable Error Count", sfx_smart.pcie_rx_correct_errs);
+		json_object_add_value_int(dev_stats, "Uncorrectable Error Count", sfx_smart.pcie_rx_uncorrect_errs);
+		json_object_add_value_string(link_stats, "PCIe Link Width", link_width);
+		json_object_add_value_string(link_stats, "PCIe Link Speed", link_speed);
+		json_object_add_value_int(link_stats, "PCIe Link Fatal Errors", pcie_fatal);
+		json_object_add_value_int(link_stats, "PCIe Link Non-Fatal Errors", pcie_nonfatal);
+		json_object_add_value_int(link_stats, "PCIe Link Correctable Errors", pcie_correctable);
+		json_object_add_value_string(link_stats, "PCIe Device Status", pcie_status);
+		json_object_add_value_object(dev_stats, "PCIe Link Status",	link_stats);
+		if (sfx_smart.friendly_changecap_support) {
+			json_object_add_value_int(dev_stats, "Current Formatted Capacity [GB]", sfx_smart.cur_formatted_capability);
+			json_object_add_value_int(dev_stats, "Max Formatted Capacity [GB]", sfx_smart.max_formatted_capability);
+			json_object_add_value_int(dev_stats, "Extendible Capacity LBA count", sfx_smart.extendible_cap_lbacount);
+		} else if (capacity_valid)
+			json_object_add_value_int(dev_stats, "Formatted  Capacity [GB]",	capacity);
+
+		json_object_add_value_int(dev_stats, "Provisioned Capacity [GB]",	IDEMA_CAP2GB(sfx_smart.total_physical_capability));
+		json_object_add_value_int(dev_stats, "Compression Ratio", sfx_smart.comp_ratio);
+		json_object_add_value_int(dev_stats, "Physical Used Ratio",	sfx_smart.physical_usage_ratio);
+		json_object_add_value_int(dev_stats, "Free Physical Space [GB]", IDEMA_CAP2GB(sfx_smart.free_physical_capability));
+		json_object_add_value_int(dev_stats, "Firmware RSA Verification",	(sfx_smart.otp_rsa_en));
+		json_object_add_value_string(dev_stats, "IO Speed",	io_speed);
+		json_object_add_value_string(dev_stats,	"NUMA Node", numa_node);
+		json_object_add_value_int(dev_stats, "Indirection Unit [kiB]",			(4*sfx_freespace.map_unit));
+		json_object_add_value_double(dev_stats, "Lifetime WAF", write_amp);
+
+		json_object_add_value_int(crit_stats, "Thermal Throttling On", (sfx_smart.temp_throttle_info));
+		json_object_add_value_int(crit_stats, "Backup Capacitor Status Bad", (smart_log.critical_warning & 0x10));
+		json_object_add_value_int(crit_stats, "Bad block exceeds threshold", (smart_log.critical_warning & 0x01));
+		json_object_add_value_int(crit_stats, "Media Error", (smart_log.critical_warning & 0x04));
+		json_object_add_value_int(crit_stats, "Read only mode", (smart_log.critical_warning & 0x08));
+		json_object_add_value_int(crit_stats, "Power Failure Data Loss", (sfx_smart.sfx_critical_warning & SFX_CRIT_PWR_FAIL_DATA_LOSS));
+		json_object_add_value_int(crit_stats, "Exceed physical capacity limitation", (sfx_smart.sfx_critical_warning & SFX_CRIT_OVER_CAP));
+		json_object_add_value_int(crit_stats, "Read/Write lock mode", (sfx_smart.sfx_critical_warning & SFX_CRIT_RW_LOCK));
+
+		json_object_add_value_object(dev_stats, "Critical Warning(s)", crit_stats);
+
+		json_object_add_value_object(root, "Device stats", dev_stats);
+
+		json_print_object(root, NULL);
+		printf("\n");
+		json_free_object(root);
+
+	} else {
+		// Re-using path variable to hold critical warning text
+		//    order is to match sfx-status, done here to include color
+		memset(path, 0, 512);
+		len = snprintf(path, 512, FMT_RED "\n%s%s%s%s%s%s%s%s" FMT_RESET, \
+		(sfx_smart.temp_throttle_info)			? "\tThermal Throttling On\n"				: "", \
+		(smart_log.critical_warning		& 0x10)	? "\tBackup Capacitor Status Bad\n"			: "", \
+		(smart_log.critical_warning		& 0x01)	? "\tBad block exceeds threshold\n"			: "", \
+		(smart_log.critical_warning		& 0x04)	? "\tMedia Error\n"							: "", \
+		(smart_log.critical_warning		& 0x08)	? "\tRead only mode\n"						: "", \
+		(sfx_smart.sfx_critical_warning & SFX_CRIT_PWR_FAIL_DATA_LOSS)	? "\tPower Failure Data Loss\n"				: "", \
+		(sfx_smart.sfx_critical_warning & SFX_CRIT_OVER_CAP)	? "\tExceed physical capacity limitation\n" : "", \
+		(sfx_smart.sfx_critical_warning & SFX_CRIT_RW_LOCK)	? "\tRead/Write lock mode\n"				: "" \
+		);
+		if (len < 11)
+			strcpy(path, "None");
+
+		printf("%-35s%s%s\n",	"ScaleFlux Drive:",					"/dev/", dev->name);
+		printf("%-35s%s\n",		"PCIe Vendor ID:",				pci_vid);
+		printf("%-35s%s\n",		"PCIe Subsystem Vendor ID:",	pci_ssvid);
+		printf("%-35s%s\n",		"Manufacturer:",				vendor);
+		printf("%-35s%.*s\n",	"Model:", 40,					model_number);
+		printf("%-35s%.*s\n",	"Serial Number:", 20,			serial_number);
+		printf("%-35s%.*s\n",	"OPN:", 32,						sfx_smart.opn);
+		printf("%-35s%s\n",		"Drive Type:",					form_factor);
+		printf("%-35s%.*s\n",	"Firmware Revision:", 8,		firmware_revision);
+		printf("%-35s%s C\n",	"Temperature:",					temperature);
+		printf("%-35s%i mW\n",	"Power Consumption:",			sfx_smart.power_mw_consumption);
+		printf("%-35s%s\n",		"Atomic Write mode:",			(get_feat_result)?"Off":"On");
+		printf("%-35s%u%%\n",	"Percentage Used:",				smart_log.percent_used);
+		printf("%-35s%s\n",		"Host Data Read:",					uint128_t_to_si_string( le128_to_cpu( \
+																	smart_log.data_units_read), 1000 * 512));
+		printf("%-35s%s\n",		"Host Data Written:",				uint128_t_to_si_string(le128_to_cpu( \
+																	smart_log.data_units_written), 1000 * 512));
+																	write_amp = int48_to_long(additional_smart_log.nand_bytes_written.raw)/(1.0 * int48_to_long(additional_smart_log.host_bytes_written.raw));
+		printf("%-35s%i\n",		"Correctable Error Cnt:",		sfx_smart.pcie_rx_correct_errs);
+		printf("%-35s%i\n",		"Uncorrectable Error Cnt:",		sfx_smart.pcie_rx_uncorrect_errs);
+		printf("%-35s%s\n",		"PCIe Link Status:",			link_string);
+		printf("%-35s%s\n",		"PCIe Device Status:",			pcie_status);
+		if (sfx_smart.friendly_changecap_support) {
+			printf("%-35s%"PRIu64" GB\n", "Current Formatted Capacity:",
+			       (uint64_t)sfx_smart.cur_formatted_capability);
+			printf("%-35s%"PRIu64" GB\n", "Max Formatted Capacity:",
+			       (uint64_t)sfx_smart.max_formatted_capability);
+			printf("%-35s%"PRIu64"\n", "Extendible Capacity LBA count:",
+			       (uint64_t)sfx_smart.extendible_cap_lbacount);
+		} else if (capacity_valid) {
+			printf("%-35s%"PRIu64" GB\n", "Formatted  Capacity:", (uint64_t)capacity);
+		}
+		printf("%-35s%"PRIu64" GB\n", "Provisioned Capacity:",
+		       (uint64_t)IDEMA_CAP2GB(sfx_smart.total_physical_capability));
+		printf("%-35s%u%%\n",	"Compression Ratio:",			sfx_smart.comp_ratio);
+		printf("%-35s%u%%\n",	"Physical Used Ratio:",			sfx_smart.physical_usage_ratio);
+		printf("%-35s%"PRIu64" GB\n", "Free Physical Space:",
+		       (uint64_t)IDEMA_CAP2GB(sfx_smart.free_physical_capability));
+		printf("%-35s%s\n",		"Firmware Verification:",					(sfx_smart.otp_rsa_en) ? "On":"Off");
+		printf("%-35s%s\n",		"IO Speed:",					io_speed);
+		printf("%-35s%s\n",		"NUMA Node:",					numa_node);
+		printf("%-35s%"PRIu64"K\n", "Indirection Unit:",
+		       (uint64_t)(4*sfx_freespace.map_unit));
+		printf("%-35s%.2f\n",	"Lifetime WAF:",				write_amp);
+		printf("%-35s%s\n",		"Critical Warning(s):",			path);
+	}
+
+close_dev:
+	dev_close(dev);
+ret:
+	return err;
+}
diff --git a/plugins/scaleflux/sfx-nvme.h b/plugins/scaleflux/sfx-nvme.h
index 53e2217..b5a7db4 100644
--- a/plugins/scaleflux/sfx-nvme.h
+++ b/plugins/scaleflux/sfx-nvme.h
@@ -18,6 +18,7 @@ PLUGIN(NAME("sfx", "ScaleFlux vendor specific extensions", NVME_VERSION),
 		ENTRY("get-feature", "Get a feature", sfx_get_feature)
 		ENTRY("dump-evtlog", "dump evtlog into file and parse warning & error log", sfx_dump_evtlog)
 		ENTRY("expand-cap", "expand the last namespace capacity lossless", sfx_expand_cap)
+		ENTRY("status", "Retrieve the ScaleFlux status output, show it", sfx_status)
 	)
 );
 
diff --git a/plugins/scaleflux/sfx-types.h b/plugins/scaleflux/sfx-types.h
new file mode 100644
index 0000000..491d871
--- /dev/null
+++ b/plugins/scaleflux/sfx-types.h
@@ -0,0 +1,189 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+
+#include <inttypes.h>
+
+#define FMT_RED     "\x1b[31m"
+#define FMT_GREEN   "\x1b[32m"
+#define FMT_YELLOW  "\x1b[33m"
+#define FMT_BLUE    "\x1b[34m"
+#define FMT_RESET   "\x1b[0m"
+
+
+enum {
+	SFX_LOG_LATENCY_READ_STATS  = 0xc1,
+	SFX_LOG_EXTENDED_HEALTH     = 0xc2,
+	SFX_LOG_LATENCY_WRITE_STATS = 0xc3,
+	SFX_LOG_QUAL                = 0xc4,
+	SFX_LOG_MISMATCHLBA         = 0xc5,
+	SFX_LOG_MEDIA               = 0xc6,
+	SFX_LOG_BBT                 = 0xc7,
+	SFX_LOG_IDENTIFY            = 0xcc,
+	SFX_FEAT_ATOMIC             = 0x01,
+	SFX_FEAT_UP_P_CAP           = 0xac,
+	SFX_LOG_EXTENDED_HEALTH_ALT = 0xd2,
+	SFX_FEAT_CLR_CARD           = 0xdc,
+};
+
+enum {
+	SFX_CRIT_PWR_FAIL_DATA_LOSS = 0x01,
+	SFX_CRIT_OVER_CAP           = 0x02,
+	SFX_CRIT_RW_LOCK            = 0x04,
+};
+
+enum sfx_nvme_admin_opcode {
+	nvme_admin_query_cap_info   = 0xd3,
+	nvme_admin_change_cap       = 0xd4,
+	nvme_admin_sfx_set_features = 0xd5,
+	nvme_admin_sfx_get_features = 0xd6,
+};
+
+struct sfx_freespace_ctx {
+	__u64 free_space;
+	__u64 phy_cap;      /* physical capacity, in unit of sector */
+	__u64 phy_space;    /* physical space considering OP, in unit of sector */
+	__u64 user_space;   /* user required space, in unit of sector*/
+	__u64 hw_used;      /* hw space used in 4K */
+	__u64 app_written;  /* app data written in 4K */
+	__u64 out_of_space;
+	__u64 map_unit;
+	__u64 max_user_space;
+	__u64 extendible_user_cap_lba_count;
+	__u64 friendly_change_cap_support;
+};
+
+struct nvme_capacity_info {
+	__u64 lba_sec_sz;
+	__u64 phy_sec_sz;
+	__u64 used_space;
+	__u64 free_space;
+};
+
+struct __packed nvme_additional_smart_log_item {
+	__u8            key;
+	__u8            _kp[2];
+	__u8            norm;
+	__u8            _np;
+	union __packed {
+		__u8        raw[6];
+		struct __packed  wear_level {
+			__le16    min;
+			__le16    max;
+			__le16    avg;
+		} wear_level;
+		struct __packed thermal_throttle {
+			__u8    pct;
+			__u32    count;
+		} thermal_throttle;
+	};
+	__u8            _rp;
+};
+
+struct __packed sfx_lat_stats_vanda {
+	__u16    maj;
+	__u16    min;
+	__u32     bucket_1[32];    /* 0~1ms, step 32us */
+	__u32     bucket_2[31];    /* 1~32ms, step 1ms */
+	__u32     bucket_3[31];    /* 32ms~1s, step 32ms */
+	__u32     bucket_4[1];     /* 1s~2s, specifically 1024ms~2047ms */
+	__u32     bucket_5[1];     /* 2s~4s, specifically 2048ms~4095ms */
+	__u32     bucket_6[1];     /* 4s+, specifically 4096ms+ */
+};
+
+struct __packed sfx_lat_stats_myrtle {
+	__u16    maj;
+	__u16    min;
+	__u32     bucket_1[64]; /* 0us~63us, step 1us */
+	__u32     bucket_2[64]; /* 63us~127us, step 1us */
+	__u32     bucket_3[64]; /* 127us~255us, step 2us */
+	__u32     bucket_4[64]; /* 255us~510us, step 4us */
+	__u32     bucket_5[64]; /* 510us~1.02ms step 8us */
+	__u32     bucket_6[64]; /* 1.02ms~2.04ms step 16us */
+	__u32    bucket_7[64];  /* 2.04ms~4.08ms step 32us */
+	__u32    bucket_8[64];  /* 4.08ms~8.16ms step 64us */
+	__u32    bucket_9[64];  /* 8.16ms~16.32ms step 128us */
+	__u32    bucket_10[64]; /* 16.32ms~32.64ms step 256us */
+	__u32    bucket_11[64]; /* 32.64ms~65.28ms step 512us */
+	__u32    bucket_12[64]; /* 65.28ms~130.56ms step 1.024ms */
+	__u32    bucket_13[64]; /* 130.56ms~261.12ms step 2.048ms */
+	__u32    bucket_14[64]; /* 261.12ms~522.24ms step 4.096ms */
+	__u32    bucket_15[64]; /* 522.24ms~1.04s step 8.192ms */
+	__u32    bucket_16[64]; /* 1.04s~2.09s step 16.384ms */
+	__u32    bucket_17[64]; /* 2.09s~4.18s step 32.768ms */
+	__u32    bucket_18[64]; /* 4.18s~8.36s step 65.536ms */
+	__u32    bucket_19[64]; /* 8.36s~ step 131.072ms */
+	__u64    average;       /* average latency statistics */
+};
+
+
+struct __packed sfx_lat_status_ver {
+	__u16 maj;
+	__u16 min;
+};
+
+struct sfx_lat_stats {
+	union {
+		struct sfx_lat_status_ver   ver;
+		struct sfx_lat_stats_vanda  vanda;
+		struct sfx_lat_stats_myrtle myrtle;
+	};
+};
+
+struct nvme_additional_smart_log {
+	struct nvme_additional_smart_log_item program_fail_cnt;
+	struct nvme_additional_smart_log_item erase_fail_cnt;
+	struct nvme_additional_smart_log_item wear_leveling_cnt;
+	struct nvme_additional_smart_log_item e2e_err_cnt;
+	struct nvme_additional_smart_log_item crc_err_cnt;
+	struct nvme_additional_smart_log_item timed_workload_media_wear;
+	struct nvme_additional_smart_log_item timed_workload_host_reads;
+	struct nvme_additional_smart_log_item timed_workload_timer;
+	struct nvme_additional_smart_log_item thermal_throttle_status;
+	struct nvme_additional_smart_log_item retry_buffer_overflow_cnt;
+	struct nvme_additional_smart_log_item pll_lock_loss_cnt;
+	struct nvme_additional_smart_log_item nand_bytes_written;
+	struct nvme_additional_smart_log_item host_bytes_written;
+	struct nvme_additional_smart_log_item raid_recover_cnt;
+			/* errors which can be recovered by RAID */
+	struct nvme_additional_smart_log_item prog_timeout_cnt;
+	struct nvme_additional_smart_log_item erase_timeout_cnt;
+	struct nvme_additional_smart_log_item read_timeout_cnt;
+	struct nvme_additional_smart_log_item read_ecc_cnt; /* retry cnt */
+	struct nvme_additional_smart_log_item non_media_crc_err_cnt;
+	struct nvme_additional_smart_log_item compression_path_err_cnt;
+	struct nvme_additional_smart_log_item out_of_space_flag;
+	struct nvme_additional_smart_log_item physical_usage_ratio;
+	struct nvme_additional_smart_log_item grown_bb; /* grown bad block */
+};
+
+
+struct __packed extended_health_info_myrtle {
+	__u32            soft_read_recoverable_errs;
+	__u32            flash_die_raid_recoverable_errs;
+	__u32            pcie_rx_correct_errs;
+	__u32            pcie_rx_uncorrect_errs;
+	__u32            data_read_from_flash;
+	__u32            data_write_to_flash;
+	__u32            temp_throttle_info;// bit0: 0--> normal, 1 --> throttled
+										// bit 31:1 --> throttle events count, resets on power cycle
+	__u32            power_consumption;
+	__u32            pf_bbd_read_cnt;
+	__u32            sfx_critical_warning;
+	__u32            raid_recovery_total_count;
+	__u32            rsvd;
+	__u8             opn[32];
+	__u64            total_physical_capability;
+	__u64            free_physical_capability;
+	__u32            physical_usage_ratio;
+	__u32            comp_ratio;
+	__u32            otp_rsa_en;
+	__u32            power_mw_consumption;
+	__u32            io_speed;
+	__u64            max_formatted_capability;
+	__u32            map_unit;
+	__u64            extendible_cap_lbacount;
+	__u32            friendly_changecap_support;
+	__u32            rvd1;
+	__u64            cur_formatted_capability;
+};
+
+
diff --git a/plugins/seagate/seagate-nvme.c b/plugins/seagate/seagate-nvme.c
index 887e5bc..96bbbb6 100644
--- a/plugins/seagate/seagate-nvme.c
+++ b/plugins/seagate/seagate-nvme.c
@@ -1078,6 +1078,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin
 	int index;
 	const char *desc = "Retrieve Seagate Temperature Stats information for the given device ";
 	const char *output_format = "output in binary format";
+	nvme_print_flags_t flags;
 	unsigned int temperature = 0, PcbTemp = 0, SocTemp = 0, scCurrentTemp = 0, scMaxTemp = 0;
 	unsigned long long maxTemperature = 0, MaxSocTemp = 0;
 	struct nvme_dev *dev;
@@ -1100,7 +1101,13 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin
 		return -1;
 	}
 
-	if (strcmp(cfg.output_format, "json"))
+	err = validate_output_format(cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (flags & NORMAL)
 		printf("Seagate Temperature Stats Information :\n");
 	/*STEP-1 : Get Current Temperature from SMART */
 	err = nvme_get_log_smart(dev_fd(dev), 0xffffffff, false, &smart_log);
@@ -1111,7 +1118,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin
 		PcbTemp = PcbTemp ? PcbTemp - 273 : 0;
 		SocTemp = le16_to_cpu(smart_log.temp_sensor[1]);
 		SocTemp = SocTemp ? SocTemp - 273 : 0;
-		if (strcmp(cfg.output_format, "json")) {
+		if (flags & NORMAL) {
 			printf("%-20s : %u C\n", "Current Temperature", temperature);
 			printf("%-20s : %u C\n", "Current PCB Temperature", PcbTemp);
 			printf("%-20s : %u C\n", "Current SOC Temperature", SocTemp);
@@ -1126,14 +1133,14 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin
 			if (ExtdSMARTInfo.vendorData[index].AttributeNumber == VS_ATTR_ID_MAX_LIFE_TEMPERATURE) {
 				maxTemperature = smart_attribute_vs(ExtdSMARTInfo.Version, ExtdSMARTInfo.vendorData[index]);
 				maxTemperature = maxTemperature ? maxTemperature - 273 : 0;
-				if (strcmp(cfg.output_format, "json"))
+				if (flags & NORMAL)
 					printf("%-20s : %d C\n", "Highest Temperature", (unsigned int)maxTemperature);
 			}
 
 			if (ExtdSMARTInfo.vendorData[index].AttributeNumber == VS_ATTR_ID_MAX_SOC_LIFE_TEMPERATURE) {
 				MaxSocTemp = smart_attribute_vs(ExtdSMARTInfo.Version, ExtdSMARTInfo.vendorData[index]);
 				MaxSocTemp = MaxSocTemp ? MaxSocTemp - 273 : 0;
-				if (strcmp(cfg.output_format, "json"))
+				if (flags & NORMAL)
 					printf("%-20s : %d C\n", "Max SOC Temperature", (unsigned int)MaxSocTemp);
 			}
 		}
@@ -1155,7 +1162,7 @@ static int temp_stats(int argc, char **argv, struct command *cmd, struct plugin
 		printf("%-20s : %d C\n", "Super-cap Max Temperature", scMaxTemp);
 	}
 
-	if (!strcmp(cfg.output_format, "json"))
+	if (flags & JSON)
 		json_temp_stats(temperature, PcbTemp, SocTemp, maxTemperature, MaxSocTemp, cf_err, scCurrentTemp, scMaxTemp);
 
 	dev_close(dev);
@@ -1248,6 +1255,7 @@ static int vs_pcie_error_log(int argc, char **argv, struct command *cmd, struct
 	const char *desc = "Retrieve Seagate PCIe error counters for the given device ";
 	const char *output_format = "output in binary format";
 	int err;
+	nvme_print_flags_t flags;
 	struct config {
 		char *output_format;
 	};
@@ -1267,13 +1275,19 @@ static int vs_pcie_error_log(int argc, char **argv, struct command *cmd, struct
 		return -1;
 	}
 
-	if (strcmp(cfg.output_format, "json"))
+	err = validate_output_format(cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (flags & NORMAL)
 		printf("Seagate PCIe error counters Information :\n");
 
 	err = nvme_get_log_simple(dev_fd(dev), 0xCB,
 				  sizeof(pcieErrorLog), &pcieErrorLog);
 	if (!err) {
-		if (strcmp(cfg.output_format, "json"))
+		if (flags & NORMAL)
 			print_vs_pcie_error_log(pcieErrorLog);
 		else
 			json_vs_pcie_error_log(pcieErrorLog);
@@ -1386,6 +1400,7 @@ static int stx_vs_fw_activate_history(int argc, char **argv, struct command *cmd
 	const char *desc = "Retrieve FW Activate History for Seagate device ";
 	const char *output_format = "output in binary format";
 	int err;
+	nvme_print_flags_t flags;
 	struct config {
 		char *output_format;
 	};
@@ -1405,16 +1420,21 @@ static int stx_vs_fw_activate_history(int argc, char **argv, struct command *cmd
 		return -1;
 	}
 
-	if (strcmp(cfg.output_format, "json"))
+	err = validate_output_format(cfg.output_format, &flags);
+	if (err < 0) {
+		nvme_show_error("Invalid output format");
+		return err;
+	}
+
+	if (flags & NORMAL)
 		printf("Seagate FW Activation History Information :\n");
 
 	err = nvme_get_log_simple(dev_fd(dev), 0xC2, sizeof(fwActivHis), &fwActivHis);
 	if (!err) {
-		if (strcmp(cfg.output_format, "json"))
+		if (flags & NORMAL)
 			print_stx_vs_fw_activate_history(fwActivHis);
 		else
 			json_stx_vs_fw_activate_history(fwActivHis);
-
 	} else if (err > 0) {
 		nvme_show_status(err);
 	}
diff --git a/plugins/sed/sed.c b/plugins/sed/sed.c
index 0471e54..b4ac037 100644
--- a/plugins/sed/sed.c
+++ b/plugins/sed/sed.c
@@ -23,6 +23,12 @@ OPT_ARGS(no_opts) = {
 	OPT_END()
 };
 
+OPT_ARGS(init_opts) = {
+	OPT_FLAG("read-only", 'r', &sedopal_lock_ro,
+		 "Set locking range to read-only"),
+	OPT_END()
+};
+
 OPT_ARGS(key_opts) = {
 	OPT_FLAG("ask-key", 'k', &sedopal_ask_key,
 			"prompt for SED authentication key"),
@@ -36,6 +42,21 @@ OPT_ARGS(revert_opts) = {
 	OPT_END()
 };
 
+OPT_ARGS(lock_opts) = {
+	OPT_FLAG("read-only", 'r', &sedopal_lock_ro,
+		 "Set locking range to read-only"),
+	OPT_FLAG("ask-key", 'k', &sedopal_ask_key,
+			"prompt for SED authentication key"),
+	OPT_END()
+};
+
+OPT_ARGS(discovery_opts) = {
+	OPT_FLAG("verbose", 'v', &sedopal_discovery_verbose,
+		"Print extended discovery information"),
+	OPT_FLAG("udev", 'u', &sedopal_discovery_udev,
+		"Print locking information in form suitable for udev rules"),
+	OPT_END()
+};
 
 /*
  * Open the NVMe device specified on the command line. It must be the
@@ -67,7 +88,7 @@ static int sed_opal_discover(int argc, char **argv, struct command *cmd,
 	const char *desc = "Query SED device and display locking features";
 	struct nvme_dev *dev;
 
-	err = sed_opal_open_device(&dev, argc, argv, desc, no_opts);
+	err = sed_opal_open_device(&dev, argc, argv, desc, discovery_opts);
 	if (err)
 		return err;
 
@@ -84,12 +105,12 @@ static int sed_opal_initialize(int argc, char **argv, struct command *cmd,
 	const char *desc = "Initialize a SED device for locking";
 	struct nvme_dev *dev;
 
-	err = sed_opal_open_device(&dev, argc, argv, desc, no_opts);
+	err = sed_opal_open_device(&dev, argc, argv, desc, init_opts);
 	if (err)
 		return err;
 
 	err = sedopal_cmd_initialize(dev->direct.fd);
-	if (err != 0)
+	if ((err != 0) && (err != -EOPNOTSUPP))
 		fprintf(stderr, "initialize: SED error -  %s\n",
 				sedopal_error_to_text(err));
 
@@ -109,7 +130,7 @@ static int sed_opal_revert(int argc, char **argv, struct command *cmd,
 		return err;
 
 	err = sedopal_cmd_revert(dev->direct.fd);
-	if (err != 0)
+	if ((err != 0) && (err != -EOPNOTSUPP))
 		fprintf(stderr, "revert: SED error -  %s\n",
 				sedopal_error_to_text(err));
 
@@ -124,12 +145,12 @@ static int sed_opal_lock(int argc, char **argv, struct command *cmd,
 	const char *desc = "Lock a SED device";
 	struct nvme_dev *dev;
 
-	err = sed_opal_open_device(&dev, argc, argv, desc, key_opts);
+	err = sed_opal_open_device(&dev, argc, argv, desc, lock_opts);
 	if (err)
 		return err;
 
 	err = sedopal_cmd_lock(dev->direct.fd);
-	if (err != 0)
+	if ((err != 0) && (err != -EOPNOTSUPP))
 		fprintf(stderr, "lock: SED error -  %s\n",
 				sedopal_error_to_text(err));
 
@@ -144,12 +165,12 @@ static int sed_opal_unlock(int argc, char **argv, struct command *cmd,
 	const char *desc = "Unlock a SED device";
 	struct nvme_dev *dev;
 
-	err = sed_opal_open_device(&dev, argc, argv, desc, key_opts);
+	err = sed_opal_open_device(&dev, argc, argv, desc, lock_opts);
 	if (err)
 		return err;
 
 	err = sedopal_cmd_unlock(dev->direct.fd);
-	if (err != 0)
+	if ((err != 0) && (err != -EOPNOTSUPP))
 		fprintf(stderr, "unlock: SED error -  %s\n",
 				sedopal_error_to_text(err));
 
diff --git a/plugins/sed/sedopal_cmd.c b/plugins/sed/sedopal_cmd.c
index 017649d..8d931b9 100644
--- a/plugins/sed/sedopal_cmd.c
+++ b/plugins/sed/sedopal_cmd.c
@@ -34,6 +34,46 @@ bool sedopal_destructive_revert;
  */
 bool sedopal_psid_revert;
 
+/*
+ * Lock read-only
+ */
+bool sedopal_lock_ro;
+
+/*
+ * Verbose discovery
+ */
+bool sedopal_discovery_verbose;
+
+/*
+ * discovery with udev output
+ */
+bool sedopal_discovery_udev;
+
+/*
+ * level 0 discovery buffer
+ */
+char level0_discovery_buf[4096];
+
+struct sedopal_feature_parser {
+	uint32_t	features;
+	void		*tper_desc;
+	void		*locking_desc;
+	void		*geometry_reporting_desc;
+	void		*opalv1_desc;
+	void		*single_user_mode_desc;
+	void		*datastore_desc;
+	void		*opalv2_desc;
+	void		*opalite_desc;
+	void		*pyrite_v1_desc;
+	void		*pyrite_v2_desc;
+	void		*ruby_desc;
+	void		*locking_lba_desc;
+	void		*block_sid_auth_desc;
+	void		*config_ns_desc;
+	void		*data_removal_desc;
+	void		*ns_geometry_desc;
+};
+
 /*
  * Map method status codes to error text
  */
@@ -170,6 +210,15 @@ int sedopal_cmd_initialize(int fd)
 	struct opal_lr_act lr_act = {};
 	struct opal_user_lr_setup lr_setup = {};
 	struct opal_new_pw new_pw = {};
+	uint8_t locking_state;
+
+	locking_state = sedopal_locking_state(fd);
+
+	if (locking_state & OPAL_FEATURE_LOCKING_ENABLED) {
+		fprintf(stderr,
+			"Error: cannot initialize an initialized drive\n");
+		return -EOPNOTSUPP;
+	}
 
 	sedopal_ask_key = true;
 	sedopal_ask_new_key = true;
@@ -206,7 +255,8 @@ int sedopal_cmd_initialize(int fd)
 	lr_setup.range_start = 0;
 	lr_setup.range_length = 0;
 	lr_setup.RLE = true;
-	lr_setup.WLE = true;
+	if (!sedopal_lock_ro)
+		lr_setup.WLE = true;
 
 	lr_setup.session.opal_key = key;
 	lr_setup.session.sum = 0;
@@ -242,8 +292,12 @@ int sedopal_cmd_initialize(int fd)
  */
 int sedopal_cmd_lock(int fd)
 {
+	int lock_state = OPAL_LK;
 
-	return sedopal_lock_unlock(fd, OPAL_LK);
+	if (sedopal_lock_ro)
+		lock_state = OPAL_RO;
+
+	return sedopal_lock_unlock(fd, lock_state);
 }
 
 /*
@@ -252,8 +306,12 @@ int sedopal_cmd_lock(int fd)
 int sedopal_cmd_unlock(int fd)
 {
 	int rc;
+	int lock_state = OPAL_RW;
 
-	rc = sedopal_lock_unlock(fd, OPAL_RW);
+	if (sedopal_lock_ro)
+		lock_state = OPAL_RO;
+
+	rc = sedopal_lock_unlock(fd, lock_state);
 
 	/*
 	 * If the unlock was successful, force a re-read of the
@@ -275,6 +333,15 @@ int sedopal_lock_unlock(int fd, int lock_state)
 {
 	int rc;
 	struct opal_lock_unlock opal_lu = {};
+	uint8_t locking_state;
+
+	locking_state = sedopal_locking_state(fd);
+
+	if (!(locking_state & OPAL_FEATURE_LOCKING_ENABLED)) {
+		fprintf(stderr,
+			"Error: cannot lock/unlock an uninitialized drive\n");
+		return -EOPNOTSUPP;
+	}
 
 	rc = sedopal_set_key(&opal_lu.session.opal_key);
 	if (rc != 0)
@@ -389,6 +456,21 @@ int sedopal_cmd_revert(int fd)
 	} else {
 #ifdef IOC_OPAL_REVERT_LSP
 		struct opal_revert_lsp revert_lsp;
+		uint8_t locking_state;
+
+		locking_state = sedopal_locking_state(fd);
+
+		if (!(locking_state & OPAL_FEATURE_LOCKING_ENABLED)) {
+			fprintf(stderr,
+				"Error: can't revert an uninitialized drive\n");
+			return -EOPNOTSUPP;
+		}
+
+		if (locking_state & OPAL_FEATURE_LOCKED) {
+			fprintf(stderr,
+				"Error: cannot revert drive while locked\n");
+			return -EOPNOTSUPP;
+		}
 
 		rc = sedopal_set_key(&revert_lsp.key);
 		if (rc != 0)
@@ -470,36 +552,462 @@ int sedopal_cmd_password(int fd)
 /*
  * Print the state of locking features.
  */
-void sedopal_print_locking_features(uint8_t features)
+void sedopal_print_locking_features(void *data)
 {
-	printf("Locking Features:\n");
-	printf("\tLocking Supported:         %s\n",
-		(features & OPAL_FEATURE_LOCKING_SUPPORTED) ? "Yes" : "No");
-	printf("\tLocking Feature Enabled:   %s\n",
-		(features & OPAL_FEATURE_LOCKING_ENABLED) ? "Yes" : "No");
-	printf("\tLocked:                    %s\n",
-		(features & OPAL_FEATURE_LOCKED) ? "Yes" : "No");
+	struct locking_desc *ld = (struct locking_desc *)data;
+	uint8_t features = ld->features;
+
+	if (!sedopal_discovery_udev) {
+		printf("Locking Features:\n");
+		printf("\tLocking Supported               : %s\n",
+			(features & OPAL_FEATURE_LOCKING_SUPPORTED) ?
+			"yes" : "no");
+		printf("\tLocking Feature Enabled         : %s\n",
+			(features & OPAL_FEATURE_LOCKING_ENABLED) ?
+			"yes" : "no");
+		printf("\tLocked                          : %s\n",
+			(features & OPAL_FEATURE_LOCKED) ? "yes" : "no");
+		printf("\tMedia Encryption                : %s\n",
+			(features & OPAL_FEATURE_MEDIA_ENCRYPT) ? "yes" : "no");
+		printf("\tMBR Enabled                     : %s\n",
+			(features & OPAL_FEATURE_MBR_ENABLED) ? "yes" : "no");
+		printf("\tMBR Done                        : %s\n",
+			(features & OPAL_FEATURE_MBR_DONE) ? "yes" : "no");
+	} else {
+		printf("DEV_SED_LOCKED=%s\n",
+			(features & OPAL_FEATURE_LOCKING_ENABLED) ?
+			"ENABLED" : "DISABLED");
+		printf("DEV_SED_LOCKING=%s\n",
+			(features & OPAL_FEATURE_LOCKING_ENABLED) ?
+			"ENABLED" : "DISABLED");
+		printf("DEV_SED_LOCKING_SUPP=%s\n",
+			(features & OPAL_FEATURE_LOCKING_SUPPORTED) ?
+			"ENABLED" : "DISABLED");
+		printf("DEV_SED_LOCKING_LOCKED=%s\n",
+			(features & OPAL_FEATURE_LOCKED) ?
+			"ENABLED" : "DISABLED");
+	}
 }
 
 /*
- * Query a drive to determine if it's SED Opal capable and
- * it's current locking status.
+ * Print the TPer feature.
  */
-int sedopal_cmd_discover(int fd)
+void sedopal_print_tper(void *data)
+{
+	struct tper_desc *td = (struct tper_desc *)data;
+
+	printf("\nSED TPER:\n");
+	printf("\tSync Supported                  : %s\n",
+		(td->feature & TPER_FEATURE_SYNC) ? "yes" : "no");
+	printf("\tAsync Supported                 : %s\n",
+		(td->feature & TPER_FEATURE_ASYNC) ? "yes" : "no");
+	printf("\tACK/NAK Supported               : %s\n",
+		(td->feature & TPER_FEATURE_ACKNAK) ? "yes" : "no");
+	printf("\tBuffer Management Supported     : %s\n",
+		(td->feature & TPER_FEATURE_BUF_MGMT) ? "yes" : "no");
+	printf("\tStreaming Supported             : %s\n",
+		(td->feature & TPER_FEATURE_STREAMING) ? "yes" : "no");
+	printf("\tComID Management Supported      : %s\n",
+		(td->feature & TPER_FEATURE_COMID_MGMT) ? "yes" : "no");
+}
+
+/*
+ * Print the Geometry feature.
+ */
+void sedopal_print_geometry(void *data)
+{
+	struct geometry_reporting_desc *gd;
+
+	gd = (struct geometry_reporting_desc *)data;
+
+	printf("\nSED Geometry:\n");
+	printf("\tAlignment Required              : %s\n",
+		(gd->align & GEOMETRY_ALIGNMENT_REQUIRED) ? "yes" : "no");
+	printf("\tLogical Block Size              : %u\n",
+		be32toh(gd->logical_block_size));
+	printf("\tAlignment Granularity           : %llx\n",
+		(unsigned long long)(be64toh(gd->alignment_granularity)));
+	printf("\tLowest Aligned LBA              : %llx\n",
+		(unsigned long long)(be64toh(gd->lowest_aligned_lba)));
+}
+
+/*
+ * Print the opal v1 feature.
+ */
+void sedopal_print_opal_v1(void *data)
+{
+	struct opalv1_desc *v1d = (struct opalv1_desc *)data;
+
+	printf("\nSED OPAL V1.0:\n");
+	printf("\tBase Comid                      : %d\n",
+		be16toh(v1d->base_comid));
+	printf("\tNumber of Comids                : %d\n",
+		be16toh(v1d->num_comids));
+}
+
+/*
+ * Print the opal v2 feature.
+ */
+void sedopal_print_opal_v2(void *data)
+{
+	struct opalv2_desc *v2d = (struct opalv2_desc *)data;
+
+	printf("\nSED OPAL V2.0:\n");
+	printf("\tRange Crossing                  : %d\n",
+		!(v2d->flags & OPAL_V2_RANGE_CROSSING));
+	printf("\tBase Comid                      : %d\n",
+		be16toh(v2d->base_comid));
+	printf("\tNumber of Comids                : %d\n",
+		be16toh(v2d->num_comids));
+	printf("\tNumber of Admin Authorities     : %d\n",
+		be16toh(v2d->num_locking_sp_admin_auth));
+	printf("\tNumber of User Authorities      : %d\n",
+		be16toh(v2d->num_locking_sp_user_auth));
+	printf("\tInit pin                        : %d\n",
+		v2d->initial_cpin_sid_ind);
+	printf("\tRevert pin                      : %d\n",
+		v2d->initial_cpin_sid_revert);
+}
+
+/*
+ * Print the ruby feature.
+ */
+void sedopal_print_ruby(void *data)
+{
+	struct ruby_desc *rd = (struct ruby_desc *)data;
+
+	printf("\nRuby:\n");
+	printf("\tRange Crossing                  : %d\n",
+		!(rd->flags & RUBY_RANGE_CROSSING));
+	printf("\tBase Comid                      : %d\n",
+		be16toh(rd->base_comid));
+	printf("\tNumber of Comids                : %d\n",
+		be16toh(rd->num_comids));
+	printf("\tNumber of Admin Authorities     : %d\n",
+		be16toh(rd->num_locking_sp_admin_auth));
+	printf("\tNumber of User Authorities      : %d\n",
+		be16toh(rd->num_locking_sp_user_auth));
+	printf("\tInit pin                        : %d\n",
+		rd->initial_cpin_sid_ind);
+	printf("\tRevert pin                      : %d\n",
+		rd->initial_cpin_sid_revert);
+}
+
+/*
+ * Print the opalite feature.
+ */
+void sedopal_print_opalite(void *data)
+{
+	struct opalite_desc *old = (struct opalite_desc *)data;
+
+	printf("\nSED Opalite:\n");
+	printf("\tBase Comid                      : %d\n",
+		be16toh(old->base_comid));
+	printf("\tNumber of Comids                : %d\n",
+		be16toh(old->num_comids));
+	printf("\tInit pin                        : %d\n",
+		old->initial_cpin_sid_ind);
+	printf("\tRevert pin                      : %d\n",
+		old->initial_cpin_sid_revert);
+}
+
+/*
+ * Print the pyrite v1 feature.
+ */
+void sedopal_print_pyrite_v1(void *data)
+{
+	struct pyrite_v1_desc *p1d = (struct pyrite_v1_desc *)data;
+
+	printf("\nPyrite V1:\n");
+	printf("\tBase Comid                      : %d\n",
+		be16toh(p1d->base_comid));
+	printf("\tNumber of Comids                : %d\n",
+		be16toh(p1d->num_comids));
+	printf("\tInit pin                        : %d\n",
+		p1d->initial_cpin_sid_ind);
+	printf("\tRevert pin                      : %d\n",
+		p1d->initial_cpin_sid_revert);
+}
+
+/*
+ * Print the pyrite v2 feature.
+ */
+void sedopal_print_pyrite_v2(void *data)
+{
+	struct pyrite_v2_desc *p2d = (struct pyrite_v2_desc *)data;
+
+	printf("\nPyrite V2:\n");
+	printf("\tBase Comid                      : %d\n",
+		be16toh(p2d->base_comid));
+	printf("\tNumber of Comids                : %d\n",
+		be16toh(p2d->num_comids));
+	printf("\tInit pin                        : %d\n",
+		p2d->initial_cpin_sid_ind);
+	printf("\tRevert pin                      : %d\n",
+		p2d->initial_cpin_sid_revert);
+}
+
+/*
+ * Print the single user mode feature.
+ */
+void sedopal_print_sum(void *data)
+{
+	struct single_user_mode_desc *sumd;
+
+	sumd = (struct single_user_mode_desc *)data;
+
+	printf("\nSingle User Mode (SUM):\n");
+	printf("\tNumber of Locking Objects       : %u\n",
+		be32toh(sumd->num_locking_objects));
+	printf("\tAny Locking Objects in SUM?     : %s\n",
+		(sumd->flags & SUM_FEATURE_ANY) ? "yes" : "no");
+	printf("\tAll Locking Objects in SUM?     : %s\n",
+		(sumd->flags & SUM_FEATURE_ALL) ? "yes" : "no");
+	printf("\tUser Authority of Objects       : %s\n",
+		(sumd->flags & SUM_FEATURE_POLICY) ? "yes" : "no");
+}
+
+/*
+ * Print the data store table feature.
+ */
+void sedopal_print_datastore(void *data)
+{
+	struct datastore_desc *dsd = (struct datastore_desc *)data;
+
+	printf("\nData Store Table:\n");
+	printf("\tNumber of Tables Supported      : %u\n",
+		be16toh(dsd->max_tables));
+	printf("\tMax Size of Tables              : %u\n",
+		be32toh(dsd->max_table_size));
+	printf("\tTable Size Alignment            : %u\n",
+		be32toh(dsd->table_alignment));
+}
+
+/*
+ * Print the block SID authentication feature.
+ */
+void sedopal_print_sid_auth(void *data)
+{
+	struct block_sid_auth_desc *sid_auth_d;
+
+	sid_auth_d = (struct block_sid_auth_desc *)data;
+
+	printf("\nSED Block SID Authentication:\n");
+	printf("\tSID value equal MSID            : %s\n",
+		(sid_auth_d->states & BLOCK_SID_VALUE_STATE) ? "yes" : "no");
+	printf("\tSID auth blocked                : %s\n",
+		(sid_auth_d->states & BLOCK_SID_BLOCKED_STATE) ? "yes" : "no");
+	printf("\tHW reset selected               : %s\n",
+		(sid_auth_d->hw_reset & BLOCK_SID_HW_RESET) ? "yes" : "no");
+}
+
+/*
+ * Print the Locking LBA Ranges Control feature
+ */
+void sedopal_print_locking_lba(void *data)
+{
+	/*
+	 * There currently isn't any definition of the level 0 content
+	 * of this feature, so defer any printing.
+	 */
+}
+
+/*
+ * Print the configurable namespace locking feature.
+ */
+void sedopal_print_config_ns(void *data)
+{
+	struct config_ns_desc *nsd = (struct config_ns_desc *)data;
+
+	printf("\nSED Configurable Namespace Locking:\n");
+	printf("\tNon-global Locking Support      : %s\n",
+		(nsd->flags & CONFIG_NS_RANGE_C) ? "yes" : "no");
+	printf("\tNon-global Lock objects exist   : %s\n",
+		(nsd->flags & CONFIG_NS_RANGE_P) ? "yes" : "no");
+	printf("\tMaximum Key Count               : %d\n",
+		be32toh(nsd->max_key_count));
+	printf("\tUnused Key Count                : %d\n",
+		be32toh(nsd->unused_key_count));
+}
+
+/*
+ * Print the data removal mechanism feature.
+ */
+void sedopal_print_data_removal(void *data)
+{
+	struct data_removal_desc *drd = (struct data_removal_desc *)data;
+
+	printf("\nSED Data Removal Mechanism:\n");
+	printf("\tRemoval Operation Processing    : %s\n",
+		(drd->flags & DATA_REMOVAL_OPER_PROCESSING) ? "yes" : "no");
+	printf("\tRemoval Operation Interrupted   : %s\n",
+		(drd->flags & DATA_REMOVAL_OPER_INTERRUPTED) ? "yes" : "no");
+	printf("\tData Removal Mechanism          : %x\n",
+		drd->removal_mechanism);
+	printf("\tData Removal Format             : %x\n",
+		drd->format);
+	printf("\tData Removal Time (Bit 0)       : %x\n",
+		be16toh(drd->time_mechanism_bit0));
+	printf("\tData Removal Time (Bit 1)       : %x\n",
+		be16toh(drd->time_mechanism_bit1));
+	printf("\tData Removal Time (Bit 2)       : %x\n",
+		be16toh(drd->time_mechanism_bit2));
+	printf("\tData Removal Time (Bit 5)       : %x\n",
+		be16toh(drd->time_mechanism_bit5));
+}
+
+/*
+ * Print the namespace geometry feature.
+ */
+void sedopal_print_ns_geometry(void *data)
+{
+	struct ns_geometry_desc *nsgd = (struct ns_geometry_desc *)data;
+
+	printf("\nSED Namespace Geometry:\n");
+	printf("\tAlignment Required              : %s\n",
+		(nsgd->align & NS_GEOMETRY_ALIGNMENT_REQUIRED) ? "yes" : "no");
+	printf("\tLogical Block Size              : %x\n",
+		be32toh(nsgd->logical_block_size));
+	printf("\tAlignment Granularity           : %llx\n",
+		(unsigned long long)(be64toh(nsgd->alignment_granularity)));
+	printf("\tLowest Aligned LBA              : %llx\n",
+		(unsigned long long)(be64toh(nsgd->lowest_aligned_lba)));
+}
+
+void sedopal_parse_features(struct level_0_discovery_features *feat,
+		struct sedopal_feature_parser *sfp)
+{
+	uint16_t code = be16toh(feat->code);
+
+	switch (code) {
+	case OPAL_FEATURE_CODE_LOCKING:
+		sfp->features |= OPAL_FEATURE_LOCKING;
+		sfp->locking_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_OPALV1:
+		sfp->features |= OPAL_FEATURE_OPALV1;
+		sfp->opalv1_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_OPALV2:
+		sfp->features |= OPAL_FEATURE_OPALV2;
+		sfp->opalv2_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_TPER:
+		sfp->features |= OPAL_FEATURE_TPER;
+		sfp->tper_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_GEOMETRY:
+		sfp->features |= OPAL_FEATURE_GEOMETRY;
+		sfp->geometry_reporting_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_SINGLE_USER_MODE:
+		sfp->features |= OPAL_FEATURE_SINGLE_USER_MODE;
+		sfp->single_user_mode_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_DATA_STORE:
+		sfp->features |= OPAL_FEATURE_DATA_STORE;
+		sfp->datastore_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_OPALITE:
+		sfp->features |= OPAL_FEATURE_OPALITE;
+		sfp->opalite_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_PYRITE_V1:
+		sfp->features |= OPAL_FEATURE_PYRITE_V1;
+		sfp->pyrite_v1_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_PYRITE_V2:
+		sfp->features |= OPAL_FEATURE_PYRITE_V2;
+		sfp->pyrite_v2_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_RUBY:
+		sfp->features |= OPAL_FEATURE_RUBY;
+		sfp->ruby_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_LOCKING_LBA:
+		sfp->features |= OPAL_FEATURE_LOCKING_LBA;
+		sfp->locking_lba_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_BLOCK_SID_AUTH:
+		sfp->features |= OPAL_FEATURE_BLOCK_SID_AUTH;
+		sfp->block_sid_auth_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_CONFIG_NS_LOCKING:
+		sfp->features |= OPAL_FEATURE_CONFIG_NS_LOCKING;
+		sfp->config_ns_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_DATA_REMOVAL:
+		sfp->features |= OPAL_FEATURE_DATA_REMOVAL;
+		sfp->data_removal_desc = (void *)(feat + 1);
+		break;
+	case OPAL_FEATURE_CODE_NS_GEOMETRY:
+		sfp->features |= OPAL_FEATURE_NS_GEOMETRY;
+		sfp->ns_geometry_desc = (void *)(feat + 1);
+		break;
+
+	default:
+		break;
+	}
+}
+
+void sedopal_print_features(struct sedopal_feature_parser *sfp)
+{
+	if (sfp->features & OPAL_FEATURE_OPALV1)
+		sedopal_print_opal_v1(sfp->opalv1_desc);
+
+	if (sfp->features & OPAL_FEATURE_OPALV2)
+		sedopal_print_opal_v2(sfp->opalv2_desc);
+
+	if (sfp->features & OPAL_FEATURE_TPER)
+		sedopal_print_tper(sfp->tper_desc);
+
+	if (sfp->features & OPAL_FEATURE_GEOMETRY)
+		sedopal_print_geometry(sfp->geometry_reporting_desc);
+
+	if (sfp->features & OPAL_FEATURE_OPALITE)
+		sedopal_print_opalite(sfp->opalite_desc);
+
+	if (sfp->features & OPAL_FEATURE_SINGLE_USER_MODE)
+		sedopal_print_sum(sfp->single_user_mode_desc);
+
+	if (sfp->features & OPAL_FEATURE_DATA_STORE)
+		sedopal_print_datastore(sfp->datastore_desc);
+
+	if (sfp->features & OPAL_FEATURE_BLOCK_SID_AUTH)
+		sedopal_print_sid_auth(sfp->block_sid_auth_desc);
+
+	if (sfp->features & OPAL_FEATURE_RUBY)
+		sedopal_print_ruby(sfp->ruby_desc);
+
+	if (sfp->features & OPAL_FEATURE_PYRITE_V1)
+		sedopal_print_pyrite_v1(sfp->pyrite_v1_desc);
+
+	if (sfp->features & OPAL_FEATURE_PYRITE_V2)
+		sedopal_print_pyrite_v2(sfp->pyrite_v2_desc);
+
+	if (sfp->features & OPAL_FEATURE_LOCKING_LBA)
+		sedopal_print_locking_lba(sfp->locking_lba_desc);
+
+	if (sfp->features & OPAL_FEATURE_CONFIG_NS_LOCKING)
+		sedopal_print_config_ns(sfp->config_ns_desc);
+
+	if (sfp->features & OPAL_FEATURE_NS_GEOMETRY)
+		sedopal_print_ns_geometry(sfp->ns_geometry_desc);
+}
+
+/*
+ * Query a drive to retrieve it's level 0 features.
+ */
+int sedopal_discover_device(int fd, struct level_0_discovery_features **feat,
+		struct level_0_discovery_features **feat_end)
 {
 #ifdef IOC_OPAL_DISCOVERY
-	int rc, feat_length;
-	bool sedopal_locking_supported = false;
+	int rc;
 	struct opal_discovery discover;
 	struct level_0_discovery_header *dh;
-	struct level_0_discovery_features *feat;
-	struct level_0_discovery_features *feat_end;
-	uint16_t code;
-	uint8_t locking_flags = 0;
-	char buf[4096];
 
-	discover.data = (__u64)buf;
-	discover.size = sizeof(buf);
+	discover.data = (uintptr_t)level0_discovery_buf;
+	discover.size = sizeof(level0_discovery_buf);
 
 	rc = ioctl(fd, IOC_OPAL_DISCOVERY, &discover);
 	if (rc < 0) {
@@ -513,41 +1021,89 @@ int sedopal_cmd_discover(int fd)
 	 *
 	 * TCG Opal Specification v2.0.2 section 3.1.1
 	 */
-	dh = (struct level_0_discovery_header *)buf;
-	feat = (struct level_0_discovery_features *)(dh + 1);
-	feat_end = (struct level_0_discovery_features *)
-		(buf + be32toh(dh->parameter_length));
+	dh = (struct level_0_discovery_header *)level0_discovery_buf;
+	*feat = (struct level_0_discovery_features *)(dh + 1);
+	*feat_end = (struct level_0_discovery_features *)
+		(level0_discovery_buf + be32toh(dh->parameter_length));
 
-	/*
-	 * iterate through all the features that were returned
-	 */
-	while (feat < feat_end) {
-		code = be16toh(feat->code);
-		feat_length = feat->length + 4 /* hdr */;
-		switch (code) {
-		case OPAL_FEATURE_CODE_LOCKING:
-			locking_flags = feat->feature;
-			break;
-		case OPAL_FEATURE_CODE_OPALV2:
-			sedopal_locking_supported = true;
-			break;
-		default:
-			break;
-		}
-
-		feat = (struct level_0_discovery_features *)((char *)feat + feat_length);
-	}
-
-	rc = 0;
-	if (!sedopal_locking_supported) {
-		fprintf(stderr, "Error: device does not support SED Opal\n");
-		rc = -1;
-	} else
-		sedopal_print_locking_features(locking_flags);
-
-	return rc;
+	return 0
+		;
 #else /* IOC_OPAL_DISCOVERY */
 	fprintf(stderr, "ERROR : NVMe device discovery is not supported\n");
 	return -EOPNOTSUPP;
 #endif
 }
+
+/*
+ * Query a drive to determine if it's SED Opal capable and
+ * it's current locking status.
+ */
+int sedopal_cmd_discover(int fd)
+{
+	int rc, feat_length;
+	struct level_0_discovery_features *feat;
+	struct level_0_discovery_features *feat_end;
+	struct sedopal_feature_parser sfp = {};
+
+	rc = sedopal_discover_device(fd, &feat, &feat_end);
+	if (rc != 0)
+		return rc;
+
+	/*
+	 * iterate through all the features that were returned
+	 */
+	while (feat < feat_end) {
+		sedopal_parse_features(feat, &sfp);
+		feat_length = feat->length + 4 /* hdr */;
+		feat = (struct level_0_discovery_features *)
+			((char *)feat + feat_length);
+	}
+
+	rc = 0;
+	if (!(sfp.features & OPAL_SED_LOCKING_SUPPORT)) {
+		fprintf(stderr, "Error: device does not support SED Opal\n");
+		rc = -1;
+	} else
+		sedopal_print_locking_features(sfp.locking_desc);
+
+	if (!sedopal_discovery_verbose)
+		return rc;
+
+	sedopal_print_features(&sfp);
+
+
+	return rc;
+}
+
+/*
+ * Query a drive to determine its locking state
+ */
+int sedopal_locking_state(int fd)
+{
+	int rc, feat_length;
+	struct level_0_discovery_features *feat;
+	struct level_0_discovery_features *feat_end;
+
+	rc = sedopal_discover_device(fd, &feat, &feat_end);
+	if (rc != 0)
+		return rc;
+
+	/*
+	 * iterate through all the features that were returned
+	 */
+	while (feat < feat_end) {
+		uint16_t code = be16toh(feat->code);
+
+		if (code == OPAL_FEATURE_CODE_LOCKING) {
+			struct locking_desc *ld = (struct locking_desc *) (feat + 1);
+
+			return ld->features;
+		}
+
+		feat_length = feat->length + 4 /* hdr */;
+		feat = (struct level_0_discovery_features *)
+			((char *)feat + feat_length);
+	}
+
+	return 0;
+}
diff --git a/plugins/sed/sedopal_cmd.h b/plugins/sed/sedopal_cmd.h
index 3b6eae2..32d1cfb 100644
--- a/plugins/sed/sedopal_cmd.h
+++ b/plugins/sed/sedopal_cmd.h
@@ -17,6 +17,9 @@ extern bool sedopal_ask_key;
 extern bool sedopal_ask_new_key;
 extern bool sedopal_destructive_revert;
 extern bool sedopal_psid_revert;
+extern bool sedopal_lock_ro;
+extern bool sedopal_discovery_verbose;
+extern bool sedopal_discovery_udev;
 
 /*
  * Sub-commands supported by the sedopal command
@@ -51,5 +54,6 @@ int sedopal_cmd_discover(int fd);
 int sedopal_open_nvme_device(char *device);
 int sedopal_lock_unlock(int fd, int lock_state);
 const char *sedopal_error_to_text(int code);
+int sedopal_locking_state(int fd);
 
 #endif /* _SED_OPAL_CMD_H */
diff --git a/plugins/sed/sedopal_spec.h b/plugins/sed/sedopal_spec.h
index 7523060..f6b6662 100644
--- a/plugins/sed/sedopal_spec.h
+++ b/plugins/sed/sedopal_spec.h
@@ -3,6 +3,8 @@
 #ifndef _SED_OPAL_SPEC_H
 #define _SED_OPAL_SPEC_H
 
+#include <common.h>
+
 /*
  * TCP Storage Architecture Core Specification Version 2.01
  * section 5.1.5 Method Status Codes
@@ -31,6 +33,31 @@ enum sed_status_codes {
 	SED_STATUS_NO_METHOD_STATUS =		0x89,
 };
 
+/*
+ * level 0 feature flags
+ */
+#define OPAL_FEATURE_TPER                       0x0001
+#define OPAL_FEATURE_LOCKING                    0x0002
+#define OPAL_FEATURE_GEOMETRY                   0x0004
+#define OPAL_FEATURE_OPALV1                     0x0008
+#define OPAL_FEATURE_SINGLE_USER_MODE           0x0010
+#define OPAL_FEATURE_DATA_STORE                 0x0020
+#define OPAL_FEATURE_OPALV2                     0x0040
+#define OPAL_FEATURE_OPALITE                    0x0080
+#define OPAL_FEATURE_PYRITE_V1                  0x0100
+#define OPAL_FEATURE_PYRITE_V2                  0x0200
+#define OPAL_FEATURE_RUBY                       0x0400
+#define OPAL_FEATURE_LOCKING_LBA                0x0800
+#define OPAL_FEATURE_BLOCK_SID_AUTH             0x1000
+#define OPAL_FEATURE_CONFIG_NS_LOCKING          0x2000
+#define OPAL_FEATURE_DATA_REMOVAL               0x4000
+#define OPAL_FEATURE_NS_GEOMETRY                0x8000
+
+#define OPAL_SED_LOCKING_SUPPORT \
+		(OPAL_FEATURE_OPALV1 | OPAL_FEATURE_OPALV2 |  \
+		OPAL_FEATURE_RUBY | OPAL_FEATURE_PYRITE_V1 | \
+		OPAL_FEATURE_PYRITE_V2 | OPAL_FEATURE_LOCKING)
+
 /*
  * Definitions from TCG Opal Specification v2.0.2
  */
@@ -38,34 +65,304 @@ enum sed_status_codes {
 /*
  * level 0 feature codes - section 3.1.1
  */
-#define	OPAL_FEATURE_CODE_LOCKING		0x0002
-#define	OPAL_FEATURE_CODE_OPALV2		0x0203
+#define OPAL_FEATURE_CODE_TPER                  0x0001
+#define OPAL_FEATURE_CODE_LOCKING               0x0002
+#define OPAL_FEATURE_CODE_GEOMETRY              0x0003
+
+#define OPAL_FEATURE_CODE_OPALV1                0x0200
+#define OPAL_FEATURE_CODE_SINGLE_USER_MODE      0x0201
+#define OPAL_FEATURE_CODE_DATA_STORE            0x0202
+#define OPAL_FEATURE_CODE_OPALV2                0x0203
+
+#define OPAL_FEATURE_CODE_OPALITE               0x0301
+#define OPAL_FEATURE_CODE_PYRITE_V1             0x0302
+#define OPAL_FEATURE_CODE_PYRITE_V2             0x0303
+#define OPAL_FEATURE_CODE_RUBY                  0x0304
+
+#define OPAL_FEATURE_CODE_LOCKING_LBA           0x0401
+#define OPAL_FEATURE_CODE_BLOCK_SID_AUTH        0x0402
+#define OPAL_FEATURE_CODE_CONFIG_NS_LOCKING     0x0403
+#define OPAL_FEATURE_CODE_DATA_REMOVAL          0x0404
+#define OPAL_FEATURE_CODE_NS_GEOMETRY           0x0405
 
 /* locking features */
 #define OPAL_FEATURE_LOCKING_SUPPORTED		0x01
 #define OPAL_FEATURE_LOCKING_ENABLED		0x02
 #define OPAL_FEATURE_LOCKED			0x04
-
+#define OPAL_FEATURE_MEDIA_ENCRYPT              0x08
+#define OPAL_FEATURE_MBR_ENABLED                0x10
+#define OPAL_FEATURE_MBR_DONE                   0x20
 
 /*
- * discovery header as specified in section 3.1.1.1
+ * discovery header as specified in section 3.1.1
  */
 struct level_0_discovery_header {
-	uint32_t	parameter_length;
-	uint32_t	revision;
-	uint64_t	reserved;
+	__be32		parameter_length;
+	__be32		revision;
+	__be64		reserved;
 	uint8_t		vendor_specific[32];
-};
+} __packed;
 
 /*
  * level 0 features as specified in section 3.1.1.3
  */
 struct level_0_discovery_features {
-	uint16_t	code;
+	__be16		code;
 	uint8_t		version;
 	uint8_t		length;
-	uint8_t		feature;
-	uint8_t		reserved[11];
-};
+} __packed;
+
+#define TPER_FEATURE_SYNC       0x0001
+#define TPER_FEATURE_ASYNC      0x0002
+#define TPER_FEATURE_ACKNAK     0x0004
+#define TPER_FEATURE_BUF_MGMT   0x0008
+#define TPER_FEATURE_STREAMING  0x0010
+#define TPER_FEATURE_COMID_MGMT 0x0040
+
+/*
+ * 3.1.1.2
+ *
+ * feature code 0x0001
+ */
+struct tper_desc {
+	uint8_t         feature;
+	uint8_t         reserved[11];
+} __packed;
+
+/*
+ * 3.1.1.3
+ *
+ * feature code 0x0002
+ */
+struct locking_desc {
+	uint8_t         features;
+	uint8_t         reserved[11];
+} __packed;
+
+/*
+ * 3.1.1.4
+ *
+ * feature code 0x0003
+ */
+#define GEOMETRY_ALIGNMENT_REQUIRED    0x01
+
+struct geometry_reporting_desc {
+	uint8_t         align;
+	uint8_t         reserved[7];
+	__be32          logical_block_size;
+	__be64          alignment_granularity;
+	__be64          lowest_aligned_lba;
+} __packed;
+
+/*
+ * 3.1.1.5
+ *
+ * feature code 0x0203
+ */
+#define OPAL_V2_RANGE_CROSSING 0x01
+
+struct opalv2_desc {
+	__be16          base_comid;
+	__be16          num_comids;
+	uint8_t         flags;
+	__be16          num_locking_sp_admin_auth;
+	__be16          num_locking_sp_user_auth;
+	uint8_t         initial_cpin_sid_ind;
+	uint8_t         initial_cpin_sid_revert;
+	uint8_t         reserved_future[5];
+} __packed;
+
+/*
+ * 3.1.1.5
+ *
+ * feature code 0x0200
+ */
+struct opalv1_desc {
+	__be16          base_comid;
+	__be16          num_comids;
+} __packed;
+
+/*
+ * TCG Opal SSC Feature Set v1.00 : Single User Mode
+ * section 4.2.1
+ *
+ * feature code 0x0201
+ */
+#define SUM_FEATURE_ANY         0x0001
+#define SUM_FEATURE_ALL         0x0002
+#define SUM_FEATURE_POLICY      0x0004
+
+struct single_user_mode_desc {
+	__be32          num_locking_objects;
+	uint8_t         flags;
+	uint8_t         reserved[7];
+} __packed;
+
+/*
+ * TCG Opal SSC Feature Set v1.00 : Additional DataStore Tables
+ * section 4.2.1
+ *
+ * feature code 0x0202
+ */
+struct datastore_desc {
+	__be16          reserved;
+	__be16          max_tables;
+	__be32          max_table_size;
+	__be32          table_alignment;
+} __packed;
+
+/*
+ * TCG Storage Security Subsystem Class: Opalite
+ * section 3.1.1.4
+ *
+ * feature code 0x0301
+ */
+struct opalite_desc {
+	__be16          base_comid;
+	__be16          num_comids;
+	uint8_t         reserved[5];
+	uint8_t         initial_cpin_sid_ind;
+	uint8_t         initial_cpin_sid_revert;
+	uint8_t         reserved_future[5];
+} __packed;
+
+/*
+ * TCG Storage Security Subsystem Class: Pyrite version 1
+ * section 3.1.1.4
+ *
+ * feature code 0x0302
+ */
+struct pyrite_v1_desc {
+	__be16          base_comid;
+	__be16          num_comids;
+	uint8_t         reserved[5];
+	uint8_t         initial_cpin_sid_ind;
+	uint8_t         initial_cpin_sid_revert;
+	uint8_t         reserved_future[5];
+} __packed;
+
+/*
+ * TCG Storage Security Subsystem Class: Pyrite version 2
+ * section 3.1.1.4
+ *
+ * feature code 0x0303
+ */
+struct pyrite_v2_desc {
+	__be16          base_comid;
+	__be16          num_comids;
+	uint8_t         reserved[5];
+	uint8_t         initial_cpin_sid_ind;
+	uint8_t         initial_cpin_sid_revert;
+	uint8_t         reserved_future[5];
+} __packed;
+
+/*
+ * TCG Ruby SSC Feature Set v1.00
+ * section 3.1.1.5
+ *
+ * feature code 0x0304
+ */
+#define RUBY_RANGE_CROSSING    0x01
+
+struct ruby_desc {
+	__be16          base_comid;
+	__be16          num_comids;
+	uint8_t         flags;
+	__be16          num_locking_sp_admin_auth;
+	__be16          num_locking_sp_user_auth;
+	uint8_t         initial_cpin_sid_ind;
+	uint8_t         initial_cpin_sid_revert;
+	uint8_t         reserved_future[5];
+} __packed;
+
+/*
+ * TCG Storage Enterprise SSC Feature Set Locking LBA Ranges Control
+ * section 4.1.1
+ *
+ * feature code 0x0401
+ */
+struct locking_lba_desc {
+	uint8_t         reserved;
+	uint8_t         reserved_range_control[11];
+} __packed;
+
+/*
+ * TCG Storage Feature Set: Block SID Authentication
+ * section 4.1.1
+ *
+ * feature code 0x0402
+ */
+#define BLOCK_SID_VALUE_STATE           0x0001
+#define BLOCK_SID_BLOCKED_STATE         0x0002
+#define BLOCK_SID_HW_RESET              0x0001
+
+struct block_sid_auth_desc {
+	uint8_t         states;
+	uint8_t         hw_reset;
+} __packed;
+
+/*
+ * TCG Storage Opal SSC Feature Set: Configurable Namespace Locking
+ * section 4.2.1
+ *
+ * feature code 0x0403
+ */
+#define CONFIG_NS_RANGE_C               0x0080
+#define CONFIG_NS_RANGE_P               0x0040
+
+struct config_ns_desc {
+	uint8_t         flags;
+	uint8_t         reserved[3];
+	__be32          max_key_count;
+	__be32          unused_key_count;
+	__be32          max_ranges_per_ns;
+} __packed;
+
+/*
+ * TCG Storage Security Subsystem Class: Opal version 2.02
+ * section 3.1.1.6
+ *
+ * feature code 0x0404
+ */
+#define DATA_REMOVAL_OPER_PROCESSING                    0x01
+#define DATA_REMOVAL_OPER_INTERRUPTED                   0x02
+#define DATA_REMOVAL_TIME_BIT0                          0x01
+#define DATA_REMOVAL_TIME_BIT1                          0x02
+#define DATA_REMOVAL_TIME_BIT2                          0x04
+#define DATA_REMOVAL_TIME_BIT5                          0x20
+
+#define DATA_REMOVAL_MECHANISM_OVERWRITE                0x01
+#define DATA_REMOVAL_MECHANISM_BLOCK_ERASE              0x02
+#define DATA_REMOVAL_MECHANISM_CRYPTO_ERASE             0x04
+#define DATA_REMOVAL_MECHANISM_VENDOR_ERASE             0x10
+
+struct data_removal_desc {
+	uint8_t         reserved;
+	uint8_t         flags;
+	uint8_t         removal_mechanism;
+	uint8_t         format;
+	__be16          time_mechanism_bit0;
+	__be16          time_mechanism_bit1;
+	__be16          time_mechanism_bit2;
+	uint8_t         reserved_mech[4];
+	__be16          time_mechanism_bit5;
+	uint8_t         future_reserved[16];
+} __packed;
+
+/*
+ * TCG Storage Opal SSC Feature Set: Configurable Namespace Locking
+ * section 4.2.1
+ *
+ * feature code 0x0405
+ */
+#define NS_GEOMETRY_ALIGNMENT_REQUIRED 0x01
+
+struct ns_geometry_desc {
+	uint8_t         align;
+	uint8_t         reserved[7];
+	__be32          logical_block_size;
+	__be64          alignment_granularity;
+	__be64          lowest_aligned_lba;
+} __packed;
 
 #endif /* _SED_OPAL_SPEC_H */
diff --git a/plugins/solidigm/solidigm-internal-logs.c b/plugins/solidigm/solidigm-internal-logs.c
index d493216..303d471 100644
--- a/plugins/solidigm/solidigm-internal-logs.c
+++ b/plugins/solidigm/solidigm-internal-logs.c
@@ -233,7 +233,7 @@ static int ilog_dump_assert_logs(struct ilog *ilog)
 {
 	__u8 buf[INTERNAL_LOG_MAX_BYTE_TRANSFER];
 	__u8 head_buf[INTERNAL_LOG_MAX_BYTE_TRANSFER];
-	char file_path[PATH_MAX] = {0};
+	_cleanup_free_ char *file_path = NULL;
 	char file_name[] = "AssertLog.bin";
 	struct assert_dump_header *ad = (struct assert_dump_header *) head_buf;
 	struct nvme_passthru_cmd cmd = {
@@ -249,8 +249,10 @@ static int ilog_dump_assert_logs(struct ilog *ilog)
 	if (err)
 		return err;
 
-	snprintf(file_path, sizeof(file_path), "%.*s/%s",
-		 (int) (sizeof(file_path) - sizeof(file_name) - 1), ilog->cfg->out_dir, file_name);
+	if (asprintf(&file_path, "%.*s/%s",
+		 (int) (sizeof(file_path) - sizeof(file_name) - 1),
+		 ilog->cfg->out_dir, file_name) < 0)
+		return -errno;
 	output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, LOG_FILE_PERMISSION);
 	if (output < 0)
 		return -errno;
@@ -289,7 +291,7 @@ static int ilog_dump_event_logs(struct ilog *ilog)
 {
 	__u8 buf[INTERNAL_LOG_MAX_BYTE_TRANSFER];
 	__u8 head_buf[INTERNAL_LOG_MAX_BYTE_TRANSFER];
-	char file_path[PATH_MAX] = {0};
+	_cleanup_free_ char *file_path = NULL;
 	struct event_dump_header *ehdr = (struct event_dump_header *) head_buf;
 	struct nvme_passthru_cmd cmd = {
 		.opcode = 0xd2,
@@ -304,7 +306,8 @@ static int ilog_dump_event_logs(struct ilog *ilog)
 	err = read_header(&cmd, dev_fd(ilog->dev));
 	if (err)
 		return err;
-	snprintf(file_path, sizeof(file_path) - 1, "%s/EventLog.bin", ilog->cfg->out_dir);
+	if (asprintf(&file_path, "%s/EventLog.bin", ilog->cfg->out_dir))
+		return -errno;
 	output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, LOG_FILE_PERMISSION);
 	if (output < 0)
 		return -errno;
@@ -363,7 +366,7 @@ static int ilog_dump_nlogs(struct ilog *ilog, int core)
 	int err = 0;
 	__u32 count, core_num;
 	__u8 buf[INTERNAL_LOG_MAX_BYTE_TRANSFER];
-	char file_path[PATH_MAX] = {0};
+	_cleanup_free_ char *file_path = NULL;
 	struct nlog_dump_header_common *nlog_header = (struct nlog_dump_header_common *)buf;
 	struct nvme_passthru_cmd cmd = {
 		.opcode = 0xd2,
@@ -400,11 +403,12 @@ static int ilog_dump_nlogs(struct ilog *ilog, int core)
 			count = nlog_header->totalnlogs;
 			core_num = core < 0 ? nlog_header->corecount : 0;
 			if (!header_size) {
-				snprintf(file_path, sizeof(file_path) - 1, "%s/NLog.bin",
-					 ilog->cfg->out_dir);
-				output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC,
-					      LOG_FILE_PERMISSION);
-				if (output < 0)
+				if (asprintf(&file_path, "%s/NLog.bin", ilog->cfg->out_dir) >= 0) {
+					output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC,
+							LOG_FILE_PERMISSION);
+					if (output < 0)
+						return -errno;
+				} else
 					return -errno;
 				header_size = get_nlog_header_size(nlog_header);
 				is_open = true;
@@ -416,7 +420,7 @@ static int ilog_dump_nlogs(struct ilog *ilog, int core)
 				print_nlog_header(buf);
 			cmd.cdw13 = 0x400;
 			err = cmd_dump_repeat(&cmd, nlog_header->nlogbytesize / 4,
-					output, dev_fd(ilog->dev), true);
+				output, dev_fd(ilog->dev), true);
 			if (err)
 				break;
 		} while (++log_select.selectNlog < count);
@@ -432,16 +436,19 @@ static int ilog_dump_nlogs(struct ilog *ilog, int core)
 
 int ensure_dir(const char *parent_dir_name, const char *name)
 {
-	char file_path[PATH_MAX] = {0};
+	_cleanup_free_ char *file_path = NULL;
 	struct stat sb;
 
-	snprintf(file_path, sizeof(file_path) - 1, "%s/%s", parent_dir_name, name);
+	if (asprintf(&file_path, "%s/%s", parent_dir_name, name) < 0)
+		return -errno;
+
 	if (!(stat(file_path, &sb) == 0 && S_ISDIR(sb.st_mode))) {
 		if (mkdir(file_path, 777) != 0) {
 			perror(file_path);
 			return -errno;
 		}
 	}
+
 	return 0;
 }
 
@@ -456,13 +463,14 @@ static int log_save(struct log *log, const char *parent_dir_name, const char *su
 		    const char *file_name, __u8 *buffer, size_t buf_size)
 {
 	_cleanup_fd_ int output = -1;
-	char file_path[PATH_MAX] = {0};
+	_cleanup_free_ char *file_path = NULL;
 	size_t bytes_remaining = 0;
 
 	ensure_dir(parent_dir_name, subdir_name);
 
-	snprintf(file_path, sizeof(file_path) - 1, "%s/%s/%s", parent_dir_name, subdir_name,
-		 file_name);
+	if (asprintf(&file_path, "%s/%s/%s", parent_dir_name, subdir_name, file_name) < 0)
+		return -errno;
+
 	output = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, LOG_FILE_PERMISSION);
 	if (output < 0)
 		return -errno;
@@ -486,15 +494,15 @@ static int ilog_dump_identify_page(struct ilog *ilog, struct log *cns, __u32 nsi
 {
 	__u8 data[NVME_IDENTIFY_DATA_SIZE];
 	__u8 *buff = cns->buffer ? cns->buffer : data;
-	char filename[sizeof(
-		"cntid_XXXXX_cns_XXX_nsid_XXXXXXXXXX_nvmsetid_XXXXX_csi_XXX.bin")] = {0};
+	_cleanup_free_ char *filename = NULL;
 	int err = nvme_identify_cns_nsid(dev_fd(ilog->dev), cns->id, nsid, buff);
 
 	if (err)
 		return err;
 
-	snprintf(filename, sizeof(filename) - 1, "cntid_0_cns_%d_nsid_%d_nvmsetid_0_csi_0.bin",
-		 cns->id, nsid);
+	if (asprintf(&filename, "cntid_0_cns_%d_nsid_%d_nvmsetid_0_csi_0.bin", cns->id, nsid) < 0)
+		return -errno;
+
 	return log_save(cns, ilog->cfg->out_dir, "identify", filename, buff, sizeof(data));
 }
 
@@ -646,9 +654,9 @@ static int ilog_dump_identify_pages(struct ilog *ilog)
 static int ilog_dump_log_page(struct ilog *ilog, struct log *lp, __u32 nsid)
 {
 	__u8 *buff = lp->buffer;
-	char filename[sizeof("lid_0xXX_lsp_0xXX_lsi_0xXXXX.bin")] = {0};
-	int err;
+	_cleanup_free_ char *filename = NULL;
 
+	int err;
 	if (!lp->buffer_size)
 		return -EINVAL;
 	if (!buff) {
@@ -660,8 +668,9 @@ static int ilog_dump_log_page(struct ilog *ilog, struct log *lp, __u32 nsid)
 	if (err)
 		return err;
 
-	snprintf(filename, sizeof(filename), "lid_0x%02x_lsp_0x00_lsi_0x0000.bin",
-		 lp->id);
+	if (asprintf(&filename, "lid_0x%02x_lsp_0x00_lsi_0x0000.bin", lp->id) < 0)
+		return -errno;
+
 	return log_save(lp, ilog->cfg->out_dir, "log_pages", filename, buff, lp->buffer_size);
 }
 
@@ -813,10 +822,11 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command,
 {
 	char sn_prefix[sizeof(((struct nvme_id_ctrl *)0)->sn)+1];
 	char date_str[sizeof("-YYYYMMDDHHMMSS")];
-	char full_folder[PATH_MAX] = {0};
-	char unique_folder[sizeof(sn_prefix)+sizeof(date_str)-1] = {0};
+	_cleanup_free_ char *full_folder = NULL;
+	_cleanup_free_ char *unique_folder = NULL;
+	_cleanup_free_ char *zip_name = NULL;
+
 	char *initial_folder;
-	char zip_name[PATH_MAX] = {0};
 	char *output_path;
 	struct ilog ilog = {0};
 	int err;
@@ -885,12 +895,16 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command,
 
 	current_time = time(NULL);
 	strftime(date_str, sizeof(date_str), "-%Y%m%d%H%M%S", localtime(&current_time));
-	snprintf(unique_folder, sizeof(unique_folder), "%s%s", sn_prefix, date_str);
-	snprintf(full_folder, sizeof(full_folder) - 1, "%s/%s", cfg.out_dir, unique_folder);
+	if (asprintf(&unique_folder, "%s%s", sn_prefix, date_str) < 0)
+		return -errno;
+	if (asprintf(&full_folder, "%s/%s", cfg.out_dir, unique_folder) < 0)
+		return -errno;
+
 	if (mkdir(full_folder, 0755) !=  0) {
 		perror("mkdir");
 		return -errno;
 	}
+
 	cfg.out_dir = full_folder;
 	output_path = full_folder;
 
@@ -946,10 +960,12 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command,
 
 	if (ilog.count > 0) {
 		int ret_cmd;
-		char *cmd;
+		_cleanup_free_ char *cmd = NULL;
 		char *quiet = cfg.verbose ? "" : " -q";
 
-		snprintf(zip_name, sizeof(zip_name) - 1, "%s.zip", unique_folder);
+		if (asprintf(&zip_name, "%s.zip", unique_folder) < 0)
+			return -errno;
+
 		if (asprintf(&cmd, "cd \"%s\" && zip -MM -r \"../%s\" ./* %s", cfg.out_dir,
 			     zip_name, quiet) < 0) {
 			err = errno;
@@ -962,7 +978,6 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command,
 			perror(cmd);
 		else {
 			output_path = zip_name;
-			free(cmd);
 			if (asprintf(&cmd, "rm -rf %s", cfg.out_dir) < 0) {
 				err = errno;
 				perror("Can't allocate string for cleanup");
@@ -971,7 +986,6 @@ int solidigm_get_internal_log(int argc, char **argv, struct command *command,
 			if (system(cmd) != 0)
 				perror("Failed removing logs folder");
 		}
-		free(cmd);
 	}
 
 out:
diff --git a/plugins/solidigm/solidigm-log-page-dir.c b/plugins/solidigm/solidigm-log-page-dir.c
index f8d1974..886097b 100644
--- a/plugins/solidigm/solidigm-log-page-dir.c
+++ b/plugins/solidigm/solidigm-log-page-dir.c
@@ -14,6 +14,7 @@
 #include "common.h"
 #include "nvme-print.h"
 
+#include "plugins/ocp/ocp-nvme.h"
 #include "plugins/ocp/ocp-utils.h"
 #include "solidigm-util.h"
 
diff --git a/plugins/solidigm/solidigm-nvme.h b/plugins/solidigm/solidigm-nvme.h
index cb32ed0..e2f416e 100644
--- a/plugins/solidigm/solidigm-nvme.h
+++ b/plugins/solidigm/solidigm-nvme.h
@@ -13,7 +13,7 @@
 
 #include "cmd.h"
 
-#define SOLIDIGM_PLUGIN_VERSION "1.8"
+#define SOLIDIGM_PLUGIN_VERSION "1.9"
 
 PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_VERSION),
 	COMMAND_LIST(
diff --git a/plugins/solidigm/solidigm-telemetry/config.c b/plugins/solidigm/solidigm-telemetry/config.c
index eceeede..9d1b4e2 100644
--- a/plugins/solidigm/solidigm-telemetry/config.c
+++ b/plugins/solidigm/solidigm-telemetry/config.c
@@ -61,7 +61,7 @@ const char *solidigm_config_get_nlog_obj_name(const struct json_object *config,
 	if (!json_object_object_get_ex(nlog_names, hex_header, &obj_name))
 		return NULL;
 	name = json_object_get_string(obj_name);
-	if (strncmp(NLOG_OBJ_PREFIX, name, strlen(NLOG_OBJ_PREFIX)))
+	if ((!name) || (strncmp(NLOG_OBJ_PREFIX, name, strlen(NLOG_OBJ_PREFIX))))
 		return NULL;
 
 	return &name[strlen(OBJ_NAME_PREFIX)];
diff --git a/plugins/ssstc/ssstc-nvme.c b/plugins/ssstc/ssstc-nvme.c
index 302df98..f90ad60 100644
--- a/plugins/ssstc/ssstc-nvme.c
+++ b/plugins/ssstc/ssstc-nvme.c
@@ -383,7 +383,9 @@ int ssstc_get_add_smart_log(int argc, char **argv, struct command *cmd, struct p
 		"(optionally, for the specified namespace), and show it.";
 	const char *namespace = "(optional) desired namespace";
 	const char *raw = "Dump output in binary format";
+#ifdef CONFIG_JSONC
 	const char *json = "Dump output in json format";
+#endif /* CONFIG_JSONC */
 
 	struct nvme_additional_smart_log smart_log_add;
 	struct nvme_dev *dev;
@@ -402,7 +404,7 @@ int ssstc_get_add_smart_log(int argc, char **argv, struct command *cmd, struct p
 	OPT_ARGS(opts) = {
 		OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace),
 		OPT_FLAG("raw-binary",   'b', &cfg.raw_binary,   raw),
-		OPT_FLAG("json",         'j', &cfg.json,         json),
+		OPT_FLAG_JSON("json",    'j', &cfg.json,         json),
 		OPT_END()
 	};
 
diff --git a/plugins/virtium/virtium-nvme.c b/plugins/virtium/virtium-nvme.c
index ad9938d..50b2a54 100644
--- a/plugins/virtium/virtium-nvme.c
+++ b/plugins/virtium/virtium-nvme.c
@@ -127,8 +127,10 @@ static void vt_convert_smart_data_to_human_readable_format(struct vtview_smart_l
 
 	capacity = le64_to_cpu(smart->raw_ns.nsze) * lba;
 
-	snprintf(tempbuff, sizeof(tempbuff), "log;%s;%lu;%s;%s;%-.*s;", smart->raw_ctrl.sn, smart->time_stamp, smart->path,
-		smart->raw_ctrl.mn, (int)sizeof(smart->raw_ctrl.fr), smart->raw_ctrl.fr);
+	snprintf(tempbuff, sizeof(tempbuff), "log;%s;%llu;%s;%s;%-.*s;", smart->raw_ctrl.sn,
+		 (unsigned long long)smart->time_stamp, smart->path,
+		 smart->raw_ctrl.mn, (int)sizeof(smart->raw_ctrl.fr),
+		 smart->raw_ctrl.fr);
 	strcpy(text, tempbuff);
 	snprintf(tempbuff, sizeof(tempbuff), "Capacity;%lf;", capacity / 1000000000);
 	strcat(text, tempbuff);
diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c
index f3e97db..f1e12c4 100644
--- a/plugins/wdc/wdc-nvme.c
+++ b/plugins/wdc/wdc-nvme.c
@@ -1882,7 +1882,6 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev)
 		case WDC_NVME_SN861_DEV_ID:
 		case WDC_NVME_SN861_DEV_ID_1:
 		case WDC_NVME_SN861_DEV_ID_2:
-		case WDC_NVME_SNTMP_DEV_ID:
 			capabilities |= (WDC_DRIVE_CAP_C0_LOG_PAGE |
 				WDC_DRIVE_CAP_C3_LOG_PAGE |
 				WDC_DRIVE_CAP_CA_LOG_PAGE |
@@ -1899,6 +1898,23 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev)
 				WDC_DRIVE_CAP_SET_LATENCY_MONITOR);
 			break;
 
+		case WDC_NVME_SNTMP_DEV_ID:
+			capabilities |= (WDC_DRIVE_CAP_C0_LOG_PAGE |
+				WDC_DRIVE_CAP_C3_LOG_PAGE |
+				WDC_DRIVE_CAP_CA_LOG_PAGE |
+				WDC_DRIVE_CAP_OCP_C4_LOG_PAGE |
+				WDC_DRIVE_CAP_OCP_C5_LOG_PAGE |
+				WDC_DRIVE_CAP_DUI |
+				WDC_DRIVE_CAP_FW_ACTIVATE_HISTORY_C2 |
+				WDC_DRIVE_CAP_VU_FID_CLEAR_PCIE |
+				WDC_DRIVE_CAP_VU_FID_CLEAR_FW_ACT_HISTORY |
+				WDC_DRIVE_CAP_INFO |
+				WDC_DRIVE_CAP_CLOUD_SSD_VERSION |
+				WDC_DRIVE_CAP_LOG_PAGE_DIR |
+				WDC_DRIVE_CAP_DRIVE_STATUS |
+				WDC_DRIVE_CAP_SET_LATENCY_MONITOR);
+			break;
+
 		default:
 			capabilities = 0;
 		}
@@ -2165,6 +2181,163 @@ static int wdc_create_log_file(char *file, __u8 *drive_log_data,
 	return 0;
 }
 
+bool wdc_validate_dev_mng_log(void *data)
+{
+	__u32 remaining_len = 0;
+	__u32 log_length = 0;
+	__u32 log_entry_size = 0;
+	__u32 log_entry_id = 0;
+	__u32 offset = 0;
+	bool valid_log = false;
+	struct wdc_c2_log_subpage_header *p_next_log_entry = NULL;
+	struct wdc_c2_log_page_header *hdr_ptr = (struct wdc_c2_log_page_header *)data;
+
+	log_length = le32_to_cpu(hdr_ptr->length);
+	/* Ensure log data is large enough for common header */
+	if (log_length < sizeof(struct wdc_c2_log_page_header)) {
+		fprintf(stderr,
+		    "ERROR: %s: log smaller than header. log_len: 0x%x  HdrSize: %"PRIxPTR"\n",
+		    __func__, log_length, sizeof(struct wdc_c2_log_page_header));
+		return valid_log;
+	}
+
+	/* Get pointer to first log Entry */
+	offset = sizeof(struct wdc_c2_log_page_header);
+	p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)data) + offset);
+	remaining_len = log_length - offset;
+
+	/* Proceed only if there is at least enough data to read an entry header */
+	while (remaining_len >= sizeof(struct wdc_c2_log_subpage_header)) {
+		/* Get size of the next entry */
+		log_entry_size = le32_to_cpu(p_next_log_entry->length);
+		log_entry_id = le32_to_cpu(p_next_log_entry->entry_id);
+		/*
+		 * If log entry size is 0 or the log entry goes past the end
+		 * of the data, we must be at the end of the data
+		 */
+		if (!log_entry_size || log_entry_size > remaining_len) {
+			fprintf(stderr, "ERROR: WDC: %s: Detected unaligned end of the data. ",
+				__func__);
+			fprintf(stderr, "Data Offset: 0x%x Entry Size: 0x%x, ",
+				offset, log_entry_size);
+			fprintf(stderr, "Remaining Log Length: 0x%x Entry Id: 0x%x\n",
+				remaining_len, log_entry_id);
+
+			/* Force the loop to end */
+			remaining_len = 0;
+		} else if (!log_entry_id || log_entry_id > 200) {
+			/* Invalid entry - fail the search */
+			fprintf(stderr, "ERROR: WDC: %s: Invalid entry found at offset: 0x%x ",
+				__func__, offset);
+			fprintf(stderr, "Entry Size: 0x%x, Remaining Log Length: 0x%x ",
+				log_entry_size, remaining_len);
+			fprintf(stderr, "Entry Id: 0x%x\n", log_entry_id);
+
+			/* Force the loop to end */
+			remaining_len = 0;
+			valid_log = false;
+		} else {
+			/* A valid log has at least one entry and no invalid entries */
+			valid_log = true;
+			remaining_len -= log_entry_size;
+			if (remaining_len > 0) {
+				/* Increment the offset counter */
+				offset += log_entry_size;
+				/* Get the next entry */
+				p_next_log_entry =
+				(struct wdc_c2_log_subpage_header *)(((__u8 *)data) + offset);
+			}
+		}
+	}
+
+	return valid_log;
+}
+
+bool wdc_parse_dev_mng_log_entry(void *data, __u32 entry_id,
+				 struct wdc_c2_log_subpage_header **log_entry)
+{
+	__u32 remaining_len = 0;
+	__u32 log_length = 0;
+	__u32 log_entry_size = 0;
+	__u32 log_entry_id = 0;
+	__u32 offset = 0;
+	bool found = false;
+	struct wdc_c2_log_subpage_header *p_next_log_entry = NULL;
+	struct wdc_c2_log_page_header *hdr_ptr = (struct wdc_c2_log_page_header *)data;
+
+	log_length = le32_to_cpu(hdr_ptr->length);
+	/* Ensure log data is large enough for common header */
+	if (log_length < sizeof(struct wdc_c2_log_page_header)) {
+		fprintf(stderr,
+		    "ERROR: %s: log smaller than header. log_len: 0x%x  HdrSize: %"PRIxPTR"\n",
+		    __func__, log_length, sizeof(struct wdc_c2_log_page_header));
+		return found;
+	}
+
+	/* Get pointer to first log Entry */
+	offset = sizeof(struct wdc_c2_log_page_header);
+	p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)data) + offset);
+	remaining_len = log_length - offset;
+
+	if (!log_entry) {
+		fprintf(stderr, "ERROR: WDC - %s: No log entry pointer.\n", __func__);
+		return found;
+	}
+	*log_entry = NULL;
+
+	/* Proceed only if there is at least enough data to read an entry header */
+	while (remaining_len >= sizeof(struct wdc_c2_log_subpage_header)) {
+		/* Get size of the next entry */
+		log_entry_size = le32_to_cpu(p_next_log_entry->length);
+		log_entry_id = le32_to_cpu(p_next_log_entry->entry_id);
+
+		/*
+		 * If log entry size is 0 or the log entry goes past the end
+		 * of the data, we must be at the end of the data
+		 */
+		if (!log_entry_size || log_entry_size > remaining_len) {
+			fprintf(stderr, "ERROR: WDC: %s: Detected unaligned end of the data. ",
+				__func__);
+			fprintf(stderr, "Data Offset: 0x%x Entry Size: 0x%x, ",
+				offset, log_entry_size);
+			fprintf(stderr, "Remaining Log Length: 0x%x Entry Id: 0x%x\n",
+				remaining_len, log_entry_id);
+
+			/* Force the loop to end */
+			remaining_len = 0;
+		} else if (!log_entry_id || log_entry_id > 200) {
+			/* Invalid entry - fail the search */
+			fprintf(stderr, "ERROR: WDC: %s: Invalid entry found at offset: 0x%x ",
+				__func__, offset);
+			fprintf(stderr, "Entry Size: 0x%x, Remaining Log Length: 0x%x ",
+				log_entry_size, remaining_len);
+			fprintf(stderr, "Entry Id: 0x%x\n", log_entry_id);
+
+			/* Force the loop to end */
+			remaining_len = 0;
+		} else {
+			if (log_entry_id == entry_id) {
+				found = true;
+				*log_entry = p_next_log_entry;
+				remaining_len = 0;
+			} else {
+				remaining_len -= log_entry_size;
+			}
+
+			if (remaining_len > 0) {
+				/* Increment the offset counter */
+				offset += log_entry_size;
+
+				/* Get the next entry */
+				p_next_log_entry =
+				(struct wdc_c2_log_subpage_header *)(((__u8 *)data) + offset);
+			}
+		}
+	}
+
+	return found;
+}
+
 bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id,
 			       struct wdc_c2_log_page_header *p_log_hdr,
 			       struct wdc_c2_log_subpage_header **p_p_found_log_entry)
@@ -2172,9 +2345,10 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id,
 	__u32 remaining_len = 0;
 	__u32 log_entry_hdr_size = sizeof(struct wdc_c2_log_subpage_header) - 1;
 	__u32 log_entry_size = 0;
+	__u32 log_entry_id = 0;
 	__u32 size = 0;
 	bool valid_log;
-	__u32 current_data_offset = 0;
+	__u32 offset = 0;
 	struct wdc_c2_log_subpage_header *p_next_log_entry = NULL;
 
 	if (!*p_p_found_log_entry) {
@@ -2194,8 +2368,8 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id,
 
 	/* Get pointer to first log Entry */
 	size = sizeof(struct wdc_c2_log_page_header);
-	current_data_offset = size;
-	p_next_log_entry = (struct wdc_c2_log_subpage_header *)((__u8 *)p_log_hdr + current_data_offset);
+	offset = size;
+	p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)p_log_hdr) + offset);
 	remaining_len = log_length - size;
 	valid_log = false;
 
@@ -2209,7 +2383,8 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id,
 	/* Proceed only if there is at least enough data to read an entry header */
 	while (remaining_len >= log_entry_hdr_size) {
 		/* Get size of the next entry */
-		log_entry_size = p_next_log_entry->length;
+		log_entry_size = le32_to_cpu(p_next_log_entry->length);
+		log_entry_id = le32_to_cpu(p_next_log_entry->entry_id);
 
 		/*
 		 * If log entry size is 0 or the log entry goes past the end
@@ -2219,19 +2394,19 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id,
 			fprintf(stderr, "ERROR: WDC: %s: Detected unaligned end of the data. ",
 				__func__);
 			fprintf(stderr, "Data Offset: 0x%x Entry Size: 0x%x, ",
-				current_data_offset, log_entry_size);
+				offset, log_entry_size);
 			fprintf(stderr, "Remaining Log Length: 0x%x Entry Id: 0x%x\n",
-				remaining_len, p_next_log_entry->entry_id);
+				remaining_len, log_entry_id);
 
 			/* Force the loop to end */
 			remaining_len = 0;
-		} else if (!p_next_log_entry->entry_id || p_next_log_entry->entry_id > 200) {
+		} else if (!log_entry_id || log_entry_id > 200) {
 			/* Invalid entry - fail the search */
 			fprintf(stderr, "ERROR: WDC: %s: Invalid entry found at offset: 0x%x ",
-				__func__, current_data_offset);
+				__func__, offset);
 			fprintf(stderr, "Entry Size: 0x%x, Remaining Log Length: 0x%x ",
 				log_entry_size, remaining_len);
-			fprintf(stderr, "Entry Id: 0x%x\n", p_next_log_entry->entry_id);
+			fprintf(stderr, "Entry Id: 0x%x\n", log_entry_id);
 
 			/* Force the loop to end */
 			remaining_len = 0;
@@ -2242,7 +2417,7 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id,
 		} else {
 			/* Structure must have at least one valid entry to be considered valid */
 			valid_log = true;
-			if (p_next_log_entry->entry_id == entry_id)
+			if (log_entry_id == entry_id)
 				/* A potential match. */
 				*p_p_found_log_entry = p_next_log_entry;
 
@@ -2250,10 +2425,11 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id,
 
 			if (remaining_len > 0) {
 				/* Increment the offset counter */
-				current_data_offset += log_entry_size;
+				offset += log_entry_size;
 
 				/* Get the next entry */
-				p_next_log_entry = (struct wdc_c2_log_subpage_header *)(((__u8 *)p_log_hdr) + current_data_offset);
+				p_next_log_entry =
+				(struct wdc_c2_log_subpage_header *)(((__u8 *)p_log_hdr) + offset);
 			}
 		}
 	}
@@ -2261,6 +2437,109 @@ bool wdc_get_dev_mng_log_entry(__u32 log_length, __u32 entry_id,
 	return valid_log;
 }
 
+static bool get_dev_mgmt_log_page_data(struct nvme_dev *dev, void **log_data,
+				       __u8 uuid_ix)
+{
+	void *data;
+	struct wdc_c2_log_page_header *hdr_ptr;
+	__u32 length = 0;
+	int ret = 0;
+	bool valid = false;
+
+	data = (__u8 *)malloc(sizeof(__u8) * WDC_C2_LOG_BUF_LEN);
+	if (!data) {
+		fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno));
+		return false;
+	}
+
+	memset(data, 0, sizeof(__u8) * WDC_C2_LOG_BUF_LEN);
+
+	/* get the log page length */
+	struct nvme_get_log_args args_len = {
+		.args_size	= sizeof(args_len),
+		.fd		= dev_fd(dev),
+		.lid		= WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID,
+		.nsid		= 0xFFFFFFFF,
+		.lpo		= 0,
+		.lsp		= NVME_LOG_LSP_NONE,
+		.lsi		= 0,
+		.rae		= false,
+		.uuidx		= uuid_ix,
+		.csi		= NVME_CSI_NVM,
+		.ot		= false,
+		.len		= WDC_C2_LOG_BUF_LEN,
+		.log		= data,
+		.timeout	= NVME_DEFAULT_IOCTL_TIMEOUT,
+		.result		= NULL,
+	};
+	ret = nvme_get_log(&args_len);
+	if (ret) {
+		fprintf(stderr,
+			"ERROR: WDC: Unable to get 0x%x Log Page with uuid %d, ret = 0x%x\n",
+			WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID, uuid_ix, ret);
+		goto end;
+	}
+
+	hdr_ptr = (struct wdc_c2_log_page_header *)data;
+	length = le32_to_cpu(hdr_ptr->length);
+
+	if (length > WDC_C2_LOG_BUF_LEN) {
+		/* Log page buffer too small for actual data */
+		free(data);
+		data = calloc(length, sizeof(__u8));
+		if (!data) {
+			fprintf(stderr, "ERROR: WDC: malloc: %s\n", strerror(errno));
+			goto end;
+		}
+
+		/* get the log page data with the increased length */
+		struct nvme_get_log_args args_data = {
+			.args_size	= sizeof(args_data),
+			.fd		= dev_fd(dev),
+			.lid		= WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID,
+			.nsid		= 0xFFFFFFFF,
+			.lpo		= 0,
+			.lsp		= NVME_LOG_LSP_NONE,
+			.lsi		= 0,
+			.rae		= false,
+			.uuidx		= uuid_ix,
+			.csi		= NVME_CSI_NVM,
+			.ot		= false,
+			.len		= length,
+			.log		= data,
+			.timeout	= NVME_DEFAULT_IOCTL_TIMEOUT,
+			.result		= NULL,
+		};
+		ret = nvme_get_log(&args_data);
+
+		if (ret) {
+			fprintf(stderr,
+				"ERROR: WDC: Unable to read 0x%x Log with uuid %d, ret = 0x%x\n",
+				WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID, uuid_ix, ret);
+			goto end;
+		}
+	}
+
+	valid = wdc_validate_dev_mng_log(data);
+	if (valid) {
+		/* Ensure size of log data matches length in log header */
+		*log_data = calloc(length, sizeof(__u8));
+		if (!*log_data) {
+			fprintf(stderr, "ERROR: WDC: calloc: %s\n", strerror(errno));
+			valid = false;
+			goto end;
+		}
+		memcpy((void *)*log_data, data, length);
+	} else {
+		fprintf(stderr, "ERROR: WDC: C2 log page not found with uuid index %d\n",
+			uuid_ix);
+	}
+
+end:
+	free(data);
+	return valid;
+}
+
 static bool get_dev_mgmt_log_page_lid_data(struct nvme_dev *dev,
 	void **cbs_data,
 	__u8 lid,
@@ -2371,6 +2650,78 @@ end:
 	return found;
 }
 
+static bool get_dev_mgment_data(nvme_root_t r, struct nvme_dev *dev,
+				void **data)
+{
+	bool found = false;
+	*data = NULL;
+	__u32 device_id = 0, vendor_id = 0;
+	bool uuid_present = false;
+	int index = 0, uuid_index = 0;
+	struct nvme_id_uuid_list uuid_list;
+
+	/* The wdc_get_pci_ids function could fail when drives are connected
+	 * via a PCIe switch.  Therefore, the return code is intentionally
+	 * being ignored.  The device_id and vendor_id variables have been
+	 * initialized to 0 so the code can continue on without issue for
+	 * both cases: wdc_get_pci_ids successful or failed.
+	 */
+	wdc_get_pci_ids(r, dev, &device_id, &vendor_id);
+
+	typedef struct nvme_id_uuid_list_entry *uuid_list_entry;
+
+	memset(&uuid_list, 0, sizeof(struct nvme_id_uuid_list));
+	if (wdc_CheckUuidListSupport(dev, &uuid_list)) {
+		uuid_list_entry uuid_list_entry_ptr = (uuid_list_entry)&uuid_list.entry[0];
+
+		while (index <= NVME_ID_UUID_LIST_MAX &&
+		       !wdc_UuidEqual(uuid_list_entry_ptr, (uuid_list_entry)UUID_END)) {
+
+			if (wdc_UuidEqual(uuid_list_entry_ptr,
+					  (uuid_list_entry)WDC_UUID)) {
+				uuid_present = true;
+				break;
+			} else if (wdc_UuidEqual(uuid_list_entry_ptr,
+						 (uuid_list_entry)WDC_UUID_SN640_3) &&
+				   wdc_is_sn640_3(device_id)) {
+				uuid_present = true;
+				break;
+			}
+			index++;
+			uuid_list_entry_ptr = (uuid_list_entry)&uuid_list.entry[index];
+		}
+		if (uuid_present)
+			uuid_index = index + 1;
+	}
+
+	if (uuid_present) {
+		/* use the uuid index found above */
+		found = get_dev_mgmt_log_page_data(dev, data, uuid_index);
+	} else {
+		if (!uuid_index && needs_c2_log_page_check(device_id)) {
+			/* In certain devices that don't support UUID lists, there are multiple
+			 * definitions of the C2 logpage. In those cases, the code
+			 * needs to try two UUID indexes and use an identification algorithm
+			 * to determine which is returning the correct log page data.
+			 */
+			uuid_index = 1;
+		}
+
+		found = get_dev_mgmt_log_page_data(dev, data, uuid_index);
+
+		if (!found) {
+			/* not found with uuid = 1 try with uuid = 0 */
+			uuid_index = 0;
+			fprintf(stderr, "Not found, requesting log page with uuid_index %d\n",
+					uuid_index);
+
+			found = get_dev_mgmt_log_page_data(dev, data, uuid_index);
+		}
+	}
+
+	return found;
+}
+
 static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev,
 				__u8 log_id, void **cbs_data)
 {
@@ -2485,6 +2836,22 @@ static bool wdc_nvme_check_supported_log_page(nvme_root_t r, struct nvme_dev *de
 	return found;
 }
 
+static bool wdc_nvme_parse_dev_status_log_entry(void *log_data, __u32 *ret_data,
+						__u32 entry_id)
+{
+	struct wdc_c2_log_subpage_header *entry_data = NULL;
+
+	if (wdc_parse_dev_mng_log_entry(log_data, entry_id, &entry_data)) {
+		if (entry_data) {
+			*ret_data = le32_to_cpu(entry_data->data);
+			return true;
+		}
+	}
+
+	*ret_data = 0;
+	return false;
+}
+
 static bool wdc_nvme_get_dev_status_log_data(nvme_root_t r, struct nvme_dev *dev, __le32 *ret_data,
 					     __u8 log_id)
 {
@@ -8609,12 +8976,13 @@ static int wdc_drive_status(int argc, char **argv, struct command *command,
 	struct nvme_dev *dev;
 	int ret = 0;
 	nvme_root_t r;
-	__le32 system_eol_state;
-	__le32 user_eol_state;
-	__le32 format_corrupt_reason = cpu_to_le32(0xFFFFFFFF);
-	__le32 eol_status;
-	__le32 assert_status = cpu_to_le32(0xFFFFFFFF);
-	__le32 thermal_status = cpu_to_le32(0xFFFFFFFF);
+	void *dev_mng_log = NULL;
+	__u32 system_eol_state;
+	__u32 user_eol_state;
+	__u32 format_corrupt_reason = 0xFFFFFFFF;
+	__u32 eol_status;
+	__u32 assert_status = 0xFFFFFFFF;
+	__u32 thermal_status = 0xFFFFFFFF;
 	__u64 capabilities = 0;
 
 	OPT_ARGS(opts) = {
@@ -8641,35 +9009,41 @@ static int wdc_drive_status(int argc, char **argv, struct command *command,
 		goto out;
 	}
 
+	if (!get_dev_mgment_data(r, dev, &dev_mng_log)) {
+		fprintf(stderr, "ERROR: WDC: 0xC2 Log Page not found\n");
+		ret = -1;
+		goto out;
+	}
+
 	/* Get the assert dump present status */
-	if (!wdc_nvme_get_dev_status_log_data(r, dev, &assert_status,
+	if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &assert_status,
 			WDC_C2_ASSERT_DUMP_PRESENT_ID))
 		fprintf(stderr, "ERROR: WDC: Get Assert Status Failed\n");
 
 	/* Get the thermal throttling status */
-	if (!wdc_nvme_get_dev_status_log_data(r, dev, &thermal_status,
+	if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &thermal_status,
 			WDC_C2_THERMAL_THROTTLE_STATUS_ID))
 		fprintf(stderr, "ERROR: WDC: Get Thermal Throttling Status Failed\n");
 
 	/* Get EOL status */
-	if (!wdc_nvme_get_dev_status_log_data(r, dev, &eol_status,
+	if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &eol_status,
 			WDC_C2_USER_EOL_STATUS_ID)) {
 		fprintf(stderr, "ERROR: WDC: Get User EOL Status Failed\n");
 		eol_status = cpu_to_le32(-1);
 	}
 
 	/* Get Customer EOL state */
-	if (!wdc_nvme_get_dev_status_log_data(r, dev, &user_eol_state,
+	if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &user_eol_state,
 			WDC_C2_USER_EOL_STATE_ID))
 		fprintf(stderr, "ERROR: WDC: Get User EOL State Failed\n");
 
 	/* Get System EOL state*/
-	if (!wdc_nvme_get_dev_status_log_data(r, dev, &system_eol_state,
+	if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &system_eol_state,
 			WDC_C2_SYSTEM_EOL_STATE_ID))
 		fprintf(stderr, "ERROR: WDC: Get System EOL State Failed\n");
 
 	/* Get format corrupt reason*/
-	if (!wdc_nvme_get_dev_status_log_data(r, dev, &format_corrupt_reason,
+	if (!wdc_nvme_parse_dev_status_log_entry(dev_mng_log, &format_corrupt_reason,
 			WDC_C2_FORMAT_CORRUPT_REASON_ID))
 		fprintf(stderr, "ERROR: WDC: Get Format Corrupt Reason Failed\n");
 
@@ -8716,6 +9090,7 @@ static int wdc_drive_status(int argc, char **argv, struct command *command,
 	else
 		printf("  Format Corrupt Reason:	        Unknown : 0x%08x\n", le32_to_cpu(format_corrupt_reason));
 
+	free(dev_mng_log);
 out:
 	nvme_free_tree(r);
 	dev_close(dev);
diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h
index 6efdbc1..ed7f912 100644
--- a/plugins/wdc/wdc-nvme.h
+++ b/plugins/wdc/wdc-nvme.h
@@ -5,7 +5,7 @@
 #if !defined(WDC_NVME) || defined(CMD_HEADER_MULTI_READ)
 #define WDC_NVME
 
-#define WDC_PLUGIN_VERSION   "2.11.1"
+#define WDC_PLUGIN_VERSION   "2.12.0"
 #include "cmd.h"
 
 PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION),
diff --git a/plugins/wdc/wdc-utils.c b/plugins/wdc/wdc-utils.c
index 1b52e7c..3b1f325 100644
--- a/plugins/wdc/wdc-utils.c
+++ b/plugins/wdc/wdc-utils.c
@@ -81,7 +81,7 @@ int wdc_UtilsGetTime(PUtilsTimeInfo timeInfo)
 	timeInfo->second		=  currTimeInfo.tm_sec;
 	timeInfo->msecs			=  0;
 	timeInfo->isDST			=  currTimeInfo.tm_isdst;
-#if defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__)
+#if (defined(__GLIBC__) && !defined(__UCLIBC__) && !defined(__MUSL__)) || defined(__FreeBSD__)
 	timeInfo->zone			= -currTimeInfo.tm_gmtoff / 60;
 #else
 	timeInfo->zone			= -1 * (timezone / SECONDS_IN_MIN);
diff --git a/scripts/build.sh b/scripts/build.sh
index 1c2df50..fdfbaf2 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -193,11 +193,10 @@ tools_build_muon() {
 
     CC="${CC}" CFLAGS="${CFLAGS} -std=c99" ninja="${SAMU}" ./bootstrap.sh stage1
 
-    CC="${CC}" ninja="${SAMU}" stage1/muon setup        \
-        -Dprefix="${TOOLDIR}"                           \
-        -Ddocs=disabled                                 \
-        -Dsamurai=disabled                              \
-        -Dbestline=disabled                             \
+    CC="${CC}" ninja="${SAMU}" stage1/muon-bootstrap setup    \
+        -Dprefix="${TOOLDIR}"                                 \
+        -Ddocs=disabled                                       \
+        -Dsamurai=disabled                                    \
         "${TOOLDIR}/build-muon"
     "${SAMU}" -C "${TOOLDIR}/build-muon"
     MUON="${BUILDDIR}/build-tools/.build-muon/muon"
diff --git a/subprojects/json-c.wrap b/subprojects/json-c.wrap
index 569f78e..076739d 100644
--- a/subprojects/json-c.wrap
+++ b/subprojects/json-c.wrap
@@ -1,13 +1,13 @@
 [wrap-file]
-directory = json-c-0.17
-source_url = https://s3.amazonaws.com/json-c_releases/releases/json-c-0.17.tar.gz
-source_filename = json-c-0.17.tar.gz
-source_hash = 7550914d58fb63b2c3546f3ccfbe11f1c094147bd31a69dcd23714d7956159e6
-patch_filename = json-c_0.17-2_patch.zip
-patch_url = https://wrapdb.mesonbuild.com/v2/json-c_0.17-2/get_patch
-patch_hash = c1a9a7e2ea6bed89a59e13a5684be25899a5a510963154c4450c5a492b8f3984
-source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/json-c_0.17-2/json-c-0.17.tar.gz
-wrapdb_version = 0.17-2
+directory = json-c-0.18
+source_url = https://s3.amazonaws.com/json-c_releases/releases/json-c-0.18.tar.gz
+source_filename = json-c-0.18.tar.gz
+source_hash = 876ab046479166b869afc6896d288183bbc0e5843f141200c677b3e8dfb11724
+patch_filename = json-c_0.18-1_patch.zip
+patch_url = https://wrapdb.mesonbuild.com/v2/json-c_0.18-1/get_patch
+patch_hash = c9d2c0449a9686755445cd18d7cff597f21e418e11a786441de7b8947ff43798
+source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/json-c_0.18-1/json-c-0.18.tar.gz
+wrapdb_version = 0.18-1
 
 [provide]
 json-c = json_c_dep
diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap
index 55864ce..f9dd324 100644
--- a/subprojects/libnvme.wrap
+++ b/subprojects/libnvme.wrap
@@ -1,6 +1,6 @@
 [wrap-git]
 url = https://github.com/linux-nvme/libnvme.git
-revision = 2b3cb1746451f58583408a25857ca897d18cd4ca
+revision = 5ec1f5284ecb0eda481f3d2d61236fbc5b46164f
 
 [provide]
 libnvme = libnvme_dep
diff --git a/tests/nvme_attach_detach_ns_test.py b/tests/nvme_attach_detach_ns_test.py
index a0e6129..f236300 100644
--- a/tests/nvme_attach_detach_ns_test.py
+++ b/tests/nvme_attach_detach_ns_test.py
@@ -29,8 +29,6 @@ NVMe Namespace Management Testcase:-
     5. Delete Namespace.
 """
 
-import time
-
 from nvme_test import TestNVMe
 
 
@@ -59,7 +57,6 @@ class TestNVMeAttachDetachNSCmd(TestNVMe):
         self.setup_log_dir(self.__class__.__name__)
         self.ctrl_id = self.get_ctrl_id()
         self.delete_all_ns()
-        time.sleep(1)
 
     def tearDown(self):
         """
diff --git a/tests/nvme_compare_test.py b/tests/nvme_compare_test.py
index a34df68..f704d6c 100644
--- a/tests/nvme_compare_test.py
+++ b/tests/nvme_compare_test.py
@@ -30,6 +30,7 @@ NVMe Compare Command Testcase:-
 
 """
 
+from nvme_test import to_decimal
 from nvme_test_io import TestNVMeIO
 
 
@@ -52,7 +53,7 @@ class TestNVMeCompareCmd(TestNVMeIO):
             - Returns:
                 - True if 'compare' is supported, otherwise False
         """
-        return int(self.get_id_ctrl_field_value("oncs"), 16) & (1 << 0)
+        return to_decimal(self.get_id_ctrl_field_value("oncs")) & (1 << 0)
 
     def setUp(self):
         """ Pre Section for TestNVMeCompareCmd """
@@ -78,10 +79,10 @@ class TestNVMeCompareCmd(TestNVMeIO):
            - Returns:
                - return code of the nvme compare command.
         """
-        compare_cmd = "nvme compare " + self.ns1 + " --start-block=" + \
-                      str(self.start_block) + " --block-count=" + \
-                      str(self.block_count) + " --data-size=" + \
-                      str(self.data_size) + " --data=" + cmp_file
+        compare_cmd = f"{self.nvme_bin} compare {self.ns1} " + \
+            f"--start-block={str(self.start_block)} " + \
+            f"--block-count={str(self.block_count)} " + \
+            f"--data-size={str(self.data_size)} --data={cmp_file}"
         return self.exec_cmd(compare_cmd)
 
     def test_nvme_compare(self):
diff --git a/tests/nvme_copy_test.py b/tests/nvme_copy_test.py
index 5d16b00..f73cd04 100644
--- a/tests/nvme_copy_test.py
+++ b/tests/nvme_copy_test.py
@@ -34,15 +34,20 @@ class TestNVMeCopy(TestNVMe):
     def setUp(self):
         """ Pre Section for TestNVMeCopy """
         super().setUp()
-        print("\nSetting up test...")
         self.ocfs = self.get_ocfs()
         self.host_behavior_data = None
         cross_namespace_copy = self.ocfs & 0xc
         if cross_namespace_copy:
             # get host behavior support data
-            get_features_cmd = ["nvme", "get-feature", self.ctrl, "--feature-id=0x16", "--data-len=512", "-b"]
-            print("Running command:", " ".join(get_features_cmd))
-            self.host_behavior_data = subprocess.check_output(get_features_cmd)
+            get_features_cmd = f"{self.nvme_bin} get-feature {self.ctrl} " + \
+                "--feature-id=0x16 --data-len=512 --raw-binary"
+            proc = subprocess.Popen(get_features_cmd,
+                                    shell=True,
+                                    stdout=subprocess.PIPE,
+                                    encoding='utf-8')
+            err = proc.wait()
+            self.assertEqual(err, 0, "ERROR : nvme get-feature failed")
+            self.host_behavior_data = proc.stdout.read()
             # enable cross-namespace copy formats
             if self.host_behavior_data[4] & cross_namespace_copy:
                 # skip if already enabled
@@ -50,29 +55,37 @@ class TestNVMeCopy(TestNVMe):
                 self.host_behavior_data = None
             else:
                 data = self.host_behavior_data[:4] + cross_namespace_copy.to_bytes(2, 'little') + self.host_behavior_data[6:]
-                set_features_cmd = ["nvme", "set-feature", self.ctrl, "--feature-id=0x16", "--data-len=512"]
-                print("Running command:", " ".join(set_features_cmd))
+                set_features_cmd = f"{self.nvme_bin} set-feature " + \
+                    f"{self.ctrl} --feature-id=0x16 --data-len=512"
                 proc = subprocess.Popen(set_features_cmd,
+                                        shell=True,
                                         stdout=subprocess.PIPE,
-                                        stdin=subprocess.PIPE)
+                                        stdin=subprocess.PIPE,
+                                        encoding='utf-8')
                 proc.communicate(input=data)
                 self.assertEqual(proc.returncode, 0, "Failed to enable cross-namespace copy formats")
-        get_ns_id_cmd = ["nvme", "get-ns-id", self.ns1]
-        print("Running command:", " ".join(get_ns_id_cmd))
-        output = subprocess.check_output(get_ns_id_cmd)
-        self.ns1_nsid = int(output.decode().strip().split(':')[-1])
+        get_ns_id_cmd = f"{self.nvme_bin} get-ns-id {self.ns1}"
+        proc = subprocess.Popen(get_ns_id_cmd,
+                                shell=True,
+                                stdout=subprocess.PIPE,
+                                encoding='utf-8')
+        err = proc.wait()
+        self.assertEqual(err, 0, "ERROR : nvme get-ns-id failed")
+        output = proc.stdout.read()
+        self.ns1_nsid = int(output.strip().split(':')[-1])
         self.setup_log_dir(self.__class__.__name__)
 
     def tearDown(self):
         """ Post Section for TestNVMeCopy """
-        print("Tearing down test...")
         if self.host_behavior_data:
             # restore saved host behavior support data
-            set_features_cmd = ["nvme", "set-feature", self.ctrl, "--feature-id=0x16", "--data-len=512"]
-            print("Running command:", " ".join(set_features_cmd))
+            set_features_cmd = f"{self.nvme_bin} set-feature {self.ctrl} " + \
+                "--feature-id=0x16 --data-len=512"
             proc = subprocess.Popen(set_features_cmd,
+                                    shell=True,
                                     stdout=subprocess.PIPE,
-                                    stdin=subprocess.PIPE)
+                                    stdin=subprocess.PIPE,
+                                    encoding='utf-8')
             proc.communicate(input=self.host_behavior_data)
         super().tearDown()
 
@@ -94,18 +107,18 @@ class TestNVMeCopy(TestNVMe):
             print(f"Skip copy because descriptor format {desc_format} is not supported")
             return
         # build copy command
-        copy_cmd = f"nvme copy {self.ns1} --format={desc_format} --sdlba={sdlba} --blocks={blocks} --slbs={slbs}"
+        copy_cmd = f"{self.nvme_bin} copy {self.ns1} " + \
+            f"--format={desc_format} --sdlba={sdlba} --blocks={blocks} " + \
+            f"--slbs={slbs}"
         if "snsids" in kwargs:
             copy_cmd += f" --snsids={kwargs['snsids']}"
         if "sopts" in kwargs:
             copy_cmd += f" --sopts={kwargs['sopts']}"
         # run and assert success
-        print("Running command:", copy_cmd)
         self.assertEqual(self.exec_cmd(copy_cmd), 0)
 
     def test_copy(self):
         """ Testcase main """
-        print("Running test...")
         self.copy(0, 1, 2, descriptor_format=0)
         self.copy(0, 1, 2, descriptor_format=1)
         self.copy(0, 1, 2, descriptor_format=2, snsids=self.ns1_nsid)
diff --git a/tests/nvme_create_max_ns_test.py b/tests/nvme_create_max_ns_test.py
index 76cd4d4..41e7a8d 100644
--- a/tests/nvme_create_max_ns_test.py
+++ b/tests/nvme_create_max_ns_test.py
@@ -29,8 +29,6 @@ NVMe Namespace Management Testcase:-
     5. Delete all Namespaces.
 """
 
-import time
-
 from nvme_test import TestNVMe
 
 
@@ -52,8 +50,9 @@ class TestNVMeCreateMaxNS(TestNVMe):
         super().setUp()
         self.dps = 0
         self.flbas = 0
+        (ds, ms) = self.get_lba_format_size()
         self.nsze = int(self.get_ncap() /
-                        self.get_format() / self.get_max_ns())
+                        (ds + ms) / self.get_max_ns())
         # Make sure that we have enough capacity for each ns.
         # Creating a ns might allocate more bits (NVMCAP) than specified by
         # nsze and ncap.
@@ -63,7 +62,6 @@ class TestNVMeCreateMaxNS(TestNVMe):
         self.max_ns = self.get_max_ns()
         self.ctrl_id = self.get_ctrl_id()
         self.delete_all_ns()
-        time.sleep(1)
 
     def tearDown(self):
         """
@@ -85,21 +83,21 @@ class TestNVMeCreateMaxNS(TestNVMe):
         """ Testcase main """
         print(f"##### Testing max_ns: {self.max_ns}")
         for nsid in range(1, self.max_ns + 1):
-            print("##### Creating " + str(nsid))
+            print(f"##### Creating {nsid}")
             err = self.create_and_validate_ns(nsid,
                                               self.nsze,
                                               self.ncap,
                                               self.flbas,
                                               self.dps)
             self.assertEqual(err, 0)
-            print("##### Attaching " + str(nsid))
+            print(f"##### Attaching {nsid}")
             self.assertEqual(self.attach_ns(self.ctrl_id, nsid), 0)
-            print("##### Running IOs in " + str(nsid))
+            print(f"##### Running IOs in {nsid}")
             self.run_ns_io(nsid, 9, 1)
 
         for nsid in range(1, self.max_ns + 1):
-            print("##### Detaching " + str(nsid))
+            print(f"##### Detaching {nsid}")
             self.assertEqual(self.detach_ns(self.ctrl_id, nsid), 0)
-            print("#### Deleting " + str(nsid))
+            print(f"#### Deleting {nsid}")
             self.assertEqual(self.delete_and_validate_ns(nsid), 0)
         self.nvme_reset_ctrl()
diff --git a/tests/nvme_ctrl_reset_test.py b/tests/nvme_ctrl_reset_test.py
index e2c8a00..f32042e 100644
--- a/tests/nvme_ctrl_reset_test.py
+++ b/tests/nvme_ctrl_reset_test.py
@@ -40,7 +40,7 @@ class TestNVMeCtrlReset(TestNVMe):
             - Returns:
                 - return code for nvme controller reset.
         """
-        ctrl_reset_cmd = "nvme reset " + self.ctrl
+        ctrl_reset_cmd = f"{self.nvme_bin} reset {self.ctrl}"
         return self.exec_cmd(ctrl_reset_cmd)
 
     def test_ctrl_reset(self):
diff --git a/tests/nvme_dsm_test.py b/tests/nvme_dsm_test.py
index d92bf58..4ad3e05 100644
--- a/tests/nvme_dsm_test.py
+++ b/tests/nvme_dsm_test.py
@@ -45,10 +45,9 @@ class TestNVMeDsm(TestNVMe):
             - Returns:
                 - return code for nvme dsm command.
         """
-        dsm_cmd = "nvme dsm " + self.ctrl + \
-                  " --namespace-id=" + str(self.namespace) + \
-                  " --blocks=" + str(self.range) + \
-                  " --slbs=" + str(self.start_block)
+        dsm_cmd = f"{self.nvme_bin} dsm {self.ctrl} " + \
+            f"--namespace-id={str(self.namespace)} " + \
+            f"--blocks={str(self.range)} --slbs={str(self.start_block)}"
         return self.exec_cmd(dsm_cmd)
 
     def test_dsm(self):
diff --git a/tests/nvme_flush_test.py b/tests/nvme_flush_test.py
index e4f127d..0f2d3c5 100644
--- a/tests/nvme_flush_test.py
+++ b/tests/nvme_flush_test.py
@@ -53,8 +53,8 @@ class TestNVMeFlushCmd(TestNVMe):
            - Returns:
                - None
         """
-        flush_cmd = "nvme flush " + self.ctrl + " -n " + str(self.default_nsid)
-        print(flush_cmd)
+        flush_cmd = f"{self.nvme_bin} flush {self.ctrl} " + \
+            f"--namespace-id={str(self.default_nsid)}"
         return self.exec_cmd(flush_cmd)
 
     def test_nvme_flush(self):
diff --git a/tests/nvme_format_test.py b/tests/nvme_format_test.py
index 12bc128..68445ac 100644
--- a/tests/nvme_format_test.py
+++ b/tests/nvme_format_test.py
@@ -37,9 +37,9 @@ Namespace Format testcase :-
            - Delete Namespace.
 """
 
+import json
 import math
 import subprocess
-import time
 
 from nvme_test import TestNVMe
 
@@ -55,9 +55,7 @@ class TestNVMeFormatCmd(TestNVMe):
               - nsze : namespace size.
               - ncap : namespace capacity.
               - ctrl_id : controller id.
-              - lba_format_list : lis of supported format.
-              - ms_list : list of metadat size per format.
-              - lbads_list : list of LBA data size per format.
+              - lba_format_list : json list of supported format.
               - test_log_dir : directory for logs, temp files.
     """
 
@@ -74,12 +72,9 @@ class TestNVMeFormatCmd(TestNVMe):
         self.nsze = ncap
         self.ctrl_id = self.get_ctrl_id()
         self.lba_format_list = []
-        self.ms_list = []
-        self.lbads_list = []
         self.test_log_dir = self.log_dir + "/" + self.__class__.__name__
         self.setup_log_dir(self.__class__.__name__)
         self.delete_all_ns()
-        time.sleep(1)
 
     def tearDown(self):
         """
@@ -106,50 +101,44 @@ class TestNVMeFormatCmd(TestNVMe):
                                                      self.dps), 0)
         self.assertEqual(self.attach_ns(self.ctrl_id, self.default_nsid), 0)
         # read lbaf information
-        id_ns = "nvme id-ns " + self.ctrl + \
-                " -n1 | grep ^lbaf | awk '{print $2}' | tr -s \"\\n\" \" \""
-        proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE,
+        id_ns_cmd = f"{self.nvme_bin} id-ns {self.ctrl} " + \
+            f"--namespace-id={self.default_nsid} --output-format=json"
+        proc = subprocess.Popen(id_ns_cmd,
+                                shell=True,
+                                stdout=subprocess.PIPE,
                                 encoding='utf-8')
-        self.lba_format_list = proc.stdout.read().strip().split(" ")
-        if proc.wait() == 0:
-            # read lbads information
-            id_ns = "nvme id-ns " + self.ctrl + \
-                    " -n1 | grep ^lbaf | awk '{print $5}'" + \
-                    " | cut -f 2 -d ':' | tr -s \"\\n\" \" \""
-            proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE,
-                                    encoding='utf-8')
-            self.lbads_list = proc.stdout.read().strip().split(" ")
-            # read metadata information
-            id_ns = "nvme id-ns " + self.ctrl + \
-                    " -n1 | grep ^lbaf | awk '{print $4}'" + \
-                    " | cut -f 2 -d ':' | tr -s \"\\n\" \" \""
-            proc = subprocess.Popen(id_ns, shell=True, stdout=subprocess.PIPE,
-                                    encoding='utf-8')
-            self.ms_list = proc.stdout.read().strip().split(" ")
-            self.assertEqual(self.detach_ns(self.ctrl_id, self.default_nsid), 0)
-            self.assertEqual(self.delete_and_validate_ns(self.default_nsid), 0)
-            self.nvme_reset_ctrl()
+        err = proc.wait()
+        self.assertEqual(err, 0, "ERROR : nvme id-ns failed")
+        json_output = json.loads(proc.stdout.read())
+        self.lba_format_list = json_output['lbafs']
+        self.assertTrue(len(self.lba_format_list) > 0,
+                        "ERROR : nvme id-ns could not find any lba formats")
+        self.assertEqual(self.detach_ns(self.ctrl_id, self.default_nsid), 0)
+        self.assertEqual(self.delete_and_validate_ns(self.default_nsid), 0)
+        self.nvme_reset_ctrl()
 
     def test_format_ns(self):
         """ Testcase main """
         # extract the supported format information.
         self.attach_detach_primary_ns()
 
+        print("##### Testing lba formats:")
         # iterate through all supported format
-        for i in range(0, len(self.lba_format_list)):
-            print("\nlba format " + str(self.lba_format_list[i]) +
-                  " lbad       " + str(self.lbads_list[i]) +
-                  " ms         " + str(self.ms_list[i]))
-            metadata_size = 1 if self.ms_list[i] == '8' else 0
+        for flbas, lba_format in enumerate(self.lba_format_list):
+            ds = lba_format['ds']
+            ms = lba_format['ms']
+            print(f"\nlba format {str(flbas)}"
+                  f"\nds         {str(ds)}"
+                  f"\nms         {str(ms)}")
+            dps = 1 if str(ms) == '8' else 0
             err = self.create_and_validate_ns(self.default_nsid,
                                               self.nsze,
                                               self.ncap,
-                                              self.lba_format_list[i],
-                                              metadata_size)
+                                              flbas,
+                                              dps)
             self.assertEqual(err, 0)
             self.assertEqual(self.attach_ns(self.ctrl_id, self.default_nsid), 0)
-            self.run_ns_io(self.default_nsid, self.lbads_list[i])
-            time.sleep(5)
+            self.run_ns_io(self.default_nsid, int(ds))
             self.assertEqual(self.detach_ns(self.ctrl_id, self.default_nsid), 0)
             self.assertEqual(self.delete_and_validate_ns(self.default_nsid), 0)
             self.nvme_reset_ctrl()
diff --git a/tests/nvme_fw_log_test.py b/tests/nvme_fw_log_test.py
index b670671..e56953d 100644
--- a/tests/nvme_fw_log_test.py
+++ b/tests/nvme_fw_log_test.py
@@ -57,16 +57,12 @@ class TestNVMeFwLogCmd(TestNVMe):
             - Returns:
                 - 0 on success, error code on failure.
         """
-        err = 0
-        fw_log_cmd = "nvme fw-log " + self.ctrl
+        fw_log_cmd = f"{self.nvme_bin} fw-log {self.ctrl}"
         proc = subprocess.Popen(fw_log_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
-        fw_log_output = proc.communicate()[0]
-        print("\n" + fw_log_output + "\n")
-        err = proc.wait()
-        return err
+        return proc.wait()
 
     def test_fw_log(self):
         """ Testcase main """
diff --git a/tests/nvme_get_features_test.py b/tests/nvme_get_features_test.py
index fc3e5bf..d1bf621 100644
--- a/tests/nvme_get_features_test.py
+++ b/tests/nvme_get_features_test.py
@@ -81,27 +81,23 @@ class TestNVMeGetMandatoryFeatures(TestNVMe):
         """
         if str(feature_id) == "0x09":
             for vector in range(self.vector_list_len):
-                get_feat_cmd = "nvme get-feature " + self.ctrl + \
-                               " --feature-id=" + str(feature_id) + \
-                               " --cdw11=" + str(vector) + " -H"
+                get_feat_cmd = f"{self.nvme_bin} get-feature {self.ctrl} " + \
+                    f"--feature-id={str(feature_id)} " + \
+                    f"--cdw11={str(vector)} --human-readable"
                 proc = subprocess.Popen(get_feat_cmd,
                                         shell=True,
                                         stdout=subprocess.PIPE,
                                         encoding='utf-8')
-                feature_output = proc.communicate()[0]
-                print(feature_output)
                 self.assertEqual(proc.wait(), 0)
         else:
-            get_feat_cmd = "nvme get-feature " + self.ctrl + \
-                           " --feature-id=" + str(feature_id) + " -H"
+            get_feat_cmd = f"{self.nvme_bin} get-feature {self.ctrl} " + \
+                f"--feature-id={str(feature_id)} --human-readable"
             if str(feature_id) == "0x05":
                 get_feat_cmd += f" --namespace-id={self.default_nsid}"
             proc = subprocess.Popen(get_feat_cmd,
                                     shell=True,
                                     stdout=subprocess.PIPE,
                                     encoding='utf-8')
-            feature_output = proc.communicate()[0]
-            print(feature_output)
             self.assertEqual(proc.wait(), 0)
 
     def test_get_mandatory_features(self):
diff --git a/tests/nvme_get_lba_status_test.py b/tests/nvme_get_lba_status_test.py
index d9e543c..15842cf 100644
--- a/tests/nvme_get_lba_status_test.py
+++ b/tests/nvme_get_lba_status_test.py
@@ -50,21 +50,17 @@ class TestNVMeGetLbaStatusCmd(TestNVMe):
             - Returns:
                 - 0 on success, error code on failure.
         """
-        err = 0
-        get_lba_status_cmd = "nvme get-lba-status " + self.ctrl + \
-                             " --namespace-id=" + str(self.ns1) + \
-                             " --start-lba=" + str(self.start_lba) + \
-                             " --max-dw=" + str(self.max_dw) + \
-                             " --action=" + str(self.action) + \
-                             " --range-len=" + str(self.range_len)
+        get_lba_status_cmd = f"{self.nvme_bin} get-lba-status {self.ctrl} " + \
+            f"--namespace-id={str(self.ns1)} " + \
+            f"--start-lba={str(self.start_lba)} " + \
+            f"--max-dw={str(self.max_dw)} " + \
+            f"--action={str(self.action)} " + \
+            f"--range-len={str(self.range_len)}"
         proc = subprocess.Popen(get_lba_status_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
-        get_lba_status_output = proc.communicate()[0]
-        print("\n" + get_lba_status_output + "\n")
-        err = proc.wait()
-        return err
+        return proc.wait()
 
     def test_get_lba_status(self):
         """ Testcase main """
diff --git a/tests/nvme_id_ns_test.py b/tests/nvme_id_ns_test.py
index 66e2f93..46ed3ee 100644
--- a/tests/nvme_id_ns_test.py
+++ b/tests/nvme_id_ns_test.py
@@ -42,7 +42,7 @@ class TestNVMeIdentifyNamespace(TestNVMe):
         """ Pre Section for TestNVMeIdentifyNamespace. """
         super().setUp()
         self.setup_log_dir(self.__class__.__name__)
-        self.ns_list = self.get_ns_list()
+        self.nsid_list = self.get_nsid_list()
 
     def tearDown(self):
         """
@@ -60,16 +60,13 @@ class TestNVMeIdentifyNamespace(TestNVMe):
             - Returns:
                 - 0 on success, error code on failure.
         """
-        err = 0
-        id_ns_cmd = "nvme id-ns " + self.ctrl + "n" + str(nsid)
+        id_ns_cmd = f"{self.nvme_bin} id-ns {self.ctrl} " + \
+            f"--namespace-id={str(nsid)}"
         proc = subprocess.Popen(id_ns_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
-        id_ns_output = proc.communicate()[0]
-        print(id_ns_output + "\n")
-        err = proc.wait()
-        return err
+        return proc.wait()
 
     def get_id_ns_all(self):
         """
@@ -80,7 +77,7 @@ class TestNVMeIdentifyNamespace(TestNVMe):
                 - 0 on success, error code on failure.
         """
         err = 0
-        for namespace in self.ns_list:
+        for namespace in self.nsid_list:
             err = self.get_id_ns(str(namespace))
         return err
 
diff --git a/tests/nvme_lba_status_log_test.py b/tests/nvme_lba_status_log_test.py
index a50e211..079fe5c 100644
--- a/tests/nvme_lba_status_log_test.py
+++ b/tests/nvme_lba_status_log_test.py
@@ -45,16 +45,12 @@ class TestNVMeLbaStatLogCmd(TestNVMe):
             - Returns:
                 - 0 on success, error code on failure.
         """
-        err = 0
-        lba_stat_log_cmd = "nvme lba-status-log " + self.ctrl
+        lba_stat_log_cmd = f"{self.nvme_bin} lba-status-log {self.ctrl}"
         proc = subprocess.Popen(lba_stat_log_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
-        lba_stat_log_output = proc.communicate()[0]
-        print("\n" + lba_stat_log_output + "\n")
-        err = proc.wait()
-        return err
+        return proc.wait()
 
     def test_lba_stat_log(self):
         """ Testcase main """
diff --git a/tests/nvme_smart_log_test.py b/tests/nvme_smart_log_test.py
index 196998b..2bc81d8 100644
--- a/tests/nvme_smart_log_test.py
+++ b/tests/nvme_smart_log_test.py
@@ -27,7 +27,7 @@ NVMe Smart Log Verification Testcase:-
 
 """
 
-from nvme_test import TestNVMe
+from nvme_test import TestNVMe, to_decimal
 
 
 class TestNVMeSmartLogCmd(TestNVMe):
@@ -76,14 +76,14 @@ class TestNVMeSmartLogCmd(TestNVMe):
             - Returns:
                 - 0 on success, error code on failure.
         """
-        ns_list = self.get_ns_list()
-        for nsid in range(0, len(ns_list)):
-            self.get_smart_log_ns(ns_list[nsid])
+        nsid_list = self.get_nsid_list()
+        for nsid in nsid_list:
+            self.get_smart_log_ns(nsid)
         return 0
 
     def test_smart_log(self):
         """ Testcase main """
         self.assertEqual(self.get_smart_log_ctrl(), 0)
-        smlp = self.supp_check_id_ctrl("lpa")
+        smlp = to_decimal(self.get_id_ctrl_field_value("lpa"))
         if smlp & 0x1:
             self.assertEqual(self.get_smart_log_all_ns(), 0)
diff --git a/tests/nvme_test.py b/tests/nvme_test.py
index a13a993..80750f5 100644
--- a/tests/nvme_test.py
+++ b/tests/nvme_test.py
@@ -30,12 +30,22 @@ import shutil
 import stat
 import subprocess
 import sys
-import time
 import unittest
+import time
 
 from nvme_test_logger import TestNVMeLogger
 
 
+def to_decimal(value):
+    """ Wrapper for converting numbers to base 10 decimal
+        - Args:
+            - value: A number in any common base
+        - Returns:
+            - Decimal integer
+    """
+    return int(str(value), 0)
+
+
 class TestNVMe(unittest.TestCase):
 
     """
@@ -58,19 +68,28 @@ class TestNVMe(unittest.TestCase):
         self.ctrl = "XXX"
         self.ns1 = "XXX"
         self.test_log_dir = "XXX"
+        self.nvme_bin = "nvme"
         self.do_validate_pci_device = True
         self.default_nsid = 0x1
+        self.flbas = 0
         self.config_file = 'tests/config.json'
 
         self.load_config()
         if self.do_validate_pci_device:
             self.validate_pci_device()
+        self.create_and_attach_default_ns()
+        print(f"\nsetup: ctrl: {self.ctrl}, ns1: {self.ns1}, default_nsid: {self.default_nsid}, flbas: {self.flbas}\n")
 
     def tearDown(self):
         """ Post Section for TestNVMe. """
         if self.clear_log_dir is True:
             shutil.rmtree(self.log_dir, ignore_errors=True)
         self.create_and_attach_default_ns()
+        print(f"\nteardown: ctrl: {self.ctrl}, ns1: {self.ns1}, default_nsid: {self.default_nsid}, flbas: {self.flbas}\n")
+
+    @classmethod
+    def tearDownClass(cls):
+        print("\n")
 
     def create_and_attach_default_ns(self):
         """ Creates a default namespace with the full capacity of the ctrls NVM
@@ -103,8 +122,8 @@ class TestNVMe(unittest.TestCase):
                 - None
         """
         x1, x2, dev = self.ctrl.split('/')
-        cmd = cmd = "find /sys/devices -name \\*" + dev + " | grep -i pci"
-        err = subprocess.call(cmd, shell=True)
+        cmd = "find /sys/devices -name \\*" + dev + " | grep -i pci"
+        err = subprocess.call(cmd, shell=True, stdout=subprocess.DEVNULL)
         self.assertEqual(err, 0, "ERROR : Only NVMe PCI subsystem is supported")
 
     def load_config(self):
@@ -119,7 +138,10 @@ class TestNVMe(unittest.TestCase):
             self.ctrl = config['controller']
             self.ns1 = config['ns1']
             self.log_dir = config['log_dir']
-            self.do_validate_pci_device = config.get('do_validate_pci_device', self.do_validate_pci_device)
+            self.nvme_bin = config.get('nvme_bin', self.nvme_bin)
+            print(f"\nUsing nvme binary '{self.nvme_bin}'")
+            self.do_validate_pci_device = config.get(
+                'do_validate_pci_device', self.do_validate_pci_device)
             self.clear_log_dir = False
 
             if self.clear_log_dir is True:
@@ -154,20 +176,17 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - None
         """
-        nvme_reset_cmd = "nvme reset " + self.ctrl
+        nvme_reset_cmd = f"{self.nvme_bin} reset {self.ctrl}"
         err = subprocess.call(nvme_reset_cmd,
                               shell=True,
-                              stdout=subprocess.PIPE,
-                              encoding='utf-8')
+                              stdout=subprocess.DEVNULL)
         self.assertEqual(err, 0, "ERROR : nvme reset failed")
-        time.sleep(5)
         rescan_cmd = "echo 1 > /sys/bus/pci/rescan"
         proc = subprocess.Popen(rescan_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 stderr=subprocess.PIPE,
                                 encoding='utf-8')
-        time.sleep(5)
         self.assertEqual(proc.wait(), 0, "ERROR : pci rescan failed")
 
     def get_ctrl_id(self):
@@ -177,7 +196,8 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - controller id.
         """
-        get_ctrl_id = f"nvme list-ctrl {self.ctrl} --output-format=json"
+        get_ctrl_id = f"{self.nvme_bin} list-ctrl {self.ctrl} " + \
+            "--output-format=json"
         proc = subprocess.Popen(get_ctrl_id,
                                 shell=True,
                                 stdout=subprocess.PIPE,
@@ -189,7 +209,7 @@ class TestNVMe(unittest.TestCase):
                         "ERROR : nvme list-ctrl could not find ctrl")
         return str(json_output['ctrl_list'][0]['ctrl_id'])
 
-    def get_ns_list(self):
+    def get_nsid_list(self):
         """ Wrapper for extracting the namespace list.
             - Args:
                 - None
@@ -197,14 +217,17 @@ class TestNVMe(unittest.TestCase):
                 - List of the namespaces.
         """
         ns_list = []
-        ns_list_cmd = "nvme list-ns " + self.ctrl
+        ns_list_cmd = f"{self.nvme_bin} list-ns {self.ctrl} " + \
+            "--output-format=json"
         proc = subprocess.Popen(ns_list_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
         self.assertEqual(proc.wait(), 0, "ERROR : nvme list namespace failed")
-        for line in proc.stdout:
-            ns_list.append(line.split('x')[-1])
+        json_output = json.loads(proc.stdout.read())
+
+        for ns in json_output['nsid_list']:
+            ns_list.append(ns['nsid'])
 
         return ns_list
 
@@ -215,22 +238,16 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - maximum number of namespaces supported.
         """
-        pattern = re.compile("^nn[ ]+: [0-9]", re.IGNORECASE)
-        max_ns = -1
-        max_ns_cmd = "nvme id-ctrl " + self.ctrl
+        max_ns_cmd = f"{self.nvme_bin} id-ctrl {self.ctrl} " + \
+            "--output-format=json"
         proc = subprocess.Popen(max_ns_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
         err = proc.wait()
         self.assertEqual(err, 0, "ERROR : reading maximum namespace count failed")
-
-        for line in proc.stdout:
-            if pattern.match(line):
-                max_ns = line.split(":")[1].strip()
-                break
-        print(max_ns)
-        return int(max_ns)
+        json_output = json.loads(proc.stdout.read())
+        return int(json_output['nn'])
 
     def get_lba_status_supported(self):
         """ Check if 'Get LBA Status' command is supported by the device
@@ -239,7 +256,7 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - True if 'Get LBA Status' command is supported, otherwise False
         """
-        return int(self.get_id_ctrl_field_value("oacs"), 16) & (1 << 9)
+        return to_decimal(self.get_id_ctrl_field_value("oacs")) & (1 << 9)
 
     def get_lba_format_size(self):
         """ Wrapper for extracting lba format size of the given flbas
@@ -248,7 +265,8 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - lba format size as a tuple of (data_size, metadata_size) in bytes.
         """
-        nvme_id_ns_cmd = f"nvme id-ns {self.ns1} --output-format=json"
+        nvme_id_ns_cmd = f"{self.nvme_bin} id-ns {self.ns1} " + \
+            "--output-format=json"
         proc = subprocess.Popen(nvme_id_ns_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
@@ -274,24 +292,9 @@ class TestNVMe(unittest.TestCase):
             - Args:
                 - None
             - Returns:
-                - maximum number of namespaces supported.
+                - Total NVM capacity.
         """
-        pattern = re.compile("^tnvmcap[ ]+: [0-9]", re.IGNORECASE)
-        ncap = -1
-        ncap_cmd = "nvme id-ctrl " + self.ctrl
-        proc = subprocess.Popen(ncap_cmd,
-                                shell=True,
-                                stdout=subprocess.PIPE,
-                                encoding='utf-8')
-        err = proc.wait()
-        self.assertEqual(err, 0, "ERROR : reading nvm capacity failed")
-
-        for line in proc.stdout:
-            if pattern.match(line):
-                ncap = line.split(":")[1].strip()
-                break
-        print(ncap)
-        return int(ncap)
+        return to_decimal(self.get_id_ctrl_field_value("tnvmcap"))
 
     def get_id_ctrl_field_value(self, field):
         """ Wrapper for extracting id-ctrl field values
@@ -300,7 +303,8 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - Filed value of the given field
         """
-        id_ctrl_cmd = f"nvme id-ctrl {self.ctrl} --output-format=json"
+        id_ctrl_cmd = f"{self.nvme_bin} id-ctrl {self.ctrl} " + \
+            "--output-format=json"
         proc = subprocess.Popen(id_ctrl_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
@@ -319,30 +323,7 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - Optional Copy Formats Supported
         """
-        return int(self.get_id_ctrl_field_value("ocfs"), 16)
-
-    def get_format(self):
-        """ Wrapper for extracting format.
-            - Args:
-                - None
-            - Returns:
-                - maximum format of namespace.
-        """
-        # defaulting to 4K
-        nvm_format = 4096
-        nvm_format_cmd = "nvme id-ns " + self.ctrl + " -n1"
-        proc = subprocess.Popen(nvm_format_cmd,
-                                shell=True,
-                                stdout=subprocess.PIPE,
-                                encoding='utf-8')
-        err = proc.wait()
-        self.assertEqual(err, 0, "ERROR : reading nvm capacity failed")
-
-        for line in proc.stdout:
-            if "in use" in line:
-                nvm_format = 2 ** int(line.split(":")[3].split()[0])
-        print(nvm_format)
-        return int(nvm_format)
+        return to_decimal(self.get_id_ctrl_field_value("ocfs"))
 
     def delete_all_ns(self):
         """ Wrapper for deleting all the namespaces.
@@ -351,15 +332,19 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - None
         """
-        delete_ns_cmd = "nvme delete-ns " + self.ctrl + " -n 0xFFFFFFFF"
+        delete_ns_cmd = f"{self.nvme_bin} delete-ns {self.ctrl} " + \
+            "--namespace-id=0xFFFFFFFF"
         self.assertEqual(self.exec_cmd(delete_ns_cmd), 0)
-        list_ns_cmd = "nvme list-ns " + self.ctrl + " --all | wc -l"
+        list_ns_cmd = f"{self.nvme_bin} list-ns {self.ctrl} --all " + \
+            "--output-format=json"
         proc = subprocess.Popen(list_ns_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
-        output = proc.stdout.read().strip()
-        self.assertEqual(output, '0', "ERROR : deleting all namespace failed")
+        self.assertEqual(proc.wait(), 0, "ERROR : nvme list-ns failed")
+        json_output = json.loads(proc.stdout.read())
+        self.assertEqual(len(json_output['nsid_list']), 0,
+                         "ERROR : deleting all namespace failed")
 
     def create_ns(self, nsze, ncap, flbas, dps):
         """ Wrapper for creating a namespace.
@@ -371,9 +356,9 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - return code of the nvme create namespace command.
         """
-        create_ns_cmd = "nvme create-ns " + self.ctrl + " --nsze=" + \
-                        str(nsze) + " --ncap=" + str(ncap) + \
-                        " --flbas=" + str(flbas) + " --dps=" + str(dps)
+        create_ns_cmd = f"{self.nvme_bin} create-ns {self.ctrl} " + \
+            f"--nsze={str(nsze)} --ncap={str(ncap)} --flbas={str(flbas)} " + \
+            f"--dps={str(dps)} --verbose"
         return self.exec_cmd(create_ns_cmd)
 
     def create_and_validate_ns(self, nsid, nsze, ncap, flbas, dps):
@@ -389,15 +374,14 @@ class TestNVMe(unittest.TestCase):
         """
         err = self.create_ns(nsze, ncap, flbas, dps)
         if err == 0:
-            time.sleep(2)
-            id_ns_cmd = "nvme id-ns " + self.ctrl + " -n " + str(nsid)
+            id_ns_cmd = f"{self.nvme_bin} id-ns {self.ctrl} " + \
+                f"--namespace-id={str(nsid)}"
             err = subprocess.call(id_ns_cmd,
                                   shell=True,
-                                  stdout=subprocess.PIPE,
-                                  encoding='utf-8')
+                                  stdout=subprocess.DEVNULL)
         return err
 
-    def attach_ns(self, ctrl_id, ns_id):
+    def attach_ns(self, ctrl_id, nsid):
         """ Wrapper for attaching the namespace.
             - Args:
                 - ctrl_id : controller id to which namespace to be attached.
@@ -405,21 +389,23 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - 0 on success, error code on failure.
         """
-        attach_ns_cmd = "nvme attach-ns " + self.ctrl + \
-                        " --namespace-id=" + str(ns_id) + \
-                        " --controllers=" + ctrl_id
+        attach_ns_cmd = f"{self.nvme_bin} attach-ns {self.ctrl} " + \
+            f"--namespace-id={str(nsid)} --controllers={ctrl_id} --verbose"
         err = subprocess.call(attach_ns_cmd,
                               shell=True,
-                              stdout=subprocess.PIPE,
-                              encoding='utf-8')
-        time.sleep(5)
-        if err == 0:
-            # enumerate new namespace block device
-            self.nvme_reset_ctrl()
-            time.sleep(5)
-            # check if new namespace block device exists
-            err = 0 if stat.S_ISBLK(os.stat(self.ns1).st_mode) else 1
-        return err
+                              stdout=subprocess.DEVNULL)
+        if err != 0:
+            return err
+
+        # Try to find block device for 5 seconds
+        device_path = f"{self.ctrl}n{str(nsid)}"
+        stop_time = time.time() + 5
+        while time.time() < stop_time:
+            if os.path.exists(device_path) and stat.S_ISBLK(os.stat(device_path).st_mode):
+                return 0
+            time.sleep(0.1)
+
+        return 1
 
     def detach_ns(self, ctrl_id, nsid):
         """ Wrapper for detaching the namespace.
@@ -429,13 +415,11 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - 0 on success, error code on failure.
         """
-        detach_ns_cmd = "nvme detach-ns " + self.ctrl + \
-                        " --namespace-id=" + str(nsid) + \
-                        " --controllers=" + ctrl_id
+        detach_ns_cmd = f"{self.nvme_bin} detach-ns {self.ctrl} " + \
+            f"--namespace-id={str(nsid)} --controllers={ctrl_id} --verbose"
         return subprocess.call(detach_ns_cmd,
                                shell=True,
-                               stdout=subprocess.PIPE,
-                               encoding='utf-8')
+                               stdout=subprocess.DEVNULL)
 
     def delete_and_validate_ns(self, nsid):
         """ Wrapper for deleting and validating that namespace is deleted.
@@ -445,11 +429,11 @@ class TestNVMe(unittest.TestCase):
                 - 0 on success, 1 on failure.
         """
         # delete the namespace
-        delete_ns_cmd = "nvme delete-ns " + self.ctrl + " -n " + str(nsid)
+        delete_ns_cmd = f"{self.nvme_bin} delete-ns {self.ctrl} " + \
+            f"--namespace-id={str(nsid)} --verbose"
         err = subprocess.call(delete_ns_cmd,
                               shell=True,
-                              stdout=subprocess.PIPE,
-                              encoding='utf-8')
+                              stdout=subprocess.DEVNULL)
         self.assertEqual(err, 0, "ERROR : delete namespace failed")
         return err
 
@@ -460,16 +444,14 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - 0 on success, error code on failure.
         """
-        smart_log_cmd = "nvme smart-log " + self.ctrl + " -n " + str(nsid)
-        print(smart_log_cmd)
+        smart_log_cmd = f"{self.nvme_bin} smart-log {self.ctrl} " + \
+            f"--namespace-id={str(nsid)}"
         proc = subprocess.Popen(smart_log_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
         err = proc.wait()
         self.assertEqual(err, 0, "ERROR : nvme smart log failed")
-        smart_log_output = proc.communicate()[0]
-        print(f"{smart_log_output}")
         return err
 
     def get_id_ctrl(self, vendor=False):
@@ -480,10 +462,10 @@ class TestNVMe(unittest.TestCase):
               - 0 on success, error code on failure.
         """
         if not vendor:
-            id_ctrl_cmd = "nvme id-ctrl " + self.ctrl
+            id_ctrl_cmd = f"{self.nvme_bin} id-ctrl {self.ctrl}"
         else:
-            id_ctrl_cmd = "nvme id-ctrl --vendor-specific " + self.ctrl
-        print(id_ctrl_cmd)
+            id_ctrl_cmd = f"{self.nvme_bin} id-ctrl " +\
+                f"--vendor-specific {self.ctrl}"
         proc = subprocess.Popen(id_ctrl_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
@@ -500,13 +482,14 @@ class TestNVMe(unittest.TestCase):
                 - 0 on success, error code on failure.
         """
         pattern = re.compile(r"^ Entry\[[ ]*[0-9]+\]")
-        error_log_cmd = "nvme error-log " + self.ctrl
+        error_log_cmd = f"{self.nvme_bin} error-log {self.ctrl}"
         proc = subprocess.Popen(error_log_cmd,
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf-8')
         err = proc.wait()
         self.assertEqual(err, 0, "ERROR : nvme error log failed")
+        # This sanity checkes the 'normal' output
         line = proc.stdout.readline()
         err_log_entry_count = int(line.split(" ")[5].strip().split(":")[1])
         entry_count = 0
@@ -523,42 +506,20 @@ class TestNVMe(unittest.TestCase):
             - Returns:
                 - None
         """
-        block_size = mmap.PAGESIZE if int(lbads) < 9 else 2 ** int(lbads)
+        (ds, _) = self.get_lba_format_size()
+        block_size = ds if int(lbads) < 9 else 2 ** int(lbads)
         ns_path = self.ctrl + "n" + str(nsid)
         io_cmd = "dd if=" + ns_path + " of=/dev/null" + " bs=" + \
                  str(block_size) + " count=" + str(count) + " > /dev/null 2>&1"
-        print(io_cmd)
+        print(f"Running io: {io_cmd}")
         run_io = subprocess.Popen(io_cmd, shell=True, stdout=subprocess.PIPE,
                                   encoding='utf-8')
         run_io_result = run_io.communicate()[1]
         self.assertEqual(run_io_result, None)
         io_cmd = "dd if=/dev/zero of=" + ns_path + " bs=" + \
                  str(block_size) + " count=" + str(count) + " > /dev/null 2>&1"
-        print(io_cmd)
+        print(f"Running io: {io_cmd}")
         run_io = subprocess.Popen(io_cmd, shell=True, stdout=subprocess.PIPE,
                                   encoding='utf-8')
         run_io_result = run_io.communicate()[1]
         self.assertEqual(run_io_result, None)
-
-    def supp_check_id_ctrl(self, key):
-        """ Wrapper for support check.
-            - Args:
-                - key : search key.
-            - Returns:
-                - value for key requested.
-        """
-        id_ctrl = "nvme id-ctrl " + self.ctrl
-        print("\n" + id_ctrl)
-        proc = subprocess.Popen(id_ctrl,
-                                shell=True,
-                                stdout=subprocess.PIPE,
-                                encoding='utf-8')
-        err = proc.wait()
-        self.assertEqual(err, 0, "ERROR : nvme Identify controller Data \
-                         structure failed")
-        for line in proc.stdout:
-            if key in line:
-                key = line.replace(",", "", 1)
-        print(key)
-        val = (key.split(':'))[1].strip()
-        return int(val, 16)
diff --git a/tests/nvme_test_io.py b/tests/nvme_test_io.py
index bf30e0a..4cd5571 100644
--- a/tests/nvme_test_io.py
+++ b/tests/nvme_test_io.py
@@ -43,7 +43,7 @@ class TestNVMeIO(TestNVMe):
         """ Pre Section for TestNVMeIO """
         super().setUp()
         # common code used in various testcases.
-        self.data_size = 512
+        (self.data_size, _) = self.get_lba_format_size()
         self.start_block = 0
         self.block_count = 0
         self.write_file = "write_file.txt"
@@ -77,10 +77,10 @@ class TestNVMeIO(TestNVMe):
             - Returns:
                 - return code for nvme write command.
         """
-        write_cmd = "nvme write " + self.ns1 + " --start-block=" + \
-                    str(self.start_block) + " --block-count=" + \
-                    str(self.block_count) + " --data-size=" + \
-                    str(self.data_size) + " --data=" + self.write_file
+        write_cmd = f"{self.nvme_bin} write {self.ns1} " + \
+            f"--start-block={str(self.start_block)} " + \
+            f"--block-count={str(self.block_count)} " + \
+            f"--data-size={str(self.data_size)} --data={self.write_file}"
         return self.exec_cmd(write_cmd)
 
     def nvme_read(self):
@@ -90,9 +90,8 @@ class TestNVMeIO(TestNVMe):
             - Returns:
                 - return code for nvme read command.
         """
-        read_cmd = "nvme read " + self.ns1 + " --start-block=" + \
-                   str(self.start_block) + " --block-count=" + \
-                   str(self.block_count) + " --data-size=" + \
-                   str(self.data_size) + " --data=" + self.read_file
-        print(read_cmd)
+        read_cmd = f"{self.nvme_bin} read {self.ns1} " + \
+            f"--start-block={str(self.start_block)} " + \
+            f"--block-count={str(self.block_count)} " + \
+            f"--data-size={str(self.data_size)} --data={self.read_file}"
         return self.exec_cmd(read_cmd)
diff --git a/tests/nvme_verify_test.py b/tests/nvme_verify_test.py
index 7c30828..90e149d 100644
--- a/tests/nvme_verify_test.py
+++ b/tests/nvme_verify_test.py
@@ -13,7 +13,7 @@ NVMe Verify Testcase:-
 
 """
 
-from nvme_test import TestNVMe
+from nvme_test import TestNVMe, to_decimal
 
 
 class TestNVMeVerify(TestNVMe):
@@ -25,9 +25,21 @@ class TestNVMeVerify(TestNVMe):
               - test_log_dir : directory for logs, temp files.
     """
 
+    def verify_cmd_supported(self):
+        """ Wrapper for extracting optional NVM 'verify' command support
+            - Args:
+                - None
+            - Returns:
+                - True if 'verify' is supported, otherwise False
+        """
+        return to_decimal(self.get_id_ctrl_field_value("oncs")) & (1 << 7)
+
     def setUp(self):
         """ Pre Section for TestNVMeVerify """
         super().setUp()
+        if not self.verify_cmd_supported():
+            self.skipTest(
+                "because: Optional NVM Command 'Verify' (NVMVFYS) not supported")
         self.start_block = 0
         self.block_count = 0
         self.namespace = 1
@@ -44,10 +56,10 @@ class TestNVMeVerify(TestNVMe):
             - Returns:
                 - return code for nvme verify command.
         """
-        verify_cmd = "nvme verify " + self.ctrl + \
-                     " --namespace-id=" + str(self.namespace) + \
-                     " --start-block=" + str(self.start_block) + \
-                     " --block-count=" + str(self.block_count)
+        verify_cmd = f"{self.nvme_bin} verify {self.ctrl} " + \
+            f"--namespace-id={str(self.namespace)} " + \
+            f"--start-block={str(self.start_block)} " + \
+            f"--block-count={str(self.block_count)}"
         return self.exec_cmd(verify_cmd)
 
     def test_verify(self):
diff --git a/tests/nvme_writeuncor_test.py b/tests/nvme_writeuncor_test.py
index 1083d46..8e0b9a0 100644
--- a/tests/nvme_writeuncor_test.py
+++ b/tests/nvme_writeuncor_test.py
@@ -63,9 +63,9 @@ class TestNVMeUncor(TestNVMeIO):
             - Returns:
                 - return code of nvme write uncorrectable command.
         """
-        write_uncor_cmd = "nvme write-uncor " + self.ns1 + \
-                          " --start-block=" + str(self.start_block) + \
-                          " --block-count=" + str(self.block_count)
+        write_uncor_cmd = f"{self.nvme_bin} write-uncor {self.ns1} " + \
+            f"--start-block={str(self.start_block)} " + \
+            f"--block-count={str(self.block_count)}"
         return self.exec_cmd(write_uncor_cmd)
 
     def test_write_uncor(self):
diff --git a/tests/nvme_writezeros_test.py b/tests/nvme_writezeros_test.py
index 3231e3d..75d5687 100644
--- a/tests/nvme_writezeros_test.py
+++ b/tests/nvme_writezeros_test.py
@@ -71,9 +71,9 @@ class TestNVMeWriteZeros(TestNVMeIO):
             - Returns:
                 - return code for nvme write command.
         """
-        write_zeroes_cmd = "nvme write-zeroes " + self.ns1 + \
-                           " --start-block=" + str(self.start_block) + \
-                           " --block-count=" + str(self.block_count)
+        write_zeroes_cmd = f"{self.nvme_bin} write-zeroes {self.ns1} " + \
+            f"--start-block={str(self.start_block)} " + \
+            f"--block-count={str(self.block_count)}"
         return self.exec_cmd(write_zeroes_cmd)
 
     def validate_write_read(self):
diff --git a/util/argconfig.h b/util/argconfig.h
index 3dff25a..44d2e4e 100644
--- a/util/argconfig.h
+++ b/util/argconfig.h
@@ -96,6 +96,12 @@ enum argconfig_types {
 #define OPT_LIST(l, s, v, d, ...) OPT_STRING(l, s, "LIST", v, d, __VA_ARGS__)
 #define OPT_STR(l, s, v, d, ...) OPT_STRING(l, s, "STRING", v, d, __VA_ARGS__)
 
+#ifdef CONFIG_JSONC
+#define OPT_FLAG_JSON(l, s, v, d, ...) OPT_FLAG(l, s, v, d, __VA_ARGS__)
+#else /* CONFIG_JSONC */
+#define OPT_FLAG_JSON(l, s, v, d, ...) OPT_END()
+#endif /* CONFIG_JSONC */
+
 #define OPT_VALS(n) \
 	struct argconfig_opt_val n[]
 
diff --git a/util/json.c b/util/json.c
index 2de5848..6c6413c 100644
--- a/util/json.c
+++ b/util/json.c
@@ -4,6 +4,7 @@
 
 #include "json.h"
 #include "types.h"
+#include "cleanup.h"
 
 struct json_object *util_json_object_new_double(long double d)
 {
@@ -72,3 +73,65 @@ uint64_t util_json_object_get_uint64(struct json_object *obj)
 
 	return val;
 }
+
+void json_object_add_uint_02x(struct json_object *o, const char *k, __u32 v)
+{
+	json_object_add_uint_0nx(o, k, v, 2);
+}
+
+void json_object_add_uint_0x(struct json_object *o, const char *k, __u32 v)
+{
+	char str[STR_LEN];
+
+	sprintf(str, "0x%x", v);
+	json_object_add_value_string(o, k, str);
+}
+
+void json_object_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len)
+{
+	int i;
+
+	_cleanup_free_ char *value = NULL;
+
+	if (!buf || !len) {
+		json_object_add_value_string(o, k, "No information provided");
+		return;
+	}
+
+	value = calloc(1, (len + 1) * 2 + 1);
+
+	if (!value) {
+		json_object_add_value_string(o, k, "Could not allocate string");
+		return;
+	}
+
+	sprintf(value, "0x");
+	for (i = 1; i <= len; i++)
+		sprintf(&value[i * 2], "%02x", buf[len - i]);
+
+	json_object_add_value_string(o, k, value);
+}
+
+void json_object_add_nprix64(struct json_object *o, const char *k, uint64_t v)
+{
+	char str[STR_LEN];
+
+	sprintf(str, "%#"PRIx64"", v);
+	json_object_add_value_string(o, k, str);
+}
+
+void json_object_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width)
+{
+	char str[STR_LEN];
+
+	sprintf(str, "0x%0*x", width, v);
+	json_object_add_value_string(o, k, str);
+}
+
+void json_object_add_0nprix64(struct json_object *o, const char *k, uint64_t v, int width)
+{
+	char str[STR_LEN];
+
+	sprintf(str, "0x%0*"PRIx64"", width, v);
+	json_object_add_value_string(o, k, str);
+}
diff --git a/util/json.h b/util/json.h
index 3dd5b52..5f51b7b 100644
--- a/util/json.h
+++ b/util/json.h
@@ -9,37 +9,34 @@
 /* Wrappers around json-c's API */
 
 #define json_create_object(o) json_object_new_object(o)
-#define json_create_array(a) json_object_new_array(a)
 #define json_free_object(o) json_object_put(o)
 #define json_free_array(a) json_object_put(a)
-#define json_object_add_value_uint(o, k, v) \
-	json_object_object_add(o, k, json_object_new_uint64(v))
-#define json_object_add_value_int(o, k, v) \
-	json_object_object_add(o, k, json_object_new_int(v))
+#define json_object_add_value_uint(o, k, v) json_object_object_add(o, k, json_object_new_uint64(v))
+#define json_object_add_value_int(o, k, v) json_object_object_add(o, k, json_object_new_int(v))
 #ifndef CONFIG_JSONC_14
 #define json_object_new_uint64(v) util_json_object_new_uint64(v)
 #define json_object_get_uint64(v) util_json_object_get_uint64(v)
-#endif
+#endif /* CONFIG_JSONC_14 */
 #define json_object_add_value_uint64(o, k, v) \
 	json_object_object_add(o, k, json_object_new_uint64(v))
 #define json_object_add_value_uint128(o, k, v) \
 	json_object_object_add(o, k, util_json_object_new_uint128(v))
 #define json_object_add_value_double(o, k, v) \
 	json_object_object_add(o, k, util_json_object_new_double(v))
-#define json_object_add_value_float(o, k, v) \
-	json_object_object_add(o, k, json_object_new_double(v))
-static inline int json_object_add_value_string(struct json_object *o, const char *k, const char *v) {
+#define json_object_add_value_float(o, k, v) json_object_object_add(o, k, json_object_new_double(v))
+
+static inline int json_object_add_value_string(struct json_object *o, const char *k, const char *v)
+{
 	return json_object_object_add(o, k, v ? json_object_new_string(v) : NULL);
 }
-#define json_object_add_value_array(o, k, v) \
-	json_object_object_add(o, k, v)
-#define json_object_add_value_object(o, k, v) \
-	json_object_object_add(o, k, v)
-#define json_array_add_value_object(o, k) \
-	json_object_array_add(o, k)
-static inline int json_array_add_value_string(struct json_object *o, const char *v) {
+
+#define json_array_add_value_object(o, k) json_object_array_add(o, k)
+
+static inline int json_array_add_value_string(struct json_object *o, const char *v)
+{
 	return json_object_array_add(o, v ? json_object_new_string(v) : NULL);
 }
+
 #define json_print_object(o, u)						\
 	printf("%s", json_object_to_json_string_ext(o,			\
 		JSON_C_TO_STRING_PRETTY |				\
@@ -51,13 +48,35 @@ struct json_object *util_json_object_new_uint128(nvme_uint128_t val);
 struct json_object *util_json_object_new_uint128(nvme_uint128_t val);
 
 uint64_t util_json_object_get_uint64(struct json_object *obj);
-
-#else /* !CONFIG_JSONC */
-
+#else /* CONFIG_JSONC */
 struct json_object;
 
 #define json_object_add_value_string(o, k, v)
+#define json_create_object(o) NULL
+#define json_free_object(o) ((void)(o))
+#define json_object_add_value_uint(o, k, v) ((void)(v))
+#define json_object_add_value_int(o, k, v) ((void)(v))
+#define json_object_add_value_uint64(o, k, v) ((void)(v))
+#define json_object_add_value_uint128(o, k, v)
+#define json_object_add_value_double(o, k, v)
+#define json_object_add_value_float(o, k, v)
+#define json_array_add_value_object(o, k) ((void)(k))
+#define json_print_object(o, u) ((void)(o))
+#define json_object_object_add(o, k, v) ((void)(v))
+#define json_object_new_int(v)
+#define json_object_new_array(a) NULL
+#define json_object_array_add(o, k) ((void)(k))
+#endif /* CONFIG_JSONC */
 
-#endif
+#define json_create_array(a) json_object_new_array(a)
+#define json_object_add_value_array(o, k, v) json_object_object_add(o, k, v)
+#define json_object_add_value_object(o, k, v) json_object_object_add(o, k, v)
 
-#endif
+void json_object_add_uint_02x(struct json_object *o, const char *k, __u32 v);
+void json_object_add_uint_0x(struct json_object *o, const char *k, __u32 v);
+void json_object_add_byte_array(struct json_object *o, const char *k, unsigned char *buf, int len);
+void json_object_add_nprix64(struct json_object *o, const char *k, uint64_t v);
+void json_object_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width);
+void json_object_add_0nprix64(struct json_object *o, const char *k, uint64_t v, int width);
+
+#endif /* __JSON__H */
diff --git a/util/logging.c b/util/logging.c
index 8e59948..a855a3d 100644
--- a/util/logging.c
+++ b/util/logging.c
@@ -81,8 +81,9 @@ static void nvme_show_command64(struct nvme_passthru_cmd64 *cmd, int err)
 
 static void nvme_show_latency(struct timeval start, struct timeval end)
 {
-	printf("latency      : %lu us\n",
-	       (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_usec - start.tv_usec));
+	printf("latency      : %llu us\n",
+	       (unsigned long long)((end.tv_sec - start.tv_sec) * 1000000 +
+				    (end.tv_usec - start.tv_usec)));
 }
 
 int nvme_submit_passthru(int fd, unsigned long ioctl_cmd,
diff --git a/util/logging.h b/util/logging.h
index bf02984..6899a4f 100644
--- a/util/logging.h
+++ b/util/logging.h
@@ -5,10 +5,16 @@
 
 #include <stdbool.h>
 
-#define print_info(...) \
-	do { \
-		if (log_level >= LOG_INFO) \
-			printf(__VA_ARGS__); \
+#define print_info(...)				\
+	do {					\
+		if (log_level >= LOG_INFO)	\
+			printf(__VA_ARGS__);	\
+	} while (false)
+
+#define print_debug(...)			\
+	do {					\
+		if (log_level >= LOG_DEBUG)	\
+			printf(__VA_ARGS__);	\
 	} while (false)
 
 extern int log_level;
diff --git a/util/types.c b/util/types.c
index 20c121b..0c58f17 100644
--- a/util/types.c
+++ b/util/types.c
@@ -5,6 +5,7 @@
 #include <string.h>
 #include <locale.h>
 #include <time.h>
+#include <limits.h>
 
 #include <ccan/endian/endian.h>
 
@@ -36,18 +37,30 @@ long double int128_to_double(__u8 *data)
 	return result;
 }
 
-uint64_t int48_to_long(__u8 *data)
+static uint64_t int_to_long(int bits, const __u8 *data)
 {
 	int i;
 	uint64_t result = 0;
+	int bytes = (bits + CHAR_BIT - 1) / CHAR_BIT;
 
-	for (i = 0; i < 6; i++) {
-		result *= 256;
-		result += data[5 - i];
+	for (i = 0; i < bytes; i++) {
+		result <<= CHAR_BIT;
+		result += data[bytes - 1 - i];
 	}
+
 	return result;
 }
 
+uint64_t int48_to_long(const __u8 *data)
+{
+	return int_to_long(48, data);
+}
+
+uint64_t int56_to_long(const __u8 *data)
+{
+	return int_to_long(56, data);
+}
+
 long double uint128_t_to_double(nvme_uint128_t data)
 {
 	long double result = 0;
@@ -166,7 +179,7 @@ int convert_ts(time_t time, char *ts_buf)
 	gmtime_r((const time_t *)&time_human, &time_info);
 
 	strftime(buf, sizeof(buf), "%Y-%m-%dD|%H:%M:%S", &time_info);
-	sprintf(ts_buf, "%s:%03ld", buf, time_ms);
+	sprintf(ts_buf, "%s:%03llu", buf, (unsigned long long)time_ms);
 
 	return 0;
 }
diff --git a/util/types.h b/util/types.h
index b2e8fc8..4046d5c 100644
--- a/util/types.h
+++ b/util/types.h
@@ -11,6 +11,8 @@
 
 #define ABSOLUTE_ZERO_CELSIUS -273
 
+#define STR_LEN 100
+
 static inline long kelvin_to_celsius(long t)
 {
 	return t + ABSOLUTE_ZERO_CELSIUS;
@@ -36,7 +38,8 @@ typedef union nvme_uint128 nvme_uint128_t;
 
 nvme_uint128_t le128_to_cpu(__u8 *data);
 long double int128_to_double(__u8 *data);
-uint64_t int48_to_long(__u8 *data);
+uint64_t int48_to_long(const __u8 *data);
+uint64_t int56_to_long(const __u8 *data);
 
 char *uint128_t_to_string(nvme_uint128_t val);
 char *uint128_t_to_l10n_string(nvme_uint128_t val);
diff --git a/util/utils.c b/util/utils.c
index 5d77652..ea30a4b 100644
--- a/util/utils.c
+++ b/util/utils.c
@@ -138,7 +138,7 @@ unsigned char *read_binary_file(char *data_dir_path, const char *bin_path,
 
 void print_formatted_var_size_str(const char *msg, const __u8 *pdata, size_t data_size, FILE *fp)
 {
-	char description_str[256] = "";
+	char description_str[1024] = "";
 	char temp_buffer[3] = { 0 };
 
 	for (size_t i = 0; i < data_size; ++i) {
@@ -146,10 +146,10 @@ void print_formatted_var_size_str(const char *msg, const __u8 *pdata, size_t dat
 		strcat(description_str, temp_buffer);
 	}
 
-	if (fp)
-		fprintf(fp, "%s: %s\n", msg, description_str);
-	else
-		printf("%s: %s\n", msg, description_str);
+	if (!fp)
+		fp = stdout;
+
+	fprintf(fp, "%s: %s\n", msg, description_str);
 }
 
 void process_field_size_16(int offset, char *sfield, __u8 *buf, char *datastr)