summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/appimage.yml2
-rw-r--r--.github/workflows/build.yml18
-rw-r--r--.github/workflows/coverage.yml2
-rw-r--r--.github/workflows/docs.yaml2
-rw-r--r--.github/workflows/run-nightly-tests.yml93
-rw-r--r--CONTRIBUTING.md22
-rw-r--r--Documentation/cmd-plugins.txt3
-rw-r--r--Documentation/meson.build17
-rw-r--r--Documentation/nvme-admin-passthru.14
-rw-r--r--Documentation/nvme-admin-passthru.html4
-rw-r--r--Documentation/nvme-ana-log.14
-rw-r--r--Documentation/nvme-ana-log.html4
-rw-r--r--Documentation/nvme-attach-ns.14
-rw-r--r--Documentation/nvme-attach-ns.html4
-rw-r--r--Documentation/nvme-boot-part-log.14
-rw-r--r--Documentation/nvme-boot-part-log.html4
-rw-r--r--Documentation/nvme-capacity-mgmt.14
-rw-r--r--Documentation/nvme-capacity-mgmt.html4
-rw-r--r--Documentation/nvme-changed-ns-list-log.14
-rw-r--r--Documentation/nvme-changed-ns-list-log.html4
-rw-r--r--Documentation/nvme-check-tls-key.txt6
-rw-r--r--Documentation/nvme-cmdset-ind-id-ns.14
-rw-r--r--Documentation/nvme-cmdset-ind-id-ns.html4
-rw-r--r--Documentation/nvme-compare.14
-rw-r--r--Documentation/nvme-compare.html4
-rw-r--r--Documentation/nvme-connect-all.14
-rw-r--r--Documentation/nvme-connect-all.html4
-rw-r--r--Documentation/nvme-connect.124
-rw-r--r--Documentation/nvme-connect.html31
-rw-r--r--Documentation/nvme-connect.txt24
-rw-r--r--Documentation/nvme-copy.14
-rw-r--r--Documentation/nvme-copy.html4
-rw-r--r--Documentation/nvme-create-ns.14
-rw-r--r--Documentation/nvme-create-ns.html4
-rw-r--r--Documentation/nvme-dapustor-smart-log-add.1108
-rw-r--r--Documentation/nvme-dapustor-smart-log-add.html856
-rw-r--r--Documentation/nvme-dapustor-smart-log-add.txt65
-rw-r--r--Documentation/nvme-delete-ns.14
-rw-r--r--Documentation/nvme-delete-ns.html4
-rw-r--r--Documentation/nvme-dera-stat.14
-rw-r--r--Documentation/nvme-dera-stat.html4
-rw-r--r--Documentation/nvme-detach-ns.14
-rw-r--r--Documentation/nvme-detach-ns.html4
-rw-r--r--Documentation/nvme-device-self-test.16
-rw-r--r--Documentation/nvme-device-self-test.html5
-rw-r--r--Documentation/nvme-device-self-test.txt2
-rw-r--r--Documentation/nvme-dim.14
-rw-r--r--Documentation/nvme-dim.html4
-rw-r--r--Documentation/nvme-dir-receive.14
-rw-r--r--Documentation/nvme-dir-receive.html4
-rw-r--r--Documentation/nvme-dir-send.14
-rw-r--r--Documentation/nvme-dir-send.html4
-rw-r--r--Documentation/nvme-disconnect-all.14
-rw-r--r--Documentation/nvme-disconnect-all.html4
-rw-r--r--Documentation/nvme-disconnect.14
-rw-r--r--Documentation/nvme-disconnect.html4
-rw-r--r--Documentation/nvme-discover.14
-rw-r--r--Documentation/nvme-discover.html4
-rw-r--r--Documentation/nvme-dsm.14
-rw-r--r--Documentation/nvme-dsm.html4
-rw-r--r--Documentation/nvme-effects-log.14
-rw-r--r--Documentation/nvme-effects-log.html4
-rw-r--r--Documentation/nvme-endurance-event-agg-log.14
-rw-r--r--Documentation/nvme-endurance-event-agg-log.html4
-rw-r--r--Documentation/nvme-endurance-log.14
-rw-r--r--Documentation/nvme-endurance-log.html4
-rw-r--r--Documentation/nvme-error-log.14
-rw-r--r--Documentation/nvme-error-log.html4
-rw-r--r--Documentation/nvme-fdp-configs.14
-rw-r--r--Documentation/nvme-fdp-configs.html4
-rw-r--r--Documentation/nvme-fdp-events.14
-rw-r--r--Documentation/nvme-fdp-events.html4
-rw-r--r--Documentation/nvme-fdp-set-events.14
-rw-r--r--Documentation/nvme-fdp-set-events.html4
-rw-r--r--Documentation/nvme-fdp-stats.14
-rw-r--r--Documentation/nvme-fdp-stats.html4
-rw-r--r--Documentation/nvme-fdp-status.14
-rw-r--r--Documentation/nvme-fdp-status.html4
-rw-r--r--Documentation/nvme-fdp-update.14
-rw-r--r--Documentation/nvme-fdp-update.html4
-rw-r--r--Documentation/nvme-fdp-usage.14
-rw-r--r--Documentation/nvme-fdp-usage.html4
-rw-r--r--Documentation/nvme-fid-support-effects-log.14
-rw-r--r--Documentation/nvme-fid-support-effects-log.html4
-rw-r--r--Documentation/nvme-flush.14
-rw-r--r--Documentation/nvme-flush.html4
-rw-r--r--Documentation/nvme-format.14
-rw-r--r--Documentation/nvme-format.html4
-rw-r--r--Documentation/nvme-fw-commit.14
-rw-r--r--Documentation/nvme-fw-commit.html4
-rw-r--r--Documentation/nvme-fw-download.14
-rw-r--r--Documentation/nvme-fw-download.html4
-rw-r--r--Documentation/nvme-fw-log.14
-rw-r--r--Documentation/nvme-fw-log.html4
-rw-r--r--Documentation/nvme-gen-hostnqn.14
-rw-r--r--Documentation/nvme-gen-hostnqn.html4
-rw-r--r--Documentation/nvme-gen-tls-key.txt6
-rw-r--r--Documentation/nvme-get-feature.111
-rw-r--r--Documentation/nvme-get-feature.html17
-rw-r--r--Documentation/nvme-get-feature.txt6
-rw-r--r--Documentation/nvme-get-lba-status.14
-rw-r--r--Documentation/nvme-get-lba-status.html4
-rw-r--r--Documentation/nvme-get-log.14
-rw-r--r--Documentation/nvme-get-log.html4
-rw-r--r--Documentation/nvme-get-ns-id.14
-rw-r--r--Documentation/nvme-get-ns-id.html4
-rw-r--r--Documentation/nvme-get-property.14
-rw-r--r--Documentation/nvme-get-property.html4
-rw-r--r--Documentation/nvme-help.14
-rw-r--r--Documentation/nvme-help.html4
-rw-r--r--Documentation/nvme-huawei-id-ctrl.14
-rw-r--r--Documentation/nvme-huawei-id-ctrl.html4
-rw-r--r--Documentation/nvme-huawei-list.14
-rw-r--r--Documentation/nvme-huawei-list.html4
-rw-r--r--Documentation/nvme-id-ctrl.14
-rw-r--r--Documentation/nvme-id-ctrl.html4
-rw-r--r--Documentation/nvme-id-domain.18
-rw-r--r--Documentation/nvme-id-domain.html10
-rw-r--r--Documentation/nvme-id-domain.txt6
-rw-r--r--Documentation/nvme-id-iocs.14
-rw-r--r--Documentation/nvme-id-iocs.html4
-rw-r--r--Documentation/nvme-id-ns.14
-rw-r--r--Documentation/nvme-id-ns.html4
-rw-r--r--Documentation/nvme-id-nvmset.14
-rw-r--r--Documentation/nvme-id-nvmset.html4
-rw-r--r--Documentation/nvme-inspur-nvme-vendor-log.14
-rw-r--r--Documentation/nvme-inspur-nvme-vendor-log.html4
-rw-r--r--Documentation/nvme-intel-id-ctrl.14
-rw-r--r--Documentation/nvme-intel-id-ctrl.html4
-rw-r--r--Documentation/nvme-intel-internal-log.14
-rw-r--r--Documentation/nvme-intel-internal-log.html4
-rw-r--r--Documentation/nvme-intel-lat-stats.14
-rw-r--r--Documentation/nvme-intel-lat-stats.html4
-rw-r--r--Documentation/nvme-intel-market-name.14
-rw-r--r--Documentation/nvme-intel-market-name.html4
-rw-r--r--Documentation/nvme-intel-smart-log-add.14
-rw-r--r--Documentation/nvme-intel-smart-log-add.html4
-rw-r--r--Documentation/nvme-intel-temp-stats.14
-rw-r--r--Documentation/nvme-intel-temp-stats.html4
-rw-r--r--Documentation/nvme-io-mgmt-recv.14
-rw-r--r--Documentation/nvme-io-mgmt-recv.html4
-rw-r--r--Documentation/nvme-io-mgmt-send.14
-rw-r--r--Documentation/nvme-io-mgmt-send.html4
-rw-r--r--Documentation/nvme-io-passthru.14
-rw-r--r--Documentation/nvme-io-passthru.html4
-rw-r--r--Documentation/nvme-lba-status-log.14
-rw-r--r--Documentation/nvme-lba-status-log.html4
-rw-r--r--Documentation/nvme-list-ctrl.14
-rw-r--r--Documentation/nvme-list-ctrl.html4
-rw-r--r--Documentation/nvme-list-endgrp.14
-rw-r--r--Documentation/nvme-list-endgrp.html4
-rw-r--r--Documentation/nvme-list-ns.14
-rw-r--r--Documentation/nvme-list-ns.html4
-rw-r--r--Documentation/nvme-list-subsys.14
-rw-r--r--Documentation/nvme-list-subsys.html4
-rw-r--r--Documentation/nvme-list.14
-rw-r--r--Documentation/nvme-list.html4
-rw-r--r--Documentation/nvme-lockdown.14
-rw-r--r--Documentation/nvme-lockdown.html4
-rw-r--r--Documentation/nvme-mi-cmd-support-effects-log.14
-rw-r--r--Documentation/nvme-mi-cmd-support-effects-log.html4
-rw-r--r--Documentation/nvme-micron-clear-pcie-errors.14
-rw-r--r--Documentation/nvme-micron-clear-pcie-errors.html4
-rw-r--r--Documentation/nvme-micron-internal-log.14
-rw-r--r--Documentation/nvme-micron-internal-log.html4
-rw-r--r--Documentation/nvme-micron-nand-stats.14
-rw-r--r--Documentation/nvme-micron-nand-stats.html4
-rw-r--r--Documentation/nvme-micron-pcie-stats.14
-rw-r--r--Documentation/nvme-micron-pcie-stats.html4
-rw-r--r--Documentation/nvme-micron-selective-download.14
-rw-r--r--Documentation/nvme-micron-selective-download.html4
-rw-r--r--Documentation/nvme-micron-smart-add-log.14
-rw-r--r--Documentation/nvme-micron-smart-add-log.html4
-rw-r--r--Documentation/nvme-micron-temperature-stats.14
-rw-r--r--Documentation/nvme-micron-temperature-stats.html4
-rw-r--r--Documentation/nvme-netapp-ontapdevices.14
-rw-r--r--Documentation/nvme-netapp-ontapdevices.html4
-rw-r--r--Documentation/nvme-netapp-smdevices.14
-rw-r--r--Documentation/nvme-netapp-smdevices.html4
-rw-r--r--Documentation/nvme-ns-descs.14
-rw-r--r--Documentation/nvme-ns-descs.html4
-rw-r--r--Documentation/nvme-ns-rescan.14
-rw-r--r--Documentation/nvme-ns-rescan.html4
-rw-r--r--Documentation/nvme-nvm-id-ctrl.14
-rw-r--r--Documentation/nvme-nvm-id-ctrl.html4
-rw-r--r--Documentation/nvme-nvme-mi-recv.14
-rw-r--r--Documentation/nvme-nvme-mi-recv.html4
-rw-r--r--Documentation/nvme-nvme-mi-send.14
-rw-r--r--Documentation/nvme-nvme-mi-send.html4
-rw-r--r--Documentation/nvme-ocp-clear-fw-activate-history.14
-rw-r--r--Documentation/nvme-ocp-clear-fw-activate-history.html4
-rw-r--r--Documentation/nvme-ocp-clear-pcie-correctable-error-counters.14
-rw-r--r--Documentation/nvme-ocp-clear-pcie-correctable-error-counters.html4
-rw-r--r--Documentation/nvme-ocp-device-capability-log.14
-rw-r--r--Documentation/nvme-ocp-device-capability-log.html4
-rw-r--r--Documentation/nvme-ocp-eol-plp-failure-mode.14
-rw-r--r--Documentation/nvme-ocp-eol-plp-failure-mode.html4
-rw-r--r--Documentation/nvme-ocp-error-recovery-log.14
-rw-r--r--Documentation/nvme-ocp-error-recovery-log.html4
-rw-r--r--Documentation/nvme-ocp-get-dssd-async-event-config.14
-rw-r--r--Documentation/nvme-ocp-get-dssd-async-event-config.html4
-rw-r--r--Documentation/nvme-ocp-get-dssd-power-state-feature.14
-rw-r--r--Documentation/nvme-ocp-get-dssd-power-state-feature.html4
-rw-r--r--Documentation/nvme-ocp-get-plp-health-check-interval.14
-rw-r--r--Documentation/nvme-ocp-get-plp-health-check-interval.html4
-rw-r--r--Documentation/nvme-ocp-hardware-component-log.txt85
-rw-r--r--Documentation/nvme-ocp-internal-log.14
-rw-r--r--Documentation/nvme-ocp-internal-log.html4
-rw-r--r--Documentation/nvme-ocp-latency-monitor-log.14
-rw-r--r--Documentation/nvme-ocp-latency-monitor-log.html4
-rw-r--r--Documentation/nvme-ocp-set-dssd-async-event-config.14
-rw-r--r--Documentation/nvme-ocp-set-dssd-async-event-config.html4
-rw-r--r--Documentation/nvme-ocp-set-dssd-power-state-feature.14
-rw-r--r--Documentation/nvme-ocp-set-dssd-power-state-feature.html4
-rw-r--r--Documentation/nvme-ocp-set-plp-health-check-interval.14
-rw-r--r--Documentation/nvme-ocp-set-plp-health-check-interval.html4
-rw-r--r--Documentation/nvme-ocp-set-telemetry-profile.14
-rw-r--r--Documentation/nvme-ocp-set-telemetry-profile.html4
-rw-r--r--Documentation/nvme-ocp-smart-add-log.14
-rw-r--r--Documentation/nvme-ocp-smart-add-log.html4
-rw-r--r--Documentation/nvme-ocp-telemetry-string-log-page.14
-rw-r--r--Documentation/nvme-ocp-telemetry-string-log-page.html4
-rw-r--r--Documentation/nvme-ocp-unsupported-reqs-log.14
-rw-r--r--Documentation/nvme-ocp-unsupported-reqs-log.html4
-rw-r--r--Documentation/nvme-persistent-event-log.14
-rw-r--r--Documentation/nvme-persistent-event-log.html4
-rw-r--r--Documentation/nvme-pred-lat-event-agg-log.14
-rw-r--r--Documentation/nvme-pred-lat-event-agg-log.html4
-rw-r--r--Documentation/nvme-predictable-lat-log.14
-rw-r--r--Documentation/nvme-predictable-lat-log.html4
-rw-r--r--Documentation/nvme-primary-ctrl-caps.14
-rw-r--r--Documentation/nvme-primary-ctrl-caps.html4
-rw-r--r--Documentation/nvme-read.14
-rw-r--r--Documentation/nvme-read.html4
-rw-r--r--Documentation/nvme-reset.14
-rw-r--r--Documentation/nvme-reset.html4
-rw-r--r--Documentation/nvme-resv-acquire.14
-rw-r--r--Documentation/nvme-resv-acquire.html4
-rw-r--r--Documentation/nvme-resv-notif-log.14
-rw-r--r--Documentation/nvme-resv-notif-log.html4
-rw-r--r--Documentation/nvme-resv-register.14
-rw-r--r--Documentation/nvme-resv-register.html4
-rw-r--r--Documentation/nvme-resv-release.14
-rw-r--r--Documentation/nvme-resv-release.html4
-rw-r--r--Documentation/nvme-resv-report.14
-rw-r--r--Documentation/nvme-resv-report.html4
-rw-r--r--Documentation/nvme-rpmb.14
-rw-r--r--Documentation/nvme-rpmb.html4
-rw-r--r--Documentation/nvme-sanitize-log.14
-rw-r--r--Documentation/nvme-sanitize-log.html4
-rw-r--r--Documentation/nvme-sanitize.118
-rw-r--r--Documentation/nvme-sanitize.html26
-rw-r--r--Documentation/nvme-sanitize.txt12
-rw-r--r--Documentation/nvme-seagate-clear-fw-activate-history.14
-rw-r--r--Documentation/nvme-seagate-clear-fw-activate-history.html4
-rw-r--r--Documentation/nvme-seagate-clear-pcie-correctable-errors.14
-rw-r--r--Documentation/nvme-seagate-clear-pcie-correctable-errors.html4
-rw-r--r--Documentation/nvme-seagate-cloud-SSD-plugin-version.14
-rw-r--r--Documentation/nvme-seagate-cloud-SSD-plugin-version.html4
-rw-r--r--Documentation/nvme-seagate-get-ctrl-tele.14
-rw-r--r--Documentation/nvme-seagate-get-ctrl-tele.html4
-rw-r--r--Documentation/nvme-seagate-get-host-tele.14
-rw-r--r--Documentation/nvme-seagate-get-host-tele.html4
-rw-r--r--Documentation/nvme-seagate-help.14
-rw-r--r--Documentation/nvme-seagate-help.html4
-rw-r--r--Documentation/nvme-seagate-plugin-version.14
-rw-r--r--Documentation/nvme-seagate-plugin-version.html4
-rw-r--r--Documentation/nvme-seagate-version.14
-rw-r--r--Documentation/nvme-seagate-version.html4
-rw-r--r--Documentation/nvme-seagate-vs-fw-activate-history.14
-rw-r--r--Documentation/nvme-seagate-vs-fw-activate-history.html4
-rw-r--r--Documentation/nvme-seagate-vs-internal-log.14
-rw-r--r--Documentation/nvme-seagate-vs-internal-log.html4
-rw-r--r--Documentation/nvme-seagate-vs-log-page-sup.14
-rw-r--r--Documentation/nvme-seagate-vs-log-page-sup.html4
-rw-r--r--Documentation/nvme-seagate-vs-pcie-stats.14
-rw-r--r--Documentation/nvme-seagate-vs-pcie-stats.html4
-rw-r--r--Documentation/nvme-seagate-vs-smart-add-log.14
-rw-r--r--Documentation/nvme-seagate-vs-smart-add-log.html4
-rw-r--r--Documentation/nvme-seagate-vs-temperature-stats.14
-rw-r--r--Documentation/nvme-seagate-vs-temperature-stats.html4
-rw-r--r--Documentation/nvme-security-recv.14
-rw-r--r--Documentation/nvme-security-recv.html4
-rw-r--r--Documentation/nvme-security-send.14
-rw-r--r--Documentation/nvme-security-send.html4
-rw-r--r--Documentation/nvme-self-test-log.14
-rw-r--r--Documentation/nvme-self-test-log.html4
-rw-r--r--Documentation/nvme-set-feature.14
-rw-r--r--Documentation/nvme-set-feature.html4
-rw-r--r--Documentation/nvme-set-property.14
-rw-r--r--Documentation/nvme-set-property.html4
-rw-r--r--Documentation/nvme-show-hostnqn.14
-rw-r--r--Documentation/nvme-show-hostnqn.html4
-rw-r--r--Documentation/nvme-show-regs.14
-rw-r--r--Documentation/nvme-show-regs.html4
-rw-r--r--Documentation/nvme-show-topology.14
-rw-r--r--Documentation/nvme-show-topology.html4
-rw-r--r--Documentation/nvme-smart-log.14
-rw-r--r--Documentation/nvme-smart-log.html4
-rw-r--r--Documentation/nvme-solidigm-clear-fw-activate-history.196
-rw-r--r--Documentation/nvme-solidigm-clear-fw-activate-history.html831
-rw-r--r--Documentation/nvme-solidigm-clear-fw-activate-history.txt48
-rw-r--r--Documentation/nvme-solidigm-clear-pcie-correctable-errors.196
-rw-r--r--Documentation/nvme-solidigm-clear-pcie-correctable-errors.html832
-rw-r--r--Documentation/nvme-solidigm-clear-pcie-correctable-errors.txt49
-rw-r--r--Documentation/nvme-solidigm-cloud-SSDplugin-version.164
-rw-r--r--Documentation/nvme-solidigm-cloud-SSDplugin-version.html794
-rw-r--r--Documentation/nvme-solidigm-cloud-SSDplugin-version.txt29
-rw-r--r--Documentation/nvme-solidigm-garbage-collect-log.196
-rw-r--r--Documentation/nvme-solidigm-garbage-collect-log.html825
-rw-r--r--Documentation/nvme-solidigm-garbage-collect-log.txt44
-rw-r--r--Documentation/nvme-solidigm-id-ctrl.1161
-rw-r--r--Documentation/nvme-solidigm-id-ctrl.html852
-rw-r--r--Documentation/nvme-solidigm-id-ctrl.txt74
-rw-r--r--Documentation/nvme-solidigm-latency-tracking-log.1166
-rw-r--r--Documentation/nvme-solidigm-latency-tracking-log.html901
-rw-r--r--Documentation/nvme-solidigm-latency-tracking-log.txt79
-rw-r--r--Documentation/nvme-solidigm-log-page-directory.196
-rw-r--r--Documentation/nvme-solidigm-log-page-directory.html825
-rw-r--r--Documentation/nvme-solidigm-log-page-directory.txt44
-rw-r--r--Documentation/nvme-solidigm-market-log.193
-rw-r--r--Documentation/nvme-solidigm-market-log.html823
-rw-r--r--Documentation/nvme-solidigm-market-log.txt42
-rw-r--r--Documentation/nvme-solidigm-parse-telemetry-log.1183
-rw-r--r--Documentation/nvme-solidigm-parse-telemetry-log.html906
-rw-r--r--Documentation/nvme-solidigm-parse-telemetry-log.txt86
-rw-r--r--Documentation/nvme-solidigm-smart-log-add.1123
-rw-r--r--Documentation/nvme-solidigm-smart-log-add.html847
-rw-r--r--Documentation/nvme-solidigm-smart-log-add.txt56
-rw-r--r--Documentation/nvme-solidigm-temp-stats.193
-rw-r--r--Documentation/nvme-solidigm-temp-stats.html825
-rw-r--r--Documentation/nvme-solidigm-temp-stats.txt44
-rw-r--r--Documentation/nvme-solidigm-vs-drive-info.196
-rw-r--r--Documentation/nvme-solidigm-vs-drive-info.html826
-rw-r--r--Documentation/nvme-solidigm-vs-drive-info.txt45
-rw-r--r--Documentation/nvme-solidigm-vs-fw-activate-history.194
-rw-r--r--Documentation/nvme-solidigm-vs-fw-activate-history.html821
-rw-r--r--Documentation/nvme-solidigm-vs-fw-activate-history.txt39
-rw-r--r--Documentation/nvme-solidigm-vs-internal-log.1126
-rw-r--r--Documentation/nvme-solidigm-vs-internal-log.html857
-rw-r--r--Documentation/nvme-solidigm-vs-internal-log.txt59
-rw-r--r--Documentation/nvme-solidigm-vs-smart-add-log.194
-rw-r--r--Documentation/nvme-solidigm-vs-smart-add-log.html821
-rw-r--r--Documentation/nvme-solidigm-vs-smart-add-log.txt39
-rw-r--r--Documentation/nvme-solidigm-workload-tracker.1221
-rw-r--r--Documentation/nvme-solidigm-workload-tracker.html947
-rw-r--r--Documentation/nvme-solidigm-workload-tracker.txt104
-rw-r--r--Documentation/nvme-subsystem-reset.14
-rw-r--r--Documentation/nvme-subsystem-reset.html4
-rw-r--r--Documentation/nvme-supported-log-pages.14
-rw-r--r--Documentation/nvme-supported-log-pages.html4
-rw-r--r--Documentation/nvme-telemetry-log.14
-rw-r--r--Documentation/nvme-telemetry-log.html4
-rw-r--r--Documentation/nvme-tls-key.14
-rw-r--r--Documentation/nvme-tls-key.html4
-rw-r--r--Documentation/nvme-toshiba-clear-pcie-correctable-errors.14
-rw-r--r--Documentation/nvme-toshiba-clear-pcie-correctable-errors.html4
-rw-r--r--Documentation/nvme-toshiba-vs-internal-log.14
-rw-r--r--Documentation/nvme-toshiba-vs-internal-log.html4
-rw-r--r--Documentation/nvme-toshiba-vs-smart-add-log.14
-rw-r--r--Documentation/nvme-toshiba-vs-smart-add-log.html4
-rw-r--r--Documentation/nvme-transcend-badblock.14
-rw-r--r--Documentation/nvme-transcend-badblock.html4
-rw-r--r--Documentation/nvme-transcend-healthvalue.14
-rw-r--r--Documentation/nvme-transcend-healthvalue.html4
-rw-r--r--Documentation/nvme-verify.14
-rw-r--r--Documentation/nvme-verify.html4
-rw-r--r--Documentation/nvme-virtium-save-smart-to-vtview-log.14
-rw-r--r--Documentation/nvme-virtium-save-smart-to-vtview-log.html4
-rw-r--r--Documentation/nvme-virtium-show-identify.14
-rw-r--r--Documentation/nvme-virtium-show-identify.html4
-rw-r--r--Documentation/nvme-wdc-cap-diag.14
-rw-r--r--Documentation/nvme-wdc-cap-diag.html4
-rw-r--r--Documentation/nvme-wdc-capabilities.14
-rw-r--r--Documentation/nvme-wdc-capabilities.html4
-rw-r--r--Documentation/nvme-wdc-clear-assert-dump.14
-rw-r--r--Documentation/nvme-wdc-clear-assert-dump.html4
-rw-r--r--Documentation/nvme-wdc-clear-fw-activate-history.14
-rw-r--r--Documentation/nvme-wdc-clear-fw-activate-history.html4
-rw-r--r--Documentation/nvme-wdc-clear-pcie-correctable-errors.14
-rw-r--r--Documentation/nvme-wdc-clear-pcie-correctable-errors.html4
-rw-r--r--Documentation/nvme-wdc-cloud-SSD-plugin-version.14
-rw-r--r--Documentation/nvme-wdc-cloud-SSD-plugin-version.html4
-rw-r--r--Documentation/nvme-wdc-cloud-boot-SSD-version.14
-rw-r--r--Documentation/nvme-wdc-cloud-boot-SSD-version.html4
-rw-r--r--Documentation/nvme-wdc-drive-essentials.14
-rw-r--r--Documentation/nvme-wdc-drive-essentials.html4
-rw-r--r--Documentation/nvme-wdc-drive-log.14
-rw-r--r--Documentation/nvme-wdc-drive-log.html4
-rw-r--r--Documentation/nvme-wdc-drive-resize.14
-rw-r--r--Documentation/nvme-wdc-drive-resize.html4
-rw-r--r--Documentation/nvme-wdc-enc-get-log.14
-rw-r--r--Documentation/nvme-wdc-enc-get-log.html4
-rw-r--r--Documentation/nvme-wdc-get-crash-dump.14
-rw-r--r--Documentation/nvme-wdc-get-crash-dump.html4
-rw-r--r--Documentation/nvme-wdc-get-dev-capabilities-log.14
-rw-r--r--Documentation/nvme-wdc-get-dev-capabilities-log.html4
-rw-r--r--Documentation/nvme-wdc-get-drive-status.14
-rw-r--r--Documentation/nvme-wdc-get-drive-status.html4
-rw-r--r--Documentation/nvme-wdc-get-error-recovery-log.14
-rw-r--r--Documentation/nvme-wdc-get-error-recovery-log.html4
-rw-r--r--Documentation/nvme-wdc-get-latency-monitor-log.14
-rw-r--r--Documentation/nvme-wdc-get-latency-monitor-log.html4
-rw-r--r--Documentation/nvme-wdc-get-pfail-dump.14
-rw-r--r--Documentation/nvme-wdc-get-pfail-dump.html4
-rw-r--r--Documentation/nvme-wdc-get-unsupported-reqs-log.14
-rw-r--r--Documentation/nvme-wdc-get-unsupported-reqs-log.html4
-rw-r--r--Documentation/nvme-wdc-id-ctrl.14
-rw-r--r--Documentation/nvme-wdc-id-ctrl.html4
-rw-r--r--Documentation/nvme-wdc-log-page-directory.14
-rw-r--r--Documentation/nvme-wdc-log-page-directory.html4
-rw-r--r--Documentation/nvme-wdc-namespace-resize.14
-rw-r--r--Documentation/nvme-wdc-namespace-resize.html4
-rw-r--r--Documentation/nvme-wdc-purge-monitor.14
-rw-r--r--Documentation/nvme-wdc-purge-monitor.html4
-rw-r--r--Documentation/nvme-wdc-purge.14
-rw-r--r--Documentation/nvme-wdc-purge.html4
-rw-r--r--Documentation/nvme-wdc-vs-cloud-log.14
-rw-r--r--Documentation/nvme-wdc-vs-cloud-log.html4
-rw-r--r--Documentation/nvme-wdc-vs-device-waf.14
-rw-r--r--Documentation/nvme-wdc-vs-device-waf.html4
-rw-r--r--Documentation/nvme-wdc-vs-drive-info.14
-rw-r--r--Documentation/nvme-wdc-vs-drive-info.html4
-rw-r--r--Documentation/nvme-wdc-vs-error-reason-identifier.14
-rw-r--r--Documentation/nvme-wdc-vs-error-reason-identifier.html4
-rw-r--r--Documentation/nvme-wdc-vs-fw-activate-history.14
-rw-r--r--Documentation/nvme-wdc-vs-fw-activate-history.html4
-rw-r--r--Documentation/nvme-wdc-vs-hw-rev-log.14
-rw-r--r--Documentation/nvme-wdc-vs-hw-rev-log.html4
-rw-r--r--Documentation/nvme-wdc-vs-internal-log.14
-rw-r--r--Documentation/nvme-wdc-vs-internal-log.html4
-rw-r--r--Documentation/nvme-wdc-vs-nand-stats.14
-rw-r--r--Documentation/nvme-wdc-vs-nand-stats.html4
-rw-r--r--Documentation/nvme-wdc-vs-smart-add-log.14
-rw-r--r--Documentation/nvme-wdc-vs-smart-add-log.html4
-rw-r--r--Documentation/nvme-wdc-vs-telemetry-controller-option.14
-rw-r--r--Documentation/nvme-wdc-vs-telemetry-controller-option.html4
-rw-r--r--Documentation/nvme-wdc-vs-temperature-stats.14
-rw-r--r--Documentation/nvme-wdc-vs-temperature-stats.html4
-rw-r--r--Documentation/nvme-write-uncor.14
-rw-r--r--Documentation/nvme-write-uncor.html4
-rw-r--r--Documentation/nvme-write-zeroes.14
-rw-r--r--Documentation/nvme-write-zeroes.html4
-rw-r--r--Documentation/nvme-write.14
-rw-r--r--Documentation/nvme-write.html4
-rw-r--r--Documentation/nvme-zns-changed-zone-list.14
-rw-r--r--Documentation/nvme-zns-changed-zone-list.html4
-rw-r--r--Documentation/nvme-zns-close-zone.14
-rw-r--r--Documentation/nvme-zns-close-zone.html4
-rw-r--r--Documentation/nvme-zns-finish-zone.14
-rw-r--r--Documentation/nvme-zns-finish-zone.html4
-rw-r--r--Documentation/nvme-zns-id-ctrl.14
-rw-r--r--Documentation/nvme-zns-id-ctrl.html4
-rw-r--r--Documentation/nvme-zns-id-ns.14
-rw-r--r--Documentation/nvme-zns-id-ns.html4
-rw-r--r--Documentation/nvme-zns-offline-zone.14
-rw-r--r--Documentation/nvme-zns-offline-zone.html4
-rw-r--r--Documentation/nvme-zns-open-zone.14
-rw-r--r--Documentation/nvme-zns-open-zone.html4
-rw-r--r--Documentation/nvme-zns-report-zones.14
-rw-r--r--Documentation/nvme-zns-report-zones.html4
-rw-r--r--Documentation/nvme-zns-reset-zone.14
-rw-r--r--Documentation/nvme-zns-reset-zone.html4
-rw-r--r--Documentation/nvme-zns-set-zone-desc.14
-rw-r--r--Documentation/nvme-zns-set-zone-desc.html4
-rw-r--r--Documentation/nvme-zns-zone-append.14
-rw-r--r--Documentation/nvme-zns-zone-append.html4
-rw-r--r--Documentation/nvme-zns-zone-mgmt-recv.14
-rw-r--r--Documentation/nvme-zns-zone-mgmt-recv.html4
-rw-r--r--Documentation/nvme-zns-zone-mgmt-send.14
-rw-r--r--Documentation/nvme-zns-zone-mgmt-send.html4
-rw-r--r--Documentation/nvme.19
-rw-r--r--Documentation/nvme.html12
-rw-r--r--completions/_nvme105
-rw-r--r--completions/bash-nvme-completion.sh57
-rw-r--r--fabrics.c122
-rw-r--r--meson.build5
-rw-r--r--nvme-print-json.c438
-rw-r--r--nvme-print-stdout.c289
-rw-r--r--nvme-print.c48
-rw-r--r--nvme-print.h15
-rw-r--r--nvme.c262
-rw-r--r--nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in7
-rw-r--r--plugins/dapustor/dapustor-nvme.c553
-rw-r--r--plugins/dapustor/dapustor-nvme.h18
-rw-r--r--plugins/fdp/fdp.c10
-rw-r--r--plugins/innogrit/innogrit-nvme.c501
-rw-r--r--plugins/innogrit/innogrit-nvme.h3
-rw-r--r--plugins/innogrit/typedef.h87
-rw-r--r--plugins/memblaze/memblaze-nvme.c2
-rw-r--r--plugins/meson.build4
-rw-r--r--plugins/netapp/netapp-nvme.c308
-rw-r--r--plugins/ocp/meson.build9
-rw-r--r--plugins/ocp/ocp-fw-activation-history.c129
-rw-r--r--plugins/ocp/ocp-fw-activation-history.h32
-rw-r--r--plugins/ocp/ocp-hardware-component-log.c288
-rw-r--r--plugins/ocp/ocp-hardware-component-log.h64
-rw-r--r--plugins/ocp/ocp-nvme.c1809
-rw-r--r--plugins/ocp/ocp-nvme.h200
-rw-r--r--plugins/ocp/ocp-print-binary.c54
-rw-r--r--plugins/ocp/ocp-print-json.c851
-rw-r--r--plugins/ocp/ocp-print-stdout.c710
-rw-r--r--plugins/ocp/ocp-print.c81
-rw-r--r--plugins/ocp/ocp-print.h51
-rw-r--r--plugins/ocp/ocp-smart-extended-log.c239
-rw-r--r--plugins/ocp/ocp-smart-extended-log.h40
-rw-r--r--plugins/ocp/ocp-telemetry-decode.c471
-rw-r--r--plugins/ocp/ocp-telemetry-decode.h32
-rw-r--r--plugins/sed/sedopal_cmd.c18
-rw-r--r--plugins/solidigm/solidigm-internal-logs.c70
-rw-r--r--plugins/solidigm/solidigm-nvme.h2
-rw-r--r--plugins/solidigm/solidigm-telemetry.c13
-rw-r--r--plugins/solidigm/solidigm-util.c16
-rw-r--r--plugins/solidigm/solidigm-util.h5
-rw-r--r--plugins/solidigm/solidigm-workload-tracker.c365
-rw-r--r--plugins/wdc/wdc-nvme.c55
-rw-r--r--plugins/wdc/wdc-nvme.h2
-rwxr-xr-xscripts/release.sh2
-rw-r--r--subprojects/libnvme.wrap2
-rw-r--r--tests/nvme_attach_detach_ns_test.py6
-rw-r--r--tests/nvme_compare_test.py11
-rw-r--r--tests/nvme_copy_test.py1
-rw-r--r--tests/nvme_create_max_ns_test.py13
-rw-r--r--tests/nvme_ctrl_reset_test.py2
-rw-r--r--tests/nvme_format_test.py13
-rw-r--r--tests/nvme_get_features_test.py2
-rw-r--r--tests/nvme_get_lba_status_test.py7
-rw-r--r--tests/nvme_lba_status_log_test.py2
-rw-r--r--tests/nvme_smart_log_test.py2
-rw-r--r--tests/nvme_test.py128
-rw-r--r--util/logging.h6
-rw-r--r--util/types.c2
-rw-r--r--util/types.h1
533 files changed, 24034 insertions, 4006 deletions
diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml
index c7b92f7..9768c70 100644
--- a/.github/workflows/appimage.yml
+++ b/.github/workflows/appimage.yml
@@ -14,7 +14,7 @@ jobs:
name: build AppImage
runs-on: ubuntu-latest
container:
- image: ghcr.io/igaw/linux-nvme/debian:latest
+ image: ghcr.io/linux-nvme/debian:latest
steps:
- uses: actions/checkout@v4
with:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 66b3811..a52f129 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -17,7 +17,7 @@ jobs:
compiler: [gcc, clang]
buildtype: [debug, release]
container:
- image: ghcr.io/igaw/linux-nvme/debian.python:latest
+ image: ghcr.io/linux-nvme/debian.python:latest
steps:
- uses: actions/checkout@v4
- name: build
@@ -43,10 +43,16 @@ jobs:
- uses: actions/checkout@v4
- name: enable foreign arch
uses: dbhi/qus/action@main
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ with:
+ registry: ghcr.io
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
- name: compile and run unit tests
uses: mosteo-actions/docker-run@v2
with:
- image: ghcr.io/igaw/linux-nvme/ubuntu-cross-${{ matrix.arch }}:latest
+ image: ghcr.io/linux-nvme/ubuntu-cross-${{ matrix.arch }}:latest
guest-dir: /build
host-dir: ${{ github.workspace }}
command: |
@@ -65,7 +71,7 @@ jobs:
name: fallback shared libraries
runs-on: ubuntu-latest
container:
- image: ghcr.io/igaw/linux-nvme/debian:latest
+ image: ghcr.io/linux-nvme/debian:latest
if: github.ref == 'refs/heads/master'
steps:
- uses: actions/checkout@v4
@@ -83,7 +89,7 @@ jobs:
name: muon minimal static
runs-on: ubuntu-latest
container:
- image: ghcr.io/igaw/linux-nvme/debian:latest
+ image: ghcr.io/linux-nvme/debian:latest
steps:
- uses: actions/checkout@v4
- name: build
@@ -94,7 +100,7 @@ jobs:
name: make static
runs-on: ubuntu-latest
container:
- image: ghcr.io/igaw/linux-nvme/debian:latest
+ image: ghcr.io/linux-nvme/debian:latest
steps:
- uses: actions/checkout@v4
- name: build
@@ -105,7 +111,7 @@ jobs:
name: build libnvme and nvme-cli separately
runs-on: ubuntu-latest
container:
- image: ghcr.io/igaw/linux-nvme/debian:latest
+ image: ghcr.io/linux-nvme/debian:latest
steps:
- uses: actions/checkout@v4
- name: build
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 875ed6d..20c69fa 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -11,7 +11,7 @@ jobs:
name: code coverage
runs-on: ubuntu-latest
container:
- image: ghcr.io/igaw/linux-nvme/debian.python:latest
+ image: ghcr.io/linux-nvme/debian.python:latest
steps:
- uses: actions/checkout@v4
- name: build
diff --git a/.github/workflows/docs.yaml b/.github/workflows/docs.yaml
index 89fbd67..465bb26 100644
--- a/.github/workflows/docs.yaml
+++ b/.github/workflows/docs.yaml
@@ -18,7 +18,7 @@ jobs:
name: build documentation
runs-on: ubuntu-latest
container:
- image: ghcr.io/igaw/linux-nvme/debian:latest
+ image: ghcr.io/linux-nvme/debian:latest
steps:
- uses: actions/checkout@v4
- name: build
diff --git a/.github/workflows/run-nightly-tests.yml b/.github/workflows/run-nightly-tests.yml
new file mode 100644
index 0000000..d525986
--- /dev/null
+++ b/.github/workflows/run-nightly-tests.yml
@@ -0,0 +1,93 @@
+---
+name: run-nightly-tests
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 01 * * *'
+
+jobs:
+ nightly-tests:
+ runs-on: nvme-nvm
+ 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
+ - 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]*$//')
+ cat > tests/config.json << EOF
+ {
+ "controller" : "$CONTROLLER",
+ "ns1": "/dev/${BDEV0}",
+ "log_dir": "tests/nvmetests/"
+ }
+ EOF
+ - name: Run on device tests
+ run: |
+ sudo nose2 --verbose --start-dir tests \
+ nvme_attach_detach_ns_test \
+ nvme_compare_test \
+ nvme_copy_test \
+ nvme_create_max_ns_test \
+ nvme_ctrl_reset_test \
+ nvme_dsm_test \
+ nvme_error_log_test \
+ nvme_flush_test \
+ nvme_format_test \
+ nvme_fw_log_test \
+ nvme_get_features_test \
+ nvme_get_lba_status_test \
+ nvme_id_ctrl_test \
+ nvme_id_ns_test \
+ nvme_lba_status_log_test \
+ nvme_read_write_test \
+ nvme_smart_log_test \
+ nvme_verify_test \
+ nvme_writeuncor_test \
+ nvme_writezeros_test
+ - name: Upload logs
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: logs files
+ 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/CONTRIBUTING.md b/CONTRIBUTING.md
index cde8527..df0e8e5 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -19,6 +19,28 @@ Please feel free to use the github forums to ask for comments & questions on
your code before submitting a pull request. The NVMe CLI project uses the
common *fork and merge* workflow used by most GitHub-hosted projects.
+#### Commit conventions
+
+The project follows the Linux kernel mailing list workflow,
+thus commit messages should be structured like this:
+```
+<feature|plugin|subject>: <commit message>
+
+<description of the feature>
+
+Signed-off-by: My Name/alias <email@address.foo>
+```
+
+Example:
+
+```
+doc: added commit conventions to contribution guidelines
+
+Show new contributors the project's commit guidelines
+
+Signed-off-by: John Doe <j.doe@address.foo>
+```
+
### Bug Reports
Bugs for the NVM Library project are tracked in our [GitHub Issues Database](https://github.com/linux-nvme/nvme-cli/issues).
diff --git a/Documentation/cmd-plugins.txt b/Documentation/cmd-plugins.txt
index 338425e..2e80bfc 100644
--- a/Documentation/cmd-plugins.txt
+++ b/Documentation/cmd-plugins.txt
@@ -204,3 +204,6 @@ linknvme:nvme-zns-zrwa-flush-zone[1]::
linknvme:nvme-inspur-nvme-vendor-log[1]::
NVMe Inspur Device Vendor log page request
+
+linknvme:nvme-dapustor-smart-log-add[1]::
+ NVMe DapuStor Additional SMART log page
diff --git a/Documentation/meson.build b/Documentation/meson.build
index 1478134..65495e3 100644
--- a/Documentation/meson.build
+++ b/Documentation/meson.build
@@ -14,6 +14,7 @@ adoc_sources = [
'nvme-connect-all',
'nvme-copy',
'nvme-create-ns',
+ 'nvme-dapustor-smart-log-add',
'nvme-delete-ns',
'nvme-dera-stat',
'nvme-detach-ns',
@@ -142,6 +143,22 @@ adoc_sources = [
'nvme-show-regs',
'nvme-show-topology',
'nvme-smart-log',
+ 'nvme-solidigm-clear-fw-activate-history',
+ 'nvme-solidigm-clear-pcie-correctable-errors',
+ 'nvme-solidigm-cloud-SSDplugin-version',
+ 'nvme-solidigm-garbage-collect-log',
+ 'nvme-solidigm-id-ctrl',
+ 'nvme-solidigm-latency-tracking-log',
+ 'nvme-solidigm-log-page-directory',
+ 'nvme-solidigm-market-log',
+ 'nvme-solidigm-parse-telemetry-log',
+ 'nvme-solidigm-smart-log-add',
+ 'nvme-solidigm-temp-stats',
+ 'nvme-solidigm-vs-drive-info',
+ 'nvme-solidigm-vs-fw-activate-history',
+ 'nvme-solidigm-vs-internal-log',
+ 'nvme-solidigm-vs-smart-add-log',
+ 'nvme-solidigm-workload-tracker',
'nvme-subsystem-reset',
'nvme-supported-log-pages',
'nvme-telemetry-log',
diff --git a/Documentation/nvme-admin-passthru.1 b/Documentation/nvme-admin-passthru.1
index a1d33c6..25576c9 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ADMIN\-PASSTHR" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ADMIN\-PASSTHR" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-admin-passthru.html b/Documentation/nvme-admin-passthru.html
index d918999..1ae7d89 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ana-log.1 b/Documentation/nvme-ana-log.1
index 6223dea..e34ef0f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ANA\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ANA\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ana-log.html b/Documentation/nvme-ana-log.html
index 25b0b3e..0e3be22 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-attach-ns.1 b/Documentation/nvme-attach-ns.1
index 8efbc98..f6f93f1 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ATTACH\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ATTACH\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-attach-ns.html b/Documentation/nvme-attach-ns.html
index 8c1225a..926a570 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-attach-ns(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -841,7 +841,7 @@ controller identifiers.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-boot-part-log.1 b/Documentation/nvme-boot-part-log.1
index bee3f7e..1727157 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-BOOT\-PART\-LO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-BOOT\-PART\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-boot-part-log.html b/Documentation/nvme-boot-part-log.html
index 74ff42b..6bf52e9 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-capacity-mgmt.1 b/Documentation/nvme-capacity-mgmt.1
index bcfc1bb..7ec35b8 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-CAPACITY\-MGMT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CAPACITY\-MGMT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-capacity-mgmt.html b/Documentation/nvme-capacity-mgmt.html
index 83d85fd..c0bb419 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-changed-ns-list-log.1 b/Documentation/nvme-changed-ns-list-log.1
index 5f71202..ce729f7 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-CHANGED\-NS\-L" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CHANGED\-NS\-L" "1" "10/31/2024" "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 b64feb4..c7606df 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-check-tls-key.txt b/Documentation/nvme-check-tls-key.txt
index 2df4fca..4532930 100644
--- a/Documentation/nvme-check-tls-key.txt
+++ b/Documentation/nvme-check-tls-key.txt
@@ -16,6 +16,7 @@ SYNOPSIS
[--output-format=<fmt> | -o <fmt>]
[--identity=<id-vers> | -I <id-vers>]
[--insert | -i ]
+ [--keyfile=<keyfile> | -f <keyfile>]
[--verbose | -v]
DESCRIPTION
@@ -61,6 +62,11 @@ OPTIONS
--insert:
Insert the derived 'retained' key in the keyring.
+-f <keyfile>
+--keyfile=<keyfile>
+ Append the resulting TLS key to keyfile. This command line option is
+ depending on --insert.
+
-o <fmt>::
--output-format=<fmt>::
Set the reporting format to 'normal', 'json' or 'binary'. Only one
diff --git a/Documentation/nvme-cmdset-ind-id-ns.1 b/Documentation/nvme-cmdset-ind-id-ns.1
index 89d6737..682c15d 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-CMDSET\-IND\-I" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CMDSET\-IND\-I" "1" "10/31/2024" "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 e8237c9..5bf46af 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-compare.1 b/Documentation/nvme-compare.1
index 98c3480..556e3f5 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-COMPARE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-COMPARE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-compare.html b/Documentation/nvme-compare.html
index 1256aaf..bb0c7d7 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-connect-all.1 b/Documentation/nvme-connect-all.1
index 955c43b..b101728 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-CONNECT\-ALL" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CONNECT\-ALL" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-connect-all.html b/Documentation/nvme-connect-all.html
index 4028273..80a9f37 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-connect.1 b/Documentation/nvme-connect.1
index 4477f4c..aca8d8c 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-CONNECT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CONNECT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -50,7 +50,8 @@ nvme-connect \- Connect to a Fabrics controller\&.
[\-\-keep\-alive\-tmo=<#> | \-k <#>]
[\-\-reconnect\-delay=<#> | \-c <#>]
[\-\-ctrl\-loss\-tmo=<#> | \-l <#>] [\-\-tos=<#> | \-T <#>]
- [\-\-keyring=<#>] [\-\-tls_key=<#>]
+ [\-\-keyring=<keyring>] [\-\-tls\-key=<tls\-key>]
+ [\-\-tls\-key\-identity=<identity>]
[\-\-duplicate\-connect | \-D] [\-\-disable\-sqflow ]
[\-\-hdr\-digest | \-g] [\-\-data\-digest | \-G] [\-\-tls]
[\-\-concat] [\-\-dump\-config | \-O] [\-\-application=<id>]
@@ -198,14 +199,23 @@ seconds\&.
Type of service for the connection (TCP)
.RE
.PP
-\-\-keyring=<#>
+\-\-keyring=<keyring>
.RS 4
-Keyring for TLS key lookup\&.
+Keyring for TLS key lookup, either the key id or the keyring name\&.
.RE
.PP
-\-\-tls_key=<#>
+\-\-tls\-key=<tls\-key>
.RS 4
-TLS key for the connection (TCP)\&.
+TLS key for the connection (TCP), either the TLS key in interchange format or the key id\&. It\(cqs strongly recommended not to provide the TLS key via the comamnd line due to security concerns\&. Instead in production situation, the key should be loaded into the keystore with
+\fInvme tls \-\-import\fR
+and only the
+\fI\-\-tls\fR
+options used\&. The kernel will select the matching key\&.
+.RE
+.PP
+\-\-tls\-key\-identity=<identity>
+.RS 4
+The identity used for the tls\-key\&. If none is provided the tls\-key provided via the comamnd line is considered a configuration key and a derive key will be loaded into the keyring\&.
.RE
.PP
\-D, \-\-duplicate\-connect
diff --git a/Documentation/nvme-connect.html b/Documentation/nvme-connect.html
index 5d892b9..def8aee 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-connect(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -767,7 +767,8 @@ nvme-connect(1) Manual Page
[--keep-alive-tmo=&lt;#&gt; | -k &lt;#&gt;]
[--reconnect-delay=&lt;#&gt; | -c &lt;#&gt;]
[--ctrl-loss-tmo=&lt;#&gt; | -l &lt;#&gt;] [--tos=&lt;#&gt; | -T &lt;#&gt;]
- [--keyring=&lt;#&gt;] [--tls_key=&lt;#&gt;]
+ [--keyring=&lt;keyring&gt;] [--tls-key=&lt;tls-key&gt;]
+ [--tls-key-identity=&lt;identity&gt;]
[--duplicate-connect | -D] [--disable-sqflow ]
[--hdr-digest | -g] [--data-digest | -G] [--tls]
[--concat] [--dump-config | -O] [--application=&lt;id&gt;]
@@ -1055,19 +1056,35 @@ cellspacing="0" cellpadding="4">
</p>
</dd>
<dt class="hdlist1">
---keyring=&lt;#&gt;
+--keyring=&lt;keyring&gt;
</dt>
<dd>
<p>
- Keyring for TLS key lookup.
+ Keyring for TLS key lookup, either the key id or the keyring name.
</p>
</dd>
<dt class="hdlist1">
---tls_key=&lt;#&gt;
+--tls-key=&lt;tls-key&gt;
</dt>
<dd>
<p>
- TLS key for the connection (TCP).
+ TLS key for the connection (TCP), either the TLS key in
+ interchange format or the key id. It&#8217;s strongly recommended not
+ to provide the TLS key via the comamnd line due to security
+ concerns. Instead in production situation, the key should be
+ loaded into the keystore with <em>nvme tls --import</em> and only the
+ <em>--tls</em> options used. The kernel will select the matching key.
+</p>
+</dd>
+<dt class="hdlist1">
+--tls-key-identity=&lt;identity&gt;
+</dt>
+<dd>
+<p>
+ The identity used for the tls-key. If none is provided the
+ tls-key provided via the comamnd line is considered a
+ configuration key and a derive key will be loaded into the
+ keyring.
</p>
</dd>
<dt class="hdlist1">
@@ -1218,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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-connect.txt b/Documentation/nvme-connect.txt
index 0112e11..a18ff0b 100644
--- a/Documentation/nvme-connect.txt
+++ b/Documentation/nvme-connect.txt
@@ -26,7 +26,8 @@ SYNOPSIS
[--keep-alive-tmo=<#> | -k <#>]
[--reconnect-delay=<#> | -c <#>]
[--ctrl-loss-tmo=<#> | -l <#>] [--tos=<#> | -T <#>]
- [--keyring=<#>] [--tls_key=<#>]
+ [--keyring=<keyring>] [--tls-key=<tls-key>]
+ [--tls-key-identity=<identity>]
[--duplicate-connect | -D] [--disable-sqflow ]
[--hdr-digest | -g] [--data-digest | -G] [--tls]
[--concat] [--dump-config | -O] [--application=<id>]
@@ -151,11 +152,22 @@ OPTIONS
--tos=<#>::
Type of service for the connection (TCP)
---keyring=<#>::
- Keyring for TLS key lookup.
-
---tls_key=<#>::
- TLS key for the connection (TCP).
+--keyring=<keyring>::
+ Keyring for TLS key lookup, either the key id or the keyring name.
+
+--tls-key=<tls-key>::
+ TLS key for the connection (TCP), either the TLS key in
+ interchange format or the key id. It's strongly recommended not
+ to provide the TLS key via the comamnd line due to security
+ concerns. Instead in production situation, the key should be
+ loaded into the keystore with 'nvme tls --import' and only the
+ '--tls' options used. The kernel will select the matching key.
+
+--tls-key-identity=<identity>::
+ The identity used for the tls-key. If none is provided the
+ tls-key provided via the comamnd line is considered a
+ configuration key and a derive key will be loaded into the
+ keyring.
-D::
--duplicate-connect::
diff --git a/Documentation/nvme-copy.1 b/Documentation/nvme-copy.1
index 5981733..82fa113 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-COPY" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-COPY" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-copy.html b/Documentation/nvme-copy.html
index 913bb52..6085489 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-create-ns.1 b/Documentation/nvme-create-ns.1
index 1c51bf5..fe977f4 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-CREATE\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-CREATE\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-create-ns.html b/Documentation/nvme-create-ns.html
index 382883e..cc37359 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-create-ns(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1082,7 +1082,7 @@ Create a namespace:
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-dapustor-smart-log-add.1 b/Documentation/nvme-dapustor-smart-log-add.1
new file mode 100644
index 0000000..6750164
--- /dev/null
+++ b/Documentation/nvme-dapustor-smart-log-add.1
@@ -0,0 +1,108 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-DAPUSTOR\-SMAR" "1" "10/31/2024" "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-dapustor-smart-log-add \- Send NVMe DapuStor Additional SMART log page request, returns result and log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme dapustor smart\-log\-add\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
+ [\-\-raw\-binary | \-b] [\-\-json | \-j]
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves the NVMe DapuStor Additional SMART log page from the device and provides the returned structure\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.sp
+On success, the returned smart 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\&.
+.SH "OPTIONS"
+.PP
+\-n <nsid>, \-\-namespace\-id=<nsid>
+.RS 4
+Retrieve the Additional SMART log for the given nsid\&. This is optional and its success may depend on the device\(cqs capabilities to provide this log on a per\-namespace basis (see the NVMe Identify Controller for this capability)\&. The default nsid to use is 0xffffffff for the device global SMART log\&.
+.RE
+.PP
+\-b, \-\-raw\-binary
+.RS 4
+Print the raw DapuStor Additional SMART log buffer to stdout\&.
+.RE
+.PP
+\-j, \-\-json
+.RS 4
+Dump output in json format\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Print the DapuStor Additional SMART log page in a human readable format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme dapustor smart\-log\-add /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Print the raw DapuStor Additional SMART log to a file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme dapustor smart\-log\-add /dev/nvme0 \-\-raw\-binary > smart_log\&.raw
+.fi
+.if n \{\
+.RE
+.\}
+.sp
+It is probably a bad idea to not redirect stdout when using this mode\&.
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-dapustor-smart-log-add.html b/Documentation/nvme-dapustor-smart-log-add.html
new file mode 100644
index 0000000..f7a5825
--- /dev/null
+++ b/Documentation/nvme-dapustor-smart-log-add.html
@@ -0,0 +1,856 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-dapustor-smart-log-add(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-dapustor-smart-log-add(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-dapustor-smart-log-add -
+ Send NVMe DapuStor Additional SMART log page request, returns result and log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme dapustor smart-log-add</em> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
+ [--raw-binary | -b] [--json | -j]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves the NVMe DapuStor Additional SMART log page from the device and
+provides the returned structure.</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>On success, the returned smart 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.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n &lt;nsid&gt;
+</dt>
+<dt class="hdlist1">
+--namespace-id=&lt;nsid&gt;
+</dt>
+<dd>
+<p>
+ Retrieve the Additional SMART log for the given nsid. This is
+ optional and its success may depend on the device&#8217;s capabilities
+ to provide this log on a per-namespace basis (see the NVMe
+ Identify Controller for this capability). The default nsid to
+ use is 0xffffffff for the device global SMART log.
+</p>
+</dd>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Print the raw DapuStor Additional SMART log buffer to stdout.
+</p>
+</dd>
+<dt class="hdlist1">
+-j
+</dt>
+<dt class="hdlist1">
+--json
+</dt>
+<dd>
+<p>
+ Dump output in json format.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Print the DapuStor Additional SMART log page in a human readable format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme dapustor smart-log-add /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Print the raw DapuStor Additional SMART log to a file:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme dapustor smart-log-add /dev/nvme0 --raw-binary &gt; smart_log.raw</code></pre>
+</div></div>
+<div class="paragraph"><p>It is probably a bad idea to not redirect stdout when using this mode.</p></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-dapustor-smart-log-add.txt b/Documentation/nvme-dapustor-smart-log-add.txt
new file mode 100644
index 0000000..0c67a21
--- /dev/null
+++ b/Documentation/nvme-dapustor-smart-log-add.txt
@@ -0,0 +1,65 @@
+nvme-dapustor-smart-log-add(1)
+==============================
+
+NAME
+----
+nvme-dapustor-smart-log-add - Send NVMe DapuStor Additional SMART log page request,
+returns result and log
+
+SYNOPSIS
+--------
+[verse]
+'nvme dapustor smart-log-add' <device> [--namespace-id=<nsid> | -n <nsid>]
+ [--raw-binary | -b] [--json | -j]
+
+DESCRIPTION
+-----------
+Retrieves the NVMe DapuStor Additional SMART log page from the device and
+provides the returned structure.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+On success, the returned smart 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
+-------
+-n <nsid>::
+--namespace-id=<nsid>::
+ Retrieve the Additional SMART log for the given nsid. This is
+ optional and its success may depend on the device's capabilities
+ to provide this log on a per-namespace basis (see the NVMe
+ Identify Controller for this capability). The default nsid to
+ use is 0xffffffff for the device global SMART log.
+
+-b::
+--raw-binary::
+ Print the raw DapuStor Additional SMART log buffer to stdout.
+
+-j::
+--json::
+ Dump output in json format.
+
+EXAMPLES
+--------
+* Print the DapuStor Additional SMART log page in a human readable format:
++
+------------
+# nvme dapustor smart-log-add /dev/nvme0
+------------
++
+
+* Print the raw DapuStor Additional SMART log to a file:
++
+------------
+# nvme dapustor smart-log-add /dev/nvme0 --raw-binary > smart_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-delete-ns.1 b/Documentation/nvme-delete-ns.1
index fdf9f7a..7ac1853 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-delete-ns.html b/Documentation/nvme-delete-ns.html
index 4785dd1..6ee087b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-dera-stat.1 b/Documentation/nvme-dera-stat.1
index eafe4ab..e56fb7b 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DERA\-STAT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DERA\-STAT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dera-stat.html b/Documentation/nvme-dera-stat.html
index 27e35b6..ee45937 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-detach-ns.1 b/Documentation/nvme-detach-ns.1
index 632ec29..c9a8e1c 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DETACH\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DETACH\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-detach-ns.html b/Documentation/nvme-detach-ns.html
index 99de585..025bf6a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-device-self-test.1 b/Documentation/nvme-device-self-test.1
index 0897f65..d21ea59 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DEVICE\-SELF\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DEVICE\-SELF\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -44,6 +44,8 @@ Initiates the required test based on the user input\&.
The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
.sp
On success, the corresponding test is initiated\&.
+.sp
+The results of this test can be queried via \fInvme self\-test\-log <device>\fR\&.
.SH "OPTIONS"
.PP
\-n <NUM>, \-\-namespace\-id=<NUM>
diff --git a/Documentation/nvme-device-self-test.html b/Documentation/nvme-device-self-test.html
index 5bed073..1f0c092 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-device-self-test(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -764,6 +764,7 @@ nvme-device-self-test(1) Manual Page
<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>On success, the corresponding test is initiated.</p></div>
+<div class="paragraph"><p>The results of this test can be queried via <em>nvme self-test-log &lt;device&gt;</em>.</p></div>
</div>
</div>
<div class="sect1">
@@ -884,7 +885,7 @@ Abort the device self-test operation in the namespace-id 1:
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-device-self-test.txt b/Documentation/nvme-device-self-test.txt
index 149dbf1..bf14f42 100644
--- a/Documentation/nvme-device-self-test.txt
+++ b/Documentation/nvme-device-self-test.txt
@@ -22,6 +22,8 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
On success, the corresponding test is initiated.
+The results of this test can be queried via 'nvme self-test-log <device>'.
+
OPTIONS
-------
-n <NUM>::
diff --git a/Documentation/nvme-dim.1 b/Documentation/nvme-dim.1
index b518455..6f62713 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DIM" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DIM" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dim.html b/Documentation/nvme-dim.html
index 3ecf41e..82c9f0c 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-dir-receive.1 b/Documentation/nvme-dir-receive.1
index 549581e..49e182c 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DIR\-RECEIVE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DIR\-RECEIVE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dir-receive.html b/Documentation/nvme-dir-receive.html
index adbc9d2..d425384 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-dir-send.1 b/Documentation/nvme-dir-send.1
index be16cd8..6e16d68 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DIR\-SEND" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DIR\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dir-send.html b/Documentation/nvme-dir-send.html
index ba51be3..4168304 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-disconnect-all.1 b/Documentation/nvme-disconnect-all.1
index eeb209f..49a6455 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DISCONNECT\-AL" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DISCONNECT\-AL" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-disconnect-all.html b/Documentation/nvme-disconnect-all.html
index e326c99..b579049 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-disconnect.1 b/Documentation/nvme-disconnect.1
index eb76da5..aa443e8 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DISCONNECT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DISCONNECT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-disconnect.html b/Documentation/nvme-disconnect.html
index e59cd2c..29bb6ed 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-discover.1 b/Documentation/nvme-discover.1
index a2057f3..8590c03 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DISCOVER" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DISCOVER" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-discover.html b/Documentation/nvme-discover.html
index 7c5acd5..7ee02b4 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-dsm.1 b/Documentation/nvme-dsm.1
index 2086ce2..e7a8b58 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-DSM" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-DSM" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-dsm.html b/Documentation/nvme-dsm.html
index e43d7c6..2761bee 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-effects-log.1 b/Documentation/nvme-effects-log.1
index b48a691..5960677 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-EFFECTS\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-EFFECTS\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-effects-log.html b/Documentation/nvme-effects-log.html
index 79d7619..7f949af 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-endurance-event-agg-log.1 b/Documentation/nvme-endurance-event-agg-log.1
index 5667c19..0c5e181 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ENDURANCE\-EVE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ENDURANCE\-EVE" "1" "10/31/2024" "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 468067c..9f426a2 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-endurance-log.1 b/Documentation/nvme-endurance-log.1
index 3146648..26ff933 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ENDURANCE\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ENDURANCE\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-endurance-log.html b/Documentation/nvme-endurance-log.html
index 195a7a9..f72f35e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-error-log.1 b/Documentation/nvme-error-log.1
index e1d0612..9a4b8a9 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ERROR\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ERROR\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-error-log.html b/Documentation/nvme-error-log.html
index 8ece59a..8db4c61 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fdp-configs.1 b/Documentation/nvme-fdp-configs.1
index 0807385..500375c 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FDP\-CONFIGS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-CONFIGS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-configs.html b/Documentation/nvme-fdp-configs.html
index c68466e..aa79a09 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fdp-events.1 b/Documentation/nvme-fdp-events.1
index 1351d0f..39d80c5 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FDP\-EVENTS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-EVENTS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-events.html b/Documentation/nvme-fdp-events.html
index e140b99..fed22f9 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fdp-set-events.1 b/Documentation/nvme-fdp-set-events.1
index 8a4f9bb..1f0c9d9 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FDP\-SET\-EVEN" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-SET\-EVEN" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-set-events.html b/Documentation/nvme-fdp-set-events.html
index b787049..afd77fc 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fdp-stats.1 b/Documentation/nvme-fdp-stats.1
index 246a0c5..d0bebf0 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FDP\-STATS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-STATS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-stats.html b/Documentation/nvme-fdp-stats.html
index c969e04..dc431b2 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fdp-status.1 b/Documentation/nvme-fdp-status.1
index 8354d86..90f1de7 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FDP\-STATUS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-STATUS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-status.html b/Documentation/nvme-fdp-status.html
index c16589c..dbb9813 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fdp-update.1 b/Documentation/nvme-fdp-update.1
index 18e5537..a7d1eb5 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FDP\-UPDATE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-UPDATE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-update.html b/Documentation/nvme-fdp-update.html
index 6afc7fd..ee9d309 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fdp-usage.1 b/Documentation/nvme-fdp-usage.1
index 65abdd6..82434cf 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FDP\-USAGE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FDP\-USAGE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fdp-usage.html b/Documentation/nvme-fdp-usage.html
index a05baab..2d8531e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fid-support-effects-log.1 b/Documentation/nvme-fid-support-effects-log.1
index f433c3f..70f3a0a 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FID\-SUPPORT\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FID\-SUPPORT\-" "1" "10/31/2024" "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 78c5bd0..58af505 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-flush.1 b/Documentation/nvme-flush.1
index 0b68d53..5e3e486 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FLUSH" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FLUSH" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-flush.html b/Documentation/nvme-flush.html
index 981407a..66fe2fa 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-format.1 b/Documentation/nvme-format.1
index 0c1f6d0..6155bdf 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FORMAT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FORMAT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-format.html b/Documentation/nvme-format.html
index b87ab10..a0ca75a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fw-commit.1 b/Documentation/nvme-fw-commit.1
index bcfaf19..01b0dbd 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FW\-COMMIT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FW\-COMMIT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fw-commit.html b/Documentation/nvme-fw-commit.html
index 170b25b..6a813f8 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fw-download.1 b/Documentation/nvme-fw-download.1
index da7bc81..8fef9d6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FW\-DOWNLOAD" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FW\-DOWNLOAD" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fw-download.html b/Documentation/nvme-fw-download.html
index f2f76f9..a533b7f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-fw-log.1 b/Documentation/nvme-fw-log.1
index 300d13e..6f1bd43 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-FW\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-FW\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-fw-log.html b/Documentation/nvme-fw-log.html
index 324c004..a06590d 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-gen-hostnqn.1 b/Documentation/nvme-gen-hostnqn.1
index a784a3f..9ef79e6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-GEN\-HOSTNQN" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GEN\-HOSTNQN" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-gen-hostnqn.html b/Documentation/nvme-gen-hostnqn.html
index 69afaf8..99fde8f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-gen-tls-key.txt b/Documentation/nvme-gen-tls-key.txt
index 772c7bc..ef85b14 100644
--- a/Documentation/nvme-gen-tls-key.txt
+++ b/Documentation/nvme-gen-tls-key.txt
@@ -16,6 +16,7 @@ SYNOPSIS
[--identity=<id-vers> | -I <id-vers>]
[--secret=<secret> | -s <secret>]
[--insert | -i]
+ [--keyfile=<keyfile> | -f <keyfile>]
[--output-format=<fmt> | -o <fmt>] [--verbose | -v]
DESCRIPTION
@@ -81,6 +82,11 @@ OPTIONS
Insert the resulting TLS key into the keyring without printing out
the key in PSK interchange format.
+-f <keyfile>
+--keyfile=<keyfile>
+ Append the resulting TLS key to keyfile. This command line option is
+ depending on --insert.
+
-o <fmt>::
--output-format=<fmt>::
Set the reporting format to 'normal', 'json' or 'binary'. Only one
diff --git a/Documentation/nvme-get-feature.1 b/Documentation/nvme-get-feature.1
index 20d8141..64a3631 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-GET\-FEATURE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-FEATURE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -38,7 +38,7 @@ nvme-get-feature \- Gets an NVMe feature, returns applicable results
[\-\-data\-len=<data\-len> | \-l <data\-len>]
[\-\-sel=<select> | \-s <select>]
[\-\-raw\-binary | \-b] [\-\-cdw11=<cdw11> | \-c <cdw11>]
- [\-\-human\-readable | \-H]
+ [\-\-human\-readable | \-H] [\-\-changed | \-C]
[\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v]
[\-\-timeout=<timeout> | \-t <timeout>]
.fi
@@ -131,6 +131,11 @@ Print the raw feature buffer to stdout if the feature returns a structure\&.
This option will parse and format many of the bit fields into human\-readable formats\&.
.RE
.PP
+\-C, \-\-changed
+.RS 4
+This option will show feature changed\&.
+.RE
+.PP
\-o <fmt>, \-\-output\-format=<fmt>
.RS 4
Set the reporting format to
diff --git a/Documentation/nvme-get-feature.html b/Documentation/nvme-get-feature.html
index 58736d1..2d2858b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-get-feature(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -755,7 +755,7 @@ nvme-get-feature(1) Manual Page
[--data-len=&lt;data-len&gt; | -l &lt;data-len&gt;]
[--sel=&lt;select&gt; | -s &lt;select&gt;]
[--raw-binary | -b] [--cdw11=&lt;cdw11&gt; | -c &lt;cdw11&gt;]
- [--human-readable | -H]
+ [--human-readable | -H] [--changed | -C]
[--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;] [--verbose | -v]
[--timeout=&lt;timeout&gt; | -t &lt;timeout&gt;]</pre>
<div class="attribution">
@@ -912,6 +912,17 @@ cellspacing="0" cellpadding="4">
</p>
</dd>
<dt class="hdlist1">
+-C
+</dt>
+<dt class="hdlist1">
+--changed
+</dt>
+<dd>
+<p>
+ This option will show feature changed.
+</p>
+</dd>
+<dt class="hdlist1">
-o &lt;fmt&gt;
</dt>
<dt class="hdlist1">
@@ -1016,7 +1027,7 @@ format:
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-get-feature.txt b/Documentation/nvme-get-feature.txt
index a055b93..d035c29 100644
--- a/Documentation/nvme-get-feature.txt
+++ b/Documentation/nvme-get-feature.txt
@@ -14,7 +14,7 @@ SYNOPSIS
[--data-len=<data-len> | -l <data-len>]
[--sel=<select> | -s <select>]
[--raw-binary | -b] [--cdw11=<cdw11> | -c <cdw11>]
- [--human-readable | -H]
+ [--human-readable | -H] [--changed | -C]
[--output-format=<fmt> | -o <fmt>] [--verbose | -v]
[--timeout=<timeout> | -t <timeout>]
@@ -84,6 +84,10 @@ OPTIONS
This option will parse and format many of the bit fields
into human-readable formats.
+-C::
+--changed::
+ This option will show feature changed.
+
-o <fmt>::
--output-format=<fmt>::
Set the reporting format to 'normal', 'json' or 'binary'. Only one
diff --git a/Documentation/nvme-get-lba-status.1 b/Documentation/nvme-get-lba-status.1
index 95e73c0..4f6ded9 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-GET\-LBA\-STAT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-LBA\-STAT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-lba-status.html b/Documentation/nvme-get-lba-status.html
index 481720d..8c5b02b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-get-log.1 b/Documentation/nvme-get-log.1
index fa93896..933043e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-GET\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-log.html b/Documentation/nvme-get-log.html
index 61625c0..501bc80 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-get-ns-id.1 b/Documentation/nvme-get-ns-id.1
index 1c0ed6c..4d4e80e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-GET\-NS\-ID" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-NS\-ID" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-ns-id.html b/Documentation/nvme-get-ns-id.html
index 74606e2..648e70c 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-get-property.1 b/Documentation/nvme-get-property.1
index 2ccdf84..764aaba 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-GET\-PROPERTY" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-GET\-PROPERTY" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-get-property.html b/Documentation/nvme-get-property.html
index fd9c649..a8a6c80 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-help.1 b/Documentation/nvme-help.1
index 0214fdf..01dfdf0 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-HELP" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-HELP" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-help.html b/Documentation/nvme-help.html
index 335309d..f5497af 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-huawei-id-ctrl.1 b/Documentation/nvme-huawei-id-ctrl.1
index c0e6543..31709d6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-HUAWEI\-ID\-CT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-HUAWEI\-ID\-CT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-huawei-id-ctrl.html b/Documentation/nvme-huawei-id-ctrl.html
index 7f659fe..48f4a73 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-huawei-list.1 b/Documentation/nvme-huawei-list.1
index b479bec..482dd7e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-LIST" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-huawei-list.html b/Documentation/nvme-huawei-list.html
index 796ab5f..fdb6f05 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-id-ctrl.1 b/Documentation/nvme-id-ctrl.1
index 357298b..de28c6e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ID\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-ctrl.html b/Documentation/nvme-id-ctrl.html
index c961e64..09e7967 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-id-domain.1 b/Documentation/nvme-id-domain.1
index c103e4f..cba5c4b 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ID\-DOMAIN" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-DOMAIN" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -32,7 +32,7 @@ nvme-id-domain \- Send NVMe Identify Domain List, return result and structure
.SH "SYNOPSIS"
.sp
.nf
-\fInvme id\-domain\fR <device> [\-\-dom\-id=<domian_id> | \-d <domian_id>]
+\fInvme id\-domain\fR <device> [\-\-dom\-id=<domain_id> | \-d <domain_id>]
[\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v]
.fi
.SH "DESCRIPTION"
@@ -42,7 +42,7 @@ For the NVMe device given, send an identify command and return the domain list d
The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
.SH "OPTIONS"
.PP
-\-d <domian_id>, \-\-dom\-id=<domian_id>
+\-d <domain_id>, \-\-dom\-id=<domain_id>
.RS 4
Retrieve the identify domain list data structure for the given domain id\&. If this value is not given, domain id will be 0xffff\&.
.RE
diff --git a/Documentation/nvme-id-domain.html b/Documentation/nvme-id-domain.html
index d4fe6c9..76eeaf5 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-id-domain(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -749,7 +749,7 @@ nvme-id-domain(1) Manual Page
<h2 id="_synopsis">SYNOPSIS</h2>
<div class="sectionbody">
<div class="verseblock">
-<pre class="content"><em>nvme id-domain</em> &lt;device&gt; [--dom-id=&lt;domian_id&gt; | -d &lt;domian_id&gt;]
+<pre class="content"><em>nvme id-domain</em> &lt;device&gt; [--dom-id=&lt;domain_id&gt; | -d &lt;domain_id&gt;]
[--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;] [--verbose | -v]</pre>
<div class="attribution">
</div></div>
@@ -769,10 +769,10 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).</p></di
<div class="sectionbody">
<div class="dlist"><dl>
<dt class="hdlist1">
--d &lt;domian_id&gt;
+-d &lt;domain_id&gt;
</dt>
<dt class="hdlist1">
---dom-id=&lt;domian_id&gt;
+--dom-id=&lt;domain_id&gt;
</dt>
<dd>
<p>
@@ -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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-id-domain.txt b/Documentation/nvme-id-domain.txt
index 1d6ec48..27e1d75 100644
--- a/Documentation/nvme-id-domain.txt
+++ b/Documentation/nvme-id-domain.txt
@@ -8,7 +8,7 @@ nvme-id-domain - Send NVMe Identify Domain List, return result and structure
SYNOPSIS
--------
[verse]
-'nvme id-domain' <device> [--dom-id=<domian_id> | -d <domian_id>]
+'nvme id-domain' <device> [--dom-id=<domain_id> | -d <domain_id>]
[--output-format=<fmt> | -o <fmt>] [--verbose | -v]
DESCRIPTION
@@ -21,8 +21,8 @@ device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
OPTIONS
-------
--d <domian_id>::
---dom-id=<domian_id>::
+-d <domain_id>::
+--dom-id=<domain_id>::
Retrieve the identify domain list data structure for the given
domain id. If this value is not given, domain id will be 0xffff.
diff --git a/Documentation/nvme-id-iocs.1 b/Documentation/nvme-id-iocs.1
index d8a7ccd..951f3cd 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ID\-IOCS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-IOCS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-iocs.html b/Documentation/nvme-id-iocs.html
index aaf9d96..bd0410f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-id-ns.1 b/Documentation/nvme-id-ns.1
index 1524526..f3233c3 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-ns.html b/Documentation/nvme-id-ns.html
index f7677c6..605c675 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-id-nvmset.1 b/Documentation/nvme-id-nvmset.1
index f60c089..0c31cc0 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ID\-NVMSET" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NVMSET" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-id-nvmset.html b/Documentation/nvme-id-nvmset.html
index 68ac4bd..2b1e118 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-inspur-nvme-vendor-log.1 b/Documentation/nvme-inspur-nvme-vendor-log.1
index 8f61329..70d2c71 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-INSPUR\-NVME\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INSPUR\-NVME\-" "1" "10/31/2024" "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 012425e..523c223 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-intel-id-ctrl.1 b/Documentation/nvme-intel-id-ctrl.1
index 7ca144a..0db9668 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-INTEL\-ID\-CTR" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-ID\-CTR" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-id-ctrl.html b/Documentation/nvme-intel-id-ctrl.html
index 0de9ae3..82a2c7c 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-intel-internal-log.1 b/Documentation/nvme-intel-internal-log.1
index 3cd0ab7..f43c6d5 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-INTEL\-INTERNA" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-INTERNA" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-internal-log.html b/Documentation/nvme-intel-internal-log.html
index 3475284..6328ab8 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-intel-lat-stats.1 b/Documentation/nvme-intel-lat-stats.1
index af90cd3..f29468c 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-INTEL\-LAT\-ST" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-LAT\-ST" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-lat-stats.html b/Documentation/nvme-intel-lat-stats.html
index 41a4ba3..ce69e0a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-intel-market-name.1 b/Documentation/nvme-intel-market-name.1
index 492f0ed..749565f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-INTEL\-MARKET\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-MARKET\" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-market-name.html b/Documentation/nvme-intel-market-name.html
index 51db613..520f30a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-intel-smart-log-add.1 b/Documentation/nvme-intel-smart-log-add.1
index 87373a7..4710e9b 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-INTEL\-SMART\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-SMART\-" "1" "10/31/2024" "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 f233ec3..0814ab8 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-intel-temp-stats.1 b/Documentation/nvme-intel-temp-stats.1
index cc6647b..37f45c1 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-INTEL\-TEMP\-S" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-INTEL\-TEMP\-S" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-intel-temp-stats.html b/Documentation/nvme-intel-temp-stats.html
index 2f2370a..8ffaf6d 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-io-mgmt-recv.1 b/Documentation/nvme-io-mgmt-recv.1
index d35d4e3..8347cdf 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-IO\-MGMT\-RECV" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-IO\-MGMT\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-io-mgmt-recv.html b/Documentation/nvme-io-mgmt-recv.html
index add7f26..4563f32 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-io-mgmt-send.1 b/Documentation/nvme-io-mgmt-send.1
index 555015d..c4e2b81 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-IO\-MGMT\-SEND" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-IO\-MGMT\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-io-mgmt-send.html b/Documentation/nvme-io-mgmt-send.html
index 26ce478..139ba13 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-io-passthru.1 b/Documentation/nvme-io-passthru.1
index 7bbe392..c179cf3 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-IO\-PASSTHRU" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-IO\-PASSTHRU" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-io-passthru.html b/Documentation/nvme-io-passthru.html
index 220540d..c0a83f8 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-lba-status-log.1 b/Documentation/nvme-lba-status-log.1
index f75bcca..af7888b 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-LBA\-STATUS\-L" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LBA\-STATUS\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-lba-status-log.html b/Documentation/nvme-lba-status-log.html
index 24873fb..0c3c455 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-list-ctrl.1 b/Documentation/nvme-list-ctrl.1
index 37e4936..98d5094 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-LIST\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list-ctrl.html b/Documentation/nvme-list-ctrl.html
index 091aaab..4d21a84 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-list-endgrp.1 b/Documentation/nvme-list-endgrp.1
index ddec6f3..69778d8 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-LIST\-ENDGRP" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST\-ENDGRP" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list-endgrp.html b/Documentation/nvme-list-endgrp.html
index a1f6cb3..fbd1d0a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-list-ns.1 b/Documentation/nvme-list-ns.1
index 6081da5..49ef9fc 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list-ns.html b/Documentation/nvme-list-ns.html
index e24d326..ecb263b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-list-subsys.1 b/Documentation/nvme-list-subsys.1
index 5cfc8e6..eca67df 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-LIST\-SUBSYS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST\-SUBSYS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list-subsys.html b/Documentation/nvme-list-subsys.html
index 239a34f..ef5929d 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-list.1 b/Documentation/nvme-list.1
index 0fcbdf8..15ed041 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-LIST" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LIST" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-list.html b/Documentation/nvme-list.html
index cd10090..0520ff4 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-lockdown.1 b/Documentation/nvme-lockdown.1
index 1403b76..f1099a9 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-LOCKDOWN" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-LOCKDOWN" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-lockdown.html b/Documentation/nvme-lockdown.html
index e92f600..1a39f6b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-mi-cmd-support-effects-log.1 b/Documentation/nvme-mi-cmd-support-effects-log.1
index f2f2d52..421c80a 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-MI\-CMD\-SUPPO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MI\-CMD\-SUPPO" "1" "10/31/2024" "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 fb0b371..7fce134 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-micron-clear-pcie-errors.1 b/Documentation/nvme-micron-clear-pcie-errors.1
index 551aae0..08c8056 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-MICRON\-CLEAR\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-CLEAR\" "1" "10/31/2024" "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 20844f1..aadd5de 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-micron-internal-log.1 b/Documentation/nvme-micron-internal-log.1
index a1cfc9c..baf0396 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-MICRON\-INTERN" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-INTERN" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-internal-log.html b/Documentation/nvme-micron-internal-log.html
index 14e2f90..45b1e86 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-micron-nand-stats.1 b/Documentation/nvme-micron-nand-stats.1
index 95d3fe1..ab5033e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-MICRON\-NAND\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-NAND\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-nand-stats.html b/Documentation/nvme-micron-nand-stats.html
index 94eeaee..5c35508 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-micron-pcie-stats.1 b/Documentation/nvme-micron-pcie-stats.1
index fd736d4..66efdf5 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-MICRON\-PCIE\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-PCIE\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-pcie-stats.html b/Documentation/nvme-micron-pcie-stats.html
index e679828..558b6e5 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-micron-selective-download.1 b/Documentation/nvme-micron-selective-download.1
index 4478040..90990f0 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-MICRON\-SELECT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-SELECT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-selective-download.html b/Documentation/nvme-micron-selective-download.html
index 130d846..f692368 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-micron-smart-add-log.1 b/Documentation/nvme-micron-smart-add-log.1
index fd0de1c..bf60df6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-MICRON\-SMART\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-SMART\" "1" "10/31/2024" "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 6bae29e..fa7a163 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-micron-temperature-stats.1 b/Documentation/nvme-micron-temperature-stats.1
index a25b9f6..f4f5851 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-MICRON\-TEMPER" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-MICRON\-TEMPER" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-micron-temperature-stats.html b/Documentation/nvme-micron-temperature-stats.html
index 1a536c0..b9488ed 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-netapp-ontapdevices.1 b/Documentation/nvme-netapp-ontapdevices.1
index cff7abb..c93669f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-NETAPP\-ONTAPD" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NETAPP\-ONTAPD" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-netapp-ontapdevices.html b/Documentation/nvme-netapp-ontapdevices.html
index 54fd561..2b734ea 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-netapp-ontapdevices(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -807,7 +807,7 @@ Display information, in a column-based format, for ONTAP devices.
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-netapp-smdevices.1 b/Documentation/nvme-netapp-smdevices.1
index 1fba6f3..8a13c3e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-NETAPP\-SMDEVI" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NETAPP\-SMDEVI" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-netapp-smdevices.html b/Documentation/nvme-netapp-smdevices.html
index 3b55d94..80cf2f7 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-netapp-smdevices(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -809,7 +809,7 @@ namespace.
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ns-descs.1 b/Documentation/nvme-ns-descs.1
index ef540b9..b111cd2 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-NS\-DESCS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NS\-DESCS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ns-descs.html b/Documentation/nvme-ns-descs.html
index f5739b0..f5ca975 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ns-rescan.1 b/Documentation/nvme-ns-rescan.1
index 8c5c737..113584e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-NS\-RESCAN" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NS\-RESCAN" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ns-rescan.html b/Documentation/nvme-ns-rescan.html
index a09d1f6..4d5c8f0 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-nvm-id-ctrl.1 b/Documentation/nvme-nvm-id-ctrl.1
index a027a17..cfc43c4 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-NVM\-ID\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NVM\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-nvm-id-ctrl.html b/Documentation/nvme-nvm-id-ctrl.html
index 8eb3a29..d5f520b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-nvme-mi-recv.1 b/Documentation/nvme-nvme-mi-recv.1
index 7e0368c..ddb47f1 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-NVME\-MI\-RECV" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NVME\-MI\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-nvme-mi-recv.html b/Documentation/nvme-nvme-mi-recv.html
index 760bba4..7b5dd0b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-nvme-mi-send.1 b/Documentation/nvme-nvme-mi-send.1
index ae273de..3ffe836 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-NVME\-MI\-SEND" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-NVME\-MI\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-nvme-mi-send.html b/Documentation/nvme-nvme-mi-send.html
index aeaa615..bbf737f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 f6ccd4b..a51ff5e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-CLEAR\-FW" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-CLEAR\-FW" "1" "10/31/2024" "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 634676e..fc262f5 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 4d73d99..fea822e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-CLEAR\-PC" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-CLEAR\-PC" "1" "10/31/2024" "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 3686ec7..c90cc24 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ocp-device-capability-log.1 b/Documentation/nvme-ocp-device-capability-log.1
index 4dd8535..353213f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-DEVICE\-C" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-DEVICE\-C" "1" "10/31/2024" "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 64c1dc8..98a11b5 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 95959ca..fa40b2f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-EOL\-PLP\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-EOL\-PLP\" "1" "10/31/2024" "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 a6f8509..4757eb3 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ocp-error-recovery-log.1 b/Documentation/nvme-ocp-error-recovery-log.1
index 0a9fead..c055e4f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-ERROR\-RE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-ERROR\-RE" "1" "10/31/2024" "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 bdacc17..84f1f54 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 857a5fe..46668a1 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-GET\-DSSD" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-GET\-DSSD" "1" "10/31/2024" "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 03ddc89..9386e3d 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 8be3c01..45c2b92 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "GET\-DSSD\-POWER\-ST" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "GET\-DSSD\-POWER\-ST" "1" "10/31/2024" "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 e714876..4569ce2 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 48c6830..3a050c3 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-GET\-PLP\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-GET\-PLP\" "1" "10/31/2024" "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 e3a13ba..7f04901 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ocp-hardware-component-log.txt b/Documentation/nvme-ocp-hardware-component-log.txt
new file mode 100644
index 0000000..6700e76
--- /dev/null
+++ b/Documentation/nvme-ocp-hardware-component-log.txt
@@ -0,0 +1,85 @@
+nvme-ocp-hardware-component-log(1)
+==================================
+
+NAME
+----
+nvme-ocp-hardware-component-log - retrieve hardware component log
+
+SYNOPSIS
+--------
+[verse]
+'nvme ocp hardware-component-log' <device> [--comp-id=<num> | -i <num>]
+ [--list | -l] [--verbose | -v]
+ [--output-format=<fmt> | -o <fmt>] [--timeout=<timeout>]
+
+DESCRIPTION
+-----------
+Retrieve hardware component log.
+
+The <device> parameter is mandatory NVMe character device (ex: /dev/nvme0).
+
+This will only work on OCP compliant devices supporting this feature.
+Results for any other device are undefined.
+
+On success it returns 0, error code otherwise.
+
+OPTIONS
+-------
+-i <num>::
+--comp-id=<num>::
+ component identifier
++
+[]
+|=================
+|Value|Definition
+|0x0000| Reserved
+|0x0001 \| 'asic'| Controller ASIC component
+|0x0002 \| 'nand'| NAND Component
+|0x0003 \| 'dram'| DRAM Component
+|0x0004 \| 'pmic'| PMIC Component
+|0x0005 \| 'pcb'| PCB Component
+|0x0006 \| 'cap'| capacitor component
+|0x0007 \| 'reg'| registor component
+|0x0008 \| 'case'| case component
+|0x0009 \| 'sn'| Device Serial Number
+|0x000A \| 'country'| Country of Origin
+|0x000B \| 'hw-rev'| Global Device Hardware Revision
+|0x000C-0x7FFF| Reserved
+|0x8000 \| 'vendor'| Vendor Unique Component
+|0x8001-0xFFFF| Vendor Unique Component
+|=================
+
+-l::
+--list::
+ list component descriptions
+
+-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 set-error-injection
++
+------------
+# nvme ocp hardware-component-log /dev/nvme0
+------------
+
+* Has the program issue a set-error-injection with the asic component list.
++
+------------
+# nvme ocp hardware-component-log /dev/nvme0 -i asic -l
+------------
+
+NVME
+----
+Part of the nvme-user suite.
diff --git a/Documentation/nvme-ocp-internal-log.1 b/Documentation/nvme-ocp-internal-log.1
index 0e8413a..e0bd8d9 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-INTERNAL\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-INTERNAL\" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-internal-log.html b/Documentation/nvme-ocp-internal-log.html
index 07978f8..08a0ff0 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-ocp-internal-log(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -918,7 +918,7 @@ Decode data-areas 1 and 2, and output in normal text format.
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ocp-latency-monitor-log.1 b/Documentation/nvme-ocp-latency-monitor-log.1
index 2fff4f8..7da8390 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-LATENCY\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-LATENCY\-" "1" "10/31/2024" "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 093640a..03c2436 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 67c2d44..72bfc01 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-SET\-DSSD" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-SET\-DSSD" "1" "10/31/2024" "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 abedb8f..7a2418b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 4234140..a297fe0 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "SET\-DSSD\-POWER\-ST" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "SET\-DSSD\-POWER\-ST" "1" "10/31/2024" "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 bdf704c..28c1918 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 b34834f..ed41415 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-SET\-PLP\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-SET\-PLP\" "1" "10/31/2024" "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 972f773..39ff461 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ocp-set-telemetry-profile.1 b/Documentation/nvme-ocp-set-telemetry-profile.1
index 74be435..db59df4 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-SET\-TELE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-SET\-TELE" "1" "10/31/2024" "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 866afd4..3d57fec 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ocp-smart-add-log.1 b/Documentation/nvme-ocp-smart-add-log.1
index 0de19c0..296ff1e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-SMART\-AD" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-SMART\-AD" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-ocp-smart-add-log.html b/Documentation/nvme-ocp-smart-add-log.html
index 1c53f4c..05d6663 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-ocp-smart-add-log(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -812,7 +812,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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ocp-telemetry-string-log-page.1 b/Documentation/nvme-ocp-telemetry-string-log-page.1
index 934d7d6..758534e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-TELEMETRY" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-TELEMETRY" "1" "10/31/2024" "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 2ecda61..5aa0615 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-ocp-unsupported-reqs-log.1 b/Documentation/nvme-ocp-unsupported-reqs-log.1
index 94dc062..01923a1 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-OCP\-UNSUPPORT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-OCP\-UNSUPPORT" "1" "10/31/2024" "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 2cb6a28..b65c733 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-persistent-event-log.1 b/Documentation/nvme-persistent-event-log.1
index b1966af..e9c0298 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "PERSISTENT\-EVENT\-L" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "PERSISTENT\-EVENT\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-persistent-event-log.html b/Documentation/nvme-persistent-event-log.html
index 6cf4cfb..a54207c 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 0e6d913..91fd111 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-PRED\-LAT\-EVE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-PRED\-LAT\-EVE" "1" "10/31/2024" "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 83f7c06..ececd53 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-predictable-lat-log.1 b/Documentation/nvme-predictable-lat-log.1
index 7e58674..2222c53 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-PREDICTABLE\-L" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-PREDICTABLE\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-predictable-lat-log.html b/Documentation/nvme-predictable-lat-log.html
index 9552644..6ddfbc4 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-primary-ctrl-caps.1 b/Documentation/nvme-primary-ctrl-caps.1
index 318e223..0019ce4 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-PRIMARY\-CTRL\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-PRIMARY\-CTRL\" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-primary-ctrl-caps.html b/Documentation/nvme-primary-ctrl-caps.html
index 02ccca1..e4de979 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-read.1 b/Documentation/nvme-read.1
index 5e8f900..5c18811 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-READ" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-READ" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-read.html b/Documentation/nvme-read.html
index bf19922..e1cf111 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-reset.1 b/Documentation/nvme-reset.1
index 3a5ddb7..fbb272e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-RESET" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESET" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-reset.html b/Documentation/nvme-reset.html
index 7f96396..adda80f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-resv-acquire.1 b/Documentation/nvme-resv-acquire.1
index 2864b66..61b8d2f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-RESV\-ACQUIRE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-ACQUIRE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-acquire.html b/Documentation/nvme-resv-acquire.html
index 765f0b2..f7eb726 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-resv-notif-log.1 b/Documentation/nvme-resv-notif-log.1
index 3df7cba..8d9639a 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-RESV\-NOTIF\-L" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-NOTIF\-L" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-notif-log.html b/Documentation/nvme-resv-notif-log.html
index fc6c388..ecb207f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-resv-register.1 b/Documentation/nvme-resv-register.1
index ee2e687..0725746 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-RESV\-REGISTER" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-REGISTER" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-register.html b/Documentation/nvme-resv-register.html
index d2c828e..7774ec4 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-resv-release.1 b/Documentation/nvme-resv-release.1
index 7105555..d8a0b71 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-RESV\-RELEASE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-RELEASE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-release.html b/Documentation/nvme-resv-release.html
index 2393128..b2cf746 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-resv-report.1 b/Documentation/nvme-resv-report.1
index 2c8d898..a29046d 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-RESV\-REPORT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RESV\-REPORT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-resv-report.html b/Documentation/nvme-resv-report.html
index a7c5fca..378ed6d 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-rpmb.1 b/Documentation/nvme-rpmb.1
index 71fa72a..63b32e3 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-RPMB" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-RPMB" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-rpmb.html b/Documentation/nvme-rpmb.html
index fbb54ba..8101aa2 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-sanitize-log.1 b/Documentation/nvme-sanitize-log.1
index 798a92c..955b2f2 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SANITIZE\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SANITIZE\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-sanitize-log.html b/Documentation/nvme-sanitize-log.html
index e59abae..8caa336 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-sanitize.1 b/Documentation/nvme-sanitize.1
index 1e25b23..2070cb4 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SANITIZE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SANITIZE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -36,7 +36,7 @@ nvme-sanitize \- Send NVMe Sanitize Command, return result
[\-\-owpass=<overwrite\-pass\-count> | \-n <overwrite\-pass\-count>]
[\-\-ause | \-u] [\-\-sanact=<action> | \-a <action>]
[\-\-ovrpat=<overwrite\-pattern> | \-p <overwrite\-pattern>]
- [\-\-force]
+ [\-\-emvs | \-e] [\-\-force]
[\-\-output\-format=<fmt> | \-o <fmt>] [\-\-verbose | \-v]
.fi
.SH "DESCRIPTION"
@@ -78,6 +78,7 @@ lt lt
lt lt
lt lt
lt lt
+lt lt
lt lt.
T{
Value
@@ -113,6 +114,12 @@ T{
T}:T{
Start a Crypto Erase sanitize operation
T}
+T{
+0x05 |
+\fIexit\-media\-verification\fR
+T}:T{
+Exit Media Verification State
+T}
.TE
.sp 1
.RE
@@ -122,6 +129,11 @@ T}
Overwrite Pattern: This field is ignored unless the Sanitize Action field in Command Dword 10 is set to 011b (i\&.e\&., Overwrite)\&. This field specifies a 32\-bit pattern that is used for the Overwrite sanitize operation\&.
.RE
.PP
+\-e, \-\-emvs
+.RS 4
+Enter Media Verification State: If set, then the Media Verification state shall be entered if sanitize processing completes successfully\&. If cleared, then this bit shall have no effect\&. If SANACT field does not specify starting a sanitize operation (i\&.e\&., is set to any value other than 010b, 011b, or 100b), then this bit shall be ignored by the controller\&.
+.RE
+.PP
\-\-force
.RS 4
Ignore namespace is currently busy and performed the operation even though\&.
diff --git a/Documentation/nvme-sanitize.html b/Documentation/nvme-sanitize.html
index a153bc9..64f7e23 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-sanitize(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -753,7 +753,7 @@ nvme-sanitize(1) Manual Page
[--owpass=&lt;overwrite-pass-count&gt; | -n &lt;overwrite-pass-count&gt;]
[--ause | -u] [--sanact=&lt;action&gt; | -a &lt;action&gt;]
[--ovrpat=&lt;overwrite-pattern&gt; | -p &lt;overwrite-pattern&gt;]
- [--force]
+ [--emvs | -e] [--force]
[--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;] [--verbose | -v]</pre>
<div class="attribution">
</div></div>
@@ -877,6 +877,10 @@ cellspacing="0" cellpadding="4">
<td align="left" valign="top"><p class="table">0x04 | <em>start-crypto-erase</em></p></td>
<td align="left" valign="top"><p class="table">Start a Crypto Erase sanitize operation</p></td>
</tr>
+<tr>
+<td align="left" valign="top"><p class="table">0x05 | <em>exit-media-verification</em></p></td>
+<td align="left" valign="top"><p class="table">Exit Media Verification State</p></td>
+</tr>
</tbody>
</table>
</div>
@@ -897,6 +901,22 @@ cellspacing="0" cellpadding="4">
</p>
</dd>
<dt class="hdlist1">
+-e
+</dt>
+<dt class="hdlist1">
+--emvs
+</dt>
+<dd>
+<p>
+ Enter Media Verification State:
+ If set, then the Media Verification state shall be entered if sanitize
+ processing completes successfully. If cleared, then this bit shall have
+ no effect. If SANACT field does not specify starting a sanitize operation
+ (i.e., is set to any value other than 010b, 011b, or 100b), then this bit
+ shall be ignored by the controller.
+</p>
+</dd>
+<dt class="hdlist1">
--force
</dt>
<dd>
@@ -960,7 +980,7 @@ Has the program issue Sanitize Command :
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-sanitize.txt b/Documentation/nvme-sanitize.txt
index 1e43463..182213b 100644
--- a/Documentation/nvme-sanitize.txt
+++ b/Documentation/nvme-sanitize.txt
@@ -12,7 +12,7 @@ SYNOPSIS
[--owpass=<overwrite-pass-count> | -n <overwrite-pass-count>]
[--ause | -u] [--sanact=<action> | -a <action>]
[--ovrpat=<overwrite-pattern> | -p <overwrite-pattern>]
- [--force]
+ [--emvs | -e] [--force]
[--output-format=<fmt> | -o <fmt>] [--verbose | -v]
DESCRIPTION
@@ -73,6 +73,7 @@ OPTIONS
|0x02 \| 'start-block-erase'| Start a Block Erase sanitize operation
|0x03 \| 'start-overwrite'| Start an Overwrite sanitize operation
|0x04 \| 'start-crypto-erase'| Start a Crypto Erase sanitize operation
+|0x05 \| 'exit-media-verification'| Exit Media Verification State
|=================
-p <overwrite-pattern>::
@@ -83,6 +84,15 @@ OPTIONS
specifies a 32-bit pattern that is used for the Overwrite
sanitize operation.
+-e::
+--emvs::
+ Enter Media Verification State:
+ If set, then the Media Verification state shall be entered if sanitize
+ processing completes successfully. If cleared, then this bit shall have
+ no effect. If SANACT field does not specify starting a sanitize operation
+ (i.e., is set to any value other than 010b, 011b, or 100b), then this bit
+ shall be ignored by the controller.
+
--force::
Ignore namespace is currently busy and performed the operation
even though.
diff --git a/Documentation/nvme-seagate-clear-fw-activate-history.1 b/Documentation/nvme-seagate-clear-fw-activate-history.1
index 25c516c..a48a7d8 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-CLEAR" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-CLEAR" "1" "10/31/2024" "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 14298dd..101b8d3 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 35f5af0..afd18b9 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-CLEAR" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-CLEAR" "1" "10/31/2024" "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 9235d57..fe60a6e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 544ecad..63dcf18 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-CLOUD" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-CLOUD" "1" "10/31/2024" "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 6b34ac6..78a6dd4 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-seagate-get-ctrl-tele.1 b/Documentation/nvme-seagate-get-ctrl-tele.1
index 7018210..087946a 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-GET\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-GET\-" "1" "10/31/2024" "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 fc7f6c4..6881eb0 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-seagate-get-host-tele.1 b/Documentation/nvme-seagate-get-host-tele.1
index a0f47dc..f06dd1e 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-GET\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-GET\-" "1" "10/31/2024" "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 5ed4489..fd4a677 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-seagate-help.1 b/Documentation/nvme-seagate-help.1
index 95835dc..010a03d 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-HELP" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-HELP" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-help.html b/Documentation/nvme-seagate-help.html
index af973cb..9e8072e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-seagate-plugin-version.1 b/Documentation/nvme-seagate-plugin-version.1
index ad66a4a..b6389f6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-PLUGI" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-PLUGI" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-plugin-version.html b/Documentation/nvme-seagate-plugin-version.html
index be1b530..d312489 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-seagate-version.1 b/Documentation/nvme-seagate-version.1
index 5398476..ce9cc90 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-VERSI" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VERSI" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-seagate-version.html b/Documentation/nvme-seagate-version.html
index af0be7d..8784599 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 8770fc2..17b79be 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-VS\-F" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-F" "1" "10/31/2024" "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 1b1eefc..943a8a4 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-seagate-vs-internal-log.1 b/Documentation/nvme-seagate-vs-internal-log.1
index 74dd1d8..d65fb80 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-VS\-I" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-I" "1" "10/31/2024" "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 c5109d6..d21652b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 33e52fc..f3a9137 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-VS\-L" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-L" "1" "10/31/2024" "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 2deed2f..511c06c 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-seagate-vs-pcie-stats.1 b/Documentation/nvme-seagate-vs-pcie-stats.1
index 17aca8f..e189aa6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-VS\-P" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-P" "1" "10/31/2024" "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 a4cef95..72a744e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 97c2bfd..4347f7f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-VS\-S" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-S" "1" "10/31/2024" "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 5e0a3eb..bf3fea6 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-seagate-vs-temperature-stats.1 b/Documentation/nvme-seagate-vs-temperature-stats.1
index 90c37e0..16822b7 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SEAGATE\-VS\-T" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SEAGATE\-VS\-T" "1" "10/31/2024" "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 8d317ba..a40a93c 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-security-recv.1 b/Documentation/nvme-security-recv.1
index d43aa4f..cb3d5fa 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SECURITY\-RECV" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SECURITY\-RECV" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-security-recv.html b/Documentation/nvme-security-recv.html
index 361dd4c..a79ba03 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-security-send.1 b/Documentation/nvme-security-send.1
index 4179c31..c1477a1 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SECURITY\-SEND" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SECURITY\-SEND" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-security-send.html b/Documentation/nvme-security-send.html
index 9c66682..3133a47 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-self-test-log.1 b/Documentation/nvme-self-test-log.1
index 907d481..1c1f6b6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SELF\-TEST\-LO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SELF\-TEST\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-self-test-log.html b/Documentation/nvme-self-test-log.html
index f1a5ca5..11ea9cb 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-set-feature.1 b/Documentation/nvme-set-feature.1
index 5e48ff4..b4169ac 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SET\-FEATURE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SET\-FEATURE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-set-feature.html b/Documentation/nvme-set-feature.html
index c568aa7..51bf469 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-set-property.1 b/Documentation/nvme-set-property.1
index 8b97dfb..59342d6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SET\-PROPERTY" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SET\-PROPERTY" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-set-property.html b/Documentation/nvme-set-property.html
index a0e560d..8752e9f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-show-hostnqn.1 b/Documentation/nvme-show-hostnqn.1
index 15745bc..ddfac92 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SHOW\-HOSTNQN" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SHOW\-HOSTNQN" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-show-hostnqn.html b/Documentation/nvme-show-hostnqn.html
index ce830d5..d8cc99c 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-show-regs.1 b/Documentation/nvme-show-regs.1
index c100298..8a5a968 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-show-regs.html b/Documentation/nvme-show-regs.html
index 043d8b0..533a092 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-show-topology.1 b/Documentation/nvme-show-topology.1
index 8aca6d6..58270f4 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SHOW\-TOPOLOGY" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SHOW\-TOPOLOGY" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-show-topology.html b/Documentation/nvme-show-topology.html
index 03fafe7..3456383 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-smart-log.1 b/Documentation/nvme-smart-log.1
index 4132d07..61af9a4 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SMART\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SMART\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-smart-log.html b/Documentation/nvme-smart-log.html
index 5130994..6bfe471 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-solidigm-clear-fw-activate-history.1 b/Documentation/nvme-solidigm-clear-fw-activate-history.1
new file mode 100644
index 0000000..a292844
--- /dev/null
+++ b/Documentation/nvme-solidigm-clear-fw-activate-history.1
@@ -0,0 +1,96 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-CLEA" "1" "10/31/2024" "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-solidigm-clear-fw-activate-history \- Clear firmware update history log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm clear\-fw\-activate\-history\fR <device> [\-\-no\-uuid | \-n]
+.fi
+.SH "DESCRIPTION"
+.sp
+This command is a redirect to the OCP plugin\(cqs clear firmware update history log command\&. For detailed usage and options, please refer to the documentation for \fInvme ocp clear\-fw\-activate\-history\fR\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-n, \-\-no\-uuid
+.RS 4
+Do not try to automatically detect UUID index for this command (required for old OCP 1\&.0 support)
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Clear the firmware update history log for the device:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm clear\-fw\-activate\-history /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Clear the firmware update history log for an OCP 1\&.0 device:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm clear\-fw\-activate\-history /dev/nvme0 \-\-no\-uuid
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "SEE ALSO"
+.sp
+nvme\-ocp\-clear\-fw\-activate\-history(1)
+.SH "NVME"
+.sp
+Part of the nvme\-cli suite\&.
diff --git a/Documentation/nvme-solidigm-clear-fw-activate-history.html b/Documentation/nvme-solidigm-clear-fw-activate-history.html
new file mode 100644
index 0000000..7bb70ad
--- /dev/null
+++ b/Documentation/nvme-solidigm-clear-fw-activate-history.html
@@ -0,0 +1,831 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-clear-fw-activate-history(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-clear-fw-activate-history(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-clear-fw-activate-history -
+ Clear firmware update history log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm clear-fw-activate-history</em> &lt;device&gt; [--no-uuid | -n]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>This command is a redirect to the OCP plugin&#8217;s clear firmware update history log command.
+For detailed usage and options, please refer to the documentation for <em>nvme ocp clear-fw-activate-history</em>.</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 block device (ex: /dev/nvme0n1).</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n
+</dt>
+<dt class="hdlist1">
+--no-uuid
+</dt>
+<dd>
+<p>
+ Do not try to automatically detect UUID index for this command (required
+ for old OCP 1.0 support)
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Clear the firmware update history log for the device:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm clear-fw-activate-history /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Clear the firmware update history log for an OCP 1.0 device:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm clear-fw-activate-history /dev/nvme0 --no-uuid</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_see_also">SEE ALSO</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>nvme-ocp-clear-fw-activate-history(1)</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-cli suite.</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-clear-fw-activate-history.txt b/Documentation/nvme-solidigm-clear-fw-activate-history.txt
new file mode 100644
index 0000000..ac74728
--- /dev/null
+++ b/Documentation/nvme-solidigm-clear-fw-activate-history.txt
@@ -0,0 +1,48 @@
+nvme-solidigm-clear-fw-activate-history(1)
+==========================================
+
+NAME
+----
+nvme-solidigm-clear-fw-activate-history - Clear firmware update history log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm clear-fw-activate-history' <device> [--no-uuid | -n]
+
+DESCRIPTION
+-----------
+This command is a redirect to the OCP plugin's clear firmware update history log command.
+For detailed usage and options, please refer to the documentation for 'nvme ocp clear-fw-activate-history'.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-n::
+--no-uuid::
+ Do not try to automatically detect UUID index for this command (required
+ for old OCP 1.0 support)
+
+EXAMPLES
+--------
+* Clear the firmware update history log for the device:
++
+------------
+# nvme solidigm clear-fw-activate-history /dev/nvme0
+------------
+
+* Clear the firmware update history log for an OCP 1.0 device:
++
+------------
+# nvme solidigm clear-fw-activate-history /dev/nvme0 --no-uuid
+------------
+
+SEE ALSO
+--------
+nvme-ocp-clear-fw-activate-history(1)
+
+NVME
+----
+Part of the nvme-cli suite.
diff --git a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1 b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1
new file mode 100644
index 0000000..8095476
--- /dev/null
+++ b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.1
@@ -0,0 +1,96 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-CLEA" "1" "10/31/2024" "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-solidigm-clear-pcie-correctable-errors \- Clear PCIe Correctable Error Counters
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm clear\-pcie\-correctable\-errors\fR <device> [\-\-no\-uuid | \-n]
+.fi
+.SH "DESCRIPTION"
+.sp
+This command is a redirect to the OCP plugin\(cqs clear PCIe correctable error counters command\&. For detailed usage and options, please refer to the documentation for \fInvme ocp clear\-pcie\-correctable\-error\-counters\fR\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-n, \-\-no\-uuid
+.RS 4
+Do not try to automatically detect UUID index for this command (required for old OCP 1\&.0 support)\&. This option is necessary for devices that do not support OCP 2\&.0 or NVMe 1\&.4\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Clear PCIe Correctable Error Counters for the device:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm clear\-pcie\-correctable\-errors /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Clear PCIe Correctable Error Counters for an OCP 1\&.0 device:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm clear\-pcie\-correctable\-errors /dev/nvme0 \-\-no\-uuid
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "SEE ALSO"
+.sp
+nvme\-ocp\-clear\-pcie\-correctable\-error\-counters(1)
+.SH "NVME"
+.sp
+Part of the nvme\-cli suite\&.
diff --git a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html
new file mode 100644
index 0000000..8c30f7e
--- /dev/null
+++ b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.html
@@ -0,0 +1,832 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-clear-pcie-correctable-errors(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-clear-pcie-correctable-errors(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-clear-pcie-correctable-errors -
+ Clear PCIe Correctable Error Counters
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm clear-pcie-correctable-errors</em> &lt;device&gt; [--no-uuid | -n]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>This command is a redirect to the OCP plugin&#8217;s clear PCIe correctable error counters command.
+For detailed usage and options, please refer to the documentation for <em>nvme ocp clear-pcie-correctable-error-counters</em>.</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 block device (ex: /dev/nvme0n1).</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n
+</dt>
+<dt class="hdlist1">
+--no-uuid
+</dt>
+<dd>
+<p>
+ Do not try to automatically detect UUID index for this command (required
+ for old OCP 1.0 support). This option is necessary for devices that do not
+ support OCP 2.0 or NVMe 1.4.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Clear PCIe Correctable Error Counters for the device:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm clear-pcie-correctable-errors /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Clear PCIe Correctable Error Counters for an OCP 1.0 device:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm clear-pcie-correctable-errors /dev/nvme0 --no-uuid</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_see_also">SEE ALSO</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>nvme-ocp-clear-pcie-correctable-error-counters(1)</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-cli suite.</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-clear-pcie-correctable-errors.txt b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.txt
new file mode 100644
index 0000000..3f5883d
--- /dev/null
+++ b/Documentation/nvme-solidigm-clear-pcie-correctable-errors.txt
@@ -0,0 +1,49 @@
+nvme-solidigm-clear-pcie-correctable-errors(1)
+==============================================
+
+NAME
+----
+nvme-solidigm-clear-pcie-correctable-errors - Clear PCIe Correctable Error Counters
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm clear-pcie-correctable-errors' <device> [--no-uuid | -n]
+
+DESCRIPTION
+-----------
+This command is a redirect to the OCP plugin's clear PCIe correctable error counters command.
+For detailed usage and options, please refer to the documentation for 'nvme ocp clear-pcie-correctable-error-counters'.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0) or block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-n::
+--no-uuid::
+ Do not try to automatically detect UUID index for this command (required
+ for old OCP 1.0 support). This option is necessary for devices that do not
+ support OCP 2.0 or NVMe 1.4.
+
+EXAMPLES
+--------
+* Clear PCIe Correctable Error Counters for the device:
++
+------------
+# nvme solidigm clear-pcie-correctable-errors /dev/nvme0
+------------
+
+* Clear PCIe Correctable Error Counters for an OCP 1.0 device:
++
+------------
+# nvme solidigm clear-pcie-correctable-errors /dev/nvme0 --no-uuid
+------------
+
+SEE ALSO
+--------
+nvme-ocp-clear-pcie-correctable-error-counters(1)
+
+NVME
+----
+Part of the nvme-cli suite.
diff --git a/Documentation/nvme-solidigm-cloud-SSDplugin-version.1 b/Documentation/nvme-solidigm-cloud-SSDplugin-version.1
new file mode 100644
index 0000000..2c4ee66
--- /dev/null
+++ b/Documentation/nvme-solidigm-cloud-SSDplugin-version.1
@@ -0,0 +1,64 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-CLOU" "1" "10/31/2024" "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-solidigm-cloud-SSDplugin-version \- Prints plug\-in OCP version
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm cloud\-SSDplugin\-version\fR
+.fi
+.SH "DESCRIPTION"
+.sp
+Displays the OCP (Open Compute Project) version of the Solidigm cloud SSD plugin\&.
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Display the OCP plugin version:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm cloud\-SSDplugin\-version
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-cloud-SSDplugin-version.html b/Documentation/nvme-solidigm-cloud-SSDplugin-version.html
new file mode 100644
index 0000000..eef281a
--- /dev/null
+++ b/Documentation/nvme-solidigm-cloud-SSDplugin-version.html
@@ -0,0 +1,794 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-cloud-SSDplugin-version(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-cloud-SSDplugin-version(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-cloud-SSDplugin-version -
+ Prints plug-in OCP version
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm cloud-SSDplugin-version</em></pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Displays the OCP (Open Compute Project) version of the Solidigm cloud SSD plugin.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Display the OCP plugin version:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm cloud-SSDplugin-version</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-cloud-SSDplugin-version.txt b/Documentation/nvme-solidigm-cloud-SSDplugin-version.txt
new file mode 100644
index 0000000..5d17e47
--- /dev/null
+++ b/Documentation/nvme-solidigm-cloud-SSDplugin-version.txt
@@ -0,0 +1,29 @@
+nvme-solidigm-cloud-SSDplugin-version(1)
+========================================
+
+NAME
+----
+nvme-solidigm-cloud-SSDplugin-version - Prints plug-in OCP version
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm cloud-SSDplugin-version'
+
+DESCRIPTION
+-----------
+Displays the OCP (Open Compute Project) version of the Solidigm cloud SSD plugin.
+
+EXAMPLES
+--------
+* Display the OCP plugin version:
++
+------------
+# nvme solidigm cloud-SSDplugin-version
+------------
+
+NVME
+----
+Part of the nvme-user suite
+
+
diff --git a/Documentation/nvme-solidigm-garbage-collect-log.1 b/Documentation/nvme-solidigm-garbage-collect-log.1
new file mode 100644
index 0000000..637bf96
--- /dev/null
+++ b/Documentation/nvme-solidigm-garbage-collect-log.1
@@ -0,0 +1,96 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-GARB" "1" "10/31/2024" "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-solidigm-garbage-collect-log \- Retrieve Garbage Collection Log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm garbage\-collect\-log\fR <device> [\-\-output\-format=<fmt> | \-o <fmt>]
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves and displays the Solidigm vendor\-specific garbage collection log for the given NVMe device\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-o <fmt>, \-\-output\-format=<fmt>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve and display the garbage collection log:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm garbage\-collect\-log /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the garbage collection log in JSON format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm garbage\-collect\-log /dev/nvme0 \-o json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-garbage-collect-log.html b/Documentation/nvme-solidigm-garbage-collect-log.html
new file mode 100644
index 0000000..7c2ae05
--- /dev/null
+++ b/Documentation/nvme-solidigm-garbage-collect-log.html
@@ -0,0 +1,825 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-garbage-collect-log(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-garbage-collect-log(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-garbage-collect-log -
+ Retrieve Garbage Collection Log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm garbage-collect-log</em> &lt;device&gt; [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves and displays the Solidigm vendor-specific garbage collection log
+for the given NVMe device.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-o &lt;fmt&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;fmt&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Retrieve and display the garbage collection log:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm garbage-collect-log /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve the garbage collection log in JSON format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm garbage-collect-log /dev/nvme0 -o json</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-garbage-collect-log.txt b/Documentation/nvme-solidigm-garbage-collect-log.txt
new file mode 100644
index 0000000..77e1be3
--- /dev/null
+++ b/Documentation/nvme-solidigm-garbage-collect-log.txt
@@ -0,0 +1,44 @@
+nvme-solidigm-garbage-collect-log(1)
+====================================
+
+NAME
+----
+nvme-solidigm-garbage-collect-log - Retrieve Garbage Collection Log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm garbage-collect-log' <device> [--output-format=<fmt> | -o <fmt>]
+
+DESCRIPTION
+-----------
+Retrieves and displays the Solidigm vendor-specific garbage collection log
+for the given NVMe device.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-o <fmt>::
+--output-format=<fmt>::
+ Set the reporting format to 'normal', 'json', or 'binary'. Only one
+ output format can be used at a time.
+
+EXAMPLES
+--------
+* Retrieve and display the garbage collection log:
++
+------------
+# nvme solidigm garbage-collect-log /dev/nvme0
+------------
+
+* Retrieve the garbage collection log in JSON format:
++
+------------
+# nvme solidigm garbage-collect-log /dev/nvme0 -o json
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-id-ctrl.1 b/Documentation/nvme-solidigm-id-ctrl.1
new file mode 100644
index 0000000..f5e9092
--- /dev/null
+++ b/Documentation/nvme-solidigm-id-ctrl.1
@@ -0,0 +1,161 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-ID\-" "1" "10/31/2024" "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-solidigm-id-ctrl \- Send NVMe Identify Controller, return result and structure
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm id\-ctrl\fR <device> [\-\-raw\-binary | \-b] [\-\-vendor\-specific | \-V]
+ [\-\-output\-format=<fmt> | \-o <fmt>] [\-\-human\-readable | \-H]
+ [\-\-verbose | \-v] [\-\-timeout=<seconds> | \-t <seconds>]
+.fi
+.SH "DESCRIPTION"
+.sp
+This command is a Solidigm\-specific extension of the NVMe Identify Controller command\&. It sends an NVMe Identify Controller command to the specified device and provides the result and returned structure\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0) or a namespace block device (ex: /dev/nvme0n1)\&.
+.sp
+This command includes all options available in the generic nvme id\-ctrl command, including: \- \-\-raw\-binary or \-b \- \-\-vendor\-specific or \-V \- \-\-output\-format=<fmt> or \-o <fmt> \- \-\-human\-readable or \-H \- \-\-verbose or \-v \- \-\-timeout=<seconds> or \-t <seconds>
+.sp
+For detailed usage and options, please refer to the documentation for \fInvme id\-ctrl\fR\&.
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Send the Identify Controller command and interpret the output:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm id\-ctrl /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Print the raw output to stdout:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm id\-ctrl /dev/nvme0 \-\-raw\-binary
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Print the output in JSON format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm id\-ctrl /dev/nvme0 \-o json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Display the vendor\-specific fields:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm id\-ctrl /dev/nvme0 \-\-vendor\-specific
+# nvme solidigm id\-ctrl /dev/nvme0 \-V
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Use human\-readable output:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm id\-ctrl /dev/nvme0 \-\-human\-readable
+# nvme solidigm id\-ctrl /dev/nvme0 \-H
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "SEE ALSO"
+.sp
+nvme\-id\-ctrl(1)
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-id-ctrl.html b/Documentation/nvme-solidigm-id-ctrl.html
new file mode 100644
index 0000000..b6e657f
--- /dev/null
+++ b/Documentation/nvme-solidigm-id-ctrl.html
@@ -0,0 +1,852 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-id-ctrl(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-id-ctrl(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-id-ctrl -
+ Send NVMe Identify Controller, return result and structure
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm id-ctrl</em> &lt;device&gt; [--raw-binary | -b] [--vendor-specific | -V]
+ [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;] [--human-readable | -H]
+ [--verbose | -v] [--timeout=&lt;seconds&gt; | -t &lt;seconds&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>This command is a Solidigm-specific extension of the NVMe Identify Controller command.
+It sends an NVMe Identify Controller command to the specified device and provides the result
+and returned structure.</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>This command includes all options available in the generic <code>nvme id-ctrl</code> command, including:
+- <code>--raw-binary</code> or <code>-b</code>
+- <code>--vendor-specific</code> or <code>-V</code>
+- <code>--output-format=&lt;fmt&gt;</code> or <code>-o &lt;fmt&gt;</code>
+- <code>--human-readable</code> or <code>-H</code>
+- <code>--verbose</code> or <code>-v</code>
+- <code>--timeout=&lt;seconds&gt;</code> or <code>-t &lt;seconds&gt;</code></p></div>
+<div class="paragraph"><p>For detailed usage and options, please refer to the documentation for <em>nvme id-ctrl</em>.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Send the Identify Controller command and interpret the output:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm id-ctrl /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Print the raw output to stdout:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm id-ctrl /dev/nvme0 --raw-binary</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Print the output in JSON format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm id-ctrl /dev/nvme0 -o json</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Display the vendor-specific fields:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm id-ctrl /dev/nvme0 --vendor-specific
+# nvme solidigm id-ctrl /dev/nvme0 -V</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Use human-readable output:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm id-ctrl /dev/nvme0 --human-readable
+# nvme solidigm id-ctrl /dev/nvme0 -H</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_see_also">SEE ALSO</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>nvme-id-ctrl(1)</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-id-ctrl.txt b/Documentation/nvme-solidigm-id-ctrl.txt
new file mode 100644
index 0000000..7ac67e3
--- /dev/null
+++ b/Documentation/nvme-solidigm-id-ctrl.txt
@@ -0,0 +1,74 @@
+nvme-solidigm-id-ctrl(1)
+========================
+
+NAME
+----
+nvme-solidigm-id-ctrl - Send NVMe Identify Controller, return result and structure
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm id-ctrl' <device> [--raw-binary | -b] [--vendor-specific | -V]
+ [--output-format=<fmt> | -o <fmt>] [--human-readable | -H]
+ [--verbose | -v] [--timeout=<seconds> | -t <seconds>]
+
+DESCRIPTION
+-----------
+This command is a Solidigm-specific extension of the NVMe Identify Controller command.
+It sends an NVMe Identify Controller command to the specified device and provides the result
+and returned structure.
+
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0)
+or a namespace block device (ex: /dev/nvme0n1).
+
+This command includes all options available in the generic `nvme id-ctrl` command, including:
+- `--raw-binary` or `-b`
+- `--vendor-specific` or `-V`
+- `--output-format=<fmt>` or `-o <fmt>`
+- `--human-readable` or `-H`
+- `--verbose` or `-v`
+- `--timeout=<seconds>` or `-t <seconds>`
+
+For detailed usage and options, please refer to the documentation for 'nvme id-ctrl'.
+
+EXAMPLES
+--------
+* Send the Identify Controller command and interpret the output:
++
+------------
+# nvme solidigm id-ctrl /dev/nvme0
+------------
+
+* Print the raw output to stdout:
++
+------------
+# nvme solidigm id-ctrl /dev/nvme0 --raw-binary
+------------
+
+* Print the output in JSON format:
++
+------------
+# nvme solidigm id-ctrl /dev/nvme0 -o json
+------------
+
+* Display the vendor-specific fields:
++
+------------
+# nvme solidigm id-ctrl /dev/nvme0 --vendor-specific
+# nvme solidigm id-ctrl /dev/nvme0 -V
+------------
+
+* Use human-readable output:
++
+------------
+# nvme solidigm id-ctrl /dev/nvme0 --human-readable
+# nvme solidigm id-ctrl /dev/nvme0 -H
+------------
+
+SEE ALSO
+--------
+nvme-id-ctrl(1)
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-latency-tracking-log.1 b/Documentation/nvme-solidigm-latency-tracking-log.1
new file mode 100644
index 0000000..438583b
--- /dev/null
+++ b/Documentation/nvme-solidigm-latency-tracking-log.1
@@ -0,0 +1,166 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-LATE" "1" "10/31/2024" "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-solidigm-latency-tracking-log \- Enable/Retrieve Latency tracking Log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm latency\-tracking\-log\fR <device> [\-\-enable | \-e] [\-\-disable | \-d]
+ [\-\-read | \-r] [\-\-write | \-w]
+ [\-\-type <value> | \-t <value>]
+ [\-\-output\-format=<fmt> | \-o <fmt>]
+.fi
+.SH "DESCRIPTION"
+.sp
+Enables, disables, or retrieves the Solidigm latency tracking log for the given NVMe device\&. This log provides detailed information about I/O latencies\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-e, \-\-enable
+.RS 4
+Enable latency tracking before retrieving the log\&.
+.RE
+.PP
+\-d, \-\-disable
+.RS 4
+Disable latency tracking after retrieving the log\&.
+.RE
+.PP
+\-r, \-\-read
+.RS 4
+Retrieve read latency statistics (default if neither \-\-read nor \-\-write is specified)\&.
+.RE
+.PP
+\-w, \-\-write
+.RS 4
+Retrieve write latency statistics\&.
+.RE
+.PP
+\-t <value>, \-\-type <value>
+.RS 4
+Specify the log type to retrieve\&. Valid values depend on the device\(cqs capabilities\&.
+.RE
+.PP
+\-o <fmt>, \-\-output\-format=<fmt>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Enable latency tracking and retrieve the read latency log:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm latency\-tracking\-log /dev/nvme0 \-\-enable \-\-read
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the write latency log in JSON format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm latency\-tracking\-log /dev/nvme0 \-\-write \-o json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Disable latency tracking after retrieving the log:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm latency\-tracking\-log /dev/nvme0 \-\-disable
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Specify a log type when retrieving latency statistics:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm latency\-tracking\-log /dev/nvme0 \-\-type 1 \-\-read
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-latency-tracking-log.html b/Documentation/nvme-solidigm-latency-tracking-log.html
new file mode 100644
index 0000000..af52bed
--- /dev/null
+++ b/Documentation/nvme-solidigm-latency-tracking-log.html
@@ -0,0 +1,901 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-latency-tracking-log(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-latency-tracking-log(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-latency-tracking-log -
+ Enable/Retrieve Latency tracking Log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm latency-tracking-log</em> &lt;device&gt; [--enable | -e] [--disable | -d]
+ [--read | -r] [--write | -w]
+ [--type &lt;value&gt; | -t &lt;value&gt;]
+ [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Enables, disables, or retrieves the Solidigm latency tracking log for the
+given NVMe device. This log provides detailed information about I/O latencies.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-e
+</dt>
+<dt class="hdlist1">
+--enable
+</dt>
+<dd>
+<p>
+ Enable latency tracking before retrieving the log.
+</p>
+</dd>
+<dt class="hdlist1">
+-d
+</dt>
+<dt class="hdlist1">
+--disable
+</dt>
+<dd>
+<p>
+ Disable latency tracking after retrieving the log.
+</p>
+</dd>
+<dt class="hdlist1">
+-r
+</dt>
+<dt class="hdlist1">
+--read
+</dt>
+<dd>
+<p>
+ Retrieve read latency statistics (default if neither --read nor --write is specified).
+</p>
+</dd>
+<dt class="hdlist1">
+-w
+</dt>
+<dt class="hdlist1">
+--write
+</dt>
+<dd>
+<p>
+ Retrieve write latency statistics.
+</p>
+</dd>
+<dt class="hdlist1">
+-t &lt;value&gt;
+</dt>
+<dt class="hdlist1">
+--type &lt;value&gt;
+</dt>
+<dd>
+<p>
+ Specify the log type to retrieve. Valid values depend on the device&#8217;s capabilities.
+</p>
+</dd>
+<dt class="hdlist1">
+-o &lt;fmt&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;fmt&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Enable latency tracking and retrieve the read latency log:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm latency-tracking-log /dev/nvme0 --enable --read</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve the write latency log in JSON format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm latency-tracking-log /dev/nvme0 --write -o json</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Disable latency tracking after retrieving the log:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm latency-tracking-log /dev/nvme0 --disable</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Specify a log type when retrieving latency statistics:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm latency-tracking-log /dev/nvme0 --type 1 --read</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-latency-tracking-log.txt b/Documentation/nvme-solidigm-latency-tracking-log.txt
new file mode 100644
index 0000000..91940dc
--- /dev/null
+++ b/Documentation/nvme-solidigm-latency-tracking-log.txt
@@ -0,0 +1,79 @@
+nvme-solidigm-latency-tracking-log(1)
+=====================================
+
+NAME
+----
+nvme-solidigm-latency-tracking-log - Enable/Retrieve Latency tracking Log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm latency-tracking-log' <device> [--enable | -e] [--disable | -d]
+ [--read | -r] [--write | -w]
+ [--type <value> | -t <value>]
+ [--output-format=<fmt> | -o <fmt>]
+
+DESCRIPTION
+-----------
+Enables, disables, or retrieves the Solidigm latency tracking log for the
+given NVMe device. This log provides detailed information about I/O latencies.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-e::
+--enable::
+ Enable latency tracking before retrieving the log.
+
+-d::
+--disable::
+ Disable latency tracking after retrieving the log.
+
+-r::
+--read::
+ Retrieve read latency statistics (default if neither --read nor --write is specified).
+
+-w::
+--write::
+ Retrieve write latency statistics.
+
+-t <value>::
+--type <value>::
+ Specify the log type to retrieve. Valid values depend on the device's capabilities.
+
+-o <fmt>::
+--output-format=<fmt>::
+ Set the reporting format to 'normal', 'json', or 'binary'. Only one
+ output format can be used at a time.
+
+EXAMPLES
+--------
+* Enable latency tracking and retrieve the read latency log:
++
+------------
+# nvme solidigm latency-tracking-log /dev/nvme0 --enable --read
+------------
+
+* Retrieve the write latency log in JSON format:
++
+------------
+# nvme solidigm latency-tracking-log /dev/nvme0 --write -o json
+------------
+
+* Disable latency tracking after retrieving the log:
++
+------------
+# nvme solidigm latency-tracking-log /dev/nvme0 --disable
+------------
+
+* Specify a log type when retrieving latency statistics:
++
+------------
+# nvme solidigm latency-tracking-log /dev/nvme0 --type 1 --read
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-log-page-directory.1 b/Documentation/nvme-solidigm-log-page-directory.1
new file mode 100644
index 0000000..9ae03b4
--- /dev/null
+++ b/Documentation/nvme-solidigm-log-page-directory.1
@@ -0,0 +1,96 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-LOG\" "1" "10/31/2024" "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-solidigm-log-page-directory \- Retrieve log page directory
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm log\-page\-directory\fR <device> [\-\-output\-format=<fmt> | \-o <fmt>]
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves and displays the log page directory for the given Solidigm NVMe device\&. This command provides information about the available log pages and their characteristics\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-o <fmt>, \-\-output\-format=<fmt>
+.RS 4
+Set the reporting format to
+\fInormal\fR
+or
+\fIjson\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve and display the log page directory:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm log\-page\-directory /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the log page directory in JSON format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm log\-page\-directory /dev/nvme0 \-o json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-log-page-directory.html b/Documentation/nvme-solidigm-log-page-directory.html
new file mode 100644
index 0000000..e6e7b18
--- /dev/null
+++ b/Documentation/nvme-solidigm-log-page-directory.html
@@ -0,0 +1,825 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-log-page-directory(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-log-page-directory(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-log-page-directory -
+ Retrieve log page directory
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm log-page-directory</em> &lt;device&gt; [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves and displays the log page directory for the given Solidigm NVMe device.
+This command provides information about the available log pages and their
+characteristics.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-o &lt;fmt&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;fmt&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em> or <em>json</em>. Only one output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Retrieve and display the log page directory:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm log-page-directory /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve the log page directory in JSON format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm log-page-directory /dev/nvme0 -o json</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-log-page-directory.txt b/Documentation/nvme-solidigm-log-page-directory.txt
new file mode 100644
index 0000000..8a8b175
--- /dev/null
+++ b/Documentation/nvme-solidigm-log-page-directory.txt
@@ -0,0 +1,44 @@
+nvme-solidigm-log-page-directory(1)
+===================================
+
+NAME
+----
+nvme-solidigm-log-page-directory - Retrieve log page directory
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm log-page-directory' <device> [--output-format=<fmt> | -o <fmt>]
+
+DESCRIPTION
+-----------
+Retrieves and displays the log page directory for the given Solidigm NVMe device.
+This command provides information about the available log pages and their
+characteristics.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-o <fmt>::
+--output-format=<fmt>::
+ Set the reporting format to 'normal' or 'json'. Only one output format can be used at a time.
+
+EXAMPLES
+--------
+* Retrieve and display the log page directory:
++
+------------
+# nvme solidigm log-page-directory /dev/nvme0
+------------
+
+* Retrieve the log page directory in JSON format:
++
+------------
+# nvme solidigm log-page-directory /dev/nvme0 -o json
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-market-log.1 b/Documentation/nvme-solidigm-market-log.1
new file mode 100644
index 0000000..9a70b25
--- /dev/null
+++ b/Documentation/nvme-solidigm-market-log.1
@@ -0,0 +1,93 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-MARK" "1" "10/31/2024" "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-solidigm-market-log \- Retrieve Market Log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm market\-log\fR <device> [\-\-raw\-binary | \-b]
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves and displays the Solidigm Marketing Name log for the given NVMe device\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-b, \-\-raw\-binary
+.RS 4
+Output the raw log data in binary format\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve and display the marketing name log:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm market\-log /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the raw binary data of the marketing name log:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm market\-log /dev/nvme0 \-\-raw\-binary
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-market-log.html b/Documentation/nvme-solidigm-market-log.html
new file mode 100644
index 0000000..d9d315e
--- /dev/null
+++ b/Documentation/nvme-solidigm-market-log.html
@@ -0,0 +1,823 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-market-log(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-market-log(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-market-log -
+ Retrieve Market Log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm market-log</em> &lt;device&gt; [--raw-binary | -b]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves and displays the Solidigm Marketing Name log for the given NVMe device.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Output the raw log data in binary format.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Retrieve and display the marketing name log:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm market-log /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve the raw binary data of the marketing name log:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm market-log /dev/nvme0 --raw-binary</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-market-log.txt b/Documentation/nvme-solidigm-market-log.txt
new file mode 100644
index 0000000..1b5e268
--- /dev/null
+++ b/Documentation/nvme-solidigm-market-log.txt
@@ -0,0 +1,42 @@
+nvme-solidigm-market-log(1)
+===========================
+
+NAME
+----
+nvme-solidigm-market-log - Retrieve Market Log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm market-log' <device> [--raw-binary | -b]
+
+DESCRIPTION
+-----------
+Retrieves and displays the Solidigm Marketing Name log for the given NVMe device.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-b::
+--raw-binary::
+ Output the raw log data in binary format.
+
+EXAMPLES
+--------
+* Retrieve and display the marketing name log:
++
+------------
+# nvme solidigm market-log /dev/nvme0
+------------
+
+* Retrieve the raw binary data of the marketing name log:
++
+------------
+# nvme solidigm market-log /dev/nvme0 --raw-binary
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-parse-telemetry-log.1 b/Documentation/nvme-solidigm-parse-telemetry-log.1
new file mode 100644
index 0000000..9764fdf
--- /dev/null
+++ b/Documentation/nvme-solidigm-parse-telemetry-log.1
@@ -0,0 +1,183 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-PARS" "1" "10/31/2024" "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-solidigm-parse-telemetry-log \- Parse and display Solidigm Telemetry log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm parse\-telemetry\-log\fR <device> [OPTIONS]
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves, parses, and displays the Telemetry log for the given Solidigm NVMe device\&. This command provides detailed information about the device\(cqs telemetry data, which can be useful for diagnostics and performance analysis\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-g <num>, \-\-host\-generate=<num>
+.RS 4
+Controls when to generate a new host\-initiated report\&. Default value
+\fI1\fR
+generates a new host\-initiated report, value
+\fI0\fR
+causes retrieval of an existing log\&. Valid values are 0 and 1\&.
+.RE
+.PP
+\-c, \-\-controller\-init
+.RS 4
+Gather report generated by the controller\&.
+.RE
+.PP
+\-d <num>, \-\-data\-area=<num>
+.RS 4
+Pick which telemetry data area to report\&. Default is 3 to fetch areas 1\-3\&. Valid options are 1, 2, 3, 4\&.
+.RE
+.PP
+\-j <file>, \-\-config\-file=<file>
+.RS 4
+Specify a JSON configuration file for custom parsing of the telemetry log\&.
+.RE
+.PP
+\-s, \-\-source\-file
+.RS 4
+Indicates that the <device> argument is a binary file containing a log dump instead of a block or character device\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve and parse the telemetry log with default options:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm parse\-telemetry\-log /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve an existing telemetry log without generating a new one:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm parse\-telemetry\-log /dev/nvme0 \-g 0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Parse a specific data area of the telemetry log:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm parse\-telemetry\-log /dev/nvme0 \-d 2
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Use a custom configuration file for parsing:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm parse\-telemetry\-log /dev/nvme0 \-j config\&.json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Parse a telemetry log from a binary file:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm parse\-telemetry\-log telemetry_dump\&.bin \-s
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "OUTPUT"
+.sp
+The command outputs the parsed telemetry log in JSON format to stdout\&.
+.SH "NVME"
+.sp
+Part of the nvme\-cli suite
diff --git a/Documentation/nvme-solidigm-parse-telemetry-log.html b/Documentation/nvme-solidigm-parse-telemetry-log.html
new file mode 100644
index 0000000..d33d709
--- /dev/null
+++ b/Documentation/nvme-solidigm-parse-telemetry-log.html
@@ -0,0 +1,906 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-parse-telemetry-log(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-parse-telemetry-log(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-parse-telemetry-log -
+ Parse and display Solidigm Telemetry log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm parse-telemetry-log</em> &lt;device&gt; [OPTIONS]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves, parses, and displays the Telemetry log for the given Solidigm NVMe device.
+This command provides detailed information about the device&#8217;s telemetry data, which
+can be useful for diagnostics and performance analysis.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-g &lt;num&gt;
+</dt>
+<dt class="hdlist1">
+--host-generate=&lt;num&gt;
+</dt>
+<dd>
+<p>
+ Controls when to generate a new host-initiated report. Default value <em>1</em> generates
+ a new host-initiated report, value <em>0</em> causes retrieval of an existing log.
+ Valid values are 0 and 1.
+</p>
+</dd>
+<dt class="hdlist1">
+-c
+</dt>
+<dt class="hdlist1">
+--controller-init
+</dt>
+<dd>
+<p>
+ Gather report generated by the controller.
+</p>
+</dd>
+<dt class="hdlist1">
+-d &lt;num&gt;
+</dt>
+<dt class="hdlist1">
+--data-area=&lt;num&gt;
+</dt>
+<dd>
+<p>
+ Pick which telemetry data area to report. Default is 3 to fetch areas 1-3.
+ Valid options are 1, 2, 3, 4.
+</p>
+</dd>
+<dt class="hdlist1">
+-j &lt;file&gt;
+</dt>
+<dt class="hdlist1">
+--config-file=&lt;file&gt;
+</dt>
+<dd>
+<p>
+ Specify a JSON configuration file for custom parsing of the telemetry log.
+</p>
+</dd>
+<dt class="hdlist1">
+-s
+</dt>
+<dt class="hdlist1">
+--source-file
+</dt>
+<dd>
+<p>
+ Indicates that the &lt;device&gt; argument is a binary file containing a log dump
+ instead of a block or character device.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Retrieve and parse the telemetry log with default options:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm parse-telemetry-log /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve an existing telemetry log without generating a new one:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm parse-telemetry-log /dev/nvme0 -g 0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Parse a specific data area of the telemetry log:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm parse-telemetry-log /dev/nvme0 -d 2</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Use a custom configuration file for parsing:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm parse-telemetry-log /dev/nvme0 -j config.json</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Parse a telemetry log from a binary file:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm parse-telemetry-log telemetry_dump.bin -s</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_output">OUTPUT</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>The command outputs the parsed telemetry log in JSON format to stdout.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-cli suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-parse-telemetry-log.txt b/Documentation/nvme-solidigm-parse-telemetry-log.txt
new file mode 100644
index 0000000..38a678b
--- /dev/null
+++ b/Documentation/nvme-solidigm-parse-telemetry-log.txt
@@ -0,0 +1,86 @@
+nvme-solidigm-parse-telemetry-log(1)
+====================================
+
+NAME
+----
+nvme-solidigm-parse-telemetry-log - Parse and display Solidigm Telemetry log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm parse-telemetry-log' <device> [OPTIONS]
+
+DESCRIPTION
+-----------
+Retrieves, parses, and displays the Telemetry log for the given Solidigm NVMe device.
+This command provides detailed information about the device's telemetry data, which
+can be useful for diagnostics and performance analysis.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-g <num>::
+--host-generate=<num>::
+ Controls when to generate a new host-initiated report. Default value '1' generates
+ a new host-initiated report, value '0' causes retrieval of an existing log.
+ Valid values are 0 and 1.
+
+-c::
+--controller-init::
+ Gather report generated by the controller.
+
+-d <num>::
+--data-area=<num>::
+ Pick which telemetry data area to report. Default is 3 to fetch areas 1-3.
+ Valid options are 1, 2, 3, 4.
+
+-j <file>::
+--config-file=<file>::
+ Specify a JSON configuration file for custom parsing of the telemetry log.
+
+-s::
+--source-file::
+ Indicates that the <device> argument is a binary file containing a log dump
+ instead of a block or character device.
+
+EXAMPLES
+--------
+* Retrieve and parse the telemetry log with default options:
++
+------------
+# nvme solidigm parse-telemetry-log /dev/nvme0
+------------
+
+* Retrieve an existing telemetry log without generating a new one:
++
+------------
+# nvme solidigm parse-telemetry-log /dev/nvme0 -g 0
+------------
+
+* Parse a specific data area of the telemetry log:
++
+------------
+# nvme solidigm parse-telemetry-log /dev/nvme0 -d 2
+------------
+
+* Use a custom configuration file for parsing:
++
+------------
+# nvme solidigm parse-telemetry-log /dev/nvme0 -j config.json
+------------
+
+* Parse a telemetry log from a binary file:
++
+------------
+# nvme solidigm parse-telemetry-log telemetry_dump.bin -s
+------------
+
+OUTPUT
+------
+The command outputs the parsed telemetry log in JSON format to stdout.
+
+NVME
+----
+Part of the nvme-cli suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-smart-log-add.1 b/Documentation/nvme-solidigm-smart-log-add.1
new file mode 100644
index 0000000..a71787b
--- /dev/null
+++ b/Documentation/nvme-solidigm-smart-log-add.1
@@ -0,0 +1,123 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-SMAR" "1" "10/31/2024" "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-solidigm-smart-log-add \- Retrieve Solidigm SMART Log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm smart\-log\-add\fR <device> [\-\-namespace\-id=<nsid> | \-n <nsid>]
+ [\-\-output\-format=<fmt> | \-o <fmt>]
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves the Solidigm vendor\-specific SMART log for the given NVMe device and optionally the specified namespace, then displays the log\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-n <nsid>, \-\-namespace\-id=<nsid>
+.RS 4
+Retrieve the log for the given nsid\&. If not specified, the log will be retrieved for all namespaces\&.
+.RE
+.PP
+\-o <fmt>, \-\-output\-format=<fmt>
+.RS 4
+Set the reporting format to
+\fInormal\fR,
+\fIjson\fR, or
+\fIbinary\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the Solidigm SMART log for all namespaces:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm smart\-log\-add /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the Solidigm SMART log for namespace 1:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm smart\-log\-add /dev/nvme0 \-n 1
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the Solidigm SMART log in JSON format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm smart\-log\-add /dev/nvme0 \-o json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-smart-log-add.html b/Documentation/nvme-solidigm-smart-log-add.html
new file mode 100644
index 0000000..178f6bf
--- /dev/null
+++ b/Documentation/nvme-solidigm-smart-log-add.html
@@ -0,0 +1,847 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-smart-log-add(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-smart-log-add(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-smart-log-add -
+ Retrieve Solidigm SMART Log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm smart-log-add</em> &lt;device&gt; [--namespace-id=&lt;nsid&gt; | -n &lt;nsid&gt;]
+ [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves the Solidigm vendor-specific SMART log for the given NVMe device
+and optionally the specified namespace, then displays the log.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-n &lt;nsid&gt;
+</dt>
+<dt class="hdlist1">
+--namespace-id=&lt;nsid&gt;
+</dt>
+<dd>
+<p>
+ Retrieve the log for the given nsid. If not specified, the log
+ will be retrieved for all namespaces.
+</p>
+</dd>
+<dt class="hdlist1">
+-o &lt;fmt&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;fmt&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em>, <em>json</em>, or <em>binary</em>. Only one
+ output format can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Retrieve the Solidigm SMART log for all namespaces:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm smart-log-add /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve the Solidigm SMART log for namespace 1:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm smart-log-add /dev/nvme0 -n 1</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve the Solidigm SMART log in JSON format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm smart-log-add /dev/nvme0 -o json</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-smart-log-add.txt b/Documentation/nvme-solidigm-smart-log-add.txt
new file mode 100644
index 0000000..5a9b92c
--- /dev/null
+++ b/Documentation/nvme-solidigm-smart-log-add.txt
@@ -0,0 +1,56 @@
+nvme-solidigm-smart-log-add(1)
+==============================
+
+NAME
+----
+nvme-solidigm-smart-log-add - Retrieve Solidigm SMART Log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm smart-log-add' <device> [--namespace-id=<nsid> | -n <nsid>]
+ [--output-format=<fmt> | -o <fmt>]
+
+DESCRIPTION
+-----------
+Retrieves the Solidigm vendor-specific SMART log for the given NVMe device
+and optionally the specified namespace, then displays the log.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-n <nsid>::
+--namespace-id=<nsid>::
+ Retrieve the log for the given nsid. If not specified, the log
+ will be retrieved for all namespaces.
+
+-o <fmt>::
+--output-format=<fmt>::
+ Set the reporting format to 'normal', 'json', or 'binary'. Only one
+ output format can be used at a time.
+
+EXAMPLES
+--------
+* Retrieve the Solidigm SMART log for all namespaces:
++
+------------
+# nvme solidigm smart-log-add /dev/nvme0
+------------
+
+* Retrieve the Solidigm SMART log for namespace 1:
++
+------------
+# nvme solidigm smart-log-add /dev/nvme0 -n 1
+------------
+
+* Retrieve the Solidigm SMART log in JSON format:
++
+------------
+# nvme solidigm smart-log-add /dev/nvme0 -o json
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-temp-stats.1 b/Documentation/nvme-solidigm-temp-stats.1
new file mode 100644
index 0000000..50e5b44
--- /dev/null
+++ b/Documentation/nvme-solidigm-temp-stats.1
@@ -0,0 +1,93 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-TEMP" "1" "10/31/2024" "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-solidigm-temp-stats \- Retrieve Temperature Statistics log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm temp\-stats\fR <device> [\-\-raw\-binary | \-b]
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves and displays the Temperature Statistics log for the given Solidigm NVMe device\&. This log provides detailed temperature\-related information\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-b, \-\-raw\-binary
+.RS 4
+Dump output in binary format\&. This option will display the raw data instead of interpreting it\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve and display the temperature statistics log:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm temp\-stats /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the temperature statistics log in raw binary format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm temp\-stats /dev/nvme0 \-\-raw\-binary
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-temp-stats.html b/Documentation/nvme-solidigm-temp-stats.html
new file mode 100644
index 0000000..d61c5fc
--- /dev/null
+++ b/Documentation/nvme-solidigm-temp-stats.html
@@ -0,0 +1,825 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-temp-stats(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-temp-stats(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-temp-stats -
+ Retrieve Temperature Statistics log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm temp-stats</em> &lt;device&gt; [--raw-binary | -b]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves and displays the Temperature Statistics log for the given Solidigm
+NVMe device. This log provides detailed temperature-related information.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-b
+</dt>
+<dt class="hdlist1">
+--raw-binary
+</dt>
+<dd>
+<p>
+ Dump output in binary format. This option will display the raw data
+ instead of interpreting it.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Retrieve and display the temperature statistics log:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm temp-stats /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve the temperature statistics log in raw binary format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm temp-stats /dev/nvme0 --raw-binary</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-temp-stats.txt b/Documentation/nvme-solidigm-temp-stats.txt
new file mode 100644
index 0000000..f672382
--- /dev/null
+++ b/Documentation/nvme-solidigm-temp-stats.txt
@@ -0,0 +1,44 @@
+nvme-solidigm-temp-stats(1)
+===========================
+
+NAME
+----
+nvme-solidigm-temp-stats - Retrieve Temperature Statistics log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm temp-stats' <device> [--raw-binary | -b]
+
+DESCRIPTION
+-----------
+Retrieves and displays the Temperature Statistics log for the given Solidigm
+NVMe device. This log provides detailed temperature-related information.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-b::
+--raw-binary::
+ Dump output in binary format. This option will display the raw data
+ instead of interpreting it.
+
+EXAMPLES
+--------
+* Retrieve and display the temperature statistics log:
++
+------------
+# nvme solidigm temp-stats /dev/nvme0
+------------
+
+* Retrieve the temperature statistics log in raw binary format:
++
+------------
+# nvme solidigm temp-stats /dev/nvme0 --raw-binary
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-vs-drive-info.1 b/Documentation/nvme-solidigm-vs-drive-info.1
new file mode 100644
index 0000000..cd3b63e
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-drive-info.1
@@ -0,0 +1,96 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "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-solidigm-vs-drive-info \- Retrieve drive information
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm vs\-drive\-info\fR <device> [\-\-output\-format=<fmt> | \-o <fmt>]
+.fi
+.SH "DESCRIPTION"
+.sp
+Retrieves and displays vendor\-specific drive information for the given Solidigm NVMe device\&. This command provides additional details about the drive that may not be available through standard NVMe commands\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-o <fmt>, \-\-output\-format=<fmt>
+.RS 4
+Set the reporting format to
+\fInormal\fR
+or
+\fIjson\fR\&. Only one output format can be used at a time\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve and display the drive information:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-drive\-info /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve the drive information in JSON format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-drive\-info /dev/nvme0 \-o json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-vs-drive-info.html b/Documentation/nvme-solidigm-vs-drive-info.html
new file mode 100644
index 0000000..04b0c74
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-drive-info.html
@@ -0,0 +1,826 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-vs-drive-info(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-vs-drive-info(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-vs-drive-info -
+ Retrieve drive information
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm vs-drive-info</em> &lt;device&gt; [--output-format=&lt;fmt&gt; | -o &lt;fmt&gt;]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Retrieves and displays vendor-specific drive information for the given Solidigm
+NVMe device. This command provides additional details about the drive that may
+not be available through standard NVMe commands.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-o &lt;fmt&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;fmt&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em> or <em>json</em>. Only one output format
+ can be used at a time.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Retrieve and display the drive information:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-drive-info /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve the drive information in JSON format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-drive-info /dev/nvme0 -o json</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-vs-drive-info.txt b/Documentation/nvme-solidigm-vs-drive-info.txt
new file mode 100644
index 0000000..8096b13
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-drive-info.txt
@@ -0,0 +1,45 @@
+nvme-solidigm-vs-drive-info(1)
+==============================
+
+NAME
+----
+nvme-solidigm-vs-drive-info - Retrieve drive information
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm vs-drive-info' <device> [--output-format=<fmt> | -o <fmt>]
+
+DESCRIPTION
+-----------
+Retrieves and displays vendor-specific drive information for the given Solidigm
+NVMe device. This command provides additional details about the drive that may
+not be available through standard NVMe commands.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-o <fmt>::
+--output-format=<fmt>::
+ Set the reporting format to 'normal' or 'json'. Only one output format
+ can be used at a time.
+
+EXAMPLES
+--------
+* Retrieve and display the drive information:
++
+------------
+# nvme solidigm vs-drive-info /dev/nvme0
+------------
+
+* Retrieve the drive information in JSON format:
++
+------------
+# nvme solidigm vs-drive-info /dev/nvme0 -o json
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-vs-fw-activate-history.1 b/Documentation/nvme-solidigm-vs-fw-activate-history.1
new file mode 100644
index 0000000..b1d2e99
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-fw-activate-history.1
@@ -0,0 +1,94 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "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-solidigm-vs-fw-activate-history \- Get firmware activation history log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm vs\-fw\-activate\-history\fR <device> [OPTIONS]
+.fi
+.SH "DESCRIPTION"
+.sp
+This command retrieves the firmware activation history log for Solidigm NVMe devices\&. It redirects to the OCP plug\-in for compatibility\&.
+.SH "OPTIONS"
+.PP
+\-o <fmt>, \-\-output\-format=<fmt>
+.RS 4
+Set the reporting format to
+\fInormal\fR
+or
+\fIjson\fR\&. Only one output format can be used at a time\&. Default is normal\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Print the firmware activation history log in normal format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-fw\-activate\-history /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Print the firmware activation history log in JSON format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-fw\-activate\-history /dev/nvme0 \-o json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-cli suite
diff --git a/Documentation/nvme-solidigm-vs-fw-activate-history.html b/Documentation/nvme-solidigm-vs-fw-activate-history.html
new file mode 100644
index 0000000..75a6c87
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-fw-activate-history.html
@@ -0,0 +1,821 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-vs-fw-activate-history(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-vs-fw-activate-history(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-vs-fw-activate-history -
+ Get firmware activation history log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm vs-fw-activate-history</em> &lt;device&gt; [OPTIONS]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>This command retrieves the firmware activation history log for Solidigm NVMe devices. It redirects to the OCP plug-in for compatibility.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-o &lt;fmt&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;fmt&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em> or <em>json</em>. Only one output format can be used at a time. Default is normal.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Print the firmware activation history log in normal format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-fw-activate-history /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Print the firmware activation history log in JSON format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-fw-activate-history /dev/nvme0 -o json</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-cli suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-vs-fw-activate-history.txt b/Documentation/nvme-solidigm-vs-fw-activate-history.txt
new file mode 100644
index 0000000..cfe4e86
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-fw-activate-history.txt
@@ -0,0 +1,39 @@
+nvme-solidigm-vs-fw-activate-history(1)
+=======================================
+
+NAME
+----
+nvme-solidigm-vs-fw-activate-history - Get firmware activation history log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm vs-fw-activate-history' <device> [OPTIONS]
+
+DESCRIPTION
+-----------
+This command retrieves the firmware activation history log for Solidigm NVMe devices. It redirects to the OCP plug-in for compatibility.
+
+OPTIONS
+-------
+-o <fmt>::
+--output-format=<fmt>::
+ Set the reporting format to 'normal' or 'json'. Only one output format can be used at a time. Default is normal.
+
+EXAMPLES
+--------
+* Print the firmware activation history log in normal format:
++
+------------
+# nvme solidigm vs-fw-activate-history /dev/nvme0
+------------
+
+* Print the firmware activation history log in JSON format:
++
+------------
+# nvme solidigm vs-fw-activate-history /dev/nvme0 -o json
+------------
+
+NVME
+----
+Part of the nvme-cli suite
diff --git a/Documentation/nvme-solidigm-vs-internal-log.1 b/Documentation/nvme-solidigm-vs-internal-log.1
new file mode 100644
index 0000000..c30a350
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-internal-log.1
@@ -0,0 +1,126 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "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-solidigm-vs-internal-log \- Retrieve Debug log binaries
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm vs\-internal\-log\fR <device> [\-\-log\-type=<type> | \-t <type>]
+ [\-\-output\-dir=<dir> | \-d <dir>]
+ [\-\-verbose | \-v]
+.fi
+.SH "DESCRIPTION"
+.sp
+For the NVMe device given, retrieves the Solidigm vendor\-specific internal debug log binaries and saves them to the specified output directory\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-t <type>, \-\-log\-type=<type>
+.RS 4
+Specify the type of log to retrieve\&. Valid options are ALL, CIT, HIT, NLOG, ASSERT, and EVENT\&. Defaults to ALL\&.
+.RE
+.PP
+\-d <dir>, \-\-output\-dir=<dir>
+.RS 4
+Specify the output directory for the log files\&. Defaults to the current working directory\&.
+.RE
+.PP
+\-v, \-\-verbose
+.RS 4
+Enable verbose output for additional information during the log retrieval process\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve all internal logs and save them to the current directory:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-internal\-log /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve a specific log type and save it to a custom directory:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-internal\-log /dev/nvme0 \-t NLOG \-d /tmp/logs
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Retrieve logs with verbose output:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-internal\-log /dev/nvme0 \-v
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-vs-internal-log.html b/Documentation/nvme-solidigm-vs-internal-log.html
new file mode 100644
index 0000000..2ab4fab
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-internal-log.html
@@ -0,0 +1,857 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-vs-internal-log(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-vs-internal-log(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-vs-internal-log -
+ Retrieve Debug log binaries
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm vs-internal-log</em> &lt;device&gt; [--log-type=&lt;type&gt; | -t &lt;type&gt;]
+ [--output-dir=&lt;dir&gt; | -d &lt;dir&gt;]
+ [--verbose | -v]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>For the NVMe device given, retrieves the Solidigm vendor-specific internal
+debug log binaries and saves them to the specified output directory.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-t &lt;type&gt;
+</dt>
+<dt class="hdlist1">
+--log-type=&lt;type&gt;
+</dt>
+<dd>
+<p>
+ Specify the type of log to retrieve. Valid options are ALL, CIT, HIT, NLOG, ASSERT, and EVENT. Defaults to ALL.
+</p>
+</dd>
+<dt class="hdlist1">
+-d &lt;dir&gt;
+</dt>
+<dt class="hdlist1">
+--output-dir=&lt;dir&gt;
+</dt>
+<dd>
+<p>
+ Specify the output directory for the log files. Defaults to the current working directory.
+</p>
+</dd>
+<dt class="hdlist1">
+-v
+</dt>
+<dt class="hdlist1">
+--verbose
+</dt>
+<dd>
+<p>
+ Enable verbose output for additional information during the log retrieval process.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Retrieve all internal logs and save them to the current directory:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-internal-log /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve a specific log type and save it to a custom directory:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-internal-log /dev/nvme0 -t NLOG -d /tmp/logs</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Retrieve logs with verbose output:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-internal-log /dev/nvme0 -v</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-vs-internal-log.txt b/Documentation/nvme-solidigm-vs-internal-log.txt
new file mode 100644
index 0000000..e488106
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-internal-log.txt
@@ -0,0 +1,59 @@
+nvme-solidigm-vs-internal-log(1)
+================================
+
+NAME
+----
+nvme-solidigm-vs-internal-log - Retrieve Debug log binaries
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm vs-internal-log' <device> [--log-type=<type> | -t <type>]
+ [--output-dir=<dir> | -d <dir>]
+ [--verbose | -v]
+
+DESCRIPTION
+-----------
+For the NVMe device given, retrieves the Solidigm vendor-specific internal
+debug log binaries and saves them to the specified output directory.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-t <type>::
+--log-type=<type>::
+ Specify the type of log to retrieve. Valid options are ALL, CIT, HIT, NLOG, ASSERT, and EVENT. Defaults to ALL.
+
+-d <dir>::
+--output-dir=<dir>::
+ Specify the output directory for the log files. Defaults to the current working directory.
+
+-v::
+--verbose::
+ Enable verbose output for additional information during the log retrieval process.
+
+EXAMPLES
+--------
+* Retrieve all internal logs and save them to the current directory:
++
+------------
+# nvme solidigm vs-internal-log /dev/nvme0
+------------
+
+* Retrieve a specific log type and save it to a custom directory:
++
+------------
+# nvme solidigm vs-internal-log /dev/nvme0 -t NLOG -d /tmp/logs
+------------
+
+* Retrieve logs with verbose output:
++
+------------
+# nvme solidigm vs-internal-log /dev/nvme0 -v
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-vs-smart-add-log.1 b/Documentation/nvme-solidigm-vs-smart-add-log.1
new file mode 100644
index 0000000..80f2bb5
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-smart-add-log.1
@@ -0,0 +1,94 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-VS\-" "1" "10/31/2024" "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-solidigm-vs-smart-add-log \- Get SMART / health extended log
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm vs\-smart\-add\-log\fR <device> [OPTIONS]
+.fi
+.SH "DESCRIPTION"
+.sp
+This command retrieves the SMART / health extended log for Solidigm NVMe devices\&. It redirects to the OCP plug\-in for compatibility\&.
+.SH "OPTIONS"
+.PP
+\-o <fmt>, \-\-output\-format=<fmt>
+.RS 4
+Set the reporting format to
+\fInormal\fR
+or
+\fIjson\fR\&. Only one output format can be used at a time\&. Default is normal\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Print the SMART / health extended log in normal format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-smart\-add\-log /dev/nvme0
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Print the SMART / health extended log in JSON format:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm vs\-smart\-add\-log /dev/nvme0 \-o json
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-cli suite
diff --git a/Documentation/nvme-solidigm-vs-smart-add-log.html b/Documentation/nvme-solidigm-vs-smart-add-log.html
new file mode 100644
index 0000000..24832aa
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-smart-add-log.html
@@ -0,0 +1,821 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-vs-smart-add-log(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-vs-smart-add-log(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-vs-smart-add-log -
+ Get SMART / health extended log
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm vs-smart-add-log</em> &lt;device&gt; [OPTIONS]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>This command retrieves the SMART / health extended log for Solidigm NVMe devices. It redirects to the OCP plug-in for compatibility.</p></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-o &lt;fmt&gt;
+</dt>
+<dt class="hdlist1">
+--output-format=&lt;fmt&gt;
+</dt>
+<dd>
+<p>
+ Set the reporting format to <em>normal</em> or <em>json</em>. Only one output format can be used at a time. Default is normal.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Print the SMART / health extended log in normal format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-smart-add-log /dev/nvme0</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Print the SMART / health extended log in JSON format:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm vs-smart-add-log /dev/nvme0 -o json</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-cli suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-vs-smart-add-log.txt b/Documentation/nvme-solidigm-vs-smart-add-log.txt
new file mode 100644
index 0000000..c1bf0c8
--- /dev/null
+++ b/Documentation/nvme-solidigm-vs-smart-add-log.txt
@@ -0,0 +1,39 @@
+nvme-solidigm-vs-smart-add-log(1)
+=================================
+
+NAME
+----
+nvme-solidigm-vs-smart-add-log - Get SMART / health extended log
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm vs-smart-add-log' <device> [OPTIONS]
+
+DESCRIPTION
+-----------
+This command retrieves the SMART / health extended log for Solidigm NVMe devices. It redirects to the OCP plug-in for compatibility.
+
+OPTIONS
+-------
+-o <fmt>::
+--output-format=<fmt>::
+ Set the reporting format to 'normal' or 'json'. Only one output format can be used at a time. Default is normal.
+
+EXAMPLES
+--------
+* Print the SMART / health extended log in normal format:
++
+------------
+# nvme solidigm vs-smart-add-log /dev/nvme0
+------------
+
+* Print the SMART / health extended log in JSON format:
++
+------------
+# nvme solidigm vs-smart-add-log /dev/nvme0 -o json
+------------
+
+NVME
+----
+Part of the nvme-cli suite \ No newline at end of file
diff --git a/Documentation/nvme-solidigm-workload-tracker.1 b/Documentation/nvme-solidigm-workload-tracker.1
new file mode 100644
index 0000000..444a91d
--- /dev/null
+++ b/Documentation/nvme-solidigm-workload-tracker.1
@@ -0,0 +1,221 @@
+'\" t
+.\" 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
+.\" Manual: NVMe Manual
+.\" Source: NVMe
+.\" Language: English
+.\"
+.TH "NVME\-SOLIDIGM\-WORK" "1" "10/31/2024" "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-solidigm-workload-tracker \- Real\-time capture of Workload Tracker samples
+.SH "SYNOPSIS"
+.sp
+.nf
+\fInvme solidigm workload\-tracker\fR <device> [\-\-enable | \-e] [\-\-disable | \-d]
+ [\-\-sample\-time=<time> | \-s <time>]
+ [\-\-type=<type> | \-t <type>]
+ [\-\-run\-time=<seconds> | \-r <seconds>]
+ [\-\-flush\-freq=<count> | \-f <count>]
+ [\-\-wall\-clock | \-w]
+ [\-\-trigger\-field=<field> | \-T <field>]
+ [\-\-trigger\-threshold=<value> | \-V <value>]
+ [\-\-trigger\-on\-delta | \-D]
+ [\-\-trigger\-on\-latency | \-L]
+ [\-\-verbose | \-v]
+.fi
+.SH "DESCRIPTION"
+.sp
+Captures and displays real\-time workload tracker samples for the given Solidigm NVMe device\&. This command allows for monitoring and analysis of the device\(cqs workload characteristics\&.
+.sp
+The <device> parameter is mandatory and may be either the NVMe character device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1)\&.
+.SH "OPTIONS"
+.PP
+\-e, \-\-enable
+.RS 4
+Enable the workload tracker before capturing samples\&.
+.RE
+.PP
+\-d, \-\-disable
+.RS 4
+Disable the workload tracker after capturing samples\&.
+.RE
+.PP
+\-s <time>, \-\-sample\-time=<time>
+.RS 4
+Set the sample interval\&. Valid values are: default, 1ms, 5ms, 10ms, 50ms, 100ms, 500ms, 1s, 5s, 10s, 30s, 1m, 5m, 10m, 30m, 1h\&.
+.RE
+.PP
+\-t <type>, \-\-type=<type>
+.RS 4
+Set the tracker type\&. Valid types are: Base, CmdQ, Pattern, RandSeq, Throttle, Power, Defrag\&.
+.RE
+.PP
+\-r <seconds>, \-\-run\-time=<seconds>
+.RS 4
+Limit runtime capture time in seconds\&.
+.RE
+.PP
+\-f <count>, \-\-flush\-freq=<count>
+.RS 4
+Number of samples (1 to 126) to wait before extracting data\&. Default is 100 samples\&.
+.RE
+.PP
+\-w, \-\-wall\-clock
+.RS 4
+Log current wall timestamp when entry was retrieved\&.
+.RE
+.PP
+\-T <field>, \-\-trigger\-field=<field>
+.RS 4
+Field name to stop trigger on\&.
+.RE
+.PP
+\-V <value>, \-\-trigger\-threshold=<value>
+.RS 4
+Field value to trigger stop sampling\&.
+.RE
+.PP
+\-D, \-\-trigger\-on\-delta
+.RS 4
+Trigger on delta to stop sampling\&.
+.RE
+.PP
+\-L, \-\-trigger\-on\-latency
+.RS 4
+Use latency tracker to trigger stop sampling\&.
+.RE
+.PP
+\-v, \-\-verbose
+.RS 4
+Increase logging verbosity\&. Can be used multiple times\&.
+.RE
+.SH "EXAMPLES"
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Enable the workload tracker and capture samples:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm workload\-tracker /dev/nvme0 \-\-enable
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Capture workload tracker samples with a 1ms interval for 60 seconds:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm workload\-tracker /dev/nvme0 \-\-enable \-\-sample\-time=1ms \-\-run\-time=60
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Disable the workload tracker:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm workload\-tracker /dev/nvme0 \-\-disable
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Enable the workload tracker and capture samples with a specific sample time and type:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm workload\-tracker /dev/nvme0 \-\-enable \-\-sample\-time=1ms \-\-type=Base
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.sp
+.RS 4
+.ie n \{\
+\h'-04'\(bu\h'+03'\c
+.\}
+.el \{\
+.sp -1
+.IP \(bu 2.3
+.\}
+Capture Power tracker samples with a 10\-second interval for 5 minutes:
+.sp
+.if n \{\
+.RS 4
+.\}
+.nf
+# nvme solidigm workload\-tracker /dev/nvme0 \-\-enable \-\-type=Power \-\-sample\-time=10s \-\-run\-time=300
+.fi
+.if n \{\
+.RE
+.\}
+.RE
+.SH "NVME"
+.sp
+Part of the nvme\-user suite
diff --git a/Documentation/nvme-solidigm-workload-tracker.html b/Documentation/nvme-solidigm-workload-tracker.html
new file mode 100644
index 0000000..bea20d6
--- /dev/null
+++ b/Documentation/nvme-solidigm-workload-tracker.html
@@ -0,0 +1,947 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<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-solidigm-workload-tracker(1)</title>
+<style type="text/css">
+/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
+
+/* Default font. */
+body {
+ font-family: Georgia,serif;
+}
+
+/* Title font. */
+h1, h2, h3, h4, h5, h6,
+div.title, caption.title,
+thead, p.table.header,
+#toctitle,
+#author, #revnumber, #revdate, #revremark,
+#footer {
+ font-family: Arial,Helvetica,sans-serif;
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a {
+ color: blue;
+ text-decoration: underline;
+}
+a:visited {
+ color: fuchsia;
+}
+
+em {
+ font-style: italic;
+ color: navy;
+}
+
+strong {
+ font-weight: bold;
+ color: #083194;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1, h2, h3 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ padding-top: 0.5em;
+}
+h3 {
+ float: left;
+}
+h3 + * {
+ clear: left;
+}
+h5 {
+ font-size: 1.0em;
+}
+
+div.sectionbody {
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+ul, ol, li > p {
+ margin-top: 0;
+}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
+
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
+ padding: 0;
+ margin: 0;
+}
+pre {
+ white-space: pre-wrap;
+}
+
+#author {
+ color: #527bbd;
+ font-weight: bold;
+ font-size: 1.1em;
+}
+#email {
+}
+#revnumber, #revdate, #revremark {
+}
+
+#footer {
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+#preamble {
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.0em;
+ margin-bottom: 2.0em;
+ margin-right: 10%;
+ color: #606060;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ color: #527bbd;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
+ padding: 0.5em;
+}
+
+div.quoteblock, div.verseblock {
+ padding-left: 1.0em;
+ margin-left: 1.0em;
+ margin-right: 10%;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
+}
+
+div.quoteblock > div.attribution {
+ padding-top: 0.5em;
+ text-align: right;
+}
+
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
+}
+div.verseblock > div.attribution {
+ padding-top: 0.75em;
+ text-align: left;
+}
+/* DEPRECATED: Pre version 8.2.7 verse style literal block. */
+div.verseblock + div.attribution {
+ text-align: left;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 3px solid #dddddd;
+}
+
+div.exampleblock > div.content {
+ border-left: 3px solid #dddddd;
+ padding-left: 0.5em;
+}
+
+div.imageblock div.content { padding-left: 0; }
+span.image img { border-style: none; vertical-align: text-bottom; }
+a.image:visited { color: white; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: normal;
+ color: navy;
+}
+dd > *:first-child {
+ margin-top: 0.1em;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.arabic {
+ list-style-type: decimal;
+}
+ol.loweralpha {
+ list-style-type: lower-alpha;
+}
+ol.upperalpha {
+ list-style-type: upper-alpha;
+}
+ol.lowerroman {
+ list-style-type: lower-roman;
+}
+ol.upperroman {
+ list-style-type: upper-roman;
+}
+
+div.compact ul, div.compact ol,
+div.compact p, div.compact p,
+div.compact div, div.compact div {
+ margin-top: 0.1em;
+ margin-bottom: 0.1em;
+}
+
+tfoot {
+ font-weight: bold;
+}
+td > div.verse {
+ white-space: pre;
+}
+
+div.hdlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+div.hdlist tr {
+ padding-bottom: 15px;
+}
+dt.hdlist1.strong, td.hdlist1.strong {
+ font-weight: bold;
+}
+td.hdlist1 {
+ vertical-align: top;
+ font-style: normal;
+ padding-right: 0.8em;
+ color: navy;
+}
+td.hdlist2 {
+ vertical-align: top;
+}
+div.hdlist.compact tr {
+ margin: 0;
+ padding-bottom: 0;
+}
+
+.comment {
+ background: yellow;
+}
+
+.footnote, .footnoteref {
+ font-size: 0.8em;
+}
+
+span.footnote, span.footnoteref {
+ vertical-align: super;
+}
+
+#footnotes {
+ margin: 20px 0 20px 0;
+ padding: 7px 0 0 0;
+}
+
+#footnotes div.footnote {
+ margin: 0 0 5px 0;
+}
+
+#footnotes hr {
+ border: none;
+ border-top: 1px solid silver;
+ height: 1px;
+ text-align: left;
+ margin-left: 0;
+ width: 20%;
+ min-width: 100px;
+}
+
+div.colist td {
+ padding-right: 0.5em;
+ padding-bottom: 0.3em;
+ vertical-align: top;
+}
+div.colist td img {
+ margin-top: 0.3em;
+}
+
+@media print {
+ #footer-badges { display: none; }
+}
+
+#toc {
+ margin-bottom: 2.5em;
+}
+
+#toctitle {
+ color: #527bbd;
+ font-size: 1.1em;
+ font-weight: bold;
+ margin-top: 1.0em;
+ margin-bottom: 0.1em;
+}
+
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+div.toclevel2 {
+ margin-left: 2em;
+ font-size: 0.9em;
+}
+div.toclevel3 {
+ margin-left: 4em;
+ font-size: 0.9em;
+}
+div.toclevel4 {
+ margin-left: 6em;
+ font-size: 0.9em;
+}
+
+span.aqua { color: aqua; }
+span.black { color: black; }
+span.blue { color: blue; }
+span.fuchsia { color: fuchsia; }
+span.gray { color: gray; }
+span.green { color: green; }
+span.lime { color: lime; }
+span.maroon { color: maroon; }
+span.navy { color: navy; }
+span.olive { color: olive; }
+span.purple { color: purple; }
+span.red { color: red; }
+span.silver { color: silver; }
+span.teal { color: teal; }
+span.white { color: white; }
+span.yellow { color: yellow; }
+
+span.aqua-background { background: aqua; }
+span.black-background { background: black; }
+span.blue-background { background: blue; }
+span.fuchsia-background { background: fuchsia; }
+span.gray-background { background: gray; }
+span.green-background { background: green; }
+span.lime-background { background: lime; }
+span.maroon-background { background: maroon; }
+span.navy-background { background: navy; }
+span.olive-background { background: olive; }
+span.purple-background { background: purple; }
+span.red-background { background: red; }
+span.silver-background { background: silver; }
+span.teal-background { background: teal; }
+span.white-background { background: white; }
+span.yellow-background { background: yellow; }
+
+span.big { font-size: 2em; }
+span.small { font-size: 0.6em; }
+
+span.underline { text-decoration: underline; }
+span.overline { text-decoration: overline; }
+span.line-through { text-decoration: line-through; }
+
+div.unbreakable { page-break-inside: avoid; }
+
+
+/*
+ * xhtml11 specific
+ *
+ * */
+
+div.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+div.tableblock > table {
+ border: 3px solid #527bbd;
+}
+thead, p.table.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.table {
+ margin-top: 0;
+}
+/* Because the table frame attribute is overridden by CSS in most browsers. */
+div.tableblock > table[frame="void"] {
+ border-style: none;
+}
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
+}
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
+}
+
+
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
+}
+thead, p.tableblock.header {
+ font-weight: bold;
+ color: #527bbd;
+}
+p.tableblock {
+ margin-top: 0;
+}
+table.tableblock {
+ border-width: 3px;
+ border-spacing: 0px;
+ border-style: solid;
+ border-color: #527bbd;
+ border-collapse: collapse;
+}
+th.tableblock, td.tableblock {
+ border-width: 1px;
+ padding: 4px;
+ border-style: solid;
+ border-color: #527bbd;
+}
+
+table.tableblock.frame-topbot {
+ border-left-style: hidden;
+ border-right-style: hidden;
+}
+table.tableblock.frame-sides {
+ border-top-style: hidden;
+ border-bottom-style: hidden;
+}
+table.tableblock.frame-none {
+ border-style: hidden;
+}
+
+th.tableblock.halign-left, td.tableblock.halign-left {
+ text-align: left;
+}
+th.tableblock.halign-center, td.tableblock.halign-center {
+ text-align: center;
+}
+th.tableblock.halign-right, td.tableblock.halign-right {
+ text-align: right;
+}
+
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
+}
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
+}
+
+
+/*
+ * manpage specific
+ *
+ * */
+
+body.manpage h1 {
+ padding-top: 0.5em;
+ padding-bottom: 0.5em;
+ border-top: 2px solid silver;
+ border-bottom: 2px solid silver;
+}
+body.manpage h2 {
+ border-style: none;
+}
+body.manpage div.sectionbody {
+ margin-left: 3em;
+}
+
+@media print {
+ body.manpage div#toc { display: none; }
+}
+
+
+</style>
+<script type="text/javascript">
+/*<![CDATA[*/
+var asciidoc = { // Namespace.
+
+/////////////////////////////////////////////////////////////////////
+// Table Of Contents generator
+/////////////////////////////////////////////////////////////////////
+
+/* Author: Mihai Bazon, September 2002
+ * http://students.infoiasi.ro/~mishoo
+ *
+ * Table Of Content generator
+ * Version: 0.4
+ *
+ * Feel free to use this script under the terms of the GNU General Public
+ * License, as long as you do not remove or alter this notice.
+ */
+
+ /* modified by Troy D. Hanson, September 2006. License: GPL */
+ /* modified by Stuart Rackham, 2006, 2009. License: GPL */
+
+// toclevels = 1..4.
+toc: function (toclevels) {
+
+ function getText(el) {
+ var text = "";
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
+ text += i.data;
+ else if (i.firstChild != null)
+ text += getText(i);
+ }
+ return text;
+ }
+
+ function TocEntry(el, text, toclevel) {
+ this.element = el;
+ this.text = text;
+ this.toclevel = toclevel;
+ }
+
+ function tocEntries(el, toclevels) {
+ var result = new Array;
+ var re = new RegExp('[hH]([1-'+(toclevels+1)+'])');
+ // Function that scans the DOM tree for header elements (the DOM2
+ // nodeIterator API would be a better technique but not supported by all
+ // browsers).
+ var iterate = function (el) {
+ for (var i = el.firstChild; i != null; i = i.nextSibling) {
+ if (i.nodeType == 1 /* Node.ELEMENT_NODE */) {
+ var mo = re.exec(i.tagName);
+ if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") {
+ result[result.length] = new TocEntry(i, getText(i), mo[1]-1);
+ }
+ iterate(i);
+ }
+ }
+ }
+ iterate(el);
+ return result;
+ }
+
+ var toc = document.getElementById("toc");
+ if (!toc) {
+ return;
+ }
+
+ // Delete existing TOC entries in case we're reloading the TOC.
+ var tocEntriesToRemove = [];
+ var i;
+ for (i = 0; i < toc.childNodes.length; i++) {
+ var entry = toc.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div'
+ && entry.getAttribute("class")
+ && entry.getAttribute("class").match(/^toclevel/))
+ tocEntriesToRemove.push(entry);
+ }
+ for (i = 0; i < tocEntriesToRemove.length; i++) {
+ toc.removeChild(tocEntriesToRemove[i]);
+ }
+
+ // Rebuild TOC entries.
+ var entries = tocEntries(document.getElementById("content"), toclevels);
+ for (var i = 0; i < entries.length; ++i) {
+ var entry = entries[i];
+ if (entry.element.id == "")
+ entry.element.id = "_toc_" + i;
+ var a = document.createElement("a");
+ a.href = "#" + entry.element.id;
+ a.appendChild(document.createTextNode(entry.text));
+ var div = document.createElement("div");
+ div.appendChild(a);
+ div.className = "toclevel" + entry.toclevel;
+ toc.appendChild(div);
+ }
+ if (entries.length == 0)
+ toc.parentNode.removeChild(toc);
+},
+
+
+/////////////////////////////////////////////////////////////////////
+// Footnotes generator
+/////////////////////////////////////////////////////////////////////
+
+/* Based on footnote generation code from:
+ * http://www.brandspankingnew.net/archive/2005/07/format_footnote.html
+ */
+
+footnotes: function () {
+ // Delete existing footnote entries in case we're reloading the footnodes.
+ var i;
+ var noteholder = document.getElementById("footnotes");
+ if (!noteholder) {
+ return;
+ }
+ var entriesToRemove = [];
+ for (i = 0; i < noteholder.childNodes.length; i++) {
+ var entry = noteholder.childNodes[i];
+ if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote")
+ entriesToRemove.push(entry);
+ }
+ for (i = 0; i < entriesToRemove.length; i++) {
+ noteholder.removeChild(entriesToRemove[i]);
+ }
+
+ // Rebuild footnote entries.
+ var cont = document.getElementById("content");
+ var spans = cont.getElementsByTagName("span");
+ var refs = {};
+ var n = 0;
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnote") {
+ n++;
+ var note = spans[i].getAttribute("data-note");
+ if (!note) {
+ // Use [\s\S] in place of . so multi-line matches work.
+ // Because JavaScript has no s (dotall) regex flag.
+ note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1];
+ spans[i].innerHTML =
+ "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ spans[i].setAttribute("data-note", note);
+ }
+ noteholder.innerHTML +=
+ "<div class='footnote' id='_footnote_" + n + "'>" +
+ "<a href='#_footnoteref_" + n + "' title='Return to text'>" +
+ n + "</a>. " + note + "</div>";
+ var id =spans[i].getAttribute("id");
+ if (id != null) refs["#"+id] = n;
+ }
+ }
+ if (n == 0)
+ noteholder.parentNode.removeChild(noteholder);
+ else {
+ // Process footnoterefs.
+ for (i=0; i<spans.length; i++) {
+ if (spans[i].className == "footnoteref") {
+ var href = spans[i].getElementsByTagName("a")[0].getAttribute("href");
+ href = href.match(/#.*/)[0]; // Because IE return full URL.
+ n = refs[href];
+ spans[i].innerHTML =
+ "[<a href='#_footnote_" + n +
+ "' title='View footnote' class='footnote'>" + n + "</a>]";
+ }
+ }
+ }
+},
+
+install: function(toclevels) {
+ var timerId;
+
+ function reinstall() {
+ asciidoc.footnotes();
+ if (toclevels) {
+ asciidoc.toc(toclevels);
+ }
+ }
+
+ function reinstallAndRemoveTimer() {
+ clearInterval(timerId);
+ reinstall();
+ }
+
+ timerId = setInterval(reinstall, 500);
+ if (document.addEventListener)
+ document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false);
+ else
+ window.onload = reinstallAndRemoveTimer;
+}
+
+}
+asciidoc.install();
+/*]]>*/
+</script>
+</head>
+<body class="manpage">
+<div id="header">
+<h1>
+nvme-solidigm-workload-tracker(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>nvme-solidigm-workload-tracker -
+ Real-time capture of Workload Tracker samples
+</p>
+</div>
+</div>
+<div id="content">
+<div class="sect1">
+<h2 id="_synopsis">SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<pre class="content"><em>nvme solidigm workload-tracker</em> &lt;device&gt; [--enable | -e] [--disable | -d]
+ [--sample-time=&lt;time&gt; | -s &lt;time&gt;]
+ [--type=&lt;type&gt; | -t &lt;type&gt;]
+ [--run-time=&lt;seconds&gt; | -r &lt;seconds&gt;]
+ [--flush-freq=&lt;count&gt; | -f &lt;count&gt;]
+ [--wall-clock | -w]
+ [--trigger-field=&lt;field&gt; | -T &lt;field&gt;]
+ [--trigger-threshold=&lt;value&gt; | -V &lt;value&gt;]
+ [--trigger-on-delta | -D]
+ [--trigger-on-latency | -L]
+ [--verbose | -v]</pre>
+<div class="attribution">
+</div></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_description">DESCRIPTION</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Captures and displays real-time workload tracker samples for the given Solidigm
+NVMe device. This command allows for monitoring and analysis of the device&#8217;s
+workload characteristics.</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>
+</div>
+<div class="sect1">
+<h2 id="_options">OPTIONS</h2>
+<div class="sectionbody">
+<div class="dlist"><dl>
+<dt class="hdlist1">
+-e, --enable
+</dt>
+<dd>
+<p>
+ Enable the workload tracker before capturing samples.
+</p>
+</dd>
+<dt class="hdlist1">
+-d, --disable
+</dt>
+<dd>
+<p>
+ Disable the workload tracker after capturing samples.
+</p>
+</dd>
+<dt class="hdlist1">
+-s &lt;time&gt;, --sample-time=&lt;time&gt;
+</dt>
+<dd>
+<p>
+ Set the sample interval. Valid values are: default, 1ms, 5ms, 10ms, 50ms, 100ms, 500ms, 1s, 5s, 10s, 30s, 1m, 5m, 10m, 30m, 1h.
+</p>
+</dd>
+<dt class="hdlist1">
+-t &lt;type&gt;, --type=&lt;type&gt;
+</dt>
+<dd>
+<p>
+ Set the tracker type. Valid types are: Base, CmdQ, Pattern, RandSeq, Throttle, Power, Defrag.
+</p>
+</dd>
+<dt class="hdlist1">
+-r &lt;seconds&gt;, --run-time=&lt;seconds&gt;
+</dt>
+<dd>
+<p>
+ Limit runtime capture time in seconds.
+</p>
+</dd>
+<dt class="hdlist1">
+-f &lt;count&gt;, --flush-freq=&lt;count&gt;
+</dt>
+<dd>
+<p>
+ Number of samples (1 to 126) to wait before extracting data. Default is 100 samples.
+</p>
+</dd>
+<dt class="hdlist1">
+-w, --wall-clock
+</dt>
+<dd>
+<p>
+ Log current wall timestamp when entry was retrieved.
+</p>
+</dd>
+<dt class="hdlist1">
+-T &lt;field&gt;, --trigger-field=&lt;field&gt;
+</dt>
+<dd>
+<p>
+ Field name to stop trigger on.
+</p>
+</dd>
+<dt class="hdlist1">
+-V &lt;value&gt;, --trigger-threshold=&lt;value&gt;
+</dt>
+<dd>
+<p>
+ Field value to trigger stop sampling.
+</p>
+</dd>
+<dt class="hdlist1">
+-D, --trigger-on-delta
+</dt>
+<dd>
+<p>
+ Trigger on delta to stop sampling.
+</p>
+</dd>
+<dt class="hdlist1">
+-L, --trigger-on-latency
+</dt>
+<dd>
+<p>
+ Use latency tracker to trigger stop sampling.
+</p>
+</dd>
+<dt class="hdlist1">
+-v, --verbose
+</dt>
+<dd>
+<p>
+ Increase logging verbosity. Can be used multiple times.
+</p>
+</dd>
+</dl></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_examples">EXAMPLES</h2>
+<div class="sectionbody">
+<div class="ulist"><ul>
+<li>
+<p>
+Enable the workload tracker and capture samples:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm workload-tracker /dev/nvme0 --enable</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Capture workload tracker samples with a 1ms interval for 60 seconds:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm workload-tracker /dev/nvme0 --enable --sample-time=1ms --run-time=60</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Disable the workload tracker:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm workload-tracker /dev/nvme0 --disable</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Enable the workload tracker and capture samples with a specific sample time and type:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm workload-tracker /dev/nvme0 --enable --sample-time=1ms --type=Base</code></pre>
+</div></div>
+</li>
+<li>
+<p>
+Capture Power tracker samples with a 10-second interval for 5 minutes:
+</p>
+<div class="listingblock">
+<div class="content">
+<pre><code># nvme solidigm workload-tracker /dev/nvme0 --enable --type=Power --sample-time=10s --run-time=300</code></pre>
+</div></div>
+</li>
+</ul></div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="_nvme">NVME</h2>
+<div class="sectionbody">
+<div class="paragraph"><p>Part of the nvme-user suite</p></div>
+</div>
+</div>
+</div>
+<div id="footnotes"><hr /></div>
+<div id="footer">
+<div id="footer-text">
+Last updated
+ 2024-10-31 10:38:40 CET
+</div>
+</div>
+</body>
+</html>
diff --git a/Documentation/nvme-solidigm-workload-tracker.txt b/Documentation/nvme-solidigm-workload-tracker.txt
new file mode 100644
index 0000000..d1f0b3a
--- /dev/null
+++ b/Documentation/nvme-solidigm-workload-tracker.txt
@@ -0,0 +1,104 @@
+nvme-solidigm-workload-tracker(1)
+=================================
+
+NAME
+----
+nvme-solidigm-workload-tracker - Real-time capture of Workload Tracker samples
+
+SYNOPSIS
+--------
+[verse]
+'nvme solidigm workload-tracker' <device> [--enable | -e] [--disable | -d]
+ [--sample-time=<time> | -s <time>]
+ [--type=<type> | -t <type>]
+ [--run-time=<seconds> | -r <seconds>]
+ [--flush-freq=<count> | -f <count>]
+ [--wall-clock | -w]
+ [--trigger-field=<field> | -T <field>]
+ [--trigger-threshold=<value> | -V <value>]
+ [--trigger-on-delta | -D]
+ [--trigger-on-latency | -L]
+ [--verbose | -v]
+
+DESCRIPTION
+-----------
+Captures and displays real-time workload tracker samples for the given Solidigm
+NVMe device. This command allows for monitoring and analysis of the device's
+workload characteristics.
+
+The <device> parameter is mandatory and may be either the NVMe character
+device (ex: /dev/nvme0), or a namespace block device (ex: /dev/nvme0n1).
+
+OPTIONS
+-------
+-e, --enable::
+ Enable the workload tracker before capturing samples.
+
+-d, --disable::
+ Disable the workload tracker after capturing samples.
+
+-s <time>, --sample-time=<time>::
+ Set the sample interval. Valid values are: default, 1ms, 5ms, 10ms, 50ms, 100ms, 500ms, 1s, 5s, 10s, 30s, 1m, 5m, 10m, 30m, 1h.
+
+-t <type>, --type=<type>::
+ Set the tracker type. Valid types are: Base, CmdQ, Pattern, RandSeq, Throttle, Power, Defrag.
+
+-r <seconds>, --run-time=<seconds>::
+ Limit runtime capture time in seconds.
+
+-f <count>, --flush-freq=<count>::
+ Number of samples (1 to 126) to wait before extracting data. Default is 100 samples.
+
+-w, --wall-clock::
+ Log current wall timestamp when entry was retrieved.
+
+-T <field>, --trigger-field=<field>::
+ Field name to stop trigger on.
+
+-V <value>, --trigger-threshold=<value>::
+ Field value to trigger stop sampling.
+
+-D, --trigger-on-delta::
+ Trigger on delta to stop sampling.
+
+-L, --trigger-on-latency::
+ Use latency tracker to trigger stop sampling.
+
+-v, --verbose::
+ Increase logging verbosity. Can be used multiple times.
+
+EXAMPLES
+--------
+* Enable the workload tracker and capture samples:
++
+------------
+# nvme solidigm workload-tracker /dev/nvme0 --enable
+------------
+
+* Capture workload tracker samples with a 1ms interval for 60 seconds:
++
+------------
+# nvme solidigm workload-tracker /dev/nvme0 --enable --sample-time=1ms --run-time=60
+------------
+
+* Disable the workload tracker:
++
+------------
+# nvme solidigm workload-tracker /dev/nvme0 --disable
+------------
+
+* Enable the workload tracker and capture samples with a specific sample time and type:
++
+------------
+# nvme solidigm workload-tracker /dev/nvme0 --enable --sample-time=1ms --type=Base
+------------
+
+* Capture Power tracker samples with a 10-second interval for 5 minutes:
++
+------------
+# nvme solidigm workload-tracker /dev/nvme0 --enable --type=Power --sample-time=10s --run-time=300
+------------
+
+NVME
+----
+Part of the nvme-user suite \ No newline at end of file
diff --git a/Documentation/nvme-subsystem-reset.1 b/Documentation/nvme-subsystem-reset.1
index 53eeed8..fb53f74 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SUBSYSTEM\-RES" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SUBSYSTEM\-RES" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-subsystem-reset.html b/Documentation/nvme-subsystem-reset.html
index b347647..95a2377 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-supported-log-pages.1 b/Documentation/nvme-supported-log-pages.1
index 2d80cf9..9d690b4 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-SUPPORTED\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-SUPPORTED\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-supported-log-pages.html b/Documentation/nvme-supported-log-pages.html
index 52bb86c..dc88b89 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-telemetry-log.1 b/Documentation/nvme-telemetry-log.1
index 4703d1c..b8b1209 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-TELEMETRY\-LOG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TELEMETRY\-LOG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-telemetry-log.html b/Documentation/nvme-telemetry-log.html
index 830d968..f2dc0c5 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-tls-key.1 b/Documentation/nvme-tls-key.1
index 97c2e7e..05f4347 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-TLS\-KEY" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TLS\-KEY" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-tls-key.html b/Documentation/nvme-tls-key.html
index d3cf0da..c03c598 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 8cfa41b..e4a4769 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-TOSHIBA\-CLEAR" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TOSHIBA\-CLEAR" "1" "10/31/2024" "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 deda2c7..532bda9 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-toshiba-vs-internal-log.1 b/Documentation/nvme-toshiba-vs-internal-log.1
index 73b4870..faa30e5 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-TOSHIBA\-VS\-I" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TOSHIBA\-VS\-I" "1" "10/31/2024" "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 4d71073..823806b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 299da61..32378c1 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-TOSHIBA\-VS\-S" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TOSHIBA\-VS\-S" "1" "10/31/2024" "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 2bda8a5..5b7f9b0 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-transcend-badblock.1 b/Documentation/nvme-transcend-badblock.1
index b3e07b2..ac520bb 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-TRANSCEND\-BAD" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TRANSCEND\-BAD" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-transcend-badblock.html b/Documentation/nvme-transcend-badblock.html
index 35dc9f7..1e7dcca 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-transcend-healthvalue.1 b/Documentation/nvme-transcend-healthvalue.1
index 1176227..00ffd98 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-TRANSCEND\-HEA" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-TRANSCEND\-HEA" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-transcend-healthvalue.html b/Documentation/nvme-transcend-healthvalue.html
index 7fb219e..d96fb4a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-verify.1 b/Documentation/nvme-verify.1
index 3976dba..b748619 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-VERIFY" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-VERIFY" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-verify.html b/Documentation/nvme-verify.html
index 55fc404..4702552 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 97b97ae..8b17025 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-VIRTIUM\-SAVE\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-VIRTIUM\-SAVE\" "1" "10/31/2024" "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 7cec516..aa8f3a0 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-virtium-show-identify.1 b/Documentation/nvme-virtium-show-identify.1
index e0ba64a..aaf0985 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-VIRTIUM\-SHOW\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-VIRTIUM\-SHOW\" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-virtium-show-identify.html b/Documentation/nvme-virtium-show-identify.html
index 8c1fa91..69a8531 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-cap-diag.1 b/Documentation/nvme-wdc-cap-diag.1
index bada9e4..696c4f3 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-CAP\-DIAG" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CAP\-DIAG" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-cap-diag.html b/Documentation/nvme-wdc-cap-diag.html
index aa5cbcc..59d7333 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-capabilities.1 b/Documentation/nvme-wdc-capabilities.1
index 593b550..37ce4f0 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-CAPABILIT" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CAPABILIT" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-capabilities.html b/Documentation/nvme-wdc-capabilities.html
index 63b7f13..ed5f430 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-clear-assert-dump.1 b/Documentation/nvme-wdc-clear-assert-dump.1
index b288423..b332c20 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-CLEAR\-AS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLEAR\-AS" "1" "10/31/2024" "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 8aff843..1bfacbc 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 60f3a5a..63cd477 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-CLEAR\-FW" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLEAR\-FW" "1" "10/31/2024" "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 c5fff27..ed0aa7a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 9502196..64b3c9a 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-CLEAR\-PC" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLEAR\-PC" "1" "10/31/2024" "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 40db2f3..161b002 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 4e937ec..7928060 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-CLOUD\-SS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLOUD\-SS" "1" "10/31/2024" "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 c86e293..baccafb 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 8292946..fc4c7d3 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-CLOUD\-BO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-CLOUD\-BO" "1" "10/31/2024" "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 7e5ee04..9a7c972 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-drive-essentials.1 b/Documentation/nvme-wdc-drive-essentials.1
index b1170b5..8b582a7 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-DRIVE\-ES" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-DRIVE\-ES" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-drive-essentials.html b/Documentation/nvme-wdc-drive-essentials.html
index 150a798..8bd99f4 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-drive-log.1 b/Documentation/nvme-wdc-drive-log.1
index c212685..33af818 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-DRIVE\-LO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-DRIVE\-LO" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-drive-log.html b/Documentation/nvme-wdc-drive-log.html
index b487ffe..7bdc9be 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-drive-resize.1 b/Documentation/nvme-wdc-drive-resize.1
index 2846206..abe43f6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-DRIVE\-RE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-DRIVE\-RE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-drive-resize.html b/Documentation/nvme-wdc-drive-resize.html
index ec09963..edc448f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-enc-get-log.1 b/Documentation/nvme-wdc-enc-get-log.1
index d265788..ccb8e2c 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-ENC\-GET\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-ENC\-GET\" "1" "10/31/2024" "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 cccb2ef..b8ddbae 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-get-crash-dump.1 b/Documentation/nvme-wdc-get-crash-dump.1
index 67d6f61..63e7a2b 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-GET\-CRAS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-CRAS" "1" "10/31/2024" "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 fc10120..9746926 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 b897701..b9ad1bc 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-GET\-DEV\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-DEV\" "1" "10/31/2024" "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 7b363cf..a82a8a7 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-get-drive-status.1 b/Documentation/nvme-wdc-get-drive-status.1
index 9151029..23584ec 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-GET\-DRIV" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-DRIV" "1" "10/31/2024" "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 849c359..2bc68ed 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 59c10e7..af3c8d7 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-GET\-ERRO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-ERRO" "1" "10/31/2024" "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 6f3f4b6..99cdcb5 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 04e226a..f13884d 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-GET\-LATE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-LATE" "1" "10/31/2024" "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 9d52038..f48e7fa 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-get-pfail-dump.1 b/Documentation/nvme-wdc-get-pfail-dump.1
index c8a9160..a407732 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-GET\-PFAI" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-PFAI" "1" "10/31/2024" "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 a015d7e..9e982bc 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 87c55c3..7f93b78 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-GET\-UNSU" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-GET\-UNSU" "1" "10/31/2024" "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 c0a4a7c..ccdf5a6 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-id-ctrl.1 b/Documentation/nvme-wdc-id-ctrl.1
index ea99a19..7582e1c 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-ID\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-id-ctrl.html b/Documentation/nvme-wdc-id-ctrl.html
index 4722bb4..d24b6d3 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-log-page-directory.1 b/Documentation/nvme-wdc-log-page-directory.1
index ca8d145..ed68050 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-LOG\-PAGE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-LOG\-PAGE" "1" "10/31/2024" "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 9e46ff5..4e7728a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-namespace-resize.1 b/Documentation/nvme-wdc-namespace-resize.1
index 5b24e08..dfe6550 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-NAMESPACE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-NAMESPACE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-namespace-resize.html b/Documentation/nvme-wdc-namespace-resize.html
index 3820177..694138e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-purge-monitor.1 b/Documentation/nvme-wdc-purge-monitor.1
index 4086355..353b690 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-PURGE\-MO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-PURGE\-MO" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-purge-monitor.html b/Documentation/nvme-wdc-purge-monitor.html
index 1dedc96..7bda2ad 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-purge.1 b/Documentation/nvme-wdc-purge.1
index 915c31e..67aef17 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-PURGE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-PURGE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-wdc-purge.html b/Documentation/nvme-wdc-purge.html
index e42c43f..1ddff04 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-vs-cloud-log.1 b/Documentation/nvme-wdc-vs-cloud-log.1
index d691bde..67afd04 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-CLOUD" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-CLOUD" "1" "10/31/2024" "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 cdce8db..9b7ae1a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-vs-device-waf.1 b/Documentation/nvme-wdc-vs-device-waf.1
index 20cf75e..33e1834 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-DEVIC" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-DEVIC" "1" "10/31/2024" "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 a476b30..a96784f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-vs-drive-info.1 b/Documentation/nvme-wdc-vs-drive-info.1
index d4e87e7..375ac29 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-DRIVE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-DRIVE" "1" "10/31/2024" "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 b4730f0..6a8fca3 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 f75f9b5..5e1808c 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-ERROR" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-ERROR" "1" "10/31/2024" "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 551e6cb..efb7800 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 85156f4..f5f66f6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-FW\-A" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-FW\-A" "1" "10/31/2024" "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 4db88c2..8e46a87 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 c512561..7e63b81 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-HW\-R" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-HW\-R" "1" "10/31/2024" "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 1490e00..69db3de 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-vs-internal-log.1 b/Documentation/nvme-wdc-vs-internal-log.1
index 0809fac..ed338ad 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-INTER" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-INTER" "1" "10/31/2024" "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 6726a2e..9d81655 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-vs-nand-stats.1 b/Documentation/nvme-wdc-vs-nand-stats.1
index 10be9b8..327b06d 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-NAND\" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-NAND\" "1" "10/31/2024" "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 99ad282..453b602 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 40be6af..100628d 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-SMART" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-SMART" "1" "10/31/2024" "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 cc20c60..190cd46 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 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 a908eb9..e6b5e07 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-TELEM" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-TELEM" "1" "10/31/2024" "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 c20eece..8432d5d 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-wdc-vs-temperature-stats.1 b/Documentation/nvme-wdc-vs-temperature-stats.1
index 6d06543..e363abc 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WDC\-VS\-TEMPE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WDC\-VS\-TEMPE" "1" "10/31/2024" "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 6f64f23..273bb7e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-write-uncor.1 b/Documentation/nvme-write-uncor.1
index f08676c..426f210 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-UNCOR" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-UNCOR" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-write-uncor.html b/Documentation/nvme-write-uncor.html
index 3af998e..4c59b6a 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-write-zeroes.1 b/Documentation/nvme-write-zeroes.1
index c9eb175..7880eca 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WRITE\-ZEROES" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WRITE\-ZEROES" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-write-zeroes.html b/Documentation/nvme-write-zeroes.html
index 31bff4b..75edeea 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme-write-zeroes(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -1023,7 +1023,7 @@ metadata is passes.</p></td>
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-write.1 b/Documentation/nvme-write.1
index 234c7be..332f4c9 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-WRITE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-WRITE" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-write.html b/Documentation/nvme-write.html
index 91d02ad..8019c3e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-changed-zone-list.1 b/Documentation/nvme-zns-changed-zone-list.1
index c346900..d535898 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-CHANGED\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-CHANGED\-" "1" "10/31/2024" "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 686faae..e4219c9 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-close-zone.1 b/Documentation/nvme-zns-close-zone.1
index 7c6641c..52ca2d3 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-CLOSE\-ZO" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-close-zone.html b/Documentation/nvme-zns-close-zone.html
index 665aba2..adef16b 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-finish-zone.1 b/Documentation/nvme-zns-finish-zone.1
index 785aac4..c4ebf76 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-FINISH\-Z" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-FINISH\-Z" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-finish-zone.html b/Documentation/nvme-zns-finish-zone.html
index 677ea0d..0dd18ff 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-id-ctrl.1 b/Documentation/nvme-zns-id-ctrl.1
index e989341..75d17d6 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-ID\-CTRL" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ID\-CTRL" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-id-ctrl.html b/Documentation/nvme-zns-id-ctrl.html
index 74574bc..4395bd0 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-id-ns.1 b/Documentation/nvme-zns-id-ns.1
index 00853b5..c780325 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-ID\-NS" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ID\-NS" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-id-ns.html b/Documentation/nvme-zns-id-ns.html
index 9763f14..84220a2 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-offline-zone.1 b/Documentation/nvme-zns-offline-zone.1
index a0d1ce5..80ca32a 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-OFFLINE\-" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-OFFLINE\-" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-offline-zone.html b/Documentation/nvme-zns-offline-zone.html
index 1bf32cc..f5367f5 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-open-zone.1 b/Documentation/nvme-zns-open-zone.1
index 26d933e..c0e8f50 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-OPEN\-ZON" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-OPEN\-ZON" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-open-zone.html b/Documentation/nvme-zns-open-zone.html
index 2b9ebbb..d5aad26 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-report-zones.1 b/Documentation/nvme-zns-report-zones.1
index 35a1008..1ae1eea 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-REPORT\-Z" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-REPORT\-Z" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-report-zones.html b/Documentation/nvme-zns-report-zones.html
index 2c2460b..652aa2f 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-reset-zone.1 b/Documentation/nvme-zns-reset-zone.1
index b84fe83..357486d 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-RESET\-ZO" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-RESET\-ZO" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-reset-zone.html b/Documentation/nvme-zns-reset-zone.html
index 2d9434b..2a21a7e 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-set-zone-desc.1 b/Documentation/nvme-zns-set-zone-desc.1
index b501734..58c2b1f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-SET\-ZONE" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-SET\-ZONE" "1" "10/31/2024" "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 b21f0ba..e79ecf9 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-zone-append.1 b/Documentation/nvme-zns-zone-append.1
index 3d92160..abee69d 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-ZONE\-APP" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ZONE\-APP" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
diff --git a/Documentation/nvme-zns-zone-append.html b/Documentation/nvme-zns-zone-append.html
index eb88ccf..b21ae62 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-zone-mgmt-recv.1 b/Documentation/nvme-zns-zone-mgmt-recv.1
index 91bb3fb..2713a1f 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-ZONE\-MGM" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ZONE\-MGM" "1" "10/31/2024" "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 26561b7..ec99011 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme-zns-zone-mgmt-send.1 b/Documentation/nvme-zns-zone-mgmt-send.1
index aa382ac..25442eb 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME\-ZNS\-ZONE\-MGM" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME\-ZNS\-ZONE\-MGM" "1" "10/31/2024" "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 f007e2f..4b531f0 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<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-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/Documentation/nvme.1 b/Documentation/nvme.1
index a11021d..c6a07b8 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: 08/05/2024
+.\" Date: 10/31/2024
.\" Manual: NVMe Manual
.\" Source: NVMe
.\" Language: English
.\"
-.TH "NVME" "1" "08/05/2024" "NVMe" "NVMe Manual"
+.TH "NVME" "1" "10/31/2024" "NVMe" "NVMe Manual"
.\" -----------------------------------------------------------------
.\" * Define some portability stuff
.\" -----------------------------------------------------------------
@@ -858,6 +858,11 @@ Flush LBAs associated with a ZRWA to a zone
.RS 4
NVMe Inspur Device Vendor log page request
.RE
+.PP
+\fBnvme-dapustor-smart-log-add\fR(1)
+.RS 4
+NVMe DapuStor Additional SMART log page
+.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 990d618..5c7b2f6 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.0" />
+<meta name="generator" content="AsciiDoc 10.2.1" />
<title>nvme(1)</title>
<style type="text/css">
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */
@@ -2079,6 +2079,14 @@ available, run "nvme help".</p></div>
NVMe Inspur Device Vendor log page request
</p>
</dd>
+<dt class="hdlist1">
+<a href="nvme-dapustor-smart-log-add.html">nvme-dapustor-smart-log-add(1)</a>
+</dt>
+<dd>
+<p>
+ NVMe DapuStor Additional SMART log page
+</p>
+</dd>
</dl></div>
</div>
</div>
@@ -2122,7 +2130,7 @@ NVM-Express Site</a>.</p></div>
<div id="footer">
<div id="footer-text">
Last updated
- 2024-08-05 15:42:22 CEST
+ 2024-10-31 10:38:40 CET
</div>
</div>
</body>
diff --git a/completions/_nvme b/completions/_nvme
index 47fdd9d..f34b36b 100644
--- a/completions/_nvme
+++ b/completions/_nvme
@@ -113,6 +113,7 @@ _nvme () {
'ocp:OCP cloud SSD extensions'
'solidigm:Solidigm plug-in extensions'
'micron:Micron plug-in extensions'
+ 'dapustor:DapuStor plug-in extensions'
'help:print brief descriptions of all nvme commands'
'json:dump output in json format'
)
@@ -358,6 +359,33 @@ _nvme () {
_arguments '*:: :->subcmds'
_describe -t commands "nvme ocp set-error-injection options" _set_error_injection
;;
+ (hardware-component-log)
+ local _hardware_component_log
+ _hardware_component_log=(
+ /dev/nvme':supply a device to use (required)'
+ --comp-id=':component identifier'
+ -i':alias for --comp-id'
+ --list':list component descriptions'
+ -v':alias for --list'
+ --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 ocp hardware-component-log options" _hardware_component_log
+ (set-telemetry-profile)
+ local _ocp_set_telemetry_profile_feature
+ _ocp_set_telemetry_profile_feature=(
+ /dev/nvme':supply a device to use (required)'
+ --telemetry-profile-select=':Telemetry Profile Select'
+ -t':alias for --telemetry-profile-select'
+ )
+ _arguments '*:: :->subcmds'
+ _describe -t commands "nvme ocp set-telemetry-profile options" _ocp_set_telemetry_profile_feature
+ ;;
(*)
_files
;;
@@ -533,15 +561,56 @@ _nvme () {
_arguments '*:: :->subcmds'
_describe -t commands "nvme solidigm vs-drive-info" _vs_drive_info
;;
- (set-telemetry-profile)
- local _ocp_set_telemetry_profile_feature
- _ocp_set_telemetry_profile_feature=(
- /dev/nvme':supply a device to use (required)'
- --telemetry-profile-select=':Telemetry Profile Select'
- -t':alias for --telemetry-profile-select'
+ (workload-tracker)
+ local _workload_tracker
+ _workload_tracker=(
+ --enable':Enable Workload Tracker'
+ -e':alias for --enable'
+ --disable':Disable Workload Tracker'
+ -d':alias for --disable'
+ --sample-time=':Sample time in seconds'
+ -s':alias for --sample-time'
+ --type=':Workload Tracker type'
+ -t':alias for --type'
+ --run-time=':Run time in seconds'
+ -r':alias for --run-time'
+ --flush-freq=':Flush frequency in seconds'
+ -f':alias for --flush-freq'
+ --wall-clock':Use wall clock time'
+ -w':alias for --wall-clock'
+ --trigger-field=':Trigger field'
+ -T':alias for --trigger-field'
+ --trigger-threshold=':Trigger threshold'
+ -V':alias for --trigger-threshold'
+ --trigger-on-delta':Trigger on delta'
+ -D':alias for --trigger-on-delta'
+ --trigger-on-latency':Trigger on latency'
+ -L':alias for --trigger-on-latency'
+ --verbose':Increase output verbosity'
+ -v':alias for --verbose'
)
_arguments '*:: :->subcmds'
- _describe -t commands "nvme ocp set-telemetry-profile options" _ocp_set_telemetry_profile_feature
+ _describe -t commands "nvme solidigm workload-tracker options" _workload_tracker
+ ;;
+ (*)
+ _files
+ ;;
+ esac
+ ;;
+ (dapustor)
+ case ${words[2]} in
+ (smart-log-add)
+ local _smart_log_add
+ _smart_log_add=(
+ --namespace-id':(optional) desired namespace'
+ -n':alias for --namespace-id'
+ --output-format':Output format: normal|json|binary'
+ -o':alias for --output-format'
+ --raw-binary':dump log in binary format'
+ -b':alias of --raw-binary'
+ )
+ _arguments '*:: :->subcmds'
+ _describe -t commands "nvme dapustor smart-log-add options" _smart_log_add
;;
(*)
_files
@@ -1176,6 +1245,10 @@ _nvme () {
-b':alias to --raw-binary'
--timeout=':value for timeout'
-t':alias of --timeout'
+ --human-readable':show feature in readable format'
+ -H':alias of --human-readable'
+ --changed':show feature changed'
+ -C':alias of --changed'
)
_arguments '*:: :->subcmds'
_describe -t commands "nvme get-feature options" _getf
@@ -1452,10 +1525,12 @@ _nvme () {
-n':alias of --owpass'
--ause':Allow unrestricted sanitize exit'
-u':alias of --ause'
- --sanact=':Sanitize action: 1 = Exit failure mode, 2 = Start block erase, 3 = Start overwrite, 4 = Start crypto erase'
+ --sanact=':Sanitize action: 1 = Exit failure mode, 2 = Start block erase, 3 = Start overwrite, 4 = Start crypto erase, 5 = Exit media verification'
-a':alias of --sanact'
--ovrpat=':Overwrite pattern'
-p':alias of --ovrpat'
+ --emvs=':Enter media verification state'
+ -e':alias of --emvs'
)
_arguments '*:: :->subcmds'
_describe -t commands "nvme sanitize options" _sanitize
@@ -2562,6 +2637,7 @@ _nvme () {
tcg-configuration-log':tcg configuration log'
get-error-injection':get error injection'
set-error-injection':set error injection'
+ hardware-component-log':retrieve hardware component log'
)
_arguments '*:: :->subcmds'
_describe -t commands "nvme ocp options" _ocp
@@ -2583,6 +2659,7 @@ _nvme () {
log-page-directory':Retrieve log page directory'
temp-stats':Retrieve Temperature Statistics log'
vs-drive-info':Retrieve drive information'
+ workload-tracker':Enable/Disable and configure Workload Tracker'
cloud-SSDplugin-version':Prints plug-in OCP version'
version':Shows the program version'
help':Display this help'
@@ -2618,6 +2695,16 @@ _nvme () {
_arguments '*:: :->subcmds'
_describe -t commands "nvme micron options" _micron
;;
+ (dapustor)
+ local _dapustor
+ _dapustor=(
+ smart-log-add':Retrieve DapuStor SMART Log'
+ version':Shows the program version'
+ help':Display this help'
+ )
+ _arguments '*:: :->subcmds'
+ _describe -t commands "nvme dapustor options" _dapustor
+ ;;
(help)
local _h
_h=( id-ctrl id-ns list-ns id-iocs create-ns delete-ns attach-ns detach-ns
@@ -2635,7 +2722,7 @@ _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
+ dir-send virt-mgmt rpmb version ocp solidigm dapustor
)
_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 9e2e277..a6c6f42 100644
--- a/completions/bash-nvme-completion.sh
+++ b/completions/bash-nvme-completion.sh
@@ -205,7 +205,7 @@ nvme_list_opts () {
"get-feature")
opts+=" --namespace-id= -n --feature-id= -f --sel= -s \
--data-len= -l --cdw11= --c -uuid-index= -U --raw-binary -b \
- --human-readable -H --timeout= -t"
+ --human-readable -H --timeout= -t --changed -C"
;;
"device-self-test")
opts+=" --namespace-id= -n --self-test-code= -s --timeout= -t"
@@ -356,10 +356,11 @@ nvme_list_opts () {
;;
"sanitize")
opts+=" --no-dealloc -d --oipbp -i --owpass= -n \
- --ause -u --sanact= -a --ovrpat= -p"
+ --ause -u --sanact= -a --ovrpat= -p --emvs= -e"
case $opt in
--sanact|-a)
- vals+=" exit-failure start-block-erase start-overwrite start-crypto-erase"
+ vals+=" exit-failure start-block-erase start-overwrite \
+ start-crypto-erase exit-media-verification"
;;
esac
;;
@@ -1181,6 +1182,13 @@ plugin_solidigm_opts () {
"temp-stats")
opts+=" --raw-binary -b"
;;
+ "workload-tracker")
+ opts+=" --enable -e --disable -d --sample-time= -s \
+ --type= -t --run-time= -r --flush-freq= -f \
+ --wall-clock -w --trigger-field= -T \
+ --trigger-threshold= -V --trigger-on-delta -D \
+ --trigger-on-latency -L --verbose -v"
+ ;;
"version")
opts+=$NO_OPTS
;;
@@ -1228,6 +1236,38 @@ plugin_transcend_opts () {
return 0
}
+plugin_dapustor_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
+ "smart-log-add")
+ opts+=" --namespace-id= -n --raw-binary -b \
+ --json -j"
+ ;;
+ "help")
+ opts+=$NO_OPTS
+ ;;
+ esac
+
+ COMPREPLY+=( $( compgen $compargs -W "$opts" -- $cur ) )
+
+ return 0
+}
+
plugin_zns_opts () {
local opts=""
local compargs=""
@@ -1491,6 +1531,10 @@ plugin_ocp_opts () {
opts+=" --data= -d --number= -n --no-uuid -N --type= -t \
--nrtdp= -r --verbose -v --output-format -o --timeout="
;;
+ "hardware-component-log")
+ opts+=" --comp-id= -i --list -l --verbose -v \
+ --output-format -o --timeout= -t"
+ ;;
"help")
opts+=$NO_OPTS
;;
@@ -1552,8 +1596,9 @@ _nvme_subcmds () {
clear-pcie-correctable-errors parse-telemetry-log \
clear-fw-activate-history vs-fw-activate-history log-page-directory \
vs-drive-info cloud-SSDplugin-version market-log \
- smart-log-add temp-stats version help"
+ smart-log-add temp-stats workload-tracker version help"
[transcend]="healthvalue badblock"
+ [dapustor]="smart-log-add"
[zns]="id-ctrl id-ns zone-mgmt-recv \
zone-mgmt-send report-zones close-zone \
finish-zone open-zone reset-zone offline-zone \
@@ -1569,7 +1614,8 @@ _nvme_subcmds () {
set-dssd-power-state-feature get-dssd-power-state-feature \
telemetry-string-log set-telemetry-profile \
set-dssd-async-event-config get-dssd-async-event-config \
- get-error-injection set-error-injection"
+ get-error-injection set-error-injection \
+ hardware-component-log"
)
# Associative array mapping plugins to corresponding option completions
@@ -1588,6 +1634,7 @@ _nvme_subcmds () {
[sfx]="plugin_sfx_opts"
[solidigm]="plugin_solidigm_opts"
[transcend]="plugin_transcend_opts"
+ [dapustor]="plugin_dapustor_opts"
[zns]="plugin_zns_opts"
[nvidia]="plugin_nvidia_opts"
[ymtc]="plugin_ymtc_opts"
diff --git a/fabrics.c b/fabrics.c
index db1b7cb..eb90d98 100644
--- a/fabrics.c
+++ b/fabrics.c
@@ -81,8 +81,10 @@ static const char *nvmf_reconnect_delay = "reconnect timeout period in seconds";
static const char *nvmf_ctrl_loss_tmo = "controller loss timeout period in seconds";
static const char *nvmf_fast_io_fail_tmo = "fast I/O fail timeout (default off)";
static const char *nvmf_tos = "type of service";
-static const char *nvmf_keyring = "Keyring for TLS key lookup";
-static const char *nvmf_tls_key = "TLS key to use";
+static const char *nvmf_keyring = "Keyring for TLS key lookup (key id or keyring name)";
+static const char *nvmf_tls_key = "TLS key to use (key id or key in interchange format)";
+static const char *nvmf_tls_key_legacy = "TLS key to use (key id)";
+static const char *nvmf_tls_key_identity = "TLS key identity";
static const char *nvmf_dup_connect = "allow duplicate connections between same transport host and subsystem port";
static const char *nvmf_disable_sqflow = "disable controller sq flow control (default false)";
static const char *nvmf_hdr_digest = "enable transport protocol header digest (TCP transport)";
@@ -103,6 +105,9 @@ static const char *nvmf_context = "execution context identification string";
OPT_STRING("hostnqn", 'q', "STR", &hostnqn, nvmf_hostnqn), \
OPT_STRING("hostid", 'I', "STR", &hostid, nvmf_hostid), \
OPT_STRING("dhchap-secret", 'S', "STR", &hostkey, nvmf_hostkey), \
+ OPT_STRING("keyring", 0, "STR", &keyring, nvmf_keyring), \
+ OPT_STRING("tls-key", 0, "STR", &tls_key, nvmf_tls_key), \
+ OPT_STRING("tls-key-identity", 0, "STR", &tls_key_identity, nvmf_tls_key_identity), \
OPT_INT("nr-io-queues", 'i', &c.nr_io_queues, nvmf_nr_io_queues), \
OPT_INT("nr-write-queues", 'W', &c.nr_write_queues, nvmf_nr_write_queues), \
OPT_INT("nr-poll-queues", 'P', &c.nr_poll_queues, nvmf_nr_poll_queues), \
@@ -112,8 +117,7 @@ static const char *nvmf_context = "execution context identification string";
OPT_INT("ctrl-loss-tmo", 'l', &c.ctrl_loss_tmo, nvmf_ctrl_loss_tmo), \
OPT_INT("fast_io_fail_tmo", 'F', &c.fast_io_fail_tmo, nvmf_fast_io_fail_tmo),\
OPT_INT("tos", 'T', &c.tos, nvmf_tos), \
- OPT_INT("keyring", 0, &c.keyring, nvmf_keyring), \
- OPT_INT("tls_key", 0, &c.tls_key, nvmf_tls_key), \
+ OPT_INT("tls_key", 0, &c.tls_key, nvmf_tls_key_legacy), \
OPT_FLAG("duplicate-connect", 'D', &c.duplicate_connect, nvmf_dup_connect), \
OPT_FLAG("disable-sqflow", 0, &c.disable_sqflow, nvmf_disable_sqflow), \
OPT_FLAG("hdr-digest", 'g', &c.hdr_digest, nvmf_hdr_digest), \
@@ -407,7 +411,8 @@ static int discover_from_conf_file(nvme_root_t r, nvme_host_t h,
{
char *transport = NULL, *traddr = NULL, *trsvcid = NULL;
char *hostnqn = NULL, *hostid = NULL, *hostkey = NULL;
- char *subsysnqn = NULL;
+ char *subsysnqn = NULL, *keyring = NULL, *tls_key = NULL;
+ char *tls_key_identity = NULL;
char *ptr, **argv, *p, line[4096];
int argc, ret = 0;
unsigned int verbose = 0;
@@ -669,8 +674,8 @@ static int nvme_read_volatile_config(nvme_root_t r)
static int nvme_read_config_checked(nvme_root_t r, const char *filename)
{
- if (!access(filename, F_OK))
- return -ENOENT;
+ if (access(filename, F_OK))
+ return -errno;
if (nvme_read_config(r, filename))
return -errno;
return 0;
@@ -681,6 +686,8 @@ int nvmf_discover(const char *desc, int argc, char **argv, bool connect)
char *subsysnqn = NVME_DISC_SUBSYS_NAME;
char *hostnqn = NULL, *hostid = NULL, *hostkey = NULL;
char *transport = NULL, *traddr = NULL, *trsvcid = NULL;
+ char *keyring = NULL, *tls_key = NULL;
+ char *tls_key_identity = NULL;
char *config_file = PATH_NVMF_CONFIG;
_cleanup_free_ char *hnqn = NULL;
_cleanup_free_ char *hid = NULL;
@@ -886,15 +893,93 @@ out_free:
return ret;
}
+static int nvme_connect_config(nvme_root_t r, const char *hostnqn, const char *hostid,
+ const struct nvme_fabrics_config *cfg)
+{
+ const char *hnqn, *hid;
+ const char *transport;
+ nvme_host_t h;
+ nvme_subsystem_t s;
+ nvme_ctrl_t c, _c;
+ int ret = 0, err;
+
+ nvme_for_each_host(r, h) {
+ nvme_for_each_subsystem(h, s) {
+ hnqn = nvme_host_get_hostnqn(h);
+ if (hostnqn && hnqn && strcmp(hostnqn, hnqn))
+ continue;
+ hid = nvme_host_get_hostid(h);
+ if (hostid && hid && strcmp(hostid, hid))
+ continue;
+
+ nvme_subsystem_for_each_ctrl_safe(s, c, _c) {
+ transport = nvme_ctrl_get_transport(c);
+
+ /* ignore none fabric transports */
+ if (strcmp(transport, "tcp") &&
+ strcmp(transport, "rdma") &&
+ strcmp(transport, "fc"))
+ continue;
+
+ err = nvmf_connect_ctrl(c);
+ if (err) {
+ if (errno == ENVME_CONNECT_ALREADY)
+ continue;
+
+ fprintf(stderr,
+ "failed to connect to hostnqn=%s,nqn=%s,%s\n",
+ nvme_host_get_hostnqn(h),
+ nvme_subsystem_get_name(s),
+ nvme_ctrl_get_address(c));
+
+ if (!ret)
+ ret = err;
+ }
+ }
+ }
+ }
+
+ return ret;
+}
+
+static void nvme_parse_tls_args(const char *keyring, const char *tls_key,
+ const char *tls_key_identity,
+ struct nvme_fabrics_config *cfg, nvme_ctrl_t c)
+{
+ if (keyring) {
+ char *endptr;
+ long id = strtol(keyring, &endptr, 0);
+
+ if (endptr != keyring)
+ cfg->keyring = id;
+ else
+ nvme_ctrl_set_keyring(c, keyring);
+ }
+
+ if (tls_key_identity)
+ nvme_ctrl_set_tls_key_identity(c, tls_key_identity);
+
+ if (tls_key) {
+ char *endptr;
+ long id = strtol(tls_key, &endptr, 0);
+
+ if (endptr != tls_key)
+ cfg->tls_key = id;
+ else
+ nvme_ctrl_set_tls_key(c, tls_key);
+ }
+}
+
int nvmf_connect(const char *desc, int argc, char **argv)
{
char *subsysnqn = NULL;
char *transport = NULL, *traddr = NULL;
char *trsvcid = NULL, *hostnqn = NULL, *hostid = NULL;
- char *hostkey = NULL, *ctrlkey = NULL;
+ char *hostkey = NULL, *ctrlkey = NULL, *keyring = NULL;
+ char *tls_key = NULL, *tls_key_identity = NULL;
_cleanup_free_ char *hnqn = NULL;
_cleanup_free_ char *hid = NULL;
- char *config_file = PATH_NVMF_CONFIG;
+ char *config_file = NULL;
char *context = NULL;
unsigned int verbose = 0;
_cleanup_nvme_root_ nvme_root_t r = NULL;
@@ -905,7 +990,6 @@ int nvmf_connect(const char *desc, int argc, char **argv)
struct nvme_fabrics_config cfg = { 0 };
char *format = "normal";
-
NVMF_ARGS(opts, cfg,
OPT_STRING("dhchap-ctrl-secret", 'C', "STR", &ctrlkey, nvmf_ctrlkey),
OPT_STRING("config", 'J', "FILE", &config_file, nvmf_config_file),
@@ -926,6 +1010,9 @@ int nvmf_connect(const char *desc, int argc, char **argv)
return ret;
}
+ if (config_file && strcmp(config_file, "none"))
+ goto do_connect;
+
if (!subsysnqn) {
fprintf(stderr,
"required argument [--nqn | -n] not specified\n");
@@ -947,9 +1034,7 @@ int nvmf_connect(const char *desc, int argc, char **argv)
}
}
- if (!strcmp(config_file, "none"))
- config_file = NULL;
-
+do_connect:
log_level = map_log_level(verbose, quiet);
r = nvme_create_root(stderr, log_level);
@@ -986,6 +1071,9 @@ int nvmf_connect(const char *desc, int argc, char **argv)
if (!trsvcid)
trsvcid = nvmf_get_default_trsvcid(transport, false);
+ if (config_file)
+ return nvme_connect_config(r, hostnqn, hostid, &cfg);
+
struct tr_config trcfg = {
.subsysnqn = subsysnqn,
.transport = transport,
@@ -1008,9 +1096,12 @@ int nvmf_connect(const char *desc, int argc, char **argv)
errno = ENOMEM;
goto out_free;
}
+
if (ctrlkey)
nvme_ctrl_set_dhchap_key(c, ctrlkey);
+ nvme_parse_tls_args(keyring, tls_key, tls_key_identity, &cfg, c);
+
errno = 0;
ret = nvmf_add_ctrl(h, c, &cfg);
if (ret)
@@ -1233,6 +1324,7 @@ int nvmf_config(const char *desc, int argc, char **argv)
_cleanup_free_ char *hnqn = NULL;
_cleanup_free_ char *hid = NULL;
char *hostkey = NULL, *ctrlkey = NULL;
+ char *keyring = NULL, *tls_key = NULL, *tls_key_identity = NULL;
char *config_file = PATH_NVMF_CONFIG;
unsigned int verbose = 0;
_cleanup_nvme_root_ nvme_root_t r = NULL;
@@ -1322,9 +1414,11 @@ int nvmf_config(const char *desc, int argc, char **argv)
nvme_strerror(errno));
return -errno;
}
- nvmf_update_config(c, &cfg);
if (ctrlkey)
nvme_ctrl_set_dhchap_key(c, ctrlkey);
+ nvme_parse_tls_args(keyring, tls_key, tls_key_identity, &cfg, c);
+
+ nvmf_update_config(c, &cfg);
}
if (update_config)
diff --git a/meson.build b/meson.build
index 48b271d..0a9f690 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.10.2',
+ version: '2.11',
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.10', required: true,
+libnvme_dep = dependency('libnvme', version: '>=1.11', required: true,
fallback : ['libnvme', 'libnvme_dep'])
libnvme_mi_dep = dependency('libnvme-mi', required: true,
fallback : ['libnvme', 'libnvme_mi_dep'])
@@ -252,6 +252,7 @@ endforeach
udev_files = [
'65-persistent-net-nbft.rules',
'70-nvmf-autoconnect.rules',
+ '70-nvmf-keys.rules',
'71-nvmf-netapp.rules',
]
diff --git a/nvme-print-json.c b/nvme-print-json.c
index 6c3e45f..412eb20 100644
--- a/nvme-print-json.c
+++ b/nvme-print-json.c
@@ -25,7 +25,6 @@
#define obj_add_array json_object_add_value_array
#define obj_add_int json_object_add_value_int
#define obj_add_obj json_object_add_value_object
-#define obj_add_str json_object_add_value_string
#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
@@ -75,7 +74,7 @@ static void obj_add_uint_x(struct json_object *o, const char *k, __u32 v)
obj_add_str(o, k, str);
}
-static void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v)
+void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v)
{
char str[STR_LEN];
@@ -83,15 +82,15 @@ static void obj_add_uint_0x(struct json_object *o, const char *k, __u32 v)
obj_add_str(o, k, str);
}
-static void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width)
+void obj_add_uint_0nx(struct json_object *o, const char *k, __u32 v, int width)
{
char str[STR_LEN];
- sprintf(str, "0x%02x", v);
+ sprintf(str, "0x%0*x", width, v);
obj_add_str(o, k, str);
}
-static void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v)
+void obj_add_uint_02x(struct json_object *o, const char *k, __u32 v)
{
obj_add_uint_0nx(o, k, v, 2);
}
@@ -104,7 +103,7 @@ static void obj_add_uint_nx(struct json_object *o, const char *k, __u32 v)
obj_add_str(o, k, str);
}
-static void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v)
+void obj_add_nprix64(struct json_object *o, const char *k, uint64_t v)
{
char str[STR_LEN];
@@ -132,8 +131,9 @@ static void obj_add_result(struct json_object *o, const char *v, ...)
{
va_list ap;
+ _cleanup_free_ char *value = NULL;
+
va_start(ap, v);
- char *value;
if (vasprintf(&value, v, ap) < 0)
value = NULL;
@@ -144,15 +144,15 @@ static void obj_add_result(struct json_object *o, const char *v, ...)
obj_add_str(o, "Result", "Could not allocate string");
va_end(ap);
- free(value);
}
static void obj_add_key(struct json_object *o, const char *k, const char *v, ...)
{
va_list ap;
+ _cleanup_free_ char *value = NULL;
+
va_start(ap, v);
- char *value;
if (vasprintf(&value, v, ap) < 0)
value = NULL;
@@ -163,10 +163,9 @@ static void obj_add_key(struct json_object *o, const char *k, const char *v, ...
obj_add_str(o, k, "Could not allocate string");
va_end(ap);
- free(value);
}
-static struct json_object *obj_create_array_obj(struct json_object *o, const char *k)
+struct json_object *obj_create_array_obj(struct json_object *o, const char *k)
{
struct json_object *array = json_create_array();
struct json_object *obj = json_create_object();
@@ -191,7 +190,7 @@ static struct json_object *obj_create(const char *k)
return obj;
}
-static void json_print(struct json_object *r)
+void json_print(struct json_object *r)
{
json_print_object(r, NULL);
printf("\n");
@@ -204,11 +203,6 @@ static void obj_print(struct json_object *o)
json_print(o);
}
-static bool human(void)
-{
- return json_print_ops.flags & VERBOSE;
-}
-
static void json_id_iocs(struct nvme_id_iocs *iocs)
{
struct json_object *r = json_create_object();
@@ -400,6 +394,7 @@ void json_nvme_id_ctrl(struct nvme_id_ctrl *ctrl,
obj_add_uint(r, "pels", le32_to_cpu(ctrl->pels));
obj_add_int(r, "domainid", le16_to_cpu(ctrl->domainid));
obj_add_uint128(r, "megcap", megcap);
+ obj_add_int(r, "tmpthha", ctrl->tmpthha);
obj_add_int(r, "sqes", ctrl->sqes);
obj_add_int(r, "cqes", ctrl->cqes);
obj_add_int(r, "maxcmd", le16_to_cpu(ctrl->maxcmd));
@@ -474,8 +469,8 @@ static void json_error_log(struct nvme_error_log_page *err_log, int entries,
obj_add_uint64(error, "error_count", le64_to_cpu(err_log[i].error_count));
obj_add_int(error, "sqid", le16_to_cpu(err_log[i].sqid));
obj_add_int(error, "cmdid", le16_to_cpu(err_log[i].cmdid));
- obj_add_int(error, "status_field", le16_to_cpu(err_log[i].status_field >> 0x1));
- obj_add_int(error, "phase_tag", le16_to_cpu(err_log[i].status_field & 0x1));
+ obj_add_int(error, "status_field", le16_to_cpu(err_log[i].status_field) >> 0x1);
+ obj_add_int(error, "phase_tag", le16_to_cpu(err_log[i].status_field) & 0x1);
obj_add_int(error, "parm_error_location",
le16_to_cpu(err_log[i].parm_error_location));
obj_add_uint64(error, "lba", le64_to_cpu(err_log[i].lba));
@@ -669,21 +664,17 @@ static void json_smart_log(struct nvme_smart_log *smart, unsigned int nsid,
nvme_uint128_t media_errors = le128_to_cpu(smart->media_errors);
nvme_uint128_t num_err_log_entries = le128_to_cpu(smart->num_err_log_entries);
- if (human()) {
- struct json_object *crt = json_create_object();
+ struct json_object *crt = json_create_object();
- obj_add_int(crt, "value", smart->critical_warning);
- obj_add_int(crt, "available_spare", smart->critical_warning & 1);
- obj_add_int(crt, "temp_threshold", (smart->critical_warning & 2) >> 1);
- obj_add_int(crt, "reliability_degraded", (smart->critical_warning & 4) >> 2);
- obj_add_int(crt, "ro", (smart->critical_warning & 8) >> 3);
- obj_add_int(crt, "vmbu_failed", (smart->critical_warning & 0x10) >> 4);
- obj_add_int(crt, "pmr_ro", (smart->critical_warning & 0x20) >> 5);
+ obj_add_int(crt, "value", smart->critical_warning);
+ obj_add_int(crt, "available_spare", smart->critical_warning & 1);
+ obj_add_int(crt, "temp_threshold", (smart->critical_warning & 2) >> 1);
+ obj_add_int(crt, "reliability_degraded", (smart->critical_warning & 4) >> 2);
+ obj_add_int(crt, "ro", (smart->critical_warning & 8) >> 3);
+ obj_add_int(crt, "vmbu_failed", (smart->critical_warning & 0x10) >> 4);
+ obj_add_int(crt, "pmr_ro", (smart->critical_warning & 0x20) >> 5);
- obj_add_obj(r, "critical_warning", crt);
- } else {
- obj_add_int(r, "critical_warning", smart->critical_warning);
- }
+ obj_add_obj(r, "critical_warning", crt);
obj_add_int(r, "temperature", temperature);
obj_add_int(r, "avail_spare", smart->avail_spare);
@@ -853,6 +844,8 @@ static void json_registers_cap(struct nvme_bar_cap *cap, struct json_object *r)
sprintf(json_str, "%"PRIx64"", *(uint64_t *)cap);
obj_add_str(r, "cap", json_str);
+ obj_add_str(r, "NVM Subsystem Shutdown Enhancements Supported (NSSES)",
+ cap->nsses ? "Supported" : "Not supported");
obj_add_str(r, "Controller Ready With Media Support (CRWMS)",
cap->crwms ? "Supported" : "Not supported");
obj_add_str(r, "Controller Ready Independent of Media Support (CRIMS)",
@@ -1182,6 +1175,30 @@ static void json_registers_cmbsts(uint32_t cmbsts, struct json_object *r)
obj_add_uint_x(r, "Controller Base Address Invalid (CBAI)", cmbsts & 1);
}
+static void json_registers_cmbebs(uint32_t cmbebs, struct json_object *r)
+{
+ char buffer[BUF_LEN];
+
+ 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_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));
+}
+
+static void json_registers_cmbswtp(uint32_t cmbswtp, struct json_object *r)
+{
+ char str[STR_LEN];
+
+ 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_str(r, "CMB Sustained Write Throughput Units (CMBSWTU)", str);
+}
+
static void json_registers_pmrcap(uint32_t pmrcap, struct json_object *r)
{
obj_add_uint_x(r, "pmrcap", pmrcap);
@@ -1296,24 +1313,8 @@ static void json_single_property_human(int offset, uint64_t value64, struct json
static void json_single_property(int offset, uint64_t value64)
{
struct json_object *r = json_create_object();
- char json_str[STR_LEN];
- uint32_t value32 = (uint32_t)value64;
-
- if (human()) {
- json_single_property_human(offset, value64, r);
- } else {
- sprintf(json_str, "0x%02x", offset);
- obj_add_str(r, "property", json_str);
- obj_add_str(r, "name", nvme_register_to_string(offset));
-
- if (nvme_is_64bit_reg(offset))
- sprintf(json_str, "%"PRIx64"", value64);
- else
- sprintf(json_str, "%x", value32);
-
- obj_add_str(r, "value", json_str);
- }
+ json_single_property_human(offset, value64, r);
json_print(r);
}
@@ -1853,13 +1854,20 @@ static void json_lba_status(struct nvme_lba_status *list,
obj_add_uint(r, "Completion Condition (CMPC)", list->cmpc);
switch (list->cmpc) {
- case 1:
+ case NVME_LBA_STATUS_CMPC_NO_CMPC:
+ obj_add_str(r, "cmpc-definition", "No indication of the completion condition");
+ break;
+ case NVME_LBA_STATUS_CMPC_INCOMPLETE:
obj_add_str(r, "cmpc-definition",
- "Completed due to transferring the amount of data specified in the MNDW field");
+ "Completed transferring the amount of data specified in the"\
+ "MNDW field. But, additional LBA Status Descriptor Entries are"\
+ "available to transfer or scan did not complete (if ATYPE = 10h)");
break;
- case 2:
+ case NVME_LBA_STATUS_CMPC_COMPLETE:
obj_add_str(r, "cmpc-definition",
- "Completed due to having performed the action specified in the Action Type field over the number of logical blocks specified in the Range Length field");
+ "Completed the specified action over the number of LBAs specified"\
+ "in the Range Length field and transferred all available LBA Status"\
+ "Descriptor Entries");
break;
default:
break;
@@ -2077,10 +2085,11 @@ static void json_phy_rx_eom_descs(struct nvme_phy_rx_eom_log *log,
static void json_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controller)
{
- char **allocated_eyes = NULL;
int i;
struct json_object *r = json_create_object();
+ _cleanup_free_ char **allocated_eyes = NULL;
+
obj_add_uint(r, "lid", log->lid);
obj_add_uint(r, "eomip", log->eomip);
obj_add_uint(r, "hsize", le16_to_cpu(log->hsize));
@@ -2113,7 +2122,6 @@ static void json_phy_rx_eom_log(struct nvme_phy_rx_eom_log *log, __u16 controlle
if (allocated_eyes[i])
free(allocated_eyes[i]);
}
- free(allocated_eyes);
}
json_print(r);
@@ -2457,7 +2465,11 @@ static void json_print_nvme_subsystem_list(nvme_root_t r, bool show_ana)
subsystem_attrs = json_create_object();
obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s));
obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s));
- obj_add_str(subsystem_attrs, "IOPolicy", nvme_subsystem_get_iopolicy(s));
+
+ obj_add_str(subsystem_attrs, "IOPolicy",
+ nvme_subsystem_get_iopolicy(s));
+ obj_add_str(subsystem_attrs, "Type",
+ nvme_subsystem_get_type(s));
array_add_obj(subsystems, subsystem_attrs);
paths = json_create_array();
@@ -2478,120 +2490,84 @@ static void json_ctrl_registers_cap(void *bar, struct json_object *r)
{
uint64_t cap = mmio_read64(bar + NVME_REG_CAP);
- if (human())
- json_registers_cap((struct nvme_bar_cap *)&cap, obj_create_array_obj(r, "cap"));
- else
- obj_add_uint64(r, "cap", cap);
+ json_registers_cap((struct nvme_bar_cap *)&cap, obj_create_array_obj(r, "cap"));
}
static void json_ctrl_registers_vs(void *bar, struct json_object *r)
{
uint32_t vs = mmio_read32(bar + NVME_REG_VS);
- if (human())
- json_registers_version(vs, obj_create_array_obj(r, "vs"));
- else
- obj_add_int(r, "vs", vs);
+ json_registers_version(vs, obj_create_array_obj(r, "vs"));
}
static void json_ctrl_registers_intms(void *bar, struct json_object *r)
{
uint32_t intms = mmio_read32(bar + NVME_REG_INTMS);
- if (human())
- json_registers_intms(intms, obj_create_array_obj(r, "intms"));
- else
- obj_add_int(r, "intms", intms);
+ json_registers_intms(intms, obj_create_array_obj(r, "intms"));
}
static void json_ctrl_registers_intmc(void *bar, struct json_object *r)
{
uint32_t intmc = mmio_read32(bar + NVME_REG_INTMC);
- if (human())
- json_registers_intmc(intmc, obj_create_array_obj(r, "intmc"));
- else
- obj_add_int(r, "intmc", intmc);
+ json_registers_intmc(intmc, obj_create_array_obj(r, "intmc"));
}
static void json_ctrl_registers_cc(void *bar, struct json_object *r)
{
uint32_t cc = mmio_read32(bar + NVME_REG_CC);
- if (human())
- json_registers_cc(cc, obj_create_array_obj(r, "cc"));
- else
- obj_add_int(r, "cc", cc);
+ json_registers_cc(cc, obj_create_array_obj(r, "cc"));
}
static void json_ctrl_registers_csts(void *bar, struct json_object *r)
{
uint32_t csts = mmio_read32(bar + NVME_REG_CSTS);
- if (human())
- json_registers_csts(csts, obj_create_array_obj(r, "csts"));
- else
- obj_add_int(r, "csts", csts);
+ json_registers_csts(csts, obj_create_array_obj(r, "csts"));
}
static void json_ctrl_registers_nssr(void *bar, struct json_object *r)
{
uint32_t nssr = mmio_read32(bar + NVME_REG_NSSR);
- if (human())
- json_registers_nssr(nssr, obj_create_array_obj(r, "nssr"));
- else
- obj_add_int(r, "nssr", nssr);
+ json_registers_nssr(nssr, obj_create_array_obj(r, "nssr"));
}
static void json_ctrl_registers_nssd(void *bar, struct json_object *r)
{
uint32_t nssd = mmio_read32(bar + NVME_REG_NSSD);
- if (human())
- json_registers_nssd(nssd, obj_create_array_obj(r, "nssd"));
- else
- obj_add_int(r, "nssd", nssd);
+ json_registers_nssd(nssd, obj_create_array_obj(r, "nssd"));
}
static void json_ctrl_registers_crto(void *bar, struct json_object *r)
{
uint32_t crto = mmio_read32(bar + NVME_REG_CRTO);
- if (human())
- json_registers_crto(crto, obj_create_array_obj(r, "crto"));
- else
- obj_add_int(r, "crto", crto);
+ json_registers_crto(crto, obj_create_array_obj(r, "crto"));
}
static void json_ctrl_registers_aqa(void *bar, struct json_object *r)
{
uint32_t aqa = mmio_read32(bar + NVME_REG_AQA);
- if (human())
- json_registers_aqa(aqa, obj_create_array_obj(r, "aqa"));
- else
- obj_add_int(r, "aqa", aqa);
+ json_registers_aqa(aqa, obj_create_array_obj(r, "aqa"));
}
static void json_ctrl_registers_asq(void *bar, struct json_object *r)
{
uint64_t asq = mmio_read64(bar + NVME_REG_ASQ);
- if (human())
- json_registers_asq(asq, obj_create_array_obj(r, "asq"));
- else
- obj_add_uint64(r, "asq", asq);
+ json_registers_asq(asq, obj_create_array_obj(r, "asq"));
}
static void json_ctrl_registers_acq(void *bar, struct json_object *r)
{
uint64_t acq = mmio_read64(bar + NVME_REG_ACQ);
- if (human())
- json_registers_acq(acq, obj_create_array_obj(r, "acq"));
- else
- obj_add_uint64(r, "acq", acq);
+ json_registers_acq(acq, obj_create_array_obj(r, "acq"));
}
static void json_ctrl_registers_cmbloc(void *bar, struct json_object *r)
@@ -2600,93 +2576,79 @@ static void json_ctrl_registers_cmbloc(void *bar, struct json_object *r)
uint32_t cmbsz;
bool support;
- if (human()) {
- cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
- support = nvme_registers_cmbloc_support(cmbsz);
- json_registers_cmbloc(cmbloc, support, obj_create_array_obj(r, "cmbloc"));
- } else {
- obj_add_int(r, "cmbloc", cmbloc);
- }
+ cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
+ support = nvme_registers_cmbloc_support(cmbsz);
+ json_registers_cmbloc(cmbloc, support, obj_create_array_obj(r, "cmbloc"));
}
static void json_ctrl_registers_cmbsz(void *bar, struct json_object *r)
{
uint32_t cmbsz = mmio_read32(bar + NVME_REG_CMBSZ);
- if (human())
- json_registers_cmbsz(cmbsz, obj_create_array_obj(r, "cmbsz"));
- else
- obj_add_int(r, "cmbsz", cmbsz);
+ json_registers_cmbsz(cmbsz, obj_create_array_obj(r, "cmbsz"));
}
static void json_ctrl_registers_bpinfo(void *bar, struct json_object *r)
{
uint32_t bpinfo = mmio_read32(bar + NVME_REG_BPINFO);
- if (human())
- json_registers_bpinfo(bpinfo, obj_create_array_obj(r, "bpinfo"));
- else
- obj_add_int(r, "bpinfo", bpinfo);
+ json_registers_bpinfo(bpinfo, obj_create_array_obj(r, "bpinfo"));
}
static void json_ctrl_registers_bprsel(void *bar, struct json_object *r)
{
uint32_t bprsel = mmio_read32(bar + NVME_REG_BPRSEL);
- if (human())
- json_registers_bprsel(bprsel, obj_create_array_obj(r, "bprsel"));
- else
- obj_add_int(r, "bprsel", bprsel);
+ json_registers_bprsel(bprsel, obj_create_array_obj(r, "bprsel"));
}
static void json_ctrl_registers_bpmbl(void *bar, struct json_object *r)
{
uint64_t bpmbl = mmio_read64(bar + NVME_REG_BPMBL);
- if (human())
- json_registers_bpmbl(bpmbl, obj_create_array_obj(r, "bpmbl"));
- else
- obj_add_uint64(r, "bpmbl", bpmbl);
+ json_registers_bpmbl(bpmbl, obj_create_array_obj(r, "bpmbl"));
}
static void json_ctrl_registers_cmbmsc(void *bar, struct json_object *r)
{
uint64_t cmbmsc = mmio_read64(bar + NVME_REG_CMBMSC);
- if (human())
- json_registers_cmbmsc(cmbmsc, obj_create_array_obj(r, "cmbmsc"));
- else
- obj_add_uint64(r, "cmbmsc", cmbmsc);
+ json_registers_cmbmsc(cmbmsc, obj_create_array_obj(r, "cmbmsc"));
}
static void json_ctrl_registers_cmbsts(void *bar, struct json_object *r)
{
uint32_t cmbsts = mmio_read32(bar + NVME_REG_CMBSTS);
- if (human())
- json_registers_cmbsts(cmbsts, obj_create_array_obj(r, "cmbsts"));
- else
- obj_add_int(r, "cmbsts", cmbsts);
+ json_registers_cmbsts(cmbsts, obj_create_array_obj(r, "cmbsts"));
+}
+
+static void json_ctrl_registers_cmbebs(void *bar, struct json_object *r)
+{
+ uint32_t cmbebs = mmio_read32(bar + NVME_REG_CMBEBS);
+
+ json_registers_cmbebs(cmbebs, obj_create_array_obj(r, "cmbebs"));
+}
+
+static void json_ctrl_registers_cmbswtp(void *bar, struct json_object *r)
+{
+ uint32_t cmbswtp = mmio_read32(bar + NVME_REG_CMBSWTP);
+
+ json_registers_cmbswtp(cmbswtp, obj_create_array_obj(r, "cmbswtp"));
}
static void json_ctrl_registers_pmrcap(void *bar, struct json_object *r)
{
uint32_t pmrcap = mmio_read32(bar + NVME_REG_PMRCAP);
- if (human())
- json_registers_pmrcap(pmrcap, obj_create_array_obj(r, "pmrcap"));
- else
- obj_add_int(r, "pmrcap", pmrcap);
+ json_registers_pmrcap(pmrcap, obj_create_array_obj(r, "pmrcap"));
}
static void json_ctrl_registers_pmrctl(void *bar, struct json_object *r)
{
uint32_t pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
- if (human())
- json_registers_pmrctl(pmrctl, obj_create_array_obj(r, "pmrctl"));
- else
- obj_add_int(r, "pmrctl", pmrctl);
+ json_registers_pmrctl(pmrctl, obj_create_array_obj(r, "pmrctl"));
}
static void json_ctrl_registers_pmrsts(void *bar, struct json_object *r)
@@ -2695,53 +2657,37 @@ static void json_ctrl_registers_pmrsts(void *bar, struct json_object *r)
uint32_t pmrctl;
bool ready;
- if (human()) {
- pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
- ready = nvme_registers_pmrctl_ready(pmrctl);
- json_registers_pmrsts(pmrsts, ready, obj_create_array_obj(r, "pmrsts"));
- } else {
- obj_add_int(r, "pmrsts", pmrsts);
- }
+ pmrctl = mmio_read32(bar + NVME_REG_PMRCTL);
+ ready = nvme_registers_pmrctl_ready(pmrctl);
+ json_registers_pmrsts(pmrsts, ready, obj_create_array_obj(r, "pmrsts"));
}
static void json_ctrl_registers_pmrebs(void *bar, struct json_object *r)
{
uint32_t pmrebs = mmio_read32(bar + NVME_REG_PMREBS);
- if (human())
- json_registers_pmrebs(pmrebs, obj_create_array_obj(r, "pmrebs"));
- else
- obj_add_int(r, "pmrebs", pmrebs);
+ json_registers_pmrebs(pmrebs, obj_create_array_obj(r, "pmrebs"));
}
static void json_ctrl_registers_pmrswtp(void *bar, struct json_object *r)
{
uint32_t pmrswtp = mmio_read32(bar + NVME_REG_PMRSWTP);
- if (human())
- json_registers_pmrswtp(pmrswtp, obj_create_array_obj(r, "pmrswtp"));
- else
- obj_add_int(r, "pmrswtp", pmrswtp);
+ json_registers_pmrswtp(pmrswtp, obj_create_array_obj(r, "pmrswtp"));
}
static void json_ctrl_registers_pmrmscl(void *bar, struct json_object *r)
{
uint32_t pmrmscl = mmio_read32(bar + NVME_REG_PMRMSCL);
- if (human())
- json_registers_pmrmscl(pmrmscl, obj_create_array_obj(r, "pmrmscl"));
- else
- obj_add_uint(r, "pmrmscl", pmrmscl);
+ json_registers_pmrmscl(pmrmscl, obj_create_array_obj(r, "pmrmscl"));
}
static void json_ctrl_registers_pmrmscu(void *bar, struct json_object *r)
{
uint32_t pmrmscu = mmio_read32(bar + NVME_REG_PMRMSCU);
- if (human())
- json_registers_pmrmscu(pmrmscu, obj_create_array_obj(r, "pmrmscu"));
- else
- obj_add_uint(r, "pmrmscu", pmrmscu);
+ json_registers_pmrmscu(pmrmscu, obj_create_array_obj(r, "pmrmscu"));
}
static void json_ctrl_registers(void *bar, bool fabrics)
@@ -2755,8 +2701,6 @@ static void json_ctrl_registers(void *bar, bool fabrics)
json_ctrl_registers_cc(bar, r);
json_ctrl_registers_csts(bar, r);
json_ctrl_registers_nssr(bar, r);
- json_ctrl_registers_nssd(bar, r);
- json_ctrl_registers_crto(bar, r);
json_ctrl_registers_aqa(bar, r);
json_ctrl_registers_asq(bar, r);
json_ctrl_registers_acq(bar, r);
@@ -2767,6 +2711,10 @@ static void json_ctrl_registers(void *bar, bool fabrics)
json_ctrl_registers_bpmbl(bar, r);
json_ctrl_registers_cmbmsc(bar, r);
json_ctrl_registers_cmbsts(bar, r);
+ json_ctrl_registers_cmbebs(bar, r);
+ json_ctrl_registers_cmbswtp(bar, r);
+ json_ctrl_registers_nssd(bar, r);
+ json_ctrl_registers_crto(bar, r);
json_ctrl_registers_pmrcap(bar, r);
json_ctrl_registers_pmrctl(bar, r);
json_ctrl_registers_pmrsts(bar, r);
@@ -2778,30 +2726,6 @@ static void json_ctrl_registers(void *bar, bool fabrics)
json_print(r);
}
-static void json_registers_cmbebs(__u32 cmbebs, struct json_object *r)
-{
- char buffer[BUF_LEN];
-
- 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_str(r, "Read Bypass Behavior", buffer);
- obj_add_str(r, "CMB Elasticity Buffer Size Units (CMBSZU)",
- nvme_register_unit_to_string(cmbebs & 0xf));
-}
-
-static void json_registers_cmbswtp(__u32 cmbswtp, struct json_object *r)
-{
- char str[STR_LEN];
-
- obj_add_uint_nx(r, "cmbswtp", cmbswtp);
-
- obj_add_uint_nx(r, "CMB Sustained Write Throughput (CMBSWTV)", cmbswtp >> 8);
- sprintf(str, "%s", nvme_register_unit_to_string(cmbswtp & 0xf));
- obj_add_str(r, "CMB Sustained Write Throughput Units (CMBSWTU)", str);
-}
-
static void json_ctrl_register_human(int offset, uint64_t value, struct json_object *r)
{
char buffer[BUF_LEN];
@@ -2905,20 +2829,14 @@ static void json_ctrl_register_human(int offset, uint64_t value, struct json_obj
static void json_ctrl_register(int offset, uint64_t value)
{
- bool human = json_print_ops.flags & VERBOSE;
struct json_object *r;
char json_str[STR_LEN];
sprintf(json_str, "register: %#04x", offset);
r = obj_create(json_str);
- if (human) {
- obj_add_uint64(r, nvme_register_to_string(offset), value);
- json_ctrl_register_human(offset, value, r);
- } else {
- obj_add_str(r, "name", nvme_register_symbol_to_string(offset));
- obj_add_uint64(r, "value", value);
- }
+ obj_add_uint64(r, nvme_register_to_string(offset), value);
+ json_ctrl_register_human(offset, value, r);
}
static void json_nvme_cmd_set_independent_id_ns(struct nvme_id_independent_id_ns *ns,
@@ -3033,6 +2951,14 @@ 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, "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);
json_print(r);
}
@@ -3067,6 +2993,13 @@ static void json_nvme_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns,
if (ns->nsfeat & 0x20)
obj_add_int(r, "npdgl", le32_to_cpu(nvm_ns->npdgl));
+ obj_add_uint(r, "nprg", le32_to_cpu(nvm_ns->nprg));
+ obj_add_uint(r, "npra", le32_to_cpu(nvm_ns->npra));
+ obj_add_uint(r, "nors", le32_to_cpu(nvm_ns->nors));
+ obj_add_uint(r, "npdal", le32_to_cpu(nvm_ns->npdal));
+ obj_add_uint(r, "lbapss", le32_to_cpu(nvm_ns->lbapss));
+ obj_add_uint(r, "tlbaag", le32_to_cpu(nvm_ns->tlbaag));
+
json_print(r);
}
@@ -3289,9 +3222,17 @@ static void json_feature_show_fields_lba_range(struct json_object *r, __u8 field
static void json_feature_show_fields_temp_thresh(struct json_object *r, unsigned int result)
{
- __u8 field = (result & 0x300000) >> 20;
char json_str[STR_LEN];
+ __u8 field;
+ field = (result & 0x1c00000) >> 22;
+ sprintf(json_str, "%s", nvme_degrees_string(field));
+ obj_add_str(r, "Temperature Threshold Hysteresis (TMPTHH)", json_str);
+
+ sprintf(json_str, "%u K", field);
+ obj_add_str(r, "TMPTHH kelvin", json_str);
+
+ field = (result & 0x300000) >> 20;
obj_add_uint(r, "Threshold Type Select (THSEL)", field);
obj_add_str(r, "THSEL description", nvme_feature_temp_type_to_string(field));
@@ -4209,33 +4150,6 @@ static struct json_object *json_list_item_obj(nvme_ns_t n)
return r;
}
-static void json_simple_list(nvme_root_t t)
-{
- struct json_object *r = json_create_object();
- struct json_object *jdevices = json_create_array();
-
- nvme_host_t h;
- nvme_subsystem_t s;
- nvme_ctrl_t c;
- nvme_ns_t n;
-
- nvme_for_each_host(t, h) {
- nvme_for_each_subsystem(h, s) {
- nvme_subsystem_for_each_ns(s, n)
- array_add_obj(jdevices, json_list_item_obj(n));
-
- nvme_subsystem_for_each_ctrl(s, c) {
- nvme_ctrl_for_each_ns(c, n)
- array_add_obj(jdevices, json_list_item_obj(n));
- }
- }
- }
-
- obj_add_array(r, "Devices", jdevices);
-
- json_print(r);
-}
-
static void json_list_item(nvme_ns_t n)
{
struct json_object *r = json_list_item_obj(n);
@@ -4245,10 +4159,7 @@ static void json_list_item(nvme_ns_t n)
static void json_print_list_items(nvme_root_t t)
{
- if (json_print_ops.flags & VERBOSE)
- json_detail_list(t);
- else
- json_simple_list(t);
+ json_detail_list(t);
}
static unsigned int json_subsystem_topology_multipath(nvme_subsystem_t s,
@@ -4341,7 +4252,11 @@ static void json_simple_topology(nvme_root_t r)
subsystem_attrs = json_create_object();
obj_add_str(subsystem_attrs, "Name", nvme_subsystem_get_name(s));
obj_add_str(subsystem_attrs, "NQN", nvme_subsystem_get_nqn(s));
- obj_add_str(subsystem_attrs, "IOPolicy", nvme_subsystem_get_iopolicy(s));
+
+ obj_add_str(subsystem_attrs, "IOPolicy",
+ nvme_subsystem_get_iopolicy(s));
+ obj_add_str(subsystem_attrs, "Type",
+ nvme_subsystem_get_type(s));
array_add_obj(subsystems, subsystem_attrs);
namespaces = json_create_array();
@@ -4456,7 +4371,6 @@ static void json_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __
void *buf, __u32 len)
{
struct json_object *r = json_create_object();
- struct json_object *data;
char json_str[STR_LEN];
sprintf(json_str, "%#x", type);
@@ -4470,13 +4384,7 @@ static void json_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __
sprintf(json_str, "%#x", result);
obj_add_result(r, json_str);
- if (json_print_ops.flags & VERBOSE) {
- json_directive_show_fields(type, oper, result, buf, r);
- } else if (buf) {
- data = json_create_array();
- d_json((unsigned char *)buf, len, 16, 1, data);
- obj_add_array(r, "data", data);
- }
+ json_directive_show_fields(type, oper, result, buf, r);
json_print(r);
}
@@ -4577,18 +4485,17 @@ static void json_output_error_status(int status, const char *msg, va_list ap)
{
struct json_object *r;
char json_str[STR_LEN];
- char *value;
int val;
int type;
+ _cleanup_free_ char *value = NULL;
+
if (vasprintf(&value, msg, ap) < 0)
value = NULL;
sprintf(json_str, "Error: %s", value ? value : "Could not allocate string");
r = obj_create(json_str);
- free(value);
-
if (status < 0) {
obj_add_str(r, "error", nvme_strerror(errno));
obj_print(r);
@@ -4620,22 +4527,22 @@ static void json_output_error_status(int status, const char *msg, va_list ap)
static void json_output_message(bool error, const char *msg, va_list ap)
{
struct json_object *r = json_r ? json_r : json_create_object();
- char *value;
+
+ _cleanup_free_ char *value = NULL;
if (vasprintf(&value, msg, ap) < 0)
value = NULL;
obj_add_str(r, error ? "error" : "result", value ? value : "Could not allocate string");
- free(value);
-
obj_print(r);
}
static void json_output_perror(const char *msg)
{
struct json_object *r = json_create_object();
- char *error;
+
+ _cleanup_free_ char *error = NULL;
if (asprintf(&error, "%s: %s", msg, strerror(errno)) < 0)
error = NULL;
@@ -4646,8 +4553,6 @@ static void json_output_perror(const char *msg)
obj_add_str(r, "error", "Could not allocate string");
json_output_object(r);
-
- free(error);
}
void json_show_init(void)
@@ -4751,3 +4656,36 @@ 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 0d7514b..1fdcb9b 100644
--- a/nvme-print-stdout.c
+++ b/nvme-print-stdout.c
@@ -518,6 +518,9 @@ static void stdout_persistent_event_log(void *pevent_log_info,
printf("Over Temperature: %u\n", thermal_exc_event->over_temp);
printf("Threshold: %u\n", thermal_exc_event->threshold);
break;
+ case NVME_PEL_SANITIZE_MEDIA_VERIF_EVENT:
+ printf("Sanitize Media Verification Event\n");
+ break;
default:
printf("Reserved Event\n\n");
break;
@@ -1071,8 +1074,13 @@ static void stdout_subsys_config(nvme_subsystem_t s)
nvme_subsystem_get_nqn(s));
printf("%*s hostnqn=%s\n", len, " ",
nvme_host_get_hostnqn(nvme_subsystem_get_host(s)));
- printf("%*s iopolicy=%s\n", len, " ",
- nvme_subsystem_get_iopolicy(s));
+
+ if (stdout_print_ops.flags & VERBOSE) {
+ printf("%*s iopolicy=%s\n", len, " ",
+ nvme_subsystem_get_iopolicy(s));
+ printf("%*s type=%s\n", len, " ",
+ nvme_subsystem_get_type(s));
+ }
}
static void stdout_subsystem(nvme_root_t r, bool show_ana)
@@ -1104,6 +1112,8 @@ static void stdout_subsystem_list(nvme_root_t r, bool show_ana)
static void stdout_registers_cap(struct nvme_bar_cap *cap)
{
+ printf("\tNVM Subsystem Shutdown Enhancements Supported (NSSES): %s\n",
+ cap->nsses ? "Supported" : "Not Supported");
printf("\tController Ready With Media Support (CRWMS): %s\n",
cap->crwms ? "Supported" : "Not Supported");
printf("\tController Ready Independent of Media Support (CRIMS): %s\n",
@@ -1681,18 +1691,19 @@ 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 >> 31) & 0x1;
+ __u32 disc = (oaes & NVME_CTRL_OAES_DL) >> 31;
__u32 rsvd0 = (oaes & 0x70000000) >> 28;
- __u32 zicn = (oaes & 0x08000000) >> 27;
- __u32 rsvd1 = (oaes & 0x07FF0000) >> 16;
- __u32 normal_shn = (oaes >> 15) & 0x1;
- __u32 egealpcn = (oaes & 0x4000) >> 14;
- __u32 lbasin = (oaes & 0x2000) >> 13;
- __u32 plealcn = (oaes & 0x1000) >> 12;
- __u32 anacn = (oaes & 0x800) >> 11;
+ __u32 zicn = (oaes & NVME_CTRL_OAES_ZD) >> 27;
+ __u32 rsvd1 = (oaes & 0x7fe0000) >> 17;
+ __u32 tthr = (oaes & 0x10000) >> 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 fan = (oaes & 0x200) >> 9;
- __u32 nace = (oaes & 0x100) >> 8;
+ __u32 fan = (oaes & NVME_CTRL_OAES_FA) >> 9;
+ __u32 nace = (oaes & NVME_CTRL_OAES_NA) >> 8;
__u32 rsvd3 = oaes & 0xFF;
printf(" [31:31] : %#x\tDiscovery Log Change Notice %sSupported\n",
@@ -1702,7 +1713,9 @@ static void stdout_id_ctrl_oaes(__le32 ctrl_oaes)
printf(" [27:27] : %#x\tZone Descriptor Changed Notices %sSupported\n",
zicn, zicn ? "" : "Not ");
if (rsvd1)
- printf(" [26:16] : %#x\tReserved\n", rsvd1);
+ printf(" [26:17] : %#x\tReserved\n", rsvd1);
+ printf(" [16:16] : %#x\tTemperature Threshold Hysteresis Recovery %sSupported\n",
+ tthr, tthr ? "" : "Not ");
printf(" [15:15] : %#x\tNormal NSS Shutdown Event %sSupported\n",
normal_shn, normal_shn ? "" : "Not ");
printf(" [14:14] : %#x\tEndurance Group Event Aggregate Log Page"\
@@ -2060,10 +2073,11 @@ static void stdout_id_ctrl_mxtmt(__le16 mxtmt)
static void stdout_id_ctrl_sanicap(__le32 ctrl_sanicap)
{
__u32 sanicap = le32_to_cpu(ctrl_sanicap);
- __u32 rsvd = (sanicap & 0x1FFFFFF8) >> 3;
- __u32 owr = (sanicap & 0x4) >> 2;
- __u32 ber = (sanicap & 0x2) >> 1;
- __u32 cer = sanicap & 0x1;
+ __u32 rsvd4 = (sanicap & 0x1FFFFFF0) >> 4;
+ __u32 vers = (sanicap & 0x8) >> 3;
+ __u32 ows = (sanicap & 0x4) >> 2;
+ __u32 bes = (sanicap & 0x2) >> 1;
+ __u32 ces = sanicap & 0x1;
__u32 ndi = (sanicap & 0x20000000) >> 29;
__u32 nodmmas = (sanicap & 0xC0000000) >> 30;
@@ -2077,14 +2091,16 @@ static void stdout_id_ctrl_sanicap(__le32 ctrl_sanicap)
printf(" [31:30] : %#x\t%s\n", nodmmas, modifies_media[nodmmas]);
printf(" [29:29] : %#x\tNo-Deallocate After Sanitize bit in Sanitize command %sSupported\n",
ndi, ndi ? "Not " : "");
- if (rsvd)
- printf(" [28:3] : %#x\tReserved\n", rsvd);
- printf(" [2:2] : %#x\tOverwrite Sanitize Operation %sSupported\n",
- owr, owr ? "" : "Not ");
- printf(" [1:1] : %#x\tBlock Erase Sanitize Operation %sSupported\n",
- ber, ber ? "" : "Not ");
- printf(" [0:0] : %#x\tCrypto Erase Sanitize Operation %sSupported\n",
- cer, cer ? "" : "Not ");
+ if (rsvd4)
+ printf(" [28:4] : %#x\tReserved\n", rsvd4);
+ printf(" [3:3] : %#x\tMedia Verification and Post-Verification Deallocation state %sSupported\n",
+ vers, vers ? "" : "Not ");
+ printf(" [2:2] : %#x\tOverwrite Sanitize Operation %sSupported\n",
+ ows, ows ? "" : "Not ");
+ printf(" [1:1] : %#x\tBlock Erase Sanitize Operation %sSupported\n",
+ bes, bes ? "" : "Not ");
+ printf(" [0:0] : %#x\tCrypto Erase Sanitize Operation %sSupported\n",
+ ces, ces ? "" : "Not ");
printf("\n");
}
@@ -2118,6 +2134,18 @@ static void stdout_id_ctrl_anacap(__u8 anacap)
printf("\n");
}
+static void stdout_id_ctrl_tmpthha(__u8 tmpthha)
+{
+ __u8 rsvd3 = (tmpthha & 0xf8) >> 3;
+ __u8 tmpthmh = tmpthha & 0x7;
+
+ if (rsvd3)
+ printf(" [7:3] : %#x\tReserved\n", rsvd3);
+ printf(" [2:0] : %#x\tTemperature Threshold Maximum Hysteresis\n",
+ tmpthmh);
+ printf("\n");
+}
+
static void stdout_id_ctrl_sqes(__u8 sqes)
{
__u8 msqes = (sqes & 0xF0) >> 4;
@@ -2197,10 +2225,10 @@ static void stdout_id_ctrl_fuses(__le16 ctrl_fuses)
static void stdout_id_ctrl_fna(__u8 fna)
{
__u8 rsvd = (fna & 0xF0) >> 4;
- __u8 bcnsid = (fna & 0x8) >> 3;
- __u8 cese = (fna & 0x4) >> 2;
- __u8 cens = (fna & 0x2) >> 1;
- __u8 fmns = fna & 0x1;
+ __u8 bcnsid = (fna & NVME_CTRL_FNA_NSID_FFFFFFFF) >> 3;
+ __u8 cese = (fna & NVME_CTRL_FNA_CRYPTO_ERASE) >> 2;
+ __u8 cens = (fna & NVME_CTRL_FNA_SEC_ALL_NAMESPACES) >> 1;
+ __u8 fmns = fna & NVME_CTRL_FNA_FMT_ALL_NAMESPACES;
if (rsvd)
printf(" [7:4] : %#x\tReserved\n", rsvd);
@@ -2992,6 +3020,9 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl,
printf("domainid : %d\n", le16_to_cpu(ctrl->domainid));
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("sqes : %#x\n", ctrl->sqes);
if (human)
stdout_id_ctrl_sqes(ctrl->sqes);
@@ -3053,8 +3084,22 @@ static void stdout_id_ctrl(struct nvme_id_ctrl *ctrl,
}
}
+static void stdout_id_ctrl_nvm_aocs(__u16 aocs)
+{
+ __u16 rsvd = (aocs & 0xfffe) >> 1;
+ __u8 ralbas = aocs & 0x1;
+
+ if (rsvd)
+ printf(" [15:1] : %#x\tReserved\n", rsvd);
+ printf(" [0:0] : %#x\tReporting Allocated LBA %sSupported\n", ralbas,
+ ralbas ? "" : "Not ");
+ printf("\n");
+}
+
static void stdout_id_ctrl_nvm(struct nvme_id_ctrl_nvm *ctrl_nvm)
{
+ int verbose = stdout_print_ops.flags & VERBOSE;
+
printf("NVMe Identify Controller NVM:\n");
printf("vsl : %u\n", ctrl_nvm->vsl);
printf("wzsl : %u\n", ctrl_nvm->wzsl);
@@ -3062,6 +3107,9 @@ 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("aocs : %u\n", le16_to_cpu(ctrl_nvm->aocs));
+ if (verbose)
+ stdout_id_ctrl_nvm_aocs(le16_to_cpu(ctrl_nvm->aocs));
}
static void stdout_nvm_id_ns_pic(__u8 pic)
@@ -3159,6 +3207,13 @@ static void stdout_nvm_id_ns(struct nvme_nvm_id_ns *nvm_ns, unsigned int nsid,
}
if (ns->nsfeat & 0x20)
printf("npdgl : %#x\n", le32_to_cpu(nvm_ns->npdgl));
+
+ printf("nprg : %#x\n", le32_to_cpu(nvm_ns->nprg));
+ printf("npra : %#x\n", le32_to_cpu(nvm_ns->npra));
+ printf("nors : %#x\n", le32_to_cpu(nvm_ns->nors));
+ printf("npdal : %#x\n", le32_to_cpu(nvm_ns->npdal));
+ printf("lbapss: %#x\n", le32_to_cpu(nvm_ns->lbapss));
+ printf("tlbaag: %#x\n", le32_to_cpu(nvm_ns->tlbaag));
}
static void stdout_zns_id_ctrl(struct nvme_zns_id_ctrl *ctrl)
@@ -3615,17 +3670,16 @@ static void stdout_error_log(struct nvme_error_log_page *err_log, int entries,
le64_to_cpu(err_log[i].error_count));
printf("sqid : %d\n", err_log[i].sqid);
printf("cmdid : %#x\n", err_log[i].cmdid);
- printf("status_field : %#x(%s)\n", status,
+ printf("status_field : %#x (%s)\n", status,
nvme_status_to_string(status, false));
- printf("phase_tag : %#x\n",
- le16_to_cpu(err_log[i].status_field & 0x1));
+ printf("phase_tag : %#x\n", le16_to_cpu(err_log[i].status_field) & 0x1);
printf("parm_err_loc : %#x\n",
err_log[i].parm_error_location);
printf("lba : %#"PRIx64"\n",
le64_to_cpu(err_log[i].lba));
printf("nsid : %#x\n", err_log[i].nsid);
printf("vs : %d\n", err_log[i].vs);
- printf("trtype : %s\n",
+ printf("trtype : %#x (%s)\n", err_log[i].trtype,
nvme_trtype_to_string(err_log[i].trtype));
printf("csi : %d\n", err_log[i].csi);
printf("opcode : %#x\n", err_log[i].opcode);
@@ -3722,8 +3776,10 @@ static void stdout_changed_ns_list_log(struct nvme_ns_list *log,
if (log->ns[0] != cpu_to_le32(NVME_NSID_ALL)) {
for (i = 0; i < NVME_ID_NS_LIST_MAX; i++) {
nsid = le32_to_cpu(log->ns[i]);
- if (nsid == 0)
+ if (nsid == 0) {
+ printf("no ns changed\n");
break;
+ }
printf("[%4u]:%#x\n", i, nsid);
}
@@ -3744,6 +3800,13 @@ static void stdout_effects_log_human(FILE *stream, __u32 effect)
fprintf(stream, " CCC%s", (effect & NVME_CMD_EFFECTS_CCC) ? set : clr);
fprintf(stream, " USS%s", (effect & NVME_CMD_EFFECTS_UUID_SEL) ? set : clr);
+ if ((effect & NVME_CMD_EFFECTS_CSER_MASK) >> 14 == 0)
+ fprintf(stream, " No CSER defined\n");
+ else if ((effect & NVME_CMD_EFFECTS_CSER_MASK) >> 14 == 1)
+ fprintf(stream, " No admin command for any namespace\n");
+ else
+ fprintf(stream, " Reserved CSER\n");
+
if ((effect & NVME_CMD_EFFECTS_CSE_MASK) >> 16 == 0)
fprintf(stream, " No command restriction\n");
else if ((effect & NVME_CMD_EFFECTS_CSE_MASK) >> 16 == 1)
@@ -3815,6 +3878,10 @@ static void stdout_effects_log_page(enum nvme_csi csi,
printf("NVM Command Set Log Page\n");
printf("%-.80s\n", dash);
break;
+ case NVME_CSI_KV:
+ printf("KV Command Set Log Page\n");
+ printf("%-.80s\n", dash);
+ break;
case NVME_CSI_ZNS:
printf("ZNS Command Set Log Page\n");
printf("%-.80s\n", dash);
@@ -4362,8 +4429,10 @@ static void stdout_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid,
static void stdout_lba_status_info(__u32 result)
{
- printf("\tLBA Status Information Poll Interval (LSIPI) : %u\n", (result >> 16) & 0xffff);
- printf("\tLBA Status Information Report Interval (LSIRI): %u\n", result & 0xffff);
+ printf("\tLBA Status Information Poll Interval (LSIPI) : %u\n",
+ NVME_FEAT_LBAS_LSIPI(result));
+ printf("\tLBA Status Information Report Interval (LSIRI): %u\n",
+ NVME_FEAT_LBAS_LSIRI(result));
}
void stdout_d(unsigned char *buf, int len, int width, int group)
@@ -4449,92 +4518,102 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
switch (fid) {
case NVME_FEAT_FID_ARBITRATION:
- printf("\tHigh Priority Weight (HPW): %u\n", ((result & 0xff000000) >> 24) + 1);
- printf("\tMedium Priority Weight (MPW): %u\n", ((result & 0x00ff0000) >> 16) + 1);
- printf("\tLow Priority Weight (LPW): %u\n", ((result & 0x0000ff00) >> 8) + 1);
+ printf("\tHigh Priority Weight (HPW): %u\n", NVME_FEAT_ARB_HPW(result) + 1);
+ printf("\tMedium Priority Weight (MPW): %u\n", NVME_FEAT_ARB_MPW(result) + 1);
+ printf("\tLow Priority Weight (LPW): %u\n", NVME_FEAT_ARB_LPW(result) + 1);
printf("\tArbitration Burst (AB): ");
- if ((result & 0x00000007) == 7)
+ if (NVME_FEAT_ARB_BURST(result) == NVME_FEAT_ARBITRATION_BURST_MASK)
printf("No limit\n");
else
- printf("%u\n", 1 << (result & 0x00000007));
+ printf("%u\n", 1 << NVME_FEAT_ARB_BURST(result));
break;
case NVME_FEAT_FID_POWER_MGMT:
- field = (result & 0x000000E0) >> 5;
- printf("\tWorkload Hint (WH): %u - %s\n", field, nvme_feature_wl_hints_to_string(field));
- printf("\tPower State (PS): %u\n", result & 0x0000001f);
+ field = NVME_FEAT_PM_WH(result);
+ printf("\tWorkload Hint (WH): %u - %s\n", field,
+ nvme_feature_wl_hints_to_string(field));
+ printf("\tPower State (PS): %u\n", NVME_FEAT_PM_PS(result));
break;
case NVME_FEAT_FID_LBA_RANGE:
- field = result & 0x0000003f;
+ field = NVME_FEAT_LBAR_NR(result);
printf("\tNumber of LBA Ranges (NUM): %u\n", field + 1);
if (buf)
stdout_lba_range((struct nvme_lba_range_type *)buf, field);
break;
case NVME_FEAT_FID_TEMP_THRESH:
- field = (result & 0x00300000) >> 20;
+ field = (result & 0x1c00000) >> 22;
+ printf("\tTemperature Threshold Hysteresis(TMPTHH): %s (%u K)\n",
+ nvme_degrees_string(field), field);
+ field = NVME_FEAT_TT_THSEL(result);
printf("\tThreshold Type Select (THSEL): %u - %s\n", field,
- nvme_feature_temp_type_to_string(field));
- field = (result & 0x000f0000) >> 16;
+ nvme_feature_temp_type_to_string(field));
+ field = NVME_FEAT_TT_TMPSEL(result);
printf("\tThreshold Temperature Select (TMPSEL): %u - %s\n",
field, nvme_feature_temp_sel_to_string(field));
printf("\tTemperature Threshold (TMPTH): %s (%u K)\n",
- nvme_degrees_string(result & 0x0000ffff), result & 0x0000ffff);
+ nvme_degrees_string(NVME_FEAT_TT_TMPTH(result)), NVME_FEAT_TT_TMPTH(result));
break;
case NVME_FEAT_FID_ERR_RECOVERY:
printf("\tDeallocated or Unwritten Logical Block Error Enable (DULBE): %s\n",
- ((result & 0x00010000) >> 16) ? "Enabled" : "Disabled");
+ NVME_FEAT_ER_DULBE(result) ? "Enabled" : "Disabled");
printf("\tTime Limited Error Recovery (TLER): %u ms\n",
- (result & 0x0000ffff) * 100);
+ NVME_FEAT_ER_TLER(result) * 100);
break;
case NVME_FEAT_FID_VOLATILE_WC:
- printf("\tVolatile Write Cache Enable (WCE): %s\n", (result & 0x00000001) ? "Enabled" : "Disabled");
+ printf("\tVolatile Write Cache Enable (WCE): %s\n",
+ NVME_FEAT_VWC_WCE(result) ? "Enabled" : "Disabled");
break;
case NVME_FEAT_FID_NUM_QUEUES:
- printf("\tNumber of IO Completion Queues Allocated (NCQA): %u\n", ((result & 0xffff0000) >> 16) + 1);
- printf("\tNumber of IO Submission Queues Allocated (NSQA): %u\n", (result & 0x0000ffff) + 1);
+ printf("\tNumber of IO Completion Queues Allocated (NCQA): %u\n",
+ NVME_FEAT_NRQS_NCQR(result) + 1);
+ printf("\tNumber of IO Submission Queues Allocated (NSQA): %u\n",
+ NVME_FEAT_NRQS_NSQR(result) + 1);
break;
case NVME_FEAT_FID_IRQ_COALESCE:
- printf("\tAggregation Time (TIME): %u usec\n", ((result & 0x0000ff00) >> 8) * 100);
- printf("\tAggregation Threshold (THR): %u\n", (result & 0x000000ff) + 1);
+ printf("\tAggregation Time (TIME): %u usec\n",
+ NVME_FEAT_IRQC_TIME(result) * 100);
+ printf("\tAggregation Threshold (THR): %u\n", NVME_FEAT_IRQC_THR(result) + 1);
break;
case NVME_FEAT_FID_IRQ_CONFIG:
- printf("\tCoalescing Disable (CD): %s\n", ((result & 0x00010000) >> 16) ? "True" : "False");
- printf("\tInterrupt Vector (IV): %u\n", result & 0x0000ffff);
+ printf("\tCoalescing Disable (CD): %s\n",
+ NVME_FEAT_ICFG_CD(result) ? "True" : "False");
+ printf("\tInterrupt Vector (IV): %u\n", NVME_FEAT_ICFG_IV(result));
break;
case NVME_FEAT_FID_WRITE_ATOMIC:
- printf("\tDisable Normal (DN): %s\n", (result & 0x00000001) ? "True" : "False");
+ printf("\tDisable Normal (DN): %s\n", NVME_FEAT_WA_DN(result) ? "True" : "False");
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");
printf("\tEndurance Group Event Aggregate Log Change Notices : %s\n",
- ((result & 0x00004000) >> 14) ? "Send async event" : "Do not send async event");
+ NVME_FEAT_AE_EGA(result) ? "Send async event" : "Do not send async event");
printf("\tLBA Status Information Notices : %s\n",
- ((result & 0x00002000) >> 13) ? "Send async event" : "Do not send async event");
+ NVME_FEAT_AE_LBAS(result) ? "Send async event" : "Do not send async event");
printf("\tPredictable Latency Event Aggregate Log Change Notices : %s\n",
- ((result & 0x00001000) >> 12) ? "Send async event" : "Do not send async event");
+ NVME_FEAT_AE_PLA(result) ? "Send async event" : "Do not send async event");
printf("\tAsymmetric Namespace Access Change Notices : %s\n",
- ((result & 0x00000800) >> 11) ? "Send async event" : "Do not send async event");
+ NVME_FEAT_AE_ANA(result) ? "Send async event" : "Do not send async event");
printf("\tTelemetry Log Notices : %s\n",
- ((result & 0x00000400) >> 10) ? "Send async event" : "Do not send async event");
+ NVME_FEAT_AE_TELEM(result) ? "Send async event" : "Do not send async event");
printf("\tFirmware Activation Notices : %s\n",
- ((result & 0x00000200) >> 9) ? "Send async event" : "Do not send async event");
+ NVME_FEAT_AE_FW(result) ? "Send async event" : "Do not send async event");
printf("\tNamespace Attribute Notices : %s\n",
- ((result & 0x00000100) >> 8) ? "Send async event" : "Do not send async event");
+ NVME_FEAT_AE_NAN(result) ? "Send async event" : "Do not send async event");
printf("\tSMART / Health Critical Warnings : %s\n",
- (result & 0x000000ff) ? "Send async event" : "Do not send async event");
+ NVME_FEAT_AE_SMART(result) ? "Send async event" : "Do not send async event");
break;
case NVME_FEAT_FID_AUTO_PST:
printf("\tAutonomous Power State Transition Enable (APSTE): %s\n",
- (result & 0x00000001) ? "Enabled" : "Disabled");
+ NVME_FEAT_APST_APSTE(result) ? "Enabled" : "Disabled");
if (buf)
stdout_auto_pst((struct nvme_feat_auto_pst *)buf);
break;
case NVME_FEAT_FID_HOST_MEM_BUF:
- printf("\tEnable Host Memory (EHM): %s\n", (result & 0x00000001) ? "Enabled" : "Disabled");
+ printf("\tEnable Host Memory (EHM): %s\n",
+ NVME_FEAT_HMEM_EHM(result) ? "Enabled" : "Disabled");
printf("\tHost Memory Non-operational Access Restriction Enable (HMNARE): %s\n",
- (result & 0x00000004) ? "True" : "False");
+ (result & 0x00000004) ? "True" : "False");
printf("\tHost Memory Non-operational Access Restricted (HMNAR): %s\n",
- (result & 0x00000008) ? "True" : "False");
+ (result & 0x00000008) ? "True" : "False");
if (buf)
stdout_host_mem_buffer((struct nvme_host_mem_buf_attrs *)buf);
break;
@@ -4547,19 +4626,22 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
break;
case NVME_FEAT_FID_HCTM:
printf("\tThermal Management Temperature 1 (TMT1) : %u K (%s)\n",
- result >> 16, nvme_degrees_string(result >> 16));
+ NVME_FEAT_HCTM_TMT1(result),
+ nvme_degrees_string(NVME_FEAT_HCTM_TMT1(result)));
printf("\tThermal Management Temperature 2 (TMT2) : %u K (%s)\n",
- result & 0x0000ffff, nvme_degrees_string(result & 0x0000ffff));
+ NVME_FEAT_HCTM_TMT2(result),
+ nvme_degrees_string(NVME_FEAT_HCTM_TMT2(result)));
break;
case NVME_FEAT_FID_NOPSC:
printf("\tNon-Operational Power State Permissive Mode Enable (NOPPME): %s\n",
- (result & 1) ? "True" : "False");
+ NVME_FEAT_NOPS_NOPPME(result) ? "True" : "False");
break;
case NVME_FEAT_FID_RRL:
- printf("\tRead Recovery Level (RRL): %u\n", result & 0xf);
+ printf("\tRead Recovery Level (RRL): %u\n", NVME_FEAT_RRL_RRL(result));
break;
case NVME_FEAT_FID_PLM_CONFIG:
- printf("\tPredictable Latency Window Enabled: %s\n", result & 0x1 ? "True" : "False");
+ printf("\tPredictable Latency Window Enabled: %s\n",
+ NVME_FEAT_PLM_PLME(result) ? "True" : "False");
if (buf)
stdout_plm_config((struct nvme_plm_config *)buf);
break;
@@ -4586,11 +4668,11 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
}
break;
case NVME_FEAT_FID_SANITIZE:
- printf("\tNo-Deallocate Response Mode (NODRM) : %u\n", result & 0x1);
+ printf("\tNo-Deallocate Response Mode (NODRM) : %u\n", NVME_FEAT_SC_NODRM(result));
break;
case NVME_FEAT_FID_ENDURANCE_EVT_CFG:
- printf("\tEndurance Group Identifier (ENDGID): %u\n", result & 0xffff);
- printf("\tEndurance Group Critical Warnings : %u\n", (result >> 16) & 0xff);
+ printf("\tEndurance Group Identifier (ENDGID): %u\n", NVME_FEAT_EG_ENDGID(result));
+ printf("\tEndurance Group Critical Warnings : %u\n", NVME_FEAT_EG_EGCW(result));
break;
case NVME_FEAT_FID_IOCS_PROFILE:
printf("\tI/O Command Set Profile: %s\n", result & 0x1 ? "True" : "False");
@@ -4605,7 +4687,7 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
stdout_host_metadata(fid, (struct nvme_host_metadata *)buf);
break;
case NVME_FEAT_FID_SW_PROGRESS:
- printf("\tPre-boot Software Load Count (PBSLC): %u\n", result & 0x000000ff);
+ printf("\tPre-boot Software Load Count (PBSLC): %u\n", NVME_FEAT_SPM_PBSLC(result));
break;
case NVME_FEAT_FID_HOST_ID:
if (buf) {
@@ -4617,23 +4699,24 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
break;
case NVME_FEAT_FID_RESV_MASK:
printf("\tMask Reservation Preempted Notification (RESPRE): %s\n",
- ((result & 0x00000008) >> 3) ? "True" : "False");
+ NVME_FEAT_RM_RESPRE(result) ? "True" : "False");
printf("\tMask Reservation Released Notification (RESREL): %s\n",
- ((result & 0x00000004) >> 2) ? "True" : "False");
+ NVME_FEAT_RM_RESREL(result) ? "True" : "False");
printf("\tMask Registration Preempted Notification (REGPRE): %s\n",
- ((result & 0x00000002) >> 1) ? "True" : "False");
+ NVME_FEAT_RM_REGPRE(result) ? "True" : "False");
break;
case NVME_FEAT_FID_RESV_PERSIST:
- printf("\tPersist Through Power Loss (PTPL): %s\n", (result & 0x00000001) ? "True" : "False");
+ printf("\tPersist Through Power Loss (PTPL): %s\n",
+ NVME_FEAT_RP_PTPL(result) ? "True" : "False");
break;
case NVME_FEAT_FID_WRITE_PROTECT:
printf("\tNamespace Write Protect: %s\n", nvme_ns_wp_cfg_to_string(result));
break;
case NVME_FEAT_FID_FDP:
printf("\tFlexible Direct Placement Enable (FDPE) : %s\n",
- (result & 0x1) ? "Yes" : "No");
+ (result & 0x1) ? "Yes" : "No");
printf("\tFlexible Direct Placement Configuration Index : %u\n",
- (result >> 8) & 0xf);
+ (result >> 8) & 0xf);
break;
case NVME_FEAT_FID_FDP_EVENTS:
for (unsigned int i = 0; i < result; i++) {
@@ -4642,7 +4725,7 @@ static void stdout_feature_show_fields(enum nvme_features_id fid,
d = &((struct nvme_fdp_supported_event_desc *)buf)[i];
printf("\t%-53s: %sEnabled\n", nvme_fdp_event_to_string(d->evt),
- d->evta & 0x1 ? "" : "Not ");
+ d->evta & 0x1 ? "" : "Not ");
}
break;
default:
@@ -4660,15 +4743,18 @@ static void stdout_lba_status(struct nvme_lba_status *list,
printf("Completion Condition(CMPC): %u\n", list->cmpc);
switch (list->cmpc) {
- case 1:
- printf("\tCompleted due to transferring the amount of data"\
- " specified in the MNDW field\n");
+ case NVME_LBA_STATUS_CMPC_NO_CMPC:
+ printf("\tNo indication of the completion condition\n");
break;
- case 2:
- printf("\tCompleted due to having performed the action\n"\
- "\tspecified in the Action Type field over the\n"\
- "\tnumber of logical blocks specified in the\n"\
- "\tRange Length field\n");
+ case NVME_LBA_STATUS_CMPC_INCOMPLETE:
+ printf("\tCompleted transferring the amount of data specified in the\n"\
+ "\tMNDW field. But, additional LBA Status Descriptor Entries are\n"\
+ "\tavailable to transfer or scan did not complete (if ATYPE = 10h)\n");
+ break;
+ case NVME_LBA_STATUS_CMPC_COMPLETE:
+ printf("\tCompleted the specified action over the number of LBAs specified\n"\
+ "\tin the Range Length field and transferred all available LBA Status\n"\
+ "\tDescriptor Entries\n");
break;
default:
break;
@@ -5246,3 +5332,16 @@ struct print_ops *nvme_get_stdout_print_ops(nvme_print_flags_t flags)
stdout_print_ops.flags = flags;
return &stdout_print_ops;
}
+
+void print_array(char *name, __u8 *data, int size)
+{
+ int i;
+
+ if (!name || !data || !size)
+ return;
+
+ printf("%s: 0x", name);
+ for (i = 0; i < size; i++)
+ printf("%02X", data[size - i - 1]);
+ printf("\n");
+}
diff --git a/nvme-print.c b/nvme-print.c
index 3165ab9..170e5c1 100644
--- a/nvme-print.c
+++ b/nvme-print.c
@@ -179,6 +179,8 @@ static const char *pel_event_to_string(int type)
return "Set Telemetry CRT Event";
case NVME_PEL_THERMAL_EXCURSION_EVENT:
return "Thermal Excursion Event";
+ case NVME_PEL_SANITIZE_MEDIA_VERIF_EVENT:
+ return "Sanitize Media Verification Event";
case NVME_PEL_VENDOR_SPECIFIC_EVENT:
return "Vendor Specific Event";
case NVME_PEL_TCG_DEFINED_EVENT:
@@ -406,7 +408,18 @@ bool nvme_is_fabrics_reg(int offset)
case NVME_REG_CC:
case NVME_REG_CSTS:
case NVME_REG_NSSR:
- case NVME_REG_CRTO:
+ return true;
+ default:
+ break;
+ }
+
+ return false;
+}
+
+bool nvme_is_fabrics_optional_reg(int offset)
+{
+ switch (offset) {
+ case NVME_REG_NSSR:
return true;
default:
break;
@@ -678,11 +691,11 @@ const char *nvme_trtype_to_string(__u8 trtype)
{
switch (trtype) {
case 0: return "The transport type is not indicated or the error "\
- "is not transport related.";
- case 1: return "RDMA Transport error.";
- case 2: return "Fibre Channel Transport error.";
- case 3: return "TCP Transport error.";
- case 254: return "Intra-host Transport error.";
+ "is not transport related";
+ case 1: return "RDMA Transport error";
+ case 2: return "Fibre Channel Transport error";
+ case 3: return "TCP Transport error";
+ case 254: return "Intra-host Transport error";
default: return "Reserved";
};
}
@@ -789,8 +802,8 @@ static bool is_temperature_fahrenheit(void)
const char *locale, *underscore;
char country[3] = { 0 };
- setlocale(LC_ALL, "");
- locale = setlocale(LC_ALL, NULL);
+ setlocale(LC_MEASUREMENT, "");
+ locale = setlocale(LC_MEASUREMENT, NULL);
if (!locale || strlen(locale) < 2)
return false;
@@ -962,13 +975,18 @@ const char *nvme_register_to_string(int reg)
const char *nvme_select_to_string(int sel)
{
switch (sel) {
- case 0: return "Current";
- case 1: return "Default";
- case 2: return "Saved";
- case 3: return "Supported capabilities";
- case 8: return "Changed";
- default: return "Reserved";
+ case NVME_GET_FEATURES_SEL_CURRENT:
+ return "Current";
+ case NVME_GET_FEATURES_SEL_DEFAULT:
+ return "Default";
+ case NVME_GET_FEATURES_SEL_SAVED:
+ return "Saved";
+ case NVME_GET_FEATURES_SEL_SUPPORTED:
+ return "Supported capabilities";
+ default:
+ break;
}
+ return "Reserved";
}
void nvme_show_select_result(enum nvme_features_id fid, __u32 result)
@@ -1057,7 +1075,7 @@ void nvme_directive_show(__u8 type, __u8 oper, __u16 spec, __u32 nsid, __u32 res
const char *nvme_plm_window_to_string(__u32 plm)
{
- switch (plm & 0x7) {
+ switch (NVME_FEAT_PLMW_WS(plm)) {
case 1:
return "Deterministic Window (DTWIN)";
case 2:
diff --git a/nvme-print.h b/nvme-print.h
index a3943cc..6107df9 100644
--- a/nvme-print.h
+++ b/nvme-print.h
@@ -20,6 +20,8 @@ typedef struct nvme_effects_log_node {
#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);
@@ -126,7 +128,8 @@ struct nvme_bar_cap {
__u8 nsss:1;
__u8 crwms:1;
__u8 crims:1;
- __u8 rsvd61:3;
+ __u8 nsses:1;
+ __u8 rsvd62:2;
};
#ifdef CONFIG_JSONC
@@ -320,7 +323,17 @@ void nvme_show_error_status(int status, const char *msg, ...);
void nvme_show_init(void);
void nvme_show_finish(void);
bool nvme_is_fabrics_reg(int offset);
+bool nvme_is_fabrics_optional_reg(int offset);
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);
#endif /* NVME_PRINT_H */
diff --git a/nvme.c b/nvme.c
index 20dfee6..ea0590f 100644
--- a/nvme.c
+++ b/nvme.c
@@ -76,10 +76,11 @@ struct feat_cfg {
enum nvme_get_features_sel sel;
__u32 cdw11;
__u32 cdw12;
- __u8 uuid_index;
+ __u8 uuid_index;
__u32 data_len;
- bool raw_binary;
- bool human_readable;
+ bool raw_binary;
+ bool human_readable;
+ bool changed;
};
struct passthru_config {
@@ -1168,7 +1169,7 @@ static int get_error_log(int argc, char **argv, struct command *cmd, struct plug
_cleanup_free_ struct nvme_error_log_page *err_log = NULL;
_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
- struct nvme_id_ctrl ctrl;
+ struct nvme_id_ctrl ctrl = { 0 };
nvme_print_flags_t flags;
int err = -1;
@@ -2965,7 +2966,7 @@ static int parse_lba_num_si(struct nvme_dev *dev, const char *opt,
}
nvme_id_ns_flbas_to_lbaf_inuse(flbas, &lbaf);
- lbas = (1 << ns->lbaf[lbaf].ds) + ns->lbaf[lbaf].ms;
+ lbas = (1 << ns->lbaf[lbaf].ds) + le16_to_cpu(ns->lbaf[lbaf].ms);
if (suffix_si_parse(val, &endptr, (uint64_t *)num)) {
nvme_show_error("Expected long suffixed integer argument for '%s-si' but got '%s'!",
@@ -3467,6 +3468,9 @@ static int nvm_id_ctrl(int argc, char **argv, struct command *cmd,
return err;
}
+ if (argconfig_parse_seen(opts, "verbose"))
+ flags |= VERBOSE;
+
ctrl_nvm = nvme_alloc(sizeof(*ctrl_nvm));
if (!ctrl_nvm)
return -ENOMEM;
@@ -4550,7 +4554,7 @@ static int get_feature_id(struct nvme_dev *dev, struct feat_cfg *cfg,
cfg->cdw11 |= 0xff << 16;
}
- if (cfg->sel == 3)
+ if (NVME_CHECK(cfg->sel, GET_FEATURES_SEL, SUPPORTED))
cfg->data_len = 0;
if (cfg->data_len) {
@@ -4580,8 +4584,7 @@ static int filter_out_flags(int status)
NVME_GET(NVME_SC_MASK, 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)
{
int status = filter_out_flags(err);
enum nvme_status_type type = NVME_STATUS_TYPE_NVME;
@@ -4589,11 +4592,10 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result,
if (!err) {
if (!cfg.raw_binary || !buf) {
nvme_feature_show(cfg.feature_id, cfg.sel, result);
- if (cfg.sel == 3)
+ if (NVME_CHECK(cfg.sel, GET_FEATURES_SEL, SUPPORTED))
nvme_show_select_result(cfg.feature_id, result);
else if (cfg.human_readable)
- nvme_feature_show_fields(cfg.feature_id, result,
- buf);
+ nvme_feature_show_fields(cfg.feature_id, result, buf);
else if (buf)
d(buf, cfg.data_len, 16, 1);
} else if (buf) {
@@ -4601,15 +4603,14 @@ static void get_feature_id_print(struct feat_cfg cfg, int err, __u32 result,
}
} else if (err > 0) {
if (!nvme_status_equals(status, type, NVME_SC_INVALID_FIELD) &&
- !nvme_status_equals(status, type, NVME_SC_INVALID_NS))
+ !nvme_status_equals(status, type, NVME_SC_INVALID_NS))
nvme_show_status(err);
} else {
nvme_show_error("get-feature: %s", nvme_strerror(errno));
}
}
-static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg,
- bool changed)
+static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg)
{
int err;
int err_def = 0;
@@ -4618,20 +4619,17 @@ static int get_feature_id_changed(struct nvme_dev *dev, struct feat_cfg cfg,
_cleanup_free_ void *buf = NULL;
_cleanup_free_ void *buf_def = NULL;
- if (changed)
- cfg.sel = 0;
+ if (cfg.changed)
+ cfg.sel = NVME_GET_FEATURES_SEL_CURRENT;
err = get_feature_id(dev, &cfg, &buf, &result);
- if (!err && changed) {
- cfg.sel = 1;
+ if (!err && cfg.changed) {
+ cfg.sel = NVME_GET_FEATURES_SEL_DEFAULT;
err_def = get_feature_id(dev, &cfg, &buf_def, &result_def);
}
- if (changed)
- cfg.sel = 8;
-
- if (err || !changed || err_def || result != result_def ||
+ if (err || !cfg.changed || err_def || result != result_def ||
(buf && buf_def && !strcmp(buf, buf_def)))
get_feature_id_print(cfg, err, result, buf);
@@ -4644,19 +4642,15 @@ static int get_feature_ids(struct nvme_dev *dev, struct feat_cfg cfg)
int i;
int feat_max = 0x100;
int feat_num = 0;
- bool changed = false;
int status = 0;
enum nvme_status_type type = NVME_STATUS_TYPE_NVME;
- if (cfg.sel == 8)
- changed = true;
-
if (cfg.feature_id)
feat_max = cfg.feature_id + 1;
for (i = cfg.feature_id; i < feat_max; i++, feat_num++) {
cfg.feature_id = i;
- err = get_feature_id_changed(dev, cfg, changed);
+ err = get_feature_id_changed(dev, cfg);
if (!err)
continue;
status = filter_out_flags(err);
@@ -4688,9 +4682,10 @@ static int get_feature(int argc, char **argv, struct command *cmd,
"change saveable Features.";
const char *raw = "show feature in binary format";
const char *feature_id = "feature identifier";
- const char *sel = "[0-3,8]: current/default/saved/supported/changed";
+ const char *sel = "[0-3]: current/default/saved/supported";
const char *cdw11 = "feature specific dword 11";
const char *human_readable = "show feature in readable format";
+ const char *changed = "show feature changed";
_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
int err;
@@ -4698,7 +4693,7 @@ static int get_feature(int argc, char **argv, struct command *cmd,
struct feat_cfg cfg = {
.feature_id = 0,
.namespace_id = 0,
- .sel = 0,
+ .sel = NVME_GET_FEATURES_SEL_CURRENT,
.data_len = 0,
.raw_binary = false,
.cdw11 = 0,
@@ -4714,7 +4709,8 @@ static int get_feature(int argc, char **argv, struct command *cmd,
OPT_FLAG("raw-binary", 'b', &cfg.raw_binary, raw),
OPT_UINT("cdw11", 'c', &cfg.cdw11, cdw11),
OPT_BYTE("uuid-index", 'U', &cfg.uuid_index, uuid_index_specify),
- OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable));
+ OPT_FLAG("human-readable", 'H', &cfg.human_readable, human_readable),
+ OPT_FLAG("changed", 'C', &cfg.changed, changed));
err = parse_and_open(&dev, argc, argv, desc, opts);
if (err)
@@ -4731,7 +4727,7 @@ static int get_feature(int argc, char **argv, struct command *cmd,
}
}
- if (cfg.sel > 8) {
+ if (cfg.sel > NVME_GET_FEATURES_SEL_SUPPORTED) {
nvme_show_error("invalid 'select' param:%d", cfg.sel);
return -EINVAL;
}
@@ -5177,11 +5173,13 @@ static int ns_rescan(int argc, char **argv, struct command *cmd, struct plugin *
static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugin *plugin)
{
const char *desc = "Send a sanitize command.";
+ const char *emvs_desc = "Enter media verification state.";
const char *no_dealloc_desc = "No deallocate after sanitize.";
const char *oipbp_desc = "Overwrite invert pattern between passes.";
const char *owpass_desc = "Overwrite pass count.";
const char *ause_desc = "Allow unrestricted sanitize exit.";
- const char *sanact_desc = "Sanitize action: 1 = Exit failure mode, 2 = Start block erase, 3 = Start overwrite, 4 = Start crypto erase";
+ const char *sanact_desc = "Sanitize action: 1 = Exit failure mode, 2 = Start block erase,"
+ "3 = Start overwrite, 4 = Start crypto erase, 5 = Exit media verification";
const char *ovrpat_desc = "Overwrite pattern.";
_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
@@ -5194,6 +5192,7 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi
bool ause;
__u8 sanact;
__u32 ovrpat;
+ bool emvs;
};
struct config cfg = {
@@ -5203,6 +5202,7 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi
.ause = false,
.sanact = 0,
.ovrpat = 0,
+ .emvs = false,
};
OPT_VALS(sanact) = {
@@ -5210,6 +5210,7 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi
VAL_BYTE("start-block-erase", NVME_SANITIZE_SANACT_START_BLOCK_ERASE),
VAL_BYTE("start-overwrite", NVME_SANITIZE_SANACT_START_OVERWRITE),
VAL_BYTE("start-crypto-erase", NVME_SANITIZE_SANACT_START_CRYPTO_ERASE),
+ VAL_BYTE("exit-media-verification", NVME_SANITIZE_SANACT_EXIT_MEDIA_VERIF),
VAL_END()
};
@@ -5219,7 +5220,8 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi
OPT_BYTE("owpass", 'n', &cfg.owpass, owpass_desc),
OPT_FLAG("ause", 'u', &cfg.ause, ause_desc),
OPT_BYTE("sanact", 'a', &cfg.sanact, sanact_desc, sanact),
- OPT_UINT("ovrpat", 'p', &cfg.ovrpat, ovrpat_desc));
+ OPT_UINT("ovrpat", 'p', &cfg.ovrpat, ovrpat_desc),
+ OPT_FLAG("emvs", 'e', &cfg.emvs, emvs_desc));
err = parse_and_open(&dev, argc, argv, desc, opts);
if (err)
@@ -5230,16 +5232,20 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi
case NVME_SANITIZE_SANACT_START_BLOCK_ERASE:
case NVME_SANITIZE_SANACT_START_OVERWRITE:
case NVME_SANITIZE_SANACT_START_CRYPTO_ERASE:
+ case NVME_SANITIZE_SANACT_EXIT_MEDIA_VERIF:
break;
default:
nvme_show_error("Invalid Sanitize Action");
return -EINVAL;
}
- if (cfg.sanact == NVME_SANITIZE_SANACT_EXIT_FAILURE) {
- if (cfg.ause || cfg.no_dealloc) {
+ if (cfg.ause || cfg.no_dealloc) {
+ if (cfg.sanact == NVME_SANITIZE_SANACT_EXIT_FAILURE) {
nvme_show_error("SANACT is Exit Failure Mode");
return -EINVAL;
+ } else if (cfg.sanact == NVME_SANITIZE_SANACT_EXIT_MEDIA_VERIF) {
+ nvme_show_error("SANACT is Exit Media Verification State");
+ return -EINVAL;
}
}
@@ -5264,7 +5270,9 @@ static int sanitize_cmd(int argc, char **argv, struct command *cmd, struct plugi
.nodas = cfg.no_dealloc,
.ovrpat = cfg.ovrpat,
.result = NULL,
+ .emvs = cfg.emvs,
};
+
err = nvme_cli_sanitize_nvm(dev, &args);
if (err < 0)
nvme_show_error("sanitize: %s", nvme_strerror(errno));
@@ -5289,6 +5297,11 @@ static int nvme_get_single_property(int fd, struct get_reg_config *cfg, __u64 *v
if (!err)
return 0;
+ if (cfg->fabrics && nvme_is_fabrics_optional_reg(cfg->offset)) {
+ *value = -1;
+ return 0;
+ }
+
if (!cfg->fabrics &&
nvme_status_equals(err, NVME_STATUS_TYPE_NVME, NVME_SC_INVALID_FIELD)) {
*value = -1;
@@ -5320,6 +5333,9 @@ static int nvme_get_properties(int fd, void **pbar, struct get_reg_config *cfg)
memset(bar, 0xff, size);
for (offset = NVME_REG_CAP; offset <= NVME_REG_CMBSZ;
offset += is_64bit ? sizeof(uint64_t) : sizeof(uint32_t)) {
+ if (!nvme_is_fabrics_reg(offset))
+ continue;
+
cfg->offset = offset;
err = nvme_get_single_property(fd, cfg, &value);
if (err)
@@ -5384,12 +5400,12 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu
_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
nvme_print_flags_t flags;
- bool fabrics = false;
void *bar;
int err;
struct get_reg_config cfg = {
.human_readable = false,
+ .fabrics = false,
};
NVME_ARGS(opts,
@@ -5410,14 +5426,14 @@ static int show_registers(int argc, char **argv, struct command *cmd, struct plu
bar = mmap_registers(dev, false);
if (!bar) {
+ cfg.fabrics = true;
err = nvme_get_properties(dev_fd(dev), &bar, &cfg);
if (err)
return err;
- fabrics = true;
}
- nvme_show_ctrl_registers(bar, fabrics, flags);
- if (fabrics)
+ nvme_show_ctrl_registers(bar, cfg.fabrics, flags);
+ if (cfg.fabrics)
free(bar);
else
munmap(bar, getpagesize());
@@ -6166,7 +6182,7 @@ static int format_cmd(int argc, char **argv, struct command *cmd, struct plugin
return -errno;
}
- if ((ctrl->fna & 1) == 1) {
+ if (ctrl->fna & NVME_CTRL_FNA_FMT_ALL_NAMESPACES) {
/*
* FNA bit 0 set to 1: all namespaces ... shall be configured with the same
* attributes and a format (excluding secure erase) of any namespace results in a
@@ -7697,7 +7713,8 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
_cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
_cleanup_free_ struct nvme_nvm_id_ns *nvm_ns = NULL;
_cleanup_free_ struct nvme_id_ns *ns = NULL;
- __u8 lba_index, ms = 0, sts = 0, pif = 0;
+ __u8 lba_index, sts = 0, pif = 0;
+ __u16 ms;
const char *start_block_addr = "64-bit addr of first block to access";
const char *data_size = "size of data in bytes";
@@ -7882,7 +7899,7 @@ static int submit_io(int opcode, char *command, const char *desc, int argc, char
nvme_id_ns_flbas_to_lbaf_inuse(ns->flbas, &lba_index);
logical_block_size = 1 << ns->lbaf[lba_index].ds;
- ms = ns->lbaf[lba_index].ms;
+ ms = le16_to_cpu(ns->lbaf[lba_index].ms);
nvm_ns = nvme_alloc(sizeof(*nvm_ns));
if (!nvm_ns)
@@ -9158,18 +9175,90 @@ static int check_dhchap_key(int argc, char **argv, struct command *command, stru
return 0;
}
+static int append_keyfile(const char *keyring, long id, const char *keyfile)
+{
+ _cleanup_free_ unsigned char *key_data = NULL;
+ _cleanup_free_ char *exported_key = NULL;
+ _cleanup_free_ char *identity = NULL;
+ _cleanup_file_ FILE *fd = NULL;
+ int err, ver, hmac, key_len;
+ mode_t old_umask;
+ long kr_id;
+ char type;
+
+ kr_id = nvme_lookup_keyring(keyring);
+ if (kr_id <= 0) {
+ nvme_show_error("Failed to lookup keyring '%s', %s",
+ keyring, strerror(errno));
+ return -errno;
+ }
+
+ identity = nvme_describe_key_serial(id);
+ if (!identity) {
+ nvme_show_error("Failed to get identity info, %s",
+ strerror(errno));
+ return -errno;
+ }
+
+ if (sscanf(identity, "NVMe%01d%c%02d %*s", &ver, &type, &hmac) != 3) {
+ nvme_show_error("Failed to parse identity\n");
+ return -EINVAL;
+ }
+
+ key_data = nvme_read_key(kr_id, id, &key_len);
+ if (!key_data) {
+ nvme_show_error("Failed to read back derive TLS PSK, %s",
+ strerror(errno));
+ return -errno;
+ }
+
+ exported_key = nvme_export_tls_key_versioned(ver, hmac,
+ key_data, key_len);
+ if (!exported_key) {
+ nvme_show_error("Failed to export key, %s",
+ strerror(errno));
+ return -errno;
+ }
+
+ old_umask = umask(0);
+
+ fd = fopen(keyfile, "a");
+ if (!fd) {
+ nvme_show_error("Failed to open '%s', %s",
+ keyfile, strerror(errno));
+ err = -errno;
+ goto out;
+ }
+
+ err = fprintf(fd, "%s %s\n", identity, exported_key);
+ if (err < 0) {
+ nvme_show_error("Failed to append key to '%', %s",
+ keyfile, strerror(errno));
+ err = -errno;
+ } else {
+ err = 0;
+ }
+
+out:
+ chmod(keyfile, 0600);
+ umask(old_umask);
+
+ return err;
+}
+
static int gen_tls_key(int argc, char **argv, struct command *command, struct plugin *plugin)
{
const char *desc = "Generate a TLS key in NVMe PSK Interchange format.";
const char *secret =
"Optional secret (in hexadecimal characters) to be used for the TLS key.";
const char *hmac = "HMAC function to use for the retained key (1 = SHA-256, 2 = SHA-384).";
- const char *identity = "TLS identity version to use (0 = NVMe TCP 1.0c, 1 = NVMe TCP 2.0";
+ const char *version = "TLS identity version to use (0 = NVMe TCP 1.0c, 1 = NVMe TCP 2.0";
const char *hostnqn = "Host NQN for the retained key.";
const char *subsysnqn = "Subsystem NQN for the retained key.";
const char *keyring = "Keyring for the retained key.";
const char *keytype = "Key type of the retained key.";
const char *insert = "Insert retained key into the keyring.";
+ const char *keyfile = "Update key file with the derive TLS PSK.";
_cleanup_free_ unsigned char *raw_secret = NULL;
_cleanup_free_ char *encoded_key = NULL;
@@ -9184,8 +9273,9 @@ static int gen_tls_key(int argc, char **argv, struct command *command, struct pl
char *hostnqn;
char *subsysnqn;
char *secret;
- unsigned int hmac;
- unsigned int identity;
+ char *keyfile;
+ unsigned char hmac;
+ unsigned char version;
bool insert;
};
@@ -9195,8 +9285,9 @@ static int gen_tls_key(int argc, char **argv, struct command *command, struct pl
.hostnqn = NULL,
.subsysnqn = NULL,
.secret = NULL,
+ .keyfile = NULL,
.hmac = 1,
- .identity = 0,
+ .version = 0,
.insert = false,
};
@@ -9206,8 +9297,9 @@ static int gen_tls_key(int argc, char **argv, struct command *command, struct pl
OPT_STR("hostnqn", 'n', &cfg.hostnqn, hostnqn),
OPT_STR("subsysnqn", 'c', &cfg.subsysnqn, subsysnqn),
OPT_STR("secret", 's', &cfg.secret, secret),
- OPT_UINT("hmac", 'm', &cfg.hmac, hmac),
- OPT_UINT("identity", 'I', &cfg.identity, identity),
+ OPT_STR("keyfile", 'f', &cfg.keyfile, keyfile),
+ OPT_BYTE("hmac", 'm', &cfg.hmac, hmac),
+ OPT_BYTE("identity", 'I', &cfg.version, version),
OPT_FLAG("insert", 'i', &cfg.insert, insert));
err = parse_args(argc, argv, desc, opts);
@@ -9217,9 +9309,9 @@ static int gen_tls_key(int argc, char **argv, struct command *command, struct pl
nvme_show_error("Invalid HMAC identifier %u", cfg.hmac);
return -EINVAL;
}
- if (cfg.identity > 1) {
+ if (cfg.version > 1) {
nvme_show_error("Invalid TLS identity version %u",
- cfg.identity);
+ cfg.version);
return -EINVAL;
}
if (cfg.insert) {
@@ -9271,15 +9363,22 @@ static int gen_tls_key(int argc, char **argv, struct command *command, struct pl
if (cfg.insert) {
tls_key = nvme_insert_tls_key_versioned(cfg.keyring,
cfg.keytype, cfg.hostnqn,
- cfg.subsysnqn, cfg.identity,
+ cfg.subsysnqn, cfg.version,
cfg.hmac, raw_secret, key_len);
- if (tls_key < 0) {
+ if (tls_key <= 0) {
nvme_show_error("Failed to insert key, error %d", errno);
return -errno;
}
printf("Inserted TLS key %08x\n", (unsigned int)tls_key);
+
+ if (cfg.keyfile) {
+ err = append_keyfile(cfg.keyring, tls_key, cfg.keyfile);
+ if (err)
+ return err;
+ }
}
+
return 0;
}
@@ -9293,6 +9392,7 @@ static int check_tls_key(int argc, char **argv, struct command *command, struct
const char *keyring = "Keyring for the retained key.";
const char *keytype = "Key type of the retained key.";
const char *insert = "Insert retained key into the keyring.";
+ const char *keyfile = "Update key file with the derive TLS PSK.";
_cleanup_free_ unsigned char *decoded_key = NULL;
_cleanup_free_ char *hnqn = NULL;
@@ -9305,7 +9405,8 @@ static int check_tls_key(int argc, char **argv, struct command *command, struct
char *hostnqn;
char *subsysnqn;
char *keydata;
- unsigned int identity;
+ char *keyfile;
+ unsigned char identity;
bool insert;
};
@@ -9315,6 +9416,7 @@ static int check_tls_key(int argc, char **argv, struct command *command, struct
.hostnqn = NULL,
.subsysnqn = NULL,
.keydata = NULL,
+ .keyfile = NULL,
.identity = 0,
.insert = false,
};
@@ -9325,7 +9427,8 @@ static int check_tls_key(int argc, char **argv, struct command *command, struct
OPT_STR("hostnqn", 'n', &cfg.hostnqn, hostnqn),
OPT_STR("subsysnqn", 'c', &cfg.subsysnqn, subsysnqn),
OPT_STR("keydata", 'd', &cfg.keydata, keydata),
- OPT_UINT("identity", 'I', &cfg.identity, identity),
+ OPT_STR("keyfile", 'f', &cfg.keyfile, keyfile),
+ OPT_BYTE("identity", 'I', &cfg.identity, identity),
OPT_FLAG("insert", 'i', &cfg.insert, insert));
err = parse_args(argc, argv, desc, opts);
@@ -9366,11 +9469,17 @@ static int check_tls_key(int argc, char **argv, struct command *command, struct
cfg.keytype, cfg.hostnqn,
cfg.subsysnqn, cfg.identity,
hmac, decoded_key, decoded_len);
- if (tls_key < 0) {
+ if (tls_key <= 0) {
nvme_show_error("Failed to insert key, error %d", errno);
return -errno;
}
printf("Inserted TLS key %08x\n", (unsigned int)tls_key);
+
+ if (cfg.keyfile) {
+ err = append_keyfile(cfg.keyring, tls_key, cfg.keyfile);
+ if (err)
+ return err;
+ }
} else {
_cleanup_free_ char *tls_id = NULL;
@@ -9394,11 +9503,18 @@ static void __scan_tls_key(long keyring_id, long key_id,
_cleanup_free_ const unsigned char *key_data = NULL;
_cleanup_free_ char *encoded_key = NULL;
int key_len;
+ int ver, hmac;
+ char type;
key_data = nvme_read_key(keyring_id, key_id, &key_len);
if (!key_data)
return;
- encoded_key = nvme_export_tls_key(key_data, key_len);
+
+ if (sscanf(desc, "NVMe%01d%c%02d %*s", &ver, &type, &hmac) != 3)
+ return;
+
+ encoded_key = nvme_export_tls_key_versioned(ver, hmac,
+ key_data, key_len);
if (!encoded_key)
return;
fprintf(fd, "%s %s\n", desc, encoded_key);
@@ -9456,6 +9572,7 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin
const char *revoke = "Revoke key from the keyring.";
_cleanup_file_ FILE *fd = NULL;
+ mode_t old_umask = 0;
int cnt, err = 0;
struct config {
@@ -9496,9 +9613,11 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin
else
mode = "w";
+ old_umask = umask(0);
+
fd = fopen(cfg.keyfile, mode);
if (!fd) {
- nvme_show_error("Cannot open keyfile %s, error %d\n",
+ nvme_show_error("Cannot open keyfile %s, error %d",
cfg.keyfile, errno);
return -errno;
}
@@ -9519,16 +9638,41 @@ static int tls_key(int argc, char **argv, struct command *command, struct plugin
return -EINVAL;
} else if (cfg.export) {
err = nvme_scan_tls_keys(cfg.keyring, __scan_tls_key, fd);
- if (err)
+ if (err < 0) {
nvme_show_error("Export of TLS keys failed with '%s'",
nvme_strerror(errno));
+ return err;
+ }
+
+ if (argconfig_parse_seen(opts, "verbose"))
+ printf("exporting to %s\n", cfg.keyfile);
+
+ return 0;
} else if (cfg.import) {
err = import_key(cfg.keyring, fd);
+ if (err) {
+ nvme_show_error("Import of TLS keys failed with '%s'",
+ nvme_strerror(errno));
+ return err;
+ }
+
+ if (argconfig_parse_seen(opts, "verbose"))
+ printf("importing from %s\n", cfg.keyfile);
} else {
err = nvme_revoke_tls_key(cfg.keyring, cfg.keytype, cfg.revoke);
- if (err)
+ if (err) {
nvme_show_error("Failed to revoke key '%s'",
nvme_strerror(errno));
+ return err;
+ }
+
+ if (argconfig_parse_seen(opts, "verbose"))
+ printf("revoking key\n");
+ }
+
+ if (old_umask != 0 && fd) {
+ umask(old_umask);
+ chmod(cfg.keyfile, 0600);
}
return err;
diff --git a/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in b/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in
new file mode 100644
index 0000000..0b175be
--- /dev/null
+++ b/nvmf-autoconnect/udev-rules/70-nvmf-keys.rules.in
@@ -0,0 +1,7 @@
+#
+# nvmf-keys.rules:
+# Load pre-shared keys into the kernel keyring when
+# 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"
diff --git a/plugins/dapustor/dapustor-nvme.c b/plugins/dapustor/dapustor-nvme.c
new file mode 100644
index 0000000..1f96a62
--- /dev/null
+++ b/plugins/dapustor/dapustor-nvme.c
@@ -0,0 +1,553 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <inttypes.h>
+#include <errno.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+
+#include <sys/stat.h>
+
+#include "common.h"
+#include "nvme.h"
+#include "libnvme.h"
+#include "plugin.h"
+#include "nvme-print.h"
+
+#include "util/suffix.h"
+
+#define CREATE_CMD
+#include "dapustor-nvme.h"
+
+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;
+ struct __packed temperature {
+ __le16 max;
+ __le16 min;
+ __le16 cur;
+ } temperature;
+ struct __packed power_consumption {
+ __le16 max;
+ __le16 min;
+ __le16 avg;
+ } power_consumption;
+ struct __packed thermal_throttle_time {
+ __u8 sts;
+ __u32 time;
+ __u8 rsv;
+ } thermal_throttle_time;
+ };
+ __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_extended_additional_smart_log {
+ struct nvme_additional_smart_log_item sys_area_life_remain;
+ struct nvme_additional_smart_log_item nand_bytes_read;
+ struct nvme_additional_smart_log_item temperature;
+ struct nvme_additional_smart_log_item power_consumption;
+ struct nvme_additional_smart_log_item power_on_temperature;
+ struct nvme_additional_smart_log_item power_loss_protection;
+ struct nvme_additional_smart_log_item read_fail_count;
+ struct nvme_additional_smart_log_item thermal_throttle_time;
+ struct nvme_additional_smart_log_item flash_error_media_count;
+ struct nvme_additional_smart_log_item lifetime_write_amplification;
+ struct nvme_additional_smart_log_item firmware_update_count;
+ struct nvme_additional_smart_log_item dram_cecc_count;
+ struct nvme_additional_smart_log_item dram_uecc_count;
+ struct nvme_additional_smart_log_item xor_pass_count;
+ struct nvme_additional_smart_log_item xor_fail_count;
+ struct nvme_additional_smart_log_item xor_invoked_count;
+ struct nvme_additional_smart_log_item inflight_read_io_cmd;
+ struct nvme_additional_smart_log_item temp_since_born;
+ struct nvme_additional_smart_log_item temp_since_bootup;
+ struct nvme_additional_smart_log_item inflight_write_io_cmd;
+};
+
+static void show_dapustor_add_smart_log_jsn(struct nvme_additional_smart_log *smart,
+ struct json_object *dev_stats)
+{
+ struct json_object *entry_stats, *multi;
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->program_fail_cnt.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->program_fail_cnt.raw));
+ json_object_add_value_object(dev_stats, "program_fail_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->erase_fail_cnt.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->erase_fail_cnt.raw));
+ json_object_add_value_object(dev_stats, "erase_fail_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->wear_leveling_cnt.norm);
+ multi = json_create_object();
+ json_object_add_value_int(multi, "min",
+ le16_to_cpu(smart->wear_leveling_cnt.wear_level.min));
+ json_object_add_value_int(multi, "max",
+ le16_to_cpu(smart->wear_leveling_cnt.wear_level.max));
+ json_object_add_value_int(multi, "avg",
+ le16_to_cpu(smart->wear_leveling_cnt.wear_level.avg));
+ json_object_add_value_object(entry_stats, "raw", multi);
+ json_object_add_value_object(dev_stats, "wear_leveling", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->e2e_err_cnt.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->e2e_err_cnt.raw));
+ json_object_add_value_object(dev_stats, "end_to_end_error_detection_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->crc_err_cnt.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->crc_err_cnt.raw));
+ json_object_add_value_object(dev_stats, "crc_error_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->timed_workload_media_wear.norm);
+ json_object_add_value_float(entry_stats, "raw",
+ ((long double)int48_to_long(smart->timed_workload_media_wear.raw)) / 1024);
+ json_object_add_value_object(dev_stats, "timed_workload_media_wear", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->timed_workload_host_reads.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->timed_workload_host_reads.raw));
+ json_object_add_value_object(dev_stats, "timed_workload_host_reads", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->timed_workload_timer.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->timed_workload_timer.raw));
+ json_object_add_value_object(dev_stats, "timed_workload_timer", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->thermal_throttle_status.norm);
+ multi = json_create_object();
+ json_object_add_value_int(multi, "pct",
+ smart->thermal_throttle_status.thermal_throttle.pct);
+ json_object_add_value_int(multi, "cnt",
+ smart->thermal_throttle_status.thermal_throttle.count);
+ json_object_add_value_object(entry_stats, "raw", multi);
+ json_object_add_value_object(dev_stats, "thermal_throttle_status", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->retry_buffer_overflow_cnt.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->retry_buffer_overflow_cnt.raw));
+ json_object_add_value_object(dev_stats, "retry_buffer_overflow_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->pll_lock_loss_cnt.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->pll_lock_loss_cnt.raw));
+ json_object_add_value_object(dev_stats, "pll_lock_loss_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->nand_bytes_written.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->nand_bytes_written.raw));
+ json_object_add_value_object(dev_stats, "nand_bytes_written", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->host_bytes_written.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->host_bytes_written.raw));
+ json_object_add_value_object(dev_stats, "host_bytes_written", entry_stats);
+}
+
+static void show_dapustor_ext_add_smart_log_jsn(struct nvme_extended_additional_smart_log *smart,
+ struct json_object *dev_stats)
+{
+ struct json_object *entry_stats, *multi;
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->sys_area_life_remain.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->sys_area_life_remain.raw));
+ json_object_add_value_object(dev_stats, "system_area_life_remaining", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->nand_bytes_read.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->nand_bytes_read.raw));
+ json_object_add_value_object(dev_stats, "nand_bytes_read", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->temperature.norm);
+ multi = json_create_object();
+ json_object_add_value_int(multi, "min", le16_to_cpu(smart->temperature.temperature.min));
+ json_object_add_value_int(multi, "max", le16_to_cpu(smart->temperature.temperature.max));
+ json_object_add_value_int(multi, "cur", le16_to_cpu(smart->temperature.temperature.cur));
+ json_object_add_value_object(entry_stats, "raw", multi);
+ json_object_add_value_object(dev_stats, "temperature", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->power_consumption.norm);
+ multi = json_create_object();
+ json_object_add_value_int(multi, "min",
+ le16_to_cpu(smart->power_consumption.power_consumption.min));
+ json_object_add_value_int(multi, "max",
+ le16_to_cpu(smart->power_consumption.power_consumption.max));
+ json_object_add_value_int(multi, "avg",
+ le16_to_cpu(smart->power_consumption.power_consumption.avg));
+ json_object_add_value_object(entry_stats, "raw", multi);
+ json_object_add_value_object(dev_stats, "power_consumption", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->power_on_temperature.norm);
+ multi = json_create_object();
+ json_object_add_value_int(multi, "min",
+ le16_to_cpu(smart->power_on_temperature.temperature.min));
+ json_object_add_value_int(multi, "max",
+ le16_to_cpu(smart->power_on_temperature.temperature.max));
+ json_object_add_value_int(multi, "cur",
+ le16_to_cpu(smart->power_on_temperature.temperature.cur));
+ json_object_add_value_object(entry_stats, "raw", multi);
+ json_object_add_value_object(dev_stats, "power_on_temperature", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->power_loss_protection.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->power_loss_protection.raw));
+ json_object_add_value_object(dev_stats, "power_loss_protection", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->read_fail_count.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->read_fail_count.raw));
+ json_object_add_value_object(dev_stats, "read_fail_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->thermal_throttle_time.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->thermal_throttle_time.raw));
+ json_object_add_value_object(dev_stats, "thermal_throttle_time", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->flash_error_media_count.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->flash_error_media_count.raw));
+ json_object_add_value_object(dev_stats, "flash_error_media_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized",
+ smart->lifetime_write_amplification.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->lifetime_write_amplification.raw));
+ json_object_add_value_object(dev_stats, "lifetime_write_amplification", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->firmware_update_count.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->firmware_update_count.raw));
+ json_object_add_value_object(dev_stats, "firmware_update_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->dram_cecc_count.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->dram_cecc_count.raw));
+ json_object_add_value_object(dev_stats, "dram_cecc_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->dram_uecc_count.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->dram_uecc_count.raw));
+ json_object_add_value_object(dev_stats, "dram_uecc_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->xor_pass_count.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->xor_pass_count.raw));
+ json_object_add_value_object(dev_stats, "xor_pass_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->xor_fail_count.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->xor_fail_count.raw));
+ json_object_add_value_object(dev_stats, "xor_fail_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->xor_invoked_count.norm);
+ json_object_add_value_int(entry_stats, "raw", int48_to_long(smart->xor_invoked_count.raw));
+ json_object_add_value_object(dev_stats, "xor_invoked_count", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->inflight_read_io_cmd.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->inflight_read_io_cmd.raw));
+ json_object_add_value_object(dev_stats, "inflight_read_io_cmd", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->temp_since_born.norm);
+ multi = json_create_object();
+ json_object_add_value_int(multi, "min",
+ le16_to_cpu(smart->temp_since_born.temperature.min));
+ json_object_add_value_int(multi, "max",
+ le16_to_cpu(smart->temp_since_born.temperature.max));
+ json_object_add_value_int(multi, "cur",
+ le16_to_cpu(smart->temp_since_born.temperature.cur));
+ json_object_add_value_object(entry_stats, "raw", multi);
+ json_object_add_value_object(dev_stats, "temp_since_born", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->temp_since_bootup.norm);
+ multi = json_create_object();
+ json_object_add_value_int(multi, "min",
+ le16_to_cpu(smart->temp_since_bootup.temperature.min));
+ json_object_add_value_int(multi, "max",
+ le16_to_cpu(smart->temp_since_bootup.temperature.max));
+ json_object_add_value_int(multi, "cur",
+ le16_to_cpu(smart->temp_since_bootup.temperature.cur));
+ json_object_add_value_object(entry_stats, "raw", multi);
+ json_object_add_value_object(dev_stats, "temp_since_bootup", entry_stats);
+
+ entry_stats = json_create_object();
+ json_object_add_value_int(entry_stats, "normalized", smart->inflight_write_io_cmd.norm);
+ json_object_add_value_int(entry_stats, "raw",
+ int48_to_long(smart->inflight_write_io_cmd.raw));
+ json_object_add_value_object(dev_stats, "inflight_write_io_cmd", entry_stats);
+}
+
+static void show_dapustor_smart_log_jsn(struct nvme_additional_smart_log *smart,
+ struct nvme_extended_additional_smart_log *ext_smart,
+ unsigned int nsid, const char *devname, bool has_ext)
+{
+ struct json_object *root, *dev_stats;
+
+ root = json_create_object();
+ json_object_add_value_string(root, "Intel Smart log", devname);
+
+ dev_stats = json_create_object();
+ show_dapustor_add_smart_log_jsn(smart, dev_stats);
+ if (has_ext)
+ show_dapustor_ext_add_smart_log_jsn(ext_smart, dev_stats);
+ json_object_add_value_object(root, "Device stats", dev_stats);
+
+ json_print_object(root, NULL);
+ json_free_object(root);
+}
+
+static void show_dapustor_add_smart_log(struct nvme_additional_smart_log *smart)
+{
+ printf("program_fail_count : %3d%% %"PRIu64"\n",
+ smart->program_fail_cnt.norm,
+ int48_to_long(smart->program_fail_cnt.raw));
+ printf("erase_fail_count : %3d%% %"PRIu64"\n",
+ smart->erase_fail_cnt.norm,
+ int48_to_long(smart->erase_fail_cnt.raw));
+ printf("wear_leveling : %3d%% min: %u, max: %u, avg: %u\n",
+ smart->wear_leveling_cnt.norm,
+ le16_to_cpu(smart->wear_leveling_cnt.wear_level.min),
+ le16_to_cpu(smart->wear_leveling_cnt.wear_level.max),
+ le16_to_cpu(smart->wear_leveling_cnt.wear_level.avg));
+ printf("end_to_end_error_detection_count: %3d%% %"PRIu64"\n",
+ smart->e2e_err_cnt.norm,
+ int48_to_long(smart->e2e_err_cnt.raw));
+ printf("crc_error_count : %3d%% %"PRIu64"\n",
+ smart->crc_err_cnt.norm,
+ int48_to_long(smart->crc_err_cnt.raw));
+ printf("timed_workload_media_wear : %3d%% %.3f%%\n",
+ smart->timed_workload_media_wear.norm,
+ ((float)int48_to_long(smart->timed_workload_media_wear.raw)) / 1024);
+ printf("timed_workload_host_reads : %3d%% %"PRIu64"%%\n",
+ smart->timed_workload_host_reads.norm,
+ int48_to_long(smart->timed_workload_host_reads.raw));
+ printf("timed_workload_timer : %3d%% %"PRIu64" min\n",
+ smart->timed_workload_timer.norm,
+ int48_to_long(smart->timed_workload_timer.raw));
+ printf("thermal_throttle_status : %3d%% %u%%, cnt: %u\n",
+ smart->thermal_throttle_status.norm,
+ smart->thermal_throttle_status.thermal_throttle.pct,
+ smart->thermal_throttle_status.thermal_throttle.count);
+ printf("retry_buffer_overflow_count : %3d%% %"PRIu64"\n",
+ smart->retry_buffer_overflow_cnt.norm,
+ int48_to_long(smart->retry_buffer_overflow_cnt.raw));
+ printf("pll_lock_loss_count : %3d%% %"PRIu64"\n",
+ smart->pll_lock_loss_cnt.norm,
+ int48_to_long(smart->pll_lock_loss_cnt.raw));
+ printf("nand_bytes_written : %3d%% sectors: %"PRIu64"\n",
+ smart->nand_bytes_written.norm,
+ int48_to_long(smart->nand_bytes_written.raw));
+ printf("host_bytes_written : %3d%% sectors: %"PRIu64"\n",
+ smart->host_bytes_written.norm,
+ int48_to_long(smart->host_bytes_written.raw));
+}
+
+static void show_dapustor_ext_add_smart_log(struct nvme_extended_additional_smart_log *smart)
+{
+ printf("system_area_life_remaining : %3d%% %"PRIu64"\n",
+ smart->sys_area_life_remain.norm,
+ int48_to_long(smart->sys_area_life_remain.raw));
+ printf("nand_bytes_read : %3d%% %"PRIu64"\n",
+ smart->nand_bytes_read.norm,
+ int48_to_long(smart->nand_bytes_read.raw));
+ printf("temperature : %3d%% min: %u, max: %u, cur: %u\n",
+ smart->temperature.norm,
+ le16_to_cpu(smart->temperature.temperature.min),
+ le16_to_cpu(smart->temperature.temperature.max),
+ le16_to_cpu(smart->temperature.temperature.cur));
+ printf("power_consumption : %3d%% min: %u, max: %u, avg: %u\n",
+ smart->power_consumption.norm,
+ le16_to_cpu(smart->power_consumption.power_consumption.min),
+ le16_to_cpu(smart->power_consumption.power_consumption.max),
+ le16_to_cpu(smart->power_consumption.power_consumption.avg));
+ printf("power_on_temperature : %3d%% min: %u, max: %u, cur: %u\n",
+ smart->power_on_temperature.norm,
+ le16_to_cpu(smart->power_on_temperature.temperature.min),
+ le16_to_cpu(smart->power_on_temperature.temperature.max),
+ le16_to_cpu(smart->power_on_temperature.temperature.cur));
+ printf("power_loss_protection : %3d%% %"PRIu64"\n",
+ smart->power_loss_protection.norm,
+ int48_to_long(smart->power_loss_protection.raw));
+ printf("read_fail_count : %3d%% %"PRIu64"\n",
+ smart->read_fail_count.norm,
+ int48_to_long(smart->read_fail_count.raw));
+ printf("thermal_throttle_time : %3d%% %"PRIu64"\n",
+ smart->thermal_throttle_time.norm,
+ int48_to_long(smart->thermal_throttle_time.raw));
+ printf("flash_error_media_count : %3d%% %"PRIu64"\n",
+ smart->flash_error_media_count.norm,
+ int48_to_long(smart->flash_error_media_count.raw));
+ printf("lifetime_write_amplification : %3d%% %"PRIu64"\n",
+ smart->lifetime_write_amplification.norm,
+ int48_to_long(smart->lifetime_write_amplification.raw));
+ printf("firmware_update_count : %3d%% %"PRIu64"\n",
+ smart->firmware_update_count.norm,
+ int48_to_long(smart->firmware_update_count.raw));
+ printf("dram_cecc_count : %3d%% %"PRIu64"\n",
+ smart->dram_cecc_count.norm,
+ int48_to_long(smart->dram_cecc_count.raw));
+ printf("dram_uecc_count : %3d%% %"PRIu64"\n",
+ smart->dram_uecc_count.norm,
+ int48_to_long(smart->dram_uecc_count.raw));
+ printf("xor_pass_count : %3d%% %"PRIu64"\n",
+ smart->xor_pass_count.norm,
+ int48_to_long(smart->xor_pass_count.raw));
+ printf("xor_fail_count : %3d%% %"PRIu64"\n",
+ smart->xor_fail_count.norm,
+ int48_to_long(smart->xor_fail_count.raw));
+ printf("xor_invoked_count : %3d%% %"PRIu64"\n",
+ smart->xor_invoked_count.norm,
+ int48_to_long(smart->xor_invoked_count.raw));
+ printf("inflight_read_io_cmd : %3d%% %"PRIu64"\n",
+ smart->inflight_read_io_cmd.norm,
+ int48_to_long(smart->inflight_read_io_cmd.raw));
+ printf("temp_since_born : %3d%% min: %u, max: %u, cur: %u\n",
+ smart->temp_since_born.norm,
+ le16_to_cpu(smart->temp_since_born.temperature.min),
+ le16_to_cpu(smart->temp_since_born.temperature.max),
+ le16_to_cpu(smart->temp_since_born.temperature.cur));
+ printf("temp_since_bootup : %3d%% min: %u, max: %u, cur: %u\n",
+ smart->temp_since_bootup.norm,
+ le16_to_cpu(smart->temp_since_bootup.temperature.min),
+ le16_to_cpu(smart->temp_since_bootup.temperature.max),
+ le16_to_cpu(smart->temp_since_bootup.temperature.cur));
+ printf("inflight_write_io_cmd : %3d%% %"PRIu64"\n",
+ smart->inflight_write_io_cmd.norm,
+ int48_to_long(smart->inflight_write_io_cmd.raw));
+}
+
+static void show_dapustor_smart_log(struct nvme_additional_smart_log *smart,
+ struct nvme_extended_additional_smart_log *ext_smart,
+ unsigned int nsid, const char *devname, bool has_ext)
+{
+ printf("Additional Smart Log for NVME device:%s namespace-id:%x\n",
+ devname, nsid);
+ printf("key normalized raw\n");
+ show_dapustor_add_smart_log(smart);
+ if (has_ext)
+ show_dapustor_ext_add_smart_log(ext_smart);
+}
+
+static int dapustor_additional_smart_log_data(
+ int dev_fd,
+ struct nvme_additional_smart_log *smart_log,
+ struct nvme_extended_additional_smart_log *ext_smart_log,
+ bool *has_ext)
+{
+ int err;
+
+ err = nvme_get_log_simple(dev_fd, 0xca, sizeof(*smart_log), smart_log);
+ if (err) {
+ nvme_show_status(err);
+ return err;
+ }
+ err = nvme_get_log_simple(dev_fd, 0xcb, sizeof(*ext_smart_log), ext_smart_log);
+ *has_ext = !err;
+ return 0;
+}
+
+static int dapustor_additional_smart_log(int argc, char **argv, struct command *cmd,
+ struct plugin *plugin)
+{
+ 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";
+ const char *json = "Dump output in json format";
+
+ struct nvme_additional_smart_log smart_log;
+ struct nvme_extended_additional_smart_log ext_smart_log;
+ struct nvme_dev *dev;
+ int err;
+ bool has_ext = false;
+
+ struct config {
+ uint32_t namespace_id;
+ bool raw_binary;
+ bool json;
+ };
+
+ struct config cfg = {
+ .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_END()
+ };
+
+ err = parse_and_open(&dev, argc, argv, desc, opts);
+ if (err)
+ return err;
+
+ err = dapustor_additional_smart_log_data(dev_fd(dev), &smart_log, &ext_smart_log, &has_ext);
+ if (!err) {
+ if (cfg.json)
+ show_dapustor_smart_log_jsn(&smart_log, &ext_smart_log,
+ cfg.namespace_id, dev->name, has_ext);
+ else if (!cfg.raw_binary)
+ show_dapustor_smart_log(&smart_log, &ext_smart_log,
+ cfg.namespace_id, dev->name, has_ext);
+ else {
+ d_raw((unsigned char *)&smart_log, sizeof(smart_log));
+ if (has_ext)
+ d_raw((unsigned char *)&ext_smart_log, sizeof(ext_smart_log));
+ }
+ }
+ dev_close(dev);
+ return err;
+}
diff --git a/plugins/dapustor/dapustor-nvme.h b/plugins/dapustor/dapustor-nvme.h
new file mode 100644
index 0000000..9d0d332
--- /dev/null
+++ b/plugins/dapustor/dapustor-nvme.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#undef CMD_INC_FILE
+#define CMD_INC_FILE plugins/dapustor/dapustor-nvme
+
+#if !defined(DAPUSTOR_NVME) || defined(CMD_HEADER_MULTI_READ)
+#define DAPUSTOR_NVME
+
+#include "cmd.h"
+
+PLUGIN(NAME("dapustor", "DapuStor vendor specific extensions", NVME_VERSION),
+ COMMAND_LIST(
+ ENTRY("smart-log-add", "Retrieve DapuStor SMART Log, show it", dapustor_additional_smart_log)
+ )
+);
+
+#endif
+
+#include "define_cmd.h"
diff --git a/plugins/fdp/fdp.c b/plugins/fdp/fdp.c
index 1efdd76..cac0b2b 100644
--- a/plugins/fdp/fdp.c
+++ b/plugins/fdp/fdp.c
@@ -57,7 +57,7 @@ static int fdp_configs(int argc, char **argv, struct command *cmd,
return err;
err = validate_output_format(cfg.output_format, &flags);
- if (flags < 0)
+ if (err < 0)
goto out;
if (cfg.raw_binary)
@@ -138,7 +138,7 @@ static int fdp_usage(int argc, char **argv, struct command *cmd, struct plugin *
return err;
err = validate_output_format(cfg.output_format, &flags);
- if (flags < 0)
+ if (err < 0)
goto out;
if (cfg.raw_binary)
@@ -209,7 +209,7 @@ static int fdp_stats(int argc, char **argv, struct command *cmd, struct plugin *
return err;
err = validate_output_format(cfg.output_format, &flags);
- if (flags < 0)
+ if (err < 0)
goto out;
if (cfg.raw_binary)
@@ -270,7 +270,7 @@ static int fdp_events(int argc, char **argv, struct command *cmd, struct plugin
return err;
err = validate_output_format(cfg.output_format, &flags);
- if (flags < 0)
+ if (err < 0)
goto out;
if (cfg.raw_binary)
@@ -329,7 +329,7 @@ static int fdp_status(int argc, char **argv, struct command *cmd, struct plugin
return err;
err = validate_output_format(cfg.output_format, &flags);
- if (flags < 0)
+ if (err < 0)
goto out;
if (cfg.raw_binary)
diff --git a/plugins/innogrit/innogrit-nvme.c b/plugins/innogrit/innogrit-nvme.c
index cd47efa..9e7be48 100644
--- a/plugins/innogrit/innogrit-nvme.c
+++ b/plugins/innogrit/innogrit-nvme.c
@@ -16,176 +16,175 @@
#define CREATE_CMD
#include "innogrit-nvme.h"
-static int innogrit_smart_log_additional(int argc, char **argv,
- struct command *command,
- struct plugin *plugin)
+static int nvme_vucmd(int fd, unsigned char opcode, unsigned int cdw12,
+ unsigned int cdw13, unsigned int cdw14,
+ unsigned int cdw15, char *data, int data_len)
{
- struct nvme_smart_log smart_log = { 0 };
- struct vsc_smart_log *pvsc_smart = (struct vsc_smart_log *)smart_log.rsvd232;
- const char *desc = "Retrieve additional SMART log for the given device ";
- const char *namespace = "(optional) desired namespace";
- struct nvme_dev *dev;
- int err, i, iindex;
-
- struct config {
- __u32 namespace_id;
- };
+ struct nvme_passthru_cmd cmd;
- struct config cfg = {
- .namespace_id = NVME_NSID_ALL,
- };
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.opcode = opcode;
+ cmd.cdw2 = IGVSC_SIG;
+ cmd.cdw10 = data_len / 4;
+ cmd.cdw12 = cdw12;
+ cmd.cdw13 = cdw13;
+ cmd.cdw14 = cdw14;
+ cmd.cdw15 = cdw15;
+ cmd.nsid = 0xffffffff;
+ cmd.addr = (__u64)(__u64)(uintptr_t)data;
+ cmd.data_len = data_len;
+ return nvme_submit_admin_passthru(fd, &cmd, NULL);
+}
- OPT_ARGS(opts) = {
- OPT_UINT("namespace-id", 'n', &cfg.namespace_id, namespace),
- OPT_END()
+int getlogpage(struct nvme_dev *dev, unsigned char ilogid, unsigned char ilsp,
+ char *data, int data_len, unsigned int *result)
+{
+ struct nvme_get_log_args args = {
+ .args_size = sizeof(args),
+ .fd = dev_fd(dev),
+ .lid = ilogid,
+ .nsid = 0xffffffff,
+ .lpo = 0,
+ .lsp = ilsp,
+ .lsi = 0,
+ .rae = true,
+ .uuidx = 0,
+ .csi = NVME_CSI_NVM,
+ .ot = false,
+ .len = data_len,
+ .log = (void *)data,
+ .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+ .result = result,
};
-
- err = parse_and_open(&dev, argc, argv, desc, opts);
- if (err)
- return err;
-
- nvme_get_log_smart(dev_fd(dev), cfg.namespace_id, false, &smart_log);
- nvme_show_smart_log(&smart_log, cfg.namespace_id, dev->name, NORMAL);
-
- printf("DW0[0-1] Defect Cnt : %u\n", pvsc_smart->defect_cnt);
- printf("DW0[2-3] Slc Spb Cnt : %u\n", pvsc_smart->slc_spb_cnt);
- printf("DW1 Slc Total Ec Cnt : %u\n", pvsc_smart->slc_total_ec_cnt);
- printf("DW2 Slc Max Ec Cnt : %u\n", pvsc_smart->slc_max_ec_cnt);
- printf("DW3 Slc Min Ec Cnt : %u\n", pvsc_smart->slc_min_ec_cnt);
- printf("DW4 Slc Avg Ec Cnt : %u\n", pvsc_smart->slc_avg_ec_cnt);
- printf("DW5 Total Ec Cnt : %u\n", pvsc_smart->total_ec_cnt);
- printf("DW6 Max Ec Cnt : %u\n", pvsc_smart->max_ec_cnt);
- printf("DW7 Min Ec Cnt : %u\n", pvsc_smart->min_ec_cnt);
- printf("DW8 Avg Ec Cnt : %u\n", pvsc_smart->avg_ec_cnt);
- printf("DW9 Mrd Rr Good Cnt : %u\n", pvsc_smart->mrd_rr_good_cnt);
- printf("DW10 Ard Rr Good Cnt : %u\n", pvsc_smart->ard_rr_good_cnt);
- printf("DW11 Preset Cnt : %u\n", pvsc_smart->preset_cnt);
- printf("DW12 Nvme Reset Cnt : %u\n", pvsc_smart->nvme_reset_cnt);
- printf("DW13 Low Pwr Cnt : %u\n", pvsc_smart->low_pwr_cnt);
- printf("DW14 Wa : %u\n", pvsc_smart->wa);
- printf("DW15 Ps3 Entry Cnt : %u\n", pvsc_smart->ps3_entry_cnt);
- printf("DW16[0] highest_temp[0] : %u\n", pvsc_smart->highest_temp[0]);
- printf("DW16[1] highest_temp[1] : %u\n", pvsc_smart->highest_temp[1]);
- printf("DW16[2] highest_temp[2] : %u\n", pvsc_smart->highest_temp[2]);
- printf("DW16[3] highest_temp[3] : %u\n", pvsc_smart->highest_temp[3]);
- printf("DW17 weight_ec : %u\n", pvsc_smart->weight_ec);
- printf("DW18 slc_cap_mb : %u\n", pvsc_smart->slc_cap_mb);
- printf("DW19-20 nand_page_write_cnt : %llu\n", pvsc_smart->nand_page_write_cnt);
- printf("DW21 program_error_cnt : %u\n", pvsc_smart->program_error_cnt);
- printf("DW22 erase_error_cnt : %u\n", pvsc_smart->erase_error_cnt);
- printf("DW23[0] flash_type : %u\n", pvsc_smart->flash_type);
- printf("DW24 hs_crc_err_cnt : %u\n", pvsc_smart->hs_crc_err_cnt);
- printf("DW25 ddr_ecc_err_cnt : %u\n", pvsc_smart->ddr_ecc_err_cnt);
- iindex = 26;
- for (i = 0; i < (sizeof(pvsc_smart->reserved3)/4); i++) {
- if (pvsc_smart->reserved3[i] != 0)
- printf("DW%-37d : %u\n", iindex, pvsc_smart->reserved3[i]);
- iindex++;
- }
-
- return 0;
+ return nvme_get_log(&args);
}
-static int sort_eventlog_fn(const void *a, const void *b)
+int getvsctype(struct nvme_dev *dev)
{
- const struct eventlog_addindex *l = a;
- const struct eventlog_addindex *r = b;
- int rc;
-
- if (l->ms > r->ms) {
- rc = 1;
- } else if (l->ms < r->ms) {
- rc = -1;
- } else {
- if (l->iindex < r->iindex)
- rc = -1;
- else
- rc = 1;
+ unsigned char ilogid;
+ char data[4096];
+ struct drvinfo_t *pdrvinfo = (struct drvinfo_t *)data;
+
+ memset(data, 0, 4096);
+ // pdrvinfo by getlogpage
+ for (ilogid = 0xe1; ilogid < 0xe2; ilogid++) {
+ getlogpage(dev, ilogid, 0, data, 4096, NULL);
+ if (pdrvinfo->signature == 0x5A)
+ return 1;
}
- return rc;
+ //pdrvinfo by vucmd
+ nvme_vucmd(dev_fd(dev), 0xfe, 0x82, 0X03, 0x00, 0, (char *)data, 4096);
+ if (pdrvinfo->signature == 0x5A)
+ return 1;
+
+ return 0;
}
-static void sort_eventlog(struct eventlog *data16ksrc, unsigned int icount)
+int getvsc_eventlog(struct nvme_dev *dev, FILE *fp)
{
- struct eventlog_addindex peventlogadd[512];
- unsigned int i;
+ char data[4096];
+ unsigned int errcnt, rxlen, start_flag;
+ unsigned long long end_flag;
+ struct evlg_flush_hdr *pevlog = (struct evlg_flush_hdr *)data;
+ int ret = -1;
+ int ivsctype = getvsctype(dev);
- for (i = 0; i < icount; i++) {
- memcpy(&peventlogadd[i], &data16ksrc[i], sizeof(struct eventlog));
- peventlogadd[i].iindex = i;
- }
+ start_flag = 0;
+ rxlen = 0;
+ errcnt = 0;
- qsort(peventlogadd, icount, sizeof(struct eventlog_addindex), sort_eventlog_fn);
+ while (1) {
+ memset(data, 0, 4096);
+ if (ivsctype == 0) {
+ ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET_EVENT_LOG, 0, 0,
+ (SRB_SIGNATURE >> 32),
+ (SRB_SIGNATURE & 0xFFFFFFFF),
+ (char *)data, 4096);
+ } else {
+ ret = nvme_vucmd(dev_fd(dev), NVME_VSC_TYPE1_GET, 0x60, 0,
+ 0, 0, (char *)data, 4096);
+ }
- for (i = 0; i < icount; i++)
- memcpy(&data16ksrc[i], &peventlogadd[i], sizeof(struct eventlog));
-}
+ if (ret == -1) {
+ printf("(error)\n");
+ return IG_ERROR;
+ }
-static unsigned char setfilecontent(char *filenamea, unsigned char *buffer,
- unsigned int buffersize)
-{
- FILE *fp = NULL;
- int rc;
+ if (pevlog->signature == EVLOG_SIG) {
+ errcnt = 0;
+ } else {
+ errcnt++;
+ if (errcnt > 16) {
+ printf("(invalid data error)\n");
+ return IG_ERROR;
+ }
+ }
- if (buffersize == 0)
- return true;
- fp = fopen(filenamea, "a+");
- rc = fwrite(buffer, 1, buffersize, fp);
- fclose(fp);
- if (rc != buffersize)
- return false;
- return true;
+ if (start_flag == 1) {
+ end_flag = *(unsigned long long *)&data[4096 - 32];
+ if (end_flag == 0xffffffff00000000)
+ break;
+ fwrite(data, 1, 4096, fp);
+ rxlen += 4096;
+ printf("\rget eventlog : %d.%d MB ", rxlen / SIZE_MB,
+ (rxlen % SIZE_MB) * 100 / SIZE_MB);
+ } else if (errcnt == 0) {
+ printf("get eventlog by vsc command\n");
+ start_flag = 1;
+ fwrite(data, 1, 4096, fp);
+ rxlen += 4096;
+ }
+ }
+ printf("\n");
+ return IG_SUCCESS;
}
-static int nvme_vucmd(int fd, unsigned char opcode, unsigned int cdw12,
- unsigned int cdw13, unsigned int cdw14,
- unsigned int cdw15, char *data, int data_len)
+int getlogpage_eventlog(struct nvme_dev *dev, FILE *fp)
{
- struct nvme_passthru_cmd cmd;
+ unsigned int i, result, total_size;
+ char data[4096];
+ int ret = 0;
- memset(&cmd, 0, sizeof(cmd));
- cmd.opcode = opcode;
- cmd.cdw2 = IGVSC_SIG;
- cmd.cdw10 = data_len / 4;
- cmd.cdw12 = cdw12;
- cmd.cdw13 = cdw13;
- cmd.cdw14 = cdw14;
- cmd.cdw15 = cdw15;
- cmd.nsid = 0xffffffff;
- cmd.addr = (__u64)(__u64)(uintptr_t)data;
- cmd.data_len = data_len;
- return nvme_submit_admin_passthru(fd, &cmd, NULL);
+ result = 0;
+ ret = getlogpage(dev, 0xcb, 0x01, data, 4096, NULL);
+ if (ret)
+ return IG_UNSUPPORT;
+
+ ret = getlogpage(dev, 0xcb, 0x02, data, 4096, &result);
+ if ((ret) || (result == 0))
+ return IG_UNSUPPORT;
+
+ total_size = result * 4096;
+ printf("total eventlog : %d.%d MB\n", total_size / SIZE_MB,
+ (total_size % SIZE_MB) * 100 / SIZE_MB);
+ for (i = 0; i <= total_size; i += 4096) {
+ ret = getlogpage(dev, 0xcb, 0x00, data, 4096, NULL);
+ printf("\rget eventlog : %d.%d MB ", i / SIZE_MB,
+ (i % SIZE_MB) * 100 / SIZE_MB);
+ if (ret) {
+ printf("(error)\n");
+ return IG_ERROR;
+ }
+ fwrite(data, 1, 4096, fp);
+ }
+ printf("\n");
+ return IG_SUCCESS;
}
-static int innogrit_vsc_geteventlog(int argc, char **argv,
+static int innogrit_geteventlog(int argc, char **argv,
struct command *command,
struct plugin *plugin)
{
time_t timep;
struct tm *logtime;
- int icount, ioffset16k, iblock, ivsctype;
char currentdir[128], filename[512];
- unsigned char data[4096], data16k[SIZE_16K], zerob[32];
- unsigned int *pcheckdata;
- unsigned int isize, icheck_stopvalue, iend;
- unsigned char bSortLog = false, bget_nextlog = true;
- struct evlg_flush_hdr *pevlog = (struct evlg_flush_hdr *)data;
const char *desc = "Recrieve event log for the given device ";
- const char *clean_opt = "(optional) 1 for clean event log";
struct nvme_dev *dev;
+ FILE *fp = NULL;
int ret = -1;
- struct config {
- __u32 clean_flg;
- };
-
- struct config cfg = {
- .clean_flg = 0,
- };
-
OPT_ARGS(opts) = {
- OPT_UINT("clean_flg", 'c', &cfg.clean_flg, clean_opt),
OPT_END()
};
@@ -193,120 +192,25 @@ static int innogrit_vsc_geteventlog(int argc, char **argv,
if (ret)
return ret;
-
if (getcwd(currentdir, 128) == NULL)
return -1;
- ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x03, 0x00, 0x00, (char *)data, 4096);
- if (ret == -1)
- return ret;
-
- if (data[0] == 0x5A)
- ivsctype = 1;
- else
- ivsctype = 0;
-
time(&timep);
logtime = localtime(&timep);
- sprintf(filename, "%s/eventlog_%02d%02d-%02d%02d%02d.elog", currentdir, logtime->tm_mon+1,
- logtime->tm_mday, logtime->tm_hour, logtime->tm_min, logtime->tm_sec);
-
- iblock = 0;
- ioffset16k = 0;
- memset(data16k, 0, SIZE_16K);
- memset(zerob, 0, 32);
-
- icount = 0;
- while (bget_nextlog) {
- if (icount % 100 == 0) {
- printf("\rWait for Dump EventLog " XCLEAN_LINE);
- fflush(stdout);
- icount = 0;
- } else if (icount % 5 == 0) {
- printf(".");
- fflush(stdout);
- }
- icount++;
-
- memset(data, 0, 4096);
- if (ivsctype == 1)
- ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x60, 0x00, 0x00, 0x00, (char *)data,
- 4096);
- else
- ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET_EVENT_LOG, 0, 0,
- (SRB_SIGNATURE >> 32),
- (SRB_SIGNATURE & 0xFFFFFFFF),
- (char *)data, 4096);
- if (ret == -1)
- return ret;
-
- pcheckdata = (unsigned int *)&data[4096 - 32];
- icheck_stopvalue = pcheckdata[1];
-
- if (icheck_stopvalue == 0xFFFFFFFF) {
- isize = pcheckdata[0];
- if (isize == 0) {
- /* Finish Log */
- bget_nextlog = false;
- } else if (bSortLog) {
- /* No Full 4K Package */
- for (iend = 0; iend < isize - 32; iend += sizeof(struct eventlog)) {
- if (memcmp(&data[iend], zerob, sizeof(struct eventlog)) != 0) {
- memcpy(&data16k[ioffset16k], &data[iend], sizeof(struct eventlog));
- ioffset16k += sizeof(struct eventlog);
- }
- }
- } else {
- setfilecontent(filename, data, isize);
- }
- } else {
- /* Full 4K Package */
- if ((pevlog->signature == EVLOG_SIG) && (pevlog->log_type == 1))
- bSortLog = true;
-
- if (bSortLog) {
- for (iend = 0; iend < SIZE_4K; iend += sizeof(struct eventlog)) {
- if (memcmp(&data[iend], zerob, sizeof(struct eventlog)) != 0) {
- memcpy(&data16k[ioffset16k], &data[iend], sizeof(struct eventlog));
- ioffset16k += sizeof(struct eventlog);
- }
- }
-
- iblock++;
- if (iblock == 4) {
- sort_eventlog((struct eventlog *)(data16k + sizeof(struct evlg_flush_hdr)),
- (ioffset16k - sizeof(struct evlg_flush_hdr))/sizeof(struct eventlog));
- setfilecontent(filename, data16k, ioffset16k);
- ioffset16k = 0;
- iblock = 0;
- memset(data16k, 0, SIZE_16K);
- }
- } else {
- setfilecontent(filename, data, SIZE_4K);
- }
-
- }
- }
+ sprintf(filename, "%s/eventlog_%02d%02d-%02d%02d%02d.eraw", currentdir,
+ logtime->tm_mon+1, logtime->tm_mday, logtime->tm_hour, logtime->tm_min,
+ logtime->tm_sec);
+ printf("output eventlog file : %s\n", filename);
- if (bSortLog) {
- if (ioffset16k > 0) {
- sort_eventlog((struct eventlog *)(data16k + sizeof(struct evlg_flush_hdr)),
- (ioffset16k - sizeof(struct evlg_flush_hdr))/sizeof(struct eventlog));
- setfilecontent(filename, data16k, ioffset16k);
- }
- }
-
- printf("\r" XCLEAN_LINE "Dump eventLog finish to %s\n", filename);
- chmod(filename, 0666);
-
- if (cfg.clean_flg == 1) {
- printf("Clean eventlog\n");
- nvme_vucmd(dev_fd(dev), NVME_VSC_CLEAN_EVENT_LOG, 0, 0,
- (SRB_SIGNATURE >> 32),
- (SRB_SIGNATURE & 0xFFFFFFFF), (char *)NULL, 0);
- }
+ fp = fopen(filename, "a+");
+ getvsctype(dev);
+ ret = getlogpage_eventlog(dev, fp);
+ if (ret == IG_UNSUPPORT)
+ ret = getvsc_eventlog(dev, fp);
+ fclose(fp);
dev_close(dev);
+ chmod(filename, 0666);
return ret;
}
@@ -318,13 +222,14 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command,
struct tm *logtime;
char currentdir[128], filename[512], fname[128];
unsigned int itotal, icur, ivsctype;
- unsigned char data[4096];
+ char data[4096];
struct cdumpinfo cdumpinfo;
unsigned char busevsc = false;
unsigned int ipackcount, ipackindex;
char fwvera[32];
const char *desc = "Recrieve cdump data for the given device ";
struct nvme_dev *dev;
+ FILE *fp = NULL;
int ret = -1;
OPT_ARGS(opts) = {
@@ -335,50 +240,48 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command,
if (ret)
return ret;
+ ivsctype = getvsctype(dev);
+
if (getcwd(currentdir, 128) == NULL)
return -1;
time(&timep);
logtime = localtime(&timep);
- ivsctype = 0;
ipackindex = 0;
memset(data, 0, 4096);
- ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x03, 0x00, 0x00, (char *)data, 4096);
- if (ret == -1)
- return ret;
-
- if (data[0] == 0x5A) {
- ivsctype = 1;
- ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x08, 0x00, 0x00, (char *)data, 4096);
- } else {
- ivsctype = 0;
+ if (ivsctype == 0) {
ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET, VSC_FN_GET_CDUMP, 0x00,
- (SRB_SIGNATURE >> 32), (SRB_SIGNATURE & 0xFFFFFFFF),
- (char *)data, 4096);
+ (SRB_SIGNATURE >> 32), (SRB_SIGNATURE & 0xFFFFFFFF),
+ (char *)data, 4096);
+ } else {
+ ret = nvme_vucmd(dev_fd(dev), NVME_VSC_TYPE1_GET, 0x82, 0x00,
+ 0, 0, (char *)data, 4096);
}
- if (ret == -1)
- return ret;
- memcpy(&cdumpinfo, &data[3072], sizeof(cdumpinfo));
- if (cdumpinfo.sig == 0x5a5b5c5d) {
- busevsc = true;
- ipackcount = cdumpinfo.ipackcount;
- if (ipackcount == 0) {
- itotal = 0;
- } else {
- itotal = cdumpinfo.cdumppack[ipackindex].ilenth;
- memset(fwvera, 0, sizeof(fwvera));
- memcpy(fwvera, cdumpinfo.cdumppack[ipackindex].fwver, 8);
- sprintf(fname, "cdump_%02d%02d-%02d%02d%02d_%d_%s.cdp", logtime->tm_mon+1,
- logtime->tm_mday, logtime->tm_hour, logtime->tm_min, logtime->tm_sec,
- ipackindex, fwvera);
- sprintf(filename, "%s/%s", currentdir, fname);
+ if (ret == 0) {
+ memcpy(&cdumpinfo, &data[3072], sizeof(cdumpinfo));
+ if (cdumpinfo.sig == 0x5a5b5c5d) {
+ busevsc = true;
+ ipackcount = cdumpinfo.ipackcount;
+ if (ipackcount == 0) {
+ itotal = 0;
+ } else {
+ itotal = cdumpinfo.cdumppack[ipackindex].ilenth;
+ memset(fwvera, 0, sizeof(fwvera));
+ memcpy(fwvera, cdumpinfo.cdumppack[ipackindex].fwver, 8);
+ sprintf(fname, "cdump_%02d%02d-%02d%02d%02d_%d_%s.cdp",
+ logtime->tm_mon+1, logtime->tm_mday, logtime->tm_hour,
+ logtime->tm_min, logtime->tm_sec, ipackindex, fwvera);
+ sprintf(filename, "%s/%s", currentdir, fname);
+ if (fp != NULL)
+ fclose(fp);
+ fp = fopen(filename, "a+");
+ }
}
}
-
if (busevsc == false) {
memset(data, 0, 4096);
ret = nvme_get_nsid_log(dev_fd(dev), true, 0x07,
@@ -389,9 +292,12 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command,
ipackcount = 1;
memcpy(&itotal, &data[4092], 4);
- sprintf(fname, "cdump_%02d%02d-%02d%02d%02d.cdp", logtime->tm_mon+1, logtime->tm_mday,
- logtime->tm_hour, logtime->tm_min, logtime->tm_sec);
+ sprintf(fname, "cdump_%02d%02d-%02d%02d%02d.cdp", logtime->tm_mon+1,
+ logtime->tm_mday, logtime->tm_hour, logtime->tm_min, logtime->tm_sec);
sprintf(filename, "%s/%s", currentdir, fname);
+ if (fp != NULL)
+ fclose(fp);
+ fp = fopen(filename, "a+");
}
if (itotal == 0) {
@@ -402,17 +308,20 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command,
while (ipackindex < ipackcount) {
memset(data, 0, 4096);
strcpy((char *)data, "cdumpstart");
- setfilecontent(filename, data, strlen((char *)data));
+ fwrite(data, 1, strlen((char *)data), fp);
for (icur = 0; icur < itotal; icur += 4096) {
memset(data, 0, 4096);
if (busevsc) {
- if (ivsctype == 1)
- ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x08, 0x00, 0x00,
- (char *)data, 4096);
- else
- ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET, VSC_FN_GET_CDUMP, 0x00,
- (SRB_SIGNATURE >> 32), (SRB_SIGNATURE & 0xFFFFFFFF),
- (char *)data, 4096);
+ if (ivsctype == 0) {
+ ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET,
+ VSC_FN_GET_CDUMP, 0x00,
+ (SRB_SIGNATURE >> 32),
+ (SRB_SIGNATURE & 0xFFFFFFFF),
+ (char *)data, 4096);
+ } else {
+ ret = nvme_vucmd(dev_fd(dev), NVME_VSC_TYPE1_GET,
+ 0x82, 0x00, 0, 0, (char *)data, 4096);
+ }
} else {
ret = nvme_get_nsid_log(dev_fd(dev), true,
0x07,
@@ -421,25 +330,27 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command,
if (ret != 0)
return ret;
- setfilecontent(filename, data, 4096);
-
+ fwrite(data, 1, 4096, fp);
printf("\rWait for dump data %d%%" XCLEAN_LINE, ((icur+4096) * 100/itotal));
}
memset(data, 0, 4096);
strcpy((char *)data, "cdumpend");
- setfilecontent(filename, data, strlen((char *)data));
+ fwrite(data, 1, strlen((char *)data), fp);
printf("\r%s\n", fname);
ipackindex++;
if (ipackindex != ipackcount) {
memset(data, 0, 4096);
if (busevsc) {
- if (ivsctype == 1)
- ret = nvme_vucmd(dev_fd(dev), 0xFE, 0x82, 0x08, 0x00, 0x00,
- (char *)data, 4096);
- else
- ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET, VSC_FN_GET_CDUMP, 0x00,
- (SRB_SIGNATURE >> 32), (SRB_SIGNATURE & 0xFFFFFFFF),
- (char *)data, 4096);
+ if (ivsctype == 0) {
+ ret = nvme_vucmd(dev_fd(dev), NVME_VSC_GET,
+ VSC_FN_GET_CDUMP, 0x00,
+ (SRB_SIGNATURE >> 32),
+ (SRB_SIGNATURE & 0xFFFFFFFF),
+ (char *)data, 4096);
+ } else {
+ ret = nvme_vucmd(dev_fd(dev), NVME_VSC_TYPE1_GET,
+ 0x82, 0x00, 0, 0, (char *)data, 4096);
+ }
} else {
ret = nvme_get_nsid_log(dev_fd(dev), true,
0x07,
@@ -455,12 +366,16 @@ static int innogrit_vsc_getcdump(int argc, char **argv, struct command *command,
sprintf(fname, "cdump_%02d%02d-%02d%02d%02d_%d_%s.cdp", logtime->tm_mon+1,
logtime->tm_mday, logtime->tm_hour, logtime->tm_min, logtime->tm_sec,
ipackindex, fwvera);
- sprintf(filename, "%s/%s", currentdir, fname);
+ if (fp != NULL)
+ fclose(fp);
+ fp = fopen(filename, "a+");
}
}
printf("\n");
dev_close(dev);
+ if (fp != NULL)
+ fclose(fp);
return ret;
}
diff --git a/plugins/innogrit/innogrit-nvme.h b/plugins/innogrit/innogrit-nvme.h
index 2de0502..885479c 100644
--- a/plugins/innogrit/innogrit-nvme.h
+++ b/plugins/innogrit/innogrit-nvme.h
@@ -9,8 +9,7 @@
PLUGIN(NAME("innogrit", "innogrit vendor specific extensions", NVME_VERSION),
COMMAND_LIST(
- ENTRY("smart-log-add", "Retrieve innogrit SMART Log, show it", innogrit_smart_log_additional)
- ENTRY("get-eventlog", "get event log", innogrit_vsc_geteventlog)
+ ENTRY("get-eventlog", "get event log", innogrit_geteventlog)
ENTRY("get-cdump", "get cdump data", innogrit_vsc_getcdump)
)
);
diff --git a/plugins/innogrit/typedef.h b/plugins/innogrit/typedef.h
index 7220d38..0c5e406 100644
--- a/plugins/innogrit/typedef.h
+++ b/plugins/innogrit/typedef.h
@@ -1,15 +1,18 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
-#define SIZE_4K 4096
-#define SIZE_16K 16384
+#define IG_SUCCESS (0)
+#define IG_UNSUPPORT (-1)
+#define IG_ERROR (-2)
-#define NVME_VSC_GET_EVENT_LOG 0xC2
-#define NVME_VSC_CLEAN_EVENT_LOG 0xD8
-#define NVME_VSC_GET 0xE6
-#define VSC_FN_GET_CDUMP 0x08
-#define EVLOG_SIG 0x65766C67
-#define IGVSC_SIG 0x69677673
-#define SRB_SIGNATURE 0x544952474F4E4E49ULL
-#define XCLEAN_LINE "\033[K"
+#define NVME_VSC_GET_EVENT_LOG 0xC2
+#define NVME_VSC_GET 0xE6
+#define NVME_VSC_TYPE1_GET 0xFE
+#define VSC_FN_GET_CDUMP 0x08
+#define IGVSC_SIG 0x69677673
+#define EVLOG_SIG 0x65766C67
+#define SRB_SIGNATURE 0x544952474F4E4E49ULL
+
+#define XCLEAN_LINE "\033[K"
+#define SIZE_MB 0x100000
struct evlg_flush_hdr {
unsigned int signature;
@@ -27,45 +30,33 @@ struct eventlog {
unsigned int param[7];
};
-struct eventlog_addindex {
- unsigned int ms;
- unsigned int param[7];
- unsigned int iindex;
-};
-
-#pragma pack(push)
-#pragma pack(1)
-struct vsc_smart_log {
- unsigned short defect_cnt;
- unsigned short slc_spb_cnt;
- unsigned int slc_total_ec_cnt;
- unsigned int slc_max_ec_cnt;
- unsigned int slc_min_ec_cnt;
- unsigned int slc_avg_ec_cnt;
- unsigned int total_ec_cnt;
- unsigned int max_ec_cnt;
- unsigned int min_ec_cnt;
- unsigned int avg_ec_cnt;
- unsigned int mrd_rr_good_cnt;
- unsigned int ard_rr_good_cnt;
- unsigned int preset_cnt;
- unsigned int nvme_reset_cnt;
- unsigned int low_pwr_cnt;
- unsigned int wa;
- unsigned int ps3_entry_cnt;
- unsigned char highest_temp[4];
- unsigned int weight_ec;
- unsigned int slc_cap_mb;
- unsigned long long nand_page_write_cnt;
- unsigned int program_error_cnt;
- unsigned int erase_error_cnt;
- unsigned char flash_type;
- unsigned char reserved2[3];
- unsigned int hs_crc_err_cnt;
- unsigned int ddr_ecc_err_cnt;
- unsigned int reserved3[44];
+struct drvinfo_t {
+ unsigned char signature;
+ unsigned char fw_base;
+ unsigned short socid;
+ unsigned char soc_ver[4];
+ unsigned char loader_version[8];
+ unsigned char nand_devids[6];
+ unsigned char ddr_type;
+ unsigned char ddr_size;
+ unsigned char rsvd1[8];
+ unsigned char origin_fw_name[8];
+ unsigned long long nand_type;
+ unsigned int board_type[5];
+ unsigned short soc_type;
+ unsigned char build_mode;
+ unsigned char rsvd2;
+ unsigned int ftl_build_num;
+ unsigned short soc_reg;
+ unsigned char rsvd3[2];
+ unsigned int cur_cpu_clk;
+ unsigned int cur_nf_clk;
+ unsigned char nand_geo[4];
+ unsigned int fw_d2h_info_bit;
+ unsigned int spi_flash_id;
+ unsigned char rom_version[8];
+ unsigned char rsvd4[404];
};
-#pragma pack(pop)
struct cdump_pack {
unsigned int ilenth;
diff --git a/plugins/memblaze/memblaze-nvme.c b/plugins/memblaze/memblaze-nvme.c
index c189f1b..9dd2792 100644
--- a/plugins/memblaze/memblaze-nvme.c
+++ b/plugins/memblaze/memblaze-nvme.c
@@ -1521,7 +1521,7 @@ static void smart_log_add_v3_print(struct smart_log_add_item_10 *item, int item_
[0xab] = {0, "program_fail_count" },
[0xac] = {1, "erase_fail_count" },
[0xad] = {2, "wear_leveling_count" },
- [0xb8] = {3, "ext_e2e_err_count" },
+ [0xdf] = {3, "ext_e2e_err_count" },
[0xc7] = {4, "crc_err_count" },
[0xf4] = {5, "nand_bytes_written" },
[0xf5] = {6, "host_bytes_written" },
diff --git a/plugins/meson.build b/plugins/meson.build
index 146fa2a..35a9604 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -3,6 +3,7 @@
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',
@@ -29,8 +30,9 @@ if json_c_dep.found()
'plugins/ssstc/ssstc-nvme.c',
]
subdir('solidigm')
- subdir('ocp')
if conf.get('HAVE_SED_OPAL') != 0
subdir('sed')
endif
endif
+
+subdir('ocp')
diff --git a/plugins/netapp/netapp-nvme.c b/plugins/netapp/netapp-nvme.c
index 99f0a20..5c2e3d4 100644
--- a/plugins/netapp/netapp-nvme.c
+++ b/plugins/netapp/netapp-nvme.c
@@ -251,23 +251,24 @@ static void netapp_ontapdevice_json(struct json_object *devices, char *devname,
json_array_add_value_object(devices, device_attrs);
}
-static void netapp_smdevices_print(struct smdevice_info *devices, int count, int format)
+static void netapp_smdevices_print_regular(struct smdevice_info *devices,
+ int count, int format, const char *devname)
{
- struct json_object *root = NULL;
- struct json_object *json_devices = NULL;
int i, slta;
char array_label[ARRAY_LABEL_LEN / 2 + 1];
char volume_label[VOLUME_LABEL_LEN / 2 + 1];
char nguid_str[33];
+ __u8 lba_index;
+
+ char *formatstr = NULL;
char basestr[] =
"%s, Array Name %s, Volume Name %s, NSID %d, Volume ID %s, Controller %c, Access State %s, %s\n";
char columnstr[] = "%-16s %-30s %-30s %4d %32s %c %-12s %9s\n";
- char *formatstr = basestr; /* default to "normal" output format */
- __u8 lba_index;
- if (format == NCOLUMN) {
- /* for column output, change output string and print column headers */
- formatstr = columnstr;
+ if (format == NNORMAL)
+ formatstr = basestr;
+ else if (format == NCOLUMN) {
+ /* change output string and print column headers */
printf("%-16s %-30s %-30s %-4s %-32s %-4s %-12s %-9s\n",
"Device", "Array Name", "Volume Name", "NSID",
"Volume ID", "Ctrl", "Access State", " Size");
@@ -276,51 +277,141 @@ static void netapp_smdevices_print(struct smdevice_info *devices, int count, int
"------------------------------", "----",
"--------------------------------", "----",
"------------", "---------");
- } else if (format == NJSON) {
- /* prepare for json output */
- root = json_create_object();
- json_devices = json_create_array();
+ formatstr = columnstr;
+ }
+
+ 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_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);
+ return;
+ }
}
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;
+ 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_convert_string(array_label, (char *)&devices[i].ctrl.vs[20],
- ARRAY_LABEL_LEN / 2);
+ 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);
+ VOLUME_LABEL_LEN / 2);
netapp_nguid_to_str(nguid_str, devices[i].ns.nguid);
- if (format == NJSON)
- 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));
- else
- printf(formatstr, devices[i].dev, array_label,
+
+ printf(formatstr, devices[i].dev, array_label,
volume_label, devices[i].nsid, nguid_str,
slta ? 'A' : 'B', "unknown", size);
}
-
- if (format == NJSON) {
- /* complete the json output */
- json_object_add_value_array(root, "SMdevices", json_devices);
- json_print_object(root, NULL);
- printf("\n");
- json_free_object(root);
- }
}
-static void netapp_ontapdevices_print(struct ontapdevice_info *devices,
- int count, int format)
+static void netapp_smdevices_print_json(struct smdevice_info *devices,
+ int count, const char *devname)
{
struct json_object *root = NULL;
struct json_object *json_devices = NULL;
+ int i, slta;
+ char array_label[ARRAY_LABEL_LEN / 2 + 1];
+ char volume_label[VOLUME_LABEL_LEN / 2 + 1];
+ char nguid_str[33];
+ __u8 lba_index;
+
+ /* prepare for the json output */
+ root = json_create_object();
+ json_devices = json_create_array();
+
+ 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_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);
+ 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));
+ 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_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);
+ 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));
+ }
+
+out:
+ /* complete the json output */
+ json_object_add_value_array(root, "SMdevices", json_devices);
+ json_print_object(root, NULL);
+ printf("\n");
+ json_free_object(root);
+}
+
+static void netapp_ontapdevices_print_regular(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;
@@ -328,52 +419,99 @@ static void netapp_ontapdevices_print(struct ontapdevice_info *devices,
char uuid_str[37] = " ";
int i;
- char basestr[] = "%s, Vserver %s, Namespace Path %s, NSID %d, UUID %s, %s\n";
+ char *formatstr = NULL;
+ char basestr[] =
+ "%s, Vserver %s, Namespace Path %s, NSID %d, UUID %s, %s\n";
char columnstr[] = "%-16s %-25s %-50s %-4d %-38s %-9s\n";
- /* default to 'normal' output format */
- char *formatstr = basestr;
-
- if (format == NCOLUMN) {
- /* change output string and print column headers */
- formatstr = columnstr;
+ if (format == NNORMAL)
+ formatstr = basestr;
+ else if (format == NCOLUMN) {
printf("%-16s %-25s %-50s %-4s %-38s %-9s\n",
- "Device", "Vserver", "Namespace Path",
- "NSID", "UUID", "Size");
+ "Device", "Vserver", "Namespace Path",
+ "NSID", "UUID", "Size");
printf("%-16s %-25s %-50s %-4s %-38s %-9s\n",
- "----------------", "-------------------------",
- "--------------------------------------------------",
- "----", "--------------------------------------",
- "---------");
- } else if (format == NJSON) {
- /* prepare for json output */
- root = json_create_object();
- json_devices = json_create_array();
+ "----------------", "-------------------------",
+ "--------------------------------------------------",
+ "----", "--------------------------------------",
+ "---------");
+ 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_size(size, &lba, &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);
+ return;
+ }
+ }
+ for (i = 0; i < count; i++) {
+ /* fetch info and print for all devices */
netapp_get_ns_size(size, &lba, &devices[i].ns);
nvme_uuid_to_string(devices[i].uuid, uuid_str);
netapp_get_ontap_labels(vsname, nspath, devices[i].log_data);
- if (format == NJSON) {
+ printf(formatstr, devices[i].dev, vsname, nspath,
+ devices[i].nsid, uuid_str, size);
+ }
+}
+
+static void netapp_ontapdevices_print_json(struct ontapdevice_info *devices,
+ int count, const char *devname)
+{
+ struct json_object *root = NULL;
+ struct json_object *json_devices = NULL;
+ char vsname[ONTAP_LABEL_LEN] = " ";
+ char nspath[ONTAP_NS_PATHLEN] = " ";
+ unsigned long long lba;
+ char size[128];
+ char uuid_str[37] = " ";
+ int i;
+
+ /* prepare for the json output */
+ root = json_create_object();
+ json_devices = json_create_array();
+
+ 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);
+ 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));
- } else
- printf(formatstr, devices[i].dev, vsname, nspath,
- devices[i].nsid, uuid_str, size);
+ goto out;
+ }
}
- if (format == NJSON) {
- /* complete the json output */
- json_object_add_value_array(root, "ONTAPdevices", json_devices);
- json_print_object(root, NULL);
- printf("\n");
- json_free_object(root);
+ for (i = 0; i < count; i++) {
+ /* fetch info for all devices */
+ netapp_get_ns_size(size, &lba, &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));
}
+
+out:
+ /* complete the json output */
+ json_object_add_value_array(root, "ONTAPdevices", json_devices);
+ json_print_object(root, NULL);
+ printf("\n");
+ json_free_object(root);
}
static int nvme_get_ontap_c2_log(int fd, __u32 nsid, void *buf, __u32 buflen)
@@ -470,6 +608,8 @@ static int netapp_ontapdevices_get_info(int fd, struct ontapdevice_info *item,
return 0;
}
+ memset(nsdescs, 0, 0x1000);
+
err = nvme_identify_ns_descs(fd, item->nsid, nsdescs);
if (err) {
fprintf(stderr, "Unable to identify namespace descriptor for %s (%s)\n",
@@ -540,6 +680,7 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
int num, i, fd, ret, fmt;
struct smdevice_info *smdevices;
char path[264];
+ char *devname = NULL;
int num_smdevices = 0;
struct config {
@@ -571,6 +712,18 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
return num;
}
+ if (optind < argc)
+ devname = basename(argv[optind++]);
+
+ if (devname) {
+ int subsys_num, nsid;
+
+ if (sscanf(devname, "nvme%dn%d", &subsys_num, &nsid) != 2) {
+ fprintf(stderr, "Invalid device name %s\n", devname);
+ return -EINVAL;
+ }
+ }
+
smdevices = calloc(num, sizeof(*smdevices));
if (!smdevices) {
fprintf(stderr, "Unable to allocate memory for devices.\n");
@@ -592,8 +745,15 @@ static int netapp_smdevices(int argc, char **argv, struct command *command,
close(fd);
}
- if (num_smdevices)
- netapp_smdevices_print(smdevices, num_smdevices, fmt);
+ if (num_smdevices) {
+ if (fmt == NNORMAL || fmt == NCOLUMN)
+ netapp_smdevices_print_regular(smdevices,
+ num_smdevices, fmt, devname);
+ else if (fmt == NJSON)
+ netapp_smdevices_print_json(smdevices,
+ num_smdevices, devname);
+ } else
+ fprintf(stderr, "No smdevices detected\n");
for (i = 0; i < num; i++)
free(devices[i]);
@@ -611,6 +771,7 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
int num, i, fd, ret, fmt;
struct ontapdevice_info *ontapdevices;
char path[264];
+ char *devname = NULL;
int num_ontapdevices = 0;
struct config {
@@ -636,6 +797,18 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
return -EINVAL;
}
+ if (optind < argc)
+ devname = basename(argv[optind++]);
+
+ if (devname) {
+ int subsys_num, nsid;
+
+ if (sscanf(devname, "nvme%dn%d", &subsys_num, &nsid) != 2) {
+ fprintf(stderr, "Invalid device name %s\n", devname);
+ return -EINVAL;
+ }
+ }
+
num = scandir(dev_path, &devices, netapp_nvme_filter, alphasort);
if (num <= 0) {
fprintf(stderr, "No NVMe devices detected.\n");
@@ -664,8 +837,15 @@ static int netapp_ontapdevices(int argc, char **argv, struct command *command,
close(fd);
}
- if (num_ontapdevices)
- netapp_ontapdevices_print(ontapdevices, num_ontapdevices, fmt);
+ if (num_ontapdevices) {
+ if (fmt == NNORMAL || fmt == NCOLUMN)
+ netapp_ontapdevices_print_regular(ontapdevices,
+ num_ontapdevices, fmt, devname);
+ else if (fmt == NJSON)
+ netapp_ontapdevices_print_json(ontapdevices,
+ num_ontapdevices, devname);
+ } else
+ fprintf(stderr, "No ontapdevices detected\n");
for (i = 0; i < num; i++)
free(devices[i]);
diff --git a/plugins/ocp/meson.build b/plugins/ocp/meson.build
index 7835444..55b9966 100644
--- a/plugins/ocp/meson.build
+++ b/plugins/ocp/meson.build
@@ -5,5 +5,14 @@ sources += [
'plugins/ocp/ocp-smart-extended-log.c',
'plugins/ocp/ocp-fw-activation-history.c',
'plugins/ocp/ocp-telemetry-decode.c',
+ 'plugins/ocp/ocp-hardware-component-log.c',
+ 'plugins/ocp/ocp-print.c',
+ 'plugins/ocp/ocp-print-stdout.c',
+ 'plugins/ocp/ocp-print-binary.c',
]
+if json_c_dep.found()
+ sources += [
+ 'plugins/ocp/ocp-print-json.c',
+ ]
+endif
diff --git a/plugins/ocp/ocp-fw-activation-history.c b/plugins/ocp/ocp-fw-activation-history.c
index 543042f..79c03b2 100644
--- a/plugins/ocp/ocp-fw-activation-history.c
+++ b/plugins/ocp/ocp-fw-activation-history.c
@@ -14,135 +14,15 @@
#include "nvme-print.h"
#include "ocp-utils.h"
+#include "ocp-print.h"
-static const unsigned char ocp_fw_activation_history_guid[16] = {
+static const unsigned char ocp_fw_activation_history_guid[GUID_LEN] = {
0x6D, 0x79, 0x9a, 0x76,
0xb4, 0xda, 0xf6, 0xa3,
0xe2, 0x4d, 0xb2, 0x8a,
0xac, 0xf3, 0x1c, 0xd1
};
-struct __packed fw_activation_history_entry {
- __u8 ver_num;
- __u8 entry_length;
- __u16 reserved1;
- __u16 activation_count;
- __u64 timestamp;
- __u64 reserved2;
- __u64 power_cycle_count;
- char previous_fw[8];
- char new_fw[8];
- __u8 slot_number;
- __u8 commit_action;
- __u16 result;
- __u8 reserved3[14];
-};
-
-struct __packed fw_activation_history {
- __u8 log_id;
- __u8 reserved1[3];
- __u32 valid_entries;
- struct fw_activation_history_entry entries[20];
- __u8 reserved2[2790];
- __u16 log_page_version;
- __u64 log_page_guid[2];
-};
-
-static void ocp_fw_activation_history_normal(const struct fw_activation_history *fw_history)
-{
- printf("Firmware History Log:\n");
-
- printf(" %-26s%d\n", "log identifier:", fw_history->log_id);
- printf(" %-26s%d\n", "valid entries:", le32_to_cpu(fw_history->valid_entries));
-
- printf(" entries:\n");
-
- for (int index = 0; index < fw_history->valid_entries; index++) {
- const struct fw_activation_history_entry *entry = &fw_history->entries[index];
-
- printf(" entry[%d]:\n", le32_to_cpu(index));
- printf(" %-22s%d\n", "version number:", entry->ver_num);
- 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", "power cycle count:",
- le64_to_cpu(entry->power_cycle_count));
- printf(" %-22s%.*s\n", "previous firmware:", (int)sizeof(entry->previous_fw),
- entry->previous_fw);
- printf(" %-22s%.*s\n", "new firmware:", (int)sizeof(entry->new_fw),
- entry->new_fw);
- printf(" %-22s%d\n", "slot number:", entry->slot_number);
- printf(" %-22s%d\n", "commit action type:", entry->commit_action);
- printf(" %-22s%d\n", "result:", le16_to_cpu(entry->result));
- }
-
- printf(" %-26s%d\n", "log page version:",
- le16_to_cpu(fw_history->log_page_version));
-
- printf(" %-26s0x%"PRIx64"%"PRIx64"\n", "log page guid:",
- le64_to_cpu(fw_history->log_page_guid[1]),
- le64_to_cpu(fw_history->log_page_guid[0]));
-
- printf("\n");
-}
-
-static void ocp_fw_activation_history_json(const struct fw_activation_history *fw_history)
-{
- struct json_object *root = json_create_object();
-
- json_object_add_value_uint(root, "log identifier", fw_history->log_id);
- json_object_add_value_uint(root, "valid entries", le32_to_cpu(fw_history->valid_entries));
-
- struct json_object *entries = json_create_array();
-
- for (int index = 0; index < fw_history->valid_entries; index++) {
- const struct fw_activation_history_entry *entry = &fw_history->entries[index];
- struct json_object *entry_obj = json_create_object();
-
- json_object_add_value_uint(entry_obj, "version number", entry->ver_num);
- json_object_add_value_uint(entry_obj, "entry length", entry->entry_length);
- 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)));
- json_object_add_value_uint(entry_obj, "power cycle count",
- le64_to_cpu(entry->power_cycle_count));
-
- struct json_object *fw = json_object_new_string_len(entry->previous_fw,
- sizeof(entry->previous_fw));
-
- json_object_add_value_object(entry_obj, "previous firmware", fw);
-
- fw = json_object_new_string_len(entry->new_fw, sizeof(entry->new_fw));
-
- json_object_add_value_object(entry_obj, "new firmware", fw);
- json_object_add_value_uint(entry_obj, "slot number", entry->slot_number);
- json_object_add_value_uint(entry_obj, "commit action type", entry->commit_action);
- json_object_add_value_uint(entry_obj, "result", le16_to_cpu(entry->result));
-
- json_array_add_value_object(entries, entry_obj);
- }
-
- json_object_add_value_array(root, "entries", entries);
-
- json_object_add_value_uint(root, "log page version",
- le16_to_cpu(fw_history->log_page_version));
-
- char guid[2 * sizeof(fw_history->log_page_guid) + 3] = { 0 };
-
- sprintf(guid, "0x%"PRIx64"%"PRIx64"",
- le64_to_cpu(fw_history->log_page_guid[1]),
- le64_to_cpu(fw_history->log_page_guid[0]));
- json_object_add_value_string(root, "log page guid", guid);
-
- json_print_object(root, NULL);
- json_free_object(root);
-
- printf("\n");
-}
-
int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd,
struct plugin *plugin)
{
@@ -215,10 +95,7 @@ int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd,
return err;
}
- if (print_flag == JSON)
- ocp_fw_activation_history_json(&fw_history);
- else if (print_flag == NORMAL)
- ocp_fw_activation_history_normal(&fw_history);
+ ocp_fw_act_history(&fw_history, print_flag);
}
return err;
diff --git a/plugins/ocp/ocp-fw-activation-history.h b/plugins/ocp/ocp-fw-activation-history.h
index a7f9058..15733a3 100644
--- a/plugins/ocp/ocp-fw-activation-history.h
+++ b/plugins/ocp/ocp-fw-activation-history.h
@@ -4,6 +4,8 @@
*
* Authors: karl.dedow@solidigm.com
*/
+#include "common.h"
+#include "linux/types.h"
#ifndef OCP_FIRMWARE_ACTIVATION_HISTORY_H
#define OCP_FIRMWARE_ACTIVATION_HISTORY_H
@@ -11,7 +13,33 @@
struct command;
struct plugin;
-int ocp_fw_activation_history_log(int argc, char **argv,
- struct command *cmd, struct plugin *plugin);
+struct __packed fw_activation_history_entry {
+ __u8 ver_num;
+ __u8 entry_length;
+ __le16 reserved1;
+ __le16 activation_count;
+ __le64 timestamp;
+ __le64 reserved2;
+ __le64 power_cycle_count;
+ char previous_fw[8];
+ char new_fw[8];
+ __u8 slot_number;
+ __u8 commit_action;
+ __le16 result;
+ __u8 reserved3[14];
+};
+
+struct __packed fw_activation_history {
+ __u8 log_id;
+ __u8 reserved1[3];
+ __le32 valid_entries;
+ struct fw_activation_history_entry entries[20];
+ __u8 reserved2[2790];
+ __le16 log_page_version;
+ __le64 log_page_guid[2];
+};
+
+int ocp_fw_activation_history_log(int argc, char **argv, struct command *cmd,
+ struct plugin *plugin);
#endif
diff --git a/plugins/ocp/ocp-hardware-component-log.c b/plugins/ocp/ocp-hardware-component-log.c
new file mode 100644
index 0000000..73f1452
--- /dev/null
+++ b/plugins/ocp/ocp-hardware-component-log.c
@@ -0,0 +1,288 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (c) 2024
+ */
+#include <stdio.h>
+#include <errno.h>
+
+#include "common.h"
+#include "util/types.h"
+#include "util/logging.h"
+#include "nvme-print.h"
+#include "ocp-hardware-component-log.h"
+#include "ocp-print.h"
+
+//#define HWCOMP_DUMMY
+
+#define print_info_array(...) \
+ do { \
+ if (log_level >= LOG_INFO) \
+ print_array(__VA_ARGS__); \
+ } while (false)
+
+#define print_info_error(...) \
+ do { \
+ if (log_level >= LOG_INFO) \
+ fprintf(stderr, __VA_ARGS__); \
+ } while (false)
+
+#ifdef HWCOMP_DUMMY
+static __u8 hwcomp_dummy[] = {
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xdc, 0x57, 0x0f, 0x9f, 0xb9, 0x31, 0x6b, 0xb7,
+ 0xd0, 0x4e, 0xcd, 0x30, 0x1f, 0x82, 0xb6, 0xbc,
+ 0xb4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x20, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
+};
+#endif /* HWCOMP_DUMMY */
+
+const char *hwcomp_id_to_string(__u32 id)
+{
+ switch (id) {
+ case HWCOMP_ID_ASIC:
+ return "Controller ASIC component";
+ case HWCOMP_ID_NAND:
+ return "NAND Component";
+ case HWCOMP_ID_DRAM:
+ return "DRAM Component";
+ case HWCOMP_ID_PMIC:
+ return "PMIC Component";
+ case HWCOMP_ID_PCB:
+ return "PCB Component";
+ case HWCOMP_ID_CAP:
+ return "capacitor component";
+ case HWCOMP_ID_REG:
+ return "registor component";
+ case HWCOMP_ID_CASE:
+ return "case component";
+ case HWCOMP_ID_SN:
+ return "Device Serial Number";
+ case HWCOMP_ID_COUNTRY:
+ return "Country of Origin";
+ case HWCOMP_ID_HW_REV:
+ return "Global Device Hardware Revision";
+ case HWCOMP_ID_VENDOR ... HWCOMP_ID_MAX:
+ return "Vendor Unique Component";
+ case HWCOMP_ID_RSVD:
+ default:
+ break;
+ }
+
+ return "Reserved";
+}
+
+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);
+ 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,
+ .nsid = NVME_NSID_ALL,
+ };
+
+#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);
+ if (ret) {
+ print_info_error("error: ocp: failed to get log simple (hwcomp: %02X, ret: %d)\n",
+ LID_HWCOMP, ret);
+ return ret;
+ }
+#endif /* HWCOMP_DUMMY */
+
+ print_info("id: %02Xh\n", 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)));
+
+ 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;
+ }
+
+ args.log = log->desc,
+
+#ifdef HWCOMP_DUMMY
+ memcpy(log->desc, &hwcomp_dummy[desc_offset], args.len);
+#else /* HWCOMP_DUMMY */
+ 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);
+ return ret;
+ }
+#endif /* HWCOMP_DUMMY */
+
+ return ret;
+}
+
+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,
+ };
+
+ ret = validate_output_format(nvme_cfg.output_format, &fmt);
+ if (ret < 0) {
+ fprintf(stderr, "error: ocp: invalid output format\n");
+ return ret;
+ }
+
+ 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);
+ return ret;
+ }
+
+ ocp_show_hwcomp_log(&log, id, list, fmt);
+
+ return 0;
+}
+
+int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
+{
+ _cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+ int ret = 0;
+ const char *desc = "retrieve hardware component log";
+ struct config {
+ __u64 id;
+ bool list;
+ } cfg = { 0 };
+ const char *id_desc = "component identifier";
+ const char *list_desc = "list component descriptions";
+
+ OPT_VALS(id) = {
+ VAL_LONG("asic", HWCOMP_ID_ASIC),
+ VAL_LONG("nand", HWCOMP_ID_NAND),
+ VAL_LONG("dram", HWCOMP_ID_DRAM),
+ VAL_LONG("pmic", HWCOMP_ID_PMIC),
+ VAL_LONG("pcb", HWCOMP_ID_PCB),
+ VAL_LONG("cap", HWCOMP_ID_CAP),
+ VAL_LONG("reg", HWCOMP_ID_REG),
+ VAL_LONG("case", HWCOMP_ID_CASE),
+ VAL_LONG("sn", HWCOMP_ID_SN),
+ VAL_LONG("country", HWCOMP_ID_COUNTRY),
+ VAL_LONG("hw-rev", HWCOMP_ID_HW_REV),
+ VAL_LONG("vendor", HWCOMP_ID_VENDOR),
+ VAL_END()
+ };
+
+ NVME_ARGS(opts, OPT_LONG("comp-id", 'i', &cfg.id, id_desc, id),
+ OPT_FLAG("list", 'l', &cfg.list, list_desc));
+
+ ret = parse_and_open(&dev, argc, argv, desc, opts);
+ if (ret)
+ return ret;
+
+ 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);
+
+ return ret;
+}
diff --git a/plugins/ocp/ocp-hardware-component-log.h b/plugins/ocp/ocp-hardware-component-log.h
new file mode 100644
index 0000000..f5e5162
--- /dev/null
+++ b/plugins/ocp/ocp-hardware-component-log.h
@@ -0,0 +1,64 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ * Copyright (c) 2024
+ */
+#include "cmd.h"
+#include "common.h"
+#include "ocp-nvme.h"
+
+#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
+
+struct __packed hwcomp_desc {
+ __le64 date_lot_size;
+ __le64 add_info_size;
+ __le32 id;
+ __le64 mfg;
+ __le64 rev;
+ __le64 mfg_code;
+};
+
+struct __packed hwcomp_log {
+ __le16 ver;
+ __u8 rsvd2[HWCOMP_RSVD2_LEN];
+ __u8 guid[GUID_LEN];
+ __u8 size[HWCOMP_SIZE_LEN];
+ __u8 rsvd48[HWCOMP_RSVD48_LEN];
+ struct hwcomp_desc *desc;
+};
+
+struct hwcomp_desc_entry {
+ struct hwcomp_desc *desc;
+ __u64 date_lot_size;
+ __u8 *date_lot_code;
+ __u64 add_info_size;
+ __u8 *add_info;
+ __u64 desc_size;
+};
+
+enum hwcomp_id {
+ HWCOMP_ID_RSVD,
+ HWCOMP_ID_ASIC,
+ HWCOMP_ID_NAND,
+ HWCOMP_ID_DRAM,
+ HWCOMP_ID_PMIC,
+ HWCOMP_ID_PCB,
+ HWCOMP_ID_CAP,
+ HWCOMP_ID_REG,
+ HWCOMP_ID_CASE,
+ HWCOMP_ID_SN,
+ HWCOMP_ID_COUNTRY,
+ HWCOMP_ID_HW_REV,
+ HWCOMP_ID_VENDOR = 0x8000,
+ HWCOMP_ID_MAX = 0xffff,
+};
+
+int ocp_hwcomp_log(int argc, char **argv, struct command *cmd, struct plugin *plugin);
+const char *hwcomp_id_to_string(__u32 id);
+
+#endif /* OCP_HARDWARE_COMPONENT_LOG_H */
diff --git a/plugins/ocp/ocp-nvme.c b/plugins/ocp/ocp-nvme.c
index 91f4083..6f05750 100644
--- a/plugins/ocp/ocp-nvme.c
+++ b/plugins/ocp/ocp-nvme.c
@@ -22,6 +22,7 @@
#include "plugin.h"
#include "linux/types.h"
#include "util/types.h"
+#include "util/logging.h"
#include "nvme-print.h"
#include "nvme-wrap.h"
@@ -29,6 +30,8 @@
#include "ocp-clear-features.h"
#include "ocp-fw-activation-history.h"
#include "ocp-telemetry-decode.h"
+#include "ocp-hardware-component-log.h"
+#include "ocp-print.h"
#define CREATE_CMD
#include "ocp-nvme.h"
@@ -42,76 +45,29 @@
#define C3_LATENCY_MON_LOG_BUF_LEN 0x200
#define C3_LATENCY_MON_OPCODE 0xC3
-#define C3_LATENCY_MON_VERSION 0x0001
-#define C3_GUID_LENGTH 16
#define NVME_FEAT_OCP_LATENCY_MONITOR 0xC5
-#define C3_ACTIVE_BUCKET_TIMER_INCREMENT 5
-#define C3_ACTIVE_THRESHOLD_INCREMENT 5
-#define C3_MINIMUM_WINDOW_INCREMENT 100
-#define C3_BUCKET_NUM 4
-
-static __u8 lat_mon_guid[C3_GUID_LENGTH] = {
+static __u8 lat_mon_guid[GUID_LEN] = {
0x92, 0x7a, 0xc0, 0x8c,
0xd0, 0x84, 0x6c, 0x9c,
0x70, 0x43, 0xe6, 0xd4,
0x58, 0x5e, 0xd4, 0x85
};
-#define READ 3
-#define WRITE 2
-#define TRIM 1
#define RESERVED 0
-struct __packed ssd_latency_monitor_log {
- __u8 feature_status; /* 0x00 */
- __u8 rsvd1; /* 0x01 */
- __le16 active_bucket_timer; /* 0x02 */
- __le16 active_bucket_timer_threshold; /* 0x04 */
- __u8 active_threshold_a; /* 0x06 */
- __u8 active_threshold_b; /* 0x07 */
- __u8 active_threshold_c; /* 0x08 */
- __u8 active_threshold_d; /* 0x09 */
- __le16 active_latency_config; /* 0x0A */
- __u8 active_latency_min_window; /* 0x0C */
- __u8 rsvd2[0x13]; /* 0x0D */
-
- __le32 active_bucket_counter[4][4]; /* 0x20 - 0x5F */
- __le64 active_latency_timestamp[4][3]; /* 0x60 - 0xBF */
- __le16 active_measured_latency[4][3]; /* 0xC0 - 0xD7 */
- __le16 active_latency_stamp_units; /* 0xD8 */
- __u8 rsvd3[0x16]; /* 0xDA */
-
- __le32 static_bucket_counter[4][4]; /* 0x0F0 - 0x12F */
- __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 */
-
- __le16 debug_log_trigger_enable; /* 0x1C0 */
- __le16 debug_log_measured_latency; /* 0x1C2 */
- __le64 debug_log_latency_stamp; /* 0x1C4 */
- __le16 debug_log_ptr; /* 0x1CC */
- __le16 debug_log_counter_trigger; /* 0x1CE */
- __u8 debug_log_stamp_units; /* 0x1D0 */
- __u8 rsvd5[0x1D]; /* 0x1D1 */
-
- __le16 log_page_version; /* 0x1EE */
- __u8 log_page_guid[0x10]; /* 0x1F0 */
-};
-
struct __packed feature_latency_monitor {
- __u16 active_bucket_timer_threshold;
- __u8 active_threshold_a;
- __u8 active_threshold_b;
- __u8 active_threshold_c;
- __u8 active_threshold_d;
- __u16 active_latency_config;
- __u8 active_latency_minimum_window;
- __u16 debug_log_trigger_enable;
- __u8 discard_debug_log;
- __u8 latency_monitor_feature_enable;
- __u8 reserved[4083];
+ __le16 active_bucket_timer_threshold;
+ __u8 active_threshold_a;
+ __u8 active_threshold_b;
+ __u8 active_threshold_c;
+ __u8 active_threshold_d;
+ __le16 active_latency_config;
+ __u8 active_latency_minimum_window;
+ __le16 debug_log_trigger_enable;
+ __u8 discard_debug_log;
+ __u8 latency_monitor_feature_enable;
+ __u8 reserved[4083];
};
struct erri_entry {
@@ -194,6 +150,11 @@ struct erri_config {
__u16 nrtdp;
};
+struct ieee1667_get_cq_entry {
+ __u32 enabled:3;
+ __u32 rsvd3:29;
+};
+
static const char *sel = "[0-3]: current/default/saved/supported";
static const char *no_uuid = "Skip UUID index search (UUID index not required for OCP 1.0)";
const char *data = "Error injection data structure entries";
@@ -201,288 +162,6 @@ 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 int ocp_print_C3_log_normal(struct nvme_dev *dev,
- struct ssd_latency_monitor_log *log_data)
-{
- char ts_buf[128];
- int i, j;
-
- printf("-Latency Monitor/C3 Log Page Data-\n");
- printf(" Controller : %s\n", dev->name);
- printf(" Feature Status 0x%x\n",
- log_data->feature_status);
- printf(" Active Bucket Timer %d min\n",
- C3_ACTIVE_BUCKET_TIMER_INCREMENT *
- le16_to_cpu(log_data->active_bucket_timer));
- printf(" Active Bucket Timer Threshold %d min\n",
- C3_ACTIVE_BUCKET_TIMER_INCREMENT *
- le16_to_cpu(log_data->active_bucket_timer_threshold));
- printf(" Active Threshold A %d ms\n",
- C3_ACTIVE_THRESHOLD_INCREMENT *
- le16_to_cpu(log_data->active_threshold_a+1));
- printf(" Active Threshold B %d ms\n",
- C3_ACTIVE_THRESHOLD_INCREMENT *
- le16_to_cpu(log_data->active_threshold_b+1));
- printf(" Active Threshold C %d ms\n",
- C3_ACTIVE_THRESHOLD_INCREMENT *
- le16_to_cpu(log_data->active_threshold_c+1));
- printf(" Active Threshold D %d ms\n",
- C3_ACTIVE_THRESHOLD_INCREMENT *
- le16_to_cpu(log_data->active_threshold_d+1));
- printf(" Active Latency Configuration 0x%x\n",
- le16_to_cpu(log_data->active_latency_config));
- printf(" Active Latency Minimum Window %d ms\n",
- C3_MINIMUM_WINDOW_INCREMENT *
- le16_to_cpu(log_data->active_latency_min_window));
- printf(" Active Latency Stamp Units %d\n",
- 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));
- printf(" Debug Log Trigger Enable %d\n",
- le16_to_cpu(log_data->debug_log_trigger_enable));
- printf(" Debug Log Measured Latency %d\n",
- le16_to_cpu(log_data->debug_log_measured_latency));
- if (le64_to_cpu(log_data->debug_log_latency_stamp) == -1) {
- printf(" Debug Log Latency Time Stamp N/A\n");
- } else {
- convert_ts(le64_to_cpu(log_data->debug_log_latency_stamp), ts_buf);
- printf(" Debug Log Latency Time Stamp %s\n", ts_buf);
- }
- printf(" Debug Log Pointer %d\n",
- le16_to_cpu(log_data->debug_log_ptr));
- printf(" Debug Counter Trigger Source %d\n",
- 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));
-
- char guid[(C3_GUID_LENGTH * 2) + 1];
- char *ptr = &guid[0];
-
- for (i = C3_GUID_LENGTH - 1; i >= 0; i--)
- ptr += sprintf(ptr, "%02X", log_data->log_page_guid[i]);
-
- printf(" Log Page GUID %s\n", guid);
- printf("\n");
-
- printf(" Read Write Deallocate/Trim\n");
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- printf(" Active Bucket Counter: Bucket %d %27d %27d %27d\n",
- i,
- le32_to_cpu(log_data->active_bucket_counter[i][READ]),
- le32_to_cpu(log_data->active_bucket_counter[i][WRITE]),
- le32_to_cpu(log_data->active_bucket_counter[i][TRIM]));
- }
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- printf(" Active Latency Time Stamp: Bucket %d ", i);
- for (j = 2; j >= 0; j--) {
- if (le64_to_cpu(log_data->active_latency_timestamp[3-i][j]) == -1) {
- printf(" N/A ");
- } else {
- convert_ts(le64_to_cpu(log_data->active_latency_timestamp[3-i][j]), ts_buf);
- printf("%s ", ts_buf);
- }
- }
- printf("\n");
- }
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- printf(" Active Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n",
- i,
- le16_to_cpu(log_data->active_measured_latency[3-i][READ-1]),
- le16_to_cpu(log_data->active_measured_latency[3-i][WRITE-1]),
- le16_to_cpu(log_data->active_measured_latency[3-i][TRIM-1]));
- }
-
- printf("\n");
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- printf(" Static Bucket Counter: Bucket %d %27d %27d %27d\n",
- i,
- le32_to_cpu(log_data->static_bucket_counter[i][READ]),
- le32_to_cpu(log_data->static_bucket_counter[i][WRITE]),
- le32_to_cpu(log_data->static_bucket_counter[i][TRIM]));
- }
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- printf(" Static Latency Time Stamp: Bucket %d ", i);
- for (j = 2; j >= 0; j--) {
- if (le64_to_cpu(log_data->static_latency_timestamp[3-i][j]) == -1) {
- printf(" N/A ");
- } else {
- convert_ts(le64_to_cpu(log_data->static_latency_timestamp[3-i][j]), ts_buf);
- printf("%s ", ts_buf);
- }
- }
- printf("\n");
- }
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- printf(" Static Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n",
- i,
- le16_to_cpu(log_data->static_measured_latency[3-i][READ-1]),
- le16_to_cpu(log_data->static_measured_latency[3-i][WRITE-1]),
- le16_to_cpu(log_data->static_measured_latency[3-i][TRIM-1]));
- }
-
- return 0;
-}
-
-static void ocp_print_C3_log_json(struct ssd_latency_monitor_log *log_data)
-{
- struct json_object *root;
- char ts_buf[128];
- char buf[128];
- int i, j;
- char *operation[3] = {"Trim", "Write", "Read"};
-
- root = json_create_object();
-
- json_object_add_value_uint(root, "Feature Status",
- log_data->feature_status);
- json_object_add_value_uint(root, "Active Bucket Timer",
- C3_ACTIVE_BUCKET_TIMER_INCREMENT *
- le16_to_cpu(log_data->active_bucket_timer));
- json_object_add_value_uint(root, "Active Bucket Timer Threshold",
- C3_ACTIVE_BUCKET_TIMER_INCREMENT *
- le16_to_cpu(log_data->active_bucket_timer_threshold));
- json_object_add_value_uint(root, "Active Threshold A",
- C3_ACTIVE_THRESHOLD_INCREMENT *
- le16_to_cpu(log_data->active_threshold_a + 1));
- json_object_add_value_uint(root, "Active Threshold B",
- C3_ACTIVE_THRESHOLD_INCREMENT *
- le16_to_cpu(log_data->active_threshold_b + 1));
- json_object_add_value_uint(root, "Active Threshold C",
- C3_ACTIVE_THRESHOLD_INCREMENT *
- le16_to_cpu(log_data->active_threshold_c + 1));
- json_object_add_value_uint(root, "Active Threshold D",
- C3_ACTIVE_THRESHOLD_INCREMENT *
- le16_to_cpu(log_data->active_threshold_d + 1));
- json_object_add_value_uint(root, "Active Latency Configuration",
- le16_to_cpu(log_data->active_latency_config));
- json_object_add_value_uint(root, "Active Latency Minimum Window",
- C3_MINIMUM_WINDOW_INCREMENT *
- le16_to_cpu(log_data->active_latency_min_window));
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- struct json_object *bucket;
-
- bucket = json_create_object();
- sprintf(buf, "Active Bucket Counter: Bucket %d", i);
- for (j = 2; j >= 0; j--) {
- json_object_add_value_uint(bucket, operation[j],
- le32_to_cpu(log_data->active_bucket_counter[i][j+1]));
- }
- json_object_add_value_object(root, buf, bucket);
- }
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- struct json_object *bucket;
-
- bucket = json_create_object();
- sprintf(buf, "Active Latency Time Stamp: Bucket %d", i);
- for (j = 2; j >= 0; j--) {
- if (le64_to_cpu(log_data->active_latency_timestamp[3-i][j]) == -1) {
- json_object_add_value_string(bucket, operation[j], "NA");
- } else {
- convert_ts(le64_to_cpu(log_data->active_latency_timestamp[3-i][j]), ts_buf);
- json_object_add_value_string(bucket, operation[j], ts_buf);
- }
- }
- json_object_add_value_object(root, buf, bucket);
- }
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- struct json_object *bucket;
-
- bucket = json_create_object();
- sprintf(buf, "Active Measured Latency: Bucket %d", i);
- for (j = 2; j >= 0; j--) {
- json_object_add_value_uint(bucket, operation[j],
- le16_to_cpu(log_data->active_measured_latency[3-i][j]));
- }
- json_object_add_value_object(root, buf, bucket);
- }
-
- json_object_add_value_uint(root, "Active Latency Stamp Units",
- le16_to_cpu(log_data->active_latency_stamp_units));
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- struct json_object *bucket;
-
- bucket = json_create_object();
- sprintf(buf, "Static Bucket Counter: Bucket %d", i);
- for (j = 2; j >= 0; j--) {
- json_object_add_value_uint(bucket, operation[j],
- le32_to_cpu(log_data->static_bucket_counter[i][j+1]));
- }
- json_object_add_value_object(root, buf, bucket);
- }
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- struct json_object *bucket;
-
- bucket = json_create_object();
- sprintf(buf, "Static Latency Time Stamp: Bucket %d", i);
- for (j = 2; j >= 0; j--) {
- if (le64_to_cpu(log_data->static_latency_timestamp[3-i][j]) == -1) {
- json_object_add_value_string(bucket, operation[j], "NA");
- } else {
- convert_ts(le64_to_cpu(log_data->static_latency_timestamp[3-i][j]), ts_buf);
- json_object_add_value_string(bucket, operation[j], ts_buf);
- }
- }
- json_object_add_value_object(root, buf, bucket);
- }
-
- for (i = 0; i < C3_BUCKET_NUM; i++) {
- struct json_object *bucket;
-
- bucket = json_create_object();
- sprintf(buf, "Static Measured Latency: Bucket %d", i);
- for (j = 2; j >= 0; j--) {
- json_object_add_value_uint(bucket, operation[j],
- le16_to_cpu(log_data->static_measured_latency[3-i][j]));
- }
- json_object_add_value_object(root, buf, bucket);
- }
-
- json_object_add_value_uint(root, "Static Latency Stamp Units",
- le16_to_cpu(log_data->static_latency_stamp_units));
- 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",
- le16_to_cpu(log_data->debug_log_measured_latency));
- if (le64_to_cpu(log_data->debug_log_latency_stamp) == -1) {
- json_object_add_value_string(root, "Debug Log Latency Time Stamp", "NA");
- } else {
- convert_ts(le64_to_cpu(log_data->debug_log_latency_stamp), ts_buf);
- json_object_add_value_string(root, "Debug Log Latency Time Stamp", ts_buf);
- }
- json_object_add_value_uint(root, "Debug Log Pointer",
- le16_to_cpu(log_data->debug_log_ptr));
- json_object_add_value_uint(root, "Debug Counter Trigger Source",
- 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));
-
- char guid[(C3_GUID_LENGTH * 2) + 1];
- char *ptr = &guid[0];
-
- for (i = C3_GUID_LENGTH - 1; i >= 0; i--)
- ptr += sprintf(ptr, "%02X", log_data->log_page_guid[i]);
-
- json_object_add_value_string(root, "Log Page GUID", guid);
-
- json_print_object(root, NULL);
- printf("\n");
-
- json_free_object(root);
-}
-
static int get_c3_log_page(struct nvme_dev *dev, char *format)
{
struct ssd_latency_monitor_log *log_data;
@@ -513,14 +192,6 @@ static int get_c3_log_page(struct nvme_dev *dev, char *format)
if (!ret) {
log_data = (struct ssd_latency_monitor_log *)data;
- /* check log page version */
- if (log_data->log_page_version != C3_LATENCY_MON_VERSION) {
- fprintf(stderr,
- "ERROR : OCP : invalid latency monitor version\n");
- ret = -1;
- goto out;
- }
-
/*
* check log page guid
* Verify GUID matches
@@ -532,32 +203,20 @@ static int get_c3_log_page(struct nvme_dev *dev, char *format)
fprintf(stderr, "ERROR : OCP : Unknown GUID in C3 Log Page data\n");
fprintf(stderr, "ERROR : OCP : Expected GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", lat_mon_guid[j]);
+ fprintf(stderr, "%02x", lat_mon_guid[j]);
fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", log_data->log_page_guid[j]);
+ fprintf(stderr, "%02x", log_data->log_page_guid[j]);
fprintf(stderr, "\n");
ret = -1;
goto out;
}
}
-
- switch (fmt) {
- case NORMAL:
- ocp_print_C3_log_normal(dev, log_data);
- break;
- case JSON:
- ocp_print_C3_log_json(log_data);
- break;
- default:
- fprintf(stderr, "unhandled output format\n");
-
- }
+ ocp_c3_log(dev, log_data, fmt);
} else {
- fprintf(stderr,
- "ERROR : OCP : Unable to read C3 data from buffer\n");
+ fprintf(stderr, "ERROR : OCP : Unable to read C3 data from buffer\n");
}
out:
@@ -606,7 +265,7 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd,
int err = -1;
struct nvme_dev *dev;
__u32 result;
- struct feature_latency_monitor buf = {0,};
+ struct feature_latency_monitor buf = { 0 };
__u32 nsid = NVME_NSID_ALL;
struct stat nvme_stat;
struct nvme_id_ctrl ctrl;
@@ -683,16 +342,14 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd,
if (err)
return err;
- memset(&buf, 0, sizeof(struct feature_latency_monitor));
-
- buf.active_bucket_timer_threshold = cfg.active_bucket_timer_threshold;
+ buf.active_bucket_timer_threshold = cpu_to_le16(cfg.active_bucket_timer_threshold);
buf.active_threshold_a = cfg.active_threshold_a;
buf.active_threshold_b = cfg.active_threshold_b;
buf.active_threshold_c = cfg.active_threshold_c;
buf.active_threshold_d = cfg.active_threshold_d;
- buf.active_latency_config = cfg.active_latency_config;
+ buf.active_latency_config = cpu_to_le16(cfg.active_latency_config);
buf.active_latency_minimum_window = cfg.active_latency_minimum_window;
- buf.debug_log_trigger_enable = cfg.debug_log_trigger_enable;
+ buf.debug_log_trigger_enable = cpu_to_le16(cfg.debug_log_trigger_enable);
buf.discard_debug_log = cfg.discard_debug_log;
buf.latency_monitor_feature_enable = cfg.latency_monitor_feature_enable;
@@ -714,14 +371,16 @@ int ocp_set_latency_monitor_feature(int argc, char **argv, struct command *cmd,
perror("set-feature");
} else if (!err) {
printf("NVME_FEAT_OCP_LATENCY_MONITOR: 0x%02x\n", NVME_FEAT_OCP_LATENCY_MONITOR);
- printf("active bucket timer threshold: 0x%x\n", buf.active_bucket_timer_threshold);
+ 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);
printf("active threshold b: 0x%x\n", buf.active_threshold_b);
printf("active threshold c: 0x%x\n", buf.active_threshold_c);
printf("active threshold d: 0x%x\n", buf.active_threshold_d);
- printf("active latency config: 0x%x\n", buf.active_latency_config);
+ printf("active latency config: 0x%x\n", le16_to_cpu(buf.active_latency_config));
printf("active latency minimum window: 0x%x\n", buf.active_latency_minimum_window);
- printf("debug log trigger enable: 0x%x\n", buf.debug_log_trigger_enable);
+ printf("debug log trigger enable: 0x%x\n",
+ le16_to_cpu(buf.debug_log_trigger_enable));
printf("discard debug log: 0x%x\n", buf.discard_debug_log);
printf("latency monitor feature enable: 0x%x\n", buf.latency_monitor_feature_enable);
} else if (err > 0) {
@@ -912,6 +571,7 @@ __u8 *pC9_string_buffer;
static void get_serial_number(struct nvme_id_ctrl *ctrl, char *sn)
{
int i;
+
/* Remove trailing spaces from the name */
for (i = 0; i < sizeof(ctrl->sn); i++) {
if (ctrl->sn[i] == ' ')
@@ -920,8 +580,7 @@ static void get_serial_number(struct nvme_id_ctrl *ctrl, char *sn)
}
}
-static void print_telemetry_header(struct telemetry_initiated_log *logheader,
- int tele_type)
+static void print_telemetry_header(struct telemetry_initiated_log *logheader, int tele_type)
{
if (logheader) {
unsigned int i = 0, j = 0;
@@ -973,16 +632,14 @@ static int get_telemetry_data(struct nvme_dev *dev, __u32 ns, __u8 tele_type,
__u16 numdu = numd >> 16;
__u16 numdl = numd & 0xffff;
- cmd.cdw10 = tele_type |
- (nLSP & 0x0F) << 8 |
- (nRAE & 0x01) << 15 |
- (numdl & 0xFFFF) << 16;
+ cmd.cdw10 = tele_type | (nLSP & 0x0F) << 8 | (nRAE & 0x01) << 15 | (numdl & 0xFFFF) << 16;
cmd.cdw11 = numdu;
cmd.cdw12 = (__u32)(0x00000000FFFFFFFF & offset);
cmd.cdw13 = (__u32)((0xFFFFFFFF00000000 & offset) >> 8);
cmd.cdw14 = 0;
return nvme_submit_admin_passthru(dev_fd(dev), &cmd, NULL);
}
+
static void print_telemetry_data_area_1(struct telemetry_data_area_1 *da1,
int tele_type)
{
@@ -1004,19 +661,19 @@ static void print_telemetry_data_area_1(struct telemetry_data_area_1 *da1,
da1->no_of_tps_supp);
printf("Telemetry Profile Selected (TPS) : 0x%x\n",
da1->tps);
- printf("Telemetry String Log Size (SLS) : 0x%lx\n",
- le64_to_cpu(da1->sls));
+ printf("Telemetry String Log Size (SLS) : 0x%"PRIx64"\n",
+ le64_to_cpu(da1->sls));
printf("Firmware Revision : ");
for (i = 0; i < 8; i++)
printf("%c", (char)da1->fw_revision[i]);
printf("\n");
- printf("Data Area 1 Statistic Start : 0x%lx\n",
+ printf("Data Area 1 Statistic Start : 0x%"PRIx64"\n",
le64_to_cpu(da1->da1_stat_start));
- printf("Data Area 1 Statistic Size : 0x%lx\n",
+ printf("Data Area 1 Statistic Size : 0x%"PRIx64"\n",
le64_to_cpu(da1->da1_stat_size));
- printf("Data Area 2 Statistic Start : 0x%lx\n",
+ printf("Data Area 2 Statistic Start : 0x%"PRIx64"\n",
le64_to_cpu(da1->da2_stat_start));
- printf("Data Area 2 Statistic Size : 0x%lx\n",
+ printf("Data Area 2 Statistic Size : 0x%"PRIx64"\n",
le64_to_cpu(da1->da2_stat_size));
for (i = 0; i < 16; i++) {
printf("Event FIFO %d Data Area : 0x%x\n",
@@ -1041,10 +698,9 @@ static void print_telemetry_data_area_1(struct telemetry_data_area_1 *da1,
printf("===============================================\n\n");
}
}
-static void print_telemetry_da_stat(struct telemetry_stats_desc *da_stat,
- int tele_type,
- __u16 buf_size,
- __u8 data_area)
+
+static void print_telemetry_da_stat(struct telemetry_stats_desc *da_stat, int tele_type,
+ __u16 buf_size, __u8 data_area)
{
if (da_stat) {
unsigned int i = 0;
@@ -1052,14 +708,14 @@ static void print_telemetry_da_stat(struct telemetry_stats_desc *da_stat,
if (tele_type == TELEMETRY_TYPE_HOST)
printf("============ Telemetry Host Data Area %d Statistics ============\n",
- data_area);
+ data_area);
else
printf("========= Telemetry Controller Data Area %d Statistics =========\n",
- data_area);
+ data_area);
while ((i + 8) < buf_size) {
print_stats_desc(next_da_stat);
i += 8 + ((next_da_stat->size) * 4);
- next_da_stat = (struct telemetry_stats_desc *)((__u64)da_stat + i);
+ next_da_stat = (struct telemetry_stats_desc *)((void *)da_stat + i);
if ((next_da_stat->id == 0) && (next_da_stat->size == 0))
break;
@@ -1068,13 +724,13 @@ static void print_telemetry_da_stat(struct telemetry_stats_desc *da_stat,
}
}
static void print_telemetry_da_fifo(struct telemetry_event_desc *da_fifo,
- __le64 buf_size,
+ __u64 buf_size,
int tele_type,
int da,
int index)
{
if (da_fifo) {
- unsigned int i = 0;
+ __u64 i = 0;
struct telemetry_event_desc *next_da_fifo = da_fifo;
if (tele_type == TELEMETRY_TYPE_HOST)
@@ -1084,8 +740,11 @@ static void print_telemetry_da_fifo(struct telemetry_event_desc *da_fifo,
printf("====== Telemetry Controller Data area %d Event FIFO %d ======\n",
da, index);
-
while ((i + 4) < buf_size) {
+ /* break if last entry */
+ if (next_da_fifo->class == 0)
+ break;
+
/* Print Event Data */
print_telemetry_fifo_event(next_da_fifo->class, /* Event class type */
next_da_fifo->id, /* Event ID */
@@ -1093,7 +752,7 @@ static void print_telemetry_da_fifo(struct telemetry_event_desc *da_fifo,
(__u8 *)&next_da_fifo->data); /* Event data */
i += (4 + (next_da_fifo->size * 4));
- next_da_fifo = (struct telemetry_event_desc *)((__u64)da_fifo + i);
+ next_da_fifo = (struct telemetry_event_desc *)((void *)da_fifo + i);
}
printf("===============================================\n\n");
}
@@ -1183,8 +842,8 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
enum TELEMETRY_TYPE tele_type, int data_area, bool header_print)
{
__u32 err = 0, nsid = 0;
- __le64 da1_sz = 512, m_512_sz = 0, da1_off = 0, m_512_off = 0, diff = 0,
- temp_sz = 0, temp_ofst = 0;
+ __u64 da1_sz = 512, m_512_sz = 0, da1_off = 0, m_512_off = 0, diff = 0, temp_sz = 0,
+ temp_ofst = 0;
__u8 lsp = 0, rae = 0, flag = 0;
__u8 data[TELEMETRY_HEADER_SIZE] = { 0 };
unsigned int i = 0;
@@ -1212,8 +871,8 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
}
/* Get the telemetry header */
- err = get_telemetry_data(dev, nsid, tele_type, TELEMETRY_HEADER_SIZE,
- (void *)data, lsp, rae, 0);
+ err = get_telemetry_data(dev, nsid, tele_type, TELEMETRY_HEADER_SIZE, (void *)data, lsp,
+ rae, 0);
if (err) {
printf("get_telemetry_header failed, err: %d.\n", err);
return err;
@@ -1223,8 +882,8 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
print_telemetry_header(logheader, tele_type);
/* Get the telemetry data */
- err = get_telemetry_data(dev, nsid, tele_type, TELEMETRY_DATA_SIZE,
- (void *)data1, lsp, rae, 512);
+ err = get_telemetry_data(dev, nsid, tele_type, TELEMETRY_DATA_SIZE, (void *)data1, lsp,
+ rae, 512);
if (err) {
printf("get_telemetry_data failed for type: 0x%x, err: %d.\n", tele_type, err);
return err;
@@ -1235,26 +894,26 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
/* Print the Data Area 1 Stats */
if (da1->da1_stat_size != 0) {
diff = 0;
- da1_sz = (da1->da1_stat_size) * 4;
- m_512_sz = (da1->da1_stat_size) * 4;
- da1_off = (da1->da1_stat_start) * 4;
- m_512_off = (da1->da1_stat_start) * 4;
- temp_sz = (da1->da1_stat_size) * 4;
- temp_ofst = (da1->da1_stat_start) * 4;
+ da1_sz = le64_to_cpu(da1->da1_stat_size) * 4;
+ m_512_sz = le64_to_cpu(da1->da1_stat_size) * 4;
+ da1_off = le64_to_cpu(da1->da1_stat_start) * 4;
+ m_512_off = le64_to_cpu(da1->da1_stat_start) * 4;
+ temp_sz = le64_to_cpu(da1->da1_stat_size) * 4;
+ temp_ofst = le64_to_cpu(da1->da1_stat_start) * 4;
flag = 0;
if ((da1_off % 512) > 0) {
- m_512_off = (__le64) ((da1_off / 512));
+ m_512_off = (da1_off / 512);
da1_off = m_512_off * 512;
diff = temp_ofst - da1_off;
flag = 1;
}
- if (da1_sz < 512)
+ if (da1_sz < 512) {
da1_sz = 512;
- else if ((da1_sz % 512) > 0) {
+ } else if ((da1_sz % 512) > 0) {
if (flag == 0) {
- m_512_sz = (__le64) ((da1_sz / 512) + 1);
+ m_512_sz = (da1_sz / 512) + 1;
da1_sz = m_512_sz * 512;
} else {
if (diff < 512)
@@ -1262,48 +921,48 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
else
diff = (diff / 512) * 512;
- m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1);
+ m_512_sz = (da1_sz / 512) + 1 + diff + 1;
da1_sz = m_512_sz * 512;
}
}
char *da1_stat = calloc(da1_sz, sizeof(char));
- err = get_telemetry_data(dev, nsid, tele_type, da1_sz,
- (void *)da1_stat, lsp, rae, da1_off);
+ err = get_telemetry_data(dev, nsid, tele_type, da1_sz, (void *)da1_stat, lsp, rae,
+ da1_off);
if (err) {
printf("get_telemetry_data da1 stats failed, err: %d.\n", err);
return err;
}
- print_telemetry_da_stat((void *)(da1_stat + (temp_ofst - da1_off)),
- tele_type, (da1->da1_stat_size) * 4, 1);
+ print_telemetry_da_stat((void *)(da1_stat + (temp_ofst - da1_off)), tele_type,
+ le64_to_cpu(da1->da1_stat_size) * 4, 1);
}
/* Print the Data Area 1 Event FIFO's */
for (i = 0; i < 16 ; i++) {
if ((da1->event_fifo_da[i] == 1) && (da1->event_fifos[i].size != 0)) {
diff = 0;
- da1_sz = da1->event_fifos[i].size * 4;
- m_512_sz = da1->event_fifos[i].size * 4;
- da1_off = da1->event_fifos[i].start * 4;
- m_512_off = da1->event_fifos[i].start * 4;
- temp_sz = da1->event_fifos[i].size * 4;
- temp_ofst = da1->event_fifos[i].start * 4;
+ da1_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
+ m_512_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
+ da1_off = le64_to_cpu(da1->event_fifos[i].start) * 4;
+ m_512_off = le64_to_cpu(da1->event_fifos[i].start) * 4;
+ temp_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
+ temp_ofst = le64_to_cpu(da1->event_fifos[i].start) * 4;
flag = 0;
if ((da1_off % 512) > 0) {
- m_512_off = (__le64) ((da1_off / 512));
+ m_512_off = ((da1_off / 512));
da1_off = m_512_off * 512;
diff = temp_ofst - da1_off;
flag = 1;
}
- if (da1_sz < 512)
+ if (da1_sz < 512) {
da1_sz = 512;
- else if ((da1_sz % 512) > 0) {
+ } else if ((da1_sz % 512) > 0) {
if (flag == 0) {
- m_512_sz = (__le64) ((da1_sz / 512) + 1);
+ m_512_sz = (da1_sz / 512) + 1;
da1_sz = m_512_sz * 512;
} else {
if (diff < 512)
@@ -1311,121 +970,115 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
else
diff = (diff / 512) * 512;
- m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1);
+ m_512_sz = (da1_sz / 512) + 1 + diff + 1;
da1_sz = m_512_sz * 512;
}
}
char *da1_fifo = calloc(da1_sz, sizeof(char));
+ printf("Get DA 1 FIFO addr: %p, offset 0x%"PRIx64"\n", da1_fifo,
+ (uint64_t)da1_off);
err = get_telemetry_data(dev, nsid, tele_type,
- (da1->event_fifos[i].size) * 4,
- (void *)da1_fifo, lsp, rae, da1_off);
+ le64_to_cpu(da1->event_fifos[i].size) * 4,
+ (void *)da1_fifo, lsp, rae, da1_off);
if (err) {
printf("get_telemetry_data da1 event fifos failed, err: %d.\n",
- err);
+ err);
return err;
}
- print_telemetry_da_fifo((void *)(da1_fifo + (temp_ofst - da1_off)),
- temp_sz,
- tele_type,
- da1->event_fifo_da[i],
- i);
+ print_telemetry_da_fifo((void *)(da1_fifo + (temp_ofst - da1_off)), temp_sz,
+ tele_type, le64_to_cpu(da1->event_fifo_da[i]), i);
}
}
/* Print the Data Area 2 Stats */
if (da1->da2_stat_size != 0) {
- da1_off = (da1->da2_stat_start) * 4;
- temp_ofst = (da1->da2_stat_start) * 4;
- da1_sz = (da1->da2_stat_size) * 4;
+ da1_off = le64_to_cpu(da1->da2_stat_start) * 4;
+ temp_ofst = le64_to_cpu(da1->da2_stat_start) * 4;
+ da1_sz = le64_to_cpu(da1->da2_stat_size) * 4;
diff = 0;
flag = 0;
if (da1->da2_stat_start == 0) {
- da1_off = 512 + (logheader->DataArea1LastBlock * 512);
+ da1_off = 512 + (le16_to_cpu(logheader->DataArea1LastBlock) * 512);
temp_ofst = 512 + (le16_to_cpu(logheader->DataArea1LastBlock) * 512);
if ((da1_off % 512) == 0) {
- m_512_off = (__le64) (((da1_off) / 512));
+ m_512_off = ((da1_off) / 512);
da1_off = m_512_off * 512;
diff = temp_ofst - da1_off;
flag = 1;
}
} else {
-
if (((da1_off * 4) % 512) > 0) {
- m_512_off = (__le64) ((((da1->da2_stat_start) * 4) / 512));
+ m_512_off = ((le64_to_cpu(da1->da2_stat_start) * 4) / 512);
da1_off = m_512_off * 512;
- diff = ((da1->da2_stat_start) * 4) - da1_off;
+ diff = (le64_to_cpu(da1->da2_stat_start) * 4) - da1_off;
flag = 1;
}
}
- if (da1_sz < 512)
+ if (da1_sz < 512) {
da1_sz = 512;
- else if ((da1_sz % 512) > 0) {
+ } else if ((da1_sz % 512) > 0) {
if (flag == 0) {
- m_512_sz = (__le64) ((da1->da2_stat_size / 512) + 1);
+ m_512_sz = (le64_to_cpu(da1->da2_stat_size) / 512) + 1;
da1_sz = m_512_sz * 512;
} else {
if (diff < 512)
diff = 1;
else
diff = (diff / 512) * 512;
- m_512_sz = (__le64) ((da1->da2_stat_size / 512) + 1 + diff + 1);
+ m_512_sz = (le64_to_cpu(da1->da2_stat_size) / 512) + 1 + diff + 1;
da1_sz = m_512_sz * 512;
}
}
char *da2_stat = calloc(da1_sz, sizeof(char));
- err = get_telemetry_data(dev, nsid, tele_type, da1_sz,
- (void *)da2_stat, lsp, rae, da1_off);
+ err = get_telemetry_data(dev, nsid, tele_type, da1_sz, (void *)da2_stat, lsp, rae,
+ da1_off);
if (err) {
printf("get_telemetry_data da2 stats failed, err: %d.\n", err);
return err;
}
- print_telemetry_da_stat((void *)(da2_stat + (temp_ofst - da1_off)),
- tele_type,
- (da1->da2_stat_size) * 4,
- 2);
+ print_telemetry_da_stat((void *)(da2_stat + (temp_ofst - da1_off)), tele_type,
+ le64_to_cpu(da1->da2_stat_size) * 4, 2);
}
/* Print the Data Area 2 Event FIFO's */
for (i = 0; i < 16 ; i++) {
if ((da1->event_fifo_da[i] == 2) && (da1->event_fifos[i].size != 0)) {
diff = 0;
- da1_sz = da1->event_fifos[i].size * 4;
- m_512_sz = da1->event_fifos[i].size * 4;
- da1_off = da1->event_fifos[i].start * 4;
- m_512_off = da1->event_fifos[i].start * 4;
- temp_sz = da1->event_fifos[i].size * 4;
- temp_ofst = da1->event_fifos[i].start * 4;
+ da1_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
+ m_512_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
+ da1_off = le64_to_cpu(da1->event_fifos[i].start) * 4;
+ m_512_off = le64_to_cpu(da1->event_fifos[i].start) * 4;
+ temp_sz = le64_to_cpu(da1->event_fifos[i].size) * 4;
+ temp_ofst = le64_to_cpu(da1->event_fifos[i].start) * 4;
flag = 0;
if ((da1_off % 512) > 0) {
- m_512_off = (__le64) ((da1_off / 512));
+ m_512_off = ((da1_off / 512));
da1_off = m_512_off * 512;
diff = temp_ofst - da1_off;
flag = 1;
}
- if (da1_sz < 512)
+ if (da1_sz < 512) {
da1_sz = 512;
- else if ((da1_sz % 512) > 0) {
+ } else if ((da1_sz % 512) > 0) {
if (flag == 0) {
- m_512_sz = (__le64) ((da1_sz / 512) + 1);
+ m_512_sz = (da1_sz / 512) + 1;
da1_sz = m_512_sz * 512;
- }
-
- else {
+ } else {
if (diff < 512)
diff = 1;
else
diff = (diff / 512) * 512;
- m_512_sz = (__le64) ((da1_sz / 512) + 1 + diff + 1);
+ m_512_sz = (da1_sz / 512) + 1 + diff + 1;
da1_sz = m_512_sz * 512;
}
}
@@ -1433,18 +1086,15 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
char *da1_fifo = calloc(da1_sz, sizeof(char));
err = get_telemetry_data(dev, nsid, tele_type,
- (da1->event_fifos[i].size) * 4,
- (void *)da1_fifo, lsp, rae, da1_off);
+ le64_to_cpu(da1->event_fifos[i].size) * 4,
+ (void *)da1_fifo, lsp, rae, da1_off);
if (err) {
printf("get_telemetry_data da2 event fifos failed, err: %d.\n",
- err);
+ err);
return err;
}
- print_telemetry_da_fifo((void *)(da1_fifo + (temp_ofst - da1_off)),
- temp_sz,
- tele_type,
- da1->event_fifo_da[i],
- i);
+ print_telemetry_da_fifo((void *)(da1_fifo + (temp_ofst - da1_off)), temp_sz,
+ tele_type, le64_to_cpu(da1->event_fifo_da[i]), i);
}
}
@@ -1452,20 +1102,20 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
switch (data_area) {
case 1:
- offset = TELEMETRY_HEADER_SIZE;
- size = le16_to_cpu(logheader->DataArea1LastBlock);
+ offset = TELEMETRY_HEADER_SIZE;
+ size = le16_to_cpu(logheader->DataArea1LastBlock);
break;
case 2:
- offset = TELEMETRY_HEADER_SIZE
- + (le16_to_cpu(logheader->DataArea1LastBlock) * TELEMETRY_BYTE_PER_BLOCK);
- size = le16_to_cpu(logheader->DataArea2LastBlock)
- - le16_to_cpu(logheader->DataArea1LastBlock);
+ offset = TELEMETRY_HEADER_SIZE +
+ (le16_to_cpu(logheader->DataArea1LastBlock) * TELEMETRY_BYTE_PER_BLOCK);
+ size = le16_to_cpu(logheader->DataArea2LastBlock) -
+ le16_to_cpu(logheader->DataArea1LastBlock);
break;
case 3:
- offset = TELEMETRY_HEADER_SIZE
- + (le16_to_cpu(logheader->DataArea2LastBlock) * TELEMETRY_BYTE_PER_BLOCK);
- size = le16_to_cpu(logheader->DataArea3LastBlock)
- - le16_to_cpu(logheader->DataArea2LastBlock);
+ offset = TELEMETRY_HEADER_SIZE +
+ (le16_to_cpu(logheader->DataArea2LastBlock) * TELEMETRY_BYTE_PER_BLOCK);
+ size = le16_to_cpu(logheader->DataArea3LastBlock) -
+ le16_to_cpu(logheader->DataArea2LastBlock);
break;
default:
break;
@@ -1476,11 +1126,9 @@ static int get_telemetry_dump(struct nvme_dev *dev, char *filename, char *sn,
return err;
}
- snprintf(dumpname, FILE_NAME_SIZE,
- "Telemetry_%s_Area_%d", featurename, data_area);
+ snprintf(dumpname, FILE_NAME_SIZE, "Telemetry_%s_Area_%d", featurename, data_area);
err = extract_dump_get_log(dev, dumpname, filename, sn, size * TELEMETRY_BYTE_PER_BLOCK,
- TELEMETRY_TRANSFER_SIZE, nsid, tele_type,
- 0, offset, rae);
+ TELEMETRY_TRANSFER_SIZE, nsid, tele_type, 0, offset, rae);
return err;
}
@@ -1588,13 +1236,15 @@ exit_status:
static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_bin)
{
- int ret = 0, fd;
+ int ret = 0;
__le64 stat_id_str_table_ofst = 0;
__le64 event_str_table_ofst = 0;
__le64 vu_event_str_table_ofst = 0;
__le64 ascii_table_ofst = 0;
char file_path[PATH_MAX];
+ _cleanup_fd_ int fd = STDIN_FILENO;
+
header_data = (__u8 *)malloc(sizeof(__u8) * C9_TELEMETRY_STR_LOG_LEN);
if (!header_data) {
fprintf(stderr, "ERROR : OCP : malloc : %s\n", strerror(errno));
@@ -1608,29 +1258,34 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b
if (!ret) {
log_data = (struct telemetry_str_log_format *)header_data;
if (print_data) {
- printf("Statistics Identifier String Table Size = %lld\n",
- log_data->sitsz);
- printf("Event String Table Size = %lld\n", log_data->estsz);
- printf("VU Event String Table Size = %lld\n", log_data->vu_eve_st_sz);
- printf("ASCII Table Size = %lld\n", log_data->asctsz);
+ printf("Statistics Identifier String Table Size = %"PRIu64"\n",
+ le64_to_cpu(log_data->sitsz));
+ printf("Event String Table Size = %"PRIu64"\n",
+ le64_to_cpu(log_data->estsz));
+ printf("VU Event String Table Size = %"PRIu64"\n",
+ le64_to_cpu(log_data->vu_eve_st_sz));
+ printf("ASCII Table Size = %"PRIu64"\n", le64_to_cpu(log_data->asctsz));
}
- //Calculating the offset for dynamic fields.
+ /* Calculating the offset for dynamic fields. */
stat_id_str_table_ofst = log_data->sits * 4;
event_str_table_ofst = log_data->ests * 4;
vu_event_str_table_ofst = log_data->vu_eve_sts * 4;
ascii_table_ofst = log_data->ascts * 4;
total_log_page_sz = C9_TELEMETRY_STR_LOG_LEN +
- (log_data->sitsz * 4) + (log_data->estsz * 4) +
- (log_data->vu_eve_st_sz * 4) + (log_data->asctsz * 4);
+ (log_data->sitsz * 4) + (log_data->estsz * 4) +
+ (log_data->vu_eve_st_sz * 4) + (log_data->asctsz * 4);
if (print_data) {
- printf("stat_id_str_table_ofst = %lld\n", stat_id_str_table_ofst);
- printf("event_str_table_ofst = %lld\n", event_str_table_ofst);
- printf("vu_event_str_table_ofst = %lld\n", vu_event_str_table_ofst);
- printf("ascii_table_ofst = %lld\n", ascii_table_ofst);
- printf("total_log_page_sz = %lld\n", total_log_page_sz);
+ printf("stat_id_str_table_ofst = %"PRIu64"\n",
+ le64_to_cpu(stat_id_str_table_ofst));
+ printf("event_str_table_ofst = %"PRIu64"\n",
+ le64_to_cpu(event_str_table_ofst));
+ printf("vu_event_str_table_ofst = %"PRIu64"\n",
+ le64_to_cpu(vu_event_str_table_ofst));
+ printf("ascii_table_ofst = %"PRIu64"\n", le64_to_cpu(ascii_table_ofst));
+ printf("total_log_page_sz = %"PRIu64"\n", le64_to_cpu(total_log_page_sz));
}
pC9_string_buffer = (__u8 *)malloc(sizeof(__u8) * total_log_page_sz);
@@ -1642,26 +1297,24 @@ static int get_c9_log_page_data(struct nvme_dev *dev, int print_data, int save_b
ret = nvme_get_log_simple(dev_fd(dev), C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE,
total_log_page_sz, pC9_string_buffer);
- } else
+ } else {
fprintf(stderr, "ERROR : OCP : Unable to read C9 data.\n");
+ }
if (save_bin) {
sprintf(file_path, DEFAULT_STRING_BIN);
fd = open(file_path, O_WRONLY | O_CREAT | O_TRUNC, 0666);
if (fd < 0) {
- fprintf(stderr, "Failed to open output file %s: %s!\n",
- file_path, strerror(errno));
- goto exit_status;
+ fprintf(stderr, "Failed to open output file %s: %s!\n", file_path,
+ strerror(errno));
+ return fd;
}
ret = write(fd, (void *)pC9_string_buffer, total_log_page_sz);
if (ret != total_log_page_sz)
fprintf(stderr, "Failed to flush all data to file!\n");
-
- close(fd);
}
-exit_status:
return 0;
}
@@ -1716,22 +1369,12 @@ int parse_ocp_telemetry_log(struct ocp_telemetry_parse_options *options)
return status;
}
- switch (fmt) {
- case NORMAL:
- print_ocp_telemetry_normal(options);
- break;
- case JSON:
- print_ocp_telemetry_json(options);
- break;
- default:
- break;
- }
+ ocp_show_telemetry_log(options, fmt);
return 0;
}
-static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
- struct plugin *plugin)
+static int ocp_telemetry_log(int argc, char **argv, struct command *cmd, struct plugin *plugin)
{
const char *desc = "Retrieve and parse OCP Telemetry log.";
const char *telemetry_log = "Telemetry log binary;\n 'host.bin' or 'controller.bin'";
@@ -1769,6 +1412,9 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
if (err)
return err;
+ if (opt.telemetry_type == 0)
+ opt.telemetry_type = "host";
+
err = fstat(dev_fd(dev), &nvme_stat);
if (err < 0)
return err;
@@ -1812,6 +1458,7 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
}
} else {
tele_type = TELEMETRY_TYPE_HOST; //Default Type - Host
+ opt.telemetry_type = "host";
nvme_show_result("Missing telemetry-type. Using default - host.\n");
}
@@ -1843,23 +1490,21 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
}
switch (tele_type) {
- case TELEMETRY_TYPE_HOST: {
+ case TELEMETRY_TYPE_HOST:
printf("Extracting Telemetry Host Dump (Data Area %d)...\n", tele_area);
err = parse_ocp_telemetry_log(&opt);
if (err)
nvme_show_result("Status:(%x)\n", err);
- }
- break;
- case TELEMETRY_TYPE_CONTROLLER: {
+ break;
+ case TELEMETRY_TYPE_CONTROLLER:
printf("Extracting Telemetry Controller Dump (Data Area %d)...\n", tele_area);
if (is_support_telemetry_controller == true) {
err = parse_ocp_telemetry_log(&opt);
if (err)
nvme_show_result("Status:(%x)\n", err);
}
- }
- break;
- case TELEMETRY_TYPE_NONE: {
+ 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");
@@ -1867,7 +1512,8 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
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);
+ fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
+ err);
printf("\n-------------------------------------------------------------\n");
@@ -1876,7 +1522,8 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
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);
+ fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
+ err);
printf("\n-------------------------------------------------------------\n");
@@ -1885,7 +1532,8 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
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);
+ fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
+ err);
printf("\n-------------------------------------------------------------\n");
@@ -1894,7 +1542,8 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
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);
+ fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
+ err);
printf("\n-------------------------------------------------------------\n");
@@ -1908,19 +1557,18 @@ static int ocp_telemetry_log(int argc, char **argv, struct command *cmd,
}
printf("\n-------------------------------------------------------------\n");
- }
- break;
+ break;
case TELEMETRY_TYPE_HOST_0:
case TELEMETRY_TYPE_HOST_1:
- default: {
+ default:
printf("Extracting Telemetry Host(%d) Dump (Data Area %d)...\n",
(tele_type == TELEMETRY_TYPE_HOST_0) ? 0 : 1, tele_area);
err = get_telemetry_dump(dev, opt.output_file, sn, tele_type, tele_area, true);
if (err)
- fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false), err);
- }
- break;
+ fprintf(stderr, "NVMe Status: %s(%x)\n", nvme_status_to_string(err, false),
+ err);
+ break;
}
printf("ocp internal-log command completed.\n");
@@ -1929,7 +1577,6 @@ out:
return err;
}
-
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
@@ -1937,99 +1584,20 @@ out:
/// Unsupported Requirement Log Page (LID : C5h)
/* C5 Unsupported Requirement Log Page */
-#define C5_GUID_LENGTH 16
#define C5_UNSUPPORTED_REQS_LEN 4096
#define C5_UNSUPPORTED_REQS_OPCODE 0xC5
-#define C5_UNSUPPORTED_REQS_LOG_VERSION 0x1
-#define C5_NUM_UNSUPPORTED_REQ_ENTRIES 253
-static __u8 unsupported_req_guid[C5_GUID_LENGTH] = {
+static __u8 unsupported_req_guid[GUID_LEN] = {
0x2F, 0x72, 0x9C, 0x0E,
0x99, 0x23, 0x2C, 0xBB,
0x63, 0x48, 0x32, 0xD0,
0xB7, 0x98, 0xBB, 0xC7
};
-/*
- * struct unsupported_requirement_log - unsupported requirement list
- * @unsupported_count: Number of Unsupported Requirement IDs
- * @rsvd1: Reserved
- * @unsupported_req_list: Unsupported Requirements lists upto 253.
- * @rsvd2: Reserved
- * @log_page_version: indicates the version of the mapping this log page uses.
- * Shall be set to 0001h
- * @log_page_guid: Shall be set to C7BB98B7D0324863BB2C23990E9C722Fh.
- */
-struct __packed unsupported_requirement_log {
- __le16 unsupported_count;
- __u8 rsvd1[14];
- __u8 unsupported_req_list[C5_NUM_UNSUPPORTED_REQ_ENTRIES][16];
- __u8 rsvd2[14];
- __le16 log_page_version;
- __u8 log_page_guid[C5_GUID_LENGTH];
-};
-
/* Function declaration for unsupported requirement log page (LID:C5h) */
static int ocp_unsupported_requirements_log(int argc, char **argv, struct command *cmd,
struct plugin *plugin);
-static int ocp_print_C5_log_normal(struct nvme_dev *dev,
- struct unsupported_requirement_log *log_data)
-{
- int j;
-
- printf("Unsupported Requirement-C5 Log Page Data-\n");
-
- printf(" Number Unsupported Req IDs : 0x%x\n", le16_to_cpu(log_data->unsupported_count));
-
- for (j = 0; j < le16_to_cpu(log_data->unsupported_count); j++)
- printf(" Unsupported Requirement List %d : %s\n", j, log_data->unsupported_req_list[j]);
-
- printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version));
- printf(" Log page GUID : 0x");
- for (j = C5_GUID_LENGTH - 1; j >= 0; j--)
- printf("%x", log_data->log_page_guid[j]);
- printf("\n");
-
- return 0;
-}
-
-static void ocp_print_C5_log_json(struct unsupported_requirement_log *log_data)
-{
- int j;
- struct json_object *root;
- char unsup_req_list_str[40];
- char guid_buf[C5_GUID_LENGTH];
- char *guid = guid_buf;
-
- root = json_create_object();
-
- json_object_add_value_int(root, "Number Unsupported Req IDs", le16_to_cpu(log_data->unsupported_count));
-
- memset((void *)unsup_req_list_str, 0, 40);
- for (j = 0; j < le16_to_cpu(log_data->unsupported_count); j++) {
- sprintf((char *)unsup_req_list_str, "Unsupported Requirement List %d", j);
- json_object_add_value_string(root, unsup_req_list_str, (char *)log_data->unsupported_req_list[j]);
- }
-
- json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version));
-
- memset((void *)guid, 0, C5_GUID_LENGTH);
- for (j = C5_GUID_LENGTH - 1; j >= 0; j--)
- guid += sprintf(guid, "%02x", log_data->log_page_guid[j]);
- json_object_add_value_string(root, "Log page GUID", guid_buf);
-
- json_print_object(root, NULL);
- printf("\n");
-
- json_free_object(root);
-}
-
-static void ocp_print_c5_log_binary(struct unsupported_requirement_log *log_data)
-{
- return d_raw((unsigned char *)log_data, sizeof(*log_data));
-}
-
static int get_c5_log_page(struct nvme_dev *dev, char *format)
{
nvme_print_flags_t fmt;
@@ -2057,13 +1625,6 @@ static int get_c5_log_page(struct nvme_dev *dev, char *format)
if (!ret) {
log_data = (struct unsupported_requirement_log *)data;
- /* check log page version */
- if (log_data->log_page_version != C5_UNSUPPORTED_REQS_LOG_VERSION) {
- fprintf(stderr, "ERROR : OCP : invalid unsupported requirement version\n");
- ret = -1;
- goto out;
- }
-
/*
* check log page guid
* Verify GUID matches
@@ -2073,30 +1634,17 @@ static int get_c5_log_page(struct nvme_dev *dev, char *format)
fprintf(stderr, "ERROR : OCP : Unknown GUID in C5 Log Page data\n");
fprintf(stderr, "ERROR : OCP : Expected GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", unsupported_req_guid[j]);
+ fprintf(stderr, "%02x", unsupported_req_guid[j]);
fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", log_data->log_page_guid[j]);
+ fprintf(stderr, "%02x", log_data->log_page_guid[j]);
fprintf(stderr, "\n");
ret = -1;
goto out;
}
}
-
- switch (fmt) {
- case NORMAL:
- ocp_print_C5_log_normal(dev, log_data);
- break;
- case JSON:
- ocp_print_C5_log_json(log_data);
- break;
- case BINARY:
- ocp_print_c5_log_binary(log_data);
- break;
- default:
- break;
- }
+ ocp_c5_log(dev, log_data, fmt);
} else {
fprintf(stderr, "ERROR : OCP : Unable to read C3 data from buffer\n");
}
@@ -2146,115 +1694,17 @@ static int ocp_unsupported_requirements_log(int argc, char **argv, struct comman
#define C1_ERROR_RECOVERY_LOG_BUF_LEN 0x200
#define C1_ERROR_RECOVERY_OPCODE 0xC1
-#define C1_ERROR_RECOVERY_VERSION 0x0002
-#define C1_GUID_LENGTH 16
-static __u8 error_recovery_guid[C1_GUID_LENGTH] = {
+
+static __u8 error_recovery_guid[GUID_LEN] = {
0x44, 0xd9, 0x31, 0x21,
0xfe, 0x30, 0x34, 0xae,
0xab, 0x4d, 0xfd, 0x3d,
0xba, 0x83, 0x19, 0x5a
};
-/**
- * struct ocp_error_recovery_log_page - Error Recovery Log Page
- * @panic_reset_wait_time: Panic Reset Wait Time
- * @panic_reset_action: Panic Reset Action
- * @device_recover_action_1: Device Recovery Action 1
- * @panic_id: Panic ID
- * @device_capabilities: Device Capabilities
- * @vendor_specific_recovery_opcode: Vendor Specific Recovery Opcode
- * @reserved: Reserved
- * @vendor_specific_command_cdw12: Vendor Specific Command CDW12
- * @vendor_specific_command_cdw13: Vendor Specific Command CDW13
- * @vendor_specific_command_timeout: Vendor Specific Command Timeout
- * @device_recover_action_2: Device Recovery Action 2
- * @device_recover_action_2_timeout: Device Recovery Action 2 Timeout
- * @reserved2: Reserved
- * @log_page_version: Log Page Version
- * @log_page_guid: Log Page GUID
- */
-struct __packed ocp_error_recovery_log_page {
- __le16 panic_reset_wait_time; /* 2 bytes - 0x00 - 0x01 */
- __u8 panic_reset_action; /* 1 byte - 0x02 */
- __u8 device_recover_action_1; /* 1 byte - 0x03 */
- __le64 panic_id; /* 8 bytes - 0x04 - 0x0B */
- __le32 device_capabilities; /* 4 bytes - 0x0C - 0x0F */
- __u8 vendor_specific_recovery_opcode; /* 1 byte - 0x10 */
- __u8 reserved[0x3]; /* 3 bytes - 0x11 - 0x13 */
- __le32 vendor_specific_command_cdw12; /* 4 bytes - 0x14 - 0x17 */
- __le32 vendor_specific_command_cdw13; /* 4 bytes - 0x18 - 0x1B */
- __u8 vendor_specific_command_timeout; /* 1 byte - 0x1C */
- __u8 device_recover_action_2; /* 1 byte - 0x1D */
- __u8 device_recover_action_2_timeout; /* 1 byte - 0x1E */
- __u8 reserved2[0x1cf]; /* 463 bytes - 0x1F - 0x1ED */
- __le16 log_page_version; /* 2 bytes - 0x1EE - 0x1EF */
- __u8 log_page_guid[0x10]; /* 16 bytes - 0x1F0 - 0x1FF */
-};
-
-static void ocp_print_c1_log_normal(struct ocp_error_recovery_log_page *log_data);
-static void ocp_print_c1_log_json(struct ocp_error_recovery_log_page *log_data);
-static void ocp_print_c1_log_binary(struct ocp_error_recovery_log_page *log_data);
static int get_c1_log_page(struct nvme_dev *dev, char *format);
static int ocp_error_recovery_log(int argc, char **argv, struct command *cmd, struct plugin *plugin);
-static void ocp_print_c1_log_normal(struct ocp_error_recovery_log_page *log_data)
-{
- int i;
-
- printf(" Error Recovery/C1 Log Page Data\n");
- printf(" Panic Reset Wait Time : 0x%x\n", le16_to_cpu(log_data->panic_reset_wait_time));
- printf(" Panic Reset Action : 0x%x\n", log_data->panic_reset_action);
- printf(" Device Recovery Action 1 : 0x%x\n", log_data->device_recover_action_1);
- printf(" Panic ID : 0x%x\n", le32_to_cpu(log_data->panic_id));
- printf(" Device Capabilities : 0x%x\n", le32_to_cpu(log_data->device_capabilities));
- printf(" Vendor Specific Recovery Opcode : 0x%x\n", log_data->vendor_specific_recovery_opcode);
- printf(" Vendor Specific Command CDW12 : 0x%x\n", le32_to_cpu(log_data->vendor_specific_command_cdw12));
- printf(" Vendor Specific Command CDW13 : 0x%x\n", le32_to_cpu(log_data->vendor_specific_command_cdw13));
- printf(" Vendor Specific Command Timeout : 0x%x\n", log_data->vendor_specific_command_timeout);
- printf(" Device Recovery Action 2 : 0x%x\n", log_data->device_recover_action_2);
- printf(" Device Recovery Action 2 Timeout : 0x%x\n", log_data->device_recover_action_2_timeout);
- printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version));
- printf(" Log page GUID : 0x");
- for (i = C1_GUID_LENGTH - 1; i >= 0; i--)
- printf("%x", log_data->log_page_guid[i]);
- printf("\n");
-}
-
-static void ocp_print_c1_log_json(struct ocp_error_recovery_log_page *log_data)
-{
- struct json_object *root;
-
- root = json_create_object();
- char guid[64];
-
- json_object_add_value_int(root, "Panic Reset Wait Time", le16_to_cpu(log_data->panic_reset_wait_time));
- json_object_add_value_int(root, "Panic Reset Action", log_data->panic_reset_action);
- json_object_add_value_int(root, "Device Recovery Action 1", log_data->device_recover_action_1);
- json_object_add_value_int(root, "Panic ID", le32_to_cpu(log_data->panic_id));
- json_object_add_value_int(root, "Device Capabilities", le32_to_cpu(log_data->device_capabilities));
- json_object_add_value_int(root, "Vendor Specific Recovery Opcode", log_data->vendor_specific_recovery_opcode);
- json_object_add_value_int(root, "Vendor Specific Command CDW12", le32_to_cpu(log_data->vendor_specific_command_cdw12));
- json_object_add_value_int(root, "Vendor Specific Command CDW13", le32_to_cpu(log_data->vendor_specific_command_cdw13));
- json_object_add_value_int(root, "Vendor Specific Command Timeout", log_data->vendor_specific_command_timeout);
- json_object_add_value_int(root, "Device Recovery Action 2", log_data->device_recover_action_2);
- json_object_add_value_int(root, "Device Recovery Action 2 Timeout", log_data->device_recover_action_2_timeout);
- json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version));
-
- memset((void *)guid, 0, 64);
- sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]),
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[0]));
- json_object_add_value_string(root, "Log page GUID", guid);
-
- json_print_object(root, NULL);
- printf("\n");
- json_free_object(root);
-}
-
-static void ocp_print_c1_log_binary(struct ocp_error_recovery_log_page *log_data)
-{
- return d_raw((unsigned char *)log_data, sizeof(*log_data));
-}
-
static int get_c1_log_page(struct nvme_dev *dev, char *format)
{
struct ocp_error_recovery_log_page *log_data;
@@ -2281,13 +1731,6 @@ static int get_c1_log_page(struct nvme_dev *dev, char *format)
if (!ret) {
log_data = (struct ocp_error_recovery_log_page *)data;
- /* check log page version */
- if (log_data->log_page_version != C1_ERROR_RECOVERY_VERSION) {
- fprintf(stderr, "ERROR : OCP : invalid error recovery log page version\n");
- ret = -1;
- goto out;
- }
-
/*
* check log page guid
* Verify GUID matches
@@ -2297,30 +1740,17 @@ static int get_c1_log_page(struct nvme_dev *dev, char *format)
fprintf(stderr, "ERROR : OCP : Unknown GUID in C1 Log Page data\n");
fprintf(stderr, "ERROR : OCP : Expected GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", error_recovery_guid[j]);
+ fprintf(stderr, "%02x", error_recovery_guid[j]);
fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", log_data->log_page_guid[j]);
+ fprintf(stderr, "%02x", log_data->log_page_guid[j]);
fprintf(stderr, "\n");
ret = -1;
goto out;
}
}
-
- switch (fmt) {
- case NORMAL:
- ocp_print_c1_log_normal(log_data);
- break;
- case JSON:
- ocp_print_c1_log_json(log_data);
- break;
- case BINARY:
- ocp_print_c1_log_binary(log_data);
- break;
- default:
- break;
- }
+ ocp_c1_log(log_data, fmt);
} else {
fprintf(stderr, "ERROR : OCP : Unable to read C1 data from buffer\n");
}
@@ -2368,109 +1798,16 @@ static int ocp_error_recovery_log(int argc, char **argv, struct command *cmd, st
#define C4_DEV_CAP_REQ_LEN 0x1000
#define C4_DEV_CAP_REQ_OPCODE 0xC4
-#define C4_DEV_CAP_REQ_VERSION 0x0001
-#define C4_GUID_LENGTH 16
-static __u8 dev_cap_req_guid[C4_GUID_LENGTH] = {
+static __u8 dev_cap_req_guid[GUID_LEN] = {
0x97, 0x42, 0x05, 0x0d,
0xd1, 0xe1, 0xc9, 0x98,
0x5d, 0x49, 0x58, 0x4b,
0x91, 0x3c, 0x05, 0xb7
};
-/**
- * struct ocp_device_capabilities_log_page - Device Capability Log page
- * @pcie_exp_port: PCI Express Ports
- * @oob_management_support: OOB Management Support
- * @wz_cmd_support: Write Zeroes Command Support
- * @sanitize_cmd_support: Sanitize Command Support
- * @dsm_cmd_support: Dataset Management Command Support
- * @wu_cmd_support: Write Uncorrectable Command Support
- * @fused_operation_support: Fused Operation Support
- * @min_valid_dssd_pwr_state: Minimum Valid DSSD Power State
- * @dssd_pwr_state_desc: DSSD Power State Descriptors
- * @vendor_specific_command_timeout: Vendor Specific Command Timeout
- * @reserved: Reserved
- * @log_page_version: Log Page Version
- * @log_page_guid: Log Page GUID
- */
-struct __packed ocp_device_capabilities_log_page {
- __le16 pcie_exp_port;
- __le16 oob_management_support;
- __le16 wz_cmd_support;
- __le16 sanitize_cmd_support;
- __le16 dsm_cmd_support;
- __le16 wu_cmd_support;
- __le16 fused_operation_support;
- __le16 min_valid_dssd_pwr_state;
- __u8 dssd_pwr_state_desc[128];
- __u8 reserved[3934];
- __le16 log_page_version;
- __u8 log_page_guid[16];
-};
-
-static void ocp_print_c4_log_normal(struct ocp_device_capabilities_log_page *log_data);
-static void ocp_print_c4_log_json(struct ocp_device_capabilities_log_page *log_data);
-static void ocp_print_c4_log_binary(struct ocp_device_capabilities_log_page *log_data);
static int get_c4_log_page(struct nvme_dev *dev, char *format);
static int ocp_device_capabilities_log(int argc, char **argv, struct command *cmd, struct plugin *plugin);
-static void ocp_print_c4_log_normal(struct ocp_device_capabilities_log_page *log_data)
-{
- int i;
-
- printf(" Device Capability/C4 Log Page Data\n");
- printf(" PCI Express Ports : 0x%x\n", le16_to_cpu(log_data->pcie_exp_port));
- printf(" OOB Management Support : 0x%x\n", le16_to_cpu(log_data->oob_management_support));
- printf(" Write Zeroes Command Support : 0x%x\n", le16_to_cpu(log_data->wz_cmd_support));
- printf(" Sanitize Command Support : 0x%x\n", le16_to_cpu(log_data->sanitize_cmd_support));
- printf(" Dataset Management Command Support : 0x%x\n", le16_to_cpu(log_data->dsm_cmd_support));
- printf(" Write Uncorrectable Command Support : 0x%x\n", le16_to_cpu(log_data->wu_cmd_support));
- printf(" Fused Operation Support : 0x%x\n", le16_to_cpu(log_data->fused_operation_support));
- printf(" Minimum Valid DSSD Power State : 0x%x\n", le16_to_cpu(log_data->min_valid_dssd_pwr_state));
- printf(" DSSD Power State Descriptors : 0x");
- for (i = 0; i <= 127; i++)
- printf("%x", log_data->dssd_pwr_state_desc[i]);
- printf("\n");
- printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version));
- printf(" Log page GUID : 0x");
- for (i = C4_GUID_LENGTH - 1; i >= 0; i--)
- printf("%x", log_data->log_page_guid[i]);
- printf("\n");
-}
-
-static void ocp_print_c4_log_json(struct ocp_device_capabilities_log_page *log_data)
-{
- struct json_object *root = json_create_object();
- char guid[64];
- int i;
-
- json_object_add_value_int(root, "PCI Express Ports", le16_to_cpu(log_data->pcie_exp_port));
- json_object_add_value_int(root, "OOB Management Support", le16_to_cpu(log_data->oob_management_support));
- json_object_add_value_int(root, "Write Zeroes Command Support", le16_to_cpu(log_data->wz_cmd_support));
- json_object_add_value_int(root, "Sanitize Command Support", le16_to_cpu(log_data->sanitize_cmd_support));
- json_object_add_value_int(root, "Dataset Management Command Support", le16_to_cpu(log_data->dsm_cmd_support));
- json_object_add_value_int(root, "Write Uncorrectable Command Support", le16_to_cpu(log_data->wu_cmd_support));
- json_object_add_value_int(root, "Fused Operation Support", le16_to_cpu(log_data->fused_operation_support));
- json_object_add_value_int(root, "Minimum Valid DSSD Power State", le16_to_cpu(log_data->min_valid_dssd_pwr_state));
- for (i = 0; i <= 127; i++)
- json_object_add_value_int(root, "DSSD Power State Descriptors", log_data->dssd_pwr_state_desc[i]);
- json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version));
-
- memset((void *)guid, 0, 64);
- sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"", (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]),
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[0]));
- json_object_add_value_string(root, "Log page GUID", guid);
-
- json_print_object(root, NULL);
- printf("\n");
- json_free_object(root);
-}
-
-static void ocp_print_c4_log_binary(struct ocp_device_capabilities_log_page *log_data)
-{
- return d_raw((unsigned char *)log_data, sizeof(*log_data));
-}
-
static int get_c4_log_page(struct nvme_dev *dev, char *format)
{
struct ocp_device_capabilities_log_page *log_data;
@@ -2497,13 +1834,6 @@ static int get_c4_log_page(struct nvme_dev *dev, char *format)
if (!ret) {
log_data = (struct ocp_device_capabilities_log_page *)data;
- /* check log page version */
- if (log_data->log_page_version != C4_DEV_CAP_REQ_VERSION) {
- fprintf(stderr, "ERROR : OCP : invalid device capabilities log page version\n");
- ret = -1;
- goto out;
- }
-
/*
* check log page guid
* Verify GUID matches
@@ -2513,30 +1843,17 @@ static int get_c4_log_page(struct nvme_dev *dev, char *format)
fprintf(stderr, "ERROR : OCP : Unknown GUID in C4 Log Page data\n");
fprintf(stderr, "ERROR : OCP : Expected GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", dev_cap_req_guid[j]);
+ fprintf(stderr, "%02x", dev_cap_req_guid[j]);
fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", log_data->log_page_guid[j]);
+ fprintf(stderr, "%02x", log_data->log_page_guid[j]);
fprintf(stderr, "\n");
ret = -1;
goto out;
}
}
-
- switch (fmt) {
- case NORMAL:
- ocp_print_c4_log_normal(log_data);
- break;
- case JSON:
- ocp_print_c4_log_json(log_data);
- break;
- case BINARY:
- ocp_print_c4_log_binary(log_data);
- break;
- default:
- break;
- }
+ ocp_c4_log(log_data, fmt);
} else {
fprintf(stderr, "ERROR : OCP : Unable to read C4 data from buffer\n");
}
@@ -3141,457 +2458,9 @@ static int get_dssd_async_event_config(int argc, char **argv, struct command *cm
static int ocp_telemetry_str_log_format(int argc, char **argv, struct command *cmd,
struct plugin *plugin);
-
-static int ocp_print_C9_log_normal(struct telemetry_str_log_format *log_data, __u8 *log_data_buf)
-{
- //calculating the index value for array
- __le64 stat_id_index = (log_data->sitsz * 4) / 16;
- __le64 eve_id_index = (log_data->estsz * 4) / 16;
- __le64 vu_eve_index = (log_data->vu_eve_st_sz * 4) / 16;
- __le64 ascii_table_index = (log_data->asctsz * 4);
- //Calculating the offset for dynamic fields.
- __le64 stat_id_str_table_ofst = log_data->sits * 4;
- __le64 event_str_table_ofst = log_data->ests * 4;
- __le64 vu_event_str_table_ofst = log_data->vu_eve_sts * 4;
- __le64 ascii_table_ofst = log_data->ascts * 4;
- struct statistics_id_str_table_entry stat_id_str_table_arr[stat_id_index];
- struct event_id_str_table_entry event_id_str_table_arr[eve_id_index];
- struct vu_event_id_str_table_entry vu_event_id_str_table_arr[vu_eve_index];
- int j;
-
- printf(" Log Page Version : 0x%x\n", log_data->log_page_version);
-
- printf(" Reserved : ");
- for (j = 0; j < 15; j++)
- printf("%d", log_data->reserved1[j]);
- printf("\n");
-
- printf(" Log page GUID : 0x");
- for (j = C9_GUID_LENGTH - 1; j >= 0; j--)
- printf("%x", log_data->log_page_guid[j]);
- printf("\n");
-
- printf(" Telemetry String Log Size : 0x%lx\n", le64_to_cpu(log_data->sls));
-
- printf(" Reserved : ");
- for (j = 0; j < 24; j++)
- printf("%d", log_data->reserved2[j]);
- printf("\n");
-
- printf(" Statistics Identifier String Table Start : 0x%lx\n", le64_to_cpu(log_data->sits));
- printf(" Statistics Identifier String Table Size : 0x%lx\n", le64_to_cpu(log_data->sitsz));
- printf(" Event String Table Start : 0x%lx\n", le64_to_cpu(log_data->ests));
- printf(" Event String Table Size : 0x%lx\n", le64_to_cpu(log_data->estsz));
- printf(" VU Event String Table Start : 0x%lx\n", le64_to_cpu(log_data->vu_eve_sts));
- printf(" VU Event String Table Size : 0x%lx\n", le64_to_cpu(log_data->vu_eve_st_sz));
- printf(" ASCII Table Start : 0x%lx\n", le64_to_cpu(log_data->ascts));
- printf(" ASCII Table Size : 0x%lx\n", le64_to_cpu(log_data->asctsz));
-
- printf(" FIFO 1 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo1[j], log_data->fifo1[j]);
-
- printf(" FIFO 2 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo2[j], log_data->fifo2[j]);
-
- printf(" FIFO 3 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo3[j], log_data->fifo3[j]);
-
- printf(" FIFO 4 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo4[j], log_data->fifo4[j]);
-
- printf(" FIFO 5 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo5[j], log_data->fifo5[j]);
-
- printf(" FIFO 6 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo6[j], log_data->fifo6[j]);
-
- printf(" FIFO 7 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo7[j], log_data->fifo7[j]);
-
- printf(" FIFO 8 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo8[j], log_data->fifo8[j]);
-
- printf(" FIFO 9 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo9[j], log_data->fifo9[j]);
-
- printf(" FIFO 10 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo10[j], log_data->fifo10[j]);
-
- printf(" FIFO 11 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo11[j], log_data->fifo11[j]);
-
- printf(" FIFO 12 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo12[j], log_data->fifo12[j]);
-
- printf(" FIFO 13 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo13[j], log_data->fifo13[j]);
-
- printf(" FIFO 14 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo14[j], log_data->fifo14[j]);
-
- printf(" FIFO 15 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo15[j], log_data->fifo16[j]);
-
- printf(" FIFO 16 ASCII String\n");
- printf(" index value ascii_val\n");
- for (j = 0; j < 16; j++)
- printf(" %d %d %c \n", j, log_data->fifo16[j], log_data->fifo16[j]);
-
- printf(" Reserved : ");
- for (j = 0; j < 48; j++)
- printf("%d", log_data->reserved3[j]);
- printf("\n");
-
-
- if (log_data->sitsz != 0) {
- memcpy(stat_id_str_table_arr,
- (__u8 *)log_data_buf + stat_id_str_table_ofst,
- (log_data->sitsz * 4));
- printf(" Statistics Identifier String Table\n");
- for (j = 0; j < stat_id_index; j++) {
- printf(" Vendor Specific Statistic Identifier : 0x%x\n",
- le16_to_cpu(stat_id_str_table_arr[j].vs_si));
- printf(" Reserved : 0x%x\n",
- stat_id_str_table_arr[j].reserved1);
- printf(" ASCII ID Length : 0x%x\n",
- stat_id_str_table_arr[j].ascii_id_len);
- printf(" ASCII ID offset : 0x%lx\n",
- le64_to_cpu(stat_id_str_table_arr[j].ascii_id_ofst));
- printf(" Reserved : 0x%x\n",
- stat_id_str_table_arr[j].reserved2);
- }
- }
-
-
- if (log_data->estsz != 0) {
- memcpy(event_id_str_table_arr, (__u8 *)log_data_buf +
- event_str_table_ofst, (log_data->estsz * 4));
- printf(" Event Identifier String Table Entry\n");
- for (j = 0; j < eve_id_index; j++) {
- printf(" Debug Event Class : 0x%x\n",
- event_id_str_table_arr[j].deb_eve_class);
- printf(" Event Identifier : 0x%x\n",
- le16_to_cpu(event_id_str_table_arr[j].ei));
- printf(" ASCII ID Length : 0x%x\n",
- event_id_str_table_arr[j].ascii_id_len);
- printf(" ASCII ID offset : 0x%lx\n",
- le64_to_cpu(event_id_str_table_arr[j].ascii_id_ofst));
- printf(" Reserved : 0x%x\n",
- event_id_str_table_arr[j].reserved2);
-
- }
- }
-
- if (log_data->vu_eve_st_sz != 0) {
- memcpy(vu_event_id_str_table_arr, (__u8 *)log_data_buf +
- vu_event_str_table_ofst, (log_data->vu_eve_st_sz * 4));
- printf(" VU Event Identifier String Table Entry\n");
- for (j = 0; j < vu_eve_index; j++) {
- printf(" Debug Event Class : 0x%x\n",
- vu_event_id_str_table_arr[j].deb_eve_class);
- printf(" VU Event Identifier : 0x%x\n",
- le16_to_cpu(vu_event_id_str_table_arr[j].vu_ei));
- printf(" ASCII ID Length : 0x%x\n",
- vu_event_id_str_table_arr[j].ascii_id_len);
- printf(" ASCII ID offset : 0x%lx\n",
- le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_ofst));
- printf(" Reserved : 0x%x\n",
- vu_event_id_str_table_arr[j].reserved);
-
- }
- }
-
- if (log_data->asctsz != 0) {
- printf(" ASCII Table\n");
- printf(" Byte Data_Byte ASCII_Character\n");
- for (j = 0; j < ascii_table_index; j++)
- printf(" %lld %d %c\n",
- ascii_table_ofst+j, log_data_buf[ascii_table_ofst + j],
- (char)log_data_buf[ascii_table_ofst + j]);
- }
-
- return 0;
-}
-
-static int ocp_print_C9_log_json(struct telemetry_str_log_format *log_data, __u8 *log_data_buf)
-{
- struct json_object *root = json_create_object();
- char res_arr[48];
- char *res = res_arr;
- char guid_buf[C9_GUID_LENGTH];
- char *guid = guid_buf;
- char fifo_arr[16];
- char *fifo = fifo_arr;
- char buf[128];
- //calculating the index value for array
- __le64 stat_id_index = (log_data->sitsz * 4) / 16;
- __le64 eve_id_index = (log_data->estsz * 4) / 16;
- __le64 vu_eve_index = (log_data->vu_eve_st_sz * 4) / 16;
- __le64 ascii_table_index = (log_data->asctsz * 4);
- //Calculating the offset for dynamic fields.
- __le64 stat_id_str_table_ofst = log_data->sits * 4;
- __le64 event_str_table_ofst = log_data->ests * 4;
- __le64 vu_event_str_table_ofst = log_data->vu_eve_sts * 4;
- __le64 ascii_table_ofst = log_data->ascts * 4;
- struct statistics_id_str_table_entry stat_id_str_table_arr[stat_id_index];
- struct event_id_str_table_entry event_id_str_table_arr[eve_id_index];
- struct vu_event_id_str_table_entry vu_event_id_str_table_arr[vu_eve_index];
- __u8 ascii_table_info_arr[ascii_table_index];
- char ascii_buf[ascii_table_index];
- char *ascii = ascii_buf;
- int j;
-
- json_object_add_value_int(root, "Log Page Version", le16_to_cpu(log_data->log_page_version));
-
- memset((__u8 *)res, 0, 15);
- for (j = 0; j < 15; j++)
- res += sprintf(res, "%d", log_data->reserved1[j]);
- json_object_add_value_string(root, "Reserved", res_arr);
-
- memset((void *)guid, 0, C9_GUID_LENGTH);
- for (j = C9_GUID_LENGTH - 1; j >= 0; j--)
- guid += sprintf(guid, "%02x", log_data->log_page_guid[j]);
- json_object_add_value_string(root, "Log page GUID", guid_buf);
-
- json_object_add_value_int(root, "Telemetry String Log Size", le64_to_cpu(log_data->sls));
-
- memset((__u8 *)res, 0, 24);
- for (j = 0; j < 24; j++)
- res += sprintf(res, "%d", log_data->reserved2[j]);
- json_object_add_value_string(root, "Reserved", res_arr);
-
- json_object_add_value_int(root, "Statistics Identifier String Table Start", le64_to_cpu(log_data->sits));
- json_object_add_value_int(root, "Event String Table Start", le64_to_cpu(log_data->ests));
- json_object_add_value_int(root, "Event String Table Size", le64_to_cpu(log_data->estsz));
- json_object_add_value_int(root, "VU Event String Table Start", le64_to_cpu(log_data->vu_eve_sts));
- json_object_add_value_int(root, "VU Event String Table Size", le64_to_cpu(log_data->vu_eve_st_sz));
- json_object_add_value_int(root, "ASCII Table Start", le64_to_cpu(log_data->ascts));
- json_object_add_value_int(root, "ASCII Table Size", le64_to_cpu(log_data->asctsz));
-
- memset((void *)fifo, 0, 16);
- for (j = 0; j < 16; j++)
- fifo += sprintf(fifo, "%c", log_data->fifo1[j]);
- json_object_add_value_string(root, "FIFO 1 ASCII String", 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- 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);
-
- memset((__u8 *)res, 0, 48);
- for (j = 0; j < 48; j++)
- res += sprintf(res, "%d", log_data->reserved3[j]);
- json_object_add_value_string(root, "Reserved", res_arr);
-
- if (log_data->sitsz != 0) {
-
- memcpy(stat_id_str_table_arr,
- (__u8 *)log_data_buf + stat_id_str_table_ofst,
- (log_data->sitsz * 4));
- struct json_object *stat_table = json_create_object();
-
- for (j = 0; j < stat_id_index; j++) {
- struct json_object *entry = json_create_object();
-
- json_object_add_value_uint(entry, "Vendor Specific Statistic Identifier",
- le16_to_cpu(stat_id_str_table_arr[j].vs_si));
- json_object_add_value_uint(entry, "Reserved",
- le64_to_cpu(stat_id_str_table_arr[j].reserved1));
- json_object_add_value_uint(entry, "ASCII ID Length",
- le64_to_cpu(stat_id_str_table_arr[j].ascii_id_len));
- json_object_add_value_uint(entry, "ASCII ID offset",
- le64_to_cpu(stat_id_str_table_arr[j].ascii_id_ofst));
- json_object_add_value_uint(entry, "Reserved2",
- le64_to_cpu(stat_id_str_table_arr[j].reserved2));
- sprintf(buf, "Statistics Identifier String Table %d", j);
- json_object_add_value_object(stat_table, buf, entry);
- }
-
- json_object_add_value_object(root,
- "Statistics Identifier String Table", stat_table);
- }
-
- if (log_data->estsz != 0) {
- struct json_object *eve_table = json_create_object();
-
- memcpy(event_id_str_table_arr,
- (__u8 *)log_data_buf + event_str_table_ofst,
- (log_data->estsz * 4));
- for (j = 0; j < eve_id_index; j++) {
- struct json_object *entry = json_create_object();
-
- json_object_add_value_int(entry, "Debug Event Class",
- le16_to_cpu(event_id_str_table_arr[j].deb_eve_class));
- json_object_add_value_int(entry, "Event Identifier",
- le16_to_cpu(event_id_str_table_arr[j].ei));
- json_object_add_value_int(entry, "ASCII ID Length",
- le64_to_cpu(event_id_str_table_arr[j].ascii_id_len));
- json_object_add_value_int(entry, "ASCII ID offset",
- le64_to_cpu(event_id_str_table_arr[j].ascii_id_ofst));
- json_object_add_value_int(entry, "Reserved",
- le64_to_cpu(event_id_str_table_arr[j].reserved2));
- sprintf(buf, "Event Identifier String Table Entry %d", j);
- json_object_add_value_object(eve_table, buf, entry);
- }
- json_object_add_value_object(root,
- "Event Identifier String Table Entry",
- eve_table);
- }
-
- if (log_data->vu_eve_st_sz != 0) {
- struct json_object *vu_eve_table = json_create_object();
-
- memcpy(vu_event_id_str_table_arr,
- (__u8 *)log_data_buf + vu_event_str_table_ofst,
- (log_data->vu_eve_st_sz * 4));
- for (j = 0; j < vu_eve_index; j++) {
- struct json_object *entry = json_create_object();
-
- json_object_add_value_int(entry, "Debug Event Class",
- le16_to_cpu(vu_event_id_str_table_arr[j].deb_eve_class));
- json_object_add_value_int(entry, "VU Event Identifier",
- le16_to_cpu(vu_event_id_str_table_arr[j].vu_ei));
- json_object_add_value_int(entry, "ASCII ID Length",
- le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_len));
- json_object_add_value_int(entry, "ASCII ID offset",
- le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_ofst));
- json_object_add_value_int(entry, "Reserved",
- le64_to_cpu(vu_event_id_str_table_arr[j].reserved));
- sprintf(buf, "VU Event Identifier String Table Entry %d", j);
- json_object_add_value_object(vu_eve_table, buf, entry);
- }
- json_object_add_value_object(root,
- "VU Event Identifier String Table Entry",
- vu_eve_table);
- }
-
- if (log_data->asctsz != 0) {
- memcpy(ascii_table_info_arr,
- (__u8 *)log_data_buf + ascii_table_ofst,
- (log_data->asctsz * 4));
- memset((void *)ascii, 0, ascii_table_index);
- for (j = 0; j < ascii_table_index; j++)
- ascii += sprintf(ascii, "%c", ascii_table_info_arr[j]);
- json_object_add_value_string(root, "ASCII Table", ascii_buf);
- }
-
- json_print_object(root, NULL);
- printf("\n");
- json_free_object(root);
-
- return 0;
-}
-
-static void ocp_print_c9_log_binary(__u8 *log_data_buf, int total_log_page_size)
-{
- return d_raw((unsigned char *)log_data_buf, total_log_page_size);
-}
-
static int get_c9_log_page(struct nvme_dev *dev, char *format)
{
-
int ret = 0;
-
nvme_print_flags_t fmt;
ret = validate_output_format(format, &fmt);
@@ -3600,25 +2469,13 @@ static int get_c9_log_page(struct nvme_dev *dev, char *format)
return ret;
}
- get_c9_log_page_data(dev, 1, 0);
-
+ ret = get_c9_log_page_data(dev, 1, 0);
if (!ret) {
- switch (fmt) {
- case NORMAL:
- ocp_print_C9_log_normal(log_data, pC9_string_buffer);
- break;
- case JSON:
- ocp_print_C9_log_json(log_data, pC9_string_buffer);
- break;
- case BINARY:
- ocp_print_c9_log_binary(pC9_string_buffer, total_log_page_sz);
- break;
- default:
- fprintf(stderr, "unhandled output format\n");
- break;
- }
- } else
+ ocp_c9_log(log_data, pC9_string_buffer, total_log_page_sz, fmt);
+ } else {
fprintf(stderr, "ERROR : OCP : Unable to read C9 data from buffer\n");
+ }
+
free(header_data);
return ret;
}
@@ -3663,174 +2520,20 @@ static int ocp_telemetry_str_log_format(int argc, char **argv, struct command *c
/// TCG Configuration Log Page (LID : C7h)
/* C7 TCG Configuration Log Page */
-#define C7_GUID_LENGTH 16
#define C7_TCG_CONFIGURATION_LEN 512
#define C7_TCG_CONFIGURATION_OPCODE 0xC7
-#define C7_TCG_CONFIGURATION_LOG_VERSION 0x1
-static __u8 tcg_configuration_guid[C7_GUID_LENGTH] = {
+static __u8 tcg_configuration_guid[GUID_LEN] = {
0x06, 0x40, 0x24, 0xBD,
0x7E, 0xE0, 0xE6, 0x83,
0xC0, 0x47, 0x54, 0xFA,
0x9D, 0x2A, 0xE0, 0x54
};
-/*
- * struct tcg_configuration_log - TCG Configuration Log Page Structure
- * @state: state
- * @rsvd1: Reserved1
- * @locking_sp_act_count: Locking SP Activation Count
- * @type_rev_count: Tper Revert Count
- * @locking_sp_rev_count: Locking SP Revert Count.
- * @no_of_locking_obj: Number of Locking Objects
- * @no_of_single_um_locking_obj: Number of Single User Mode Locking Objects
- * @no_of_range_prov_locking_obj: Number of Range Provisioned Locking Objects
- * @no_of_ns_prov_locking_obj: Number of Namespace Provisioned Locking Objects
- * @no_of_read_lock_locking_obj: Number of Read Locked Locking Objects
- * @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
- * @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
- * @log_page_version: Log Page Version
- */
-struct __packed tcg_configuration_log {
- __u8 state;
- __u8 rsvd1[3];
- __u8 locking_sp_act_count;
- __u8 type_rev_count;
- __u8 locking_sp_rev_count;
- __u8 no_of_locking_obj;
- __u8 no_of_single_um_locking_obj;
- __u8 no_of_range_prov_locking_obj;
- __u8 no_of_ns_prov_locking_obj;
- __u8 no_of_read_lock_locking_obj;
- __u8 no_of_write_lock_locking_obj;
- __u8 no_of_read_unlock_locking_obj;
- __u8 no_of_write_unlock_locking_obj;
- __u8 rsvd2;
- __u32 sid_auth_try_count;
- __u32 sid_auth_try_limit;
- __u32 pro_tcg_rc;
- __u32 pro_rlc;
- __u32 tcg_ec;
- __u8 rsvd3[458];
- __le16 log_page_version;
- __u8 log_page_guid[C7_GUID_LENGTH];
-
-};
-
/* Function declaration for TCG Configuration log page (LID:C7h) */
static int ocp_tcg_configuration_log(int argc, char **argv, struct command *cmd,
struct plugin *plugin);
-static int ocp_print_C7_log_normal(struct nvme_dev *dev,
- struct tcg_configuration_log *log_data)
-{
- int j;
-
- printf("TCG Configuration C7 Log Page Data-\n");
-
- printf(" State : 0x%x\n", log_data->state);
- printf(" Reserved1 : 0x");
- for (j = 0; j < 3; j++)
- printf("%d", log_data->rsvd1[j]);
- printf("\n");
- printf(" Locking SP Activation Count : 0x%x\n", log_data->locking_sp_act_count);
- printf(" Tper Revert Count : 0x%x\n", log_data->type_rev_count);
- printf(" Locking SP Revert Count : 0x%x\n", log_data->locking_sp_rev_count);
- 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", log_data->no_of_single_um_locking_obj);
- 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", log_data->no_of_ns_prov_locking_obj);
- 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", log_data->no_of_write_lock_locking_obj);
- 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", log_data->no_of_write_unlock_locking_obj);
- printf(" Reserved2 : 0x%x\n", log_data->rsvd2);
-
- 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", le32_to_cpu(log_data->sid_auth_try_limit));
- printf(" Programmatic TCG Reset Count : 0x%x\n", le32_to_cpu(log_data->pro_tcg_rc));
- printf(" Programmatic Reset Lock Count : 0x%x\n", le32_to_cpu(log_data->pro_rlc));
- 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]);
- printf("\n");
-
- printf(" Log Page Version : 0x%x\n", le16_to_cpu(log_data->log_page_version));
- printf(" Log page GUID : 0x");
- for (j = C7_GUID_LENGTH - 1; j >= 0; j--)
- printf("%x", log_data->log_page_guid[j]);
- printf("\n");
-
- return 0;
-}
-
-static void ocp_print_C7_log_json(struct tcg_configuration_log *log_data)
-{
- int j;
- struct json_object *root;
- char guid_buf[C7_GUID_LENGTH];
- char *guid = guid_buf;
- char res_arr[458];
- char *res = res_arr;
-
- root = json_create_object();
-
- json_object_add_value_int(root, "State", le16_to_cpu(log_data->state));
- memset((__u8 *)res, 0, 3);
- for (j = 0; j < 3; j++)
- res += sprintf(res, "%d", log_data->rsvd1[j]);
- json_object_add_value_string(root, "Reserved1", res_arr);
- json_object_add_value_int(root, "Locking SP Activation Count", le16_to_cpu(log_data->locking_sp_act_count));
- json_object_add_value_int(root, "Tper Revert Count", le16_to_cpu(log_data->locking_sp_rev_count));
- json_object_add_value_int(root, "Number of Locking Objects", le16_to_cpu(log_data->no_of_locking_obj));
- json_object_add_value_int(root, "Number of Single User Mode Locking Objects", le16_to_cpu(log_data->no_of_single_um_locking_obj));
- json_object_add_value_int(root, "Number of Range Provisioned Locking Objects", le16_to_cpu(log_data->no_of_range_prov_locking_obj));
- json_object_add_value_int(root, "Number of Namespace Provisioned Locking Objects", le16_to_cpu(log_data->no_of_ns_prov_locking_obj));
- json_object_add_value_int(root, "Number of Read Locked Locking Objects", le16_to_cpu(log_data->no_of_read_lock_locking_obj));
- json_object_add_value_int(root, "Number of Write Locked Locking Objects", le16_to_cpu(log_data->no_of_write_lock_locking_obj));
- json_object_add_value_int(root, "Number of Read Unlocked Locking Objects", le16_to_cpu(log_data->no_of_read_unlock_locking_obj));
- json_object_add_value_int(root, "Number of Write Unlocked Locking Objects", le16_to_cpu(log_data->no_of_write_unlock_locking_obj));
- json_object_add_value_int(root, "Reserved2", le16_to_cpu(log_data->rsvd2));
-
- json_object_add_value_int(root, "SID Authentication Try Count", le16_to_cpu(log_data->sid_auth_try_count));
- json_object_add_value_int(root, "SID Authentication Try Limit", le16_to_cpu(log_data->sid_auth_try_limit));
- json_object_add_value_int(root, "Programmatic TCG Reset Count", le16_to_cpu(log_data->pro_tcg_rc));
- json_object_add_value_int(root, "Programmatic Reset Lock Count", le16_to_cpu(log_data->pro_rlc));
- json_object_add_value_int(root, "TCG Error Count", le16_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]);
- 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));
-
- memset((void *)guid, 0, C7_GUID_LENGTH);
- for (j = C7_GUID_LENGTH - 1; j >= 0; j--)
- guid += sprintf(guid, "%02x", log_data->log_page_guid[j]);
- json_object_add_value_string(root, "Log page GUID", guid_buf);
-
- json_print_object(root, NULL);
- printf("\n");
-
- json_free_object(root);
-}
-
-static void ocp_print_c7_log_binary(struct tcg_configuration_log *log_data)
-{
- return d_raw((unsigned char *)log_data, sizeof(*log_data));
-}
-
static int get_c7_log_page(struct nvme_dev *dev, char *format)
{
nvme_print_flags_t fmt;
@@ -3858,13 +2561,6 @@ static int get_c7_log_page(struct nvme_dev *dev, char *format)
if (!ret) {
log_data = (struct tcg_configuration_log *)data;
- /* check log page version */
- if (log_data->log_page_version != C7_TCG_CONFIGURATION_LOG_VERSION) {
- fprintf(stderr, "ERROR : OCP : invalid TCG Configuration Log Page version\n");
- ret = -1;
- goto out;
- }
-
/*
* check log page guid
* Verify GUID matches
@@ -3874,30 +2570,17 @@ static int get_c7_log_page(struct nvme_dev *dev, char *format)
fprintf(stderr, "ERROR : OCP : Unknown GUID in C7 Log Page data\n");
fprintf(stderr, "ERROR : OCP : Expected GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", tcg_configuration_guid[j]);
+ fprintf(stderr, "%02x", tcg_configuration_guid[j]);
fprintf(stderr, "\nERROR : OCP : Actual GUID: 0x");
for (j = 0; j < 16; j++)
- fprintf(stderr, "%x", log_data->log_page_guid[j]);
+ fprintf(stderr, "%02x", log_data->log_page_guid[j]);
fprintf(stderr, "\n");
ret = -1;
goto out;
}
}
-
- switch (fmt) {
- case NORMAL:
- ocp_print_C7_log_normal(dev, log_data);
- break;
- case JSON:
- ocp_print_C7_log_json(log_data);
- break;
- case BINARY:
- ocp_print_c7_log_binary(log_data);
- break;
- default:
- break;
- }
+ ocp_c7_log(dev, log_data, fmt);
} else {
fprintf(stderr, "ERROR : OCP : Unable to read C7 data from buffer\n");
}
@@ -3907,7 +2590,6 @@ out:
return ret;
}
-
static int ocp_tcg_configuration_log(int argc, char **argv, struct command *cmd,
struct plugin *plugin)
{
@@ -4143,3 +2825,72 @@ static int set_error_injection(int argc, char **argv, struct command *cmd, struc
return error_injection_set(dev, &cfg, !argconfig_parse_seen(opts, "no-uuid"));
}
+
+static int enable_ieee1667_silo_get(struct nvme_dev *dev, const __u8 sel, bool uuid)
+{
+ struct ieee1667_get_cq_entry cq_entry;
+ int err;
+ const __u8 fid = 0xc4;
+
+ struct nvme_get_features_args args = {
+ .result = (__u32 *)&cq_entry,
+ .args_size = sizeof(args),
+ .fd = dev_fd(dev),
+ .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+ .sel = sel,
+ .fid = fid,
+ };
+
+ if (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_get_features(dev, &args);
+ if (!err) {
+ if (sel == NVME_GET_FEATURES_SEL_SUPPORTED)
+ nvme_show_select_result(fid, *args.result);
+ else
+ nvme_show_result("IEEE1667 Sifo Enabled (feature: 0x%02x): 0x%0x (%s: %s)",
+ fid, cq_entry.enabled, nvme_select_to_string(sel),
+ cq_entry.enabled ? "enabled" : "disabled");
+ } else {
+ nvme_show_error("Could not get feature: 0x%02x.", fid);
+ }
+
+ return err;
+}
+
+static int get_enable_ieee1667_silo(int argc, char **argv, struct command *cmd,
+ struct plugin *plugin)
+{
+ const char *desc = "return set of enable IEEE1667 silo";
+ int err;
+ struct config {
+ __u8 sel;
+ };
+ struct config cfg = { 0 };
+
+ _cleanup_nvme_dev_ struct nvme_dev *dev = NULL;
+
+ OPT_ARGS(opts) = {
+ OPT_BYTE("sel", 's', &cfg.sel, sel),
+ OPT_FLAG("no-uuid", 'n', NULL, no_uuid),
+ OPT_END()
+ };
+
+ err = parse_and_open(&dev, argc, argv, desc, opts);
+ if (err)
+ return err;
+
+ return enable_ieee1667_silo_get(dev, cfg.sel, !argconfig_parse_seen(opts, "no-uuid"));
+}
+
+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 16d929d..04acbfc 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.0"
+#define OCP_PLUGIN_VERSION "2.9.2"
#include "cmd.h"
PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION),
@@ -38,9 +38,207 @@ PLUGIN(NAME("ocp", "OCP cloud SSD extensions", OCP_PLUGIN_VERSION),
ENTRY("tcg-configuration-log", "Retrieve TCG Configuration Log Page", ocp_tcg_configuration_log)
ENTRY("get-error-injection", "Return set of error injection", get_error_injection)
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("hardware-component-log", "retrieve hardware component log", hwcomp_log)
)
);
#endif
#include "define_cmd.h"
+
+#ifndef OCP_NVME_H
+#define OCP_NVME_H
+struct __packed ssd_latency_monitor_log {
+ __u8 feature_status; /* 0x00 */
+ __u8 rsvd1; /* 0x01 */
+ __le16 active_bucket_timer; /* 0x02 */
+ __le16 active_bucket_timer_threshold; /* 0x04 */
+ __u8 active_threshold_a; /* 0x06 */
+ __u8 active_threshold_b; /* 0x07 */
+ __u8 active_threshold_c; /* 0x08 */
+ __u8 active_threshold_d; /* 0x09 */
+ __le16 active_latency_config; /* 0x0A */
+ __u8 active_latency_min_window; /* 0x0C */
+ __u8 rsvd2[0x13]; /* 0x0D */
+
+ __le32 active_bucket_counter[4][4]; /* 0x20 - 0x5F */
+ __le64 active_latency_timestamp[4][3]; /* 0x60 - 0xBF */
+ __le16 active_measured_latency[4][3]; /* 0xC0 - 0xD7 */
+ __le16 active_latency_stamp_units; /* 0xD8 */
+ __u8 rsvd3[0x16]; /* 0xDA */
+
+ __le32 static_bucket_counter[4][4]; /* 0x0F0 - 0x12F */
+ __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 */
+
+ __le16 debug_log_trigger_enable; /* 0x1C0 */
+ __le16 debug_log_measured_latency; /* 0x1C2 */
+ __le64 debug_log_latency_stamp; /* 0x1C4 */
+ __le16 debug_log_ptr; /* 0x1CC */
+ __le16 debug_log_counter_trigger; /* 0x1CE */
+ __u8 debug_log_stamp_units; /* 0x1D0 */
+ __u8 rsvd5[0x1D]; /* 0x1D1 */
+
+ __le16 log_page_version; /* 0x1EE */
+ __u8 log_page_guid[0x10]; /* 0x1F0 */
+};
+
+#define GUID_LEN 16
+
+#define C3_ACTIVE_BUCKET_TIMER_INCREMENT 5
+#define C3_ACTIVE_THRESHOLD_INCREMENT 5
+#define C3_MINIMUM_WINDOW_INCREMENT 100
+#define C3_BUCKET_NUM 4
+
+#define READ 3
+#define WRITE 2
+#define TRIM 1
+
+#define C5_NUM_UNSUPPORTED_REQ_ENTRIES 253
+
+/*
+ * struct unsupported_requirement_log - unsupported requirement list
+ * @unsupported_count: Number of Unsupported Requirement IDs
+ * @rsvd1: Reserved
+ * @unsupported_req_list: Unsupported Requirements lists up to 253.
+ * @rsvd2: Reserved
+ * @log_page_version: indicates the version of the mapping this log page uses.
+ * Shall be set to 0001h
+ * @log_page_guid: Shall be set to C7BB98B7D0324863BB2C23990E9C722Fh.
+ */
+struct __packed unsupported_requirement_log {
+ __le16 unsupported_count;
+ __u8 rsvd1[14];
+ __u8 unsupported_req_list[C5_NUM_UNSUPPORTED_REQ_ENTRIES][16];
+ __u8 rsvd2[14];
+ __le16 log_page_version;
+ __u8 log_page_guid[GUID_LEN];
+};
+
+#define C1_PREV_PANIC_IDS_LENGTH 4
+
+/**
+ * struct ocp_error_recovery_log_page - Error Recovery Log Page
+ * @panic_reset_wait_time: Panic Reset Wait Time
+ * @panic_reset_action: Panic Reset Action
+ * @device_recover_action_1: Device Recovery Action 1
+ * @panic_id: Panic ID
+ * @device_capabilities: Device Capabilities
+ * @vendor_specific_recovery_opcode: Vendor Specific Recovery Opcode
+ * @reserved: Reserved
+ * @vendor_specific_command_cdw12: Vendor Specific Command CDW12
+ * @vendor_specific_command_cdw13: Vendor Specific Command CDW13
+ * @vendor_specific_command_timeout: Vendor Specific Command Timeout
+ * @device_recover_action_2: Device Recovery Action 2
+ * @device_recover_action_2_timeout: Device Recovery Action 2 Timeout
+ * @panic_count: Panic Count
+ * @prev_panic_id: Previous Panic IDs
+ * @reserved2: Reserved
+ * @log_page_version: Log Page Version
+ * @log_page_guid: Log Page GUID
+ */
+struct __packed ocp_error_recovery_log_page {
+ __le16 panic_reset_wait_time; /* 2 bytes - 0x00 - 0x01 */
+ __u8 panic_reset_action; /* 1 byte - 0x02 */
+ __u8 device_recover_action_1; /* 1 byte - 0x03 */
+ __le64 panic_id; /* 8 bytes - 0x04 - 0x0B */
+ __le32 device_capabilities; /* 4 bytes - 0x0C - 0x0F */
+ __u8 vendor_specific_recovery_opcode; /* 1 byte - 0x10 */
+ __u8 reserved[0x3]; /* 3 bytes - 0x11 - 0x13 */
+ __le32 vendor_specific_command_cdw12; /* 4 bytes - 0x14 - 0x17 */
+ __le32 vendor_specific_command_cdw13; /* 4 bytes - 0x18 - 0x1B */
+ __u8 vendor_specific_command_timeout; /* 1 byte - 0x1C */
+ __u8 device_recover_action_2; /* 1 byte - 0x1D */
+ __u8 device_recover_action_2_timeout; /* 1 byte - 0x1E */
+ __u8 panic_count; /* 1 byte - 0x1F */
+ __le64 prev_panic_id[C1_PREV_PANIC_IDS_LENGTH]; /* 32 bytes - 0x20 - 0x3F */
+ __u8 reserved2[0x1ae]; /* 430 bytes - 0x40 - 0x1ED */
+ __le16 log_page_version; /* 2 bytes - 0x1EE - 0x1EF */
+ __u8 log_page_guid[GUID_LEN]; /* 16 bytes - 0x1F0 - 0x1FF */
+};
+
+/**
+ * struct ocp_device_capabilities_log_page - Device Capability Log page
+ * @pcie_exp_port: PCI Express Ports
+ * @oob_management_support: OOB Management Support
+ * @wz_cmd_support: Write Zeroes Command Support
+ * @sanitize_cmd_support: Sanitize Command Support
+ * @dsm_cmd_support: Dataset Management Command Support
+ * @wu_cmd_support: Write Uncorrectable Command Support
+ * @fused_operation_support: Fused Operation Support
+ * @min_valid_dssd_pwr_state: Minimum Valid DSSD Power State
+ * @dssd_pwr_state_desc: DSSD Power State Descriptors
+ * @vendor_specific_command_timeout: Vendor Specific Command Timeout
+ * @reserved: Reserved
+ * @log_page_version: Log Page Version
+ * @log_page_guid: Log Page GUID
+ */
+struct __packed ocp_device_capabilities_log_page {
+ __le16 pcie_exp_port;
+ __le16 oob_management_support;
+ __le16 wz_cmd_support;
+ __le16 sanitize_cmd_support;
+ __le16 dsm_cmd_support;
+ __le16 wu_cmd_support;
+ __le16 fused_operation_support;
+ __le16 min_valid_dssd_pwr_state;
+ __u8 dssd_pwr_state_desc[128];
+ __u8 reserved[3934];
+ __le16 log_page_version;
+ __u8 log_page_guid[GUID_LEN];
+};
+
+/*
+ * struct tcg_configuration_log - TCG Configuration Log Page Structure
+ * @state: state
+ * @rsvd1: Reserved1
+ * @locking_sp_act_count: Locking SP Activation Count
+ * @type_rev_count: Tper Revert Count
+ * @locking_sp_rev_count: Locking SP Revert Count.
+ * @no_of_locking_obj: Number of Locking Objects
+ * @no_of_single_um_locking_obj: Number of Single User Mode Locking Objects
+ * @no_of_range_prov_locking_obj: Number of Range Provisioned Locking Objects
+ * @no_of_ns_prov_locking_obj: Number of Namespace Provisioned Locking Objects
+ * @no_of_read_lock_locking_obj: Number of Read Locked Locking Objects
+ * @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
+ * @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
+ * @log_page_version: Log Page Version
+ */
+struct __packed tcg_configuration_log {
+ __u8 state;
+ __u8 rsvd1[3];
+ __u8 locking_sp_act_count;
+ __u8 type_rev_count;
+ __u8 locking_sp_rev_count;
+ __u8 no_of_locking_obj;
+ __u8 no_of_single_um_locking_obj;
+ __u8 no_of_range_prov_locking_obj;
+ __u8 no_of_ns_prov_locking_obj;
+ __u8 no_of_read_lock_locking_obj;
+ __u8 no_of_write_lock_locking_obj;
+ __u8 no_of_read_unlock_locking_obj;
+ __u8 no_of_write_unlock_locking_obj;
+ __u8 rsvd2;
+ __le32 sid_auth_try_count;
+ __le32 sid_auth_try_limit;
+ __le32 pro_tcg_rc;
+ __le32 pro_rlc;
+ __le32 tcg_ec;
+ __u8 rsvd3[458];
+ __le16 log_page_version;
+ __u8 log_page_guid[GUID_LEN];
+
+};
+#endif /* OCP_NVME_H */
diff --git a/plugins/ocp/ocp-print-binary.c b/plugins/ocp/ocp-print-binary.c
new file mode 100644
index 0000000..64e1246
--- /dev/null
+++ b/plugins/ocp/ocp-print-binary.c
@@ -0,0 +1,54 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "util/types.h"
+#include "nvme-print.h"
+#include "ocp-print.h"
+#include "ocp-hardware-component-log.h"
+
+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);
+
+ d_raw((unsigned char *)log, offsetof(struct hwcomp_log, desc) + desc_len);
+}
+
+static void binary_c5_log(struct nvme_dev *dev, struct unsupported_requirement_log *log_data)
+{
+ d_raw((unsigned char *)log_data, sizeof(*log_data));
+}
+
+static void binary_c1_log(struct ocp_error_recovery_log_page *log_data)
+{
+ d_raw((unsigned char *)log_data, sizeof(*log_data));
+}
+
+static void binary_c4_log(struct ocp_device_capabilities_log_page *log_data)
+{
+ d_raw((unsigned char *)log_data, sizeof(*log_data));
+}
+
+static void binary_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_data_buf,
+ int total_log_page_size)
+{
+ d_raw((unsigned char *)log_data_buf, total_log_page_size);
+}
+
+static void binary_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_data)
+{
+ d_raw((unsigned char *)log_data, sizeof(*log_data));
+}
+
+static struct ocp_print_ops binary_print_ops = {
+ .hwcomp_log = binary_hwcomp_log,
+ .c5_log = binary_c5_log,
+ .c1_log = binary_c1_log,
+ .c4_log = binary_c4_log,
+ .c9_log = binary_c9_log,
+ .c7_log = binary_c7_log,
+};
+
+struct ocp_print_ops *ocp_get_binary_print_ops(nvme_print_flags_t flags)
+{
+ binary_print_ops.flags = flags;
+ return &binary_print_ops;
+}
diff --git a/plugins/ocp/ocp-print-json.c b/plugins/ocp/ocp-print-json.c
new file mode 100644
index 0000000..a600628
--- /dev/null
+++ b/plugins/ocp/ocp-print-json.c
@@ -0,0 +1,851 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "util/types.h"
+#include "common.h"
+#include "nvme-print.h"
+#include "ocp-print.h"
+#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"
+
+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);
+}
+
+static void print_hwcomp_desc_list_json(struct json_object *r, struct hwcomp_desc_entry *e,
+ bool list, int num)
+{
+ _cleanup_free_ char *k = NULL;
+
+ if (asprintf(&k, "Component %d", num) < 0)
+ return;
+
+ if (list) {
+ obj_add_str(r, k, hwcomp_id_to_string(le32_to_cpu(e->desc->id)));
+ return;
+ }
+
+ print_hwcomp_desc_json(e, obj_create_array_obj(r, k));
+}
+
+static void print_hwcomp_descs_json(struct hwcomp_desc *desc, long double log_size, __u32 id,
+ bool list, struct json_object *r)
+{
+ size_t date_lot_code_offset = sizeof(struct hwcomp_desc);
+ struct hwcomp_desc_entry e = { desc };
+ int num = 1;
+
+ while (log_size > 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);
+ e.add_info = e.add_info_size ? e.date_lot_code ?
+ e.date_lot_code + e.date_lot_size :
+ (__u8 *)e.desc + date_lot_code_offset : NULL;
+ if (!id || id == le32_to_cpu(e.desc->id))
+ print_hwcomp_desc_list_json(r, &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;
+ }
+}
+
+static void json_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list)
+{
+ struct json_object *r = json_create_object();
+
+ long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * 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,
+ obj_create_array_obj(r, "Component Descriptions"));
+
+ json_print(r);
+}
+
+static void json_fw_activation_history(const struct fw_activation_history *fw_history)
+{
+ struct json_object *root = json_create_object();
+
+ json_object_add_value_uint(root, "log identifier", fw_history->log_id);
+ json_object_add_value_uint(root, "valid entries", le32_to_cpu(fw_history->valid_entries));
+
+ struct json_object *entries = json_create_array();
+
+ for (int index = 0; index < le32_to_cpu(fw_history->valid_entries); index++) {
+ const struct fw_activation_history_entry *entry = &fw_history->entries[index];
+ struct json_object *entry_obj = json_create_object();
+
+ json_object_add_value_uint(entry_obj, "version number", entry->ver_num);
+ json_object_add_value_uint(entry_obj, "entry length", entry->entry_length);
+ 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)));
+ json_object_add_value_uint(entry_obj, "power cycle count",
+ le64_to_cpu(entry->power_cycle_count));
+
+ struct json_object *fw = json_object_new_string_len(entry->previous_fw,
+ sizeof(entry->previous_fw));
+
+ json_object_add_value_object(entry_obj, "previous firmware", fw);
+
+ fw = json_object_new_string_len(entry->new_fw, sizeof(entry->new_fw));
+
+ json_object_add_value_object(entry_obj, "new firmware", fw);
+ json_object_add_value_uint(entry_obj, "slot number", entry->slot_number);
+ json_object_add_value_uint(entry_obj, "commit action type", entry->commit_action);
+ json_object_add_value_uint(entry_obj, "result", le16_to_cpu(entry->result));
+
+ json_array_add_value_object(entries, entry_obj);
+ }
+
+ json_object_add_value_array(root, "entries", entries);
+
+ json_object_add_value_uint(root, "log page version",
+ le16_to_cpu(fw_history->log_page_version));
+
+ char guid[2 * sizeof(fw_history->log_page_guid) + 3] = { 0 };
+
+ sprintf(guid, "0x%"PRIx64"%"PRIx64"",
+ le64_to_cpu(fw_history->log_page_guid[1]),
+ le64_to_cpu(fw_history->log_page_guid[0]));
+ json_object_add_value_string(root, "log page guid", guid);
+
+ json_print_object(root, NULL);
+ json_free_object(root);
+
+ printf("\n");
+}
+
+static void json_smart_extended_log(void *data)
+{
+ struct json_object *root;
+ struct json_object *pmuw;
+ struct json_object *pmur;
+ uint16_t smart_log_ver = 0;
+ __u8 *log_data = data;
+ char guid[40];
+
+ 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));
+ json_object_add_value_uint64(pmuw, "lo",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF));
+ 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));
+ json_object_add_value_uint64(pmur, "lo",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF));
+ 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));
+ json_object_add_value_uint(root, "Bad user nand blocks - Normalized",
+ (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
+ json_object_add_value_uint64(root, "Bad system nand blocks - Raw",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
+ json_object_add_value_uint(root, "Bad system nand blocks - Normalized",
+ (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
+ json_object_add_value_uint64(root, "XOR recovery count",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
+ json_object_add_value_uint64(root, "Uncorrectable read error count",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
+ json_object_add_value_uint64(root, "Soft ecc error count",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
+ json_object_add_value_uint(root, "End to end detected errors",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
+ json_object_add_value_uint(root, "End to end corrected errors",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
+ json_object_add_value_uint(root, "System data percent used",
+ (__u8)log_data[SCAO_SDPU]);
+ json_object_add_value_uint64(root, "Refresh counts",
+ (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
+ json_object_add_value_uint(root, "Max User data erase counts",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
+ json_object_add_value_uint(root, "Min User data erase counts",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
+ json_object_add_value_uint(root, "Number of Thermal throttling events",
+ (__u8)log_data[SCAO_NTTE]);
+ json_object_add_value_uint(root, "Current throttling status",
+ (__u8)log_data[SCAO_CTS]);
+ json_object_add_value_uint64(root, "PCIe correctable error count",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
+ json_object_add_value_uint(root, "Incomplete shutdowns",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
+ json_object_add_value_uint(root, "Percent free blocks",
+ (__u8)log_data[SCAO_PFB]);
+ json_object_add_value_uint(root, "Capacitor health",
+ (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
+ json_object_add_value_uint64(root, "Unaligned I/O",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
+ json_object_add_value_uint64(root, "Security Version Number",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
+ json_object_add_value_uint64(root, "NUSE - Namespace utilization",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
+ json_object_add_value_uint128(root, "PLP start count",
+ le128_to_cpu(&log_data[SCAO_PSC]));
+ 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]);
+
+ 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]));
+ 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",
+ (__u8)log_data[SCAO_NCSEV]);
+ json_object_add_value_uint(root, "Lowest Permitted Firmware Revision",
+ le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+ fallthrough;
+ case 2 ... 3:
+ json_object_add_value_uint(root, "Errata Version Field",
+ (__u8)log_data[SCAO_EVF]);
+ json_object_add_value_uint(root, "Point Version Field",
+ le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
+ json_object_add_value_uint(root, "Minor Version Field",
+ le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
+ json_object_add_value_uint(root, "Major Version Field",
+ (__u8)log_data[SCAO_MAVF]);
+ json_object_add_value_uint(root, "NVMe Base Errata Version",
+ (__u8)log_data[SCAO_NBEV]);
+ json_object_add_value_uint(root, "PCIe Link Retraining Count",
+ le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
+ json_object_add_value_uint(root, "Power State Change Count",
+ le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+ }
+ json_print_object(root, NULL);
+ printf("\n");
+ json_free_object(root);
+}
+
+static void json_telemetry_log(struct ocp_telemetry_parse_options *options)
+{
+ print_ocp_telemetry_json(options);
+}
+
+static void json_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data)
+{
+ struct json_object *root;
+ char ts_buf[128];
+ char buf[128];
+ int i, j;
+ char *operation[3] = {"Trim", "Write", "Read"};
+
+ root = json_create_object();
+
+ json_object_add_value_uint(root, "Feature Status",
+ log_data->feature_status);
+ json_object_add_value_uint(root, "Active Bucket Timer",
+ C3_ACTIVE_BUCKET_TIMER_INCREMENT *
+ le16_to_cpu(log_data->active_bucket_timer));
+ json_object_add_value_uint(root, "Active Bucket Timer Threshold",
+ C3_ACTIVE_BUCKET_TIMER_INCREMENT *
+ le16_to_cpu(log_data->active_bucket_timer_threshold));
+ json_object_add_value_uint(root, "Active Threshold A",
+ C3_ACTIVE_THRESHOLD_INCREMENT *
+ le16_to_cpu(log_data->active_threshold_a + 1));
+ json_object_add_value_uint(root, "Active Threshold B",
+ C3_ACTIVE_THRESHOLD_INCREMENT *
+ le16_to_cpu(log_data->active_threshold_b + 1));
+ json_object_add_value_uint(root, "Active Threshold C",
+ C3_ACTIVE_THRESHOLD_INCREMENT *
+ le16_to_cpu(log_data->active_threshold_c + 1));
+ json_object_add_value_uint(root, "Active Threshold D",
+ C3_ACTIVE_THRESHOLD_INCREMENT *
+ le16_to_cpu(log_data->active_threshold_d + 1));
+ json_object_add_value_uint(root, "Active Latency Configuration",
+ le16_to_cpu(log_data->active_latency_config));
+ json_object_add_value_uint(root, "Active Latency Minimum Window",
+ C3_MINIMUM_WINDOW_INCREMENT *
+ le16_to_cpu(log_data->active_latency_min_window));
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ struct json_object *bucket;
+
+ bucket = json_create_object();
+ sprintf(buf, "Active Bucket Counter: Bucket %d", i);
+ for (j = 2; j >= 0; j--) {
+ json_object_add_value_uint(bucket, operation[j],
+ le32_to_cpu(log_data->active_bucket_counter[i][j+1]));
+ }
+ json_object_add_value_object(root, buf, bucket);
+ }
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ struct json_object *bucket;
+
+ bucket = json_create_object();
+ sprintf(buf, "Active Latency Time Stamp: Bucket %d", i);
+ for (j = 2; j >= 0; j--) {
+ if (le64_to_cpu(log_data->active_latency_timestamp[3-i][j]) == -1) {
+ json_object_add_value_string(bucket, operation[j], "NA");
+ } else {
+ convert_ts(le64_to_cpu(log_data->active_latency_timestamp[3-i][j]),
+ ts_buf);
+ json_object_add_value_string(bucket, operation[j], ts_buf);
+ }
+ }
+ json_object_add_value_object(root, buf, bucket);
+ }
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ struct json_object *bucket;
+
+ bucket = json_create_object();
+ sprintf(buf, "Active Measured Latency: Bucket %d", i);
+ for (j = 2; j >= 0; j--) {
+ json_object_add_value_uint(bucket, operation[j],
+ le16_to_cpu(log_data->active_measured_latency[3-i][j]));
+ }
+ json_object_add_value_object(root, buf, bucket);
+ }
+
+ json_object_add_value_uint(root, "Active Latency Stamp Units",
+ le16_to_cpu(log_data->active_latency_stamp_units));
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ struct json_object *bucket;
+
+ bucket = json_create_object();
+ sprintf(buf, "Static Bucket Counter: Bucket %d", i);
+ for (j = 2; j >= 0; j--) {
+ json_object_add_value_uint(bucket, operation[j],
+ le32_to_cpu(log_data->static_bucket_counter[i][j+1]));
+ }
+ json_object_add_value_object(root, buf, bucket);
+ }
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ struct json_object *bucket;
+
+ bucket = json_create_object();
+ sprintf(buf, "Static Latency Time Stamp: Bucket %d", i);
+ for (j = 2; j >= 0; j--) {
+ if (le64_to_cpu(log_data->static_latency_timestamp[3-i][j]) == -1) {
+ json_object_add_value_string(bucket, operation[j], "NA");
+ } else {
+ convert_ts(le64_to_cpu(log_data->static_latency_timestamp[3-i][j]),
+ ts_buf);
+ json_object_add_value_string(bucket, operation[j], ts_buf);
+ }
+ }
+ json_object_add_value_object(root, buf, bucket);
+ }
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ struct json_object *bucket;
+
+ bucket = json_create_object();
+ sprintf(buf, "Static Measured Latency: Bucket %d", i);
+ for (j = 2; j >= 0; j--) {
+ json_object_add_value_uint(bucket, operation[j],
+ le16_to_cpu(log_data->static_measured_latency[3-i][j]));
+ }
+ json_object_add_value_object(root, buf, bucket);
+ }
+
+ json_object_add_value_uint(root, "Static Latency Stamp Units",
+ le16_to_cpu(log_data->static_latency_stamp_units));
+ 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",
+ le16_to_cpu(log_data->debug_log_measured_latency));
+ if (le64_to_cpu(log_data->debug_log_latency_stamp) == -1) {
+ json_object_add_value_string(root, "Debug Log Latency Time Stamp", "NA");
+ } else {
+ convert_ts(le64_to_cpu(log_data->debug_log_latency_stamp), ts_buf);
+ json_object_add_value_string(root, "Debug Log Latency Time Stamp", ts_buf);
+ }
+ json_object_add_value_uint(root, "Debug Log Pointer",
+ le16_to_cpu(log_data->debug_log_ptr));
+ json_object_add_value_uint(root, "Debug Counter Trigger Source",
+ 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));
+
+ char guid[(GUID_LEN * 2) + 1];
+ char *ptr = &guid[0];
+
+ for (i = GUID_LEN - 1; i >= 0; i--)
+ ptr += sprintf(ptr, "%02X", log_data->log_page_guid[i]);
+
+ json_object_add_value_string(root, "Log Page GUID", guid);
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ json_free_object(root);
+}
+
+static void json_c5_log(struct nvme_dev *dev, struct unsupported_requirement_log *log_data)
+{
+ int j;
+ struct json_object *root;
+ char unsup_req_list_str[40];
+ char guid_buf[GUID_LEN];
+ char *guid = guid_buf;
+
+ root = json_create_object();
+
+ json_object_add_value_int(root, "Number Unsupported Req IDs",
+ le16_to_cpu(log_data->unsupported_count));
+
+ memset((void *)unsup_req_list_str, 0, 40);
+ for (j = 0; j < le16_to_cpu(log_data->unsupported_count); j++) {
+ sprintf((char *)unsup_req_list_str, "Unsupported Requirement List %d", j);
+ json_object_add_value_string(root, unsup_req_list_str,
+ (char *)log_data->unsupported_req_list[j]);
+ }
+
+ json_object_add_value_int(root, "Log Page Version",
+ le16_to_cpu(log_data->log_page_version));
+
+ memset((void *)guid, 0, GUID_LEN);
+ for (j = GUID_LEN - 1; j >= 0; j--)
+ guid += sprintf(guid, "%02x", log_data->log_page_guid[j]);
+ json_object_add_value_string(root, "Log page GUID", guid_buf);
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ json_free_object(root);
+}
+
+static void json_c1_log(struct ocp_error_recovery_log_page *log_data)
+{
+ struct json_object *root;
+
+ root = json_create_object();
+ char guid[64];
+
+ json_object_add_value_int(root, "Panic Reset Wait Time",
+ le16_to_cpu(log_data->panic_reset_wait_time));
+ json_object_add_value_int(root, "Panic Reset Action", log_data->panic_reset_action);
+ json_object_add_value_int(root, "Device Recovery Action 1",
+ log_data->device_recover_action_1);
+ json_object_add_value_int(root, "Panic ID", le32_to_cpu(log_data->panic_id));
+ json_object_add_value_int(root, "Device Capabilities",
+ le32_to_cpu(log_data->device_capabilities));
+ json_object_add_value_int(root, "Vendor Specific Recovery Opcode",
+ log_data->vendor_specific_recovery_opcode);
+ json_object_add_value_int(root, "Vendor Specific Command CDW12",
+ le32_to_cpu(log_data->vendor_specific_command_cdw12));
+ json_object_add_value_int(root, "Vendor Specific Command CDW13",
+ le32_to_cpu(log_data->vendor_specific_command_cdw13));
+ json_object_add_value_int(root, "Vendor Specific Command Timeout",
+ log_data->vendor_specific_command_timeout);
+ json_object_add_value_int(root, "Device Recovery Action 2",
+ log_data->device_recover_action_2);
+ json_object_add_value_int(root, "Device Recovery Action 2 Timeout",
+ log_data->device_recover_action_2_timeout);
+ json_object_add_value_int(root, "Log Page Version",
+ le16_to_cpu(log_data->log_page_version));
+
+ memset((void *)guid, 0, 64);
+ sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]),
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[0]));
+ json_object_add_value_string(root, "Log page GUID", guid);
+
+ json_print_object(root, NULL);
+ printf("\n");
+ json_free_object(root);
+}
+
+static void json_c4_log(struct ocp_device_capabilities_log_page *log_data)
+{
+ struct json_object *root = json_create_object();
+ char guid[64];
+ int i;
+
+ json_object_add_value_int(root, "PCI Express Ports", le16_to_cpu(log_data->pcie_exp_port));
+ json_object_add_value_int(root, "OOB Management Support",
+ le16_to_cpu(log_data->oob_management_support));
+ json_object_add_value_int(root, "Write Zeroes Command Support",
+ le16_to_cpu(log_data->wz_cmd_support));
+ json_object_add_value_int(root, "Sanitize Command Support",
+ le16_to_cpu(log_data->sanitize_cmd_support));
+ json_object_add_value_int(root, "Dataset Management Command Support",
+ le16_to_cpu(log_data->dsm_cmd_support));
+ json_object_add_value_int(root, "Write Uncorrectable Command Support",
+ le16_to_cpu(log_data->wu_cmd_support));
+ json_object_add_value_int(root, "Fused Operation Support",
+ le16_to_cpu(log_data->fused_operation_support));
+ json_object_add_value_int(root, "Minimum Valid DSSD Power State",
+ le16_to_cpu(log_data->min_valid_dssd_pwr_state));
+ for (i = 0; i <= 127; i++)
+ json_object_add_value_int(root, "DSSD Power State Descriptors",
+ log_data->dssd_pwr_state_desc[i]);
+ json_object_add_value_int(root, "Log Page Version",
+ le16_to_cpu(log_data->log_page_version));
+
+ memset((void *)guid, 0, 64);
+ sprintf((char *)guid, "0x%"PRIx64"%"PRIx64"",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[8]),
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data->log_page_guid[0]));
+ json_object_add_value_string(root, "Log page GUID", guid);
+
+ json_print_object(root, NULL);
+ printf("\n");
+ json_free_object(root);
+}
+
+static void json_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_data_buf,
+ int total_log_page_size)
+{
+ struct json_object *root = json_create_object();
+ char res_arr[48];
+ char *res = res_arr;
+ char guid_buf[GUID_LEN];
+ char *guid = guid_buf;
+ char fifo_arr[16];
+ char *fifo = fifo_arr;
+ char buf[128];
+ //calculating the index value for array
+ __le64 stat_id_index = (log_data->sitsz * 4) / 16;
+ __le64 eve_id_index = (log_data->estsz * 4) / 16;
+ __le64 vu_eve_index = (log_data->vu_eve_st_sz * 4) / 16;
+ __le64 ascii_table_index = (log_data->asctsz * 4);
+ //Calculating the offset for dynamic fields.
+ __le64 stat_id_str_table_ofst = log_data->sits * 4;
+ __le64 event_str_table_ofst = log_data->ests * 4;
+ __le64 vu_event_str_table_ofst = log_data->vu_eve_sts * 4;
+ __le64 ascii_table_ofst = log_data->ascts * 4;
+ struct statistics_id_str_table_entry stat_id_str_table_arr[stat_id_index];
+ struct event_id_str_table_entry event_id_str_table_arr[eve_id_index];
+ struct vu_event_id_str_table_entry vu_event_id_str_table_arr[vu_eve_index];
+ __u8 ascii_table_info_arr[ascii_table_index];
+ char ascii_buf[ascii_table_index];
+ char *ascii = ascii_buf;
+ int j;
+
+ json_object_add_value_int(root, "Log Page Version",
+ le16_to_cpu(log_data->log_page_version));
+
+ memset((__u8 *)res, 0, 15);
+ for (j = 0; j < 15; j++)
+ res += sprintf(res, "%d", log_data->reserved1[j]);
+ json_object_add_value_string(root, "Reserved", res_arr);
+
+ memset((void *)guid, 0, GUID_LEN);
+ for (j = GUID_LEN - 1; j >= 0; j--)
+ guid += sprintf(guid, "%02x", log_data->log_page_guid[j]);
+ json_object_add_value_string(root, "Log page GUID", guid_buf);
+
+ json_object_add_value_int(root, "Telemetry String Log Size", le64_to_cpu(log_data->sls));
+
+ memset((__u8 *)res, 0, 24);
+ for (j = 0; j < 24; j++)
+ res += sprintf(res, "%d", log_data->reserved2[j]);
+ json_object_add_value_string(root, "Reserved", res_arr);
+
+ json_object_add_value_int(root, "Statistics Identifier String Table Start",
+ le64_to_cpu(log_data->sits));
+ json_object_add_value_int(root, "Event String Table Start", le64_to_cpu(log_data->ests));
+ json_object_add_value_int(root, "Event String Table Size", le64_to_cpu(log_data->estsz));
+ json_object_add_value_int(root, "VU Event String Table Start",
+ le64_to_cpu(log_data->vu_eve_sts));
+ json_object_add_value_int(root, "VU Event String Table Size",
+ le64_to_cpu(log_data->vu_eve_st_sz));
+ json_object_add_value_int(root, "ASCII Table Start",
+ le64_to_cpu(log_data->ascts));
+ json_object_add_value_int(root, "ASCII Table Size",
+ le64_to_cpu(log_data->asctsz));
+
+ memset((void *)fifo, 0, 16);
+ for (j = 0; j < 16; j++)
+ fifo += sprintf(fifo, "%c", log_data->fifo1[j]);
+ json_object_add_value_string(root, "FIFO 1 ASCII String", 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ 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);
+
+ memset((__u8 *)res, 0, 48);
+ for (j = 0; j < 48; j++)
+ res += sprintf(res, "%d", log_data->reserved3[j]);
+ json_object_add_value_string(root, "Reserved", res_arr);
+
+ if (log_data->sitsz != 0) {
+
+ memcpy(stat_id_str_table_arr,
+ (__u8 *)log_data_buf + stat_id_str_table_ofst,
+ (log_data->sitsz * 4));
+ struct json_object *stat_table = json_create_object();
+
+ for (j = 0; j < stat_id_index; j++) {
+ struct json_object *entry = json_create_object();
+
+ json_object_add_value_uint(entry, "Vendor Specific Statistic Identifier",
+ le16_to_cpu(stat_id_str_table_arr[j].vs_si));
+ json_object_add_value_uint(entry, "Reserved",
+ le64_to_cpu(stat_id_str_table_arr[j].reserved1));
+ json_object_add_value_uint(entry, "ASCII ID Length",
+ le64_to_cpu(stat_id_str_table_arr[j].ascii_id_len));
+ json_object_add_value_uint(entry, "ASCII ID offset",
+ le64_to_cpu(stat_id_str_table_arr[j].ascii_id_ofst));
+ json_object_add_value_uint(entry, "Reserved2",
+ le64_to_cpu(stat_id_str_table_arr[j].reserved2));
+ sprintf(buf, "Statistics Identifier String Table %d", j);
+ json_object_add_value_object(stat_table, buf, entry);
+ }
+
+ json_object_add_value_object(root,
+ "Statistics Identifier String Table", stat_table);
+ }
+
+ if (log_data->estsz != 0) {
+ struct json_object *eve_table = json_create_object();
+
+ memcpy(event_id_str_table_arr,
+ (__u8 *)log_data_buf + event_str_table_ofst,
+ (log_data->estsz * 4));
+ for (j = 0; j < eve_id_index; j++) {
+ struct json_object *entry = json_create_object();
+
+ json_object_add_value_int(entry, "Debug Event Class",
+ le16_to_cpu(event_id_str_table_arr[j].deb_eve_class));
+ json_object_add_value_int(entry, "Event Identifier",
+ le16_to_cpu(event_id_str_table_arr[j].ei));
+ json_object_add_value_int(entry, "ASCII ID Length",
+ le64_to_cpu(event_id_str_table_arr[j].ascii_id_len));
+ json_object_add_value_int(entry, "ASCII ID offset",
+ le64_to_cpu(event_id_str_table_arr[j].ascii_id_ofst));
+ json_object_add_value_int(entry, "Reserved",
+ le64_to_cpu(event_id_str_table_arr[j].reserved2));
+ sprintf(buf, "Event Identifier String Table Entry %d", j);
+ json_object_add_value_object(eve_table, buf, entry);
+ }
+ json_object_add_value_object(root,
+ "Event Identifier String Table Entry",
+ eve_table);
+ }
+
+ if (log_data->vu_eve_st_sz != 0) {
+ struct json_object *vu_eve_table = json_create_object();
+
+ memcpy(vu_event_id_str_table_arr,
+ (__u8 *)log_data_buf + vu_event_str_table_ofst,
+ (log_data->vu_eve_st_sz * 4));
+ for (j = 0; j < vu_eve_index; j++) {
+ struct json_object *entry = json_create_object();
+
+ json_object_add_value_int(entry, "Debug Event Class",
+ le16_to_cpu(vu_event_id_str_table_arr[j].deb_eve_class));
+ json_object_add_value_int(entry, "VU Event Identifier",
+ le16_to_cpu(vu_event_id_str_table_arr[j].vu_ei));
+ json_object_add_value_int(entry, "ASCII ID Length",
+ le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_len));
+ json_object_add_value_int(entry, "ASCII ID offset",
+ le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_ofst));
+ json_object_add_value_int(entry, "Reserved",
+ le64_to_cpu(vu_event_id_str_table_arr[j].reserved));
+ sprintf(buf, "VU Event Identifier String Table Entry %d", j);
+ json_object_add_value_object(vu_eve_table, buf, entry);
+ }
+ json_object_add_value_object(root,
+ "VU Event Identifier String Table Entry",
+ vu_eve_table);
+ }
+
+ if (log_data->asctsz != 0) {
+ memcpy(ascii_table_info_arr,
+ (__u8 *)log_data_buf + ascii_table_ofst,
+ (log_data->asctsz * 4));
+ memset((void *)ascii, 0, ascii_table_index);
+ for (j = 0; j < ascii_table_index; j++)
+ ascii += sprintf(ascii, "%c", ascii_table_info_arr[j]);
+ json_object_add_value_string(root, "ASCII Table", ascii_buf);
+ }
+
+ json_print_object(root, NULL);
+ printf("\n");
+ json_free_object(root);
+}
+
+static void json_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_data)
+{
+ int j;
+ struct json_object *root;
+ char guid_buf[GUID_LEN];
+ char *guid = guid_buf;
+ char res_arr[458];
+ char *res = res_arr;
+
+ root = json_create_object();
+
+ json_object_add_value_int(root, "State", log_data->state);
+ memset((__u8 *)res, 0, 3);
+ for (j = 0; j < 3; j++)
+ res += sprintf(res, "%d", log_data->rsvd1[j]);
+ json_object_add_value_string(root, "Reserved1", res_arr);
+ json_object_add_value_int(root, "Locking SP Activation Count",
+ log_data->locking_sp_act_count);
+ json_object_add_value_int(root, "Tper Revert Count",
+ log_data->locking_sp_rev_count);
+ json_object_add_value_int(root, "Number of Locking Objects",
+ log_data->no_of_locking_obj);
+ json_object_add_value_int(root, "Number of Single User Mode Locking Objects",
+ log_data->no_of_single_um_locking_obj);
+ json_object_add_value_int(root, "Number of Range Provisioned Locking Objects",
+ log_data->no_of_range_prov_locking_obj);
+ json_object_add_value_int(root, "Number of Namespace Provisioned Locking Objects",
+ log_data->no_of_ns_prov_locking_obj);
+ json_object_add_value_int(root, "Number of Read Locked Locking Objects",
+ log_data->no_of_read_lock_locking_obj);
+ json_object_add_value_int(root, "Number of Write Locked Locking Objects",
+ log_data->no_of_write_lock_locking_obj);
+ json_object_add_value_int(root, "Number of Read Unlocked Locking Objects",
+ 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, "SID Authentication Try Count",
+ le32_to_cpu(log_data->sid_auth_try_count));
+ json_object_add_value_int(root, "SID Authentication Try Limit",
+ le32_to_cpu(log_data->sid_auth_try_limit));
+ json_object_add_value_int(root, "Programmatic TCG Reset Count",
+ le32_to_cpu(log_data->pro_tcg_rc));
+ json_object_add_value_int(root, "Programmatic Reset Lock Count",
+ le32_to_cpu(log_data->pro_rlc));
+ 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]);
+ 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));
+
+ memset((void *)guid, 0, GUID_LEN);
+ for (j = GUID_LEN - 1; j >= 0; j--)
+ guid += sprintf(guid, "%02x", log_data->log_page_guid[j]);
+ json_object_add_value_string(root, "Log page GUID", guid_buf);
+
+ json_print_object(root, NULL);
+ printf("\n");
+
+ json_free_object(root);
+}
+
+static struct ocp_print_ops json_print_ops = {
+ .hwcomp_log = json_hwcomp_log,
+ .fw_act_history = json_fw_activation_history,
+ .smart_extended_log = json_smart_extended_log,
+ .telemetry_log = json_telemetry_log,
+ .c3_log = json_c3_log,
+ .c5_log = json_c5_log,
+ .c1_log = json_c1_log,
+ .c4_log = json_c4_log,
+ .c9_log = json_c9_log,
+ .c7_log = json_c7_log,
+};
+
+struct ocp_print_ops *ocp_get_json_print_ops(nvme_print_flags_t flags)
+{
+ json_print_ops.flags = flags;
+ return &json_print_ops;
+}
diff --git a/plugins/ocp/ocp-print-stdout.c b/plugins/ocp/ocp-print-stdout.c
new file mode 100644
index 0000000..e48c171
--- /dev/null
+++ b/plugins/ocp/ocp-print-stdout.c
@@ -0,0 +1,710 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "util/types.h"
+#include "common.h"
+#include "nvme-print.h"
+#include "ocp-print.h"
+#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"
+
+static void print_hwcomp_desc(struct hwcomp_desc_entry *e, bool list, int num)
+{
+ printf(" Component %d: %s\n", num, hwcomp_id_to_string(le32_to_cpu(e->desc->id)));
+
+ if (list)
+ return;
+
+ printf(" Date/Lot Size: 0x%"PRIx64"\n", (uint64_t)e->date_lot_size);
+ printf(" Additional Information Size: 0x%"PRIx64"\n", (uint64_t)e->add_info_size);
+ printf(" Identifier: 0x%08x\n", le32_to_cpu(e->desc->id));
+ printf(" Manufacture: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->mfg));
+ printf(" Revision: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->rev));
+ printf(" Manufacture Code: 0x%016"PRIx64"\n", le64_to_cpu(e->desc->mfg_code));
+ print_array(" Date/Lot Code", e->date_lot_code, e->date_lot_size);
+ print_array(" Additional Information", e->add_info, e->add_info_size);
+}
+
+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;
+ struct hwcomp_desc_entry e = { log->desc };
+
+ long double log_size = uint128_t_to_double(le128_to_cpu(log->size)) * sizeof(__le32);
+
+ printf("Log Identifier: 0x%02xh\n", 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);
+ print_array("Reserved48", log->rsvd48, ARRAY_SIZE(log->rsvd48));
+ printf("Component Descriptions\n");
+ while (log_size > 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);
+ e.add_info = e.add_info_size ? e.date_lot_code ? e.date_lot_code + e.date_lot_size :
+ (__u8 *)e.desc + date_lot_code_offset : NULL;
+ if (!id || id == le32_to_cpu(e.desc->id))
+ 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;
+ }
+}
+
+static void stdout_fw_activation_history(const struct fw_activation_history *fw_history)
+{
+ printf("Firmware History Log:\n");
+
+ printf(" %-26s%d\n", "log identifier:", fw_history->log_id);
+ printf(" %-26s%d\n", "valid entries:", le32_to_cpu(fw_history->valid_entries));
+
+ printf(" entries:\n");
+
+ for (int index = 0; index < le32_to_cpu(fw_history->valid_entries); index++) {
+ const struct fw_activation_history_entry *entry = &fw_history->entries[index];
+
+ printf(" entry[%d]:\n", index);
+ printf(" %-22s%d\n", "version number:", entry->ver_num);
+ 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", "power cycle count:",
+ le64_to_cpu(entry->power_cycle_count));
+ printf(" %-22s%.*s\n", "previous firmware:", (int)sizeof(entry->previous_fw),
+ entry->previous_fw);
+ printf(" %-22s%.*s\n", "new firmware:", (int)sizeof(entry->new_fw),
+ entry->new_fw);
+ printf(" %-22s%d\n", "slot number:", entry->slot_number);
+ printf(" %-22s%d\n", "commit action type:", entry->commit_action);
+ printf(" %-22s%d\n", "result:", le16_to_cpu(entry->result));
+ }
+
+ printf(" %-26s%d\n", "log page version:",
+ le16_to_cpu(fw_history->log_page_version));
+
+ printf(" %-26s0x%"PRIx64"%"PRIx64"\n", "log page guid:",
+ le64_to_cpu(fw_history->log_page_guid[1]),
+ le64_to_cpu(fw_history->log_page_guid[0]));
+
+ printf("\n");
+}
+
+static void stdout_smart_extended_log(void *data)
+{
+ uint16_t smart_log_ver = 0;
+ __u8 *log_data = data;
+
+ 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));
+ 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));
+ printf(" Bad user nand blocks - Raw %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF));
+ printf(" Bad user nand blocks - Normalized %d\n",
+ (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
+ printf(" Bad system nand blocks - Raw %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
+ printf(" Bad system nand blocks - Normalized %d\n",
+ (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
+ printf(" XOR recovery count %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
+ printf(" Uncorrectable read error count %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
+ printf(" Soft ecc error count %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
+ printf(" End to end detected errors %"PRIu32"\n",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
+ printf(" End to end corrected errors %"PRIu32"\n",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
+ printf(" System data percent used %d\n",
+ (__u8)log_data[SCAO_SDPU]);
+ printf(" Refresh counts %"PRIu64"\n",
+ (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
+ printf(" Max User data erase counts %"PRIu32"\n",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
+ printf(" Min User data erase counts %"PRIu32"\n",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
+ printf(" Number of Thermal throttling events %d\n",
+ (__u8)log_data[SCAO_NTTE]);
+ printf(" Current throttling status 0x%x\n",
+ (__u8)log_data[SCAO_CTS]);
+ printf(" PCIe correctable error count %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
+ printf(" Incomplete shutdowns %"PRIu32"\n",
+ (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
+ printf(" Percent free blocks %d\n",
+ (__u8)log_data[SCAO_PFB]);
+ 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]));
+ printf(" Unaligned I/O %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
+ printf(" Security Version Number %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
+ printf(" NUSE - Namespace utilization %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
+ printf(" PLP start count %s\n",
+ uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC])));
+ 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]);
+ 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]));
+ switch (smart_log_ver) {
+ case 0 ... 1:
+ break;
+ default:
+ case 4:
+ printf(" NVMe Command Set Errata Version %d\n",
+ (__u8)log_data[SCAO_NCSEV]);
+ printf(" Lowest Permitted Firmware Revision %"PRIu64"\n",
+ le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+ fallthrough;
+ case 2 ... 3:
+ printf(" Errata Version Field %d\n",
+ (__u8)log_data[SCAO_EVF]);
+ printf(" Point Version Field %"PRIu16"\n",
+ le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
+ printf(" Minor Version Field %"PRIu16"\n",
+ le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
+ printf(" Major Version Field %d\n",
+ (__u8)log_data[SCAO_MAVF]);
+ printf(" NVMe Base Errata Version %d\n",
+ (__u8)log_data[SCAO_NBEV]);
+ printf(" PCIe Link Retraining Count %"PRIu64"\n",
+ (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
+ printf(" Power State Change Count %"PRIu64"\n",
+ le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
+ }
+ printf("\n");
+}
+
+static void stdout_telemetry_log(struct ocp_telemetry_parse_options *options)
+{
+#ifdef CONFIG_JSONC
+ print_ocp_telemetry_normal(options);
+#endif /* CONFIG_JSONC */
+}
+
+static void stdout_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data)
+{
+ char ts_buf[128];
+ int i, j;
+
+ printf("-Latency Monitor/C3 Log Page Data-\n");
+ printf(" Controller : %s\n", dev->name);
+ printf(" Feature Status 0x%x\n",
+ log_data->feature_status);
+ printf(" Active Bucket Timer %d min\n",
+ C3_ACTIVE_BUCKET_TIMER_INCREMENT *
+ le16_to_cpu(log_data->active_bucket_timer));
+ printf(" Active Bucket Timer Threshold %d min\n",
+ C3_ACTIVE_BUCKET_TIMER_INCREMENT *
+ le16_to_cpu(log_data->active_bucket_timer_threshold));
+ printf(" Active Threshold A %d ms\n",
+ C3_ACTIVE_THRESHOLD_INCREMENT *
+ le16_to_cpu(log_data->active_threshold_a+1));
+ printf(" Active Threshold B %d ms\n",
+ C3_ACTIVE_THRESHOLD_INCREMENT *
+ le16_to_cpu(log_data->active_threshold_b+1));
+ printf(" Active Threshold C %d ms\n",
+ C3_ACTIVE_THRESHOLD_INCREMENT *
+ le16_to_cpu(log_data->active_threshold_c+1));
+ printf(" Active Threshold D %d ms\n",
+ C3_ACTIVE_THRESHOLD_INCREMENT *
+ le16_to_cpu(log_data->active_threshold_d+1));
+ printf(" Active Latency Configuration 0x%x\n",
+ le16_to_cpu(log_data->active_latency_config));
+ printf(" Active Latency Minimum Window %d ms\n",
+ C3_MINIMUM_WINDOW_INCREMENT *
+ le16_to_cpu(log_data->active_latency_min_window));
+ printf(" Active Latency Stamp Units %d\n",
+ 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));
+ printf(" Debug Log Trigger Enable %d\n",
+ le16_to_cpu(log_data->debug_log_trigger_enable));
+ printf(" Debug Log Measured Latency %d\n",
+ le16_to_cpu(log_data->debug_log_measured_latency));
+ if (le64_to_cpu(log_data->debug_log_latency_stamp) == -1) {
+ printf(" Debug Log Latency Time Stamp N/A\n");
+ } else {
+ convert_ts(le64_to_cpu(log_data->debug_log_latency_stamp), ts_buf);
+ printf(" Debug Log Latency Time Stamp %s\n", ts_buf);
+ }
+ printf(" Debug Log Pointer %d\n",
+ le16_to_cpu(log_data->debug_log_ptr));
+ printf(" Debug Counter Trigger Source %d\n",
+ 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));
+
+ char guid[(GUID_LEN * 2) + 1];
+ char *ptr = &guid[0];
+
+ for (i = GUID_LEN - 1; i >= 0; i--)
+ ptr += sprintf(ptr, "%02X", log_data->log_page_guid[i]);
+
+ printf(" Log Page GUID %s\n", guid);
+ printf("\n");
+
+ printf("%64s%92s%119s\n", "Read", "Write", "Deallocate/Trim");
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ printf(" Active Bucket Counter: Bucket %d %27d %27d %27d\n",
+ i,
+ le32_to_cpu(log_data->active_bucket_counter[i][READ]),
+ le32_to_cpu(log_data->active_bucket_counter[i][WRITE]),
+ le32_to_cpu(log_data->active_bucket_counter[i][TRIM]));
+ }
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ printf(" Active Latency Time Stamp: Bucket %d ", i);
+ for (j = 2; j >= 0; j--) {
+ if (le64_to_cpu(log_data->active_latency_timestamp[3-i][j]) == -1) {
+ printf(" N/A ");
+ } else {
+ convert_ts(le64_to_cpu(log_data->active_latency_timestamp[3-i][j]),
+ ts_buf);
+ printf("%s ", ts_buf);
+ }
+ }
+ printf("\n");
+ }
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ printf(" Active Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n",
+ i,
+ le16_to_cpu(log_data->active_measured_latency[3-i][READ-1]),
+ le16_to_cpu(log_data->active_measured_latency[3-i][WRITE-1]),
+ le16_to_cpu(log_data->active_measured_latency[3-i][TRIM-1]));
+ }
+
+ printf("\n");
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ printf(" Static Bucket Counter: Bucket %d %27d %27d %27d\n",
+ i,
+ le32_to_cpu(log_data->static_bucket_counter[i][READ]),
+ le32_to_cpu(log_data->static_bucket_counter[i][WRITE]),
+ le32_to_cpu(log_data->static_bucket_counter[i][TRIM]));
+ }
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ printf(" Static Latency Time Stamp: Bucket %d ", i);
+ for (j = 2; j >= 0; j--) {
+ if (le64_to_cpu(log_data->static_latency_timestamp[3-i][j]) == -1) {
+ printf(" N/A ");
+ } else {
+ convert_ts(le64_to_cpu(log_data->static_latency_timestamp[3-i][j]),
+ ts_buf);
+ printf("%s ", ts_buf);
+ }
+ }
+ printf("\n");
+ }
+
+ for (i = 0; i < C3_BUCKET_NUM; i++) {
+ printf(" Static Measured Latency: Bucket %d %27d ms %27d ms %27d ms\n",
+ i,
+ le16_to_cpu(log_data->static_measured_latency[3-i][READ-1]),
+ le16_to_cpu(log_data->static_measured_latency[3-i][WRITE-1]),
+ le16_to_cpu(log_data->static_measured_latency[3-i][TRIM-1]));
+ }
+}
+
+static void stdout_c5_log(struct nvme_dev *dev, struct unsupported_requirement_log *log_data)
+{
+ int j;
+
+ printf("Unsupported Requirement-C5 Log Page Data-\n");
+
+ printf(" Number Unsupported Req IDs : 0x%x\n",
+ le16_to_cpu(log_data->unsupported_count));
+
+ for (j = 0; j < le16_to_cpu(log_data->unsupported_count); j++)
+ printf(" Unsupported Requirement List %d : %s\n", j,
+ log_data->unsupported_req_list[j]);
+
+ printf(" Log Page Version : 0x%x\n",
+ le16_to_cpu(log_data->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");
+}
+
+static void stdout_c1_log(struct ocp_error_recovery_log_page *log_data)
+{
+ int i;
+
+ printf(" Error Recovery/C1 Log Page Data\n");
+ printf(" Panic Reset Wait Time : 0x%x\n",
+ le16_to_cpu(log_data->panic_reset_wait_time));
+ printf(" Panic Reset Action : 0x%x\n", log_data->panic_reset_action);
+ printf(" Device Recovery Action 1 : 0x%x\n", log_data->device_recover_action_1);
+ printf(" Panic ID : 0x%x\n", le32_to_cpu(log_data->panic_id));
+ printf(" Device Capabilities : 0x%x\n",
+ le32_to_cpu(log_data->device_capabilities));
+ printf(" Vendor Specific Recovery Opcode : 0x%x\n",
+ log_data->vendor_specific_recovery_opcode);
+ printf(" Vendor Specific Command CDW12 : 0x%x\n",
+ le32_to_cpu(log_data->vendor_specific_command_cdw12));
+ printf(" Vendor Specific Command CDW13 : 0x%x\n",
+ le32_to_cpu(log_data->vendor_specific_command_cdw13));
+ printf(" Vendor Specific Command Timeout : 0x%x\n",
+ log_data->vendor_specific_command_timeout);
+ printf(" Device Recovery Action 2 : 0x%x\n",
+ log_data->device_recover_action_2);
+ printf(" Device Recovery Action 2 Timeout : 0x%x\n",
+ log_data->device_recover_action_2_timeout);
+ printf(" Panic Count : 0x%x\n", log_data->panic_count);
+ printf(" Previous Panic IDs:");
+ for (i = 0; i < C1_PREV_PANIC_IDS_LENGTH; i++)
+ printf("%s Panic ID N-%d : 0x%"PRIx64"\n", i ? " " : "", i + 1,
+ le64_to_cpu(log_data->prev_panic_id[i]));
+ printf(" Log Page Version : 0x%x\n",
+ le16_to_cpu(log_data->log_page_version));
+ printf(" Log page GUID : 0x");
+ for (i = GUID_LEN - 1; i >= 0; i--)
+ printf("%02x", log_data->log_page_guid[i]);
+ printf("\n");
+}
+
+static void stdout_c4_log(struct ocp_device_capabilities_log_page *log_data)
+{
+ int i;
+
+ printf(" Device Capability/C4 Log Page Data\n");
+ printf(" PCI Express Ports : 0x%x\n",
+ le16_to_cpu(log_data->pcie_exp_port));
+ printf(" OOB Management Support : 0x%x\n",
+ le16_to_cpu(log_data->oob_management_support));
+ printf(" Write Zeroes Command Support : 0x%x\n",
+ le16_to_cpu(log_data->wz_cmd_support));
+ printf(" Sanitize Command Support : 0x%x\n",
+ le16_to_cpu(log_data->sanitize_cmd_support));
+ printf(" Dataset Management Command Support : 0x%x\n",
+ le16_to_cpu(log_data->dsm_cmd_support));
+ printf(" Write Uncorrectable Command Support : 0x%x\n",
+ le16_to_cpu(log_data->wu_cmd_support));
+ printf(" Fused Operation Support : 0x%x\n",
+ le16_to_cpu(log_data->fused_operation_support));
+ printf(" Minimum Valid DSSD Power State : 0x%x\n",
+ le16_to_cpu(log_data->min_valid_dssd_pwr_state));
+ printf(" DSSD Power State Descriptors : 0x");
+ for (i = 0; i <= 127; i++)
+ printf("%x", log_data->dssd_pwr_state_desc[i]);
+ printf("\n");
+ printf(" Log Page Version : 0x%x\n",
+ le16_to_cpu(log_data->log_page_version));
+ printf(" Log page GUID : 0x");
+ for (i = GUID_LEN - 1; i >= 0; i--)
+ printf("%02x", log_data->log_page_guid[i]);
+ printf("\n");
+}
+
+static void stdout_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_data_buf,
+ int total_log_page_size)
+{
+ //calculating the index value for array
+ __le64 stat_id_index = (log_data->sitsz * 4) / 16;
+ __le64 eve_id_index = (log_data->estsz * 4) / 16;
+ __le64 vu_eve_index = (log_data->vu_eve_st_sz * 4) / 16;
+ __le64 ascii_table_index = (log_data->asctsz * 4);
+ //Calculating the offset for dynamic fields.
+ __le64 stat_id_str_table_ofst = log_data->sits * 4;
+ __le64 event_str_table_ofst = log_data->ests * 4;
+ __le64 vu_event_str_table_ofst = log_data->vu_eve_sts * 4;
+ __le64 ascii_table_ofst = log_data->ascts * 4;
+ struct statistics_id_str_table_entry stat_id_str_table_arr[stat_id_index];
+ struct event_id_str_table_entry event_id_str_table_arr[eve_id_index];
+ struct vu_event_id_str_table_entry vu_event_id_str_table_arr[vu_eve_index];
+ int j;
+
+ printf(" Log Page Version : 0x%x\n",
+ log_data->log_page_version);
+
+ printf(" Reserved : ");
+ for (j = 0; j < 15; j++)
+ printf("%d", log_data->reserved1[j]);
+ printf("\n");
+
+ printf(" Log page GUID : 0x");
+ for (j = GUID_LEN - 1; j >= 0; j--)
+ printf("%02x", log_data->log_page_guid[j]);
+ printf("\n");
+
+ printf(" Telemetry String Log Size : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->sls));
+
+ printf(" Reserved : ");
+ for (j = 0; j < 24; j++)
+ printf("%d", log_data->reserved2[j]);
+ printf("\n");
+
+ printf(" Statistics Identifier String Table Start : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->sits));
+ printf(" Statistics Identifier String Table Size : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->sitsz));
+ printf(" Event String Table Start : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->ests));
+ printf(" Event String Table Size : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->estsz));
+ printf(" VU Event String Table Start : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->vu_eve_sts));
+ printf(" VU Event String Table Size : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->vu_eve_st_sz));
+ printf(" ASCII Table Start : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->ascts));
+ printf(" ASCII Table Size : 0x%"PRIx64"\n",
+ le64_to_cpu(log_data->asctsz));
+
+ printf(" FIFO 1 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo1[j],
+ log_data->fifo1[j]);
+
+ printf(" FIFO 2 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo2[j],
+ log_data->fifo2[j]);
+
+ printf(" FIFO 3 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo3[j],
+ log_data->fifo3[j]);
+
+ printf(" FIFO 4 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo4[j], log_data->fifo4[j]);
+
+ printf(" FIFO 5 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo5[j], log_data->fifo5[j]);
+
+ printf(" FIFO 6 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo6[j], log_data->fifo6[j]);
+
+ printf(" FIFO 7 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo7[j], log_data->fifo7[j]);
+
+ printf(" FIFO 8 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo8[j], log_data->fifo8[j]);
+
+ printf(" FIFO 9 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo9[j], log_data->fifo9[j]);
+
+ printf(" FIFO 10 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo10[j], log_data->fifo10[j]);
+
+ printf(" FIFO 11 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo11[j], log_data->fifo11[j]);
+
+ printf(" FIFO 12 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo12[j], log_data->fifo12[j]);
+
+ printf(" FIFO 13 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo13[j], log_data->fifo13[j]);
+
+ printf(" FIFO 14 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo14[j], log_data->fifo14[j]);
+
+ printf(" FIFO 15 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo15[j], log_data->fifo16[j]);
+
+ printf(" FIFO 16 ASCII String\n");
+ printf(" index value ascii_val\n");
+ for (j = 0; j < 16; j++)
+ printf(" %d %d %c\n", j, log_data->fifo16[j], log_data->fifo16[j]);
+
+ printf(" Reserved : ");
+ for (j = 0; j < 48; j++)
+ printf("%d", log_data->reserved3[j]);
+ printf("\n");
+
+ if (log_data->sitsz != 0) {
+ memcpy(stat_id_str_table_arr, (__u8 *)log_data_buf + stat_id_str_table_ofst,
+ (log_data->sitsz * 4));
+ printf(" Statistics Identifier String Table\n");
+ for (j = 0; j < stat_id_index; j++) {
+ printf(" Vendor Specific Statistic Identifier : 0x%x\n",
+ le16_to_cpu(stat_id_str_table_arr[j].vs_si));
+ printf(" Reserved : 0x%x\n",
+ stat_id_str_table_arr[j].reserved1);
+ printf(" ASCII ID Length : 0x%x\n",
+ stat_id_str_table_arr[j].ascii_id_len);
+ printf(" ASCII ID offset : 0x%"PRIx64"\n",
+ le64_to_cpu(stat_id_str_table_arr[j].ascii_id_ofst));
+ printf(" Reserved : 0x%x\n",
+ stat_id_str_table_arr[j].reserved2);
+ }
+ }
+
+ if (log_data->estsz != 0) {
+ memcpy(event_id_str_table_arr, (__u8 *)log_data_buf + event_str_table_ofst,
+ (log_data->estsz * 4));
+ printf(" Event Identifier String Table Entry\n");
+ for (j = 0; j < eve_id_index; j++) {
+ printf(" Debug Event Class : 0x%x\n",
+ event_id_str_table_arr[j].deb_eve_class);
+ printf(" Event Identifier : 0x%x\n",
+ le16_to_cpu(event_id_str_table_arr[j].ei));
+ printf(" ASCII ID Length : 0x%x\n",
+ event_id_str_table_arr[j].ascii_id_len);
+ printf(" ASCII ID offset : 0x%"PRIx64"\n",
+ le64_to_cpu(event_id_str_table_arr[j].ascii_id_ofst));
+ printf(" Reserved : 0x%x\n",
+ event_id_str_table_arr[j].reserved2);
+
+ }
+ }
+
+ if (log_data->vu_eve_st_sz != 0) {
+ memcpy(vu_event_id_str_table_arr, (__u8 *)log_data_buf + vu_event_str_table_ofst,
+ (log_data->vu_eve_st_sz * 4));
+ printf(" VU Event Identifier String Table Entry\n");
+ for (j = 0; j < vu_eve_index; j++) {
+ printf(" Debug Event Class : 0x%x\n",
+ vu_event_id_str_table_arr[j].deb_eve_class);
+ printf(" VU Event Identifier : 0x%x\n",
+ le16_to_cpu(vu_event_id_str_table_arr[j].vu_ei));
+ printf(" ASCII ID Length : 0x%x\n",
+ vu_event_id_str_table_arr[j].ascii_id_len);
+ printf(" ASCII ID offset : 0x%"PRIx64"\n",
+ le64_to_cpu(vu_event_id_str_table_arr[j].ascii_id_ofst));
+ printf(" Reserved : 0x%x\n",
+ vu_event_id_str_table_arr[j].reserved);
+ }
+ }
+
+ if (log_data->asctsz != 0) {
+ printf(" ASCII Table\n");
+ printf(" Byte Data_Byte ASCII_Character\n");
+ for (j = 0; j < ascii_table_index; j++)
+ printf(" %"PRIu64" %d %c\n",
+ le64_to_cpu(ascii_table_ofst + j),
+ log_data_buf[ascii_table_ofst + j],
+ (char)log_data_buf[ascii_table_ofst + j]);
+ }
+}
+
+static void stdout_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_data)
+{
+ int j;
+
+ printf("TCG Configuration C7 Log Page Data-\n");
+
+ printf(" State : 0x%x\n",
+ log_data->state);
+ printf(" Reserved1 : 0x");
+ for (j = 0; j < 3; j++)
+ printf("%d", log_data->rsvd1[j]);
+ printf("\n");
+ printf(" Locking SP Activation Count : 0x%x\n",
+ log_data->locking_sp_act_count);
+ printf(" Tper Revert Count : 0x%x\n",
+ log_data->type_rev_count);
+ printf(" Locking SP Revert Count : 0x%x\n",
+ log_data->locking_sp_rev_count);
+ 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",
+ log_data->no_of_single_um_locking_obj);
+ 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",
+ log_data->no_of_ns_prov_locking_obj);
+ 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",
+ log_data->no_of_write_lock_locking_obj);
+ 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",
+ log_data->no_of_write_unlock_locking_obj);
+ printf(" Reserved2 : 0x%x\n",
+ log_data->rsvd2);
+
+ 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",
+ le32_to_cpu(log_data->sid_auth_try_limit));
+ printf(" Programmatic TCG Reset Count : 0x%x\n",
+ le32_to_cpu(log_data->pro_tcg_rc));
+ printf(" Programmatic Reset Lock Count : 0x%x\n",
+ le32_to_cpu(log_data->pro_rlc));
+ 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]);
+ printf("\n");
+
+ printf(" Log Page Version : 0x%x\n",
+ le16_to_cpu(log_data->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");
+}
+
+static struct ocp_print_ops stdout_print_ops = {
+ .hwcomp_log = stdout_hwcomp_log,
+ .fw_act_history = stdout_fw_activation_history,
+ .smart_extended_log = stdout_smart_extended_log,
+ .telemetry_log = stdout_telemetry_log,
+ .c3_log = stdout_c3_log,
+ .c5_log = stdout_c5_log,
+ .c1_log = stdout_c1_log,
+ .c4_log = stdout_c4_log,
+ .c9_log = stdout_c9_log,
+ .c7_log = stdout_c7_log,
+};
+
+struct ocp_print_ops *ocp_get_stdout_print_ops(nvme_print_flags_t flags)
+{
+ stdout_print_ops.flags = flags;
+ return &stdout_print_ops;
+}
diff --git a/plugins/ocp/ocp-print.c b/plugins/ocp/ocp-print.c
new file mode 100644
index 0000000..916c653
--- /dev/null
+++ b/plugins/ocp/ocp-print.c
@@ -0,0 +1,81 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+#include "nvme-print.h"
+#include "ocp-print.h"
+#include "ocp-hardware-component-log.h"
+
+#define ocp_print(name, flags, ...) \
+ do { \
+ struct ocp_print_ops *ops = ocp_print_ops(flags); \
+ if (ops && ops->name) \
+ ops->name(__VA_ARGS__); \
+ else \
+ fprintf(stderr, "unhandled output format\n"); \
+ } while (false)
+
+static struct ocp_print_ops *ocp_print_ops(nvme_print_flags_t flags)
+{
+ struct ocp_print_ops *ops = NULL;
+
+ if (flags & JSON || nvme_is_output_format_json())
+ ops = ocp_get_json_print_ops(flags);
+ else if (flags & BINARY)
+ ops = ocp_get_binary_print_ops(flags);
+ else
+ ops = ocp_get_stdout_print_ops(flags);
+
+ return ops;
+}
+
+void ocp_show_hwcomp_log(struct hwcomp_log *log, __u32 id, bool list, nvme_print_flags_t flags)
+{
+ ocp_print(hwcomp_log, flags, log, id, list);
+}
+
+void ocp_fw_act_history(const struct fw_activation_history *fw_history, nvme_print_flags_t flags)
+{
+ ocp_print(fw_act_history, flags, fw_history);
+}
+
+void ocp_smart_extended_log(void *data, nvme_print_flags_t flags)
+{
+ ocp_print(smart_extended_log, flags, data);
+}
+
+void ocp_show_telemetry_log(struct ocp_telemetry_parse_options *options, nvme_print_flags_t flags)
+{
+ ocp_print(telemetry_log, flags, options);
+}
+
+void ocp_c3_log(struct nvme_dev *dev, struct ssd_latency_monitor_log *log_data,
+ nvme_print_flags_t flags)
+{
+ ocp_print(c3_log, flags, dev, log_data);
+}
+
+void ocp_c5_log(struct nvme_dev *dev, struct unsupported_requirement_log *log_data,
+ nvme_print_flags_t flags)
+{
+ ocp_print(c5_log, flags, dev, log_data);
+}
+
+void ocp_c1_log(struct ocp_error_recovery_log_page *log_data, nvme_print_flags_t flags)
+{
+ ocp_print(c1_log, flags, log_data);
+}
+
+void ocp_c4_log(struct ocp_device_capabilities_log_page *log_data, nvme_print_flags_t flags)
+{
+ ocp_print(c4_log, flags, log_data);
+}
+
+void ocp_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_data_buf,
+ int total_log_page_size, nvme_print_flags_t flags)
+{
+ ocp_print(c9_log, flags, log_data, log_data_buf, total_log_page_size);
+}
+
+void ocp_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_data,
+ nvme_print_flags_t flags)
+{
+ ocp_print(c7_log, flags, dev, log_data);
+}
diff --git a/plugins/ocp/ocp-print.h b/plugins/ocp/ocp-print.h
new file mode 100644
index 0000000..85655b9
--- /dev/null
+++ b/plugins/ocp/ocp-print.h
@@ -0,0 +1,51 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+#ifndef OCP_PRINT_H
+#define OCP_PRINT_H
+
+#include "ocp-hardware-component-log.h"
+#include "ocp-fw-activation-history.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 (*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);
+ void (*c1_log)(struct ocp_error_recovery_log_page *log_data);
+ void (*c4_log)(struct ocp_device_capabilities_log_page *log_data);
+ void (*c9_log)(struct telemetry_str_log_format *log_data, __u8 *log_data_buf,
+ int total_log_page_size);
+ void (*c7_log)(struct nvme_dev *dev, struct tcg_configuration_log *log_data);
+ nvme_print_flags_t flags;
+};
+
+struct ocp_print_ops *ocp_get_stdout_print_ops(nvme_print_flags_t flags);
+struct ocp_print_ops *ocp_get_binary_print_ops(nvme_print_flags_t flags);
+
+#ifdef CONFIG_JSONC
+struct ocp_print_ops *ocp_get_json_print_ops(nvme_print_flags_t flags);
+#else /* !CONFIG_JSONC */
+static inline struct ocp_print_ops *ocp_get_json_print_ops(nvme_print_flags_t flags)
+{
+ return NULL;
+}
+#endif /* !CONFIG_JSONC */
+
+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_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);
+void ocp_c5_log(struct nvme_dev *dev, struct unsupported_requirement_log *log_data,
+ nvme_print_flags_t flags);
+void ocp_c1_log(struct ocp_error_recovery_log_page *log_data, nvme_print_flags_t flags);
+void ocp_c4_log(struct ocp_device_capabilities_log_page *log_data, nvme_print_flags_t flags);
+void ocp_c9_log(struct telemetry_str_log_format *log_data, __u8 *log_data_buf,
+ int total_log_page_size, nvme_print_flags_t flags);
+void ocp_c7_log(struct nvme_dev *dev, struct tcg_configuration_log *log_data,
+ nvme_print_flags_t flags);
+#endif /* OCP_PRINT_H */
diff --git a/plugins/ocp/ocp-smart-extended-log.c b/plugins/ocp/ocp-smart-extended-log.c
index 6a524d3..5f84191 100644
--- a/plugins/ocp/ocp-smart-extended-log.c
+++ b/plugins/ocp/ocp-smart-extended-log.c
@@ -13,243 +13,19 @@
#include "common.h"
#include "nvme-print.h"
+#include "ocp-print.h"
/* C0 SCAO Log Page */
#define C0_SMART_CLOUD_ATTR_LEN 0x200
#define C0_SMART_CLOUD_ATTR_OPCODE 0xC0
-#define C0_GUID_LENGTH 16
-static __u8 scao_guid[C0_GUID_LENGTH] = {
+static __u8 scao_guid[GUID_LEN] = {
0xC5, 0xAF, 0x10, 0x28,
0xEA, 0xBF, 0xF2, 0xA4,
0x9C, 0x4F, 0x6F, 0x7C,
0xC9, 0x14, 0xD5, 0xAF
};
-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_NEV = 130, /* NVMe 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_LPV = 494, /* Log page version */
- SCAO_LPG = 496, /* Log page GUID */
-};
-
-static void ocp_print_C0_log_normal(void *data)
-{
- uint16_t smart_log_ver = 0;
- __u8 *log_data = data;
-
- 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));
- 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));
- printf(" Bad user nand blocks - Raw %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BUNBR] & 0x0000FFFFFFFFFFFF));
- printf(" Bad user nand blocks - Normalized %d\n",
- (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
- printf(" Bad system nand blocks - Raw %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
- printf(" Bad system nand blocks - Normalized %d\n",
- (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
- printf(" XOR recovery count %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
- printf(" Uncorrectable read error count %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
- printf(" Soft ecc error count %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
- printf(" End to end detected errors %"PRIu32"\n",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
- printf(" End to end corrected errors %"PRIu32"\n",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
- printf(" System data percent used %d\n",
- (__u8)log_data[SCAO_SDPU]);
- printf(" Refresh counts %"PRIu64"\n",
- (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
- printf(" Max User data erase counts %"PRIu32"\n",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
- printf(" Min User data erase counts %"PRIu32"\n",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
- printf(" Number of Thermal throttling events %d\n",
- (__u8)log_data[SCAO_NTTE]);
- printf(" Current throttling status 0x%x\n",
- (__u8)log_data[SCAO_CTS]);
- printf(" PCIe correctable error count %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
- printf(" Incomplete shutdowns %"PRIu32"\n",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
- printf(" Percent free blocks %d\n",
- (__u8)log_data[SCAO_PFB]);
- printf(" Capacitor health %"PRIu16"\n",
- (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
- printf(" Unaligned I/O %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
- printf(" Security Version Number %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
- printf(" NUSE - Namespace utilization %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
- printf(" PLP start count %s\n",
- uint128_t_to_string(le128_to_cpu(&log_data[SCAO_PSC])));
- 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]);
- 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]));
- if (smart_log_ver > 2) {
- printf(" Errata Version Field %d\n",
- (__u8)log_data[SCAO_EVF]);
- printf(" Point Version Field %"PRIu16"\n",
- le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
- printf(" Minor Version Field %"PRIu16"\n",
- le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
- printf(" Major Version Field %d\n",
- (__u8)log_data[SCAO_MAVF]);
- printf(" NVMe Errata Version %d\n",
- (__u8)log_data[SCAO_NEV]);
- printf(" PCIe Link Retraining Count %"PRIu64"\n",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
- printf(" Power State Change Count %"PRIu64"\n",
- le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
- }
- printf("\n");
-}
-
-static void ocp_print_C0_log_json(void *data)
-{
- struct json_object *root;
- struct json_object *pmuw;
- struct json_object *pmur;
- uint16_t smart_log_ver = 0;
- __u8 *log_data = data;
- char guid[40];
-
- 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));
- json_object_add_value_uint64(pmuw, "lo",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUW] & 0xFFFFFFFFFFFFFFFF));
- 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));
- json_object_add_value_uint64(pmur, "lo",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PMUR] & 0xFFFFFFFFFFFFFFFF));
- 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));
- json_object_add_value_uint(root, "Bad user nand blocks - Normalized",
- (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BUNBN]));
- json_object_add_value_uint64(root, "Bad system nand blocks - Raw",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_BSNBR] & 0x0000FFFFFFFFFFFF));
- json_object_add_value_uint(root, "Bad system nand blocks - Normalized",
- (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_BSNBN]));
- json_object_add_value_uint64(root, "XOR recovery count",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_XRC]));
- json_object_add_value_uint64(root, "Uncorrectable read error count",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UREC]));
- json_object_add_value_uint64(root, "Soft ecc error count",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SEEC]));
- json_object_add_value_uint(root, "End to end detected errors",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EEDC]));
- json_object_add_value_uint(root, "End to end corrected errors",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_EECE]));
- json_object_add_value_uint(root, "System data percent used",
- (__u8)log_data[SCAO_SDPU]);
- json_object_add_value_uint64(root, "Refresh counts",
- (uint64_t)(le64_to_cpu(*(uint64_t *)&log_data[SCAO_RFSC]) & 0x00FFFFFFFFFFFFFF));
- json_object_add_value_uint(root, "Max User data erase counts",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MXUDEC]));
- json_object_add_value_uint(root, "Min User data erase counts",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_MNUDEC]));
- json_object_add_value_uint(root, "Number of Thermal throttling events",
- (__u8)log_data[SCAO_NTTE]);
- json_object_add_value_uint(root, "Current throttling status",
- (__u8)log_data[SCAO_CTS]);
- json_object_add_value_uint64(root, "PCIe correctable error count",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PCEC]));
- json_object_add_value_uint(root, "Incomplete shutdowns",
- (uint32_t)le32_to_cpu(*(uint32_t *)&log_data[SCAO_ICS]));
- json_object_add_value_uint(root, "Percent free blocks",
- (__u8)log_data[SCAO_PFB]);
- json_object_add_value_uint(root, "Capacitor health",
- (uint16_t)le16_to_cpu(*(uint16_t *)&log_data[SCAO_CPH]));
- json_object_add_value_uint64(root, "Unaligned I/O",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_UIO]));
- json_object_add_value_uint64(root, "Security Version Number",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_SVN]));
- json_object_add_value_uint64(root, "NUSE - Namespace utilization",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_NUSE]));
- json_object_add_value_uint128(root, "PLP start count",
- le128_to_cpu(&log_data[SCAO_PSC]));
- 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]);
-
- 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]));
- json_object_add_value_string(root, "Log page GUID", guid);
-
- if (smart_log_ver > 2) {
- json_object_add_value_uint(root, "Errata Version Field",
- (__u8)log_data[SCAO_EVF]);
- json_object_add_value_uint(root, "Point Version Field",
- le16_to_cpu(*(uint16_t *)&log_data[SCAO_PVF]));
- json_object_add_value_uint(root, "Minor Version Field",
- le16_to_cpu(*(uint16_t *)&log_data[SCAO_MIVF]));
- json_object_add_value_uint(root, "Major Version Field",
- (__u8)log_data[SCAO_MAVF]);
- json_object_add_value_uint(root, "NVMe Errata Version",
- (__u8)log_data[SCAO_NEV]);
- json_object_add_value_uint(root, "PCIe Link Retraining Count",
- (uint64_t)le64_to_cpu(*(uint64_t *)&log_data[SCAO_PLRC]));
- json_object_add_value_uint(root, "Power State Change Count",
- le64_to_cpu(*(uint64_t *)&log_data[SCAO_PSCC]));
- }
- json_print_object(root, NULL);
- printf("\n");
- json_free_object(root);
-}
-
static int get_c0_log_page(int fd, char *format)
{
nvme_print_flags_t fmt;
@@ -300,16 +76,7 @@ static int get_c0_log_page(int fd, char *format)
}
/* print the data */
- switch (fmt) {
- case NORMAL:
- ocp_print_C0_log_normal(data);
- break;
- case JSON:
- ocp_print_C0_log_json(data);
- break;
- default:
- break;
- }
+ ocp_smart_extended_log(data, fmt);
} else {
fprintf(stderr, "ERROR : OCP : Unable to read C0 data from buffer\n");
}
diff --git a/plugins/ocp/ocp-smart-extended-log.h b/plugins/ocp/ocp-smart-extended-log.h
index 42c1f98..3e64b1b 100644
--- a/plugins/ocp/ocp-smart-extended-log.h
+++ b/plugins/ocp/ocp-smart-extended-log.h
@@ -12,6 +12,46 @@
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 */
+};
+
int ocp_smart_add_log(int argc, char **argv, struct command *cmd,
struct plugin *plugin);
diff --git a/plugins/ocp/ocp-telemetry-decode.c b/plugins/ocp/ocp-telemetry-decode.c
index 11963be..1a6ebe3 100644
--- a/plugins/ocp/ocp-telemetry-decode.c
+++ b/plugins/ocp/ocp-telemetry-decode.c
@@ -64,6 +64,7 @@ void print_telemetry_fifo_event(__u8 class_type,
if (class_type) {
class_str = telemetry_event_class_to_string(class_type);
printf("Event Class : %s\n", class_str);
+ printf(" Size : 0x%02x\n", size);
}
switch (class_type) {
@@ -75,9 +76,8 @@ void print_telemetry_fifo_event(__u8 class_type,
(int)((le64_to_cpu(timestamp%3600)/60)),
(int)(le64_to_cpu(timestamp%60)));
- printf(" Event ID : 0x%02x %s\n", id, telemetry_ts_event_to_string(id));
+ printf(" Event ID : 0x%04x %s\n", id, telemetry_ts_event_to_string(id));
printf(" Timestamp : %s\n", time_str);
- printf(" Size : %d\n", size);
if (size > 8) {
printf(" VU Data : 0x");
for (j = 8; j < size; j++)
@@ -87,7 +87,7 @@ void print_telemetry_fifo_event(__u8 class_type,
break;
case TELEMETRY_PCIE_CLASS:
- printf(" Event ID : 0x%02x %s\n",
+ printf(" Event ID : 0x%04x %s\n",
id, telemetry_pcie_event_id_to_string(id));
printf(" State : 0x%02x %s\n",
data[0], telemetry_pcie_state_data_to_string(data[0]));
@@ -104,7 +104,7 @@ void print_telemetry_fifo_event(__u8 class_type,
break;
case TELEMETRY_NVME_CLASS:
- printf(" Event ID : 0x%02x %s\n",
+ printf(" Event ID : 0x%04x %s\n",
id, telemetry_nvme_event_id_to_string(id));
if ((id == ADMIN_QUEUE_NONZERO_STATUS) ||
(id == IO_QUEUE_NONZERO_STATUS)) {
@@ -128,46 +128,46 @@ void print_telemetry_fifo_event(__u8 class_type,
le32_to_cpu(csts_reg_data));
}
if (size > 8)
- print_vu_event_data(size, (__u8 *)&data[8]);
+ print_vu_event_data((size-8), (__u8 *)&data[8]);
break;
case TELEMETRY_RESET_CLASS:
- printf(" Event ID : 0x%02x %s\n",
+ printf(" Event ID : 0x%04x %s\n",
id, telemetry_reset_event_id_to_string(id));
if (size)
print_vu_event_data(size, data);
break;
case TELEMETRY_BOOT_SEQ_CLASS:
- printf(" Event ID : 0x%02x %s\n",
+ printf(" Event ID : 0x%04x %s\n",
id, telemetry_boot_seq_event_id_to_string(id));
if (size)
print_vu_event_data(size, data);
break;
case TELEMETRY_FW_ASSERT_CLASS:
- printf(" Event ID : 0x%02x %s\n",
+ printf(" Event ID : 0x%04x %s\n",
id, telemetry_fw_assert_event_id_to_string(id));
if (size)
print_vu_event_data(size, data);
break;
case TELEMETRY_TEMPERATURE_CLASS:
- printf(" Event ID : 0x%02x %s\n",
+ printf(" Event ID : 0x%04x %s\n",
id, telemetry_temperature_event_id_to_string(id));
if (size)
print_vu_event_data(size, data);
break;
case TELEMETRY_MEDIA_DBG_CLASS:
- printf(" Event ID : 0x%02x %s\n",
+ printf(" Event ID : 0x%04x %s\n",
id, telemetry_media_debug_event_id_to_string(id));
if (size)
print_vu_event_data(size, data);
break;
case TELEMETRY_MEDIA_WEAR_CLASS:
- printf(" Event ID : 0x%02x %s\n",
+ printf(" Event ID : 0x%04x %s\n",
id, telemetry_media_debug_event_id_to_string(id));
__u32 host_tb_written = *(__u32 *)&data[0];
__u32 media_tb_written = *(__u32 *)&data[4];
@@ -181,7 +181,7 @@ void print_telemetry_fifo_event(__u8 class_type,
le16_to_cpu(media_tb_erased));
if (size > 12)
- print_vu_event_data(size, (__u8 *)&data[12]);
+ print_vu_event_data((size-12), (__u8 *)&data[12]);
break;
case TELEMETRY_STAT_SNAPSHOT_CLASS:
@@ -280,7 +280,7 @@ struct request_data ocp_header_in_da1[] = {
{ "Minor Version", 2 },
{ "Reserved1", 4 },
{ "Timestamp", 8 },
- { "Log page GUID", 16 },
+ { "Log page GUID", GUID_LEN },
{ "Number Telemetry Profiles Supported", 1 },
{ "Telemetry Profile Selected", 1 },
{ "Reserved2", 6 },
@@ -419,9 +419,10 @@ struct request_data smart_extended[] = {
{ "Lowest Permitted Firmware Revision", 8 },
{ "Reserved4", 278 },
{ "Log Page Version", 2 },
- { "Log page GUID", 16 }
+ { "Log page GUID", GUID_LEN }
};
+#ifdef CONFIG_JSONC
void json_add_formatted_u32_str(struct json_object *pobject, const char *msg, unsigned int pdata)
{
char data_str[70] = { 0 };
@@ -443,6 +444,7 @@ void json_add_formatted_var_size_str(struct json_object *pobject, const char *ms
json_object_add_value_string(pobject, msg, description_str);
}
+#endif /* CONFIG_JSONC */
int get_telemetry_das_offset_and_size(
struct nvme_ocp_telemetry_common_header *ptelemetry_common_header,
@@ -636,49 +638,67 @@ int parse_ocp_telemetry_string_log(int event_fifo_num, int identifier, int debug
return 0;
}
+#ifdef CONFIG_JSONC
void parse_time_stamp_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor,
struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data,
struct json_object *pevent_fifos_object, FILE *fp)
{
struct nvme_ocp_time_stamp_dbg_evt_class_format *ptime_stamp_event =
(struct nvme_ocp_time_stamp_dbg_evt_class_format *) pevent_specific_data;
-
- int vu_event_id = (int)ptime_stamp_event->vu_event_identifier;
-
- unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD)-
- sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format));
-
- __u8 *pdata = (__u8 *)ptime_stamp_event +
- sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format);
-
+ struct nvme_ocp_common_dbg_evt_class_vu_data *ptime_stamp_event_vu_data = NULL;
+ __u16 vu_event_id = 0;
+ __u8 *pdata = NULL;
char description_str[256] = "";
-
- parse_ocp_telemetry_string_log(0, ptime_stamp_event->vu_event_identifier,
- pevent_descriptor->debug_event_class_type,
- VU_EVENT_STRING, description_str);
+ unsigned int vu_data_size = 0;
+ bool vu_data_present = false;
+
+ if ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) >
+ sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format)) {
+ vu_data_present = true;
+ vu_data_size =
+ ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) -
+ (sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format) +
+ SIZE_OF_VU_EVENT_ID));
+
+ ptime_stamp_event_vu_data =
+ (struct nvme_ocp_common_dbg_evt_class_vu_data *)((__u64)ptime_stamp_event +
+ sizeof(struct nvme_ocp_time_stamp_dbg_evt_class_format));
+ vu_event_id = le16_to_cpu(ptime_stamp_event_vu_data->vu_event_identifier);
+ pdata = (__u8 *)&(ptime_stamp_event_vu_data->data);
+
+ parse_ocp_telemetry_string_log(0, vu_event_id,
+ pevent_descriptor->debug_event_class_type,
+ VU_EVENT_STRING, description_str);
+ }
if (pevent_fifos_object != NULL) {
json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA,
ptime_stamp_event->time_stamp, DATA_SIZE_8);
- json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
- vu_event_id);
- json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
- description_str);
- json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
- data_size);
+ if (vu_data_present) {
+ json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
+ vu_event_id);
+ json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
+ description_str);
+ json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
+ vu_data_size);
+ }
} else {
if (fp) {
print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA,
ptime_stamp_event->time_stamp, DATA_SIZE_8, fp);
- fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (vu_data_present) {
+ fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
} else {
print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA,
ptime_stamp_event->time_stamp, DATA_SIZE_8, fp);
- printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (vu_data_present) {
+ printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
}
}
}
@@ -689,37 +709,60 @@ void parse_pcie_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descrip
{
struct nvme_ocp_pcie_dbg_evt_class_format *ppcie_event =
(struct nvme_ocp_pcie_dbg_evt_class_format *) pevent_specific_data;
- int vu_event_id = (int) ppcie_event->vu_event_identifier;
- unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) -
- sizeof(struct nvme_ocp_pcie_dbg_evt_class_format));
- __u8 *pdata = (__u8 *) ppcie_event + sizeof(struct nvme_ocp_pcie_dbg_evt_class_format);
+ struct nvme_ocp_common_dbg_evt_class_vu_data *ppcie_event_vu_data = NULL;
+ __u16 vu_event_id = 0;
+ __u8 *pdata = NULL;
char description_str[256] = "";
-
- parse_ocp_telemetry_string_log(0, ppcie_event->vu_event_identifier,
- pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, description_str);
+ unsigned int vu_data_size = 0;
+ bool vu_data_present = false;
+
+ if ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) >
+ sizeof(struct nvme_ocp_pcie_dbg_evt_class_format)) {
+ vu_data_present = true;
+ vu_data_size =
+ ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) -
+ (sizeof(struct nvme_ocp_pcie_dbg_evt_class_format) +
+ SIZE_OF_VU_EVENT_ID));
+
+ ppcie_event_vu_data =
+ (struct nvme_ocp_common_dbg_evt_class_vu_data *)((__u64)ppcie_event +
+ sizeof(struct nvme_ocp_pcie_dbg_evt_class_format));
+ vu_event_id = le16_to_cpu(ppcie_event_vu_data->vu_event_identifier);
+ pdata = (__u8 *)&(ppcie_event_vu_data->data);
+
+ parse_ocp_telemetry_string_log(0, vu_event_id,
+ pevent_descriptor->debug_event_class_type,
+ VU_EVENT_STRING, description_str);
+ }
if (pevent_fifos_object != NULL) {
json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA,
ppcie_event->pCIeDebugEventData, DATA_SIZE_4);
- json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
- vu_event_id);
- json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
- description_str);
- json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
- data_size);
+ if (vu_data_present) {
+ json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
+ vu_event_id);
+ json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
+ description_str);
+ json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
+ vu_data_size);
+ }
} else {
if (fp) {
print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA,
ppcie_event->pCIeDebugEventData, DATA_SIZE_4, fp);
- fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (vu_data_present) {
+ fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
} else {
print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA,
ppcie_event->pCIeDebugEventData, DATA_SIZE_4, fp);
- printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (vu_data_present) {
+ printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
}
}
}
@@ -730,38 +773,61 @@ void parse_nvme_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descrip
{
struct nvme_ocp_nvme_dbg_evt_class_format *pnvme_event =
(struct nvme_ocp_nvme_dbg_evt_class_format *) pevent_specific_data;
- int vu_event_id = (int) pnvme_event->vu_event_identifier;
- unsigned int data_size = ((pevent_descriptor->event_data_size *
- SIZE_OF_DWORD) - sizeof(struct nvme_ocp_nvme_dbg_evt_class_format));
- __u8 *pdata = (__u8 *) pnvme_event + sizeof(struct nvme_ocp_nvme_dbg_evt_class_format);
+ struct nvme_ocp_common_dbg_evt_class_vu_data *pnvme_event_vu_data = NULL;
+ __u16 vu_event_id = 0;
+ __u8 *pdata = NULL;
char description_str[256] = "";
-
- parse_ocp_telemetry_string_log(0, pnvme_event->vu_event_identifier,
- pevent_descriptor->debug_event_class_type, VU_EVENT_STRING,
- description_str);
+ unsigned int vu_data_size = 0;
+ bool vu_data_present = false;
+
+ if ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) >
+ sizeof(struct nvme_ocp_nvme_dbg_evt_class_format)) {
+ vu_data_present = true;
+ vu_data_size =
+ ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) -
+ (sizeof(struct nvme_ocp_nvme_dbg_evt_class_format) +
+ SIZE_OF_VU_EVENT_ID));
+ pnvme_event_vu_data =
+ (struct nvme_ocp_common_dbg_evt_class_vu_data *)((__u64)pnvme_event +
+ sizeof(struct nvme_ocp_nvme_dbg_evt_class_format));
+
+ vu_event_id = le16_to_cpu(pnvme_event_vu_data->vu_event_identifier);
+ pdata = (__u8 *)&(pnvme_event_vu_data->data);
+
+ parse_ocp_telemetry_string_log(0, vu_event_id,
+ pevent_descriptor->debug_event_class_type,
+ VU_EVENT_STRING,
+ description_str);
+ }
if (pevent_fifos_object != NULL) {
json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA,
- pnvme_event->nvmeDebugEventData, DATA_SIZE_8);
- json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
- vu_event_id);
- json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
- description_str);
- json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
- data_size);
+ pnvme_event->nvmeDebugEventData, DATA_SIZE_8);
+ if (vu_data_present) {
+ json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
+ vu_event_id);
+ json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
+ description_str);
+ json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
+ vu_data_size);
+ }
} else {
if (fp) {
print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA,
pnvme_event->nvmeDebugEventData, DATA_SIZE_8, fp);
- fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (vu_data_present) {
+ fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
} else {
print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA,
pnvme_event->nvmeDebugEventData, DATA_SIZE_8, fp);
- printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (vu_data_present) {
+ printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
}
}
}
@@ -770,34 +836,38 @@ void parse_common_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descr
struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data,
struct json_object *pevent_fifos_object, FILE *fp)
{
- struct nvme_ocp_common_dbg_evt_class_format *pcommon_debug_event =
- (struct nvme_ocp_common_dbg_evt_class_format *) pevent_specific_data;
- int vu_event_id = (int) pcommon_debug_event->vu_event_identifier;
- unsigned int data_size = ((pevent_descriptor->event_data_size *
- SIZE_OF_DWORD) - sizeof(struct nvme_ocp_common_dbg_evt_class_format));
- __u8 *pdata = (__u8 *) pcommon_debug_event +
- sizeof(struct nvme_ocp_common_dbg_evt_class_format);
- char description_str[256] = "";
-
- parse_ocp_telemetry_string_log(0, pcommon_debug_event->vu_event_identifier,
- pevent_descriptor->debug_event_class_type, VU_EVENT_STRING, description_str);
-
- if (pevent_fifos_object != NULL) {
- json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
- vu_event_id);
- json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
- description_str);
- json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
- data_size);
- } else {
- if (fp) {
- fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (pevent_specific_data) {
+ struct nvme_ocp_common_dbg_evt_class_vu_data *pcommon_debug_event_vu_data =
+ (struct nvme_ocp_common_dbg_evt_class_vu_data *) pevent_specific_data;
+
+ __u16 vu_event_id = le16_to_cpu(pcommon_debug_event_vu_data->vu_event_identifier);
+ char description_str[256] = "";
+ __u8 *pdata = (__u8 *)&(pcommon_debug_event_vu_data->data);
+
+ unsigned int vu_data_size = ((pevent_descriptor->event_data_size *
+ SIZE_OF_DWORD) - SIZE_OF_VU_EVENT_ID);
+
+ parse_ocp_telemetry_string_log(0, vu_event_id,
+ pevent_descriptor->debug_event_class_type,
+ VU_EVENT_STRING, description_str);
+
+ if (pevent_fifos_object != NULL) {
+ json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
+ vu_event_id);
+ json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
+ description_str);
+ json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
+ vu_data_size);
} else {
- printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (fp) {
+ fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ } else {
+ printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
}
}
}
@@ -808,39 +878,62 @@ void parse_media_wear_event(struct nvme_ocp_telemetry_event_descriptor *pevent_d
{
struct nvme_ocp_media_wear_dbg_evt_class_format *pmedia_wear_event =
(struct nvme_ocp_media_wear_dbg_evt_class_format *) pevent_specific_data;
- int vu_event_id = (int) pmedia_wear_event->vu_event_identifier;
- unsigned int data_size = ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) -
- sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format));
- __u8 *pdata = (__u8 *) pmedia_wear_event +
- sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format);
- char description_str[256] = "";
+ struct nvme_ocp_common_dbg_evt_class_vu_data *pmedia_wear_event_vu_data = NULL;
- parse_ocp_telemetry_string_log(0, pmedia_wear_event->vu_event_identifier,
- pevent_descriptor->debug_event_class_type, VU_EVENT_STRING,
- description_str);
+ __u16 vu_event_id = 0;
+ __u8 *pdata = NULL;
+ char description_str[256] = "";
+ unsigned int vu_data_size = 0;
+ bool vu_data_present = false;
+
+ if ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) >
+ sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format)) {
+ vu_data_present = true;
+ vu_data_size =
+ ((pevent_descriptor->event_data_size * SIZE_OF_DWORD) -
+ (sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format) +
+ SIZE_OF_VU_EVENT_ID));
+
+ pmedia_wear_event_vu_data =
+ (struct nvme_ocp_common_dbg_evt_class_vu_data *)((__u64)pmedia_wear_event +
+ sizeof(struct nvme_ocp_media_wear_dbg_evt_class_format));
+ vu_event_id = le16_to_cpu(pmedia_wear_event_vu_data->vu_event_identifier);
+ pdata = (__u8 *)&(pmedia_wear_event_vu_data->data);
+
+ parse_ocp_telemetry_string_log(0, vu_event_id,
+ pevent_descriptor->debug_event_class_type,
+ VU_EVENT_STRING,
+ description_str);
+ }
if (pevent_fifos_object != NULL) {
json_add_formatted_var_size_str(pevent_descriptor_obj, STR_CLASS_SPECIFIC_DATA,
pmedia_wear_event->currentMediaWear, DATA_SIZE_12);
- json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
- vu_event_id);
- json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
- description_str);
- json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
- data_size);
+ if (vu_data_present) {
+ json_add_formatted_u32_str(pevent_descriptor_obj, STR_VU_EVENT_ID_STRING,
+ vu_event_id);
+ json_object_add_value_string(pevent_descriptor_obj, STR_VU_EVENT_STRING,
+ description_str);
+ json_add_formatted_var_size_str(pevent_descriptor_obj, STR_VU_DATA, pdata,
+ vu_data_size);
+ }
} else {
if (fp) {
print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA,
pmedia_wear_event->currentMediaWear, DATA_SIZE_12, fp);
- fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (vu_data_present) {
+ fprintf(fp, "%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ fprintf(fp, "%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
} else {
print_formatted_var_size_str(STR_CLASS_SPECIFIC_DATA,
pmedia_wear_event->currentMediaWear, DATA_SIZE_12, NULL);
- printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
- printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
- print_formatted_var_size_str(STR_VU_DATA, pdata, data_size, fp);
+ if (vu_data_present) {
+ printf("%s: 0x%x\n", STR_VU_EVENT_ID_STRING, vu_event_id);
+ printf("%s: %s\n", STR_VU_EVENT_STRING, description_str);
+ print_formatted_var_size_str(STR_VU_DATA, pdata, vu_data_size, fp);
+ }
}
}
}
@@ -895,16 +988,27 @@ int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start,
(struct nvme_ocp_telemetry_event_descriptor *)
(pfifo_start + offset_to_move);
+ /* check if at the end of the list */
+ if (pevent_descriptor->debug_event_class_type == RESERVED_CLASS_TYPE)
+ break;
+
if (pevent_descriptor != NULL && pevent_descriptor->event_data_size >= 0) {
- //Data is present in the form of DWORDS, So multiplying with sizeof(DWORD)
+ /* Data is present in the form of DWORDS,
+ * So multiplying with sizeof(DWORD)
+ */
unsigned int data_size = pevent_descriptor->event_data_size *
SIZE_OF_DWORD;
- __u8 *pevent_specific_data = (__u8 *)pevent_descriptor + event_des_size;
-
+ __u8 *pevent_specific_data = NULL;
+ __u16 event_id = 0;
char description_str[256] = "";
- parse_ocp_telemetry_string_log(0, pevent_descriptor->event_id,
+ if (pevent_descriptor != NULL && pevent_descriptor->event_data_size > 0)
+ pevent_specific_data = (__u8 *)pevent_descriptor + event_des_size;
+
+ event_id = le16_to_cpu(pevent_descriptor->event_id);
+
+ parse_ocp_telemetry_string_log(0, event_id,
pevent_descriptor->debug_event_class_type, EVENT_STRING,
description_str);
@@ -916,7 +1020,7 @@ int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start,
STR_DBG_EVENT_CLASS_TYPE,
pevent_descriptor->debug_event_class_type);
json_add_formatted_u32_str(pevent_descriptor_obj,
- STR_EVENT_IDENTIFIER, pevent_descriptor->event_id);
+ STR_EVENT_IDENTIFIER, event_id);
json_object_add_value_string(pevent_descriptor_obj,
STR_EVENT_STRING, description_str);
json_add_formatted_u32_str(pevent_descriptor_obj,
@@ -930,18 +1034,18 @@ int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start,
fprintf(fp, "%s: 0x%x\n", STR_DBG_EVENT_CLASS_TYPE,
pevent_descriptor->debug_event_class_type);
fprintf(fp, "%s: 0x%x\n", STR_EVENT_IDENTIFIER,
- pevent_descriptor->event_id);
+ event_id);
fprintf(fp, "%s: %s\n", STR_EVENT_STRING, description_str);
fprintf(fp, "%s: 0x%x\n", STR_EVENT_DATA_SIZE,
pevent_descriptor->event_data_size);
} else {
printf("%s: 0x%x\n", STR_DBG_EVENT_CLASS_TYPE,
- pevent_descriptor->debug_event_class_type);
+ pevent_descriptor->debug_event_class_type);
printf("%s: 0x%x\n", STR_EVENT_IDENTIFIER,
- pevent_descriptor->event_id);
+ event_id);
printf("%s: %s\n", STR_EVENT_STRING, description_str);
printf("%s: 0x%x\n", STR_EVENT_DATA_SIZE,
- pevent_descriptor->event_data_size);
+ pevent_descriptor->event_data_size);
}
if (pevent_descriptor->debug_event_class_type >= 0x80)
@@ -951,28 +1055,43 @@ int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start,
switch (pevent_descriptor->debug_event_class_type) {
case TIME_STAMP_CLASS_TYPE:
- parse_time_stamp_event(pevent_descriptor, pevent_descriptor_obj,
- pevent_specific_data, pevent_fifos_object, fp);
+ parse_time_stamp_event(pevent_descriptor,
+ pevent_descriptor_obj,
+ pevent_specific_data,
+ pevent_fifos_object,
+ fp);
break;
case PCIE_CLASS_TYPE:
- parse_pcie_event(pevent_descriptor, pevent_descriptor_obj,
- pevent_specific_data, pevent_fifos_object, fp);
+ parse_pcie_event(pevent_descriptor,
+ pevent_descriptor_obj,
+ pevent_specific_data,
+ pevent_fifos_object,
+ fp);
break;
case NVME_CLASS_TYPE:
- parse_nvme_event(pevent_descriptor, pevent_descriptor_obj,
- pevent_specific_data, pevent_fifos_object, fp);
+ parse_nvme_event(pevent_descriptor,
+ pevent_descriptor_obj,
+ pevent_specific_data,
+ pevent_fifos_object,
+ fp);
break;
case RESET_CLASS_TYPE:
case BOOT_SEQUENCE_CLASS_TYPE:
case FIRMWARE_ASSERT_CLASS_TYPE:
case TEMPERATURE_CLASS_TYPE:
case MEDIA_CLASS_TYPE:
- parse_common_event(pevent_descriptor, pevent_descriptor_obj,
- pevent_specific_data, pevent_fifos_object, fp);
+ parse_common_event(pevent_descriptor,
+ pevent_descriptor_obj,
+ pevent_specific_data,
+ pevent_fifos_object,
+ fp);
break;
case MEDIA_WEAR_CLASS_TYPE:
- parse_media_wear_event(pevent_descriptor, pevent_descriptor_obj,
- pevent_specific_data, pevent_fifos_object, fp);
+ parse_media_wear_event(pevent_descriptor,
+ pevent_descriptor_obj,
+ pevent_specific_data,
+ pevent_fifos_object,
+ fp);
break;
case STATISTIC_SNAPSHOT_CLASS_TYPE: {
struct nvme_ocp_statistic_snapshot_evt_class_format
@@ -989,20 +1108,22 @@ int parse_event_fifo(unsigned int fifo_num, unsigned char *pfifo_start,
case RESERVED_CLASS_TYPE:
default:
break;
- }
+ }
- if (pevent_descriptor_obj != NULL && pevent_fifo_array != NULL)
- json_array_add_value_object(pevent_fifo_array, pevent_descriptor_obj);
- else {
- if (fp)
- fprintf(fp, STR_LINE2);
- else
- printf(STR_LINE2);
- }
- } else
- break;
+ if (pevent_descriptor_obj != NULL && pevent_fifo_array != NULL)
+ json_array_add_value_object(pevent_fifo_array,
+ pevent_descriptor_obj);
+ else {
+ if (fp)
+ fprintf(fp, STR_LINE2);
+ else
+ printf(STR_LINE2);
+ }
+ } else
+ break;
- offset_to_move += (pevent_descriptor->event_data_size * SIZE_OF_DWORD + event_des_size);
+ offset_to_move += (pevent_descriptor->event_data_size * SIZE_OF_DWORD +
+ event_des_size);
}
if (pevent_fifos_object != NULL && pevent_fifo_array != NULL)
@@ -1241,9 +1362,16 @@ int print_ocp_telemetry_normal(struct ocp_telemetry_parse_options *options)
fprintf(fp, STR_LINE);
fprintf(fp, "%s\n", STR_LOG_PAGE_HEADER);
fprintf(fp, STR_LINE);
- if (!strcmp(options->telemetry_type, "host"))
- generic_structure_parser(ptelemetry_buffer, host_log_page_header,
- ARRAY_SIZE(host_log_page_header), NULL, 0, fp);
+ if (!strcmp(options->telemetry_type, "host")) {
+ if ((ptelemetry_buffer == NULL) ||
+ (ARRAY_SIZE(host_log_page_header) == 0))
+ printf("skip generic_structure_parser\n");
+ else
+ generic_structure_parser(ptelemetry_buffer,
+ host_log_page_header,
+ ARRAY_SIZE(host_log_page_header),
+ NULL, 0, fp);
+ }
else if (!strcmp(options->telemetry_type, "controller"))
generic_structure_parser(ptelemetry_buffer,
controller_log_page_header,
@@ -1350,9 +1478,15 @@ int print_ocp_telemetry_normal(struct ocp_telemetry_parse_options *options)
printf(STR_LINE);
printf("%s\n", STR_LOG_PAGE_HEADER);
printf(STR_LINE);
- if (!strcmp(options->telemetry_type, "host"))
- generic_structure_parser(ptelemetry_buffer, host_log_page_header,
- ARRAY_SIZE(host_log_page_header), NULL, 0, NULL);
+ if (!strcmp(options->telemetry_type, "host")) {
+ if ((ptelemetry_buffer == NULL) ||
+ (ARRAY_SIZE(host_log_page_header) == 0))
+ printf("skip generic_structure_parser\n");
+ else {
+ generic_structure_parser(ptelemetry_buffer, host_log_page_header,
+ ARRAY_SIZE(host_log_page_header), NULL, 0, NULL);
+ }
+ }
else if (!strcmp(options->telemetry_type, "controller"))
generic_structure_parser(ptelemetry_buffer, controller_log_page_header,
ARRAY_SIZE(controller_log_page_header), NULL, 0, NULL);
@@ -1363,7 +1497,7 @@ int print_ocp_telemetry_normal(struct ocp_telemetry_parse_options *options)
__u8 *preason_identifier_offset = ptelemetry_buffer +
offsetof(struct nvme_ocp_telemetry_host_initiated_header, reason_id);
generic_structure_parser(preason_identifier_offset, reason_identifier,
- ARRAY_SIZE(reason_identifier), NULL, 0, NULL);
+ ARRAY_SIZE(reason_identifier), NULL, 0, NULL);
printf(STR_LINE);
printf("%s\n", STR_TELEMETRY_HOST_DATA_BLOCK_1);
@@ -1382,7 +1516,7 @@ int print_ocp_telemetry_normal(struct ocp_telemetry_parse_options *options)
__u8 *pda1_header_offset = ptelemetry_buffer + offsets.da1_start_offset;//512
generic_structure_parser(pda1_header_offset, ocp_header_in_da1,
- ARRAY_SIZE(ocp_header_in_da1), NULL, 0, NULL);
+ ARRAY_SIZE(ocp_header_in_da1), NULL, 0, NULL);
printf(STR_LINE);
printf("%s\n", STR_SMART_HEALTH_INFO);
@@ -1391,7 +1525,7 @@ int print_ocp_telemetry_normal(struct ocp_telemetry_parse_options *options)
offsetof(struct nvme_ocp_header_in_da1, smart_health_info);
generic_structure_parser(pda1_smart_offset, smart, ARRAY_SIZE(smart), NULL, 0,
- NULL);
+ NULL);
printf(STR_LINE);
printf("%s\n", STR_SMART_HEALTH_INTO_EXTENDED);
@@ -1400,7 +1534,7 @@ int print_ocp_telemetry_normal(struct ocp_telemetry_parse_options *options)
offsetof(struct nvme_ocp_header_in_da1, smart_health_info_extended);
generic_structure_parser(pda1_smart_ext_offset, smart_extended,
- ARRAY_SIZE(smart_extended), NULL, 0, NULL);
+ ARRAY_SIZE(smart_extended), NULL, 0, NULL);
printf(STR_LINE);
printf("%s\n", STR_DA_1_STATS);
@@ -1564,3 +1698,4 @@ int print_ocp_telemetry_json(struct ocp_telemetry_parse_options *options)
return status;
}
+#endif /* CONFIG_JSONC */
diff --git a/plugins/ocp/ocp-telemetry-decode.h b/plugins/ocp/ocp-telemetry-decode.h
index ed31a6c..ce7de75 100644
--- a/plugins/ocp/ocp-telemetry-decode.h
+++ b/plugins/ocp/ocp-telemetry-decode.h
@@ -3,11 +3,14 @@
*
* Authors: Jeff Lien <jeff.lien@wdc.com>,
*/
+#ifndef OCP_TELEMETRY_DECODE_H
+#define OCP_TELEMETRY_DECODE_H
#include "nvme.h"
#include "nvme-print.h"
#include "util/utils.h"
#include "common.h"
+#include "ocp-nvme.h"
extern __u8 *ptelemetry_buffer;
extern __u8 *pstring_buffer;
@@ -382,7 +385,7 @@ struct telemetry_stats_desc {
__u8 data[];
};
-struct telemetry_event_desc {
+struct __packed telemetry_event_desc {
__u8 class;
__le16 id;
__u8 size;
@@ -399,7 +402,7 @@ struct telemetry_data_area_1 {
__le16 minor_version;
__u8 reserved1[4];
__le64 timestamp;
- __u8 log_page_guid[16];
+ __u8 log_page_guid[GUID_LEN];
__u8 no_of_tps_supp;
__u8 tps;
__u8 reserved2[6];
@@ -428,13 +431,13 @@ struct telemetry_data_area_1 {
#define MAX_NUM_FIFOS 16
#define DA1_OFFSET 512
#define DEFAULT_ASCII_STRING_SIZE 16
+#define SIZE_OF_VU_EVENT_ID 2
#define DEFAULT_TELEMETRY_BIN "telemetry.bin"
#define DEFAULT_STRING_BIN "string.bin"
#define DEFAULT_OUTPUT_FORMAT_JSON "json"
/* C9 Telemetry String Log Format Log Page */
-#define C9_GUID_LENGTH 16
#define C9_TELEMETRY_STRING_LOG_ENABLE_OPCODE 0xC9
#define C9_TELEMETRY_STR_LOG_LEN 432
#define C9_TELEMETRY_STR_LOG_SIST_OFST 431
@@ -566,7 +569,7 @@ enum ocp_telemetry_debug_event_class_types {
struct __packed telemetry_str_log_format {
__u8 log_page_version;
__u8 reserved1[15];
- __u8 log_page_guid[C9_GUID_LENGTH];
+ __u8 log_page_guid[GUID_LEN];
__le64 sls;
__u8 reserved2[24];
__le64 sits;
@@ -778,7 +781,7 @@ struct __packed nvme_ocp_telemetry_smart_extended
__le64 lowest_permitted_firmware_revision; // Bytes 215:208
__u8 reserved4[278]; // Bytes 493:216
__le16 log_page_version; // Bytes 495:494
- __u8 log_page_guid[16]; // Bytes 511:496
+ __u8 log_page_guid[GUID_LEN]; // Bytes 511:496
};
struct __packed nvme_ocp_event_fifo_data
@@ -815,7 +818,7 @@ struct __packed nvme_ocp_header_in_da1
__le16 minor_version; // Bytes 3:2
__le32 reserved1; // Bytes 7:4
__le64 time_stamp; // Bytes 15:8
- __u8 log_page_guid[16]; // Bytes 31:16
+ __u8 log_page_guid[GUID_LEN]; // Bytes 31:16
__u8 num_telemetry_profiles_supported; // Byte 32
__u8 telemetry_profile_selected; // Byte 33
__u8 reserved2[6]; // Bytes 39:34
@@ -856,30 +859,28 @@ struct __packed nvme_ocp_telemetry_event_descriptor
struct __packed nvme_ocp_time_stamp_dbg_evt_class_format
{
__u8 time_stamp[DATA_SIZE_8]; // Bytes 11:4
- __le16 vu_event_identifier; // Bytes 13:12
};
struct __packed nvme_ocp_pcie_dbg_evt_class_format
{
__u8 pCIeDebugEventData[DATA_SIZE_4]; // Bytes 7:4
- __le16 vu_event_identifier; // Bytes 9:8
};
struct __packed nvme_ocp_nvme_dbg_evt_class_format
{
__u8 nvmeDebugEventData[DATA_SIZE_8]; // Bytes 11:4
- __le16 vu_event_identifier; // Bytes 13:12
};
-struct __packed nvme_ocp_common_dbg_evt_class_format
+struct __packed nvme_ocp_media_wear_dbg_evt_class_format
{
- __le16 vu_event_identifier; // Bytes 5:4
+ __u8 currentMediaWear[DATA_SIZE_12]; // Bytes 15:4
+
};
-struct __packed nvme_ocp_media_wear_dbg_evt_class_format
+struct __packed nvme_ocp_common_dbg_evt_class_vu_data
{
- __u8 currentMediaWear[DATA_SIZE_12]; // Bytes 15:4
- __le16 vu_event_identifier; // Bytes 17:16
+ __le16 vu_event_identifier; // Bytes 5:4
+ __u8 data[]; // Bytes N:6
};
struct __packed nvme_ocp_statistic_snapshot_evt_class_format
@@ -918,7 +919,7 @@ struct __packed nvme_ocp_telemetry_string_header
{
__u8 version; //0:0
__u8 reserved1[15]; //15:1
- __u8 guid[16]; //32:16
+ __u8 guid[GUID_LEN]; //32:16
__le64 string_log_size; //39:32
__u8 reserved2[24]; //63:40
__le64 sits; //71:64 Statistics Identifier String Table Start(SITS)
@@ -1226,3 +1227,4 @@ void parse_common_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descr
void parse_media_wear_event(struct nvme_ocp_telemetry_event_descriptor *pevent_descriptor,
struct json_object *pevent_descriptor_obj, __u8 *pevent_specific_data,
struct json_object *pevent_fifos_object, FILE *fp);
+#endif /* OCP_TELEMETRY_DECODE_H */
diff --git a/plugins/sed/sedopal_cmd.c b/plugins/sed/sedopal_cmd.c
index d9a789c..017649d 100644
--- a/plugins/sed/sedopal_cmd.c
+++ b/plugins/sed/sedopal_cmd.c
@@ -134,7 +134,7 @@ int sedopal_set_key(struct opal_key *key)
key->key_type = OPAL_INCLUDED;
#endif
key->key_len = strlen(pass);
- memcpy(key->key, pass, key->key_len);
+ memcpy(key->key, pass, key->key_len + 1);
/*
* If getting a new key, ask for it to be re-entered
@@ -446,9 +446,23 @@ int sedopal_cmd_password(int fd)
if (sedopal_set_key(&new_pw.new_user_pw.opal_key) != 0)
return -EINVAL;
+ /*
+ * set admin1 password
+ */
rc = ioctl(fd, IOC_OPAL_SET_PW, &new_pw);
- if (rc != 0)
+ if (rc != 0) {
fprintf(stderr, "Error: failed setting password - %d\n", rc);
+ return rc;
+ }
+
+#ifdef IOC_OPAL_SET_SID_PW
+ /*
+ * set sid password
+ */
+ rc = ioctl(fd, IOC_OPAL_SET_SID_PW, &new_pw);
+ if (rc != 0)
+ fprintf(stderr, "Error: failed setting SID password - %d\n", rc);
+#endif
return rc;
}
diff --git a/plugins/solidigm/solidigm-internal-logs.c b/plugins/solidigm/solidigm-internal-logs.c
index f5b57f3..d493216 100644
--- a/plugins/solidigm/solidigm-internal-logs.c
+++ b/plugins/solidigm/solidigm-internal-logs.c
@@ -4,6 +4,7 @@
*
* Authors: leonardo.da.cunha@solidigm.com
* shankaralingegowda.singonahalli@solidigm.com
+ * haro.panosyan@solidigm.com
*/
#include <fcntl.h>
@@ -136,7 +137,6 @@ struct ilog {
int count;
struct nvme_id_ctrl id_ctrl;
enum nvme_telemetry_da max_da;
- __u32 max_tx;
};
static void print_nlog_header(__u8 *buffer)
@@ -458,7 +458,6 @@ static int log_save(struct log *log, const char *parent_dir_name, const char *su
_cleanup_fd_ int output = -1;
char file_path[PATH_MAX] = {0};
size_t bytes_remaining = 0;
- int err = 0;
ensure_dir(parent_dir_name, subdir_name);
@@ -473,19 +472,14 @@ static int log_save(struct log *log, const char *parent_dir_name, const char *su
while (bytes_remaining) {
ssize_t bytes_written = write(output, buffer, bytes_remaining);
- if (bytes_written < 0) {
- err = -errno;
- goto log_save_close_output;
- }
+ if (bytes_written < 0)
+ return -errno;
bytes_remaining -= bytes_written;
buffer += bytes_written;
}
printf("Successfully wrote %s to %s\n", log->desc, file_path);
-
-log_save_close_output:
- close(output);
- return err;
+ return 0;
}
static int ilog_dump_identify_page(struct ilog *ilog, struct log *cns, __u32 nsid)
@@ -527,11 +521,6 @@ static int ilog_ensure_dump_id_ctrl(struct ilog *ilog)
if (ilog->id_ctrl.lpa & 0x40)
ilog->max_da = NVME_TELEMETRY_DA_4;
- /* assuming CAP.MPSMIN is zero minimum Memory Page Size is at least 4096 bytes */
- ilog->max_tx = (1 << ilog->id_ctrl.mdts) * NVME_LOG_PAGE_PDU_SIZE;
- if (ilog->max_tx > DRIVER_MAX_TX_256K)
- ilog->max_tx = DRIVER_MAX_TX_256K;
-
return err;
}
@@ -539,7 +528,7 @@ static int ilog_dump_telemetry(struct ilog *ilog, enum log_type ttype)
{
int err = 0;
enum nvme_telemetry_da da;
- size_t max_data_tx;
+ size_t mdts;
const char *file_name;
struct nvme_feat_host_behavior prev = {0};
bool host_behavior_changed = false;
@@ -550,7 +539,7 @@ static int ilog_dump_telemetry(struct ilog *ilog, enum log_type ttype)
return err;
da = ilog->max_da;
- max_data_tx = ilog->max_tx;
+ mdts = ilog->id_ctrl.mdts;
if (da == 4) {
__u32 result;
@@ -569,16 +558,16 @@ static int ilog_dump_telemetry(struct ilog *ilog, enum log_type ttype)
case HIT:
file_name = "lid_0x07_lsp_0x01_lsi_0x0000.bin";
log.desc = "Host Initiated Telemetry";
- err = nvme_get_telemetry_log(dev_fd(ilog->dev), true, false, false, max_data_tx, da,
- (struct nvme_telemetry_log **) &log.buffer,
- &log.buffer_size);
+ err = sldgm_dynamic_telemetry(dev_fd(ilog->dev), true, false, false, mdts,
+ da, (struct nvme_telemetry_log **) &log.buffer,
+ &log.buffer_size);
break;
case CIT:
file_name = "lid_0x08_lsp_0x00_lsi_0x0000.bin";
log.desc = "Controller Initiated Telemetry";
- err = nvme_get_telemetry_log(dev_fd(ilog->dev), false, true, true, max_data_tx, da,
- (struct nvme_telemetry_log **) &log.buffer,
- &log.buffer_size);
+ err = sldgm_dynamic_telemetry(dev_fd(ilog->dev), false, true, true, mdts,
+ da, (struct nvme_telemetry_log **) &log.buffer,
+ &log.buffer_size);
break;
default:
return -EINVAL;
@@ -597,14 +586,17 @@ static int ilog_dump_telemetry(struct ilog *ilog, enum log_type ttype)
static int ilog_dump_identify_pages(struct ilog *ilog)
{
- struct nvme_ns_list ns_list;
+ struct nvme_ns_list ns_attached_list;
+ struct nvme_ns_list ns_allocated_list;
__u32 j = 0;
+
struct log identify_base_list[] = {
{NVME_IDENTIFY_CNS_NS_ACTIVE_LIST, "Id Active Namespace ID list",
- sizeof(ns_list), (__u8 *) &ns_list},
+ sizeof(ns_attached_list), (__u8 *) &ns_attached_list},
{NVME_IDENTIFY_CNS_NVMSET_LIST, "Id NVM Set List"},
{NVME_IDENTIFY_CNS_CSI_CTRL, "Id I/O Command Set specific"},
- {NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST, "Id Allocated Namespace ID list"},
+ {NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST, "Id Allocated Namespace ID list",
+ sizeof(ns_allocated_list), (__u8 *) &ns_allocated_list},
{NVME_IDENTIFY_CNS_CTRL_LIST, "Id Controller List"}
};
struct log identify_ns_required_list[] = {
@@ -613,10 +605,12 @@ static int ilog_dump_identify_pages(struct ilog *ilog)
{NVME_IDENTIFY_CNS_CSI_NS, "Id Namespace ID I/O Command Set specific"},
{NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS,
"I/O Command Set Independent Identify Namespace Data"},
- {NVME_IDENTIFY_CNS_ALLOCATED_NS, "Id Namespace data "},
{NVME_IDENTIFY_CNS_NS_CTRL_LIST, "Id Namespace Id Controller List"},
};
+ struct log allocated = {NVME_IDENTIFY_CNS_ALLOCATED_NS, "Allocated Namespace Data",
+ NVME_IDENTIFY_DATA_SIZE, NULL};
+
ilog_ensure_dump_id_ctrl(ilog);
for (int i = 0; i < ARRAY_SIZE(identify_base_list); i++) {
@@ -626,10 +620,10 @@ static int ilog_dump_identify_pages(struct ilog *ilog)
ilog->count++;
}
- while (ns_list.ns[j]) {
+ while (ns_attached_list.ns[j]) {
for (int i = 0; i < ARRAY_SIZE(identify_ns_required_list); i++) {
int err = ilog_dump_identify_page(ilog, &identify_ns_required_list[i],
- ns_list.ns[j]);
+ ns_attached_list.ns[j]);
if (err == 0)
ilog->count++;
@@ -637,6 +631,15 @@ static int ilog_dump_identify_pages(struct ilog *ilog)
j++;
}
+ j = 0;
+ while (ns_allocated_list.ns[j]) {
+ int err = ilog_dump_identify_page(ilog, &allocated, ns_allocated_list.ns[j]);
+
+ if (err == 0)
+ ilog->count++;
+ j++;
+ }
+
return 0;
}
@@ -740,6 +743,7 @@ static int ilog_dump_pel(struct ilog *ilog)
void *pevent_log_full;
int err;
struct nvme_get_log_args args;
+ size_t max_data_tx;
_cleanup_free_ struct nvme_persistent_event_log *pevent = NULL;
@@ -785,7 +789,13 @@ static int ilog_dump_pel(struct ilog *ilog)
.rae = false,
.ot = false,
};
- err = nvme_get_log_page(dev_fd(ilog->dev), ilog->max_tx, &args);
+
+ max_data_tx = (1 << ilog->id_ctrl.mdts) * NVME_LOG_PAGE_PDU_SIZE;
+ do {
+ err = nvme_get_log_page(dev_fd(ilog->dev), max_data_tx, &args);
+ max_data_tx /= 2;
+ } while (err == -EPERM && max_data_tx >= NVME_LOG_PAGE_PDU_SIZE);
+
if (err)
return err;
diff --git a/plugins/solidigm/solidigm-nvme.h b/plugins/solidigm/solidigm-nvme.h
index 2b74a02..cb32ed0 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.6"
+#define SOLIDIGM_PLUGIN_VERSION "1.8"
PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_VERSION),
COMMAND_LIST(
diff --git a/plugins/solidigm/solidigm-telemetry.c b/plugins/solidigm/solidigm-telemetry.c
index 2bebccc..12cb6c6 100644
--- a/plugins/solidigm/solidigm-telemetry.c
+++ b/plugins/solidigm/solidigm-telemetry.c
@@ -144,6 +144,8 @@ int solidigm_get_telemetry_log(int argc, char **argv, struct command *cmd, struc
if (!cfg.is_input_file) {
size_t max_data_tx;
+ size_t power2;
+ __u8 mdts = 0;
err = nvme_get_telemetry_max(dev_fd(dev), NULL, &max_data_tx);
if (err < 0) {
@@ -155,11 +157,14 @@ int solidigm_get_telemetry_log(int argc, char **argv, struct command *cmd, struc
SOLIDIGM_LOG_WARNING("Failed to acquire identify ctrl %d!", err);
goto close_fd;
}
- if (max_data_tx > DRIVER_MAX_TX_256K)
- max_data_tx = DRIVER_MAX_TX_256K;
+ power2 = max_data_tx / NVME_LOG_PAGE_PDU_SIZE;
+ while (power2 && !(1 & power2)) {
+ power2 >>= 1;
+ mdts++;
+ }
- err = nvme_get_telemetry_log(dev_fd(dev), cfg.host_gen, cfg.ctrl_init, true,
- max_data_tx, cfg.data_area, &tl.log, &tl.log_size);
+ err = sldgm_dynamic_telemetry(dev_fd(dev), cfg.host_gen, cfg.ctrl_init, true,
+ mdts, cfg.data_area, &tl.log, &tl.log_size);
if (err < 0) {
SOLIDIGM_LOG_WARNING("get-telemetry-log: %s",
nvme_strerror(errno));
diff --git a/plugins/solidigm/solidigm-util.c b/plugins/solidigm/solidigm-util.c
index 05d1537..8206ef8 100644
--- a/plugins/solidigm/solidigm-util.c
+++ b/plugins/solidigm/solidigm-util.c
@@ -37,3 +37,19 @@ int sldgm_get_uuid_index(struct nvme_dev *dev, __u8 *index)
return sldgm_find_uuid_index(&uuid_list, index);
}
+
+int sldgm_dynamic_telemetry(int dev_fd, bool create, bool ctrl, bool log_page, __u8 mtds,
+ enum nvme_telemetry_da da, struct nvme_telemetry_log **log_buffer,
+ size_t *log_buffer_size)
+{
+ int err;
+ size_t max_data_tx = (1 << mtds) * NVME_LOG_PAGE_PDU_SIZE;
+
+ do {
+ err = nvme_get_telemetry_log(dev_fd, create, ctrl, log_page, max_data_tx, da,
+ log_buffer, log_buffer_size);
+ max_data_tx /= 2;
+ create = false;
+ } while (err == -EPERM && max_data_tx >= NVME_LOG_PAGE_PDU_SIZE);
+ return err;
+}
diff --git a/plugins/solidigm/solidigm-util.h b/plugins/solidigm/solidigm-util.h
index ed7bf0f..85adbf9 100644
--- a/plugins/solidigm/solidigm-util.h
+++ b/plugins/solidigm/solidigm-util.h
@@ -7,7 +7,8 @@
#include "nvme.h"
-#define DRIVER_MAX_TX_256K (256 * 1024)
-
int sldgm_find_uuid_index(struct nvme_id_uuid_list *uuid_list, __u8 *index);
int sldgm_get_uuid_index(struct nvme_dev *dev, __u8 *index);
+int sldgm_dynamic_telemetry(int dev_fd, bool create, bool ctrl, bool log_page, __u8 mtds,
+ enum nvme_telemetry_da da, struct nvme_telemetry_log **log_buffer,
+ size_t *log_buffer_size);
diff --git a/plugins/solidigm/solidigm-workload-tracker.c b/plugins/solidigm/solidigm-workload-tracker.c
index 73bb3c3..14d8458 100644
--- a/plugins/solidigm/solidigm-workload-tracker.c
+++ b/plugins/solidigm/solidigm-workload-tracker.c
@@ -12,7 +12,8 @@
#define LID 0xf9
#define FID 0xf1
-#define WLT2MS 25000
+#define WLT2US 25
+#define WLT2MS (WLT2US * 1000)
#define MAX_WORKLOAD_LOG_ENTRIES 126
#define MAX_WORKLOAD_LOG_ENTRY_SIZE 32
#define MAX_FIELDS 15
@@ -174,11 +175,11 @@ union WorkloadLogEnable {
__u32 contentGroup : 4; // content group select
__u32 stopCount : 12;// event limit,if<>0,stop tracker after stopCount events
__u32 eventDumpEnable : 1; // trigger event dump enable
- } field;
+ };
__u32 dword;
};
-struct workloadLogHeader {
+struct workloadLog { // Full WL Log Structure
__u16 majorVersion; // Major Version
__u16 minorVersion; // Minor Version
__u32 workloadLogCount; // Number of Entries in the Workload Log
@@ -187,14 +188,9 @@ struct workloadLogHeader {
__u32 samplePeriodInMilliseconds; // Sample Period In Milliseconds
__u64 timestamp_lastEntry; // Timestamp for the last full entry
__u64 timestamp_triggered; // Timestamp at the point of trigger
- __u32 trackerEnable; // Workload trigger and enable settings
+ union WorkloadLogEnable config; // Workload trigger and enable settings
__u32 triggerthreshold; // Trigger threshold
__u32 triggeredValue; // Actual value fired the trigger
-};
-
-
-struct workloadLog { // Full WL Log Structure
- struct workloadLogHeader header;
__u8 entry[MAX_WORKLOAD_LOG_ENTRIES][MAX_WORKLOAD_LOG_ENTRY_SIZE];
};
#pragma pack(pop)
@@ -202,24 +198,26 @@ struct workloadLog { // Full WL Log Structure
struct wltracker {
int fd;
struct workloadLog workload_log;
- size_t entry_count;
+ size_t poll_count;
+ bool show_wall_timestamp;
+ __u64 us_epoch_ssd_delta;
unsigned int verbose;
+ __u64 start_time_us;
+ __u64 run_time_us;
+ bool disable;
};
static void wltracker_print_field_names(struct wltracker *wlt)
{
struct workloadLog *log = &wlt->workload_log;
- __u8 cnt = log->header.workloadLogCount;
- union WorkloadLogEnable workloadEnable = (union WorkloadLogEnable)log->header.trackerEnable;
- __u8 content_group = workloadEnable.field.contentGroup;
- if (cnt == 0)
+ if (log->workloadLogCount == 0)
return;
printf("%-16s", "timestamp");
for (int i = 0 ; i < MAX_FIELDS; i++) {
- struct field f = group_fields[content_group][i];
+ struct field f = group_fields[log->config.contentGroup][i];
if (f.size == 0)
break;
@@ -228,8 +226,11 @@ static void wltracker_print_field_names(struct wltracker *wlt)
printf("%s ", f.name);
}
+ if (wlt->show_wall_timestamp)
+ printf("%-*s", (int)sizeof("YYYY-MM-DD-hh:mm:ss.uuuuuu"), "wall-time");
+
if (wlt->verbose > 1)
- printf("%s", "entry#");
+ printf("%s", "entry# ");
printf("\n");
}
@@ -237,35 +238,59 @@ static void wltracker_print_field_names(struct wltracker *wlt)
static void wltracker_print_header(struct wltracker *wlt)
{
struct workloadLog *log = &wlt->workload_log;
- __u8 cnt = log->header.workloadLogCount;
- union WorkloadLogEnable workloadEnable = (union WorkloadLogEnable)log->header.trackerEnable;
- __u8 content_group = workloadEnable.field.contentGroup;
-
- printf("%-20s %u.%u\n", "Log page version:", le16_to_cpu(log->header.majorVersion),
- le16_to_cpu(log->header.minorVersion));
- printf("%-20s %u\n", "Sample period(ms):",
- le32_to_cpu(log->header.samplePeriodInMilliseconds));
- printf("%-20s %lu\n", "timestamp_lastEntry:",
- le64_to_cpu(log->header.timestamp_lastEntry) / WLT2MS);
- printf("%-20s %lu\n", "timestamp_triggered:",
- le64_to_cpu(log->header.timestamp_triggered/1000));
- printf("%-20s 0x%x\n", "trackerEnable:", le32_to_cpu(log->header.trackerEnable));
- printf("%-20s %u\n", "Triggerthreshold:",
- le32_to_cpu(log->header.triggerthreshold));
- printf("%-20s %u\n", "ValueTriggered:", le32_to_cpu(log->header.triggeredValue));
- printf("%-20s %s\n", "Tracker Type:", trk_types[content_group]);
- printf("%-30s %u\n", "Total workload log entries:", le16_to_cpu(cnt));
- printf("%-20s %ld\n\n", "Sample count:", wlt->entry_count);
- if (wlt->entry_count != 0)
+
+ printf("%-24s %u.%u\n", "Log page version:", le16_to_cpu(log->majorVersion),
+ le16_to_cpu(log->minorVersion));
+ printf("%-24s %u\n", "Sample period(ms):", le32_to_cpu(log->samplePeriodInMilliseconds));
+ printf("%-24s %lu\n", "timestamp_lastChange:", le64_to_cpu(log->timestamp_lastEntry));
+ printf("%-24s %lu\n", "timestamp_triggered:", le64_to_cpu(log->timestamp_triggered));
+ printf("%-24s 0x%x\n", "config:", le32_to_cpu(log->config.dword));
+ printf("%-24s %u\n", "Triggerthreshold:", le32_to_cpu(log->triggerthreshold));
+ printf("%-24s %u\n", "ValueTriggered:", le32_to_cpu(log->triggeredValue));
+ printf("%-24s %s\n", "Tracker Type:", trk_types[log->config.contentGroup]);
+ printf("%-24s %u\n", "Total log page entries:", le32_to_cpu(log->workloadLogCount));
+ printf("%-24s %u\n", "Trigger count:", log->triggeredEvents);
+ if (wlt->verbose > 1)
+ printf("%-24s %ld\n", "Poll count:", wlt->poll_count);
+ if (wlt->poll_count != 0)
wltracker_print_field_names(wlt);
}
+__u64 micros_id(clockid_t clk_id)
+{
+ struct timespec ts;
+ __u64 us;
+
+ clock_gettime(clk_id, &ts);
+ us = (((__u64)ts.tv_sec)*1000000) + (((__u64)ts.tv_nsec)/1000);
+ return us;
+}
+
+__u64 micros(void)
+{
+ return micros_id(CLOCK_REALTIME);
+}
+
+int wltracker_config(struct wltracker *wlt, union WorkloadLogEnable *we)
+{
+ struct nvme_set_features_args args = {
+ .args_size = sizeof(args),
+ .fd = wlt->fd,
+ .fid = FID,
+ .cdw11 = we->dword,
+ .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
+ };
+
+ return nvme_set_features(&args);
+}
+
static int wltracker_show_newer_entries(struct wltracker *wlt)
{
struct workloadLog *log = &wlt->workload_log;
__u8 cnt;
__u8 content_group;
- static __u64 last_timestamp_ms;
+ static __u64 last_timestamp_us;
+ __u64 timestamp_us = 0;
__u64 timestamp = 0;
union WorkloadLogEnable workloadEnable;
@@ -281,29 +306,75 @@ static int wltracker_show_newer_entries(struct wltracker *wlt)
if (wlt->verbose)
wltracker_print_header(wlt);
- cnt = log->header.workloadLogCount;
- workloadEnable = (union WorkloadLogEnable)log->header.trackerEnable;
- content_group = workloadEnable.field.contentGroup;
+ cnt = log->workloadLogCount;
+ workloadEnable = log->config;
+ content_group = workloadEnable.contentGroup;
if (cnt == 0) {
nvme_show_error("Warning : No valid workload log data\n");
return 0;
}
- timestamp = (le64_to_cpu(log->header.timestamp_lastEntry) / WLT2MS) -
- (log->header.samplePeriodInMilliseconds * (cnt - 1));
+ timestamp_us = (le64_to_cpu(log->timestamp_lastEntry) / WLT2US) -
+ (log->samplePeriodInMilliseconds * 1000 * (cnt - 1));
+ timestamp = le64_to_cpu(log->timestamp_lastEntry) -
+ (log->samplePeriodInMilliseconds * WLT2MS * (cnt - 1));
+ if (wlt->poll_count++ == 0) {
+ __u64 tle = log->timestamp_lastEntry;
+ __u8 tracker_enable_bit = workloadEnable.trackerEnable;
- if (wlt->entry_count == 0)
wltracker_print_field_names(wlt);
+ if (wlt->show_wall_timestamp &&
+ ((log->triggeredEvents && wlt->disable) || !tracker_enable_bit)) {
+ // retrieve fresh timestamp to reconstruct wall time
+ union WorkloadLogEnable we = log->config;
+
+ if (wlt->verbose > 1) {
+ printf("Temporarily enabling tracker to find current timestamp\n");
+ printf("Original config value: 0x%08x\n", we.dword);
+ }
+ we.trackerEnable = true;
+ we.triggerEnable = false;
+ we.sampleTime = 1;
+
+ if (wlt->verbose > 1)
+ printf("Modified config value: 0x%08x\n", we.dword);
+
+ err = wltracker_config(wlt, &we);
+ usleep(1000);
+ if (!err) {
+ struct workloadLog tl;
+
+ err = nvme_get_log_simple(wlt->fd, LID, sizeof(tl), &tl);
+ tle = tl.timestamp_lastEntry;
+ }
+ if (err) {
+ nvme_show_error("Failed to retrieve latest SSD timestamp");
+ } else {
+ // Restore original config , but don't reenable trigger
+ we = log->config;
+ we.triggerEnable = false;
+ err = wltracker_config(wlt, &we);
+ if (wlt->verbose > 1)
+ printf("Restored config value: 0x%08x\n",
+ we.dword);
+ }
+ }
+ wlt->us_epoch_ssd_delta = (micros() - le64_to_cpu(tle) / WLT2US);
+ }
+
for (int i = cnt - 1; i >= 0; i--) {
int offset = 0;
__u8 *entry = (__u8 *) &log->entry[i];
- bool is_old = timestamp <= last_timestamp_ms;
+ // allow 10% sample skew
+ bool is_old = timestamp_us <= last_timestamp_us +
+ (log->samplePeriodInMilliseconds * 100);
if (is_old) {
- timestamp += log->header.samplePeriodInMilliseconds;
+ timestamp_us += (log->samplePeriodInMilliseconds * 1000);
+ timestamp += log->samplePeriodInMilliseconds * WLT2MS;
continue;
}
printf("%-16llu", timestamp);
@@ -312,8 +383,21 @@ static int wltracker_show_newer_entries(struct wltracker *wlt)
struct field f = group_fields[content_group][j];
if (f.size == 0) {
+ if (wlt->show_wall_timestamp) {
+ time_t epoch_ts_us = timestamp_us +
+ wlt->us_epoch_ssd_delta;
+ time_t ts_s = epoch_ts_us / 1000000;
+ struct tm ts = *localtime(&ts_s);
+ char buf[80];
+
+ strftime(buf, sizeof(buf), "%Y-%m-%d-%H:%M:%S", &ts);
+ printf("%s.%06" PRIu64 " ", buf,
+ (uint64_t)(epoch_ts_us % 1000000ULL));
+ }
+
if (wlt->verbose > 1)
printf("%-*i", (int)sizeof("entry#"), i);
+
printf("\n");
break;
}
@@ -337,28 +421,24 @@ static int wltracker_show_newer_entries(struct wltracker *wlt)
printf("%-*u ", (int)strlen(f.name), val);
}
- wlt->entry_count++;
- timestamp += log->header.samplePeriodInMilliseconds;
+ timestamp_us += (log->samplePeriodInMilliseconds * 1000);
+ timestamp += log->samplePeriodInMilliseconds * WLT2MS;
}
- last_timestamp_ms = log->header.timestamp_lastEntry / WLT2MS;
+ last_timestamp_us = log->timestamp_lastEntry / WLT2US;
return 0;
}
-int wltracker_config(struct wltracker *wlt, union WorkloadLogEnable *we)
+void wltracker_run_time_update(struct wltracker *wlt)
{
- struct nvme_set_features_args args = {
- .args_size = sizeof(args),
- .fd = wlt->fd,
- .fid = FID,
- .cdw11 = we->dword,
- .timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
- };
-
- return nvme_set_features(&args);
+ wlt->run_time_us = micros() - wlt->start_time_us;
+ if (wlt->verbose > 0)
+ printf("run_time: %lluus\n", wlt->run_time_us);
}
static int stricmp(char const *a, char const *b)
{
+ if (!a || !b)
+ return 1;
for (; *a || *b; a++, b++)
if (tolower((unsigned char)*a) != tolower((unsigned char)*b))
return 1;
@@ -367,14 +447,14 @@ static int stricmp(char const *a, char const *b)
static int find_option(char const *list[], int size, const char *val)
{
- for (int i = 0; i < size; i++) {
- if (!stricmp(val, list[i]))
- return i;
- }
- return -EINVAL;
+ for (int i = 0; i < size; i++) {
+ if (!stricmp(val, list[i]))
+ return i;
+ }
+ return -EINVAL;
}
-static void join(char *dest, char const *list[], size_t list_size)
+static void join_options(char *dest, char const *list[], size_t list_size)
{
strcat(dest, list[0]);
for (int i = 1; i < list_size; i++) {
@@ -383,14 +463,26 @@ static void join(char *dest, char const *list[], size_t list_size)
}
}
-__u64 micros(void)
+static int find_field(struct field *fields, const char *val)
{
- struct timespec ts;
- __u64 us;
+ for (int i = 0; i < MAX_FIELDS; i++) {
+ if (!stricmp(val, fields[i].name))
+ return i;
+ }
+ return -EINVAL;
+}
- clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
- us = (((__u64)ts.tv_sec)*1000000) + (((__u64)ts.tv_nsec)/1000);
- return us;
+static void join_fields(char *dest, struct field *fields)
+{
+ strcat(dest, fields[0].name);
+ for (int i = 1; i < MAX_FIELDS; i++) {
+ char *name = fields[i].name;
+
+ if (name) {
+ strcat(dest, "|");
+ strcat(dest, name);
+ }
+ }
}
int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struct plugin *plugin)
@@ -406,9 +498,7 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc
"Samples (1 to 126) to wait for extracting data. Default 100 samples";
char type_options[80] = {0};
char sample_options[80] = {0};
- __u64 us_start;
- __u64 run_time_us;
- __u64 elapsed_run_time_us = 0;
+ __u64 stop_time_us;
__u64 next_sample_us = 0;
int opt;
int err;
@@ -416,29 +506,43 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc
struct config {
bool enable;
bool disable;
+ bool trigger_on_delta;
+ bool trigger_on_latency;
const char *tracker_type;
const char *sample_time;
- int run_time_s;
+ __u32 run_time_s;
int flush_frequency;
+ char *trigger_field;
+ __u32 trigger_treshold;
};
struct config cfg = {
.sample_time = samplet[0],
.flush_frequency = 100,
.tracker_type = trk_types[0],
+ .trigger_field = "",
};
- join(type_options, trk_types, ARRAY_SIZE(trk_types));
- join(sample_options, samplet, ARRAY_SIZE(samplet));
+ join_options(type_options, trk_types, ARRAY_SIZE(trk_types));
+ join_options(sample_options, samplet, ARRAY_SIZE(samplet));
OPT_ARGS(opts) = {
OPT_FLAG("enable", 'e', &cfg.enable, "tracker enable"),
OPT_FLAG("disable", 'd', &cfg.disable, "tracker disable"),
OPT_STRING("sample-time", 's', sample_options, &cfg.sample_time, sample_interval),
OPT_STRING("type", 't', type_options, &cfg.tracker_type, "Tracker type"),
- OPT_INT("run-time", 'r', &cfg.run_time_s, run_time),
+ OPT_UINT("run-time", 'r', &cfg.run_time_s, run_time),
OPT_INT("flush-freq", 'f', &cfg.flush_frequency, flush_frequency),
- OPT_INCR("verbose", 'v', &wlt.verbose, "Increase logging verbosity"),
+ OPT_FLAG("wall-clock", 'w', &wlt.show_wall_timestamp,
+ "Logs current wall timestamp when entry was retrieved"),
+ OPT_STR("trigger-field", 'T', &cfg.trigger_field, "Field name to stop trigger on"),
+ OPT_UINT("trigger-threshold", 'V', &cfg.trigger_treshold,
+ "Field value to trigger stop sampling"),
+ OPT_FLAG("trigger-on-delta", 'D', &cfg.trigger_on_delta,
+ "Trigger on delta to stop sampling"),
+ OPT_FLAG("trigger-on-latency", 'L', &cfg.trigger_on_latency,
+ "Use latency tracker to trigger stop sampling"),
+ OPT_INCR("verbose", 'v', &wlt.verbose, "Increase logging verbosity"),
OPT_END()
};
@@ -460,23 +564,59 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc
cfg.sample_time, sample_options);
return -EINVAL;
}
- we.field.sampleTime = opt;
+ we.sampleTime = opt;
opt = find_option(trk_types, ARRAY_SIZE(trk_types), cfg.tracker_type);
if (opt < 0) {
- nvme_show_error("Invalid tracker type: %s. Valid types: %s",
+ nvme_show_error("Invalid tracker type: \"%s\". Valid types: %s",
cfg.tracker_type, type_options);
return -EINVAL;
}
- we.field.contentGroup = opt;
+ we.contentGroup = opt;
+ if (argconfig_parse_seen(opts, "trigger-field")) {
+ int field_pos = find_field(group_fields[opt], cfg.trigger_field);
+ int field_offset = 0;
+
+ if (field_pos < 0) {
+ char field_options[256];
+
+ join_fields(field_options, group_fields[opt]);
+ nvme_show_error(
+ "Invalid field name: %s. For type: \"%s\", valid fields are: %s",
+ cfg.trigger_field, cfg.tracker_type, field_options);
+ return -EINVAL;
+ }
+ for (int i = 0; i < field_pos; i++)
+ field_offset += group_fields[opt][i].size;
+
+ we.triggerDwordIndex += field_offset / 4;
+ we.triggerSize =
+ group_fields[opt][field_pos].size ==
+ 4 ? 3 : group_fields[opt][field_pos].size;
+ we.triggerByteWordIndex = field_offset % 4 /
+ group_fields[opt][field_pos].size;
+ we.triggerEnable = true;
+ we.triggerDelta = cfg.trigger_on_delta;
+ we.triggerSynchronous = !cfg.trigger_on_latency;
+ err = nvme_set_features_data(wlt.fd, 0xf5, 0, cfg.trigger_treshold, 0, 0, NULL,
+ NULL);
+ if (err < 0) {
+ nvme_show_error("Trigger Threshold set-feature: %s", nvme_strerror(errno));
+ return err;
+ } else if (err > 0) {
+ nvme_show_status(err);
+ return err;
+ }
+ }
if (cfg.enable && cfg.disable) {
nvme_show_error("Can't enable disable simultaneously");
return -EINVAL;
}
+ wlt.disable = cfg.disable;
- if (cfg.enable || cfg.disable) {
- we.field.trackerEnable = cfg.enable;
+ if (cfg.enable) {
+ we.trackerEnable = true;
err = wltracker_config(&wlt, &we);
if (err < 0) {
nvme_show_error("tracker set-feature: %s", nvme_strerror(errno));
@@ -487,17 +627,12 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc
}
}
- if (cfg.disable && !cfg.enable) {
- printf("Tracker disabled\n");
- return 0;
- }
-
- us_start = micros();
- run_time_us = cfg.run_time_s * 1000000;
- while (elapsed_run_time_us < run_time_us) {
+ wlt.start_time_us = micros();
+ stop_time_us = cfg.run_time_s * 1000000;
+ while (wlt.run_time_us < stop_time_us) {
__u64 interval;
__u64 elapsed;
- __u64 prev_elapsed_run_time_us = elapsed_run_time_us;
+ __u64 prev_run_time_us = wlt.run_time_us;
err = wltracker_show_newer_entries(&wlt);
@@ -505,28 +640,50 @@ int sldgm_get_workload_tracker(int argc, char **argv, struct command *cmd, struc
nvme_show_status(err);
return err;
}
- interval = ((__u64)wlt.workload_log.header.samplePeriodInMilliseconds) * 1000 *
+ interval = ((__u64)wlt.workload_log.samplePeriodInMilliseconds) * 1000 *
cfg.flush_frequency;
next_sample_us += interval;
- elapsed_run_time_us = micros() - us_start;
- elapsed = elapsed_run_time_us - prev_elapsed_run_time_us;
- if (wlt.verbose > 1)
- printf("elapsed_run_time: %lluus\n", elapsed_run_time_us);
+ wltracker_run_time_update(&wlt);
+
+ if (wlt.workload_log.triggeredEvents)
+ break;
+ elapsed = wlt.run_time_us - prev_run_time_us;
if (interval > elapsed) {
- __u64 period_us = min(next_sample_us - elapsed_run_time_us,
- run_time_us - elapsed_run_time_us);
+ __u64 period_us = min(next_sample_us - wlt.run_time_us,
+ stop_time_us - wlt.run_time_us);
if (wlt.verbose > 1)
printf("Sleeping %lluus..\n", period_us);
usleep(period_us);
+ wltracker_run_time_update(&wlt);
}
- elapsed_run_time_us = micros() - us_start;
}
- err = wltracker_show_newer_entries(&wlt);
+ if (!wlt.workload_log.triggeredEvents) {
+ err = wltracker_show_newer_entries(&wlt);
+ wltracker_run_time_update(&wlt);
+ }
+
+ if (cfg.disable) {
+ union WorkloadLogEnable we2 = wlt.workload_log.config;
- elapsed_run_time_us = micros() - us_start;
- if (wlt.verbose > 0)
- printf("elapsed_run_time: %lluus\n", elapsed_run_time_us);
+ if (wlt.verbose > 1)
+ printf("Original config value: 0x%08x\n", we2.dword);
+
+ we2.trackerEnable = false;
+ we2.triggerEnable = false;
+ err = wltracker_config(&wlt, &we2);
+ if (err < 0) {
+ nvme_show_error("tracker set-feature: %s", nvme_strerror(errno));
+ return err;
+ } else if (err > 0) {
+ nvme_show_status(err);
+ return err;
+ }
+ if (wlt.verbose > 1)
+ printf("Modified config value: 0x%08x\n", we2.dword);
+ printf("Tracker disabled\n");
+ return 0;
+ }
if (err > 0) {
nvme_show_status(err);
diff --git a/plugins/wdc/wdc-nvme.c b/plugins/wdc/wdc-nvme.c
index fa4157d..f3e97db 100644
--- a/plugins/wdc/wdc-nvme.c
+++ b/plugins/wdc/wdc-nvme.c
@@ -79,6 +79,7 @@
#define WDC_NVME_SN650_DEV_ID_3 0x2720
#define WDC_NVME_SN650_DEV_ID_4 0x2721
#define WDC_NVME_SN655_DEV_ID 0x2722
+#define WDC_NVME_SN655_DEV_ID_1 0x2723
#define WDC_NVME_SN860_DEV_ID 0x2730
#define WDC_NVME_SN660_DEV_ID 0x2704
#define WDC_NVME_SN560_DEV_ID_1 0x2712
@@ -86,6 +87,8 @@
#define WDC_NVME_SN560_DEV_ID_3 0x2714
#define WDC_NVME_SN861_DEV_ID 0x2750
#define WDC_NVME_SN861_DEV_ID_1 0x2751
+#define WDC_NVME_SN861_DEV_ID_2 0x2752
+#define WDC_NVME_SNTMP_DEV_ID 0x2761
/* This id's are no longer supported, delete ?? */
#define WDC_NVME_SN550_DEV_ID 0x2708
@@ -138,6 +141,10 @@
#define WDC_NVME_SN810_DEV_ID 0x5011
#define WDC_NVME_SN820CL_DEV_ID 0x5037
+#define WDC_NVME_SN5100S_DEV_ID_1 0x5061
+#define WDC_NVME_SN5100S_DEV_ID_2 0x5062
+#define WDC_NVME_SN5100S_DEV_ID_3 0x5063
+
#define WDC_DRIVE_CAP_CAP_DIAG 0x0000000000000001
#define WDC_DRIVE_CAP_INTERNAL_LOG 0x0000000000000002
#define WDC_DRIVE_CAP_C1_LOG_PAGE 0x0000000000000004
@@ -1530,7 +1537,8 @@ static int wdc_get_vendor_id(struct nvme_dev *dev, uint32_t *vendor_id)
static bool wdc_is_sn861(__u32 device_id)
{
if ((device_id == WDC_NVME_SN861_DEV_ID) ||
- (device_id == WDC_NVME_SN861_DEV_ID_1))
+ (device_id == WDC_NVME_SN861_DEV_ID_1) ||
+ (device_id == WDC_NVME_SN861_DEV_ID_2))
return true;
else
return false;
@@ -1822,6 +1830,7 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev)
case WDC_NVME_SN650_DEV_ID_3:
case WDC_NVME_SN650_DEV_ID_4:
case WDC_NVME_SN655_DEV_ID:
+ case WDC_NVME_SN655_DEV_ID_1:
case WDC_NVME_SN550_DEV_ID:
/* verify the 0xC0 log page is supported */
if (wdc_nvme_check_supported_log_page(r, dev,
@@ -1872,6 +1881,8 @@ 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 |
@@ -1970,6 +1981,12 @@ static __u64 wdc_get_drive_capabilities(nvme_root_t r, struct nvme_dev *dev)
fallthrough;
case WDC_NVME_SN8000S_DEV_ID:
fallthrough;
+ case WDC_NVME_SN5100S_DEV_ID_1:
+ fallthrough;
+ case WDC_NVME_SN5100S_DEV_ID_2:
+ fallthrough;
+ case WDC_NVME_SN5100S_DEV_ID_3:
+ fallthrough;
case WDC_NVME_SN740_DEV_ID:
case WDC_NVME_SN740_DEV_ID_1:
case WDC_NVME_SN740_DEV_ID_2:
@@ -2357,28 +2374,24 @@ end:
static bool get_dev_mgment_cbs_data(nvme_root_t r, struct nvme_dev *dev,
__u8 log_id, void **cbs_data)
{
- int ret = -1;
bool found = false;
__u8 uuid_ix = 0;
__u8 lid = 0;
*cbs_data = NULL;
- __u32 device_id, read_vendor_id;
+ __u32 device_id = 0, vendor_id = 0;
bool uuid_present = false;
int index = 0, uuid_index = 0;
struct nvme_id_uuid_list uuid_list;
- ret = wdc_get_pci_ids(r, dev, &device_id, &read_vendor_id);
- if (ret == 0) {
- if (device_id == WDC_NVME_ZN350_DEV_ID || device_id == WDC_NVME_ZN350_DEV_ID_1) {
- lid = WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID_C8;
- uuid_ix = 0;
- } else {
- lid = WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID;
- }
- } else {
- fprintf(stderr, "ERROR: WDC: get pci ids: %d\n", ret);
- return false;
- }
+ /* 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);
+
+ lid = WDC_NVME_GET_DEV_MGMNT_LOG_PAGE_ID;
typedef struct nvme_id_uuid_list_entry *uuid_list_entry;
@@ -6909,6 +6922,7 @@ static int wdc_get_c0_log_page(nvme_root_t r, struct nvme_dev *dev, char *format
case WDC_NVME_SN650_DEV_ID_3:
case WDC_NVME_SN650_DEV_ID_4:
case WDC_NVME_SN655_DEV_ID:
+ case WDC_NVME_SN655_DEV_ID_1:
if (uuid_index == 0) {
ret = nvme_get_print_ocp_cloud_smart_log(dev,
uuid_index,
@@ -10832,13 +10846,13 @@ static void wdc_print_nand_stats_json(__u16 version, void *data)
le32_to_cpu(nand_stats_v3->ssd_correction_counts[12]));
json_object_add_value_uint(root, "System data % life-used",
nand_stats_v3->percent_life_used);
- json_object_add_value_uint64(root, "User Data Erase Counts - SLC Min",
+ json_object_add_value_uint64(root, "User Data Erase Counts - TLC Min",
le64_to_cpu(nand_stats_v3->user_data_erase_counts[0]));
- json_object_add_value_uint64(root, "User Data Erase Counts - SLC Max",
+ json_object_add_value_uint64(root, "User Data Erase Counts - TLC Max",
le64_to_cpu(nand_stats_v3->user_data_erase_counts[1]));
- json_object_add_value_uint64(root, "User Data Erase Counts - TLC Min",
+ json_object_add_value_uint64(root, "User Data Erase Counts - SLC Min",
le64_to_cpu(nand_stats_v3->user_data_erase_counts[2]));
- json_object_add_value_uint64(root, "User Data Erase Counts - TLC Max",
+ json_object_add_value_uint64(root, "User Data Erase Counts - SLC Max",
le64_to_cpu(nand_stats_v3->user_data_erase_counts[3]));
temp_ptr = (__u64 *)nand_stats_v3->program_fail_count;
temp_norm = (__u16)(*temp_ptr & 0x000000000000FFFF);
@@ -11305,12 +11319,14 @@ static int wdc_vs_drive_info(int argc, char **argv,
case WDC_NVME_SN650_DEV_ID_3:
case WDC_NVME_SN650_DEV_ID_4:
case WDC_NVME_SN655_DEV_ID:
+ case WDC_NVME_SN655_DEV_ID_1:
case WDC_NVME_SN560_DEV_ID_1:
case WDC_NVME_SN560_DEV_ID_2:
case WDC_NVME_SN560_DEV_ID_3:
case WDC_NVME_SN550_DEV_ID:
case WDC_NVME_ZN350_DEV_ID:
case WDC_NVME_ZN350_DEV_ID_1:
+ case WDC_NVME_SNTMP_DEV_ID:
ret = wdc_do_drive_info(dev, &result);
if (!ret) {
@@ -11429,6 +11445,7 @@ static int wdc_vs_drive_info(int argc, char **argv,
break;
case WDC_NVME_SN861_DEV_ID:
case WDC_NVME_SN861_DEV_ID_1:
+ case WDC_NVME_SN861_DEV_ID_2:
data_len = sizeof(info);
num_dwords = data_len / 4;
if (data_len % 4 != 0)
diff --git a/plugins/wdc/wdc-nvme.h b/plugins/wdc/wdc-nvme.h
index a18da16..6efdbc1 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.9.1"
+#define WDC_PLUGIN_VERSION "2.11.1"
#include "cmd.h"
PLUGIN(NAME("wdc", "Western Digital vendor specific extensions", WDC_PLUGIN_VERSION),
diff --git a/scripts/release.sh b/scripts/release.sh
index eb6eced..10dcc00 100755
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -135,7 +135,7 @@ fi
# update meson.build
sed -i -e "0,/[ \t]version: /s/\([ \t]version: \).*/\1\'$ver\',/" meson.build
if [[ -n "$libnvme_VERSION" ]] && [[ -f subprojects/libnvme.wrap ]]; then
- sed -i -e "s/\(dependency('libnvme', version: '>=\)\([\.1-9]\+\)/\1$libnvme_ver/" meson.build
+ sed -i -e "s/\(dependency('libnvme', version: '>=\)\([0-9]\+\(\.[0-9]\+\)*\)/\1$libnvme_ver/" meson.build
fi
git add meson.build
diff --git a/subprojects/libnvme.wrap b/subprojects/libnvme.wrap
index 76f1ebc..55864ce 100644
--- a/subprojects/libnvme.wrap
+++ b/subprojects/libnvme.wrap
@@ -1,6 +1,6 @@
[wrap-git]
url = https://github.com/linux-nvme/libnvme.git
-revision = dd51fa8550564c93436423a4d8ed4be92ae50290
+revision = 2b3cb1746451f58583408a25857ca897d18cd4ca
[provide]
libnvme = libnvme_dep
diff --git a/tests/nvme_attach_detach_ns_test.py b/tests/nvme_attach_detach_ns_test.py
index 075f211..a0e6129 100644
--- a/tests/nvme_attach_detach_ns_test.py
+++ b/tests/nvme_attach_detach_ns_test.py
@@ -52,8 +52,10 @@ class TestNVMeAttachDetachNSCmd(TestNVMe):
super().setUp()
self.dps = 0
self.flbas = 0
- self.nsze = 0x1400000
- self.ncap = 0x1400000
+ (ds, ms) = self.get_lba_format_size()
+ ncap = int(self.get_ncap() / (ds+ms))
+ self.nsze = ncap
+ self.ncap = ncap
self.setup_log_dir(self.__class__.__name__)
self.ctrl_id = self.get_ctrl_id()
self.delete_all_ns()
diff --git a/tests/nvme_compare_test.py b/tests/nvme_compare_test.py
index 8dfce04..a34df68 100644
--- a/tests/nvme_compare_test.py
+++ b/tests/nvme_compare_test.py
@@ -45,9 +45,20 @@ class TestNVMeCompareCmd(TestNVMeIO):
- test_log_dir : directory for logs, temp files.
"""
+ def compare_cmd_supported(self):
+ """ Wrapper for extracting optional NVM 'compare' command support
+ - Args:
+ - None
+ - Returns:
+ - True if 'compare' is supported, otherwise False
+ """
+ return int(self.get_id_ctrl_field_value("oncs"), 16) & (1 << 0)
+
def setUp(self):
""" Pre Section for TestNVMeCompareCmd """
super().setUp()
+ if not self.compare_cmd_supported():
+ self.skipTest("because: Optional NVM Command 'Compare' (NVMCMPS) not supported")
self.data_size = 1024
self.start_block = 1023
self.setup_log_dir(self.__class__.__name__)
diff --git a/tests/nvme_copy_test.py b/tests/nvme_copy_test.py
index a547231..5d16b00 100644
--- a/tests/nvme_copy_test.py
+++ b/tests/nvme_copy_test.py
@@ -36,6 +36,7 @@ class TestNVMeCopy(TestNVMe):
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
diff --git a/tests/nvme_create_max_ns_test.py b/tests/nvme_create_max_ns_test.py
index bda93e1..76cd4d4 100644
--- a/tests/nvme_create_max_ns_test.py
+++ b/tests/nvme_create_max_ns_test.py
@@ -54,6 +54,10 @@ class TestNVMeCreateMaxNS(TestNVMe):
self.flbas = 0
self.nsze = int(self.get_ncap() /
self.get_format() / 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.
+ self.nsze = int(self.nsze / 2)
self.ncap = self.nsze
self.setup_log_dir(self.__class__.__name__)
self.max_ns = self.get_max_ns()
@@ -75,11 +79,12 @@ class TestNVMeCreateMaxNS(TestNVMe):
self.flbas,
self.dps), 0)
self.attach_ns(self.ctrl_id, self.default_nsid)
- super.tearDown()
+ super().tearDown()
def test_attach_detach_ns(self):
""" Testcase main """
- for nsid in range(1, self.max_ns):
+ print(f"##### Testing max_ns: {self.max_ns}")
+ for nsid in range(1, self.max_ns + 1):
print("##### Creating " + str(nsid))
err = self.create_and_validate_ns(nsid,
self.nsze,
@@ -90,9 +95,9 @@ class TestNVMeCreateMaxNS(TestNVMe):
print("##### Attaching " + str(nsid))
self.assertEqual(self.attach_ns(self.ctrl_id, nsid), 0)
print("##### Running IOs in " + str(nsid))
- self.run_ns_io(nsid, 0)
+ self.run_ns_io(nsid, 9, 1)
- for nsid in range(1, self.max_ns):
+ for nsid in range(1, self.max_ns + 1):
print("##### Detaching " + str(nsid))
self.assertEqual(self.detach_ns(self.ctrl_id, nsid), 0)
print("#### Deleting " + str(nsid))
diff --git a/tests/nvme_ctrl_reset_test.py b/tests/nvme_ctrl_reset_test.py
index b8b3c3b..e2c8a00 100644
--- a/tests/nvme_ctrl_reset_test.py
+++ b/tests/nvme_ctrl_reset_test.py
@@ -46,3 +46,5 @@ class TestNVMeCtrlReset(TestNVMe):
def test_ctrl_reset(self):
""" Testcase main """
self.assertEqual(self.ctrl_reset(), 0)
+ # Check if sqs and cqs are setup again and I/O operations are possible
+ self.run_ns_io(self.default_nsid, 0, 10)
diff --git a/tests/nvme_format_test.py b/tests/nvme_format_test.py
index 40635c1..12bc128 100644
--- a/tests/nvme_format_test.py
+++ b/tests/nvme_format_test.py
@@ -37,6 +37,7 @@ Namespace Format testcase :-
- Delete Namespace.
"""
+import math
import subprocess
import time
@@ -63,10 +64,14 @@ class TestNVMeFormatCmd(TestNVMe):
def setUp(self):
""" Pre Section for TestNVMeFormatCmd """
super().setUp()
- self.dps = 0 # ns data protection settings
- self.flbas = 0 # ns formattes logical block settings
- self.nsze = 0x1400000 # ns size
- self.ncap = 0x1400000 # ns capacity
+ self.dps = 0
+ self.flbas = 0
+ # Assuming run_ns_io with 4KiB * 10 writes.
+ # Calculating minimum required ncap for this workload
+ (ds, _) = self.get_lba_format_size()
+ ncap = int(math.ceil((4096*10)/ds))
+ self.ncap = ncap
+ self.nsze = ncap
self.ctrl_id = self.get_ctrl_id()
self.lba_format_list = []
self.ms_list = []
diff --git a/tests/nvme_get_features_test.py b/tests/nvme_get_features_test.py
index 974fc34..fc3e5bf 100644
--- a/tests/nvme_get_features_test.py
+++ b/tests/nvme_get_features_test.py
@@ -94,6 +94,8 @@ class TestNVMeGetMandatoryFeatures(TestNVMe):
else:
get_feat_cmd = "nvme get-feature " + self.ctrl + \
" --feature-id=" + str(feature_id) + " -H"
+ 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,
diff --git a/tests/nvme_get_lba_status_test.py b/tests/nvme_get_lba_status_test.py
index 539c493..d9e543c 100644
--- a/tests/nvme_get_lba_status_test.py
+++ b/tests/nvme_get_lba_status_test.py
@@ -26,11 +26,12 @@ class TestNVMeGetLbaStatusCmd(TestNVMe):
def setUp(self):
""" Pre Section for TestNVMeGetLbaStatusCmd. """
super().setUp()
+ if not self.get_lba_status_supported():
+ self.skipTest("because: Optional Admin Command 'Get LBA Status' (OACS->GLSS) not supported")
self.start_lba = 0
self.block_count = 0
- self.namespace = 1
self.max_dw = 1
- self.action = 11
+ self.action = 0x11
self.range_len = 1
self.setup_log_dir(self.__class__.__name__)
@@ -51,7 +52,7 @@ class TestNVMeGetLbaStatusCmd(TestNVMe):
"""
err = 0
get_lba_status_cmd = "nvme get-lba-status " + self.ctrl + \
- " --namespace-id=" + str(self.namespace) + \
+ " --namespace-id=" + str(self.ns1) + \
" --start-lba=" + str(self.start_lba) + \
" --max-dw=" + str(self.max_dw) + \
" --action=" + str(self.action) + \
diff --git a/tests/nvme_lba_status_log_test.py b/tests/nvme_lba_status_log_test.py
index c91d1e5..a50e211 100644
--- a/tests/nvme_lba_status_log_test.py
+++ b/tests/nvme_lba_status_log_test.py
@@ -26,6 +26,8 @@ class TestNVMeLbaStatLogCmd(TestNVMe):
def setUp(self):
""" Pre Section for TestNVMeLbaStatLogCmd. """
super().setUp()
+ if not self.get_lba_status_supported():
+ self.skipTest("because: Optional Admin Command 'Get LBA Status' (OACS->GLSS) not supported")
self.setup_log_dir(self.__class__.__name__)
def tearDown(self):
diff --git a/tests/nvme_smart_log_test.py b/tests/nvme_smart_log_test.py
index 916ef49..196998b 100644
--- a/tests/nvme_smart_log_test.py
+++ b/tests/nvme_smart_log_test.py
@@ -85,5 +85,5 @@ class TestNVMeSmartLogCmd(TestNVMe):
""" Testcase main """
self.assertEqual(self.get_smart_log_ctrl(), 0)
smlp = self.supp_check_id_ctrl("lpa")
- if smlp & 0x1 == True:
+ 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 0df3dac..a13a993 100644
--- a/tests/nvme_test.py
+++ b/tests/nvme_test.py
@@ -70,6 +70,30 @@ class TestNVMe(unittest.TestCase):
""" 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()
+
+ def create_and_attach_default_ns(self):
+ """ Creates a default namespace with the full capacity of the ctrls NVM
+ - Args:
+ - None
+ - Returns:
+ - None
+ """
+ self.dps = 0
+ self.flbas = 0
+ (ds, ms) = self.get_lba_format_size()
+ ncap = int(self.get_ncap() / (ds+ms))
+ self.nsze = ncap
+ self.ncap = ncap
+ self.ctrl_id = self.get_ctrl_id()
+ self.delete_all_ns()
+ err = self.create_and_validate_ns(self.default_nsid,
+ self.nsze,
+ self.ncap,
+ self.flbas,
+ self.dps)
+ self.assertEqual(err, 0)
+ self.assertEqual(self.attach_ns(self.ctrl_id, self.default_nsid), 0)
def validate_pci_device(self):
""" Validate underlying device belongs to pci subsystem.
@@ -147,22 +171,23 @@ class TestNVMe(unittest.TestCase):
self.assertEqual(proc.wait(), 0, "ERROR : pci rescan failed")
def get_ctrl_id(self):
- """ Wrapper for extracting the controller id.
+ """ Wrapper for extracting the first controller id.
- Args:
- None
- Returns:
- controller id.
"""
- get_ctrl_id = "nvme list-ctrl " + self.ctrl
+ get_ctrl_id = f"nvme list-ctrl {self.ctrl} --output-format=json"
proc = subprocess.Popen(get_ctrl_id,
shell=True,
stdout=subprocess.PIPE,
encoding='utf-8')
err = proc.wait()
self.assertEqual(err, 0, "ERROR : nvme list-ctrl failed")
- line = proc.stdout.readline()
- ctrl_id = line.split(":")[1].strip()
- return ctrl_id
+ json_output = json.loads(proc.stdout.read())
+ self.assertTrue(len(json_output['ctrl_list']) > 0,
+ "ERROR : nvme list-ctrl could not find ctrl")
+ return str(json_output['ctrl_list'][0]['ctrl_id'])
def get_ns_list(self):
""" Wrapper for extracting the namespace list.
@@ -207,6 +232,43 @@ class TestNVMe(unittest.TestCase):
print(max_ns)
return int(max_ns)
+ def get_lba_status_supported(self):
+ """ Check if 'Get LBA Status' command is supported by the device
+ - Args:
+ - None
+ - Returns:
+ - True if 'Get LBA Status' command is supported, otherwise False
+ """
+ return int(self.get_id_ctrl_field_value("oacs"), 16) & (1 << 9)
+
+ def get_lba_format_size(self):
+ """ Wrapper for extracting lba format size of the given flbas
+ - Args:
+ - None
+ - 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"
+ proc = subprocess.Popen(nvme_id_ns_cmd,
+ shell=True,
+ stdout=subprocess.PIPE,
+ encoding='utf-8')
+ err = proc.wait()
+ self.assertEqual(err, 0, "ERROR : reading id-ns")
+ json_output = json.loads(proc.stdout.read())
+ self.assertTrue(len(json_output['lbafs']) > self.flbas,
+ "Error : could not match the given flbas to an existing lbaf")
+ lbaf_json = json_output['lbafs'][int(self.flbas)]
+ ms_expo = int(lbaf_json['ms'])
+ ds_expo = int(lbaf_json['ds'])
+ ds = 0
+ ms = 0
+ if ds_expo > 0:
+ ds = (1 << ds_expo)
+ if ms_expo > 0:
+ ms = (1 << ms_expo)
+ return (ds, ms)
+
def get_ncap(self):
""" Wrapper for extracting capacity.
- Args:
@@ -231,6 +293,25 @@ class TestNVMe(unittest.TestCase):
print(ncap)
return int(ncap)
+ def get_id_ctrl_field_value(self, field):
+ """ Wrapper for extracting id-ctrl field values
+ - Args:
+ - None
+ - Returns:
+ - Filed value of the given field
+ """
+ id_ctrl_cmd = f"nvme id-ctrl {self.ctrl} --output-format=json"
+ proc = subprocess.Popen(id_ctrl_cmd,
+ shell=True,
+ stdout=subprocess.PIPE,
+ encoding='utf-8')
+ err = proc.wait()
+ self.assertEqual(err, 0, "ERROR : reading id-ctrl failed")
+ json_output = json.loads(proc.stdout.read())
+ self.assertTrue(field in json_output,
+ f"ERROR : reading field '{field}' failed")
+ return str(json_output[field])
+
def get_ocfs(self):
""" Wrapper for extracting optional copy formats supported
- Args:
@@ -238,11 +319,7 @@ class TestNVMe(unittest.TestCase):
- Returns:
- Optional Copy Formats Supported
"""
- pattern = re.compile(r'^ocfs\s*: 0x[0-9a-fA-F]+$')
- output = subprocess.check_output(["nvme", "id-ctrl", self.ctrl], encoding='utf-8')
- ocfs_line = next(line for line in output.splitlines() if pattern.match(line))
- ocfs = ocfs_line.split(":")[1].strip()
- return int(ocfs, 16)
+ return int(self.get_id_ctrl_field_value("ocfs"), 16)
def get_format(self):
""" Wrapper for extracting format.
@@ -391,25 +468,8 @@ class TestNVMe(unittest.TestCase):
encoding='utf-8')
err = proc.wait()
self.assertEqual(err, 0, "ERROR : nvme smart log failed")
-
- for line in proc.stdout:
- if "data_units_read" in line:
- data_units_read = \
- line.replace(",", "", 1)
- if "data_units_written" in line:
- data_units_written = \
- line.replace(",", "", 1)
- if "host_read_commands" in line:
- host_read_commands = \
- line.replace(",", "", 1)
- if "host_write_commands" in line:
- host_write_commands = \
- line.replace(",", "", 1)
-
- print("data_units_read " + data_units_read)
- print("data_units_written " + data_units_written)
- print("host_read_commands " + host_read_commands)
- print("host_write_commands " + host_write_commands)
+ smart_log_output = proc.communicate()[0]
+ print(f"{smart_log_output}")
return err
def get_id_ctrl(self, vendor=False):
@@ -422,7 +482,7 @@ class TestNVMe(unittest.TestCase):
if not vendor:
id_ctrl_cmd = "nvme id-ctrl " + self.ctrl
else:
- id_ctrl_cmd = "nvme id-ctrl -v " + self.ctrl
+ id_ctrl_cmd = "nvme id-ctrl --vendor-specific " + self.ctrl
print(id_ctrl_cmd)
proc = subprocess.Popen(id_ctrl_cmd,
shell=True,
@@ -439,7 +499,7 @@ class TestNVMe(unittest.TestCase):
- Returns:
- 0 on success, error code on failure.
"""
- pattern = re.compile("^ Entry\[[ ]*[0-9]+\]")
+ pattern = re.compile(r"^ Entry\[[ ]*[0-9]+\]")
error_log_cmd = "nvme error-log " + self.ctrl
proc = subprocess.Popen(error_log_cmd,
shell=True,
@@ -456,7 +516,7 @@ class TestNVMe(unittest.TestCase):
return 0 if err_log_entry_count == entry_count else 1
- def run_ns_io(self, nsid, lbads):
+ def run_ns_io(self, nsid, lbads, count=10):
""" Wrapper to run ios on namespace under test.
- Args:
- lbads : LBA Data size supported in power of 2 format.
@@ -466,14 +526,14 @@ class TestNVMe(unittest.TestCase):
block_size = mmap.PAGESIZE 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=10 > /dev/null 2>&1"
+ str(block_size) + " count=" + str(count) + " > /dev/null 2>&1"
print(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=10 > /dev/null 2>&1"
+ str(block_size) + " count=" + str(count) + " > /dev/null 2>&1"
print(io_cmd)
run_io = subprocess.Popen(io_cmd, shell=True, stdout=subprocess.PIPE,
encoding='utf-8')
diff --git a/util/logging.h b/util/logging.h
index 7b1814c..bf02984 100644
--- a/util/logging.h
+++ b/util/logging.h
@@ -5,6 +5,12 @@
#include <stdbool.h>
+#define print_info(...) \
+ do { \
+ if (log_level >= LOG_INFO) \
+ printf(__VA_ARGS__); \
+ } while (false)
+
extern int log_level;
int map_log_level(int verbose, bool quiet);
diff --git a/util/types.c b/util/types.c
index 376c734..20c121b 100644
--- a/util/types.c
+++ b/util/types.c
@@ -48,7 +48,7 @@ uint64_t int48_to_long(__u8 *data)
return result;
}
-static long double uint128_t_to_double(nvme_uint128_t data)
+long double uint128_t_to_double(nvme_uint128_t data)
{
long double result = 0;
int i;
diff --git a/util/types.h b/util/types.h
index 9e0806c..b2e8fc8 100644
--- a/util/types.h
+++ b/util/types.h
@@ -41,6 +41,7 @@ uint64_t int48_to_long(__u8 *data);
char *uint128_t_to_string(nvme_uint128_t val);
char *uint128_t_to_l10n_string(nvme_uint128_t val);
char *uint128_t_to_si_string(nvme_uint128_t val, __u32 bytes_per_unit);
+long double uint128_t_to_double(nvme_uint128_t data);
const char *util_uuid_to_string(unsigned char uuid[NVME_UUID_LEN]);
const char *util_fw_to_string(char *c);