summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2022-07-26 05:25:28 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2022-07-26 05:34:52 +0000
commit9ecff41dd11e920286f9be670a0ec3a668371d1d (patch)
tree89c73ab6742847ca5f12056e6c0dd4ec6bbe79d0
parentAdding debian version 1.0-1. (diff)
downloadlibnvme-9ecff41dd11e920286f9be670a0ec3a668371d1d.tar.xz
libnvme-9ecff41dd11e920286f9be670a0ec3a668371d1d.zip
Merging upstream version 1.1~rc0.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--.github/dependabot.yml7
-rw-r--r--.github/workflows/doc.yml21
-rw-r--r--.github/workflows/meson.yml50
-rw-r--r--.github/workflows/python-publish.yml59
-rw-r--r--.github/workflows/release.yml19
-rw-r--r--README.md12
-rw-r--r--doc/api.rst18
-rw-r--r--doc/api.rst.in18
-rw-r--r--doc/conf.py47
-rw-r--r--doc/conf.py.in32
-rw-r--r--doc/config-schema.json.in164
-rw-r--r--doc/index.rst16
-rw-r--r--doc/index.rst.in23
-rw-r--r--doc/installation.rst52
-rw-r--r--doc/installation.rst.in55
-rw-r--r--doc/kernel-doc-check10
-rwxr-xr-xdoc/list-man-pages.sh1
-rw-r--r--doc/man/nvme_admin_opcode.22
-rw-r--r--doc/man/nvme_admin_passthru.28
-rw-r--r--doc/man/nvme_ae_info_css_nvm.24
-rw-r--r--doc/man/nvme_ae_info_error.24
-rw-r--r--doc/man/nvme_ae_info_notice.24
-rw-r--r--doc/man/nvme_ae_info_smart.24
-rw-r--r--doc/man/nvme_ae_type.24
-rw-r--r--doc/man/nvme_aggregate_endurance_group_event.24
-rw-r--r--doc/man/nvme_aggregate_predictable_lat_event.24
-rw-r--r--doc/man/nvme_ana_group_desc.24
-rw-r--r--doc/man/nvme_ana_log.24
-rw-r--r--doc/man/nvme_ana_state.29
-rw-r--r--doc/man/nvme_apst_entry.28
-rw-r--r--doc/man/nvme_boot_partition.24
-rw-r--r--doc/man/nvme_cap_config_desc.20
-rw-r--r--doc/man/nvme_capacity_config_desc.233
-rw-r--r--doc/man/nvme_capacity_mgmt.24
-rw-r--r--doc/man/nvme_capacity_mgmt_args.245
-rw-r--r--doc/man/nvme_change_ns_event.24
-rw-r--r--doc/man/nvme_channel_config_desc.210
-rw-r--r--doc/man/nvme_cmb_size.26
-rw-r--r--doc/man/nvme_cmd_effects.24
-rw-r--r--doc/man/nvme_cmd_effects_log.24
-rw-r--r--doc/man/nvme_cmd_format_mset.22
-rw-r--r--doc/man/nvme_cmd_format_pi.22
-rw-r--r--doc/man/nvme_cmd_format_pil.22
-rw-r--r--doc/man/nvme_cmd_format_ses.22
-rw-r--r--doc/man/nvme_cmd_get_log_lid.24
-rw-r--r--doc/man/nvme_cmd_get_log_telemetry_host_lsp.26
-rw-r--r--doc/man/nvme_compare.22
-rw-r--r--doc/man/nvme_connect_err.232
-rw-r--r--doc/man/nvme_constants.26
-rw-r--r--doc/man/nvme_copy.24
-rw-r--r--doc/man/nvme_copy_args.283
-rw-r--r--doc/man/nvme_copy_range.27
-rw-r--r--doc/man/nvme_create_ctrl.22
-rw-r--r--doc/man/nvme_create_root.22
-rw-r--r--doc/man/nvme_csi.22
-rw-r--r--doc/man/nvme_ctrl_first_ns.22
-rw-r--r--doc/man/nvme_ctrl_first_path.22
-rw-r--r--doc/man/nvme_ctrl_for_each_ns.22
-rw-r--r--doc/man/nvme_ctrl_for_each_ns_safe.22
-rw-r--r--doc/man/nvme_ctrl_for_each_path.22
-rw-r--r--doc/man/nvme_ctrl_for_each_path_safe.22
-rw-r--r--doc/man/nvme_ctrl_get_address.22
-rw-r--r--doc/man/nvme_ctrl_get_config.22
-rw-r--r--doc/man/nvme_ctrl_get_dhchap_key.22
-rw-r--r--doc/man/nvme_ctrl_get_fd.22
-rw-r--r--doc/man/nvme_ctrl_get_firmware.22
-rw-r--r--doc/man/nvme_ctrl_get_host_iface.22
-rw-r--r--doc/man/nvme_ctrl_get_host_traddr.22
-rw-r--r--doc/man/nvme_ctrl_get_model.22
-rw-r--r--doc/man/nvme_ctrl_get_name.22
-rw-r--r--doc/man/nvme_ctrl_get_numa_node.22
-rw-r--r--doc/man/nvme_ctrl_get_queue_count.22
-rw-r--r--doc/man/nvme_ctrl_get_serial.24
-rw-r--r--doc/man/nvme_ctrl_get_sqsize.22
-rw-r--r--doc/man/nvme_ctrl_get_state.22
-rw-r--r--doc/man/nvme_ctrl_get_subsysnqn.22
-rw-r--r--doc/man/nvme_ctrl_get_subsystem.22
-rw-r--r--doc/man/nvme_ctrl_get_sysfs_dir.22
-rw-r--r--doc/man/nvme_ctrl_get_traddr.22
-rw-r--r--doc/man/nvme_ctrl_get_transport.22
-rw-r--r--doc/man/nvme_ctrl_get_trsvcid.22
-rw-r--r--doc/man/nvme_ctrl_identify.22
-rw-r--r--doc/man/nvme_ctrl_is_discovered.22
-rw-r--r--doc/man/nvme_ctrl_is_discovery_ctrl.22
-rw-r--r--doc/man/nvme_ctrl_is_persistent.22
-rw-r--r--doc/man/nvme_ctrl_list.24
-rw-r--r--doc/man/nvme_ctrl_metadata_type.24
-rw-r--r--doc/man/nvme_ctrl_next_ns.22
-rw-r--r--doc/man/nvme_ctrl_next_path.22
-rw-r--r--doc/man/nvme_ctrl_reset.22
-rw-r--r--doc/man/nvme_ctrl_set_dhchap_key.22
-rw-r--r--doc/man/nvme_ctrl_set_discovered.22
-rw-r--r--doc/man/nvme_ctrl_set_discovery_ctrl.22
-rw-r--r--doc/man/nvme_ctrl_set_persistent.22
-rw-r--r--doc/man/nvme_ctrls_filter.22
-rw-r--r--doc/man/nvme_default_host.22
-rw-r--r--doc/man/nvme_dev_self_test.22
-rw-r--r--doc/man/nvme_dev_self_test_args.235
-rw-r--r--doc/man/nvme_dim_args.239
-rw-r--r--doc/man/nvme_directive_dtype.24
-rw-r--r--doc/man/nvme_directive_receive_doper.24
-rw-r--r--doc/man/nvme_directive_recv.22
-rw-r--r--doc/man/nvme_directive_recv_args.255
-rw-r--r--doc/man/nvme_directive_recv_identify_parameters.24
-rw-r--r--doc/man/nvme_directive_recv_stream_allocate.24
-rw-r--r--doc/man/nvme_directive_recv_stream_parameters.24
-rw-r--r--doc/man/nvme_directive_recv_stream_status.26
-rw-r--r--doc/man/nvme_directive_send.22
-rw-r--r--doc/man/nvme_directive_send_args.255
-rw-r--r--doc/man/nvme_directive_send_doper.24
-rw-r--r--doc/man/nvme_directive_send_id_endir.24
-rw-r--r--doc/man/nvme_directive_send_identify_endir.24
-rw-r--r--doc/man/nvme_directive_send_stream_release_identifier.24
-rw-r--r--doc/man/nvme_directive_send_stream_release_resource.24
-rw-r--r--doc/man/nvme_directive_types.24
-rw-r--r--doc/man/nvme_disconnect_ctrl.22
-rw-r--r--doc/man/nvme_dsm.22
-rw-r--r--doc/man/nvme_dsm_args.243
-rw-r--r--doc/man/nvme_dsm_attributes.210
-rw-r--r--doc/man/nvme_dsm_range.24
-rw-r--r--doc/man/nvme_dst_stc.22
-rw-r--r--doc/man/nvme_dump_config.22
-rw-r--r--doc/man/nvme_dump_tree.22
-rw-r--r--doc/man/nvme_eg_critical_warning_flags.29
-rw-r--r--doc/man/nvme_eg_event_aggregate_log.24
-rw-r--r--doc/man/nvme_end_grp_chan_desc.210
-rw-r--r--doc/man/nvme_end_grp_config_desc.211
-rw-r--r--doc/man/nvme_endurance_group_log.24
-rw-r--r--doc/man/nvme_err_pel.216
-rw-r--r--doc/man/nvme_errno_to_string.22
-rw-r--r--doc/man/nvme_error_log_page.22
-rw-r--r--doc/man/nvme_fabrics_config.22
-rw-r--r--doc/man/nvme_fctype.24
-rw-r--r--doc/man/nvme_feat.24
-rw-r--r--doc/man/nvme_feat_auto_pst.24
-rw-r--r--doc/man/nvme_feat_host_behavior.24
-rw-r--r--doc/man/nvme_feat_nswpcfg_state.24
-rw-r--r--doc/man/nvme_feat_plm_window_select.24
-rw-r--r--doc/man/nvme_feat_resv_notify_flags.24
-rw-r--r--doc/man/nvme_feat_tmpthresh_thsel.24
-rw-r--r--doc/man/nvme_features_async_event_config_flags.24
-rw-r--r--doc/man/nvme_features_id.24
-rw-r--r--doc/man/nvme_fid_supported_effects.220
-rw-r--r--doc/man/nvme_fid_supported_effects_log.26
-rw-r--r--doc/man/nvme_firmware_slot.24
-rw-r--r--doc/man/nvme_first_host.22
-rw-r--r--doc/man/nvme_first_subsystem.22
-rw-r--r--doc/man/nvme_flush.22
-rw-r--r--doc/man/nvme_for_each_host.22
-rw-r--r--doc/man/nvme_for_each_host_safe.22
-rw-r--r--doc/man/nvme_for_each_subsystem.22
-rw-r--r--doc/man/nvme_for_each_subsystem_safe.22
-rw-r--r--doc/man/nvme_format_nvm.22
-rw-r--r--doc/man/nvme_format_nvm_args.252
-rw-r--r--doc/man/nvme_format_nvm_compln_event.24
-rw-r--r--doc/man/nvme_format_nvm_start_event.24
-rw-r--r--doc/man/nvme_free_ctrl.22
-rw-r--r--doc/man/nvme_free_host.22
-rw-r--r--doc/man/nvme_free_ns.22
-rw-r--r--doc/man/nvme_free_subsystem.22
-rw-r--r--doc/man/nvme_free_tree.22
-rw-r--r--doc/man/nvme_fw_commit.22
-rw-r--r--doc/man/nvme_fw_commit_args.239
-rw-r--r--doc/man/nvme_fw_commit_ca.26
-rw-r--r--doc/man/nvme_fw_commit_event.24
-rw-r--r--doc/man/nvme_fw_download.22
-rw-r--r--doc/man/nvme_fw_download_args.239
-rw-r--r--doc/man/nvme_fw_download_seq.24
-rw-r--r--doc/man/nvme_gen_dhchap_key.22
-rw-r--r--doc/man/nvme_get_ana_log_len.24
-rw-r--r--doc/man/nvme_get_attr.22
-rw-r--r--doc/man/nvme_get_ctrl_attr.22
-rw-r--r--doc/man/nvme_get_ctrl_telemetry.22
-rw-r--r--doc/man/nvme_get_directive_receive_length.24
-rw-r--r--doc/man/nvme_get_feature_length.22
-rw-r--r--doc/man/nvme_get_features.22
-rw-r--r--doc/man/nvme_get_features_arbitration.24
-rw-r--r--doc/man/nvme_get_features_args.256
-rw-r--r--doc/man/nvme_get_features_async_event.24
-rw-r--r--doc/man/nvme_get_features_auto_pst.24
-rw-r--r--doc/man/nvme_get_features_data.25
-rw-r--r--doc/man/nvme_get_features_endurance_event_cfg.24
-rw-r--r--doc/man/nvme_get_features_err_recovery.24
-rw-r--r--doc/man/nvme_get_features_hctm.24
-rw-r--r--doc/man/nvme_get_features_host_behavior.26
-rw-r--r--doc/man/nvme_get_features_host_id.24
-rw-r--r--doc/man/nvme_get_features_host_mem_buf.24
-rw-r--r--doc/man/nvme_get_features_iocs_profile.24
-rw-r--r--doc/man/nvme_get_features_irq_coalesce.24
-rw-r--r--doc/man/nvme_get_features_irq_config.24
-rw-r--r--doc/man/nvme_get_features_kato.24
-rw-r--r--doc/man/nvme_get_features_lba_range.24
-rw-r--r--doc/man/nvme_get_features_lba_sts_interval.24
-rw-r--r--doc/man/nvme_get_features_nopsc.24
-rw-r--r--doc/man/nvme_get_features_num_queues.24
-rw-r--r--doc/man/nvme_get_features_plm_config.24
-rw-r--r--doc/man/nvme_get_features_plm_window.24
-rw-r--r--doc/man/nvme_get_features_power_mgmt.24
-rw-r--r--doc/man/nvme_get_features_resv_mask.24
-rw-r--r--doc/man/nvme_get_features_resv_persist.24
-rw-r--r--doc/man/nvme_get_features_rrl.24
-rw-r--r--doc/man/nvme_get_features_sanitize.24
-rw-r--r--doc/man/nvme_get_features_sel.24
-rw-r--r--doc/man/nvme_get_features_simple.25
-rw-r--r--doc/man/nvme_get_features_sw_progress.24
-rw-r--r--doc/man/nvme_get_features_temp_thresh.24
-rw-r--r--doc/man/nvme_get_features_timestamp.24
-rw-r--r--doc/man/nvme_get_features_volatile_wc.24
-rw-r--r--doc/man/nvme_get_features_write_atomic.24
-rw-r--r--doc/man/nvme_get_features_write_protect.24
-rw-r--r--doc/man/nvme_get_host_telemetry.22
-rw-r--r--doc/man/nvme_get_lba_status.22
-rw-r--r--doc/man/nvme_get_lba_status_args.252
-rw-r--r--doc/man/nvme_get_lba_status_log.26
-rw-r--r--doc/man/nvme_get_log.22
-rw-r--r--doc/man/nvme_get_log_ana.26
-rw-r--r--doc/man/nvme_get_log_ana_groups.29
-rw-r--r--doc/man/nvme_get_log_args.274
-rw-r--r--doc/man/nvme_get_log_boot_partition.24
-rw-r--r--doc/man/nvme_get_log_changed_ns_list.22
-rw-r--r--doc/man/nvme_get_log_cmd_effects.22
-rw-r--r--doc/man/nvme_get_log_create_telemetry_host.25
-rw-r--r--doc/man/nvme_get_log_device_self_test.22
-rw-r--r--doc/man/nvme_get_log_discovery.24
-rw-r--r--doc/man/nvme_get_log_endurance_group.24
-rw-r--r--doc/man/nvme_get_log_endurance_grp_evt.27
-rw-r--r--doc/man/nvme_get_log_error.24
-rw-r--r--doc/man/nvme_get_log_fid_supported_effects.24
-rw-r--r--doc/man/nvme_get_log_fw_slot.22
-rw-r--r--doc/man/nvme_get_log_lba_status.27
-rw-r--r--doc/man/nvme_get_log_media_unit_stat.24
-rw-r--r--doc/man/nvme_get_log_mi_cmd_supported_effects.24
-rw-r--r--doc/man/nvme_get_log_page.22
-rw-r--r--doc/man/nvme_get_log_persistent_event.27
-rw-r--r--doc/man/nvme_get_log_predictable_lat_event.27
-rw-r--r--doc/man/nvme_get_log_predictable_lat_nvmset.24
-rw-r--r--doc/man/nvme_get_log_reservation.27
-rw-r--r--doc/man/nvme_get_log_sanitize.24
-rw-r--r--doc/man/nvme_get_log_smart.22
-rw-r--r--doc/man/nvme_get_log_support_cap_config_list.26
-rw-r--r--doc/man/nvme_get_log_supported_log_pages.22
-rw-r--r--doc/man/nvme_get_log_telemetry_ctrl.210
-rw-r--r--doc/man/nvme_get_log_telemetry_host.26
-rw-r--r--doc/man/nvme_get_log_zns_changed_zones.24
-rw-r--r--doc/man/nvme_get_logical_block_size.22
-rw-r--r--doc/man/nvme_get_new_host_telemetry.22
-rw-r--r--doc/man/nvme_get_ns_attr.22
-rw-r--r--doc/man/nvme_get_nsid.22
-rw-r--r--doc/man/nvme_get_path_attr.22
-rw-r--r--doc/man/nvme_get_property.22
-rw-r--r--doc/man/nvme_get_property_args.231
-rw-r--r--doc/man/nvme_get_subsys_attr.22
-rw-r--r--doc/man/nvme_hmac_alg.22
-rw-r--r--doc/man/nvme_host_behavior_support.24
-rw-r--r--doc/man/nvme_host_get_dhchap_key.22
-rw-r--r--doc/man/nvme_host_get_hostid.22
-rw-r--r--doc/man/nvme_host_get_hostnqn.22
-rw-r--r--doc/man/nvme_host_get_hostsymname.22
-rw-r--r--doc/man/nvme_host_get_root.22
-rw-r--r--doc/man/nvme_host_mem_buf_attrs.24
-rw-r--r--doc/man/nvme_host_metadata.22
-rw-r--r--doc/man/nvme_host_set_dhchap_key.22
-rw-r--r--doc/man/nvme_host_set_hostsymname.22
-rw-r--r--doc/man/nvme_id_ctrl.216
-rw-r--r--doc/man/nvme_id_ctrl_anacap.22
-rw-r--r--doc/man/nvme_id_ctrl_apsta.22
-rw-r--r--doc/man/nvme_id_ctrl_avscc.22
-rw-r--r--doc/man/nvme_id_ctrl_cmic.22
-rw-r--r--doc/man/nvme_id_ctrl_cntrltype.22
-rw-r--r--doc/man/nvme_id_ctrl_cqes.22
-rw-r--r--doc/man/nvme_id_ctrl_ctratt.24
-rw-r--r--doc/man/nvme_id_ctrl_dctype.22
-rw-r--r--doc/man/nvme_id_ctrl_dsto.22
-rw-r--r--doc/man/nvme_id_ctrl_fcatt.22
-rw-r--r--doc/man/nvme_id_ctrl_fna.211
-rw-r--r--doc/man/nvme_id_ctrl_frmw.210
-rw-r--r--doc/man/nvme_id_ctrl_fuses.22
-rw-r--r--doc/man/nvme_id_ctrl_hctm.22
-rw-r--r--doc/man/nvme_id_ctrl_lpa.236
-rw-r--r--doc/man/nvme_id_ctrl_mec.24
-rw-r--r--doc/man/nvme_id_ctrl_nvm.24
-rw-r--r--doc/man/nvme_id_ctrl_nvmsr.22
-rw-r--r--doc/man/nvme_id_ctrl_nvscc.24
-rw-r--r--doc/man/nvme_id_ctrl_nwpc.22
-rw-r--r--doc/man/nvme_id_ctrl_oacs.29
-rw-r--r--doc/man/nvme_id_ctrl_oaes.22
-rw-r--r--doc/man/nvme_id_ctrl_ofcs.22
-rw-r--r--doc/man/nvme_id_ctrl_oncs.29
-rw-r--r--doc/man/nvme_id_ctrl_rpmbs.22
-rw-r--r--doc/man/nvme_id_ctrl_sanicap.22
-rw-r--r--doc/man/nvme_id_ctrl_sgls.22
-rw-r--r--doc/man/nvme_id_ctrl_sqes.22
-rw-r--r--doc/man/nvme_id_ctrl_vwc.24
-rw-r--r--doc/man/nvme_id_ctrl_vwci.22
-rw-r--r--doc/man/nvme_id_directives.24
-rw-r--r--doc/man/nvme_id_domain_attr.22
-rw-r--r--doc/man/nvme_id_domain_list.24
-rw-r--r--doc/man/nvme_id_endurance_group_list.24
-rw-r--r--doc/man/nvme_id_independent_id_ns.24
-rw-r--r--doc/man/nvme_id_iocs.22
-rw-r--r--doc/man/nvme_id_ns.22
-rw-r--r--doc/man/nvme_id_ns_attr.22
-rw-r--r--doc/man/nvme_id_ns_dlfeat.22
-rw-r--r--doc/man/nvme_id_ns_dpc.22
-rw-r--r--doc/man/nvme_id_ns_dps.22
-rw-r--r--doc/man/nvme_id_ns_flbas.22
-rw-r--r--doc/man/nvme_id_ns_granularity_desc.24
-rw-r--r--doc/man/nvme_id_ns_granularity_list.24
-rw-r--r--doc/man/nvme_id_ns_mc.22
-rw-r--r--doc/man/nvme_id_ns_nmic.22
-rw-r--r--doc/man/nvme_id_ns_rescap.22
-rw-r--r--doc/man/nvme_id_nsfeat.22
-rw-r--r--doc/man/nvme_id_nvmset_list.24
-rw-r--r--doc/man/nvme_id_psd.26
-rw-r--r--doc/man/nvme_id_uuid.24
-rw-r--r--doc/man/nvme_id_uuid_list.24
-rw-r--r--doc/man/nvme_id_uuid_list_entry.24
-rw-r--r--doc/man/nvme_identify.22
-rw-r--r--doc/man/nvme_identify_active_ns_list.24
-rw-r--r--doc/man/nvme_identify_active_ns_list_csi.22
-rw-r--r--doc/man/nvme_identify_allocated_ns.22
-rw-r--r--doc/man/nvme_identify_allocated_ns_list.24
-rw-r--r--doc/man/nvme_identify_allocated_ns_list_csi.22
-rw-r--r--doc/man/nvme_identify_args.255
-rw-r--r--doc/man/nvme_identify_cns.215
-rw-r--r--doc/man/nvme_identify_ctrl.22
-rw-r--r--doc/man/nvme_identify_ctrl_csi.22
-rw-r--r--doc/man/nvme_identify_ctrl_list.22
-rw-r--r--doc/man/nvme_identify_domain_list.24
-rw-r--r--doc/man/nvme_identify_endurance_group_list.22
-rw-r--r--doc/man/nvme_identify_independent_identify_ns.22
-rw-r--r--doc/man/nvme_identify_iocs.22
-rw-r--r--doc/man/nvme_identify_iocs_ns_csi_user_data_format.26
-rw-r--r--doc/man/nvme_identify_ns.22
-rw-r--r--doc/man/nvme_identify_ns_csi.24
-rw-r--r--doc/man/nvme_identify_ns_csi_user_data_format.26
-rw-r--r--doc/man/nvme_identify_ns_descs.26
-rw-r--r--doc/man/nvme_identify_ns_granularity.22
-rw-r--r--doc/man/nvme_identify_nsid_ctrl_list.22
-rw-r--r--doc/man/nvme_identify_nvmset_list.24
-rw-r--r--doc/man/nvme_identify_primary_ctrl.24
-rw-r--r--doc/man/nvme_identify_secondary_ctrl_list.24
-rw-r--r--doc/man/nvme_identify_uuid.22
-rw-r--r--doc/man/nvme_init_copy_range.22
-rw-r--r--doc/man/nvme_init_ctrl.22
-rw-r--r--doc/man/nvme_init_ctrl_list.22
-rw-r--r--doc/man/nvme_init_dsm_range.22
-rw-r--r--doc/man/nvme_init_logging.22
-rw-r--r--doc/man/nvme_io.22
-rw-r--r--doc/man/nvme_io_args.291
-rw-r--r--doc/man/nvme_io_control_flags.210
-rw-r--r--doc/man/nvme_io_dsm_flags.24
-rw-r--r--doc/man/nvme_io_opcode.24
-rw-r--r--doc/man/nvme_io_passthru.28
-rw-r--r--doc/man/nvme_lba_range_type.26
-rw-r--r--doc/man/nvme_lba_range_type_entry.24
-rw-r--r--doc/man/nvme_lba_rd.24
-rw-r--r--doc/man/nvme_lba_status.24
-rw-r--r--doc/man/nvme_lba_status_atype.27
-rw-r--r--doc/man/nvme_lba_status_desc.24
-rw-r--r--doc/man/nvme_lba_status_log.24
-rw-r--r--doc/man/nvme_lbaf.22
-rw-r--r--doc/man/nvme_lbaf_rp.22
-rw-r--r--doc/man/nvme_lbart.24
-rw-r--r--doc/man/nvme_lbas_ns_element.26
-rw-r--r--doc/man/nvme_lockdown.22
-rw-r--r--doc/man/nvme_lockdown_args.247
-rw-r--r--doc/man/nvme_log_ana_lsp.24
-rw-r--r--doc/man/nvme_lookup_ctrl.22
-rw-r--r--doc/man/nvme_lookup_host.22
-rw-r--r--doc/man/nvme_lookup_subsystem.26
-rw-r--r--doc/man/nvme_media_unit_config_desc.29
-rw-r--r--doc/man/nvme_media_unit_stat_desc.24
-rw-r--r--doc/man/nvme_media_unit_stat_log.24
-rw-r--r--doc/man/nvme_metadata_element_desc.22
-rw-r--r--doc/man/nvme_mi_admin_get_log_page.224
-rw-r--r--doc/man/nvme_mi_admin_identify.223
-rw-r--r--doc/man/nvme_mi_admin_identify_cns_nsid.229
-rw-r--r--doc/man/nvme_mi_admin_identify_ctrl.223
-rw-r--r--doc/man/nvme_mi_admin_identify_ctrl_list.226
-rw-r--r--doc/man/nvme_mi_admin_identify_partial.236
-rw-r--r--doc/man/nvme_mi_admin_req_hdr.272
-rw-r--r--doc/man/nvme_mi_admin_resp_hdr.234
-rw-r--r--doc/man/nvme_mi_admin_security_recv.224
-rw-r--r--doc/man/nvme_mi_admin_security_send.224
-rw-r--r--doc/man/nvme_mi_admin_xfer.241
-rw-r--r--doc/man/nvme_mi_ccs.278
-rw-r--r--doc/man/nvme_mi_close.29
-rw-r--r--doc/man/nvme_mi_close_ctrl.29
-rw-r--r--doc/man/nvme_mi_cmd_supported_effects.28
-rw-r--r--doc/man/nvme_mi_cmd_supported_effects_log.28
-rw-r--r--doc/man/nvme_mi_config_id.231
-rw-r--r--doc/man/nvme_mi_config_smbus_freq.227
-rw-r--r--doc/man/nvme_mi_create_root.220
-rw-r--r--doc/man/nvme_mi_css.278
-rw-r--r--doc/man/nvme_mi_csts.24
-rw-r--r--doc/man/nvme_mi_ctrl_health_status.24
-rw-r--r--doc/man/nvme_mi_cwarn.24
-rw-r--r--doc/man/nvme_mi_dtyp.245
-rw-r--r--doc/man/nvme_mi_elem.24
-rw-r--r--doc/man/nvme_mi_free_root.29
-rw-r--r--doc/man/nvme_mi_init_ctrl.220
-rw-r--r--doc/man/nvme_mi_message_type.233
-rw-r--r--doc/man/nvme_mi_mi_opcode.230
-rw-r--r--doc/man/nvme_mi_mi_read_mi_data_ctrl.222
-rw-r--r--doc/man/nvme_mi_mi_read_mi_data_ctrl_list.222
-rw-r--r--doc/man/nvme_mi_mi_read_mi_data_port.223
-rw-r--r--doc/man/nvme_mi_mi_read_mi_data_subsys.217
-rw-r--r--doc/man/nvme_mi_mi_req_hdr.231
-rw-r--r--doc/man/nvme_mi_mi_resp_hdr.225
-rw-r--r--doc/man/nvme_mi_mi_subsystem_health_status_poll.223
-rw-r--r--doc/man/nvme_mi_msg_hdr.230
-rw-r--r--doc/man/nvme_mi_msg_resp.226
-rw-r--r--doc/man/nvme_mi_nvm_ss_health_status.24
-rw-r--r--doc/man/nvme_mi_open_mctp.222
-rw-r--r--doc/man/nvme_mi_osc.24
-rw-r--r--doc/man/nvme_mi_port_pcie.24
-rw-r--r--doc/man/nvme_mi_port_smb.24
-rw-r--r--doc/man/nvme_mi_read_ctrl_info.24
-rw-r--r--doc/man/nvme_mi_read_nvm_ss_info.24
-rw-r--r--doc/man/nvme_mi_read_port_info.24
-rw-r--r--doc/man/nvme_mi_read_sc_list.27
-rw-r--r--doc/man/nvme_mi_resp_status.2120
-rw-r--r--doc/man/nvme_mi_vpd_hdr.24
-rw-r--r--doc/man/nvme_mi_vpd_mr_common.24
-rw-r--r--doc/man/nvme_mi_vpd_mra.26
-rw-r--r--doc/man/nvme_mi_vpd_ppmra.24
-rw-r--r--doc/man/nvme_mi_vpd_telem.24
-rw-r--r--doc/man/nvme_mi_vpd_tra.24
-rw-r--r--doc/man/nvme_namespace_attach_ctrls.22
-rw-r--r--doc/man/nvme_namespace_detach_ctrls.22
-rw-r--r--doc/man/nvme_namespace_filter.22
-rw-r--r--doc/man/nvme_namespace_first_path.22
-rw-r--r--doc/man/nvme_namespace_for_each_path.28
-rw-r--r--doc/man/nvme_namespace_for_each_path_safe.24
-rw-r--r--doc/man/nvme_namespace_next_path.28
-rw-r--r--doc/man/nvme_nd_ns_fpi.22
-rw-r--r--doc/man/nvme_next_host.22
-rw-r--r--doc/man/nvme_next_subsystem.22
-rw-r--r--doc/man/nvme_ns_attach.25
-rw-r--r--doc/man/nvme_ns_attach_args.239
-rw-r--r--doc/man/nvme_ns_attach_ctrls.27
-rw-r--r--doc/man/nvme_ns_attach_sel.24
-rw-r--r--doc/man/nvme_ns_compare.22
-rw-r--r--doc/man/nvme_ns_detach_ctrls.27
-rw-r--r--doc/man/nvme_ns_flush.22
-rw-r--r--doc/man/nvme_ns_get_csi.22
-rw-r--r--doc/man/nvme_ns_get_ctrl.22
-rw-r--r--doc/man/nvme_ns_get_fd.24
-rw-r--r--doc/man/nvme_ns_get_firmware.22
-rw-r--r--doc/man/nvme_ns_get_generic_name.22
-rw-r--r--doc/man/nvme_ns_get_lba_count.22
-rw-r--r--doc/man/nvme_ns_get_lba_size.22
-rw-r--r--doc/man/nvme_ns_get_lba_util.26
-rw-r--r--doc/man/nvme_ns_get_meta_size.22
-rw-r--r--doc/man/nvme_ns_get_model.22
-rw-r--r--doc/man/nvme_ns_get_name.22
-rw-r--r--doc/man/nvme_ns_get_nguid.22
-rw-r--r--doc/man/nvme_ns_get_nsid.22
-rw-r--r--doc/man/nvme_ns_get_serial.22
-rw-r--r--doc/man/nvme_ns_get_subsystem.22
-rw-r--r--doc/man/nvme_ns_get_sysfs_dir.22
-rw-r--r--doc/man/nvme_ns_get_uuid.22
-rw-r--r--doc/man/nvme_ns_id_desc.24
-rw-r--r--doc/man/nvme_ns_id_desc_nidt.24
-rw-r--r--doc/man/nvme_ns_identify.22
-rw-r--r--doc/man/nvme_ns_identify_descs.22
-rw-r--r--doc/man/nvme_ns_list.24
-rw-r--r--doc/man/nvme_ns_metadata_type.24
-rw-r--r--doc/man/nvme_ns_mgmt.25
-rw-r--r--doc/man/nvme_ns_mgmt_args.243
-rw-r--r--doc/man/nvme_ns_mgmt_create.26
-rw-r--r--doc/man/nvme_ns_mgmt_delete.24
-rw-r--r--doc/man/nvme_ns_mgmt_sel.24
-rw-r--r--doc/man/nvme_ns_read.22
-rw-r--r--doc/man/nvme_ns_rescan.22
-rw-r--r--doc/man/nvme_ns_verify.22
-rw-r--r--doc/man/nvme_ns_write.22
-rw-r--r--doc/man/nvme_ns_write_protect_cfg.24
-rw-r--r--doc/man/nvme_ns_write_uncorrectable.22
-rw-r--r--doc/man/nvme_ns_write_zeros.22
-rw-r--r--doc/man/nvme_nss_hw_err_event.24
-rw-r--r--doc/man/nvme_nvm_id_ns.24
-rw-r--r--doc/man/nvme_nvm_id_ns_elbaf.220
-rw-r--r--doc/man/nvme_nvm_identify_ctrl.22
-rw-r--r--doc/man/nvme_nvmeset_pl_status.27
-rw-r--r--doc/man/nvme_nvmset_attr.22
-rw-r--r--doc/man/nvme_nvmset_pl_events.213
-rw-r--r--doc/man/nvme_nvmset_predictable_lat_log.24
-rw-r--r--doc/man/nvme_open.22
-rw-r--r--doc/man/nvme_passthru_cmd.22
-rw-r--r--doc/man/nvme_path_get_ana_state.22
-rw-r--r--doc/man/nvme_path_get_ctrl.22
-rw-r--r--doc/man/nvme_path_get_name.22
-rw-r--r--doc/man/nvme_path_get_ns.22
-rw-r--r--doc/man/nvme_path_get_sysfs_dir.22
-rw-r--r--doc/man/nvme_paths_filter.22
-rw-r--r--doc/man/nvme_persistent_event_entry.24
-rw-r--r--doc/man/nvme_persistent_event_log.24
-rw-r--r--doc/man/nvme_persistent_event_types.217
-rw-r--r--doc/man/nvme_pevent_log_action.24
-rw-r--r--doc/man/nvme_plm_config.24
-rw-r--r--doc/man/nvme_pmr_size.26
-rw-r--r--doc/man/nvme_pmr_throughput.26
-rw-r--r--doc/man/nvme_power_on_reset_info_list.24
-rw-r--r--doc/man/nvme_primary_ctrl_cap.24
-rw-r--r--doc/man/nvme_psd_flags.22
-rw-r--r--doc/man/nvme_psd_power_scale.24
-rw-r--r--doc/man/nvme_psd_ps.28
-rw-r--r--doc/man/nvme_psd_workload.28
-rw-r--r--doc/man/nvme_read.22
-rw-r--r--doc/man/nvme_read_config.22
-rw-r--r--doc/man/nvme_refresh_topology.22
-rw-r--r--doc/man/nvme_register_offsets.28
-rw-r--r--doc/man/nvme_registered_ctrl.24
-rw-r--r--doc/man/nvme_registered_ctrl_ext.24
-rw-r--r--doc/man/nvme_rescan_ctrl.22
-rw-r--r--doc/man/nvme_resv_acquire.22
-rw-r--r--doc/man/nvme_resv_acquire_args.252
-rw-r--r--doc/man/nvme_resv_cptpl.24
-rw-r--r--doc/man/nvme_resv_notification_log.24
-rw-r--r--doc/man/nvme_resv_notify_rnlpt.28
-rw-r--r--doc/man/nvme_resv_racqa.24
-rw-r--r--doc/man/nvme_resv_register.22
-rw-r--r--doc/man/nvme_resv_register_args.252
-rw-r--r--doc/man/nvme_resv_release.22
-rw-r--r--doc/man/nvme_resv_release_args.247
-rw-r--r--doc/man/nvme_resv_report.24
-rw-r--r--doc/man/nvme_resv_report_args.244
-rw-r--r--doc/man/nvme_resv_rrega.24
-rw-r--r--doc/man/nvme_resv_rrela.24
-rw-r--r--doc/man/nvme_resv_rtype.24
-rw-r--r--doc/man/nvme_resv_status.24
-rw-r--r--doc/man/nvme_sanitize_compln_event.24
-rw-r--r--doc/man/nvme_sanitize_log_page.22
-rw-r--r--doc/man/nvme_sanitize_nvm.22
-rw-r--r--doc/man/nvme_sanitize_nvm_args.251
-rw-r--r--doc/man/nvme_sanitize_sanact.22
-rw-r--r--doc/man/nvme_sanitize_sstat.22
-rw-r--r--doc/man/nvme_sanitize_start_event.24
-rw-r--r--doc/man/nvme_scan.22
-rw-r--r--doc/man/nvme_scan_ctrl.22
-rw-r--r--doc/man/nvme_scan_ctrl_namespace_paths.22
-rw-r--r--doc/man/nvme_scan_ctrl_namespaces.22
-rw-r--r--doc/man/nvme_scan_ctrls.22
-rw-r--r--doc/man/nvme_scan_namespace.22
-rw-r--r--doc/man/nvme_scan_subsystem_namespaces.22
-rw-r--r--doc/man/nvme_scan_subsystems.22
-rw-r--r--doc/man/nvme_scan_topology.22
-rw-r--r--doc/man/nvme_secondary_ctrl.24
-rw-r--r--doc/man/nvme_secondary_ctrl_list.24
-rw-r--r--doc/man/nvme_security_receive.26
-rw-r--r--doc/man/nvme_security_receive_args.259
-rw-r--r--doc/man/nvme_security_send.24
-rw-r--r--doc/man/nvme_security_send_args.259
-rw-r--r--doc/man/nvme_self_test_log.22
-rw-r--r--doc/man/nvme_set_feature_event.24
-rw-r--r--doc/man/nvme_set_features.22
-rw-r--r--doc/man/nvme_set_features_arbitration.24
-rw-r--r--doc/man/nvme_set_features_args.265
-rw-r--r--doc/man/nvme_set_features_async_event.24
-rw-r--r--doc/man/nvme_set_features_auto_pst.24
-rw-r--r--doc/man/nvme_set_features_data.25
-rw-r--r--doc/man/nvme_set_features_endurance_evt_cfg.24
-rw-r--r--doc/man/nvme_set_features_err_recovery.24
-rw-r--r--doc/man/nvme_set_features_hctm.24
-rw-r--r--doc/man/nvme_set_features_host_behavior.24
-rw-r--r--doc/man/nvme_set_features_host_id.24
-rw-r--r--doc/man/nvme_set_features_irq_coalesce.24
-rw-r--r--doc/man/nvme_set_features_irq_config.24
-rw-r--r--doc/man/nvme_set_features_lba_range.24
-rw-r--r--doc/man/nvme_set_features_lba_sts_interval.24
-rw-r--r--doc/man/nvme_set_features_nopsc.24
-rw-r--r--doc/man/nvme_set_features_plm_config.26
-rw-r--r--doc/man/nvme_set_features_plm_window.24
-rw-r--r--doc/man/nvme_set_features_power_mgmt.24
-rw-r--r--doc/man/nvme_set_features_resv_mask.24
-rw-r--r--doc/man/nvme_set_features_resv_persist.24
-rw-r--r--doc/man/nvme_set_features_rrl.24
-rw-r--r--doc/man/nvme_set_features_sanitize.24
-rw-r--r--doc/man/nvme_set_features_simple.27
-rw-r--r--doc/man/nvme_set_features_sw_progress.24
-rw-r--r--doc/man/nvme_set_features_temp_thresh.24
-rw-r--r--doc/man/nvme_set_features_timestamp.26
-rw-r--r--doc/man/nvme_set_features_volatile_wc.24
-rw-r--r--doc/man/nvme_set_features_write_atomic.24
-rw-r--r--doc/man/nvme_set_features_write_protect.24
-rw-r--r--doc/man/nvme_set_property.22
-rw-r--r--doc/man/nvme_set_property_args.235
-rw-r--r--doc/man/nvme_smart_crit.22
-rw-r--r--doc/man/nvme_smart_egcw.22
-rw-r--r--doc/man/nvme_smart_log.22
-rw-r--r--doc/man/nvme_st_code.22
-rw-r--r--doc/man/nvme_st_curr_op.22
-rw-r--r--doc/man/nvme_st_result.22
-rw-r--r--doc/man/nvme_st_valid_diag_info.22
-rw-r--r--doc/man/nvme_status_code.25
-rw-r--r--doc/man/nvme_status_code_type.25
-rw-r--r--doc/man/nvme_status_field.213
-rw-r--r--doc/man/nvme_status_result.22
-rw-r--r--doc/man/nvme_status_to_errno.24
-rw-r--r--doc/man/nvme_status_to_string.24
-rw-r--r--doc/man/nvme_streams_directive_params.24
-rw-r--r--doc/man/nvme_streams_directive_status.24
-rw-r--r--doc/man/nvme_submit_admin_passthru.22
-rw-r--r--doc/man/nvme_submit_io_passthru.22
-rw-r--r--doc/man/nvme_subsys_filter.22
-rw-r--r--doc/man/nvme_subsys_type.22
-rw-r--r--doc/man/nvme_subsystem_first_ctrl.22
-rw-r--r--doc/man/nvme_subsystem_first_ns.22
-rw-r--r--doc/man/nvme_subsystem_for_each_ctrl.22
-rw-r--r--doc/man/nvme_subsystem_for_each_ctrl_safe.22
-rw-r--r--doc/man/nvme_subsystem_for_each_ns.22
-rw-r--r--doc/man/nvme_subsystem_for_each_ns_safe.22
-rw-r--r--doc/man/nvme_subsystem_get_host.22
-rw-r--r--doc/man/nvme_subsystem_get_name.22
-rw-r--r--doc/man/nvme_subsystem_get_nqn.24
-rw-r--r--doc/man/nvme_subsystem_get_sysfs_dir.22
-rw-r--r--doc/man/nvme_subsystem_get_type.22
-rw-r--r--doc/man/nvme_subsystem_lookup_namespace.22
-rw-r--r--doc/man/nvme_subsystem_next_ctrl.22
-rw-r--r--doc/man/nvme_subsystem_next_ns.22
-rw-r--r--doc/man/nvme_subsystem_reset.22
-rw-r--r--doc/man/nvme_supported_cap_config_list_log.214
-rw-r--r--doc/man/nvme_supported_log_pages.24
-rw-r--r--doc/man/nvme_telemetry_da.22
-rw-r--r--doc/man/nvme_telemetry_log.24
-rw-r--r--doc/man/nvme_thermal_exc_event.24
-rw-r--r--doc/man/nvme_time_stamp_change_event.24
-rw-r--r--doc/man/nvme_timestamp.24
-rw-r--r--doc/man/nvme_unlink_ctrl.22
-rw-r--r--doc/man/nvme_update_config.22
-rw-r--r--doc/man/nvme_uring_cmd.283
-rw-r--r--doc/man/nvme_verify.22
-rw-r--r--doc/man/nvme_version.218
-rw-r--r--doc/man/nvme_virt_mgmt_act.24
-rw-r--r--doc/man/nvme_virt_mgmt_rt.24
-rw-r--r--doc/man/nvme_virtual_mgmt.22
-rw-r--r--doc/man/nvme_virtual_mgmt_args.243
-rw-r--r--doc/man/nvme_write.22
-rw-r--r--doc/man/nvme_write_uncorrectable.22
-rw-r--r--doc/man/nvme_write_zeros.22
-rw-r--r--doc/man/nvme_zns_append.22
-rw-r--r--doc/man/nvme_zns_append_args.270
-rw-r--r--doc/man/nvme_zns_changed_zone_log.22
-rw-r--r--doc/man/nvme_zns_desc.24
-rw-r--r--doc/man/nvme_zns_id_ctrl.25
-rw-r--r--doc/man/nvme_zns_id_ns.22
-rw-r--r--doc/man/nvme_zns_identify_ctrl.22
-rw-r--r--doc/man/nvme_zns_identify_ns.22
-rw-r--r--doc/man/nvme_zns_lbafe.24
-rw-r--r--doc/man/nvme_zns_mgmt_recv.24
-rw-r--r--doc/man/nvme_zns_mgmt_recv_args.255
-rw-r--r--doc/man/nvme_zns_mgmt_send.24
-rw-r--r--doc/man/nvme_zns_mgmt_send_args.255
-rw-r--r--doc/man/nvme_zns_recv_action.24
-rw-r--r--doc/man/nvme_zns_report_options.24
-rw-r--r--doc/man/nvme_zns_report_zones.22
-rw-r--r--doc/man/nvme_zns_send_action.24
-rw-r--r--doc/man/nvme_zns_za.24
-rw-r--r--doc/man/nvme_zns_zs.24
-rw-r--r--doc/man/nvme_zns_zt.25
-rw-r--r--doc/man/nvme_zone_report.24
-rw-r--r--doc/man/nvmf_add_ctrl.22
-rw-r--r--doc/man/nvmf_addr_family.22
-rw-r--r--doc/man/nvmf_adrfam_str.22
-rw-r--r--doc/man/nvmf_cms_str.22
-rw-r--r--doc/man/nvmf_connect_data.22
-rw-r--r--doc/man/nvmf_connect_disc_entry.24
-rw-r--r--doc/man/nvmf_default_config.22
-rw-r--r--doc/man/nvmf_dim_data.22
-rw-r--r--doc/man/nvmf_dim_entfmt.22
-rw-r--r--doc/man/nvmf_dim_etype.22
-rw-r--r--doc/man/nvmf_dim_tas.22
-rw-r--r--doc/man/nvmf_disc_eflags.217
-rw-r--r--doc/man/nvmf_disc_log_entry.22
-rw-r--r--doc/man/nvmf_discovery_log.22
-rw-r--r--doc/man/nvmf_eflags_str.22
-rw-r--r--doc/man/nvmf_exat_len.22
-rw-r--r--doc/man/nvmf_exattype.22
-rw-r--r--doc/man/nvmf_ext_attr.22
-rw-r--r--doc/man/nvmf_ext_die.24
-rw-r--r--doc/man/nvmf_get_discovery_log.24
-rw-r--r--doc/man/nvmf_hostid_from_file.22
-rw-r--r--doc/man/nvmf_hostnqn_from_file.22
-rw-r--r--doc/man/nvmf_hostnqn_generate.22
-rw-r--r--doc/man/nvmf_prtype_str.22
-rw-r--r--doc/man/nvmf_qptype_str.22
-rw-r--r--doc/man/nvmf_rdma_cms.22
-rw-r--r--doc/man/nvmf_rdma_prtype.22
-rw-r--r--doc/man/nvmf_rdma_qptype.22
-rw-r--r--doc/man/nvmf_register_ctrl.22
-rw-r--r--doc/man/nvmf_sectype_str.22
-rw-r--r--doc/man/nvmf_subtype_str.22
-rw-r--r--doc/man/nvmf_tcp_sectype.22
-rw-r--r--doc/man/nvmf_treq.22
-rw-r--r--doc/man/nvmf_treq_str.22
-rw-r--r--doc/man/nvmf_trtype.22
-rw-r--r--doc/man/nvmf_trtype_str.22
-rw-r--r--doc/man/nvmf_update_config.22
-rw-r--r--doc/meson.build99
-rw-r--r--doc/mi.rst43
-rw-r--r--doc/mi.rst.in43
-rw-r--r--doc/quickstart.rst5
-rw-r--r--doc/quickstart.rst.in5
-rw-r--r--doc/rst/fabrics.rst446
-rw-r--r--doc/rst/filters.rst142
-rw-r--r--doc/rst/ioctl.rst4712
-rw-r--r--doc/rst/linux.rst342
-rw-r--r--doc/rst/log.rst30
-rw-r--r--doc/rst/meson.build36
-rw-r--r--doc/rst/mi.rst1590
-rw-r--r--doc/rst/tree.rst2108
-rw-r--r--doc/rst/types.rst10936
-rw-r--r--doc/rst/util.rst494
-rwxr-xr-xdoc/update-docs.sh24
-rw-r--r--examples/discover-loop.c2
-rw-r--r--examples/discover-loop.py1
-rw-r--r--examples/display-tree.c5
-rw-r--r--examples/meson.build15
-rw-r--r--examples/mi-mctp.c772
-rw-r--r--examples/telemetry-listen.c9
-rw-r--r--libnvme/__init__.py9
-rw-r--r--libnvme/meson.build6
-rw-r--r--libnvme/nvme.i2
-rwxr-xr-xlibnvme/tests/create-ctrl-obj.py1
-rwxr-xr-xmeson-vcs-tag.sh17
-rw-r--r--meson.build37
-rw-r--r--meson_options.txt5
-rw-r--r--pyproject.toml1
-rwxr-xr-xrelease.sh84
-rw-r--r--src/libnvme-mi.h24
-rw-r--r--src/libnvme-mi.map31
-rw-r--r--src/libnvme.map10
-rw-r--r--src/licenses/BSD-MIT17
-rw-r--r--src/licenses/CC028
-rw-r--r--src/meson.build69
-rw-r--r--src/nvme/api-types.h913
-rw-r--r--src/nvme/cleanup.c1
-rw-r--r--src/nvme/cleanup.h1
-rw-r--r--src/nvme/fabrics.c158
-rw-r--r--src/nvme/fabrics.h12
-rw-r--r--src/nvme/ioctl.c185
-rw-r--r--src/nvme/ioctl.h1312
-rw-r--r--src/nvme/linux.h10
-rw-r--r--src/nvme/log.c13
-rw-r--r--src/nvme/mi-mctp.c751
-rw-r--r--src/nvme/mi.c930
-rw-r--r--src/nvme/mi.h1111
-rw-r--r--src/nvme/private.h71
-rw-r--r--src/nvme/tree.c108
-rw-r--r--src/nvme/tree.h62
-rw-r--r--src/nvme/types.h3456
-rw-r--r--src/nvme/util.c39
-rw-r--r--src/nvme/util.h63
-rw-r--r--subprojects/uuid.wrap6
-rw-r--r--test/meson.build39
-rw-r--r--test/mi-mctp.c462
-rw-r--r--test/mi.c809
-rw-r--r--test/register.c2
-rw-r--r--test/test.c2
-rw-r--r--test/utils.c68
-rw-r--r--test/utils.h20
-rw-r--r--test/zns.c2
764 files changed, 32686 insertions, 5875 deletions
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..23c4cb3
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,7 @@
+---
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
diff --git a/.github/workflows/doc.yml b/.github/workflows/doc.yml
deleted file mode 100644
index 75afbc8..0000000
--- a/.github/workflows/doc.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-name: libnvme documenation CI
-
-on:
- push:
- branches: [ master ]
- pull_request:
- branches: [ master ]
-
-jobs:
- kernel_doc_job:
- runs-on: ubuntu-latest
- steps:
- - name: Check out repository code
- uses: actions/checkout@v2
- - name: Check documentation format
- run: |
- API_FILES="fabrics.h filters.h ioctl.h linux.h tree.h types.h"
- for file in $API_FILES; do
- ./doc/kernel-doc -v -none src/nvme/$file 2>&1 | sed -r 's/^([^:]+):([0-9]+): (warning|error):/::\3 file=\1,line=\2::/g'
- done
- shell: bash
diff --git a/.github/workflows/meson.yml b/.github/workflows/meson.yml
index c89de99..9006eae 100644
--- a/.github/workflows/meson.yml
+++ b/.github/workflows/meson.yml
@@ -14,15 +14,17 @@ jobs:
steps:
- name: install libraries
run: sudo apt-get install libjson-c-dev
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v1
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.x'
- uses: BSFishy/meson-build@v1.0.3
with:
setup-options: --werror
options: --verbose
action: test
# Preserve meson's log file on failure
- - uses: actions/upload-artifact@v1
+ - uses: actions/upload-artifact@v3
if: failure()
with:
name: Linux_Meson_Testlog
@@ -32,17 +34,41 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: install libraries
- run: sudo apt-get remove -y libssl-dev
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v1
+ run: sudo apt-get install -y libpam-dev libcap-ng-dev
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.x'
- uses: BSFishy/meson-build@v1.0.3
with:
- setup-options: --werror
+ setup-options: --werror --wrap-mode=forcefallback
options: --verbose
action: test
meson-version: 0.61.2
# Preserve meson's log file on failure
- - uses: actions/upload-artifact@v1
+ - uses: actions/upload-artifact@v3
+ if: failure()
+ with:
+ name: Linux_Meson_log
+ path: build/meson-logs/meson-log.txt
+
+ build-static:
+ runs-on: ubuntu-latest
+ steps:
+ - name: install libraries
+ run: sudo apt-get install -y libpam-dev libcap-ng-dev
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.x'
+ - uses: BSFishy/meson-build@v1.0.3
+ with:
+ setup-options: --werror --wrap-mode=forcefallback --default-library=static
+ options: --verbose
+ action: test
+ meson-version: 0.61.2
+ # Preserve meson's log file on failure
+ - uses: actions/upload-artifact@v3
if: failure()
with:
name: Linux_Meson_log
@@ -53,8 +79,10 @@ jobs:
steps:
- name: install libraries
run: sudo apt-get install libjson-c-dev lcov
- - uses: actions/checkout@v2
- - uses: actions/setup-python@v1
+ - uses: actions/checkout@v3
+ - uses: actions/setup-python@v4
+ with:
+ python-version: '3.x'
- uses: BSFishy/meson-build@v1.0.3
with:
setup-options: -Db_coverage=true --werror
@@ -64,6 +92,6 @@ jobs:
- name: Generate Coverage Report
# Can't use meson here, see https://github.com/mesonbuild/meson/issues/7895
run: ninja -C build coverage --verbose
- - uses: codecov/codecov-action@v1
+ - uses: codecov/codecov-action@v3
with:
fail_ci_if_error: false
diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml
index 7e451ef..dc2b6a6 100644
--- a/.github/workflows/python-publish.yml
+++ b/.github/workflows/python-publish.yml
@@ -1,67 +1,58 @@
-# This workflow will upload a Python Package using Twine when a release is created
-# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
-
-# This workflow uses actions that are not certified by GitHub.
-# They are provided by a third-party and are governed by
-# separate terms of service, privacy policy, and support
-# documentation.
-
name: Build and upload to PyPI
on:
push:
branches: [ master ]
+ tags:
+ - '**'
pull_request:
branches: [ master ]
workflow_dispatch:
jobs:
- build_wheels:
- name: Build wheels manylinux
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v2
-
- - name: Build wheels
- uses: pypa/cibuildwheel@v2.3.1
- env:
- CIBW_REPAIR_WHEEL_COMMAND_LINUX: ""
- CIBW_SKIP: "*-musllinux_*"
- CIBW_BEFORE_BUILD_LINUX: yum install -y openssl-devel libuuid-devel json-c-devel
- CIBW_BUILD_VERBOSITY: 1
-
- - uses: actions/upload-artifact@v2
- with:
- path: ./wheelhouse/*.whl
- retention-days: 5
-
build_sdist:
name: Build source distribution
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@v3
- name: Build sdist
run: pipx run build --sdist
- - uses: actions/upload-artifact@v2
+ - uses: actions/upload-artifact@v3
with:
path: dist/*.tar.gz
retention-days: 5
- upload_pypi:
- needs: [build_wheels, build_sdist]
+ upload_test_pypi:
+ needs: [build_sdist]
runs-on: ubuntu-latest
- if: github.event_name == 'release' && github.event.action == 'published'
+ if: startsWith(github.ref, 'refs/tags/v')
steps:
- - uses: actions/download-artifact@v2
+ - uses: actions/download-artifact@v3
with:
name: artifact
path: dist
- name: Publish package to TestPyPI
- uses: pypa/gh-action-pypi-publish@release/v1
+ uses: pypa/gh-action-pypi-publish@release/v1.5
with:
user: __token__
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
repository_url: https://test.pypi.org/legacy/
+
+ upload_pypi:
+ needs: [build_sdist]
+ runs-on: ubuntu-latest
+ if: startsWith(github.ref, 'refs/tags/v')
+ steps:
+ - uses: actions/download-artifact@v3
+ with:
+ name: artifact
+ path: dist
+
+ - name: Publish package to PyPI
+ uses: pypa/gh-action-pypi-publish@release/v1.5
+ with:
+ user: __token__
+ password: ${{ secrets.PYPI_API_TOKEN }}
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..db84ef5
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,19 @@
+name: Releases
+
+on:
+ push:
+ branches: [ master ]
+ tags:
+ - '**'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ if: startsWith(github.ref, 'refs/tags/v')
+ permissions:
+ contents: write
+ steps:
+ - uses: actions/checkout@v2
+ - uses: ncipollo/release-action@v1
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/README.md b/README.md
index 6871238..5ae11f0 100644
--- a/README.md
+++ b/README.md
@@ -18,18 +18,19 @@ The public specification is the authority to resolve any protocol
discrepencies with this library. For more info on NVM Express, please
see:
- http://nvmexpress.org
+ https://nvmexpress.org
Subscribe to linux-nvme@lists.infradead.org for linux-nvme related
discussions and development for both kernel and userspace. The list is
archived here:
- http://lists.infradead.org/mailman/listinfo/linux-nvme
+ https://lists.infradead.org/mailman/listinfo/linux-nvme
# License
Except where otherwise stated, all software contained within this repo
-is currently licensed LGPL, see COPYING for more information.
+is currently licensed LGPL-2.1-or-later, see COPYING for more
+information.
Keith Busch 2020-02-06
@@ -56,6 +57,11 @@ please consult the following sites:
**meson repo**: https://github.com/mesonbuild/meson
+## Dependency
+
+libnvme depends on minimum Linux kernel version v4.15, which
+introduced the /sys/class/nvme-subsystem.
+
## Prerequisite
First, install meson.
diff --git a/doc/api.rst b/doc/api.rst
new file mode 100644
index 0000000..3478766
--- /dev/null
+++ b/doc/api.rst
@@ -0,0 +1,18 @@
+===
+API
+===
+
+.. module:: libnvme
+
+This part of the documentation lists the full API reference of all public classes and
+functions.
+
+.. include:: rst/types.rst
+.. include:: rst/ioctl.rst
+.. include:: rst/fabrics.rst
+.. include:: rst/linux.rst
+.. include:: rst/mi.rst
+.. include:: rst/tree.rst
+.. include:: rst/filters.rst
+.. include:: rst/util.rst
+.. include:: rst/log.rst
diff --git a/doc/api.rst.in b/doc/api.rst.in
new file mode 100644
index 0000000..3478766
--- /dev/null
+++ b/doc/api.rst.in
@@ -0,0 +1,18 @@
+===
+API
+===
+
+.. module:: libnvme
+
+This part of the documentation lists the full API reference of all public classes and
+functions.
+
+.. include:: rst/types.rst
+.. include:: rst/ioctl.rst
+.. include:: rst/fabrics.rst
+.. include:: rst/linux.rst
+.. include:: rst/mi.rst
+.. include:: rst/tree.rst
+.. include:: rst/filters.rst
+.. include:: rst/util.rst
+.. include:: rst/log.rst
diff --git a/doc/conf.py b/doc/conf.py
index 422386a..5efa4ab 100644
--- a/doc/conf.py
+++ b/doc/conf.py
@@ -4,26 +4,15 @@
# list see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
-# -- Path setup --------------------------------------------------------------
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-#
-# import os
-# import sys
-# sys.path.insert(0, os.path.abspath('.'))
-
# -- Project information -----------------------------------------------------
project = 'libnvme'
copyright = '2020, Keith Busch'
author = 'Keith Busch <kbusch@kernel.org>'
-master_doc = 'libnvme'
+master_doc = 'index'
-# The full version, including alpha/beta/rc tags
-release = '0.1'
+release = '1.0'
# -- General configuration ---------------------------------------------------
@@ -40,34 +29,4 @@ templates_path = ['_templates']
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
# This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['html', 'man', 'index.rst', 'Thumbs.db', '.DS_Store']
-
-
-# -- Options for HTML output -------------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-#
-#html_theme = 'alabaster'
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['sphinx-static']
-html_context = {
- 'css_files': [
- '_static/theme_overrides.css',
- ],
-}
-
-html_use_smartypants = False
-pygments_style = 'sphinx'
-
-htmlhelp_basename = 'libnvme'
-
-try:
- import sphinx_rtd_theme
- html_theme = 'sphinx_rtd_theme'
- html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
-except ImportError:
- sys.stderr.write('Warning: The Sphinx \'sphinx_rtd_theme\' HTML theme was not found. Make sure you have the theme installed to produce pretty HTML output. Falling back to the default theme.\n')
+exclude_patterns = ['html', 'man', 'Thumbs.db', '.DS_Store']
diff --git a/doc/conf.py.in b/doc/conf.py.in
new file mode 100644
index 0000000..3415bbf
--- /dev/null
+++ b/doc/conf.py.in
@@ -0,0 +1,32 @@
+# Configuration file for the Sphinx documentation builder.
+#
+# This file only contains a selection of the most common options. For a full
+# list see the documentation:
+# https://www.sphinx-doc.org/en/master/usage/configuration.html
+
+
+# -- Project information -----------------------------------------------------
+
+project = 'libnvme'
+copyright = '2020, Keith Busch'
+author = 'Keith Busch <kbusch@kernel.org>'
+master_doc = 'index'
+
+release = '@VERSION@'
+
+
+# -- General configuration ---------------------------------------------------
+
+# Add any Sphinx extension module names here, as strings. They can be
+# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
+# ones.
+extensions = [
+]
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# List of patterns, relative to source directory, that match files and
+# directories to ignore when looking for source files.
+# This pattern also affects html_static_path and html_extra_path.
+exclude_patterns = ['html', 'man', 'Thumbs.db', '.DS_Store']
diff --git a/doc/config-schema.json.in b/doc/config-schema.json.in
new file mode 100644
index 0000000..a7bbdf1
--- /dev/null
+++ b/doc/config-schema.json.in
@@ -0,0 +1,164 @@
+{
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
+ "$id": "https://github.com/linux-nvme/libnvme/doc/config-schema.json",
+ "title": "config.json",
+ "description": "libnvme JSON configuration",
+ "type": "object",
+ "properties": {
+ "hosts": {
+ "description": "Array of NVMe Host properties",
+ "type": "array",
+ "items": { "$ref": "#/$defs/host" }
+ }
+ },
+ "$defs": {
+ "host": {
+ "description": "NVMe Host properties",
+ "type": "object",
+ "properties": {
+ "hostnqn": {
+ "description": "NVMe host NQN",
+ "type": "string",
+ "maxLength": 223
+ },
+ "hostid": {
+ "description": "NVMe host ID",
+ "type": "string"
+ },
+ "hostsymname": {
+ "description": "NVMe host symbolic name",
+ "type": "string"
+ },
+ "required": [ "hostnqn" ],
+ "subsystems": {
+ "description": "Array of NVMe subsystem properties",
+ "type": "array",
+ "items": { "$ref": "#/$defs/subsystem" }
+ }
+ }
+ },
+ "subsystem": {
+ "description": "NVMe subsystem properties",
+ "type": "object",
+ "properties": {
+ "nqn": {
+ "description": "Subsystem NQN",
+ "type": "string",
+ "maxLength": 223
+ },
+ "ports": {
+ "description": "Array of NVMe subsystem ports",
+ "type": "array",
+ "items": { "$ref": "#/$defs/port" }
+ },
+ "required": [ "nqn" ]
+ }
+ },
+ "port": {
+ "description": "NVMe subsystem port",
+ "type": "object",
+ "properties": {
+ "transport": {
+ "description": "Transport type",
+ "type": "string"
+ },
+ "traddr": {
+ "description": "Transport address",
+ "type": "string"
+ },
+ "host_traddr": {
+ "description": "Host transport address",
+ "type": "string"
+ },
+ "host_iface": {
+ "description": "Host interface name",
+ "type": "string"
+ },
+ "trsvcid": {
+ "description": "Transport service identifier",
+ "type": "string"
+ },
+ "dhchap_key": {
+ "description": "Host DH-HMAC-CHAP key",
+ "type": "string"
+ },
+ "dhchap_ctrl_key": {
+ "description": "Controller DH-HMAC-CHAP key",
+ "type": "string"
+ },
+ "nr_io_queues": {
+ "description": "Number of I/O queues",
+ "type": "integer"
+ },
+ "nr_write_queues": {
+ "description": "Number of write queues",
+ "type": "integer"
+ },
+ "nr_poll_queues": {
+ "description": "Number of poll queues",
+ "type": "integer"
+ },
+ "queue_size": {
+ "description": "Queue size",
+ "type": "integer"
+ },
+ "keep_alive_tmo": {
+ "description": "Keep-Alive timeout (in seconds)",
+ "type": "integer"
+ },
+ "reconnect_delay": {
+ "description": "Reconnect delay (in seconds)",
+ "type": "integer"
+ },
+ "ctrl_loss_tmo": {
+ "description": "Controller loss timeout (in seconds)",
+ "type": "integer"
+ },
+ "fast_io_fail_tmo": {
+ "description": "Fast I/O Fail timeout (in seconds)",
+ "type": "integer",
+ "default": 600
+ },
+ "tos": {
+ "description": "Type of service",
+ "type": "integer",
+ "default": -1
+ },
+ "duplicate_connect": {
+ "description": "Allow duplicate connections",
+ "type": "boolean",
+ "default": false
+ },
+ "disable_sqflow": {
+ "description": "Explicitly disable SQ flow control",
+ "type": "boolean",
+ "default": false
+ },
+ "hdr_digest": {
+ "description": "Enable header digest",
+ "type": "boolean",
+ "default": false
+ },
+ "data_digest": {
+ "description": "Enable data digest",
+ "type": "boolean",
+ "default": false
+ },
+ "tls": {
+ "description": "Enable TLS encryption",
+ "type": "boolean",
+ "default": false
+ },
+ "persistent": {
+ "description": "Create persistent discovery connection",
+ "type": "boolean"
+ },
+ "discovery": {
+ "description": "Connect to a discovery controller",
+ "type": "boolean"
+ }
+ },
+ "required": [ "transport" ]
+ }
+ }
+}
diff --git a/doc/index.rst b/doc/index.rst
index 639b3d5..54c2415 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -1,17 +1,19 @@
-.. libnvme documentation master file, created by
- sphinx-quickstart on Thu Feb 6 17:59:42 2020.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
Welcome to libnvme's documentation!
===================================
+This is the libnvme development C library. libnvme provides type definitions for
+NVMe specification structures, enumerations, and bit fields,
+helper functions to construct, dispatch, and decode commands and payloads,
+and utilities to connect, scan, and manage nvme devices on a Linux system.
+
.. toctree::
:maxdepth: 2
:caption: Contents:
- libnvme
-
+ installation.rst
+ quickstart.rst
+ mi.rst
+ api.rst
Indices and tables
==================
diff --git a/doc/index.rst.in b/doc/index.rst.in
new file mode 100644
index 0000000..54c2415
--- /dev/null
+++ b/doc/index.rst.in
@@ -0,0 +1,23 @@
+Welcome to libnvme's documentation!
+===================================
+
+This is the libnvme development C library. libnvme provides type definitions for
+NVMe specification structures, enumerations, and bit fields,
+helper functions to construct, dispatch, and decode commands and payloads,
+and utilities to connect, scan, and manage nvme devices on a Linux system.
+
+.. toctree::
+ :maxdepth: 2
+ :caption: Contents:
+
+ installation.rst
+ quickstart.rst
+ mi.rst
+ api.rst
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/doc/installation.rst b/doc/installation.rst
new file mode 100644
index 0000000..0bc8f99
--- /dev/null
+++ b/doc/installation.rst
@@ -0,0 +1,52 @@
+Installation
+============
+
+Debian / Ubuntu:
+--------------
+
+.. code-block:: sh
+
+ $ apt-get install libnvme
+
+Fedora / Red Hat:
+--------------
+
+.. code-block:: sh
+
+ $ dnf install libnvme
+
+Python Version
+--------------
+
+The latest Python 3 version is always recommended, since it has all the latest bells and
+whistles. libnvme supports Python 3.6 and above.
+
+Dependencies
+------------
+
+libnvme only uses packages from the standard library,
+so no additional dependencies will be installed when installing libnvme.
+
+Install libnvme python
+-------------
+
+Debian / Ubuntu:
+
+.. code-block:: sh
+
+ $ apt-get install python3-libnvme
+
+Fedora / Red Hat:
+
+.. code-block:: sh
+
+ $ dnf install python3-libnvme
+
+libnvme is available on `PyPI`_, and can be installed using pip. The version on PyPI is
+always the latest stable release.
+
+.. _PyPi: https://pypi.org/project/libnvme/
+
+.. code-block:: sh
+
+ $ pip install libnvme
diff --git a/doc/installation.rst.in b/doc/installation.rst.in
new file mode 100644
index 0000000..ea0415d
--- /dev/null
+++ b/doc/installation.rst.in
@@ -0,0 +1,55 @@
+Installation
+============
+
+Debian / Ubuntu:
+----------------
+
+.. code-block:: sh
+
+ $ apt-get install libnvme
+
+Fedora / Red Hat:
+-----------------
+
+.. code-block:: sh
+
+ $ dnf install libnvme
+
+Python binding
+--------------
+
+Python Version
+^^^^^^^^^^^^^^
+
+The latest Python 3 version is always recommended, since it has all
+the latest bells and whistles. libnvme supports Python 3.6 and above.
+
+Dependencies
+^^^^^^^^^^^^
+
+libnvme only uses packages from the standard library, so no additional
+dependencies will be installed when installing libnvme.
+
+Install libnvme python
+^^^^^^^^^^^^^^^^^^^^^^
+
+Debian / Ubuntu:
+
+.. code-block:: sh
+
+ $ apt-get install python3-libnvme
+
+Fedora / Red Hat:
+
+.. code-block:: sh
+
+ $ dnf install python3-libnvme
+
+libnvme is available on `PyPI`_, and can be installed using pip. The
+version on PyPI is always the latest stable release.
+
+.. _PyPi: https://pypi.org/project/libnvme/
+
+.. code-block:: sh
+
+ $ pip install libnvme
diff --git a/doc/kernel-doc-check b/doc/kernel-doc-check
new file mode 100644
index 0000000..23887d0
--- /dev/null
+++ b/doc/kernel-doc-check
@@ -0,0 +1,10 @@
+#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+kernel_doc=$(dirname $0)/kernel-doc
+
+"$kernel_doc" -none "$@" 2>&1 |
+ grep '\(warning\|error\)'
+
+# check that kernel-doc succeeded, but the grep failed
+[ ${PIPESTATUS[0]} -eq 0 -a ${PIPESTATUS[1]} -eq 1 ]
diff --git a/doc/list-man-pages.sh b/doc/list-man-pages.sh
index fef237c..e22691d 100755
--- a/doc/list-man-pages.sh
+++ b/doc/list-man-pages.sh
@@ -1,4 +1,5 @@
#!/bin/bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
file=$1
diff --git a/doc/man/nvme_admin_opcode.2 b/doc/man/nvme_admin_opcode.2
index a762b8a..a3dcd5f 100644
--- a/doc/man/nvme_admin_opcode.2
+++ b/doc/man/nvme_admin_opcode.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_admin_opcode" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_admin_opcode" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_admin_opcode \- Known NVMe admin opcodes
.SH SYNOPSIS
diff --git a/doc/man/nvme_admin_passthru.2 b/doc/man/nvme_admin_passthru.2
index df4dbf4..b4b2c4a 100644
--- a/doc/man/nvme_admin_passthru.2
+++ b/doc/man/nvme_admin_passthru.2
@@ -1,4 +1,4 @@
-.TH "nvme_admin_passthru" 9 "nvme_admin_passthru" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_admin_passthru" 9 "nvme_admin_passthru" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_admin_passthru \- Submit an nvme passthrough command
.SH SYNOPSIS
@@ -30,7 +30,7 @@ The nvme io command to send
.IP "flags" 12
NVMe command flags (not used)
.IP "rsvd" 12
-Reserevd for future use
+Reserved for future use
.IP "nsid" 12
Namespace identifier
.IP "cdw2" 12
@@ -50,11 +50,11 @@ Command dword 14
.IP "cdw15" 12
Command dword 15
.IP "data_len" 12
-Length of the data transfered in this command in bytes
+Length of the data transferred in this command in bytes
.IP "data" 12
Pointer to user address of the data buffer
.IP "metadata_len" 12
-Length of metadata transfered in this command
+Length of metadata transferred in this command
.IP "metadata" 12
Pointer to user address of the metadata buffer
.IP "timeout_ms" 12
diff --git a/doc/man/nvme_ae_info_css_nvm.2 b/doc/man/nvme_ae_info_css_nvm.2
index b583463..53500bd 100644
--- a/doc/man/nvme_ae_info_css_nvm.2
+++ b/doc/man/nvme_ae_info_css_nvm.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ae_info_css_nvm" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ae_info_css_nvm" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ae_info_css_nvm \-
+enum nvme_ae_info_css_nvm \- Asynchronous Event Information - I/O Command Specific Status
.SH SYNOPSIS
enum nvme_ae_info_css_nvm {
.br
diff --git a/doc/man/nvme_ae_info_error.2 b/doc/man/nvme_ae_info_error.2
index 103b6a2..8a9bfa1 100644
--- a/doc/man/nvme_ae_info_error.2
+++ b/doc/man/nvme_ae_info_error.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ae_info_error" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ae_info_error" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ae_info_error \-
+enum nvme_ae_info_error \- Asynchronous Event Information - Error Status
.SH SYNOPSIS
enum nvme_ae_info_error {
.br
diff --git a/doc/man/nvme_ae_info_notice.2 b/doc/man/nvme_ae_info_notice.2
index 9c5ceb2..ceee2d2 100644
--- a/doc/man/nvme_ae_info_notice.2
+++ b/doc/man/nvme_ae_info_notice.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ae_info_notice" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ae_info_notice" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ae_info_notice \-
+enum nvme_ae_info_notice \- Asynchronous Event Information - Notice
.SH SYNOPSIS
enum nvme_ae_info_notice {
.br
diff --git a/doc/man/nvme_ae_info_smart.2 b/doc/man/nvme_ae_info_smart.2
index 1a6cd98..89b2276 100644
--- a/doc/man/nvme_ae_info_smart.2
+++ b/doc/man/nvme_ae_info_smart.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ae_info_smart" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ae_info_smart" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ae_info_smart \-
+enum nvme_ae_info_smart \- Asynchronous Event Information - SMART / Health Status
.SH SYNOPSIS
enum nvme_ae_info_smart {
.br
diff --git a/doc/man/nvme_ae_type.2 b/doc/man/nvme_ae_type.2
index 514ea84..e08acd4 100644
--- a/doc/man/nvme_ae_type.2
+++ b/doc/man/nvme_ae_type.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ae_type" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ae_type" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ae_type \-
+enum nvme_ae_type \- Asynchronous Event Type
.SH SYNOPSIS
enum nvme_ae_type {
.br
diff --git a/doc/man/nvme_aggregate_endurance_group_event.2 b/doc/man/nvme_aggregate_endurance_group_event.2
index c7656cd..3d84056 100644
--- a/doc/man/nvme_aggregate_endurance_group_event.2
+++ b/doc/man/nvme_aggregate_endurance_group_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_aggregate_endurance_group_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_aggregate_endurance_group_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_aggregate_endurance_group_event \-
+struct nvme_aggregate_endurance_group_event \- Endurance Group Event Aggregate
.SH SYNOPSIS
struct nvme_aggregate_endurance_group_event {
.br
diff --git a/doc/man/nvme_aggregate_predictable_lat_event.2 b/doc/man/nvme_aggregate_predictable_lat_event.2
index 26937e2..74a472f 100644
--- a/doc/man/nvme_aggregate_predictable_lat_event.2
+++ b/doc/man/nvme_aggregate_predictable_lat_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_aggregate_predictable_lat_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_aggregate_predictable_lat_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_aggregate_predictable_lat_event \-
+struct nvme_aggregate_predictable_lat_event \- Predictable Latency Event Aggregate Log Page
.SH SYNOPSIS
struct nvme_aggregate_predictable_lat_event {
.br
diff --git a/doc/man/nvme_ana_group_desc.2 b/doc/man/nvme_ana_group_desc.2
index 5b8ceb9..08bd476 100644
--- a/doc/man/nvme_ana_group_desc.2
+++ b/doc/man/nvme_ana_group_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_ana_group_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_ana_group_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_ana_group_desc \-
+struct nvme_ana_group_desc \- ANA Group Descriptor
.SH SYNOPSIS
struct nvme_ana_group_desc {
.br
diff --git a/doc/man/nvme_ana_log.2 b/doc/man/nvme_ana_log.2
index 51b4bd8..eb153ec 100644
--- a/doc/man/nvme_ana_log.2
+++ b/doc/man/nvme_ana_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_ana_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_ana_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_ana_log \-
+struct nvme_ana_log \- Asymmetric Namespace Access Log
.SH SYNOPSIS
struct nvme_ana_log {
.br
diff --git a/doc/man/nvme_ana_state.2 b/doc/man/nvme_ana_state.2
index 83d50b6..31537da 100644
--- a/doc/man/nvme_ana_state.2
+++ b/doc/man/nvme_ana_state.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ana_state" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ana_state" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ana_state \-
+enum nvme_ana_state \- ANA Group Descriptor - Asymmetric Namespace Access State
.SH SYNOPSIS
enum nvme_ana_state {
.br
@@ -25,7 +25,12 @@ enum nvme_ana_state {
};
.SH Constants
.IP "NVME_ANA_STATE_OPTIMIZED" 12
+ANA Optimized state
.IP "NVME_ANA_STATE_NONOPTIMIZED" 12
+ANA Non-Optimized state
.IP "NVME_ANA_STATE_INACCESSIBLE" 12
+ANA Inaccessible state
.IP "NVME_ANA_STATE_PERSISTENT_LOSS" 12
+ANA Persistent Loss state
.IP "NVME_ANA_STATE_CHANGE" 12
+ANA Change state
diff --git a/doc/man/nvme_apst_entry.2 b/doc/man/nvme_apst_entry.2
index fb52310..0094bc9 100644
--- a/doc/man/nvme_apst_entry.2
+++ b/doc/man/nvme_apst_entry.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_apst_entry" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_apst_entry" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_apst_entry \-
+enum nvme_apst_entry \- Autonomous Power State Transition
.SH SYNOPSIS
enum nvme_apst_entry {
.br
@@ -21,6 +21,10 @@ enum nvme_apst_entry {
};
.SH Constants
.IP "NVME_APST_ENTRY_ITPS_SHIFT" 12
+Idle Transition Power State Shift
.IP "NVME_APST_ENTRY_ITPT_SHIFT" 12
+Idle Time Prior to Transition Shift
.IP "NVME_APST_ENTRY_ITPS_MASK" 12
+Idle Transition Power State Mask
.IP "NVME_APST_ENTRY_ITPT_MASK" 12
+Idle Time Prior to Transition Mask
diff --git a/doc/man/nvme_boot_partition.2 b/doc/man/nvme_boot_partition.2
index 3403da5..748aaca 100644
--- a/doc/man/nvme_boot_partition.2
+++ b/doc/man/nvme_boot_partition.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_boot_partition" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_boot_partition" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_boot_partition \-
+struct nvme_boot_partition \- Boot Partition Log
.SH SYNOPSIS
struct nvme_boot_partition {
.br
diff --git a/doc/man/nvme_cap_config_desc.2 b/doc/man/nvme_cap_config_desc.2
deleted file mode 100644
index e69de29..0000000
--- a/doc/man/nvme_cap_config_desc.2
+++ /dev/null
diff --git a/doc/man/nvme_capacity_config_desc.2 b/doc/man/nvme_capacity_config_desc.2
new file mode 100644
index 0000000..5dfce24
--- /dev/null
+++ b/doc/man/nvme_capacity_config_desc.2
@@ -0,0 +1,33 @@
+.TH "libnvme" 9 "struct nvme_capacity_config_desc" "July 2022" "API Manual" LINUX
+.SH NAME
+struct nvme_capacity_config_desc \- Capacity Configuration structure definitions
+.SH SYNOPSIS
+struct nvme_capacity_config_desc {
+.br
+.BI " __le16 cap_config_id;"
+.br
+.BI " __le16 domainid;"
+.br
+.BI " __le16 egcn;"
+.br
+.BI " __u8 rsvd6[26];"
+.br
+.BI " struct nvme_end_grp_config_desc egcd[];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "cap_config_id" 12
+Capacity Configuration Identifier
+.IP "domainid" 12
+Domain Identifier
+.IP "egcn" 12
+Number Endurance Group Configuration
+Descriptors
+.IP "rsvd6" 12
+Reserved
+.IP "egcd" 12
+Endurance Group Config descriptors.
+See \fIstruct\fP nvme_end_grp_config_desc
diff --git a/doc/man/nvme_capacity_mgmt.2 b/doc/man/nvme_capacity_mgmt.2
index 4ebf6a2..31e6b7d 100644
--- a/doc/man/nvme_capacity_mgmt.2
+++ b/doc/man/nvme_capacity_mgmt.2
@@ -1,6 +1,6 @@
-.TH "nvme_capacity_mgmt" 9 "nvme_capacity_mgmt" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_capacity_mgmt" 9 "nvme_capacity_mgmt" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_capacity_mgmt \-
+nvme_capacity_mgmt \- Capacity management command
.SH SYNOPSIS
.B "int" nvme_capacity_mgmt
.BI "(struct nvme_capacity_mgmt_args *args " ");"
diff --git a/doc/man/nvme_capacity_mgmt_args.2 b/doc/man/nvme_capacity_mgmt_args.2
deleted file mode 100644
index b3c42e7..0000000
--- a/doc/man/nvme_capacity_mgmt_args.2
+++ /dev/null
@@ -1,45 +0,0 @@
-.TH "libnvme" 9 "struct nvme_capacity_mgmt_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_capacity_mgmt_args \- Arguments for the NVMe Capacity Management command
-.SH SYNOPSIS
-struct nvme_capacity_mgmt_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 cdw11;"
-.br
-.BI " __u32 cdw12;"
-.br
-.BI " __u16 element_id;"
-.br
-.BI " __u8 op;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-If successful, the CQE dword0 value
-.IP "args_size" 12
-Size of \fIstruct nvme_capacity_mgmt_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "cdw11" 12
-Least significant 32 bits of the capacity in bytes of the
-Endurance Group or NVM Set to be created
-.IP "cdw12" 12
-Most significant 32 bits of the capacity in bytes of the
-Endurance Group or NVM Set to be created
-.IP "element_id" 12
-Value specific to the value of the Operation field
-.IP "op" 12
-Operation to be performed by the controller
diff --git a/doc/man/nvme_change_ns_event.2 b/doc/man/nvme_change_ns_event.2
index e7d329c..6d71571 100644
--- a/doc/man/nvme_change_ns_event.2
+++ b/doc/man/nvme_change_ns_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_change_ns_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_change_ns_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_change_ns_event \-
+struct nvme_change_ns_event \- Change Namespace Event Data
.SH SYNOPSIS
struct nvme_change_ns_event {
.br
diff --git a/doc/man/nvme_channel_config_desc.2 b/doc/man/nvme_channel_config_desc.2
index 844f858..b1a3702 100644
--- a/doc/man/nvme_channel_config_desc.2
+++ b/doc/man/nvme_channel_config_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_channel_config_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_channel_config_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_channel_config_desc \-
+struct nvme_channel_config_desc \- Channel Configuration Descriptor
.SH SYNOPSIS
struct nvme_channel_config_desc {
.br
@@ -19,6 +19,6 @@ struct nvme_channel_config_desc {
Channel Identifier
.IP "chmus" 12
Number Channel Media Units
-.SH "Description"
-Channel Configuration Descriptor
-Structure Definitions
+.IP "mu_config_desc" 12
+Channel Unit config descriptors.
+See \fIstruct\fP nvme_media_unit_config_desc
diff --git a/doc/man/nvme_cmb_size.2 b/doc/man/nvme_cmb_size.2
index 395347d..5185d22 100644
--- a/doc/man/nvme_cmb_size.2
+++ b/doc/man/nvme_cmb_size.2
@@ -1,4 +1,4 @@
-.TH "nvme_cmb_size" 9 "nvme_cmb_size" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_cmb_size" 9 "nvme_cmb_size" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_cmb_size \- Calculate size of the controller memory buffer
.SH SYNOPSIS
@@ -7,5 +7,5 @@ nvme_cmb_size \- Calculate size of the controller memory buffer
.SH ARGUMENTS
.IP "cmbsz" 12
Value from controller register NVME_REG_CMBSZ
-.SH "DESCRIPTION"
-Returns size of controller memory buffer in bytes
+.SH "RETURN"
+size of controller memory buffer in bytes
diff --git a/doc/man/nvme_cmd_effects.2 b/doc/man/nvme_cmd_effects.2
index f0cf27b..a7ee5a5 100644
--- a/doc/man/nvme_cmd_effects.2
+++ b/doc/man/nvme_cmd_effects.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_cmd_effects" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_cmd_effects" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_cmd_effects \-
+enum nvme_cmd_effects \- Commands Supported and Effects
.SH SYNOPSIS
enum nvme_cmd_effects {
.br
diff --git a/doc/man/nvme_cmd_effects_log.2 b/doc/man/nvme_cmd_effects_log.2
index 7458732..10f16a3 100644
--- a/doc/man/nvme_cmd_effects_log.2
+++ b/doc/man/nvme_cmd_effects_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_cmd_effects_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_cmd_effects_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_cmd_effects_log \-
+struct nvme_cmd_effects_log \- Commands Supported and Effects Log
.SH SYNOPSIS
struct nvme_cmd_effects_log {
.br
diff --git a/doc/man/nvme_cmd_format_mset.2 b/doc/man/nvme_cmd_format_mset.2
index dba60cd..3ee16a2 100644
--- a/doc/man/nvme_cmd_format_mset.2
+++ b/doc/man/nvme_cmd_format_mset.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_cmd_format_mset" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_cmd_format_mset" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_cmd_format_mset \- Format NVM - Metadata Settings
.SH SYNOPSIS
diff --git a/doc/man/nvme_cmd_format_pi.2 b/doc/man/nvme_cmd_format_pi.2
index 4388656..c8f6c6f 100644
--- a/doc/man/nvme_cmd_format_pi.2
+++ b/doc/man/nvme_cmd_format_pi.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_cmd_format_pi" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_cmd_format_pi" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_cmd_format_pi \- Format NVM - Protection Information
.SH SYNOPSIS
diff --git a/doc/man/nvme_cmd_format_pil.2 b/doc/man/nvme_cmd_format_pil.2
index a0b3269..5fc9ee4 100644
--- a/doc/man/nvme_cmd_format_pil.2
+++ b/doc/man/nvme_cmd_format_pil.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_cmd_format_pil" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_cmd_format_pil" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_cmd_format_pil \- Format NVM - Protection Information Location
.SH SYNOPSIS
diff --git a/doc/man/nvme_cmd_format_ses.2 b/doc/man/nvme_cmd_format_ses.2
index d2b6ed5..3659de6 100644
--- a/doc/man/nvme_cmd_format_ses.2
+++ b/doc/man/nvme_cmd_format_ses.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_cmd_format_ses" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_cmd_format_ses" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_cmd_format_ses \- Format NVM - Secure Erase Settings
.SH SYNOPSIS
diff --git a/doc/man/nvme_cmd_get_log_lid.2 b/doc/man/nvme_cmd_get_log_lid.2
index f2023ad..5b95da3 100644
--- a/doc/man/nvme_cmd_get_log_lid.2
+++ b/doc/man/nvme_cmd_get_log_lid.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_cmd_get_log_lid" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_cmd_get_log_lid" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_cmd_get_log_lid \-
+enum nvme_cmd_get_log_lid \- Get Log Page -Log Page Identifiers
.SH SYNOPSIS
enum nvme_cmd_get_log_lid {
.br
diff --git a/doc/man/nvme_cmd_get_log_telemetry_host_lsp.2 b/doc/man/nvme_cmd_get_log_telemetry_host_lsp.2
index 062093a..4ec47b5 100644
--- a/doc/man/nvme_cmd_get_log_telemetry_host_lsp.2
+++ b/doc/man/nvme_cmd_get_log_telemetry_host_lsp.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_cmd_get_log_telemetry_host_lsp" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_cmd_get_log_telemetry_host_lsp" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_cmd_get_log_telemetry_host_lsp \-
+enum nvme_cmd_get_log_telemetry_host_lsp \- Telemetry Host-Initiated log specific field
.SH SYNOPSIS
enum nvme_cmd_get_log_telemetry_host_lsp {
.br
@@ -13,4 +13,6 @@ enum nvme_cmd_get_log_telemetry_host_lsp {
};
.SH Constants
.IP "NVME_LOG_TELEM_HOST_LSP_RETAIN" 12
+Get Telemetry Data Blocks
.IP "NVME_LOG_TELEM_HOST_LSP_CREATE" 12
+Create Telemetry Data Blocks
diff --git a/doc/man/nvme_compare.2 b/doc/man/nvme_compare.2
index 5a3214b..a7f3f9b 100644
--- a/doc/man/nvme_compare.2
+++ b/doc/man/nvme_compare.2
@@ -1,4 +1,4 @@
-.TH "nvme_compare" 9 "nvme_compare" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_compare" 9 "nvme_compare" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_compare \- Submit an nvme user compare command
.SH SYNOPSIS
diff --git a/doc/man/nvme_connect_err.2 b/doc/man/nvme_connect_err.2
index 821fa74..ffffa77 100644
--- a/doc/man/nvme_connect_err.2
+++ b/doc/man/nvme_connect_err.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_connect_err" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_connect_err" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_connect_err \- nvme connect error codes
.SH SYNOPSIS
@@ -49,6 +49,26 @@ enum nvme_connect_err {
.br
.br
.BI " ENVME_CONNECT_LOOKUP_SUBSYS"
+,
+.br
+.br
+.BI " ENVME_CONNECT_ALREADY"
+,
+.br
+.br
+.BI " ENVME_CONNECT_INVAL"
+,
+.br
+.br
+.BI " ENVME_CONNECT_ADDRINUSE"
+,
+.br
+.br
+.BI " ENVME_CONNECT_NODEV"
+,
+.br
+.br
+.BI " ENVME_CONNECT_OPNOTSUPP"
};
.SH Constants
@@ -76,3 +96,13 @@ invalid transport type
failed to lookup subsystem name
.IP "ENVME_CONNECT_LOOKUP_SUBSYS" 12
failed to lookup subsystem
+.IP "ENVME_CONNECT_ALREADY" 12
+the connect attempt failed, already connected
+.IP "ENVME_CONNECT_INVAL" 12
+invalid arguments/configuration
+.IP "ENVME_CONNECT_ADDRINUSE" 12
+hostnqn already in use
+.IP "ENVME_CONNECT_NODEV" 12
+invalid interface
+.IP "ENVME_CONNECT_OPNOTSUPP" 12
+not supported
diff --git a/doc/man/nvme_constants.2 b/doc/man/nvme_constants.2
index ab07e99..db65412 100644
--- a/doc/man/nvme_constants.2
+++ b/doc/man/nvme_constants.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_constants" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_constants" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_constants \- A place to stash various constant nvme values
.SH SYNOPSIS
@@ -141,7 +141,7 @@ Use to omit a log lpo command parameter
.IP "NVME_IDENTIFY_DATA_SIZE" 12
The transfer size for nvme identify commands
.IP "NVME_LOG_SUPPORTED_LOG_PAGES_MAX" 12
-The lagest possible index in the supported
+The largest possible index in the supported
log pages log.
.IP "NVME_ID_NVMSET_LIST_MAX" 12
The largest possible nvmset index in identify
@@ -177,7 +177,7 @@ device self test log
.IP "NVME_LOG_TELEM_BLOCK_SIZE" 12
Specification defined size of Telemetry Data Blocks
.IP "NVME_LOG_FID_SUPPORTED_EFFECTS_MAX" 12
-The largest possible FID index in the
+The largest possible FID index in the
feature identifiers effects log.
.IP "NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX" 12
The largest possible MI Command index
diff --git a/doc/man/nvme_copy.2 b/doc/man/nvme_copy.2
index c8cdf33..9651d1e 100644
--- a/doc/man/nvme_copy.2
+++ b/doc/man/nvme_copy.2
@@ -1,6 +1,6 @@
-.TH "nvme_copy" 9 "nvme_copy" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_copy" 9 "nvme_copy" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_copy \-
+nvme_copy \- Copy command
.SH SYNOPSIS
.B "int" nvme_copy
.BI "(struct nvme_copy_args *args " ");"
diff --git a/doc/man/nvme_copy_args.2 b/doc/man/nvme_copy_args.2
deleted file mode 100644
index 5cc2fe1..0000000
--- a/doc/man/nvme_copy_args.2
+++ /dev/null
@@ -1,83 +0,0 @@
-.TH "libnvme" 9 "struct nvme_copy_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_copy_args \- Arguments for the NVMe Copy command
-.SH SYNOPSIS
-struct nvme_copy_args {
-.br
-.BI " __u64 sdlba;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " struct nvme_copy_range *copy;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 ilbrt;"
-.br
-.BI " int lr;"
-.br
-.BI " int fua;"
-.br
-.BI " __u16 nr;"
-.br
-.BI " __u16 dspec;"
-.br
-.BI " __u16 lbatm;"
-.br
-.BI " __u16 lbat;"
-.br
-.BI " __u8 prinfor;"
-.br
-.BI " __u8 prinfow;"
-.br
-.BI " __u8 dtype;"
-.br
-.BI " __u8 format;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "sdlba" 12
-Start destination LBA
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "copy" 12
-Range descriptior
-.IP "args_size" 12
-Size of \fIstruct nvme_copy_args\fP
-.IP "fd" 12
-File descriptor of the nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace identifier
-.IP "ilbrt" 12
-Initial logical block reference tag
-.IP "lr" 12
-Limited retry
-.IP "fua" 12
-Force unit access
-.IP "nr" 12
-Number of ranges
-.IP "dspec" 12
-Directive specific value
-.IP "lbatm" 12
-Logical block application tag mask
-.IP "lbat" 12
-Logical block application tag
-.IP "prinfor" 12
-Protection information field for read
-.IP "prinfow" 12
-Protection information field for write
-.IP "dtype" 12
-Directive type
-.IP "format" 12
-Descriptor format
diff --git a/doc/man/nvme_copy_range.2 b/doc/man/nvme_copy_range.2
index 590d4f1..564acf4 100644
--- a/doc/man/nvme_copy_range.2
+++ b/doc/man/nvme_copy_range.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_copy_range" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_copy_range" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_copy_range \-
+struct nvme_copy_range \- Copy - Source Range Entries Descriptor Format
.SH SYNOPSIS
struct nvme_copy_range {
.br
@@ -32,7 +32,8 @@ Number of Logical Blocks
.IP "rsvd18" 12
Reserved
.IP "eilbrt" 12
-Expected Initial Logical Block Reference Tag
+Expected Initial Logical Block Reference Tag /
+Expected Logical Block Storage Tag
.IP "elbatm" 12
Expected Logical Block Application Tag Mask
.IP "elbat" 12
diff --git a/doc/man/nvme_create_ctrl.2 b/doc/man/nvme_create_ctrl.2
index 8cab856..8207345 100644
--- a/doc/man/nvme_create_ctrl.2
+++ b/doc/man/nvme_create_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_create_ctrl" 9 "nvme_create_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_create_ctrl" 9 "nvme_create_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_create_ctrl \- Allocate an unconnected NVMe controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_create_root.2 b/doc/man/nvme_create_root.2
index fc8cdab..5ee7cf2 100644
--- a/doc/man/nvme_create_root.2
+++ b/doc/man/nvme_create_root.2
@@ -1,4 +1,4 @@
-.TH "nvme_create_root" 9 "nvme_create_root" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_create_root" 9 "nvme_create_root" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_create_root \- Initialize root object
.SH SYNOPSIS
diff --git a/doc/man/nvme_csi.2 b/doc/man/nvme_csi.2
index 0a8523c..0041e84 100644
--- a/doc/man/nvme_csi.2
+++ b/doc/man/nvme_csi.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_csi" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_csi" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_csi \- Defined command set indicators
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_first_ns.2 b/doc/man/nvme_ctrl_first_ns.2
index a8ef754..997381b 100644
--- a/doc/man/nvme_ctrl_first_ns.2
+++ b/doc/man/nvme_ctrl_first_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_first_ns" 9 "nvme_ctrl_first_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_first_ns" 9 "nvme_ctrl_first_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_first_ns \- Start namespace iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_first_path.2 b/doc/man/nvme_ctrl_first_path.2
index 606feef..b018970 100644
--- a/doc/man/nvme_ctrl_first_path.2
+++ b/doc/man/nvme_ctrl_first_path.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_first_path" 9 "nvme_ctrl_first_path" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_first_path" 9 "nvme_ctrl_first_path" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_first_path \- Start path iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_for_each_ns.2 b/doc/man/nvme_ctrl_for_each_ns.2
index 97b08b1..7ccc730 100644
--- a/doc/man/nvme_ctrl_for_each_ns.2
+++ b/doc/man/nvme_ctrl_for_each_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_for_each_ns" 9 "nvme_ctrl_for_each_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_for_each_ns" 9 "nvme_ctrl_for_each_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_for_each_ns \- Traverse namespaces
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_for_each_ns_safe.2 b/doc/man/nvme_ctrl_for_each_ns_safe.2
index 844a7c7..2fb7bb9 100644
--- a/doc/man/nvme_ctrl_for_each_ns_safe.2
+++ b/doc/man/nvme_ctrl_for_each_ns_safe.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_for_each_ns_safe" 9 "nvme_ctrl_for_each_ns_safe" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_for_each_ns_safe" 9 "nvme_ctrl_for_each_ns_safe" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_for_each_ns_safe \- Traverse namespaces
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_for_each_path.2 b/doc/man/nvme_ctrl_for_each_path.2
index ad85b94..a4fd3e9 100644
--- a/doc/man/nvme_ctrl_for_each_path.2
+++ b/doc/man/nvme_ctrl_for_each_path.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_for_each_path" 9 "nvme_ctrl_for_each_path" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_for_each_path" 9 "nvme_ctrl_for_each_path" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_for_each_path \- Traverse paths
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_for_each_path_safe.2 b/doc/man/nvme_ctrl_for_each_path_safe.2
index b341119..a1c0685 100644
--- a/doc/man/nvme_ctrl_for_each_path_safe.2
+++ b/doc/man/nvme_ctrl_for_each_path_safe.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_for_each_path_safe" 9 "nvme_ctrl_for_each_path_safe" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_for_each_path_safe" 9 "nvme_ctrl_for_each_path_safe" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_for_each_path_safe \- Traverse paths
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_address.2 b/doc/man/nvme_ctrl_get_address.2
index 559a5de..dae7fe7 100644
--- a/doc/man/nvme_ctrl_get_address.2
+++ b/doc/man/nvme_ctrl_get_address.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_address" 9 "nvme_ctrl_get_address" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_address" 9 "nvme_ctrl_get_address" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_address \- Address string of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_config.2 b/doc/man/nvme_ctrl_get_config.2
index 130de7e..0f767b7 100644
--- a/doc/man/nvme_ctrl_get_config.2
+++ b/doc/man/nvme_ctrl_get_config.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_config" 9 "nvme_ctrl_get_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_config" 9 "nvme_ctrl_get_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_config \- Fabrics configuration of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_dhchap_key.2 b/doc/man/nvme_ctrl_get_dhchap_key.2
index e9191da..1ba62f3 100644
--- a/doc/man/nvme_ctrl_get_dhchap_key.2
+++ b/doc/man/nvme_ctrl_get_dhchap_key.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_dhchap_key" 9 "nvme_ctrl_get_dhchap_key" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_dhchap_key" 9 "nvme_ctrl_get_dhchap_key" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_dhchap_key \- Return controller key
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_fd.2 b/doc/man/nvme_ctrl_get_fd.2
index 699c823..c28d18d 100644
--- a/doc/man/nvme_ctrl_get_fd.2
+++ b/doc/man/nvme_ctrl_get_fd.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_fd" 9 "nvme_ctrl_get_fd" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_fd" 9 "nvme_ctrl_get_fd" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_fd \- Get associated file descriptor
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_firmware.2 b/doc/man/nvme_ctrl_get_firmware.2
index 9072a2a..a784fe4 100644
--- a/doc/man/nvme_ctrl_get_firmware.2
+++ b/doc/man/nvme_ctrl_get_firmware.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_firmware" 9 "nvme_ctrl_get_firmware" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_firmware" 9 "nvme_ctrl_get_firmware" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_firmware \- Firmware string of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_host_iface.2 b/doc/man/nvme_ctrl_get_host_iface.2
index 792795b..409399e 100644
--- a/doc/man/nvme_ctrl_get_host_iface.2
+++ b/doc/man/nvme_ctrl_get_host_iface.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_host_iface" 9 "nvme_ctrl_get_host_iface" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_host_iface" 9 "nvme_ctrl_get_host_iface" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_host_iface \- Host interface name of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_host_traddr.2 b/doc/man/nvme_ctrl_get_host_traddr.2
index 7972169..63aa8a9 100644
--- a/doc/man/nvme_ctrl_get_host_traddr.2
+++ b/doc/man/nvme_ctrl_get_host_traddr.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_host_traddr" 9 "nvme_ctrl_get_host_traddr" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_host_traddr" 9 "nvme_ctrl_get_host_traddr" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_host_traddr \- Host transport address of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_model.2 b/doc/man/nvme_ctrl_get_model.2
index 41b5b50..1d938de 100644
--- a/doc/man/nvme_ctrl_get_model.2
+++ b/doc/man/nvme_ctrl_get_model.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_model" 9 "nvme_ctrl_get_model" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_model" 9 "nvme_ctrl_get_model" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_model \- Model of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_name.2 b/doc/man/nvme_ctrl_get_name.2
index 022766a..850a860 100644
--- a/doc/man/nvme_ctrl_get_name.2
+++ b/doc/man/nvme_ctrl_get_name.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_name" 9 "nvme_ctrl_get_name" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_name" 9 "nvme_ctrl_get_name" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_name \- sysfs name of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_numa_node.2 b/doc/man/nvme_ctrl_get_numa_node.2
index 06e199f..6954a35 100644
--- a/doc/man/nvme_ctrl_get_numa_node.2
+++ b/doc/man/nvme_ctrl_get_numa_node.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_numa_node" 9 "nvme_ctrl_get_numa_node" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_numa_node" 9 "nvme_ctrl_get_numa_node" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_numa_node \- NUMA node of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_queue_count.2 b/doc/man/nvme_ctrl_get_queue_count.2
index 0645e4a..193af2a 100644
--- a/doc/man/nvme_ctrl_get_queue_count.2
+++ b/doc/man/nvme_ctrl_get_queue_count.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_queue_count" 9 "nvme_ctrl_get_queue_count" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_queue_count" 9 "nvme_ctrl_get_queue_count" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_queue_count \- Queue count of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_serial.2 b/doc/man/nvme_ctrl_get_serial.2
index 646c43c..bb046a3 100644
--- a/doc/man/nvme_ctrl_get_serial.2
+++ b/doc/man/nvme_ctrl_get_serial.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_serial" 9 "nvme_ctrl_get_serial" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_serial" 9 "nvme_ctrl_get_serial" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_serial \- Serial number of a controller
.SH SYNOPSIS
@@ -6,6 +6,6 @@ nvme_ctrl_get_serial \- Serial number of a controller
.BI "(nvme_ctrl_t c " ");"
.SH ARGUMENTS
.IP "c" 12
-Conroller instance
+Controller instance
.SH "RETURN"
Serial number string of \fIc\fP
diff --git a/doc/man/nvme_ctrl_get_sqsize.2 b/doc/man/nvme_ctrl_get_sqsize.2
index 2ee323a..9542bc9 100644
--- a/doc/man/nvme_ctrl_get_sqsize.2
+++ b/doc/man/nvme_ctrl_get_sqsize.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_sqsize" 9 "nvme_ctrl_get_sqsize" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_sqsize" 9 "nvme_ctrl_get_sqsize" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_sqsize \- SQ size of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_state.2 b/doc/man/nvme_ctrl_get_state.2
index 8114541..dbbd478 100644
--- a/doc/man/nvme_ctrl_get_state.2
+++ b/doc/man/nvme_ctrl_get_state.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_state" 9 "nvme_ctrl_get_state" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_state" 9 "nvme_ctrl_get_state" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_state \- Running state of an controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_subsysnqn.2 b/doc/man/nvme_ctrl_get_subsysnqn.2
index 13ae3f2..3698346 100644
--- a/doc/man/nvme_ctrl_get_subsysnqn.2
+++ b/doc/man/nvme_ctrl_get_subsysnqn.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_subsysnqn" 9 "nvme_ctrl_get_subsysnqn" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_subsysnqn" 9 "nvme_ctrl_get_subsysnqn" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_subsysnqn \- Subsystem NQN of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_subsystem.2 b/doc/man/nvme_ctrl_get_subsystem.2
index d522928..960e1fb 100644
--- a/doc/man/nvme_ctrl_get_subsystem.2
+++ b/doc/man/nvme_ctrl_get_subsystem.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_subsystem" 9 "nvme_ctrl_get_subsystem" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_subsystem" 9 "nvme_ctrl_get_subsystem" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_subsystem \- Parent subsystem of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_sysfs_dir.2 b/doc/man/nvme_ctrl_get_sysfs_dir.2
index fb7973e..224618c 100644
--- a/doc/man/nvme_ctrl_get_sysfs_dir.2
+++ b/doc/man/nvme_ctrl_get_sysfs_dir.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_sysfs_dir" 9 "nvme_ctrl_get_sysfs_dir" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_sysfs_dir" 9 "nvme_ctrl_get_sysfs_dir" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_sysfs_dir \- sysfs directory of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_traddr.2 b/doc/man/nvme_ctrl_get_traddr.2
index bf6963e..706cedc 100644
--- a/doc/man/nvme_ctrl_get_traddr.2
+++ b/doc/man/nvme_ctrl_get_traddr.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_traddr" 9 "nvme_ctrl_get_traddr" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_traddr" 9 "nvme_ctrl_get_traddr" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_traddr \- Transport address of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_transport.2 b/doc/man/nvme_ctrl_get_transport.2
index e7acdfa..588fa1b 100644
--- a/doc/man/nvme_ctrl_get_transport.2
+++ b/doc/man/nvme_ctrl_get_transport.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_transport" 9 "nvme_ctrl_get_transport" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_transport" 9 "nvme_ctrl_get_transport" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_transport \- Transport type of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_get_trsvcid.2 b/doc/man/nvme_ctrl_get_trsvcid.2
index b889a6c..0380a27 100644
--- a/doc/man/nvme_ctrl_get_trsvcid.2
+++ b/doc/man/nvme_ctrl_get_trsvcid.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_get_trsvcid" 9 "nvme_ctrl_get_trsvcid" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_get_trsvcid" 9 "nvme_ctrl_get_trsvcid" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_get_trsvcid \- Transport service identifier of a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_identify.2 b/doc/man/nvme_ctrl_identify.2
index 1bd849a..dfae018 100644
--- a/doc/man/nvme_ctrl_identify.2
+++ b/doc/man/nvme_ctrl_identify.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_identify" 9 "nvme_ctrl_identify" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_identify" 9 "nvme_ctrl_identify" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_identify \- Issues an 'identify controller' command
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_is_discovered.2 b/doc/man/nvme_ctrl_is_discovered.2
index 70d0ebe..a78f8d5 100644
--- a/doc/man/nvme_ctrl_is_discovered.2
+++ b/doc/man/nvme_ctrl_is_discovered.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_is_discovered" 9 "nvme_ctrl_is_discovered" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_is_discovered" 9 "nvme_ctrl_is_discovered" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_is_discovered \- Returns the value of the 'discovered' flag
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_is_discovery_ctrl.2 b/doc/man/nvme_ctrl_is_discovery_ctrl.2
index 2255323..54e25e4 100644
--- a/doc/man/nvme_ctrl_is_discovery_ctrl.2
+++ b/doc/man/nvme_ctrl_is_discovery_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_is_discovery_ctrl" 9 "nvme_ctrl_is_discovery_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_is_discovery_ctrl" 9 "nvme_ctrl_is_discovery_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_is_discovery_ctrl \- Check the 'discovery_ctrl' flag
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_is_persistent.2 b/doc/man/nvme_ctrl_is_persistent.2
index 9af269c..09e6934 100644
--- a/doc/man/nvme_ctrl_is_persistent.2
+++ b/doc/man/nvme_ctrl_is_persistent.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_is_persistent" 9 "nvme_ctrl_is_persistent" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_is_persistent" 9 "nvme_ctrl_is_persistent" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_is_persistent \- Returns the value of the 'persistent' flag
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_list.2 b/doc/man/nvme_ctrl_list.2
index 85e11af..5d6b248 100644
--- a/doc/man/nvme_ctrl_list.2
+++ b/doc/man/nvme_ctrl_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_ctrl_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_ctrl_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_ctrl_list \-
+struct nvme_ctrl_list \- Controller List
.SH SYNOPSIS
struct nvme_ctrl_list {
.br
diff --git a/doc/man/nvme_ctrl_metadata_type.2 b/doc/man/nvme_ctrl_metadata_type.2
index eed88d8..76449bf 100644
--- a/doc/man/nvme_ctrl_metadata_type.2
+++ b/doc/man/nvme_ctrl_metadata_type.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_ctrl_metadata_type" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ctrl_metadata_type" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_ctrl_metadata_type \- Controller Metadata Element Types
.SH SYNOPSIS
@@ -91,7 +91,7 @@ Model of the processor.
.IP "NVME_CTRL_METADATA_CHIPSET_DRV_NAME" 12
Chipset driver name.
.IP "NVME_CTRL_METADATA_CHIPSET_DRV_VERSION" 12
-Chipsset driver version.
+Chipset driver version.
.IP "NVME_CTRL_METADATA_OS_NAME_AND_BUILD" 12
Operating system name and build.
.IP "NVME_CTRL_METADATA_SYS_PROD_NAME" 12
diff --git a/doc/man/nvme_ctrl_next_ns.2 b/doc/man/nvme_ctrl_next_ns.2
index 194dcfc..031f449 100644
--- a/doc/man/nvme_ctrl_next_ns.2
+++ b/doc/man/nvme_ctrl_next_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_next_ns" 9 "nvme_ctrl_next_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_next_ns" 9 "nvme_ctrl_next_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_next_ns \- Next namespace iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_next_path.2 b/doc/man/nvme_ctrl_next_path.2
index b494a73..84c5be2 100644
--- a/doc/man/nvme_ctrl_next_path.2
+++ b/doc/man/nvme_ctrl_next_path.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_next_path" 9 "nvme_ctrl_next_path" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_next_path" 9 "nvme_ctrl_next_path" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_next_path \- Next path iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_reset.2 b/doc/man/nvme_ctrl_reset.2
index 4912171..0bb4072 100644
--- a/doc/man/nvme_ctrl_reset.2
+++ b/doc/man/nvme_ctrl_reset.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_reset" 9 "nvme_ctrl_reset" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_reset" 9 "nvme_ctrl_reset" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_reset \- Initiate a controller reset
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_set_dhchap_key.2 b/doc/man/nvme_ctrl_set_dhchap_key.2
index 0e02292..577beac 100644
--- a/doc/man/nvme_ctrl_set_dhchap_key.2
+++ b/doc/man/nvme_ctrl_set_dhchap_key.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_set_dhchap_key" 9 "nvme_ctrl_set_dhchap_key" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_set_dhchap_key" 9 "nvme_ctrl_set_dhchap_key" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_set_dhchap_key \- Set controller key
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_set_discovered.2 b/doc/man/nvme_ctrl_set_discovered.2
index f895e51..3e68dd9 100644
--- a/doc/man/nvme_ctrl_set_discovered.2
+++ b/doc/man/nvme_ctrl_set_discovered.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_set_discovered" 9 "nvme_ctrl_set_discovered" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_set_discovered" 9 "nvme_ctrl_set_discovered" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_set_discovered \- Set the 'discovered' flag
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_set_discovery_ctrl.2 b/doc/man/nvme_ctrl_set_discovery_ctrl.2
index 824d201..9352161 100644
--- a/doc/man/nvme_ctrl_set_discovery_ctrl.2
+++ b/doc/man/nvme_ctrl_set_discovery_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_set_discovery_ctrl" 9 "nvme_ctrl_set_discovery_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_set_discovery_ctrl" 9 "nvme_ctrl_set_discovery_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_set_discovery_ctrl \- Set the 'discovery_ctrl' flag
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrl_set_persistent.2 b/doc/man/nvme_ctrl_set_persistent.2
index 6d70b36..9b6e3ae 100644
--- a/doc/man/nvme_ctrl_set_persistent.2
+++ b/doc/man/nvme_ctrl_set_persistent.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrl_set_persistent" 9 "nvme_ctrl_set_persistent" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrl_set_persistent" 9 "nvme_ctrl_set_persistent" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrl_set_persistent \- Set the 'persistent' flag
.SH SYNOPSIS
diff --git a/doc/man/nvme_ctrls_filter.2 b/doc/man/nvme_ctrls_filter.2
index 59aeaaf..0b1adc2 100644
--- a/doc/man/nvme_ctrls_filter.2
+++ b/doc/man/nvme_ctrls_filter.2
@@ -1,4 +1,4 @@
-.TH "nvme_ctrls_filter" 9 "nvme_ctrls_filter" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ctrls_filter" 9 "nvme_ctrls_filter" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ctrls_filter \- Filter for controllers
.SH SYNOPSIS
diff --git a/doc/man/nvme_default_host.2 b/doc/man/nvme_default_host.2
index 73ebb07..7d6ce0f 100644
--- a/doc/man/nvme_default_host.2
+++ b/doc/man/nvme_default_host.2
@@ -1,4 +1,4 @@
-.TH "nvme_default_host" 9 "nvme_default_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_default_host" 9 "nvme_default_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_default_host \- Initializes the default host
.SH SYNOPSIS
diff --git a/doc/man/nvme_dev_self_test.2 b/doc/man/nvme_dev_self_test.2
index b0d6d9e..b4e74e2 100644
--- a/doc/man/nvme_dev_self_test.2
+++ b/doc/man/nvme_dev_self_test.2
@@ -1,4 +1,4 @@
-.TH "nvme_dev_self_test" 9 "nvme_dev_self_test" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_dev_self_test" 9 "nvme_dev_self_test" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_dev_self_test \- Start or abort a self test
.SH SYNOPSIS
diff --git a/doc/man/nvme_dev_self_test_args.2 b/doc/man/nvme_dev_self_test_args.2
deleted file mode 100644
index a8cfb35..0000000
--- a/doc/man/nvme_dev_self_test_args.2
+++ /dev/null
@@ -1,35 +0,0 @@
-.TH "libnvme" 9 "struct nvme_dev_self_test_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_dev_self_test_args \- Arguments for the NVMe Device Self Test command
-.SH SYNOPSIS
-struct nvme_dev_self_test_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_dst_stc stc;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_dev_self_test_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID to test
-.IP "stc" 12
-Self test code, see \fIenum nvme_dst_stc\fP
diff --git a/doc/man/nvme_dim_args.2 b/doc/man/nvme_dim_args.2
deleted file mode 100644
index 8a674eb..0000000
--- a/doc/man/nvme_dim_args.2
+++ /dev/null
@@ -1,39 +0,0 @@
-.TH "libnvme" 9 "struct nvme_dim_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_dim_args \- Arguments for the Discovery Information Management (DIM) command
-.SH SYNOPSIS
-struct nvme_dim_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u8 tas;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-Set on completion to the command's CQE DWORD 0 controller response.
-.IP "data" 12
-Pointer to the DIM data
-.IP "args_size" 12
-Length of the structure
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "data_len" 12
-Length of \fIdata\fP
-.IP "tas" 12
-Task field of the Command Dword 10 (cdw10)
diff --git a/doc/man/nvme_directive_dtype.2 b/doc/man/nvme_directive_dtype.2
index e50bc32..99b3d40 100644
--- a/doc/man/nvme_directive_dtype.2
+++ b/doc/man/nvme_directive_dtype.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_directive_dtype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_directive_dtype" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_directive_dtype \-
+enum nvme_directive_dtype \- Directive Types
.SH SYNOPSIS
enum nvme_directive_dtype {
.br
diff --git a/doc/man/nvme_directive_receive_doper.2 b/doc/man/nvme_directive_receive_doper.2
index 0095be2..e084ac8 100644
--- a/doc/man/nvme_directive_receive_doper.2
+++ b/doc/man/nvme_directive_receive_doper.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_directive_receive_doper" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_directive_receive_doper" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_directive_receive_doper \-
+enum nvme_directive_receive_doper \- Directive Receive Directive Operation
.SH SYNOPSIS
enum nvme_directive_receive_doper {
.br
diff --git a/doc/man/nvme_directive_recv.2 b/doc/man/nvme_directive_recv.2
index ae3802e..577e428 100644
--- a/doc/man/nvme_directive_recv.2
+++ b/doc/man/nvme_directive_recv.2
@@ -1,4 +1,4 @@
-.TH "nvme_directive_recv" 9 "nvme_directive_recv" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_recv" 9 "nvme_directive_recv" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_directive_recv \- Receive directive specific data
.SH SYNOPSIS
diff --git a/doc/man/nvme_directive_recv_args.2 b/doc/man/nvme_directive_recv_args.2
deleted file mode 100644
index 83345ef..0000000
--- a/doc/man/nvme_directive_recv_args.2
+++ /dev/null
@@ -1,55 +0,0 @@
-.TH "libnvme" 9 "struct nvme_directive_recv_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_directive_recv_args \- Arguments for the NVMe Directive Receive command
-.SH SYNOPSIS
-struct nvme_directive_recv_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_directive_receive_doper doper;"
-.br
-.BI " enum nvme_directive_dtype dtype;"
-.br
-.BI " __u32 cdw12;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u16 dspec;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-If successful, the CQE dword0 value
-.IP "data" 12
-Usespace address of data payload
-.IP "args_size" 12
-Size of \fIstruct nvme_directive_recv_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID, if applicable
-.IP "doper" 12
-Directive send operation, see \fIenum nvme_directive_send_doper\fP
-.IP "dtype" 12
-Directive type, see \fIenum nvme_directive_dtype\fP
-.IP "cdw12" 12
-Directive specific command dword12
-.IP "data_len" 12
-Length of data payload in bytes
-.IP "dspec" 12
-Directive specific field
diff --git a/doc/man/nvme_directive_recv_identify_parameters.2 b/doc/man/nvme_directive_recv_identify_parameters.2
index d067edc..236cbb8 100644
--- a/doc/man/nvme_directive_recv_identify_parameters.2
+++ b/doc/man/nvme_directive_recv_identify_parameters.2
@@ -1,6 +1,6 @@
-.TH "nvme_directive_recv_identify_parameters" 9 "nvme_directive_recv_identify_parameters" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_recv_identify_parameters" 9 "nvme_directive_recv_identify_parameters" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_directive_recv_identify_parameters \-
+nvme_directive_recv_identify_parameters \- Directive receive identifier parameters
.SH SYNOPSIS
.B "int" nvme_directive_recv_identify_parameters
.BI "(int fd " ","
diff --git a/doc/man/nvme_directive_recv_stream_allocate.2 b/doc/man/nvme_directive_recv_stream_allocate.2
index 24057ec..9e1ed51 100644
--- a/doc/man/nvme_directive_recv_stream_allocate.2
+++ b/doc/man/nvme_directive_recv_stream_allocate.2
@@ -1,6 +1,6 @@
-.TH "nvme_directive_recv_stream_allocate" 9 "nvme_directive_recv_stream_allocate" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_recv_stream_allocate" 9 "nvme_directive_recv_stream_allocate" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_directive_recv_stream_allocate \-
+nvme_directive_recv_stream_allocate \- Directive receive stream allocate
.SH SYNOPSIS
.B "int" nvme_directive_recv_stream_allocate
.BI "(int fd " ","
diff --git a/doc/man/nvme_directive_recv_stream_parameters.2 b/doc/man/nvme_directive_recv_stream_parameters.2
index fdcdec6..7cc6cbd 100644
--- a/doc/man/nvme_directive_recv_stream_parameters.2
+++ b/doc/man/nvme_directive_recv_stream_parameters.2
@@ -1,6 +1,6 @@
-.TH "nvme_directive_recv_stream_parameters" 9 "nvme_directive_recv_stream_parameters" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_recv_stream_parameters" 9 "nvme_directive_recv_stream_parameters" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_directive_recv_stream_parameters \-
+nvme_directive_recv_stream_parameters \- Directive receive stream parameters
.SH SYNOPSIS
.B "int" nvme_directive_recv_stream_parameters
.BI "(int fd " ","
diff --git a/doc/man/nvme_directive_recv_stream_status.2 b/doc/man/nvme_directive_recv_stream_status.2
index d3b20f2..d3d8851 100644
--- a/doc/man/nvme_directive_recv_stream_status.2
+++ b/doc/man/nvme_directive_recv_stream_status.2
@@ -1,11 +1,11 @@
-.TH "nvme_directive_recv_stream_status" 9 "nvme_directive_recv_stream_status" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_recv_stream_status" 9 "nvme_directive_recv_stream_status" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_directive_recv_stream_status \-
+nvme_directive_recv_stream_status \- Directive receive stream status
.SH SYNOPSIS
.B "int" nvme_directive_recv_stream_status
.BI "(int fd " ","
.BI "__u32 nsid " ","
-.BI "unsigned nr_entries " ","
+.BI "unsigned int nr_entries " ","
.BI "struct nvme_streams_directive_status *id " ");"
.SH ARGUMENTS
.IP "fd" 12
diff --git a/doc/man/nvme_directive_send.2 b/doc/man/nvme_directive_send.2
index af9d0fc..3e412d2 100644
--- a/doc/man/nvme_directive_send.2
+++ b/doc/man/nvme_directive_send.2
@@ -1,4 +1,4 @@
-.TH "nvme_directive_send" 9 "nvme_directive_send" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_send" 9 "nvme_directive_send" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_directive_send \- Send directive command
.SH SYNOPSIS
diff --git a/doc/man/nvme_directive_send_args.2 b/doc/man/nvme_directive_send_args.2
deleted file mode 100644
index d8de887..0000000
--- a/doc/man/nvme_directive_send_args.2
+++ /dev/null
@@ -1,55 +0,0 @@
-.TH "libnvme" 9 "struct nvme_directive_send_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_directive_send_args \- Arguments for the NVMe Directive Send command
-.SH SYNOPSIS
-struct nvme_directive_send_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_directive_send_doper doper;"
-.br
-.BI " enum nvme_directive_dtype dtype;"
-.br
-.BI " __u32 cdw12;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u16 dspec;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-If successful, the CQE dword0 value
-.IP "data" 12
-Data payload to to be send
-.IP "args_size" 12
-Size of \fIstruct nvme_directive_send_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID, if applicable
-.IP "doper" 12
-Directive send operation, see \fIenum nvme_directive_send_doper\fP
-.IP "dtype" 12
-Directive type, see \fIenum nvme_directive_dtype\fP
-.IP "cdw12" 12
-Directive specific command dword12
-.IP "data_len" 12
-Length of data payload in bytes
-.IP "dspec" 12
-Directive specific field
diff --git a/doc/man/nvme_directive_send_doper.2 b/doc/man/nvme_directive_send_doper.2
index 4d3ece1..13bd4af 100644
--- a/doc/man/nvme_directive_send_doper.2
+++ b/doc/man/nvme_directive_send_doper.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_directive_send_doper" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_directive_send_doper" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_directive_send_doper \-
+enum nvme_directive_send_doper \- Directive Send Directive Operation
.SH SYNOPSIS
enum nvme_directive_send_doper {
.br
diff --git a/doc/man/nvme_directive_send_id_endir.2 b/doc/man/nvme_directive_send_id_endir.2
index c3b31ee..ff6867f 100644
--- a/doc/man/nvme_directive_send_id_endir.2
+++ b/doc/man/nvme_directive_send_id_endir.2
@@ -1,6 +1,6 @@
-.TH "nvme_directive_send_id_endir" 9 "nvme_directive_send_id_endir" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_send_id_endir" 9 "nvme_directive_send_id_endir" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_directive_send_id_endir \-
+nvme_directive_send_id_endir \- Directive Send Enable Directive
.SH SYNOPSIS
.B "int" nvme_directive_send_id_endir
.BI "(int fd " ","
diff --git a/doc/man/nvme_directive_send_identify_endir.2 b/doc/man/nvme_directive_send_identify_endir.2
index f6cb007..32eb52e 100644
--- a/doc/man/nvme_directive_send_identify_endir.2
+++ b/doc/man/nvme_directive_send_identify_endir.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_directive_send_identify_endir" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_directive_send_identify_endir" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_directive_send_identify_endir \-
+enum nvme_directive_send_identify_endir \- Enable Directive
.SH SYNOPSIS
enum nvme_directive_send_identify_endir {
.br
diff --git a/doc/man/nvme_directive_send_stream_release_identifier.2 b/doc/man/nvme_directive_send_stream_release_identifier.2
index 9768cd6..c3274fd 100644
--- a/doc/man/nvme_directive_send_stream_release_identifier.2
+++ b/doc/man/nvme_directive_send_stream_release_identifier.2
@@ -1,6 +1,6 @@
-.TH "nvme_directive_send_stream_release_identifier" 9 "nvme_directive_send_stream_release_identifier" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_send_stream_release_identifier" 9 "nvme_directive_send_stream_release_identifier" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_directive_send_stream_release_identifier \-
+nvme_directive_send_stream_release_identifier \- Directive Send Stream release
.SH SYNOPSIS
.B "int" nvme_directive_send_stream_release_identifier
.BI "(int fd " ","
diff --git a/doc/man/nvme_directive_send_stream_release_resource.2 b/doc/man/nvme_directive_send_stream_release_resource.2
index 32ebab4..3fcc5a6 100644
--- a/doc/man/nvme_directive_send_stream_release_resource.2
+++ b/doc/man/nvme_directive_send_stream_release_resource.2
@@ -1,6 +1,6 @@
-.TH "nvme_directive_send_stream_release_resource" 9 "nvme_directive_send_stream_release_resource" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_directive_send_stream_release_resource" 9 "nvme_directive_send_stream_release_resource" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_directive_send_stream_release_resource \-
+nvme_directive_send_stream_release_resource \- Directive Send Stream release resources
.SH SYNOPSIS
.B "int" nvme_directive_send_stream_release_resource
.BI "(int fd " ","
diff --git a/doc/man/nvme_directive_types.2 b/doc/man/nvme_directive_types.2
index aa2e48c..9662c86 100644
--- a/doc/man/nvme_directive_types.2
+++ b/doc/man/nvme_directive_types.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_directive_types" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_directive_types" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_directive_types \-
+enum nvme_directive_types \- Directives Supported or Enabled
.SH SYNOPSIS
enum nvme_directive_types {
.br
diff --git a/doc/man/nvme_disconnect_ctrl.2 b/doc/man/nvme_disconnect_ctrl.2
index 35a8a0a..e13355d 100644
--- a/doc/man/nvme_disconnect_ctrl.2
+++ b/doc/man/nvme_disconnect_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_disconnect_ctrl" 9 "nvme_disconnect_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_disconnect_ctrl" 9 "nvme_disconnect_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_disconnect_ctrl \- Disconnect a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_dsm.2 b/doc/man/nvme_dsm.2
index 4803104..d22ea68 100644
--- a/doc/man/nvme_dsm.2
+++ b/doc/man/nvme_dsm.2
@@ -1,4 +1,4 @@
-.TH "nvme_dsm" 9 "nvme_dsm" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_dsm" 9 "nvme_dsm" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_dsm \- Send an nvme data set management command
.SH SYNOPSIS
diff --git a/doc/man/nvme_dsm_args.2 b/doc/man/nvme_dsm_args.2
deleted file mode 100644
index bb4f645..0000000
--- a/doc/man/nvme_dsm_args.2
+++ /dev/null
@@ -1,43 +0,0 @@
-.TH "libnvme" 9 "struct nvme_dsm_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_dsm_args \- Arguments for the NVMe Dataset Management command
-.SH SYNOPSIS
-struct nvme_dsm_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " struct nvme_dsm_range *dsm;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 attrs;"
-.br
-.BI " __u16 nr_ranges;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "dsm" 12
-The data set management attributes
-.IP "args_size" 12
-Size of \fIstruct nvme_dsm_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace identifier
-.IP "attrs" 12
-DSM attributes, see \fIenum nvme_dsm_attributes\fP
-.IP "nr_ranges" 12
-Number of block ranges in the data set management attributes
diff --git a/doc/man/nvme_dsm_attributes.2 b/doc/man/nvme_dsm_attributes.2
index 1814d87..075fcfc 100644
--- a/doc/man/nvme_dsm_attributes.2
+++ b/doc/man/nvme_dsm_attributes.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_dsm_attributes" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_dsm_attributes" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_dsm_attributes \-
+enum nvme_dsm_attributes \- Dataset Management attributes
.SH SYNOPSIS
enum nvme_dsm_attributes {
.br
@@ -17,8 +17,8 @@ enum nvme_dsm_attributes {
};
.SH Constants
.IP "NVME_DSMGMT_IDR" 12
-Attribute – Integral Dataset for Read
+Attribute -Integral Dataset for Read
.IP "NVME_DSMGMT_IDW" 12
-Attribute – Integral Dataset for Write
+Attribute - Integral Dataset for Write
.IP "NVME_DSMGMT_AD" 12
-Attribute – Deallocate
+Attribute - Deallocate
diff --git a/doc/man/nvme_dsm_range.2 b/doc/man/nvme_dsm_range.2
index 1edd263..a2c04b6 100644
--- a/doc/man/nvme_dsm_range.2
+++ b/doc/man/nvme_dsm_range.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_dsm_range" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_dsm_range" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_dsm_range \-
+struct nvme_dsm_range \- Dataset Management - Range Definition
.SH SYNOPSIS
struct nvme_dsm_range {
.br
diff --git a/doc/man/nvme_dst_stc.2 b/doc/man/nvme_dst_stc.2
index 991a171..3825044 100644
--- a/doc/man/nvme_dst_stc.2
+++ b/doc/man/nvme_dst_stc.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_dst_stc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_dst_stc" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_dst_stc \- Action taken by the Device Self-test command
.SH SYNOPSIS
diff --git a/doc/man/nvme_dump_config.2 b/doc/man/nvme_dump_config.2
index d3e9f1f..49bc3ea 100644
--- a/doc/man/nvme_dump_config.2
+++ b/doc/man/nvme_dump_config.2
@@ -1,4 +1,4 @@
-.TH "nvme_dump_config" 9 "nvme_dump_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_dump_config" 9 "nvme_dump_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_dump_config \- Print the JSON configuration
.SH SYNOPSIS
diff --git a/doc/man/nvme_dump_tree.2 b/doc/man/nvme_dump_tree.2
index 505f94c..e97da3b 100644
--- a/doc/man/nvme_dump_tree.2
+++ b/doc/man/nvme_dump_tree.2
@@ -1,4 +1,4 @@
-.TH "nvme_dump_tree" 9 "nvme_dump_tree" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_dump_tree" 9 "nvme_dump_tree" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_dump_tree \- Dump internal object tree
.SH SYNOPSIS
diff --git a/doc/man/nvme_eg_critical_warning_flags.2 b/doc/man/nvme_eg_critical_warning_flags.2
index ec2a3ff..fad3a9d 100644
--- a/doc/man/nvme_eg_critical_warning_flags.2
+++ b/doc/man/nvme_eg_critical_warning_flags.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_eg_critical_warning_flags" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_eg_critical_warning_flags" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_eg_critical_warning_flags \-
+enum nvme_eg_critical_warning_flags \- Endurance Group Information Log - Critical Warning
.SH SYNOPSIS
enum nvme_eg_critical_warning_flags {
.br
@@ -17,5 +17,10 @@ enum nvme_eg_critical_warning_flags {
};
.SH Constants
.IP "NVME_EG_CRITICAL_WARNING_SPARE" 12
+Available spare capacity of the Endurance Group
+has fallen below the threshold
.IP "NVME_EG_CRITICAL_WARNING_DEGRADED" 12
+Endurance Group reliability has been degraded
.IP "NVME_EG_CRITICAL_WARNING_READ_ONLY" 12
+Endurance Group have been placed in read only
+mode
diff --git a/doc/man/nvme_eg_event_aggregate_log.2 b/doc/man/nvme_eg_event_aggregate_log.2
index 0546d53..3d9e8f1 100644
--- a/doc/man/nvme_eg_event_aggregate_log.2
+++ b/doc/man/nvme_eg_event_aggregate_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_eg_event_aggregate_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_eg_event_aggregate_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_eg_event_aggregate_log \-
+struct nvme_eg_event_aggregate_log \- Endurance Group Event Aggregate
.SH SYNOPSIS
struct nvme_eg_event_aggregate_log {
.br
diff --git a/doc/man/nvme_end_grp_chan_desc.2 b/doc/man/nvme_end_grp_chan_desc.2
index a7a810f..e8817ef 100644
--- a/doc/man/nvme_end_grp_chan_desc.2
+++ b/doc/man/nvme_end_grp_chan_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_end_grp_chan_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_end_grp_chan_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_end_grp_chan_desc \-
+struct nvme_end_grp_chan_desc \- Endurance Group Channel Configuration Descriptor
.SH SYNOPSIS
struct nvme_end_grp_chan_desc {
.br
@@ -15,6 +15,6 @@ struct nvme_end_grp_chan_desc {
.SH Members
.IP "egchans" 12
Number of Channels
-.SH "Description"
-Endurance group Channel Configuration Descriptor
-Structure Definitions
+.IP "chan_config_desc" 12
+Channel config descriptors.
+See \fIstruct\fP nvme_channel_config_desc
diff --git a/doc/man/nvme_end_grp_config_desc.2 b/doc/man/nvme_end_grp_config_desc.2
index b418522..2bc146d 100644
--- a/doc/man/nvme_end_grp_config_desc.2
+++ b/doc/man/nvme_end_grp_config_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_end_grp_config_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_end_grp_config_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_end_grp_config_desc \-
+struct nvme_end_grp_config_desc \- Endurance Group Configuration Descriptor
.SH SYNOPSIS
struct nvme_end_grp_config_desc {
.br
@@ -31,16 +31,17 @@ struct nvme_end_grp_config_desc {
Endurance Group Identifier
.IP "cap_adj_factor" 12
Capacity Adjustment Factor
+.IP "rsvd4" 12
+Reserved
.IP "tegcap" 12
Total Endurance Group Capacity
.IP "segcap" 12
Spare Endurance Group Capacity
.IP "end_est" 12
Endurance Estimate
+.IP "rsvd64" 12
+Reserved
.IP "egsets" 12
Number of NVM Sets
.IP "nvmsetid" 12
NVM Set Identifier
-.SH "Description"
-Endurance Group Configuration Descriptor
-Structure Definitions
diff --git a/doc/man/nvme_endurance_group_log.2 b/doc/man/nvme_endurance_group_log.2
index 1ba728f..7155373 100644
--- a/doc/man/nvme_endurance_group_log.2
+++ b/doc/man/nvme_endurance_group_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_endurance_group_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_endurance_group_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_endurance_group_log \-
+struct nvme_endurance_group_log \- Endurance Group Information Log
.SH SYNOPSIS
struct nvme_endurance_group_log {
.br
diff --git a/doc/man/nvme_err_pel.2 b/doc/man/nvme_err_pel.2
deleted file mode 100644
index e217cf7..0000000
--- a/doc/man/nvme_err_pel.2
+++ /dev/null
@@ -1,16 +0,0 @@
-.TH "libnvme" 9 "enum nvme_err_pel" "April 2022" "API Manual" LINUX
-.SH NAME
-enum nvme_err_pel \-
-.SH SYNOPSIS
-enum nvme_err_pel {
-.br
-.BI " NVME_ERR_PEL_BYTE_MASK"
-,
-.br
-.br
-.BI " NVME_ERR_PEL_BIT_MASK"
-
-};
-.SH Constants
-.IP "NVME_ERR_PEL_BYTE_MASK" 12
-.IP "NVME_ERR_PEL_BIT_MASK" 12
diff --git a/doc/man/nvme_errno_to_string.2 b/doc/man/nvme_errno_to_string.2
index 6e8ea1c..867647c 100644
--- a/doc/man/nvme_errno_to_string.2
+++ b/doc/man/nvme_errno_to_string.2
@@ -1,4 +1,4 @@
-.TH "nvme_errno_to_string" 9 "nvme_errno_to_string" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_errno_to_string" 9 "nvme_errno_to_string" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_errno_to_string \- Returns string describing nvme connect failures
.SH SYNOPSIS
diff --git a/doc/man/nvme_error_log_page.2 b/doc/man/nvme_error_log_page.2
index f6a908c..d487fb0 100644
--- a/doc/man/nvme_error_log_page.2
+++ b/doc/man/nvme_error_log_page.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_error_log_page" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_error_log_page" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_error_log_page \- Error Information Log Entry (Log Identifier 01h)
.SH SYNOPSIS
diff --git a/doc/man/nvme_fabrics_config.2 b/doc/man/nvme_fabrics_config.2
index f54377f..b5f868d 100644
--- a/doc/man/nvme_fabrics_config.2
+++ b/doc/man/nvme_fabrics_config.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_fabrics_config" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_fabrics_config" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_fabrics_config \- Defines all linux nvme fabrics initiator options
.SH SYNOPSIS
diff --git a/doc/man/nvme_fctype.2 b/doc/man/nvme_fctype.2
index 560a989..b95a654 100644
--- a/doc/man/nvme_fctype.2
+++ b/doc/man/nvme_fctype.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_fctype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_fctype" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_fctype \-
+enum nvme_fctype \- Fabrics Command Types
.SH SYNOPSIS
enum nvme_fctype {
.br
diff --git a/doc/man/nvme_feat.2 b/doc/man/nvme_feat.2
index 981cd62..653288a 100644
--- a/doc/man/nvme_feat.2
+++ b/doc/man/nvme_feat.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_feat" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_feat" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_feat \-
+enum nvme_feat \- Features Access Shifts/Masks values
.SH SYNOPSIS
enum nvme_feat {
.br
diff --git a/doc/man/nvme_feat_auto_pst.2 b/doc/man/nvme_feat_auto_pst.2
index c84f481..7a4eca4 100644
--- a/doc/man/nvme_feat_auto_pst.2
+++ b/doc/man/nvme_feat_auto_pst.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_feat_auto_pst" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_feat_auto_pst" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_feat_auto_pst \-
+struct nvme_feat_auto_pst \- Autonomous Power State Transition
.SH SYNOPSIS
struct nvme_feat_auto_pst {
.br
diff --git a/doc/man/nvme_feat_host_behavior.2 b/doc/man/nvme_feat_host_behavior.2
index 7f9be77..ea66ad1 100644
--- a/doc/man/nvme_feat_host_behavior.2
+++ b/doc/man/nvme_feat_host_behavior.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_feat_host_behavior" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_feat_host_behavior" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_feat_host_behavior \-
+struct nvme_feat_host_behavior \- Host Behavior Support - Data Structure
.SH SYNOPSIS
struct nvme_feat_host_behavior {
.br
diff --git a/doc/man/nvme_feat_nswpcfg_state.2 b/doc/man/nvme_feat_nswpcfg_state.2
index c671e63..bd8b00f 100644
--- a/doc/man/nvme_feat_nswpcfg_state.2
+++ b/doc/man/nvme_feat_nswpcfg_state.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_feat_nswpcfg_state" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_feat_nswpcfg_state" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_feat_nswpcfg_state \-
+enum nvme_feat_nswpcfg_state \- Write Protection - Write Protection State
.SH SYNOPSIS
enum nvme_feat_nswpcfg_state {
.br
diff --git a/doc/man/nvme_feat_plm_window_select.2 b/doc/man/nvme_feat_plm_window_select.2
index a864d98..883c9a1 100644
--- a/doc/man/nvme_feat_plm_window_select.2
+++ b/doc/man/nvme_feat_plm_window_select.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_feat_plm_window_select" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_feat_plm_window_select" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_feat_plm_window_select \-
+enum nvme_feat_plm_window_select \- Predictable Latency Per NVM Set Log
.SH SYNOPSIS
enum nvme_feat_plm_window_select {
.br
diff --git a/doc/man/nvme_feat_resv_notify_flags.2 b/doc/man/nvme_feat_resv_notify_flags.2
index 53a262b..c7497de 100644
--- a/doc/man/nvme_feat_resv_notify_flags.2
+++ b/doc/man/nvme_feat_resv_notify_flags.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_feat_resv_notify_flags" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_feat_resv_notify_flags" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_feat_resv_notify_flags \-
+enum nvme_feat_resv_notify_flags \- Reservation Notification Configuration
.SH SYNOPSIS
enum nvme_feat_resv_notify_flags {
.br
diff --git a/doc/man/nvme_feat_tmpthresh_thsel.2 b/doc/man/nvme_feat_tmpthresh_thsel.2
index 1c91429..9197093 100644
--- a/doc/man/nvme_feat_tmpthresh_thsel.2
+++ b/doc/man/nvme_feat_tmpthresh_thsel.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_feat_tmpthresh_thsel" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_feat_tmpthresh_thsel" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_feat_tmpthresh_thsel \-
+enum nvme_feat_tmpthresh_thsel \- Temperature Threshold - Threshold Type Select
.SH SYNOPSIS
enum nvme_feat_tmpthresh_thsel {
.br
diff --git a/doc/man/nvme_features_async_event_config_flags.2 b/doc/man/nvme_features_async_event_config_flags.2
index eaa5062..e9fd0be 100644
--- a/doc/man/nvme_features_async_event_config_flags.2
+++ b/doc/man/nvme_features_async_event_config_flags.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_features_async_event_config_flags" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_features_async_event_config_flags" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_features_async_event_config_flags \-
+enum nvme_features_async_event_config_flags \- Asynchronous Event Configuration configuration flags
.SH SYNOPSIS
enum nvme_features_async_event_config_flags {
.br
diff --git a/doc/man/nvme_features_id.2 b/doc/man/nvme_features_id.2
index a908964..3f3aca7 100644
--- a/doc/man/nvme_features_id.2
+++ b/doc/man/nvme_features_id.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_features_id" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_features_id" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_features_id \-
+enum nvme_features_id \- Features - Feature Identifiers
.SH SYNOPSIS
enum nvme_features_id {
.br
diff --git a/doc/man/nvme_fid_supported_effects.2 b/doc/man/nvme_fid_supported_effects.2
index 353ed27..b1b390d 100644
--- a/doc/man/nvme_fid_supported_effects.2
+++ b/doc/man/nvme_fid_supported_effects.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_fid_supported_effects" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_fid_supported_effects" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_fid_supported_effects \-
+enum nvme_fid_supported_effects \- FID Supported and Effects Data Structure definitions
.SH SYNOPSIS
enum nvme_fid_supported_effects {
.br
@@ -61,18 +61,30 @@ enum nvme_fid_supported_effects {
};
.SH Constants
.IP "NVME_FID_SUPPORTED_EFFECTS_FSUPP" 12
+FID Supported
.IP "NVME_FID_SUPPORTED_EFFECTS_UDCC" 12
+User Data Content Change
.IP "NVME_FID_SUPPORTED_EFFECTS_NCC" 12
+Namespace Capability Change
.IP "NVME_FID_SUPPORTED_EFFECTS_NIC" 12
+Namespace Inventory Change
.IP "NVME_FID_SUPPORTED_EFFECTS_CCC" 12
+Controller Capability Change
.IP "NVME_FID_SUPPORTED_EFFECTS_UUID_SEL" 12
+UUID Selection Supported
.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_SHIFT" 12
+FID Scope Shift
.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_MASK" 12
+FID Scope Mask
.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_NS" 12
+Namespace Scope
.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_CTRL" 12
+Controller Scope
.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_NVM_SET" 12
+NVM Set Scope
.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_ENDGRP" 12
+Endurance Group Scope
.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_DOMAIN" 12
+Domain Scope
.IP "NVME_FID_SUPPORTED_EFFECTS_SCOPE_NSS" 12
-.SH "Description"
-FID Supported and Effects Data Structure definitions
+NVM Subsystem Scope
diff --git a/doc/man/nvme_fid_supported_effects_log.2 b/doc/man/nvme_fid_supported_effects_log.2
index 6603c45..f9529e1 100644
--- a/doc/man/nvme_fid_supported_effects_log.2
+++ b/doc/man/nvme_fid_supported_effects_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_fid_supported_effects_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_fid_supported_effects_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_fid_supported_effects_log \-
+struct nvme_fid_supported_effects_log \- Feature Identifiers Supported and Effects
.SH SYNOPSIS
struct nvme_fid_supported_effects_log {
.br
@@ -13,5 +13,3 @@ struct nvme_fid_supported_effects_log {
.SH Members
.IP "fid_support" 12
Feature Identifier Supported
-.SH "Description"
-Feature Identifiers Supported and Effects (Log Identifier 12h)
diff --git a/doc/man/nvme_firmware_slot.2 b/doc/man/nvme_firmware_slot.2
index 61524c7..2b685f0 100644
--- a/doc/man/nvme_firmware_slot.2
+++ b/doc/man/nvme_firmware_slot.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_firmware_slot" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_firmware_slot" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_firmware_slot \-
+struct nvme_firmware_slot \- Firmware Slot Information Log
.SH SYNOPSIS
struct nvme_firmware_slot {
.br
diff --git a/doc/man/nvme_first_host.2 b/doc/man/nvme_first_host.2
index bfad78d..dd97362 100644
--- a/doc/man/nvme_first_host.2
+++ b/doc/man/nvme_first_host.2
@@ -1,4 +1,4 @@
-.TH "nvme_first_host" 9 "nvme_first_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_first_host" 9 "nvme_first_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_first_host \- Start host iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_first_subsystem.2 b/doc/man/nvme_first_subsystem.2
index c47b3d9..493c657 100644
--- a/doc/man/nvme_first_subsystem.2
+++ b/doc/man/nvme_first_subsystem.2
@@ -1,4 +1,4 @@
-.TH "nvme_first_subsystem" 9 "nvme_first_subsystem" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_first_subsystem" 9 "nvme_first_subsystem" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_first_subsystem \- Start subsystem iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_flush.2 b/doc/man/nvme_flush.2
index 251958e..d866062 100644
--- a/doc/man/nvme_flush.2
+++ b/doc/man/nvme_flush.2
@@ -1,4 +1,4 @@
-.TH "nvme_flush" 9 "nvme_flush" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_flush" 9 "nvme_flush" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_flush \- Send an nvme flush command
.SH SYNOPSIS
diff --git a/doc/man/nvme_for_each_host.2 b/doc/man/nvme_for_each_host.2
index 08e4912..bc71bd0 100644
--- a/doc/man/nvme_for_each_host.2
+++ b/doc/man/nvme_for_each_host.2
@@ -1,4 +1,4 @@
-.TH "nvme_for_each_host" 9 "nvme_for_each_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_for_each_host" 9 "nvme_for_each_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_for_each_host \- Traverse host list
.SH SYNOPSIS
diff --git a/doc/man/nvme_for_each_host_safe.2 b/doc/man/nvme_for_each_host_safe.2
index 04f31fe..0f0886f 100644
--- a/doc/man/nvme_for_each_host_safe.2
+++ b/doc/man/nvme_for_each_host_safe.2
@@ -1,4 +1,4 @@
-.TH "nvme_for_each_host_safe" 9 "nvme_for_each_host_safe" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_for_each_host_safe" 9 "nvme_for_each_host_safe" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_for_each_host_safe \- Traverse host list
.SH SYNOPSIS
diff --git a/doc/man/nvme_for_each_subsystem.2 b/doc/man/nvme_for_each_subsystem.2
index 7f50b64..abc02e2 100644
--- a/doc/man/nvme_for_each_subsystem.2
+++ b/doc/man/nvme_for_each_subsystem.2
@@ -1,4 +1,4 @@
-.TH "nvme_for_each_subsystem" 9 "nvme_for_each_subsystem" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_for_each_subsystem" 9 "nvme_for_each_subsystem" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_for_each_subsystem \- Traverse subsystems
.SH SYNOPSIS
diff --git a/doc/man/nvme_for_each_subsystem_safe.2 b/doc/man/nvme_for_each_subsystem_safe.2
index b03d683..1a5cde9 100644
--- a/doc/man/nvme_for_each_subsystem_safe.2
+++ b/doc/man/nvme_for_each_subsystem_safe.2
@@ -1,4 +1,4 @@
-.TH "nvme_for_each_subsystem_safe" 9 "nvme_for_each_subsystem_safe" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_for_each_subsystem_safe" 9 "nvme_for_each_subsystem_safe" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_for_each_subsystem_safe \- Traverse subsystems
.SH SYNOPSIS
diff --git a/doc/man/nvme_format_nvm.2 b/doc/man/nvme_format_nvm.2
index 60ffa5b..bf53c5c 100644
--- a/doc/man/nvme_format_nvm.2
+++ b/doc/man/nvme_format_nvm.2
@@ -1,4 +1,4 @@
-.TH "nvme_format_nvm" 9 "nvme_format_nvm" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_format_nvm" 9 "nvme_format_nvm" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_format_nvm \- Format nvme namespace(s)
.SH SYNOPSIS
diff --git a/doc/man/nvme_format_nvm_args.2 b/doc/man/nvme_format_nvm_args.2
deleted file mode 100644
index 53f4fcb..0000000
--- a/doc/man/nvme_format_nvm_args.2
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH "libnvme" 9 "struct nvme_format_nvm_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_format_nvm_args \- Arguments for the Format Nvme Namespace command
-.SH SYNOPSIS
-struct nvme_format_nvm_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_cmd_format_mset mset;"
-.br
-.BI " enum nvme_cmd_format_pi pi;"
-.br
-.BI " enum nvme_cmd_format_pil pil;"
-.br
-.BI " enum nvme_cmd_format_ses ses;"
-.br
-.BI " __u8 lbaf;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_format_nvm_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Set to override default timeout to this value in milliseconds;
-useful for long running formats. 0 will use system default.
-.IP "nsid" 12
-Namespace ID to format
-.IP "mset" 12
-Metadata settings (extended or separated), true if extended
-.IP "pi" 12
-Protection information type
-.IP "pil" 12
-Protection information location (beginning or end), true if end
-.IP "ses" 12
-Secure erase settings
-.IP "lbaf" 12
-Logical block address format
diff --git a/doc/man/nvme_format_nvm_compln_event.2 b/doc/man/nvme_format_nvm_compln_event.2
index d53651a..c07fa3a 100644
--- a/doc/man/nvme_format_nvm_compln_event.2
+++ b/doc/man/nvme_format_nvm_compln_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_format_nvm_compln_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_format_nvm_compln_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_format_nvm_compln_event \-
+struct nvme_format_nvm_compln_event \- Format NVM Completion Event Data
.SH SYNOPSIS
struct nvme_format_nvm_compln_event {
.br
diff --git a/doc/man/nvme_format_nvm_start_event.2 b/doc/man/nvme_format_nvm_start_event.2
index cff8f5f..78f0a80 100644
--- a/doc/man/nvme_format_nvm_start_event.2
+++ b/doc/man/nvme_format_nvm_start_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_format_nvm_start_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_format_nvm_start_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_format_nvm_start_event \-
+struct nvme_format_nvm_start_event \- Format NVM Start Event Data
.SH SYNOPSIS
struct nvme_format_nvm_start_event {
.br
diff --git a/doc/man/nvme_free_ctrl.2 b/doc/man/nvme_free_ctrl.2
index e350001..e2b1100 100644
--- a/doc/man/nvme_free_ctrl.2
+++ b/doc/man/nvme_free_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_free_ctrl" 9 "nvme_free_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_free_ctrl" 9 "nvme_free_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_free_ctrl \- Free controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_free_host.2 b/doc/man/nvme_free_host.2
index a1393ac..ecd1b2b 100644
--- a/doc/man/nvme_free_host.2
+++ b/doc/man/nvme_free_host.2
@@ -1,4 +1,4 @@
-.TH "nvme_free_host" 9 "nvme_free_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_free_host" 9 "nvme_free_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_free_host \- Free nvme_host_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_free_ns.2 b/doc/man/nvme_free_ns.2
index f8ad3e8..6f878af 100644
--- a/doc/man/nvme_free_ns.2
+++ b/doc/man/nvme_free_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_free_ns" 9 "nvme_free_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_free_ns" 9 "nvme_free_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_free_ns \- Free a namespace object
.SH SYNOPSIS
diff --git a/doc/man/nvme_free_subsystem.2 b/doc/man/nvme_free_subsystem.2
index 121fc6c..81bd3f3 100644
--- a/doc/man/nvme_free_subsystem.2
+++ b/doc/man/nvme_free_subsystem.2
@@ -1,4 +1,4 @@
-.TH "nvme_free_subsystem" 9 "nvme_free_subsystem" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_free_subsystem" 9 "nvme_free_subsystem" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_free_subsystem \- Free a subsystem
.SH SYNOPSIS
diff --git a/doc/man/nvme_free_tree.2 b/doc/man/nvme_free_tree.2
index d819425..249e3a0 100644
--- a/doc/man/nvme_free_tree.2
+++ b/doc/man/nvme_free_tree.2
@@ -1,4 +1,4 @@
-.TH "nvme_free_tree" 9 "nvme_free_tree" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_free_tree" 9 "nvme_free_tree" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_free_tree \- Free root object
.SH SYNOPSIS
diff --git a/doc/man/nvme_fw_commit.2 b/doc/man/nvme_fw_commit.2
index a9d1f20..8844a26 100644
--- a/doc/man/nvme_fw_commit.2
+++ b/doc/man/nvme_fw_commit.2
@@ -1,4 +1,4 @@
-.TH "nvme_fw_commit" 9 "nvme_fw_commit" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_fw_commit" 9 "nvme_fw_commit" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_fw_commit \- Commit firmware using the specified action
.SH SYNOPSIS
diff --git a/doc/man/nvme_fw_commit_args.2 b/doc/man/nvme_fw_commit_args.2
deleted file mode 100644
index 81236ed..0000000
--- a/doc/man/nvme_fw_commit_args.2
+++ /dev/null
@@ -1,39 +0,0 @@
-.TH "libnvme" 9 "struct nvme_fw_commit_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_fw_commit_args \- Arguments for the NVMe Firmware Commit command
-.SH SYNOPSIS
-struct nvme_fw_commit_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " enum nvme_fw_commit_ca action;"
-.br
-.BI " __u8 slot;"
-.br
-.BI " bool bpid;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_fw_commit_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "action" 12
-Action to use for the firmware image, see \fIenum nvme_fw_commit_ca\fP
-.IP "slot" 12
-Firmware slot to commit the downloaded image
-.IP "bpid" 12
-Set to true to select the boot partition id
diff --git a/doc/man/nvme_fw_commit_ca.2 b/doc/man/nvme_fw_commit_ca.2
index 90194e8..ff0e3af 100644
--- a/doc/man/nvme_fw_commit_ca.2
+++ b/doc/man/nvme_fw_commit_ca.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_fw_commit_ca" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_fw_commit_ca" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_fw_commit_ca \-
+enum nvme_fw_commit_ca \- Firmware Commit - Commit Action
.SH SYNOPSIS
enum nvme_fw_commit_ca {
.br
@@ -55,5 +55,5 @@ Partition specified by the Boot
Partition ID field.
.IP "NVME_FW_COMMIT_CA_ACTIVATE_BOOT_PARTITION" 12
Mark the Boot Partition specified in
-the BPID field as active and update
+the BPID field as active and update
BPINFO.ABPID.
diff --git a/doc/man/nvme_fw_commit_event.2 b/doc/man/nvme_fw_commit_event.2
index 30bd35f..24e0026 100644
--- a/doc/man/nvme_fw_commit_event.2
+++ b/doc/man/nvme_fw_commit_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_fw_commit_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_fw_commit_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_fw_commit_event \-
+struct nvme_fw_commit_event \- Firmware Commit Event Data
.SH SYNOPSIS
struct nvme_fw_commit_event {
.br
diff --git a/doc/man/nvme_fw_download.2 b/doc/man/nvme_fw_download.2
index e810902..fd43815 100644
--- a/doc/man/nvme_fw_download.2
+++ b/doc/man/nvme_fw_download.2
@@ -1,4 +1,4 @@
-.TH "nvme_fw_download" 9 "nvme_fw_download" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_fw_download" 9 "nvme_fw_download" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_fw_download \- Download part or all of a firmware image to the controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_fw_download_args.2 b/doc/man/nvme_fw_download_args.2
deleted file mode 100644
index 46ba23a..0000000
--- a/doc/man/nvme_fw_download_args.2
+++ /dev/null
@@ -1,39 +0,0 @@
-.TH "libnvme" 9 "struct nvme_fw_download_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_fw_download_args \- Arguments for the NVMe Firmware Download command
-.SH SYNOPSIS
-struct nvme_fw_download_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 offset;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-Userspace address of the firmware data
-.IP "args_size" 12
-Size of \fIstruct nvme_fw_download_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "offset" 12
-Offset in the firmware data
-.IP "data_len" 12
-Length of data in this command in bytes
diff --git a/doc/man/nvme_fw_download_seq.2 b/doc/man/nvme_fw_download_seq.2
index 9afb52c..b040a40 100644
--- a/doc/man/nvme_fw_download_seq.2
+++ b/doc/man/nvme_fw_download_seq.2
@@ -1,4 +1,4 @@
-.TH "nvme_fw_download_seq" 9 "nvme_fw_download_seq" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_fw_download_seq" 9 "nvme_fw_download_seq" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_fw_download_seq \- Firmware download sequence
.SH SYNOPSIS
@@ -16,7 +16,7 @@ Total size of the firmware image to transfer
.IP "xfer" 12
Maximum size to send with each partial transfer
.IP "offset" 12
-Starting offset to send with this firmware downlaod
+Starting offset to send with this firmware download
.IP "buf" 12
Address of buffer containing all or part of the firmware image.
.SH "RETURN"
diff --git a/doc/man/nvme_gen_dhchap_key.2 b/doc/man/nvme_gen_dhchap_key.2
index b9a0866..1e56703 100644
--- a/doc/man/nvme_gen_dhchap_key.2
+++ b/doc/man/nvme_gen_dhchap_key.2
@@ -1,4 +1,4 @@
-.TH "nvme_gen_dhchap_key" 9 "nvme_gen_dhchap_key" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_gen_dhchap_key" 9 "nvme_gen_dhchap_key" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_gen_dhchap_key \- DH-HMAC-CHAP key generation
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_ana_log_len.2 b/doc/man/nvme_get_ana_log_len.2
index 9c2efec..59c553a 100644
--- a/doc/man/nvme_get_ana_log_len.2
+++ b/doc/man/nvme_get_ana_log_len.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_ana_log_len" 9 "nvme_get_ana_log_len" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_ana_log_len" 9 "nvme_get_ana_log_len" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_ana_log_len \- Retreive size of the current ANA log
+nvme_get_ana_log_len \- Retrieve size of the current ANA log
.SH SYNOPSIS
.B "int" nvme_get_ana_log_len
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_attr.2 b/doc/man/nvme_get_attr.2
index 2c52587..ffb8a90 100644
--- a/doc/man/nvme_get_attr.2
+++ b/doc/man/nvme_get_attr.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_attr" 9 "nvme_get_attr" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_attr" 9 "nvme_get_attr" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_attr \- Read sysfs attribute
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_ctrl_attr.2 b/doc/man/nvme_get_ctrl_attr.2
index 6ec20f6..f012f5a 100644
--- a/doc/man/nvme_get_ctrl_attr.2
+++ b/doc/man/nvme_get_ctrl_attr.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_ctrl_attr" 9 "nvme_get_ctrl_attr" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_ctrl_attr" 9 "nvme_get_ctrl_attr" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_ctrl_attr \- Read controller sysfs attribute
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_ctrl_telemetry.2 b/doc/man/nvme_get_ctrl_telemetry.2
index c77da5f..7020b4c 100644
--- a/doc/man/nvme_get_ctrl_telemetry.2
+++ b/doc/man/nvme_get_ctrl_telemetry.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_ctrl_telemetry" 9 "nvme_get_ctrl_telemetry" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_ctrl_telemetry" 9 "nvme_get_ctrl_telemetry" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_ctrl_telemetry \- Get controller telemetry log
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_directive_receive_length.2 b/doc/man/nvme_get_directive_receive_length.2
index 54dd32b..6cf3253 100644
--- a/doc/man/nvme_get_directive_receive_length.2
+++ b/doc/man/nvme_get_directive_receive_length.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_directive_receive_length" 9 "nvme_get_directive_receive_length" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_directive_receive_length" 9 "nvme_get_directive_receive_length" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_directive_receive_length \-
+nvme_get_directive_receive_length \- Get directive receive length
.SH SYNOPSIS
.B "int" nvme_get_directive_receive_length
.BI "(enum nvme_directive_dtype dtype " ","
diff --git a/doc/man/nvme_get_feature_length.2 b/doc/man/nvme_get_feature_length.2
index c8f66a0..3d616ac 100644
--- a/doc/man/nvme_get_feature_length.2
+++ b/doc/man/nvme_get_feature_length.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_feature_length" 9 "nvme_get_feature_length" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_feature_length" 9 "nvme_get_feature_length" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_feature_length \- Retreive the command payload length for a specific feature identifier
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_features.2 b/doc/man/nvme_get_features.2
index df6d662..904c7ef 100644
--- a/doc/man/nvme_get_features.2
+++ b/doc/man/nvme_get_features.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_features" 9 "nvme_get_features" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features" 9 "nvme_get_features" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_features \- Retrieve a feature attribute
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_features_arbitration.2 b/doc/man/nvme_get_features_arbitration.2
index b6a5fb5..7366722 100644
--- a/doc/man/nvme_get_features_arbitration.2
+++ b/doc/man/nvme_get_features_arbitration.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_arbitration" 9 "nvme_get_features_arbitration" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_arbitration" 9 "nvme_get_features_arbitration" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_arbitration \-
+nvme_get_features_arbitration \- Get arbitration feature
.SH SYNOPSIS
.B "int" nvme_get_features_arbitration
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_args.2 b/doc/man/nvme_get_features_args.2
deleted file mode 100644
index ea214fa..0000000
--- a/doc/man/nvme_get_features_args.2
+++ /dev/null
@@ -1,56 +0,0 @@
-.TH "libnvme" 9 "struct nvme_get_features_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_get_features_args \- Arguments for the NVMe Admin Get Feature command
-.SH SYNOPSIS
-struct nvme_get_features_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_get_features_sel sel;"
-.br
-.BI " __u32 cdw11;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u8 fid;"
-.br
-.BI " __u8 uuidx;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-User address of feature data, if applicable
-.IP "args_size" 12
-Size of \fIstruct nvme_get_features_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID, if applicable
-.IP "sel" 12
-Select which type of attribute to return,
-see \fIenum nvme_get_features_sel\fP
-.IP "cdw11" 12
-Feature specific command dword11 field
-.IP "data_len" 12
-Length of feature data, if applicable, in bytes
-.IP "fid" 12
-Feature identifier, see \fIenum nvme_features_id\fP
-.IP "uuidx" 12
-UUID Index for differentiating vendor specific encoding
diff --git a/doc/man/nvme_get_features_async_event.2 b/doc/man/nvme_get_features_async_event.2
index ffcefe9..cfc97e8 100644
--- a/doc/man/nvme_get_features_async_event.2
+++ b/doc/man/nvme_get_features_async_event.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_async_event" 9 "nvme_get_features_async_event" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_async_event" 9 "nvme_get_features_async_event" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_async_event \-
+nvme_get_features_async_event \- Get asynchronous event feature
.SH SYNOPSIS
.B "int" nvme_get_features_async_event
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_auto_pst.2 b/doc/man/nvme_get_features_auto_pst.2
index 56824c9..d9a7581 100644
--- a/doc/man/nvme_get_features_auto_pst.2
+++ b/doc/man/nvme_get_features_auto_pst.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_auto_pst" 9 "nvme_get_features_auto_pst" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_auto_pst" 9 "nvme_get_features_auto_pst" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_auto_pst \-
+nvme_get_features_auto_pst \- Get autonomous power state feature
.SH SYNOPSIS
.B "int" nvme_get_features_auto_pst
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_data.2 b/doc/man/nvme_get_features_data.2
index 02b82e4..165d198 100644
--- a/doc/man/nvme_get_features_data.2
+++ b/doc/man/nvme_get_features_data.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_features_data" 9 "nvme_get_features_data" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_data" 9 "nvme_get_features_data" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_features_data \- Helper function for @nvme_get_features()
.SH SYNOPSIS
@@ -22,3 +22,6 @@ Length of feature data, if applicable, in bytes
User address of feature data, if applicable
.IP "result" 12
The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_endurance_event_cfg.2 b/doc/man/nvme_get_features_endurance_event_cfg.2
index 6087ec5..35ee22e 100644
--- a/doc/man/nvme_get_features_endurance_event_cfg.2
+++ b/doc/man/nvme_get_features_endurance_event_cfg.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_endurance_event_cfg" 9 "nvme_get_features_endurance_event_cfg" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_endurance_event_cfg" 9 "nvme_get_features_endurance_event_cfg" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_endurance_event_cfg \-
+nvme_get_features_endurance_event_cfg \- Get endurance event config feature
.SH SYNOPSIS
.B "int" nvme_get_features_endurance_event_cfg
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_err_recovery.2 b/doc/man/nvme_get_features_err_recovery.2
index ab1bf69..f43ba60 100644
--- a/doc/man/nvme_get_features_err_recovery.2
+++ b/doc/man/nvme_get_features_err_recovery.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_err_recovery" 9 "nvme_get_features_err_recovery" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_err_recovery" 9 "nvme_get_features_err_recovery" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_err_recovery \-
+nvme_get_features_err_recovery \- Get error recovery feature
.SH SYNOPSIS
.B "int" nvme_get_features_err_recovery
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_hctm.2 b/doc/man/nvme_get_features_hctm.2
index d0a7d2b..f478888 100644
--- a/doc/man/nvme_get_features_hctm.2
+++ b/doc/man/nvme_get_features_hctm.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_hctm" 9 "nvme_get_features_hctm" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_hctm" 9 "nvme_get_features_hctm" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_hctm \-
+nvme_get_features_hctm \- Get thermal management feature
.SH SYNOPSIS
.B "int" nvme_get_features_hctm
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_host_behavior.2 b/doc/man/nvme_get_features_host_behavior.2
index 720a2a6..ff98eb2 100644
--- a/doc/man/nvme_get_features_host_behavior.2
+++ b/doc/man/nvme_get_features_host_behavior.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_host_behavior" 9 "nvme_get_features_host_behavior" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_host_behavior" 9 "nvme_get_features_host_behavior" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_host_behavior \-
+nvme_get_features_host_behavior \- Get host behavior feature
.SH SYNOPSIS
.B "int" nvme_get_features_host_behavior
.BI "(int fd " ","
@@ -13,7 +13,7 @@ File descriptor of nvme device
.IP "sel" 12
Select which type of attribute to return, see \fIenum nvme_get_features_sel\fP
.IP "data" 12
-Poniter to structure nvme_feat_host_behavior
+Pointer to structure nvme_feat_host_behavior
.IP "result" 12
The command completion result from CQE dword0
.SH "RETURN"
diff --git a/doc/man/nvme_get_features_host_id.2 b/doc/man/nvme_get_features_host_id.2
index 86e91ce..b1a25d7 100644
--- a/doc/man/nvme_get_features_host_id.2
+++ b/doc/man/nvme_get_features_host_id.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_host_id" 9 "nvme_get_features_host_id" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_host_id" 9 "nvme_get_features_host_id" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_host_id \-
+nvme_get_features_host_id \- Get host id feature
.SH SYNOPSIS
.B "int" nvme_get_features_host_id
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_host_mem_buf.2 b/doc/man/nvme_get_features_host_mem_buf.2
index 2769024..65ecacd 100644
--- a/doc/man/nvme_get_features_host_mem_buf.2
+++ b/doc/man/nvme_get_features_host_mem_buf.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_host_mem_buf" 9 "nvme_get_features_host_mem_buf" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_host_mem_buf" 9 "nvme_get_features_host_mem_buf" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_host_mem_buf \-
+nvme_get_features_host_mem_buf \- Get host memory buffer feature
.SH SYNOPSIS
.B "int" nvme_get_features_host_mem_buf
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_iocs_profile.2 b/doc/man/nvme_get_features_iocs_profile.2
index a771076..cae3a88 100644
--- a/doc/man/nvme_get_features_iocs_profile.2
+++ b/doc/man/nvme_get_features_iocs_profile.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_iocs_profile" 9 "nvme_get_features_iocs_profile" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_iocs_profile" 9 "nvme_get_features_iocs_profile" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_iocs_profile \-
+nvme_get_features_iocs_profile \- Get IOCS profile feature
.SH SYNOPSIS
.B "int" nvme_get_features_iocs_profile
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_irq_coalesce.2 b/doc/man/nvme_get_features_irq_coalesce.2
index 4a7974a..9eac569 100644
--- a/doc/man/nvme_get_features_irq_coalesce.2
+++ b/doc/man/nvme_get_features_irq_coalesce.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_irq_coalesce" 9 "nvme_get_features_irq_coalesce" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_irq_coalesce" 9 "nvme_get_features_irq_coalesce" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_irq_coalesce \-
+nvme_get_features_irq_coalesce \- Get IRQ coalesce feature
.SH SYNOPSIS
.B "int" nvme_get_features_irq_coalesce
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_irq_config.2 b/doc/man/nvme_get_features_irq_config.2
index 2d6a207..a164fa3 100644
--- a/doc/man/nvme_get_features_irq_config.2
+++ b/doc/man/nvme_get_features_irq_config.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_irq_config" 9 "nvme_get_features_irq_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_irq_config" 9 "nvme_get_features_irq_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_irq_config \-
+nvme_get_features_irq_config \- Get IRQ config feature
.SH SYNOPSIS
.B "int" nvme_get_features_irq_config
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_kato.2 b/doc/man/nvme_get_features_kato.2
index cb9d29e..bc442cd 100644
--- a/doc/man/nvme_get_features_kato.2
+++ b/doc/man/nvme_get_features_kato.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_kato" 9 "nvme_get_features_kato" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_kato" 9 "nvme_get_features_kato" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_kato \-
+nvme_get_features_kato \- Get keep alive timeout feature
.SH SYNOPSIS
.B "int" nvme_get_features_kato
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_lba_range.2 b/doc/man/nvme_get_features_lba_range.2
index cdb80c6..0cfd3f4 100644
--- a/doc/man/nvme_get_features_lba_range.2
+++ b/doc/man/nvme_get_features_lba_range.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_lba_range" 9 "nvme_get_features_lba_range" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_lba_range" 9 "nvme_get_features_lba_range" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_lba_range \-
+nvme_get_features_lba_range \- Get LBA range feature
.SH SYNOPSIS
.B "int" nvme_get_features_lba_range
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_lba_sts_interval.2 b/doc/man/nvme_get_features_lba_sts_interval.2
index a8ba856..62f0673 100644
--- a/doc/man/nvme_get_features_lba_sts_interval.2
+++ b/doc/man/nvme_get_features_lba_sts_interval.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_lba_sts_interval" 9 "nvme_get_features_lba_sts_interval" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_lba_sts_interval" 9 "nvme_get_features_lba_sts_interval" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_lba_sts_interval \-
+nvme_get_features_lba_sts_interval \- Get LBA status information feature
.SH SYNOPSIS
.B "int" nvme_get_features_lba_sts_interval
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_nopsc.2 b/doc/man/nvme_get_features_nopsc.2
index 92b4e18..443f602 100644
--- a/doc/man/nvme_get_features_nopsc.2
+++ b/doc/man/nvme_get_features_nopsc.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_nopsc" 9 "nvme_get_features_nopsc" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_nopsc" 9 "nvme_get_features_nopsc" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_nopsc \-
+nvme_get_features_nopsc \- Get non-operational power state feature
.SH SYNOPSIS
.B "int" nvme_get_features_nopsc
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_num_queues.2 b/doc/man/nvme_get_features_num_queues.2
index ff528b0..f09092d 100644
--- a/doc/man/nvme_get_features_num_queues.2
+++ b/doc/man/nvme_get_features_num_queues.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_num_queues" 9 "nvme_get_features_num_queues" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_num_queues" 9 "nvme_get_features_num_queues" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_num_queues \-
+nvme_get_features_num_queues \- Get number of queues feature
.SH SYNOPSIS
.B "int" nvme_get_features_num_queues
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_plm_config.2 b/doc/man/nvme_get_features_plm_config.2
index c9994db..6bd20e2 100644
--- a/doc/man/nvme_get_features_plm_config.2
+++ b/doc/man/nvme_get_features_plm_config.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_plm_config" 9 "nvme_get_features_plm_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_plm_config" 9 "nvme_get_features_plm_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_plm_config \-
+nvme_get_features_plm_config \- Get predictable latency feature
.SH SYNOPSIS
.B "int" nvme_get_features_plm_config
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_plm_window.2 b/doc/man/nvme_get_features_plm_window.2
index effac98..cc7185a 100644
--- a/doc/man/nvme_get_features_plm_window.2
+++ b/doc/man/nvme_get_features_plm_window.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_plm_window" 9 "nvme_get_features_plm_window" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_plm_window" 9 "nvme_get_features_plm_window" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_plm_window \-
+nvme_get_features_plm_window \- Get window select feature
.SH SYNOPSIS
.B "int" nvme_get_features_plm_window
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_power_mgmt.2 b/doc/man/nvme_get_features_power_mgmt.2
index a8ab0f1..c5d1b0e 100644
--- a/doc/man/nvme_get_features_power_mgmt.2
+++ b/doc/man/nvme_get_features_power_mgmt.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_power_mgmt" 9 "nvme_get_features_power_mgmt" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_power_mgmt" 9 "nvme_get_features_power_mgmt" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_power_mgmt \-
+nvme_get_features_power_mgmt \- Get power management feature
.SH SYNOPSIS
.B "int" nvme_get_features_power_mgmt
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_resv_mask.2 b/doc/man/nvme_get_features_resv_mask.2
index e197b46..f2de359 100644
--- a/doc/man/nvme_get_features_resv_mask.2
+++ b/doc/man/nvme_get_features_resv_mask.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_resv_mask" 9 "nvme_get_features_resv_mask" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_resv_mask" 9 "nvme_get_features_resv_mask" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_resv_mask \-
+nvme_get_features_resv_mask \- Get reservation mask feature
.SH SYNOPSIS
.B "int" nvme_get_features_resv_mask
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_resv_persist.2 b/doc/man/nvme_get_features_resv_persist.2
index 2146dba..f7dcad3 100644
--- a/doc/man/nvme_get_features_resv_persist.2
+++ b/doc/man/nvme_get_features_resv_persist.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_resv_persist" 9 "nvme_get_features_resv_persist" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_resv_persist" 9 "nvme_get_features_resv_persist" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_resv_persist \-
+nvme_get_features_resv_persist \- Get reservation persist feature
.SH SYNOPSIS
.B "int" nvme_get_features_resv_persist
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_rrl.2 b/doc/man/nvme_get_features_rrl.2
index 570cbdf..cf4086b 100644
--- a/doc/man/nvme_get_features_rrl.2
+++ b/doc/man/nvme_get_features_rrl.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_rrl" 9 "nvme_get_features_rrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_rrl" 9 "nvme_get_features_rrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_rrl \-
+nvme_get_features_rrl \- Get read recovery level feature
.SH SYNOPSIS
.B "int" nvme_get_features_rrl
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_sanitize.2 b/doc/man/nvme_get_features_sanitize.2
index dd81fc1..6cde6ed 100644
--- a/doc/man/nvme_get_features_sanitize.2
+++ b/doc/man/nvme_get_features_sanitize.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_sanitize" 9 "nvme_get_features_sanitize" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_sanitize" 9 "nvme_get_features_sanitize" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_sanitize \-
+nvme_get_features_sanitize \- Get sanitize feature
.SH SYNOPSIS
.B "int" nvme_get_features_sanitize
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_sel.2 b/doc/man/nvme_get_features_sel.2
index f2a9b86..dd2f303 100644
--- a/doc/man/nvme_get_features_sel.2
+++ b/doc/man/nvme_get_features_sel.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_get_features_sel" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_get_features_sel" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_get_features_sel \-
+enum nvme_get_features_sel \- Get Features - Select
.SH SYNOPSIS
enum nvme_get_features_sel {
.br
diff --git a/doc/man/nvme_get_features_simple.2 b/doc/man/nvme_get_features_simple.2
index 26b4fea..5b63f52 100644
--- a/doc/man/nvme_get_features_simple.2
+++ b/doc/man/nvme_get_features_simple.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_features_simple" 9 "nvme_get_features_simple" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_simple" 9 "nvme_get_features_simple" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_features_simple \- Helper function for @nvme_get_features()
.SH SYNOPSIS
@@ -16,3 +16,6 @@ Feature identifier
Namespace ID, if applicable
.IP "result" 12
The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_features_sw_progress.2 b/doc/man/nvme_get_features_sw_progress.2
index 602237b..81a3cb9 100644
--- a/doc/man/nvme_get_features_sw_progress.2
+++ b/doc/man/nvme_get_features_sw_progress.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_sw_progress" 9 "nvme_get_features_sw_progress" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_sw_progress" 9 "nvme_get_features_sw_progress" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_sw_progress \-
+nvme_get_features_sw_progress \- Get software progress feature
.SH SYNOPSIS
.B "int" nvme_get_features_sw_progress
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_temp_thresh.2 b/doc/man/nvme_get_features_temp_thresh.2
index 7b781f2..a49ef6e 100644
--- a/doc/man/nvme_get_features_temp_thresh.2
+++ b/doc/man/nvme_get_features_temp_thresh.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_temp_thresh" 9 "nvme_get_features_temp_thresh" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_temp_thresh" 9 "nvme_get_features_temp_thresh" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_temp_thresh \-
+nvme_get_features_temp_thresh \- Get temperature threshold feature
.SH SYNOPSIS
.B "int" nvme_get_features_temp_thresh
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_timestamp.2 b/doc/man/nvme_get_features_timestamp.2
index 4828dd1..7624d4e 100644
--- a/doc/man/nvme_get_features_timestamp.2
+++ b/doc/man/nvme_get_features_timestamp.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_timestamp" 9 "nvme_get_features_timestamp" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_timestamp" 9 "nvme_get_features_timestamp" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_timestamp \-
+nvme_get_features_timestamp \- Get timestamp feature
.SH SYNOPSIS
.B "int" nvme_get_features_timestamp
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_volatile_wc.2 b/doc/man/nvme_get_features_volatile_wc.2
index 9a3ca60..3dad5df 100644
--- a/doc/man/nvme_get_features_volatile_wc.2
+++ b/doc/man/nvme_get_features_volatile_wc.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_volatile_wc" 9 "nvme_get_features_volatile_wc" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_volatile_wc" 9 "nvme_get_features_volatile_wc" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_volatile_wc \-
+nvme_get_features_volatile_wc \- Get volatile write cache feature
.SH SYNOPSIS
.B "int" nvme_get_features_volatile_wc
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_write_atomic.2 b/doc/man/nvme_get_features_write_atomic.2
index bd8cc59..05d13b5 100644
--- a/doc/man/nvme_get_features_write_atomic.2
+++ b/doc/man/nvme_get_features_write_atomic.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_write_atomic" 9 "nvme_get_features_write_atomic" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_write_atomic" 9 "nvme_get_features_write_atomic" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_write_atomic \-
+nvme_get_features_write_atomic \- Get write atomic feature
.SH SYNOPSIS
.B "int" nvme_get_features_write_atomic
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_features_write_protect.2 b/doc/man/nvme_get_features_write_protect.2
index 5c6bee6..849cdda 100644
--- a/doc/man/nvme_get_features_write_protect.2
+++ b/doc/man/nvme_get_features_write_protect.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_features_write_protect" 9 "nvme_get_features_write_protect" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_features_write_protect" 9 "nvme_get_features_write_protect" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_features_write_protect \-
+nvme_get_features_write_protect \- Get write protect feature
.SH SYNOPSIS
.B "int" nvme_get_features_write_protect
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_host_telemetry.2 b/doc/man/nvme_get_host_telemetry.2
index 2737ee2..568e438 100644
--- a/doc/man/nvme_get_host_telemetry.2
+++ b/doc/man/nvme_get_host_telemetry.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_host_telemetry" 9 "nvme_get_host_telemetry" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_host_telemetry" 9 "nvme_get_host_telemetry" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_host_telemetry \- Get host telemetry log
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_lba_status.2 b/doc/man/nvme_get_lba_status.2
index 0a0d9cd..a444c6c 100644
--- a/doc/man/nvme_get_lba_status.2
+++ b/doc/man/nvme_get_lba_status.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_lba_status" 9 "nvme_get_lba_status" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_lba_status" 9 "nvme_get_lba_status" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_lba_status \- Retrieve information on possibly unrecoverable LBAs
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_lba_status_args.2 b/doc/man/nvme_get_lba_status_args.2
deleted file mode 100644
index f12ab36..0000000
--- a/doc/man/nvme_get_lba_status_args.2
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH "libnvme" 9 "struct nvme_get_lba_status_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_get_lba_status_args \- Arguments for the NVMe Get LBA Status command
-.SH SYNOPSIS
-struct nvme_get_lba_status_args {
-.br
-.BI " __u64 slba;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " struct nvme_lba_status *lbas;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 mndw;"
-.br
-.BI " enum nvme_lba_status_atype atype;"
-.br
-.BI " __u16 rl;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "slba" 12
-Starting logical block address to check statuses
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "lbas" 12
-Data payload to return status descriptors
-.IP "args_size" 12
-Size of \fIstruct nvme_get_lba_status_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID to retrieve LBA status
-.IP "mndw" 12
-Maximum number of dwords to return
-.IP "atype" 12
-Action type mechanism to determine LBA status desctriptors to
-return, see \fIenum nvme_lba_status_atype\fP
-.IP "rl" 12
-Range length from slba to perform the action
diff --git a/doc/man/nvme_get_lba_status_log.2 b/doc/man/nvme_get_lba_status_log.2
index 558fbaf..57fa028 100644
--- a/doc/man/nvme_get_lba_status_log.2
+++ b/doc/man/nvme_get_lba_status_log.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_lba_status_log" 9 "nvme_get_lba_status_log" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_lba_status_log" 9 "nvme_get_lba_status_log" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_lba_status_log \- Retreive the LBA Status log page
+nvme_get_lba_status_log \- Retrieve the LBA Status log page
.SH SYNOPSIS
.B "int" nvme_get_lba_status_log
.BI "(int fd " ","
@@ -12,7 +12,7 @@ File descriptor of the nvme device
.IP "rae" 12
Retain asynchronous events
.IP "log" 12
-On success, set to the value of the allocated and retreived log.
+On success, set to the value of the allocated and retrieved log.
.SH "RETURN"
The nvme command status if a response was received (see
\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log.2 b/doc/man/nvme_get_log.2
index e0a57ea..ba205c8 100644
--- a/doc/man/nvme_get_log.2
+++ b/doc/man/nvme_get_log.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log" 9 "nvme_get_log" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log" 9 "nvme_get_log" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log \- NVMe Admin Get Log command
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_log_ana.2 b/doc/man/nvme_get_log_ana.2
index 24d038e..e76eab7 100644
--- a/doc/man/nvme_get_log_ana.2
+++ b/doc/man/nvme_get_log_ana.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_ana" 9 "nvme_get_log_ana" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_ana" 9 "nvme_get_log_ana" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_ana \-
+nvme_get_log_ana \- Retrieve Asymmetric Namespace Access log page
.SH SYNOPSIS
.B "int" nvme_get_log_ana
.BI "(int fd " ","
@@ -27,7 +27,7 @@ This log consists of a header describing the log and descriptors containing
the asymmetric namespace access information for ANA Groups that contain
namespaces that are attached to the controller processing the command.
-See \fIstruct nvme_ana_rsp_hdr\fP for the defintion of the returned structure.
+See \fIstruct nvme_ana_rsp_hdr\fP for the definition of the returned structure.
.SH "RETURN"
The nvme command status if a response was received (see
\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_ana_groups.2 b/doc/man/nvme_get_log_ana_groups.2
index 8e1f5c6..b9421ed 100644
--- a/doc/man/nvme_get_log_ana_groups.2
+++ b/doc/man/nvme_get_log_ana_groups.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_ana_groups" 9 "nvme_get_log_ana_groups" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_ana_groups" 9 "nvme_get_log_ana_groups" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_ana_groups \-
+nvme_get_log_ana_groups \- Retrieve Asymmetric Namespace Access groups only log page
.SH SYNOPSIS
.B "int" nvme_get_log_ana_groups
.BI "(int fd " ","
@@ -17,4 +17,7 @@ The allocated length of the log page
.IP "log" 12
User address to store the ana group log
.SH "DESCRIPTION"
-See \fIstruct nvme_ana_group_desc\fP for the defintion of the returned structure.
+See \fIstruct nvme_ana_group_desc\fP for the definition of the returned structure.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_args.2 b/doc/man/nvme_get_log_args.2
deleted file mode 100644
index 60a6db6..0000000
--- a/doc/man/nvme_get_log_args.2
+++ /dev/null
@@ -1,74 +0,0 @@
-.TH "libnvme" 9 "struct nvme_get_log_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_get_log_args \- Arguments for the NVMe Admin Get Log command
-.SH SYNOPSIS
-struct nvme_get_log_args {
-.br
-.BI " __u64 lpo;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *log;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " enum nvme_cmd_get_log_lid lid;"
-.br
-.BI " __u32 len;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_csi csi;"
-.br
-.BI " __u16 lsi;"
-.br
-.BI " __u8 lsp;"
-.br
-.BI " __u8 uuidx;"
-.br
-.BI " bool rae;"
-.br
-.BI " bool ot;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "lpo" 12
-Log page offset for partial log transfers
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "log" 12
-User space destination address to transfer the data
-.IP "args_size" 12
-Length of the structure
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "lid" 12
-Log page identifier, see \fIenum nvme_cmd_get_log_lid\fP for known
-values
-.IP "len" 12
-Length of provided user buffer to hold the log data in bytes
-.IP "nsid" 12
-Namespace identifier, if applicable
-.IP "csi" 12
-Command set identifier, see \fIenum nvme_csi\fP for known values
-.IP "lsi" 12
-Log Specific Identifier
-.IP "lsp" 12
-Log specific field
-.IP "uuidx" 12
-UUID selection, if supported
-.IP "rae" 12
-Retain asynchronous events
-.IP "ot" 12
-Offset Type; if set \fIlpo\fP specifies the index into the list
-of data structures, otherwise \fIlpo\fP specifies the byte offset
-into the log page.
diff --git a/doc/man/nvme_get_log_boot_partition.2 b/doc/man/nvme_get_log_boot_partition.2
index b6917b1..d3ccb34 100644
--- a/doc/man/nvme_get_log_boot_partition.2
+++ b/doc/man/nvme_get_log_boot_partition.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_boot_partition" 9 "nvme_get_log_boot_partition" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_boot_partition" 9 "nvme_get_log_boot_partition" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_boot_partition \-
+nvme_get_log_boot_partition \- Retrieve Boot Partition
.SH SYNOPSIS
.B "int" nvme_get_log_boot_partition
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_log_changed_ns_list.2 b/doc/man/nvme_get_log_changed_ns_list.2
index ce4984d..f7d893e 100644
--- a/doc/man/nvme_get_log_changed_ns_list.2
+++ b/doc/man/nvme_get_log_changed_ns_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log_changed_ns_list" 9 "nvme_get_log_changed_ns_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_changed_ns_list" 9 "nvme_get_log_changed_ns_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_changed_ns_list \- Retrieve namespace changed list
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_log_cmd_effects.2 b/doc/man/nvme_get_log_cmd_effects.2
index b443981..9dc350e 100644
--- a/doc/man/nvme_get_log_cmd_effects.2
+++ b/doc/man/nvme_get_log_cmd_effects.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log_cmd_effects" 9 "nvme_get_log_cmd_effects" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_cmd_effects" 9 "nvme_get_log_cmd_effects" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_cmd_effects \- Retrieve nvme command effects log
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_log_create_telemetry_host.2 b/doc/man/nvme_get_log_create_telemetry_host.2
index 59328c7..5752f99 100644
--- a/doc/man/nvme_get_log_create_telemetry_host.2
+++ b/doc/man/nvme_get_log_create_telemetry_host.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log_create_telemetry_host" 9 "nvme_get_log_create_telemetry_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_create_telemetry_host" 9 "nvme_get_log_create_telemetry_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_create_telemetry_host \- Create host telemetry log
.SH SYNOPSIS
@@ -10,3 +10,6 @@ nvme_get_log_create_telemetry_host \- Create host telemetry log
File descriptor of nvme device
.IP "log" 12
Userspace address of the log payload
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_device_self_test.2 b/doc/man/nvme_get_log_device_self_test.2
index 262e223..148ba00 100644
--- a/doc/man/nvme_get_log_device_self_test.2
+++ b/doc/man/nvme_get_log_device_self_test.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log_device_self_test" 9 "nvme_get_log_device_self_test" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_device_self_test" 9 "nvme_get_log_device_self_test" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_device_self_test \- Retrieve the device self test log
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_log_discovery.2 b/doc/man/nvme_get_log_discovery.2
index cc84ee9..15add7c 100644
--- a/doc/man/nvme_get_log_discovery.2
+++ b/doc/man/nvme_get_log_discovery.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_discovery" 9 "nvme_get_log_discovery" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_discovery" 9 "nvme_get_log_discovery" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_discovery \-
+nvme_get_log_discovery \- Retrieve Discovery log page
.SH SYNOPSIS
.B "int" nvme_get_log_discovery
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_log_endurance_group.2 b/doc/man/nvme_get_log_endurance_group.2
index 7a305f7..bfb2bf9 100644
--- a/doc/man/nvme_get_log_endurance_group.2
+++ b/doc/man/nvme_get_log_endurance_group.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_endurance_group" 9 "nvme_get_log_endurance_group" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_endurance_group" 9 "nvme_get_log_endurance_group" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_endurance_group \-
+nvme_get_log_endurance_group \- Get Endurance Group log
.SH SYNOPSIS
.B "int" nvme_get_log_endurance_group
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_log_endurance_grp_evt.2 b/doc/man/nvme_get_log_endurance_grp_evt.2
index 81f1536..abb5c5a 100644
--- a/doc/man/nvme_get_log_endurance_grp_evt.2
+++ b/doc/man/nvme_get_log_endurance_grp_evt.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_endurance_grp_evt" 9 "nvme_get_log_endurance_grp_evt" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_endurance_grp_evt" 9 "nvme_get_log_endurance_grp_evt" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_endurance_grp_evt \-
+nvme_get_log_endurance_grp_evt \- Retrieve Rotational Media Information
.SH SYNOPSIS
.B "int" nvme_get_log_endurance_grp_evt
.BI "(int fd " ","
@@ -19,3 +19,6 @@ Offset to the start of the log page
The allocated length of the log page
.IP "log" 12
User address to store the log page
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_error.2 b/doc/man/nvme_get_log_error.2
index 2bcf0aa..8d653ec 100644
--- a/doc/man/nvme_get_log_error.2
+++ b/doc/man/nvme_get_log_error.2
@@ -1,10 +1,10 @@
-.TH "nvme_get_log_error" 9 "nvme_get_log_error" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_error" 9 "nvme_get_log_error" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_error \- Retrieve nvme error log
.SH SYNOPSIS
.B "int" nvme_get_log_error
.BI "(int fd " ","
-.BI "unsigned nr_entries " ","
+.BI "unsigned int nr_entries " ","
.BI "bool rae " ","
.BI "struct nvme_error_log_page *err_log " ");"
.SH ARGUMENTS
diff --git a/doc/man/nvme_get_log_fid_supported_effects.2 b/doc/man/nvme_get_log_fid_supported_effects.2
index ebe2223..09c081e 100644
--- a/doc/man/nvme_get_log_fid_supported_effects.2
+++ b/doc/man/nvme_get_log_fid_supported_effects.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_fid_supported_effects" 9 "nvme_get_log_fid_supported_effects" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_fid_supported_effects" 9 "nvme_get_log_fid_supported_effects" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_fid_supported_effects \-
+nvme_get_log_fid_supported_effects \- Retrieve Feature Identifiers Supported and Effects
.SH SYNOPSIS
.B "int" nvme_get_log_fid_supported_effects
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_log_fw_slot.2 b/doc/man/nvme_get_log_fw_slot.2
index 5ab7744..7d4b4c1 100644
--- a/doc/man/nvme_get_log_fw_slot.2
+++ b/doc/man/nvme_get_log_fw_slot.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log_fw_slot" 9 "nvme_get_log_fw_slot" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_fw_slot" 9 "nvme_get_log_fw_slot" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_fw_slot \- Retrieves the controller firmware log
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_log_lba_status.2 b/doc/man/nvme_get_log_lba_status.2
index f339eaa..ae47b46 100644
--- a/doc/man/nvme_get_log_lba_status.2
+++ b/doc/man/nvme_get_log_lba_status.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_lba_status" 9 "nvme_get_log_lba_status" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_lba_status" 9 "nvme_get_log_lba_status" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_lba_status \-
+nvme_get_log_lba_status \- Retrieve LBA Status
.SH SYNOPSIS
.B "int" nvme_get_log_lba_status
.BI "(int fd " ","
@@ -19,3 +19,6 @@ Offset to the start of the log page
The allocated length of the log page
.IP "log" 12
User address to store the log page
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_media_unit_stat.2 b/doc/man/nvme_get_log_media_unit_stat.2
index 8c40d10..a795a3b 100644
--- a/doc/man/nvme_get_log_media_unit_stat.2
+++ b/doc/man/nvme_get_log_media_unit_stat.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_media_unit_stat" 9 "nvme_get_log_media_unit_stat" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_media_unit_stat" 9 "nvme_get_log_media_unit_stat" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_media_unit_stat \-
+nvme_get_log_media_unit_stat \- Retrieve Media Unit Status
.SH SYNOPSIS
.B "int" nvme_get_log_media_unit_stat
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_log_mi_cmd_supported_effects.2 b/doc/man/nvme_get_log_mi_cmd_supported_effects.2
index 82e1aa7..7b9d965 100644
--- a/doc/man/nvme_get_log_mi_cmd_supported_effects.2
+++ b/doc/man/nvme_get_log_mi_cmd_supported_effects.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_mi_cmd_supported_effects" 9 "nvme_get_log_mi_cmd_supported_effects" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_mi_cmd_supported_effects" 9 "nvme_get_log_mi_cmd_supported_effects" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_mi_cmd_supported_effects \- displays the MI Commands Supported byt the controller
+nvme_get_log_mi_cmd_supported_effects \- displays the MI Commands Supported by the controller
.SH SYNOPSIS
.B "int" nvme_get_log_mi_cmd_supported_effects
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_log_page.2 b/doc/man/nvme_get_log_page.2
index 59edb54..e25d018 100644
--- a/doc/man/nvme_get_log_page.2
+++ b/doc/man/nvme_get_log_page.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log_page" 9 "nvme_get_log_page" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_page" 9 "nvme_get_log_page" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_page \- Get log page data
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_log_persistent_event.2 b/doc/man/nvme_get_log_persistent_event.2
index d95e984..cde6c1d 100644
--- a/doc/man/nvme_get_log_persistent_event.2
+++ b/doc/man/nvme_get_log_persistent_event.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_persistent_event" 9 "nvme_get_log_persistent_event" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_persistent_event" 9 "nvme_get_log_persistent_event" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_persistent_event \-
+nvme_get_log_persistent_event \- Retrieve Persistent Event Log
.SH SYNOPSIS
.B "int" nvme_get_log_persistent_event
.BI "(int fd " ","
@@ -16,3 +16,6 @@ Action the controller should take during processing this command
Size of \fIpevent_log\fP
.IP "pevent_log" 12
User address to store the persistent event log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_predictable_lat_event.2 b/doc/man/nvme_get_log_predictable_lat_event.2
index a796c95..c11957c 100644
--- a/doc/man/nvme_get_log_predictable_lat_event.2
+++ b/doc/man/nvme_get_log_predictable_lat_event.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_predictable_lat_event" 9 "nvme_get_log_predictable_lat_event" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_predictable_lat_event" 9 "nvme_get_log_predictable_lat_event" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_predictable_lat_event \-
+nvme_get_log_predictable_lat_event \- Retrieve Predictable Latency Event Aggregate Log Page
.SH SYNOPSIS
.B "int" nvme_get_log_predictable_lat_event
.BI "(int fd " ","
@@ -19,3 +19,6 @@ Offset into the predictable latency event
Length of provided user buffer to hold the log data in bytes
.IP "log" 12
User address for log page data
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_predictable_lat_nvmset.2 b/doc/man/nvme_get_log_predictable_lat_nvmset.2
index 089c9d9..7f13696 100644
--- a/doc/man/nvme_get_log_predictable_lat_nvmset.2
+++ b/doc/man/nvme_get_log_predictable_lat_nvmset.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_predictable_lat_nvmset" 9 "nvme_get_log_predictable_lat_nvmset" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_predictable_lat_nvmset" 9 "nvme_get_log_predictable_lat_nvmset" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_predictable_lat_nvmset \-
+nvme_get_log_predictable_lat_nvmset \- Predictable Latency Per NVM Set
.SH SYNOPSIS
.B "int" nvme_get_log_predictable_lat_nvmset
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_log_reservation.2 b/doc/man/nvme_get_log_reservation.2
index af522a2..e542673 100644
--- a/doc/man/nvme_get_log_reservation.2
+++ b/doc/man/nvme_get_log_reservation.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_reservation" 9 "nvme_get_log_reservation" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_reservation" 9 "nvme_get_log_reservation" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_reservation \-
+nvme_get_log_reservation \- Retrieve Reservation Notification
.SH SYNOPSIS
.B "int" nvme_get_log_reservation
.BI "(int fd " ","
@@ -13,3 +13,6 @@ File descriptor of nvme device
Retain asynchronous events
.IP "log" 12
User address to store the reservation log
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise
diff --git a/doc/man/nvme_get_log_sanitize.2 b/doc/man/nvme_get_log_sanitize.2
index 7210a04..a288759 100644
--- a/doc/man/nvme_get_log_sanitize.2
+++ b/doc/man/nvme_get_log_sanitize.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_sanitize" 9 "nvme_get_log_sanitize" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_sanitize" 9 "nvme_get_log_sanitize" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_sanitize \-
+nvme_get_log_sanitize \- Retrieve Sanitize Status
.SH SYNOPSIS
.B "int" nvme_get_log_sanitize
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_log_smart.2 b/doc/man/nvme_get_log_smart.2
index 5e6c1e6..59db53d 100644
--- a/doc/man/nvme_get_log_smart.2
+++ b/doc/man/nvme_get_log_smart.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log_smart" 9 "nvme_get_log_smart" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_smart" 9 "nvme_get_log_smart" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_smart \- Retrieve nvme smart log
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_log_support_cap_config_list.2 b/doc/man/nvme_get_log_support_cap_config_list.2
index 9eaea26..2650623 100644
--- a/doc/man/nvme_get_log_support_cap_config_list.2
+++ b/doc/man/nvme_get_log_support_cap_config_list.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_support_cap_config_list" 9 "nvme_get_log_support_cap_config_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_support_cap_config_list" 9 "nvme_get_log_support_cap_config_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_support_cap_config_list \-
+nvme_get_log_support_cap_config_list \- Retrieve Supported Capacity Configuration List
.SH SYNOPSIS
.B "int" nvme_get_log_support_cap_config_list
.BI "(int fd " ","
@@ -12,7 +12,7 @@ File descriptor of nvme device
.IP "domid" 12
Domain Identifier selection, if supported
.IP "cap" 12
--- undescribed --
+User address to store supported capabilities config list
.SH "RETURN"
The nvme command status if a response was received (see
\fIenum nvme_status_field\fP) or -1 with errno set otherwise
diff --git a/doc/man/nvme_get_log_supported_log_pages.2 b/doc/man/nvme_get_log_supported_log_pages.2
index 6376164..01fb122 100644
--- a/doc/man/nvme_get_log_supported_log_pages.2
+++ b/doc/man/nvme_get_log_supported_log_pages.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_log_supported_log_pages" 9 "nvme_get_log_supported_log_pages" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_supported_log_pages" 9 "nvme_get_log_supported_log_pages" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_log_supported_log_pages \- Retrieve nmve supported log pages
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_log_telemetry_ctrl.2 b/doc/man/nvme_get_log_telemetry_ctrl.2
index 4d97df7..528deec 100644
--- a/doc/man/nvme_get_log_telemetry_ctrl.2
+++ b/doc/man/nvme_get_log_telemetry_ctrl.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_telemetry_ctrl" 9 "nvme_get_log_telemetry_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_telemetry_ctrl" 9 "nvme_get_log_telemetry_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_telemetry_ctrl \-
+nvme_get_log_telemetry_ctrl \- Get Telemetry Controller-Initiated log page
.SH SYNOPSIS
.B "int" nvme_get_log_telemetry_ctrl
.BI "(int fd " ","
@@ -19,3 +19,9 @@ Offset into the telemetry data
Length of provided user buffer to hold the log data in bytes
.IP "log" 12
User address for log page data
+.SH "DESCRIPTION"
+Retrieves the Telemetry Controller-Initiated log page at the requested offset
+using the previously existing capture.
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_get_log_telemetry_host.2 b/doc/man/nvme_get_log_telemetry_host.2
index de8a91a..ab29f9a 100644
--- a/doc/man/nvme_get_log_telemetry_host.2
+++ b/doc/man/nvme_get_log_telemetry_host.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_telemetry_host" 9 "nvme_get_log_telemetry_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_telemetry_host" 9 "nvme_get_log_telemetry_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_telemetry_host \-
+nvme_get_log_telemetry_host \- Get Telemetry Host-Initiated log page
.SH SYNOPSIS
.B "int" nvme_get_log_telemetry_host
.BI "(int fd " ","
@@ -17,7 +17,7 @@ Length of provided user buffer to hold the log data in bytes
.IP "log" 12
User address for log page data
.SH "DESCRIPTION"
-Retreives the Telemetry Host-Initiated log page at the requested offset
+Retrieves the Telemetry Host-Initiated log page at the requested offset
using the previously existing capture.
.SH "RETURN"
The nvme command status if a response was received (see
diff --git a/doc/man/nvme_get_log_zns_changed_zones.2 b/doc/man/nvme_get_log_zns_changed_zones.2
index 8877aaa..474094a 100644
--- a/doc/man/nvme_get_log_zns_changed_zones.2
+++ b/doc/man/nvme_get_log_zns_changed_zones.2
@@ -1,6 +1,6 @@
-.TH "nvme_get_log_zns_changed_zones" 9 "nvme_get_log_zns_changed_zones" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_log_zns_changed_zones" 9 "nvme_get_log_zns_changed_zones" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_get_log_zns_changed_zones \-
+nvme_get_log_zns_changed_zones \- Retrieve list of zones that have changed
.SH SYNOPSIS
.B "int" nvme_get_log_zns_changed_zones
.BI "(int fd " ","
diff --git a/doc/man/nvme_get_logical_block_size.2 b/doc/man/nvme_get_logical_block_size.2
index b8709eb..ee3d468 100644
--- a/doc/man/nvme_get_logical_block_size.2
+++ b/doc/man/nvme_get_logical_block_size.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_logical_block_size" 9 "nvme_get_logical_block_size" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_logical_block_size" 9 "nvme_get_logical_block_size" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_logical_block_size \- Retrieve block size
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_new_host_telemetry.2 b/doc/man/nvme_get_new_host_telemetry.2
index f7bea6a..acfbc31 100644
--- a/doc/man/nvme_get_new_host_telemetry.2
+++ b/doc/man/nvme_get_new_host_telemetry.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_new_host_telemetry" 9 "nvme_get_new_host_telemetry" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_new_host_telemetry" 9 "nvme_get_new_host_telemetry" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_new_host_telemetry \- Get new host telemetry log
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_ns_attr.2 b/doc/man/nvme_get_ns_attr.2
index 9d001d9..ea26983 100644
--- a/doc/man/nvme_get_ns_attr.2
+++ b/doc/man/nvme_get_ns_attr.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_ns_attr" 9 "nvme_get_ns_attr" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_ns_attr" 9 "nvme_get_ns_attr" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_ns_attr \- Read namespace sysfs attribute
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_nsid.2 b/doc/man/nvme_get_nsid.2
index dcdfe02..319d1d8 100644
--- a/doc/man/nvme_get_nsid.2
+++ b/doc/man/nvme_get_nsid.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_nsid" 9 "nvme_get_nsid" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_nsid" 9 "nvme_get_nsid" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_nsid \- Retrieve the NSID from a namespace file descriptor
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_path_attr.2 b/doc/man/nvme_get_path_attr.2
index ca3ed4f..3c6e6e9 100644
--- a/doc/man/nvme_get_path_attr.2
+++ b/doc/man/nvme_get_path_attr.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_path_attr" 9 "nvme_get_path_attr" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_path_attr" 9 "nvme_get_path_attr" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_path_attr \- Read path sysfs attribute
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_property.2 b/doc/man/nvme_get_property.2
index 8988ae7..1b42216 100644
--- a/doc/man/nvme_get_property.2
+++ b/doc/man/nvme_get_property.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_property" 9 "nvme_get_property" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_property" 9 "nvme_get_property" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_property \- Get a controller property
.SH SYNOPSIS
diff --git a/doc/man/nvme_get_property_args.2 b/doc/man/nvme_get_property_args.2
deleted file mode 100644
index f7cb1f3..0000000
--- a/doc/man/nvme_get_property_args.2
+++ /dev/null
@@ -1,31 +0,0 @@
-.TH "libnvme" 9 "struct nvme_get_property_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_get_property_args \- Arguments for NVMe Get Property command
-.SH SYNOPSIS
-struct nvme_get_property_args {
-.br
-.BI " __u64 *value;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " int offset;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "value" 12
-Where the property's value will be stored on success
-.IP "args_size" 12
-Size of \fIstruct nvme_get_property_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "offset" 12
-Property offset from the base to retrieve
diff --git a/doc/man/nvme_get_subsys_attr.2 b/doc/man/nvme_get_subsys_attr.2
index 6d738ef..335dc1a 100644
--- a/doc/man/nvme_get_subsys_attr.2
+++ b/doc/man/nvme_get_subsys_attr.2
@@ -1,4 +1,4 @@
-.TH "nvme_get_subsys_attr" 9 "nvme_get_subsys_attr" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_get_subsys_attr" 9 "nvme_get_subsys_attr" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_get_subsys_attr \- Read subsystem sysfs attribute
.SH SYNOPSIS
diff --git a/doc/man/nvme_hmac_alg.2 b/doc/man/nvme_hmac_alg.2
index be6a07c..c10e4bf 100644
--- a/doc/man/nvme_hmac_alg.2
+++ b/doc/man/nvme_hmac_alg.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_hmac_alg" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_hmac_alg" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_hmac_alg \- HMAC algorithm
.SH SYNOPSIS
diff --git a/doc/man/nvme_host_behavior_support.2 b/doc/man/nvme_host_behavior_support.2
index c70a25d..51c836f 100644
--- a/doc/man/nvme_host_behavior_support.2
+++ b/doc/man/nvme_host_behavior_support.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_host_behavior_support" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_host_behavior_support" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_host_behavior_support \-
+enum nvme_host_behavior_support \- Enable Advanced Command
.SH SYNOPSIS
enum nvme_host_behavior_support {
.br
diff --git a/doc/man/nvme_host_get_dhchap_key.2 b/doc/man/nvme_host_get_dhchap_key.2
index 06505a2..9c0bba4 100644
--- a/doc/man/nvme_host_get_dhchap_key.2
+++ b/doc/man/nvme_host_get_dhchap_key.2
@@ -1,4 +1,4 @@
-.TH "nvme_host_get_dhchap_key" 9 "nvme_host_get_dhchap_key" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_host_get_dhchap_key" 9 "nvme_host_get_dhchap_key" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_host_get_dhchap_key \- Return host key
.SH SYNOPSIS
diff --git a/doc/man/nvme_host_get_hostid.2 b/doc/man/nvme_host_get_hostid.2
index 6e34d5c..eada095 100644
--- a/doc/man/nvme_host_get_hostid.2
+++ b/doc/man/nvme_host_get_hostid.2
@@ -1,4 +1,4 @@
-.TH "nvme_host_get_hostid" 9 "nvme_host_get_hostid" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_host_get_hostid" 9 "nvme_host_get_hostid" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_host_get_hostid \- Host ID of an nvme_host_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_host_get_hostnqn.2 b/doc/man/nvme_host_get_hostnqn.2
index 24c44f2..bb4d41c 100644
--- a/doc/man/nvme_host_get_hostnqn.2
+++ b/doc/man/nvme_host_get_hostnqn.2
@@ -1,4 +1,4 @@
-.TH "nvme_host_get_hostnqn" 9 "nvme_host_get_hostnqn" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_host_get_hostnqn" 9 "nvme_host_get_hostnqn" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_host_get_hostnqn \- Host NQN of an nvme_host_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_host_get_hostsymname.2 b/doc/man/nvme_host_get_hostsymname.2
index 9232596..a172da8 100644
--- a/doc/man/nvme_host_get_hostsymname.2
+++ b/doc/man/nvme_host_get_hostsymname.2
@@ -1,4 +1,4 @@
-.TH "nvme_host_get_hostsymname" 9 "nvme_host_get_hostsymname" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_host_get_hostsymname" 9 "nvme_host_get_hostsymname" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_host_get_hostsymname \- Get the host's symbolic name
.SH SYNOPSIS
diff --git a/doc/man/nvme_host_get_root.2 b/doc/man/nvme_host_get_root.2
index e2c2f92..18174ae 100644
--- a/doc/man/nvme_host_get_root.2
+++ b/doc/man/nvme_host_get_root.2
@@ -1,4 +1,4 @@
-.TH "nvme_host_get_root" 9 "nvme_host_get_root" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_host_get_root" 9 "nvme_host_get_root" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_host_get_root \- Returns nvme_root_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_host_mem_buf_attrs.2 b/doc/man/nvme_host_mem_buf_attrs.2
index 83bd190..06f1ad2 100644
--- a/doc/man/nvme_host_mem_buf_attrs.2
+++ b/doc/man/nvme_host_mem_buf_attrs.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_host_mem_buf_attrs" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_host_mem_buf_attrs" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_host_mem_buf_attrs \-
+struct nvme_host_mem_buf_attrs \- Host Memory Buffer - Attributes Data Structure
.SH SYNOPSIS
struct nvme_host_mem_buf_attrs {
.br
diff --git a/doc/man/nvme_host_metadata.2 b/doc/man/nvme_host_metadata.2
index beed508..a44b6bb 100644
--- a/doc/man/nvme_host_metadata.2
+++ b/doc/man/nvme_host_metadata.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_host_metadata" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_host_metadata" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_host_metadata \- Host Metadata Data Structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_host_set_dhchap_key.2 b/doc/man/nvme_host_set_dhchap_key.2
index e7a7a1a..6a68157 100644
--- a/doc/man/nvme_host_set_dhchap_key.2
+++ b/doc/man/nvme_host_set_dhchap_key.2
@@ -1,4 +1,4 @@
-.TH "nvme_host_set_dhchap_key" 9 "nvme_host_set_dhchap_key" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_host_set_dhchap_key" 9 "nvme_host_set_dhchap_key" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_host_set_dhchap_key \- set host key
.SH SYNOPSIS
diff --git a/doc/man/nvme_host_set_hostsymname.2 b/doc/man/nvme_host_set_hostsymname.2
index 54c0b43..28778f1 100644
--- a/doc/man/nvme_host_set_hostsymname.2
+++ b/doc/man/nvme_host_set_hostsymname.2
@@ -1,4 +1,4 @@
-.TH "nvme_host_set_hostsymname" 9 "nvme_host_set_hostsymname" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_host_set_hostsymname" 9 "nvme_host_set_hostsymname" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_host_set_hostsymname \- Set the host's symbolic name
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl.2 b/doc/man/nvme_id_ctrl.2
index e42c4df..8035ec7 100644
--- a/doc/man/nvme_id_ctrl.2
+++ b/doc/man/nvme_id_ctrl.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_id_ctrl" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_ctrl" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_id_ctrl \- Identify Controller data structure
.SH SYNOPSIS
@@ -206,11 +206,11 @@ the PCI SIG.
PCI Subsystem Vendor ID, the company vendor identifier that is
assigned by the PCI SIG for the subsystem.
.IP "sn" 12
-Serial Number in ascii
+Serial Number in ASCII
.IP "mn" 12
-Model Number in ascii
+Model Number in ASCII
.IP "fr" 12
-Firmware Revision in ascii, the currently active firmware
+Firmware Revision in ASCII, the currently active firmware
revision for the NVM subsystem
.IP "rab" 12
Recommended Arbitration Burst, reported as a power of two
@@ -252,13 +252,13 @@ Controller Type, see \fIenum nvme_id_ctrl_cntrltype\fP
FRU GUID, a 128-bit value that is globally unique for a given
Field Replaceable Unit
.IP "crdt1" 12
-Controller Retry Delay time in 100 millisecod units if CQE CRD
+Controller Retry Delay time in 100 millisecond units if CQE CRD
field is 1
.IP "crdt2" 12
-Controller Retry Delay time in 100 millisecod units if CQE CRD
+Controller Retry Delay time in 100 millisecond units if CQE CRD
field is 2
.IP "crdt3" 12
-Controller Retry Delay time in 100 millisecod units if CQE CRD
+Controller Retry Delay time in 100 millisecond units if CQE CRD
field is 3
.IP "rsvd134" 12
Reserved
@@ -463,7 +463,7 @@ Maximum Number of Allowed Namespaces indicates the maximum
number of namespaces supported by the NVM subsystem.
.IP "maxdna" 12
Maximum Domain Namespace Attachments indicates the maximum
-of the sum of the numver of namespaces attached to each I/O
+of the sum of the number of namespaces attached to each I/O
controller in the Domain.
.IP "maxcna" 12
Maximum I/O Controller Namespace Attachments indicates the
diff --git a/doc/man/nvme_id_ctrl_anacap.2 b/doc/man/nvme_id_ctrl_anacap.2
index f5106b6..6e8cc1b 100644
--- a/doc/man/nvme_id_ctrl_anacap.2
+++ b/doc/man/nvme_id_ctrl_anacap.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_anacap" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_anacap" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_anacap \- This field indicates the capabilities associated with Asymmetric Namespace Access Reporting.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_apsta.2 b/doc/man/nvme_id_ctrl_apsta.2
index c0c62c2..2b5160f 100644
--- a/doc/man/nvme_id_ctrl_apsta.2
+++ b/doc/man/nvme_id_ctrl_apsta.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_apsta" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_apsta" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_apsta \- Flags indicating the attributes of the autonomous power state transition feature.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_avscc.2 b/doc/man/nvme_id_ctrl_avscc.2
index 8864a80..a876629 100644
--- a/doc/man/nvme_id_ctrl_avscc.2
+++ b/doc/man/nvme_id_ctrl_avscc.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_avscc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_avscc" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_avscc \- Flags indicating the configuration settings for Admin Vendor Specific command handling.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_cmic.2 b/doc/man/nvme_id_ctrl_cmic.2
index 1844dcd..60eb47c 100644
--- a/doc/man/nvme_id_ctrl_cmic.2
+++ b/doc/man/nvme_id_ctrl_cmic.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_cmic" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_cmic" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_cmic \- Controller Multipath IO and Namespace Sharing Capabilities of the controller and NVM subsystem.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_cntrltype.2 b/doc/man/nvme_id_ctrl_cntrltype.2
index 9b3e6d8..93c3f75 100644
--- a/doc/man/nvme_id_ctrl_cntrltype.2
+++ b/doc/man/nvme_id_ctrl_cntrltype.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_cntrltype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_cntrltype" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_cntrltype \- Controller types
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_cqes.2 b/doc/man/nvme_id_ctrl_cqes.2
index d3914f0..fa176a8 100644
--- a/doc/man/nvme_id_ctrl_cqes.2
+++ b/doc/man/nvme_id_ctrl_cqes.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_cqes" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_cqes" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_cqes \- Defines the required and maximum Completion Queue entry size when using the NVM Command Set.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_ctratt.2 b/doc/man/nvme_id_ctrl_ctratt.2
index 3ee3da9..1cf06f3 100644
--- a/doc/man/nvme_id_ctrl_ctratt.2
+++ b/doc/man/nvme_id_ctrl_ctratt.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_ctratt" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_ctratt" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_ctratt \- Controller attributes
.SH SYNOPSIS
@@ -95,7 +95,7 @@ Multi-Domain Subsystem supported
.IP "NVME_CTRL_CTRATT_FIXED_CAP" 12
Fixed Capacity Management supported
.IP "NVME_CTRL_CTRATT_VARIABLE_CAP" 12
-Variable Capacity Managment supported
+Variable Capacity Management supported
.IP "NVME_CTRL_CTRATT_DEL_ENDURANCE_GROUPS" 12
Delete Endurance Groups supported
.IP "NVME_CTRL_CTRATT_DEL_NVM_SETS" 12
diff --git a/doc/man/nvme_id_ctrl_dctype.2 b/doc/man/nvme_id_ctrl_dctype.2
index 5548874..7b6136c 100644
--- a/doc/man/nvme_id_ctrl_dctype.2
+++ b/doc/man/nvme_id_ctrl_dctype.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_dctype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_dctype" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_dctype \- Discovery Controller types
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_dsto.2 b/doc/man/nvme_id_ctrl_dsto.2
index 2ede49c..c372ed0 100644
--- a/doc/man/nvme_id_ctrl_dsto.2
+++ b/doc/man/nvme_id_ctrl_dsto.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_dsto" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_dsto" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_dsto \- Flags indicating the optional Device Self-test command or operation behaviors supported by the controller or NVM subsystem.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_fcatt.2 b/doc/man/nvme_id_ctrl_fcatt.2
index 2f15f13..0910ea6 100644
--- a/doc/man/nvme_id_ctrl_fcatt.2
+++ b/doc/man/nvme_id_ctrl_fcatt.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_fcatt" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_fcatt" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_fcatt \- This field indicates attributes of the controller that are specific to NVMe over Fabrics.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_fna.2 b/doc/man/nvme_id_ctrl_fna.2
index 7b68f26..733b504 100644
--- a/doc/man/nvme_id_ctrl_fna.2
+++ b/doc/man/nvme_id_ctrl_fna.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_fna" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_fna" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_fna \- This field indicates attributes for the Format NVM command.
.SH SYNOPSIS
@@ -13,6 +13,10 @@ enum nvme_id_ctrl_fna {
.br
.br
.BI " NVME_CTRL_FNA_CRYPTO_ERASE"
+,
+.br
+.br
+.BI " NVME_CTRL_FNA_NSID_FFFFFFFF"
};
.SH Constants
@@ -37,3 +41,8 @@ particular namespace specified.
If set, then cryptographic erase is
supported. If cleared, then cryptographic
erase is not supported.
+.IP "NVME_CTRL_FNA_NSID_FFFFFFFF" 12
+If set, then format does not support
+nsid value set to FFFFFFFFh. If cleared,
+format supports nsid value set to
+FFFFFFFFh.
diff --git a/doc/man/nvme_id_ctrl_frmw.2 b/doc/man/nvme_id_ctrl_frmw.2
index f9e6fb0..269c06e 100644
--- a/doc/man/nvme_id_ctrl_frmw.2
+++ b/doc/man/nvme_id_ctrl_frmw.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_frmw" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_frmw" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_frmw \- Flags and values indicates capabilities regarding firmware updates from &struct nvme_id_ctrl.frmw.
.SH SYNOPSIS
@@ -13,6 +13,10 @@ enum nvme_id_ctrl_frmw {
.br
.br
.BI " NVME_CTRL_FRMW_FW_ACT_NO_RESET"
+,
+.br
+.br
+.BI " NVME_CTRL_FRMW_MP_UP_DETECTION"
};
.SH Constants
@@ -24,3 +28,7 @@ firmware slots that the controller supports.
.IP "NVME_CTRL_FRMW_FW_ACT_NO_RESET" 12
If set, the controller supports firmware
activation without a reset.
+.IP "NVME_CTRL_FRMW_MP_UP_DETECTION" 12
+If set, the controller is able to detect
+overlapping firmware/boot partition
+image update.
diff --git a/doc/man/nvme_id_ctrl_fuses.2 b/doc/man/nvme_id_ctrl_fuses.2
index 27634d4..9504726 100644
--- a/doc/man/nvme_id_ctrl_fuses.2
+++ b/doc/man/nvme_id_ctrl_fuses.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_fuses" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_fuses" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_fuses \- This field indicates the fused operations that the controller supports.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_hctm.2 b/doc/man/nvme_id_ctrl_hctm.2
index e6d11bf..0a608d6 100644
--- a/doc/man/nvme_id_ctrl_hctm.2
+++ b/doc/man/nvme_id_ctrl_hctm.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_hctm" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_hctm" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_hctm \- Flags indicate the attributes of the host controlled thermal management feature
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_lpa.2 b/doc/man/nvme_id_ctrl_lpa.2
index 1b88b89..19f05bc 100644
--- a/doc/man/nvme_id_ctrl_lpa.2
+++ b/doc/man/nvme_id_ctrl_lpa.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_lpa" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_lpa" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_lpa \- Flags indicating optional attributes for log pages that are accessed via the Get Log Page command.
.SH SYNOPSIS
@@ -21,11 +21,45 @@ enum nvme_id_ctrl_lpa {
.br
.br
.BI " NVME_CTRL_LPA_PERSETENT_EVENT"
+,
+.br
+.br
+.BI " NVME_CTRL_LPA_LI0_LI5_LI12_LI13"
+,
+.br
+.br
+.BI " NVME_CTRL_LPA_DA4_TELEMETRY"
};
.SH Constants
.IP "NVME_CTRL_LPA_SMART_PER_NS" 12
+If set, controller supports SMART/Health log
+page on a per namespace basis.
.IP "NVME_CTRL_LPA_CMD_EFFECTS" 12
+If Set, the controller supports the commands
+supported and effects log page.
.IP "NVME_CTRL_LPA_EXTENDED" 12
+If set, the controller supports extended data
+for log page command including extended number
+of dwords and log page offset fields.
.IP "NVME_CTRL_LPA_TELEMETRY" 12
+If set, the controller supports the telemetry
+host-initiated and telemetry controller-initiated
+log pages and sending telemetry log notices.
.IP "NVME_CTRL_LPA_PERSETENT_EVENT" 12
+If set, the controller supports
+persistent event log.
+.IP "NVME_CTRL_LPA_LI0_LI5_LI12_LI13" 12
+If set, the controller supports
+- log pages log page.
+- returning scope of each command in
+commands supported and effects log
+page.
+- feature identifiers supported and
+effects log page.
+- NVMe-MI commands supported and
+effects log page.
+.IP "NVME_CTRL_LPA_DA4_TELEMETRY" 12
+If set, the controller supports data
+area 4 for telemetry host-initiated and
+telemetry.
diff --git a/doc/man/nvme_id_ctrl_mec.2 b/doc/man/nvme_id_ctrl_mec.2
index afa77b6..ab93584 100644
--- a/doc/man/nvme_id_ctrl_mec.2
+++ b/doc/man/nvme_id_ctrl_mec.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_mec" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_mec" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_id_ctrl_mec \- Flags indicatings the capabilities of the Management Endpoint in the Controller, &struct nvme_id_ctrl.mec.
+enum nvme_id_ctrl_mec \- Flags indicating the capabilities of the Management Endpoint in the Controller, &struct nvme_id_ctrl.mec.
.SH SYNOPSIS
enum nvme_id_ctrl_mec {
.br
diff --git a/doc/man/nvme_id_ctrl_nvm.2 b/doc/man/nvme_id_ctrl_nvm.2
index 16554ff..abf8a14 100644
--- a/doc/man/nvme_id_ctrl_nvm.2
+++ b/doc/man/nvme_id_ctrl_nvm.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_ctrl_nvm" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_ctrl_nvm" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_ctrl_nvm \-
+struct nvme_id_ctrl_nvm \- I/O Command Set Specific Identify Controller data structure
.SH SYNOPSIS
struct nvme_id_ctrl_nvm {
.br
diff --git a/doc/man/nvme_id_ctrl_nvmsr.2 b/doc/man/nvme_id_ctrl_nvmsr.2
index e0b118f..b09ca66 100644
--- a/doc/man/nvme_id_ctrl_nvmsr.2
+++ b/doc/man/nvme_id_ctrl_nvmsr.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_nvmsr" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_nvmsr" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_nvmsr \- This field reports information associated with the NVM Subsystem, see &struct nvme_id_ctrl.nvmsr.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_nvscc.2 b/doc/man/nvme_id_ctrl_nvscc.2
index 077c6ef..e76ff9d 100644
--- a/doc/man/nvme_id_ctrl_nvscc.2
+++ b/doc/man/nvme_id_ctrl_nvscc.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_nvscc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_nvscc" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_nvscc \- This field indicates the configuration settings for NVM Vendor Specific command handling.
.SH SYNOPSIS
@@ -10,4 +10,4 @@ enum nvme_id_ctrl_nvscc {
.SH Constants
.IP "NVME_CTRL_NVSCC_FMT" 12
If set, all NVM Vendor Specific Commands use the
-format format with NDT and NDM fields.
+format with NDT and NDM fields.
diff --git a/doc/man/nvme_id_ctrl_nwpc.2 b/doc/man/nvme_id_ctrl_nwpc.2
index 794afe2..a1d7d0b 100644
--- a/doc/man/nvme_id_ctrl_nwpc.2
+++ b/doc/man/nvme_id_ctrl_nwpc.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_nwpc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_nwpc" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_nwpc \- This field indicates the optional namespace write protection capabilities supported by the controller.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_oacs.2 b/doc/man/nvme_id_ctrl_oacs.2
index d5ae344..ceddde2 100644
--- a/doc/man/nvme_id_ctrl_oacs.2
+++ b/doc/man/nvme_id_ctrl_oacs.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_oacs" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_oacs" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_oacs \- Flags indicating the optional Admin commands and features supported by the controller, see &struct nvme_id_ctrl.oacs.
.SH SYNOPSIS
@@ -41,6 +41,10 @@ enum nvme_id_ctrl_oacs {
.br
.br
.BI " NVME_CTRL_OACS_LBA_STATUS"
+,
+.br
+.br
+.BI " NVME_CTRL_OACS_CMD_FEAT_LD"
};
.SH Constants
@@ -75,3 +79,6 @@ Doorbell Buffer Config command.
.IP "NVME_CTRL_OACS_LBA_STATUS" 12
If set, then the controller supports the Get LBA
Status capability.
+.IP "NVME_CTRL_OACS_CMD_FEAT_LD" 12
+If set, then the controller supports the command
+and feature lockdown capability.
diff --git a/doc/man/nvme_id_ctrl_oaes.2 b/doc/man/nvme_id_ctrl_oaes.2
index 3e27733..7bc7be0 100644
--- a/doc/man/nvme_id_ctrl_oaes.2
+++ b/doc/man/nvme_id_ctrl_oaes.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_oaes" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_oaes" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_oaes \- Optional Asynchronous Events Supported
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_ofcs.2 b/doc/man/nvme_id_ctrl_ofcs.2
index d03d025..b45fefc 100644
--- a/doc/man/nvme_id_ctrl_ofcs.2
+++ b/doc/man/nvme_id_ctrl_ofcs.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_ofcs" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_ofcs" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_ofcs \- Indicate whether the controller supports optional fabric commands.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_oncs.2 b/doc/man/nvme_id_ctrl_oncs.2
index fe711b7..a611619 100644
--- a/doc/man/nvme_id_ctrl_oncs.2
+++ b/doc/man/nvme_id_ctrl_oncs.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_oncs" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_oncs" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_oncs \- This field indicates the optional NVM commands and features supported by the controller.
.SH SYNOPSIS
@@ -33,6 +33,10 @@ enum nvme_id_ctrl_oncs {
.br
.br
.BI " NVME_CTRL_ONCS_VERIFY"
+,
+.br
+.br
+.BI " NVME_CTRL_ONCS_COPY"
};
.SH Constants
@@ -63,3 +67,6 @@ the Timestamp feature.
.IP "NVME_CTRL_ONCS_VERIFY" 12
If set, then the controller supports
the Verify command.
+.IP "NVME_CTRL_ONCS_COPY" 12
+If set, then the controller supports
+the copy command.
diff --git a/doc/man/nvme_id_ctrl_rpmbs.2 b/doc/man/nvme_id_ctrl_rpmbs.2
index 95a861c..50f0da7 100644
--- a/doc/man/nvme_id_ctrl_rpmbs.2
+++ b/doc/man/nvme_id_ctrl_rpmbs.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_rpmbs" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_rpmbs" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_rpmbs \- This field indicates if the controller supports one or more Replay Protected Memory Blocks, from &struct nvme_id_ctrl.rpmbs.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_sanicap.2 b/doc/man/nvme_id_ctrl_sanicap.2
index 1c09afc..5daebb6 100644
--- a/doc/man/nvme_id_ctrl_sanicap.2
+++ b/doc/man/nvme_id_ctrl_sanicap.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_sanicap" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_sanicap" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_sanicap \- Indicates attributes for sanitize operations.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_sgls.2 b/doc/man/nvme_id_ctrl_sgls.2
index efe1ddd..bbca025 100644
--- a/doc/man/nvme_id_ctrl_sgls.2
+++ b/doc/man/nvme_id_ctrl_sgls.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_sgls" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_sgls" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_sgls \- This field indicates if SGLs are supported for the NVM Command Set and the particular SGL types supported.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_sqes.2 b/doc/man/nvme_id_ctrl_sqes.2
index 4ed6fee..1ef0271 100644
--- a/doc/man/nvme_id_ctrl_sqes.2
+++ b/doc/man/nvme_id_ctrl_sqes.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_sqes" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_sqes" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_sqes \- Defines the required and maximum Submission Queue entry size when using the NVM Command Set.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ctrl_vwc.2 b/doc/man/nvme_id_ctrl_vwc.2
index a020908..777a85c 100644
--- a/doc/man/nvme_id_ctrl_vwc.2
+++ b/doc/man/nvme_id_ctrl_vwc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_vwc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_vwc" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_id_ctrl_vwc \-
+enum nvme_id_ctrl_vwc \- Volatile write cache
.SH SYNOPSIS
enum nvme_id_ctrl_vwc {
.br
diff --git a/doc/man/nvme_id_ctrl_vwci.2 b/doc/man/nvme_id_ctrl_vwci.2
index 4600a2c..0d0646e 100644
--- a/doc/man/nvme_id_ctrl_vwci.2
+++ b/doc/man/nvme_id_ctrl_vwci.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ctrl_vwci" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ctrl_vwci" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ctrl_vwci \- This field indicates information about remaining number of times that VPD contents are able to be updated using the VPD Write command, see &struct nvme_id_ctrl.vwci.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_directives.2 b/doc/man/nvme_id_directives.2
index 29ef330..d79cdef 100644
--- a/doc/man/nvme_id_directives.2
+++ b/doc/man/nvme_id_directives.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_directives" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_directives" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_directives \-
+struct nvme_id_directives \- Identify Directive - Return Parameters Data Structure
.SH SYNOPSIS
struct nvme_id_directives {
.br
diff --git a/doc/man/nvme_id_domain_attr.2 b/doc/man/nvme_id_domain_attr.2
index fe69d9a..417c159 100644
--- a/doc/man/nvme_id_domain_attr.2
+++ b/doc/man/nvme_id_domain_attr.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_id_domain_attr" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_domain_attr" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_id_domain_attr \- Domain Attributes Entry
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_domain_list.2 b/doc/man/nvme_id_domain_list.2
index 413aab3..fb5c7be 100644
--- a/doc/man/nvme_id_domain_list.2
+++ b/doc/man/nvme_id_domain_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_domain_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_domain_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_domain_list \-
+struct nvme_id_domain_list \- Domain List
.SH SYNOPSIS
struct nvme_id_domain_list {
.br
diff --git a/doc/man/nvme_id_endurance_group_list.2 b/doc/man/nvme_id_endurance_group_list.2
index 30db7cd..8f2aced 100644
--- a/doc/man/nvme_id_endurance_group_list.2
+++ b/doc/man/nvme_id_endurance_group_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_endurance_group_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_endurance_group_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_endurance_group_list \-
+struct nvme_id_endurance_group_list \- Endurance Group List
.SH SYNOPSIS
struct nvme_id_endurance_group_list {
.br
diff --git a/doc/man/nvme_id_independent_id_ns.2 b/doc/man/nvme_id_independent_id_ns.2
index 03281e0..045639d 100644
--- a/doc/man/nvme_id_independent_id_ns.2
+++ b/doc/man/nvme_id_independent_id_ns.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_independent_id_ns" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_independent_id_ns" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_independent_id_ns \-
+struct nvme_id_independent_id_ns \- Identify - I/O Command Set Independent Identify Namespace Data Structure
.SH SYNOPSIS
struct nvme_id_independent_id_ns {
.br
diff --git a/doc/man/nvme_id_iocs.2 b/doc/man/nvme_id_iocs.2
index 20606c9..c6b2405 100644
--- a/doc/man/nvme_id_iocs.2
+++ b/doc/man/nvme_id_iocs.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_id_iocs" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_iocs" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_id_iocs \- NVMe Identify IO Command Set data structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns.2 b/doc/man/nvme_id_ns.2
index 9a82518..bdaf520 100644
--- a/doc/man/nvme_id_ns.2
+++ b/doc/man/nvme_id_ns.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_id_ns" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_ns" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_id_ns \- Identify Namespace data structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns_attr.2 b/doc/man/nvme_id_ns_attr.2
index 05bd554..a6577f6 100644
--- a/doc/man/nvme_id_ns_attr.2
+++ b/doc/man/nvme_id_ns_attr.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ns_attr" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ns_attr" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ns_attr \- Specifies attributes of the namespace.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns_dlfeat.2 b/doc/man/nvme_id_ns_dlfeat.2
index 2dabf24..cb0e477 100644
--- a/doc/man/nvme_id_ns_dlfeat.2
+++ b/doc/man/nvme_id_ns_dlfeat.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ns_dlfeat" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ns_dlfeat" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ns_dlfeat \- This field indicates information about features that affect deallocating logical blocks for this namespace.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns_dpc.2 b/doc/man/nvme_id_ns_dpc.2
index 2ccfca9..b0f076e 100644
--- a/doc/man/nvme_id_ns_dpc.2
+++ b/doc/man/nvme_id_ns_dpc.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ns_dpc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ns_dpc" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ns_dpc \- This field indicates the capabilities for the end-to-end data protection feature.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns_dps.2 b/doc/man/nvme_id_ns_dps.2
index f171054..62aecd9 100644
--- a/doc/man/nvme_id_ns_dps.2
+++ b/doc/man/nvme_id_ns_dps.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ns_dps" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ns_dps" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ns_dps \- This field indicates the Type settings for the end-to-end data protection feature.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns_flbas.2 b/doc/man/nvme_id_ns_flbas.2
index e2b54af..39580b9 100644
--- a/doc/man/nvme_id_ns_flbas.2
+++ b/doc/man/nvme_id_ns_flbas.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ns_flbas" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ns_flbas" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ns_flbas \- This field indicates the LBA data size & metadata size combination that the namespace has been formatted with
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns_granularity_desc.2 b/doc/man/nvme_id_ns_granularity_desc.2
index 8c7c259..fd5227c 100644
--- a/doc/man/nvme_id_ns_granularity_desc.2
+++ b/doc/man/nvme_id_ns_granularity_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_ns_granularity_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_ns_granularity_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_ns_granularity_desc \-
+struct nvme_id_ns_granularity_desc \- Namespace Granularity Descriptor
.SH SYNOPSIS
struct nvme_id_ns_granularity_desc {
.br
diff --git a/doc/man/nvme_id_ns_granularity_list.2 b/doc/man/nvme_id_ns_granularity_list.2
index 375974e..210a866 100644
--- a/doc/man/nvme_id_ns_granularity_list.2
+++ b/doc/man/nvme_id_ns_granularity_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_ns_granularity_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_ns_granularity_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_ns_granularity_list \-
+struct nvme_id_ns_granularity_list \- Namespace Granularity List
.SH SYNOPSIS
struct nvme_id_ns_granularity_list {
.br
diff --git a/doc/man/nvme_id_ns_mc.2 b/doc/man/nvme_id_ns_mc.2
index 774742f..6c72e92 100644
--- a/doc/man/nvme_id_ns_mc.2
+++ b/doc/man/nvme_id_ns_mc.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ns_mc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ns_mc" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ns_mc \- This field indicates the capabilities for metadata.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns_nmic.2 b/doc/man/nvme_id_ns_nmic.2
index 9f15b41..c9234ef 100644
--- a/doc/man/nvme_id_ns_nmic.2
+++ b/doc/man/nvme_id_ns_nmic.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ns_nmic" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ns_nmic" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ns_nmic \- This field specifies multi-path I/O and namespace sharing capabilities of the namespace.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_ns_rescap.2 b/doc/man/nvme_id_ns_rescap.2
index 63fc83e..d170da5 100644
--- a/doc/man/nvme_id_ns_rescap.2
+++ b/doc/man/nvme_id_ns_rescap.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_ns_rescap" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_ns_rescap" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_ns_rescap \- This field indicates the reservation capabilities of the namespace.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_nsfeat.2 b/doc/man/nvme_id_nsfeat.2
index 3c5c9ec..d242158 100644
--- a/doc/man/nvme_id_nsfeat.2
+++ b/doc/man/nvme_id_nsfeat.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_id_nsfeat" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_nsfeat" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_id_nsfeat \- This field defines features of the namespace.
.SH SYNOPSIS
diff --git a/doc/man/nvme_id_nvmset_list.2 b/doc/man/nvme_id_nvmset_list.2
index 6907ea7..473b32e 100644
--- a/doc/man/nvme_id_nvmset_list.2
+++ b/doc/man/nvme_id_nvmset_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_nvmset_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_nvmset_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_nvmset_list \-
+struct nvme_id_nvmset_list \- NVM set list
.SH SYNOPSIS
struct nvme_id_nvmset_list {
.br
diff --git a/doc/man/nvme_id_psd.2 b/doc/man/nvme_id_psd.2
index 435d380..90d4817 100644
--- a/doc/man/nvme_id_psd.2
+++ b/doc/man/nvme_id_psd.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_psd" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_psd" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_psd \-
+struct nvme_id_psd \- Power Management data structure
.SH SYNOPSIS
struct nvme_id_psd {
.br
@@ -62,7 +62,7 @@ Relative Read Throughput indicates the read throughput rank
associated with this power state relative to others. The value in
this is less than the number of supported power states.
.IP "rrl" 12
-Relative Reade Latency indicates the read latency rank associated
+Relative Read Latency indicates the read latency rank associated
with this power state relative to others. The value in this field is
less than the number of supported power states.
.IP "rwt" 12
diff --git a/doc/man/nvme_id_uuid.2 b/doc/man/nvme_id_uuid.2
index 01326e7..a9f46f3 100644
--- a/doc/man/nvme_id_uuid.2
+++ b/doc/man/nvme_id_uuid.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_id_uuid" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_id_uuid" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_id_uuid \-
+enum nvme_id_uuid \- Identifier Association
.SH SYNOPSIS
enum nvme_id_uuid {
.br
diff --git a/doc/man/nvme_id_uuid_list.2 b/doc/man/nvme_id_uuid_list.2
index 8aca721..ae3f52f 100644
--- a/doc/man/nvme_id_uuid_list.2
+++ b/doc/man/nvme_id_uuid_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_uuid_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_uuid_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_uuid_list \-
+struct nvme_id_uuid_list \- UUID list
.SH SYNOPSIS
struct nvme_id_uuid_list {
.br
diff --git a/doc/man/nvme_id_uuid_list_entry.2 b/doc/man/nvme_id_uuid_list_entry.2
index ca2d528..6caba7c 100644
--- a/doc/man/nvme_id_uuid_list_entry.2
+++ b/doc/man/nvme_id_uuid_list_entry.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_id_uuid_list_entry" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_id_uuid_list_entry" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_id_uuid_list_entry \-
+struct nvme_id_uuid_list_entry \- UUID List Entry
.SH SYNOPSIS
struct nvme_id_uuid_list_entry {
.br
diff --git a/doc/man/nvme_identify.2 b/doc/man/nvme_identify.2
index 527185e..68c7d6a 100644
--- a/doc/man/nvme_identify.2
+++ b/doc/man/nvme_identify.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify" 9 "nvme_identify" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify" 9 "nvme_identify" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify \- Send the NVMe Identify command
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_active_ns_list.2 b/doc/man/nvme_identify_active_ns_list.2
index 73eba7c..6fd246f 100644
--- a/doc/man/nvme_identify_active_ns_list.2
+++ b/doc/man/nvme_identify_active_ns_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_active_ns_list" 9 "nvme_identify_active_ns_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_active_ns_list" 9 "nvme_identify_active_ns_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_active_ns_list \- Retrieves active namespaces id list
.SH SYNOPSIS
@@ -10,7 +10,7 @@ nvme_identify_active_ns_list \- Retrieves active namespaces id list
.IP "fd" 12
File descriptor of nvme device
.IP "nsid" 12
-Return namespaces greater than this identifer
+Return namespaces greater than this identifier
.IP "list" 12
User space destination address to transfer the data
.SH "DESCRIPTION"
diff --git a/doc/man/nvme_identify_active_ns_list_csi.2 b/doc/man/nvme_identify_active_ns_list_csi.2
index 01c49a9..21de441 100644
--- a/doc/man/nvme_identify_active_ns_list_csi.2
+++ b/doc/man/nvme_identify_active_ns_list_csi.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_active_ns_list_csi" 9 "nvme_identify_active_ns_list_csi" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_active_ns_list_csi" 9 "nvme_identify_active_ns_list_csi" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_active_ns_list_csi \- Active namespace ID list associated with a specified I/O command set
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_allocated_ns.2 b/doc/man/nvme_identify_allocated_ns.2
index 3927da4..2067eb6 100644
--- a/doc/man/nvme_identify_allocated_ns.2
+++ b/doc/man/nvme_identify_allocated_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_allocated_ns" 9 "nvme_identify_allocated_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_allocated_ns" 9 "nvme_identify_allocated_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_allocated_ns \- Same as nvme_identify_ns, but only for allocated namespaces
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_allocated_ns_list.2 b/doc/man/nvme_identify_allocated_ns_list.2
index 5aaf6fc..9e9275c 100644
--- a/doc/man/nvme_identify_allocated_ns_list.2
+++ b/doc/man/nvme_identify_allocated_ns_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_allocated_ns_list" 9 "nvme_identify_allocated_ns_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_allocated_ns_list" 9 "nvme_identify_allocated_ns_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_allocated_ns_list \- Retrieves allocated namespace id list
.SH SYNOPSIS
@@ -10,7 +10,7 @@ nvme_identify_allocated_ns_list \- Retrieves allocated namespace id list
.IP "fd" 12
File descriptor of nvme device
.IP "nsid" 12
-Return namespaces greater than this identifer
+Return namespaces greater than this identifier
.IP "list" 12
User space destination address to transfer the data
.SH "DESCRIPTION"
diff --git a/doc/man/nvme_identify_allocated_ns_list_csi.2 b/doc/man/nvme_identify_allocated_ns_list_csi.2
index 447be6c..de81d3e 100644
--- a/doc/man/nvme_identify_allocated_ns_list_csi.2
+++ b/doc/man/nvme_identify_allocated_ns_list_csi.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_allocated_ns_list_csi" 9 "nvme_identify_allocated_ns_list_csi" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_allocated_ns_list_csi" 9 "nvme_identify_allocated_ns_list_csi" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_allocated_ns_list_csi \- Allocated namespace ID list associated with a specified I/O command set
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_args.2 b/doc/man/nvme_identify_args.2
deleted file mode 100644
index 58b9667..0000000
--- a/doc/man/nvme_identify_args.2
+++ /dev/null
@@ -1,55 +0,0 @@
-.TH "libnvme" 9 "struct nvme_identify_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_identify_args \- Arguments for the NVMe Identify command
-.SH SYNOPSIS
-struct nvme_identify_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " enum nvme_identify_cns cns;"
-.br
-.BI " enum nvme_csi csi;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u16 cntid;"
-.br
-.BI " __u16 cns_specific_id;"
-.br
-.BI " __u8 uuidx;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-User space destination address to transfer the data
-.IP "args_size" 12
-Size of \fIstruct nvme_identify_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms (0 for default timeout)
-.IP "cns" 12
-The Controller or Namespace structure, see \fIenum\fP nvme_identify_cns
-.IP "csi" 12
-Command Set Identifier
-.IP "nsid" 12
-Namespace identifier, if applicable
-.IP "cntid" 12
-The Controller Identifier, if applicable
-.IP "cns_specific_id" 12
-Identifier that is required for a particular CNS value
-.IP "uuidx" 12
-UUID Index if controller supports this id selection method
diff --git a/doc/man/nvme_identify_cns.2 b/doc/man/nvme_identify_cns.2
index 1b5b4f2..4c2c71c 100644
--- a/doc/man/nvme_identify_cns.2
+++ b/doc/man/nvme_identify_cns.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_identify_cns" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_identify_cns" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_identify_cns \-
+enum nvme_identify_cns \- Identify - CNS Values
.SH SYNOPSIS
enum nvme_identify_cns {
.br
@@ -103,7 +103,7 @@ enum nvme_identify_cns {
.IP "NVME_IDENTIFY_CNS_NS" 12
Identify Namespace data structure
.IP "NVME_IDENTIFY_CNS_CTRL" 12
-Identify Controller data structur
+Identify Controller data structure
.IP "NVME_IDENTIFY_CNS_NS_ACTIVE_LIST" 12
Active Namespace ID list
.IP "NVME_IDENTIFY_CNS_NS_DESC_LIST" 12
@@ -121,11 +121,12 @@ Active Namespace ID list associated
with the specified I/O Command Set
.IP "NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS" 12
I/O Command Set Independent Identify
-Namespace data structure
.IP "NVME_IDENTIFY_CNS_NS_USER_DATA_FORMAT" 12
--- undescribed --
+Namespace user data format
.IP "NVME_IDENTIFY_CNS_CSI_NS_USER_DATA_FORMAT" 12
--- undescribed --
+I/O Command Set specific user data
+format
+Namespace data structure
.IP "NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST" 12
Allocated Namespace ID list
.IP "NVME_IDENTIFY_CNS_ALLOCATED_NS" 12
@@ -145,7 +146,7 @@ Secondary Controller list of controllers
associated with the primary controller
processing the command
.IP "NVME_IDENTIFY_CNS_NS_GRANULARITY" 12
-A Namespace Granularity Lis
+A Namespace Granularity List
.IP "NVME_IDENTIFY_CNS_UUID_LIST" 12
A UUID List
.IP "NVME_IDENTIFY_CNS_DOMAIN_LIST" 12
diff --git a/doc/man/nvme_identify_ctrl.2 b/doc/man/nvme_identify_ctrl.2
index dce2bf1..79a0b40 100644
--- a/doc/man/nvme_identify_ctrl.2
+++ b/doc/man/nvme_identify_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_ctrl" 9 "nvme_identify_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_ctrl" 9 "nvme_identify_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_ctrl \- Retrieves nvme identify controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_ctrl_csi.2 b/doc/man/nvme_identify_ctrl_csi.2
index 60572eb..f8916e8 100644
--- a/doc/man/nvme_identify_ctrl_csi.2
+++ b/doc/man/nvme_identify_ctrl_csi.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_ctrl_csi" 9 "nvme_identify_ctrl_csi" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_ctrl_csi" 9 "nvme_identify_ctrl_csi" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_ctrl_csi \- I/O command set specific Identify Controller data
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_ctrl_list.2 b/doc/man/nvme_identify_ctrl_list.2
index dc2296f..14304f1 100644
--- a/doc/man/nvme_identify_ctrl_list.2
+++ b/doc/man/nvme_identify_ctrl_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_ctrl_list" 9 "nvme_identify_ctrl_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_ctrl_list" 9 "nvme_identify_ctrl_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_ctrl_list \- Retrieves identify controller list
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_domain_list.2 b/doc/man/nvme_identify_domain_list.2
index 58a76d8..8fd81c0 100644
--- a/doc/man/nvme_identify_domain_list.2
+++ b/doc/man/nvme_identify_domain_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_domain_list" 9 "nvme_identify_domain_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_domain_list" 9 "nvme_identify_domain_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_domain_list \- Domain list data
.SH SYNOPSIS
@@ -12,7 +12,7 @@ File descriptor of nvme device
.IP "domid" 12
Domain ID
.IP "list" 12
-User space destiantion address to transfer data
+User space destination address to transfer data
.SH "DESCRIPTION"
A list of 31 domain IDs is returned to the host containing domain
attributes in increasing order that are greater than the value
diff --git a/doc/man/nvme_identify_endurance_group_list.2 b/doc/man/nvme_identify_endurance_group_list.2
index 5050a9e..d1e1676 100644
--- a/doc/man/nvme_identify_endurance_group_list.2
+++ b/doc/man/nvme_identify_endurance_group_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_endurance_group_list" 9 "nvme_identify_endurance_group_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_endurance_group_list" 9 "nvme_identify_endurance_group_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_endurance_group_list \- Endurance group list data
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_independent_identify_ns.2 b/doc/man/nvme_identify_independent_identify_ns.2
index 9dc83a0..e38cfa7 100644
--- a/doc/man/nvme_identify_independent_identify_ns.2
+++ b/doc/man/nvme_identify_independent_identify_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_independent_identify_ns" 9 "nvme_identify_independent_identify_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_independent_identify_ns" 9 "nvme_identify_independent_identify_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_independent_identify_ns \- I/O command set independent Identify namespace data
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_iocs.2 b/doc/man/nvme_identify_iocs.2
index 5255ae4..d607793 100644
--- a/doc/man/nvme_identify_iocs.2
+++ b/doc/man/nvme_identify_iocs.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_iocs" 9 "nvme_identify_iocs" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_iocs" 9 "nvme_identify_iocs" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_iocs \- I/O command set data structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_iocs_ns_csi_user_data_format.2 b/doc/man/nvme_identify_iocs_ns_csi_user_data_format.2
index 86e1c21..9e99b0a 100644
--- a/doc/man/nvme_identify_iocs_ns_csi_user_data_format.2
+++ b/doc/man/nvme_identify_iocs_ns_csi_user_data_format.2
@@ -1,6 +1,6 @@
-.TH "nvme_identify_iocs_ns_csi_user_data_format" 9 "nvme_identify_iocs_ns_csi_user_data_format" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_iocs_ns_csi_user_data_format" 9 "nvme_identify_iocs_ns_csi_user_data_format" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_identify_iocs_ns_csi_user_data_format \-
+nvme_identify_iocs_ns_csi_user_data_format \- Identify I/O command set namespace data structure
.SH SYNOPSIS
.B "int" nvme_identify_iocs_ns_csi_user_data_format
.BI "(int fd " ","
@@ -18,7 +18,7 @@ UUID selection, if supported
.IP "csi" 12
Command Set Identifier
.IP "data" 12
--- undescribed --
+User space destination address to transfer the data
.SH "DESCRIPTION"
I/O Command Set specific Identify Namespace data structure for
the specified User Data Format index containing the namespace
diff --git a/doc/man/nvme_identify_ns.2 b/doc/man/nvme_identify_ns.2
index 428c9cb..c731ee8 100644
--- a/doc/man/nvme_identify_ns.2
+++ b/doc/man/nvme_identify_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_ns" 9 "nvme_identify_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_ns" 9 "nvme_identify_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_ns \- Retrieves nvme identify namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_ns_csi.2 b/doc/man/nvme_identify_ns_csi.2
index f8ccf78..957ae6d 100644
--- a/doc/man/nvme_identify_ns_csi.2
+++ b/doc/man/nvme_identify_ns_csi.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_ns_csi" 9 "nvme_identify_ns_csi" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_ns_csi" 9 "nvme_identify_ns_csi" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_ns_csi \- I/O command set specific identify namespace data
.SH SYNOPSIS
@@ -20,7 +20,7 @@ Command Set Identifier
.IP "data" 12
User space destination address to transfer the data
.SH "DESCRIPTION"
-An I/O Command Set specific Identify Namespace data structre is returned
+An I/O Command Set specific Identify Namespace data structure is returned
for the namespace specified in \fInsid\fP.
.SH "RETURN"
The nvme command status if a response was received (see
diff --git a/doc/man/nvme_identify_ns_csi_user_data_format.2 b/doc/man/nvme_identify_ns_csi_user_data_format.2
index 96fa09c..d57d74c 100644
--- a/doc/man/nvme_identify_ns_csi_user_data_format.2
+++ b/doc/man/nvme_identify_ns_csi_user_data_format.2
@@ -1,6 +1,6 @@
-.TH "nvme_identify_ns_csi_user_data_format" 9 "nvme_identify_ns_csi_user_data_format" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_ns_csi_user_data_format" 9 "nvme_identify_ns_csi_user_data_format" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_identify_ns_csi_user_data_format \-
+nvme_identify_ns_csi_user_data_format \- Identify namespace user data format
.SH SYNOPSIS
.B "int" nvme_identify_ns_csi_user_data_format
.BI "(int fd " ","
@@ -18,7 +18,7 @@ UUID selection, if supported
.IP "csi" 12
Command Set Identifier
.IP "data" 12
--- undescribed --
+User space destination address to transfer the data
.SH "DESCRIPTION"
Identify Namespace data structure for the specified User Data Format
index containing the namespace capabilities for the NVM Command Set.
diff --git a/doc/man/nvme_identify_ns_descs.2 b/doc/man/nvme_identify_ns_descs.2
index def86ee..479cb2c 100644
--- a/doc/man/nvme_identify_ns_descs.2
+++ b/doc/man/nvme_identify_ns_descs.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_ns_descs" 9 "nvme_identify_ns_descs" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_ns_descs" 9 "nvme_identify_ns_descs" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_ns_descs \- Retrieves namespace descriptor list
.SH SYNOPSIS
@@ -10,7 +10,7 @@ nvme_identify_ns_descs \- Retrieves namespace descriptor list
.IP "fd" 12
File descriptor of nvme device
.IP "nsid" 12
-The namespace id to retrieve destriptors
+The namespace id to retrieve descriptors
.IP "descs" 12
User space destination address to transfer the data
.SH "DESCRIPTION"
@@ -18,7 +18,7 @@ A list of Namespace Identification Descriptor structures is returned to the
host for the namespace specified in the Namespace Identifier (NSID) field if
it is an active NSID.
-The data returned is in the form of an arrray of 'struct nvme_ns_id_desc'.
+The data returned is in the form of an array of 'struct nvme_ns_id_desc'.
See \fIstruct nvme_ns_id_desc\fP for the definition of the returned structure.
.SH "RETURN"
diff --git a/doc/man/nvme_identify_ns_granularity.2 b/doc/man/nvme_identify_ns_granularity.2
index f960461..b5102d8 100644
--- a/doc/man/nvme_identify_ns_granularity.2
+++ b/doc/man/nvme_identify_ns_granularity.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_ns_granularity" 9 "nvme_identify_ns_granularity" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_ns_granularity" 9 "nvme_identify_ns_granularity" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_ns_granularity \- Retrieves namespace granularity identification
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_nsid_ctrl_list.2 b/doc/man/nvme_identify_nsid_ctrl_list.2
index 3842e70..78530a2 100644
--- a/doc/man/nvme_identify_nsid_ctrl_list.2
+++ b/doc/man/nvme_identify_nsid_ctrl_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_nsid_ctrl_list" 9 "nvme_identify_nsid_ctrl_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_nsid_ctrl_list" 9 "nvme_identify_nsid_ctrl_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_nsid_ctrl_list \- Retrieves controller list attached to an nsid
.SH SYNOPSIS
diff --git a/doc/man/nvme_identify_nvmset_list.2 b/doc/man/nvme_identify_nvmset_list.2
index 98b368a..7862237 100644
--- a/doc/man/nvme_identify_nvmset_list.2
+++ b/doc/man/nvme_identify_nvmset_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_nvmset_list" 9 "nvme_identify_nvmset_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_nvmset_list" 9 "nvme_identify_nvmset_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_nvmset_list \- Retrieves NVM Set List
.SH SYNOPSIS
@@ -19,7 +19,7 @@ is an ordered list by NVM Set Identifier, starting with the first NVM Set
Identifier supported by the NVM subsystem that is equal to or greater than
the NVM Set Identifier.
-See \fIstruct nvme_id_nvmset_list\fP for the defintion of the returned structure.
+See \fIstruct nvme_id_nvmset_list\fP for the definition of the returned structure.
.SH "RETURN"
The nvme command status if a response was received (see
\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_primary_ctrl.2 b/doc/man/nvme_identify_primary_ctrl.2
index 8654539..8d3ec66 100644
--- a/doc/man/nvme_identify_primary_ctrl.2
+++ b/doc/man/nvme_identify_primary_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_primary_ctrl" 9 "nvme_identify_primary_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_primary_ctrl" 9 "nvme_identify_primary_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_primary_ctrl \- Retrieve NVMe Primary Controller identification
.SH SYNOPSIS
@@ -14,7 +14,7 @@ Return controllers starting at this identifier
.IP "cap" 12
User space destination buffer address to transfer the data
.SH "DESCRIPTION"
-See \fIstruct nvme_primary_ctrl_cap\fP for the defintion of the returned structure, \fIcap\fP.
+See \fIstruct nvme_primary_ctrl_cap\fP for the definition of the returned structure, \fIcap\fP.
.SH "RETURN"
The nvme command status if a response was received (see
\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_identify_secondary_ctrl_list.2 b/doc/man/nvme_identify_secondary_ctrl_list.2
index 7a81cce..4fa2548 100644
--- a/doc/man/nvme_identify_secondary_ctrl_list.2
+++ b/doc/man/nvme_identify_secondary_ctrl_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_secondary_ctrl_list" 9 "nvme_identify_secondary_ctrl_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_secondary_ctrl_list" 9 "nvme_identify_secondary_ctrl_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_secondary_ctrl_list \- Retrieves secondary controller list
.SH SYNOPSIS
@@ -22,7 +22,7 @@ controllers associated with the primary controller processing this command.
The list contains entries for controller identifiers greater than or equal
to the value specified in the Controller Identifier (cntid).
-See \fIstruct nvme_secondary_ctrls_list\fP for a defintion of the returned
+See \fIstruct nvme_secondary_ctrls_list\fP for a definition of the returned
structure.
.SH "RETURN"
The nvme command status if a response was received (see
diff --git a/doc/man/nvme_identify_uuid.2 b/doc/man/nvme_identify_uuid.2
index dc19985..c3ee0a8 100644
--- a/doc/man/nvme_identify_uuid.2
+++ b/doc/man/nvme_identify_uuid.2
@@ -1,4 +1,4 @@
-.TH "nvme_identify_uuid" 9 "nvme_identify_uuid" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_identify_uuid" 9 "nvme_identify_uuid" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_identify_uuid \- Retrieves device's UUIDs
.SH SYNOPSIS
diff --git a/doc/man/nvme_init_copy_range.2 b/doc/man/nvme_init_copy_range.2
index b49dd53..9850064 100644
--- a/doc/man/nvme_init_copy_range.2
+++ b/doc/man/nvme_init_copy_range.2
@@ -1,4 +1,4 @@
-.TH "nvme_init_copy_range" 9 "nvme_init_copy_range" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_init_copy_range" 9 "nvme_init_copy_range" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_init_copy_range \- Constructs a copy range structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_init_ctrl.2 b/doc/man/nvme_init_ctrl.2
index 1799484..e5b655f 100644
--- a/doc/man/nvme_init_ctrl.2
+++ b/doc/man/nvme_init_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_init_ctrl" 9 "nvme_init_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_init_ctrl" 9 "nvme_init_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_init_ctrl \- Initialize nvme_ctrl_t object for an existing controller.
.SH SYNOPSIS
diff --git a/doc/man/nvme_init_ctrl_list.2 b/doc/man/nvme_init_ctrl_list.2
index 3173143..90e7c39 100644
--- a/doc/man/nvme_init_ctrl_list.2
+++ b/doc/man/nvme_init_ctrl_list.2
@@ -1,4 +1,4 @@
-.TH "nvme_init_ctrl_list" 9 "nvme_init_ctrl_list" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_init_ctrl_list" 9 "nvme_init_ctrl_list" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_init_ctrl_list \- Initialize an nvme_ctrl_list structure from an array.
.SH SYNOPSIS
diff --git a/doc/man/nvme_init_dsm_range.2 b/doc/man/nvme_init_dsm_range.2
index 260169d..c41c5c7 100644
--- a/doc/man/nvme_init_dsm_range.2
+++ b/doc/man/nvme_init_dsm_range.2
@@ -1,4 +1,4 @@
-.TH "nvme_init_dsm_range" 9 "nvme_init_dsm_range" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_init_dsm_range" 9 "nvme_init_dsm_range" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_init_dsm_range \- Constructs a data set range structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_init_logging.2 b/doc/man/nvme_init_logging.2
index d2c2829..176428f 100644
--- a/doc/man/nvme_init_logging.2
+++ b/doc/man/nvme_init_logging.2
@@ -1,4 +1,4 @@
-.TH "nvme_init_logging" 9 "nvme_init_logging" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_init_logging" 9 "nvme_init_logging" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_init_logging \- Initialize logging
.SH SYNOPSIS
diff --git a/doc/man/nvme_io.2 b/doc/man/nvme_io.2
index 422b922..76feebf 100644
--- a/doc/man/nvme_io.2
+++ b/doc/man/nvme_io.2
@@ -1,4 +1,4 @@
-.TH "nvme_io" 9 "nvme_io" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_io" 9 "nvme_io" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_io \- Submit an nvme user I/O command
.SH SYNOPSIS
diff --git a/doc/man/nvme_io_args.2 b/doc/man/nvme_io_args.2
deleted file mode 100644
index 4993da8..0000000
--- a/doc/man/nvme_io_args.2
+++ /dev/null
@@ -1,91 +0,0 @@
-.TH "libnvme" 9 "struct nvme_io_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_io_args \- Arguments for NVMe I/O commands
-.SH SYNOPSIS
-struct nvme_io_args {
-.br
-.BI " __u64 slba;"
-.br
-.BI " __u64 storage_tag;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " void *metadata;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 reftag;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u32 metadata_len;"
-.br
-.BI " __u16 nlb;"
-.br
-.BI " __u16 control;"
-.br
-.BI " __u16 apptag;"
-.br
-.BI " __u16 appmask;"
-.br
-.BI " __u16 dspec;"
-.br
-.BI " __u8 dsm;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "slba" 12
-Starting logical block
-.IP "storage_tag" 12
-This filed specifies Variable Sized Expected Logical Block
-Storage Tag (ELBST) and Expected Logical Block Reference
-Tag (ELBRT)
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-Pointer to user address of the data buffer
-.IP "metadata" 12
-Pointer to user address of the metadata buffer
-.IP "args_size" 12
-Size of \fIstruct nvme_io_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID
-.IP "reftag" 12
-This field specifies the Initial Logical Block Reference Tag
-expected value. Used only if the namespace is formatted to use
-end-to-end protection information.
-.IP "data_len" 12
-Length of user buffer, \fIdata\fP, in bytes
-.IP "metadata_len" 12
-Length of user buffer, \fImetadata\fP, in bytes
-.IP "nlb" 12
-Number of logical blocks to send (0's based value)
-.IP "control" 12
-Command control flags, see \fIenum nvme_io_control_flags\fP.
-.IP "apptag" 12
-This field specifies the Application Tag Mask expected value.
-Used only if the namespace is formatted to use end-to-end
-protection information.
-.IP "appmask" 12
-This field specifies the Application Tag expected value. Used
-only if the namespace is formatted to use end-to-end protection
-information.
-.IP "dspec" 12
-Directive specific value
-.IP "dsm" 12
-Data set management attributes, see \fIenum nvme_io_dsm_flags\fP
diff --git a/doc/man/nvme_io_control_flags.2 b/doc/man/nvme_io_control_flags.2
index 43ee21f..b6ef904 100644
--- a/doc/man/nvme_io_control_flags.2
+++ b/doc/man/nvme_io_control_flags.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_io_control_flags" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_io_control_flags" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_io_control_flags \-
+enum nvme_io_control_flags \- I/O control flags
.SH SYNOPSIS
enum nvme_io_control_flags {
.br
@@ -8,6 +8,10 @@ enum nvme_io_control_flags {
,
.br
.br
+.BI " NVME_IO_STC"
+,
+.br
+.br
.BI " NVME_IO_DEAC"
,
.br
@@ -42,6 +46,8 @@ enum nvme_io_control_flags {
.SH Constants
.IP "NVME_IO_DTYPE_STREAMS" 12
Directive Type Streams
+.IP "NVME_IO_STC" 12
+Storage Tag Check
.IP "NVME_IO_DEAC" 12
Deallocate
.IP "NVME_IO_ZNS_APPEND_PIREMAP" 12
diff --git a/doc/man/nvme_io_dsm_flags.2 b/doc/man/nvme_io_dsm_flags.2
index 5daacc3..1d97550 100644
--- a/doc/man/nvme_io_dsm_flags.2
+++ b/doc/man/nvme_io_dsm_flags.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_io_dsm_flags" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_io_dsm_flags" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_io_dsm_flags \-
+enum nvme_io_dsm_flags \- Dataset Management flags
.SH SYNOPSIS
enum nvme_io_dsm_flags {
.br
diff --git a/doc/man/nvme_io_opcode.2 b/doc/man/nvme_io_opcode.2
index 74fd864..c3a2f32 100644
--- a/doc/man/nvme_io_opcode.2
+++ b/doc/man/nvme_io_opcode.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_io_opcode" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_io_opcode" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_io_opcode \-
+enum nvme_io_opcode \- Opcodes for I/O Commands
.SH SYNOPSIS
enum nvme_io_opcode {
.br
diff --git a/doc/man/nvme_io_passthru.2 b/doc/man/nvme_io_passthru.2
index 0e848ea..54ea04c 100644
--- a/doc/man/nvme_io_passthru.2
+++ b/doc/man/nvme_io_passthru.2
@@ -1,4 +1,4 @@
-.TH "nvme_io_passthru" 9 "nvme_io_passthru" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_io_passthru" 9 "nvme_io_passthru" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_io_passthru \- Submit an nvme io passthrough command
.SH SYNOPSIS
@@ -30,7 +30,7 @@ The nvme io command to send
.IP "flags" 12
NVMe command flags (not used)
.IP "rsvd" 12
-Reserevd for future use
+Reserved for future use
.IP "nsid" 12
Namespace identifier
.IP "cdw2" 12
@@ -50,11 +50,11 @@ Command dword 14
.IP "cdw15" 12
Command dword 15
.IP "data_len" 12
-Length of the data transfered in this command in bytes
+Length of the data transferred in this command in bytes
.IP "data" 12
Pointer to user address of the data buffer
.IP "metadata_len" 12
-Length of metadata transfered in this command
+Length of metadata transferred in this command
.IP "metadata" 12
Pointer to user address of the metadata buffer
.IP "timeout_ms" 12
diff --git a/doc/man/nvme_lba_range_type.2 b/doc/man/nvme_lba_range_type.2
index 14caf22..9e644df 100644
--- a/doc/man/nvme_lba_range_type.2
+++ b/doc/man/nvme_lba_range_type.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_lba_range_type" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_lba_range_type" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_lba_range_type \-
+struct nvme_lba_range_type \- LBA Range Type
.SH SYNOPSIS
struct nvme_lba_range_type {
.br
@@ -12,4 +12,4 @@ struct nvme_lba_range_type {
.SH Members
.IP "entry" 12
-LBA range type entry
+LBA range type entry. See \fIstruct\fP nvme_lba_range_type_entry
diff --git a/doc/man/nvme_lba_range_type_entry.2 b/doc/man/nvme_lba_range_type_entry.2
index ef9496b..0b9fddc 100644
--- a/doc/man/nvme_lba_range_type_entry.2
+++ b/doc/man/nvme_lba_range_type_entry.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_lba_range_type_entry" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_lba_range_type_entry" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_lba_range_type_entry \-
+struct nvme_lba_range_type_entry \- LBA Range Type - Data Structure Entry
.SH SYNOPSIS
struct nvme_lba_range_type_entry {
.br
diff --git a/doc/man/nvme_lba_rd.2 b/doc/man/nvme_lba_rd.2
index 5203f90..76528ad 100644
--- a/doc/man/nvme_lba_rd.2
+++ b/doc/man/nvme_lba_rd.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_lba_rd" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_lba_rd" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_lba_rd \-
+struct nvme_lba_rd \- LBA Range Descriptor
.SH SYNOPSIS
struct nvme_lba_rd {
.br
diff --git a/doc/man/nvme_lba_status.2 b/doc/man/nvme_lba_status.2
index c4b55f5..d76246a 100644
--- a/doc/man/nvme_lba_status.2
+++ b/doc/man/nvme_lba_status.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_lba_status" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_lba_status" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_lba_status \-
+struct nvme_lba_status \- LBA Status Descriptor List
.SH SYNOPSIS
struct nvme_lba_status {
.br
diff --git a/doc/man/nvme_lba_status_atype.2 b/doc/man/nvme_lba_status_atype.2
index 4cc9aa6..b4d7ac3 100644
--- a/doc/man/nvme_lba_status_atype.2
+++ b/doc/man/nvme_lba_status_atype.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_lba_status_atype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_lba_status_atype" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_lba_status_atype \-
+enum nvme_lba_status_atype \- Potentially Unrecoverable LBAs
.SH SYNOPSIS
enum nvme_lba_status_atype {
.br
@@ -13,4 +13,7 @@ enum nvme_lba_status_atype {
};
.SH Constants
.IP "NVME_LBA_STATUS_ATYPE_SCAN_UNTRACKED" 12
+Potentially Unrecoverable LBAs
.IP "NVME_LBA_STATUS_ATYPE_SCAN_TRACKED" 12
+Potentially Unrecoverable LBAs
+associated with physical storage
diff --git a/doc/man/nvme_lba_status_desc.2 b/doc/man/nvme_lba_status_desc.2
index c1d8309..5c0ef71 100644
--- a/doc/man/nvme_lba_status_desc.2
+++ b/doc/man/nvme_lba_status_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_lba_status_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_lba_status_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_lba_status_desc \-
+struct nvme_lba_status_desc \- LBA Status Descriptor Entry
.SH SYNOPSIS
struct nvme_lba_status_desc {
.br
diff --git a/doc/man/nvme_lba_status_log.2 b/doc/man/nvme_lba_status_log.2
index 6574def..7593f30 100644
--- a/doc/man/nvme_lba_status_log.2
+++ b/doc/man/nvme_lba_status_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_lba_status_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_lba_status_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_lba_status_log \-
+struct nvme_lba_status_log \- LBA Status Information Log
.SH SYNOPSIS
struct nvme_lba_status_log {
.br
diff --git a/doc/man/nvme_lbaf.2 b/doc/man/nvme_lbaf.2
index 2270b8b..4e59a2f 100644
--- a/doc/man/nvme_lbaf.2
+++ b/doc/man/nvme_lbaf.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_lbaf" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_lbaf" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_lbaf \- LBA Format Data Structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_lbaf_rp.2 b/doc/man/nvme_lbaf_rp.2
index 37d9ab6..3b5cc51 100644
--- a/doc/man/nvme_lbaf_rp.2
+++ b/doc/man/nvme_lbaf_rp.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_lbaf_rp" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_lbaf_rp" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_lbaf_rp \- This field indicates the relative performance of the LBA format indicated relative to other LBA formats supported by the controller.
.SH SYNOPSIS
diff --git a/doc/man/nvme_lbart.2 b/doc/man/nvme_lbart.2
index 6c1ee8a..aeea9c4 100644
--- a/doc/man/nvme_lbart.2
+++ b/doc/man/nvme_lbart.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_lbart" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_lbart" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_lbart \-
+enum nvme_lbart \- LBA Range Type - Data Structure Entry
.SH SYNOPSIS
enum nvme_lbart {
.br
diff --git a/doc/man/nvme_lbas_ns_element.2 b/doc/man/nvme_lbas_ns_element.2
index 5367ae1..7d8ffe7 100644
--- a/doc/man/nvme_lbas_ns_element.2
+++ b/doc/man/nvme_lbas_ns_element.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_lbas_ns_element" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_lbas_ns_element" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_lbas_ns_element \-
+struct nvme_lbas_ns_element \- LBA Status Log Namespace Element
.SH SYNOPSIS
struct nvme_lbas_ns_element {
.br
@@ -24,7 +24,7 @@ Namespace Element Identifier
.IP "nlrd" 12
Number of LBA Range Descriptors
.IP "ratype" 12
-Recommended Action Type
+Recommended Action Type. see \fIenum\fP nvme_lba_status_atype
.IP "rsvd8" 12
Reserved
.IP "lba_rd" 12
diff --git a/doc/man/nvme_lockdown.2 b/doc/man/nvme_lockdown.2
index dd67871..3ce5be9 100644
--- a/doc/man/nvme_lockdown.2
+++ b/doc/man/nvme_lockdown.2
@@ -1,4 +1,4 @@
-.TH "nvme_lockdown" 9 "nvme_lockdown" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_lockdown" 9 "nvme_lockdown" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_lockdown \- Issue lockdown command
.SH SYNOPSIS
diff --git a/doc/man/nvme_lockdown_args.2 b/doc/man/nvme_lockdown_args.2
deleted file mode 100644
index c8f83b5..0000000
--- a/doc/man/nvme_lockdown_args.2
+++ /dev/null
@@ -1,47 +0,0 @@
-.TH "libnvme" 9 "struct nvme_lockdown_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_lockdown_args \- Arguments for the NVME Lockdown command
-.SH SYNOPSIS
-struct nvme_lockdown_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u8 scp;"
-.br
-.BI " __u8 prhbt;"
-.br
-.BI " __u8 ifc;"
-.br
-.BI " __u8 ofi;"
-.br
-.BI " __u8 uuidx;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_lockdown_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms (0 for default timeout)
-.IP "scp" 12
-Scope of the command
-.IP "prhbt" 12
-Prohibit or allow the command opcode or Set Features command
-.IP "ifc" 12
-Affected interface
-.IP "ofi" 12
-Opcode or Feature Identifier
-.IP "uuidx" 12
-UUID Index if controller supports this id selection method
diff --git a/doc/man/nvme_log_ana_lsp.2 b/doc/man/nvme_log_ana_lsp.2
index fc8f063..b04e8bf 100644
--- a/doc/man/nvme_log_ana_lsp.2
+++ b/doc/man/nvme_log_ana_lsp.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_log_ana_lsp" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_log_ana_lsp" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_log_ana_lsp \-
+enum nvme_log_ana_lsp \- Asymmetric Namespace Access - Return Groups Only
.SH SYNOPSIS
enum nvme_log_ana_lsp {
.br
diff --git a/doc/man/nvme_lookup_ctrl.2 b/doc/man/nvme_lookup_ctrl.2
index 6b42f4a..0718561 100644
--- a/doc/man/nvme_lookup_ctrl.2
+++ b/doc/man/nvme_lookup_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_lookup_ctrl" 9 "nvme_lookup_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_lookup_ctrl" 9 "nvme_lookup_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_lookup_ctrl \- Lookup nvme_ctrl_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_lookup_host.2 b/doc/man/nvme_lookup_host.2
index f5fb23c..3bbb2db 100644
--- a/doc/man/nvme_lookup_host.2
+++ b/doc/man/nvme_lookup_host.2
@@ -1,4 +1,4 @@
-.TH "nvme_lookup_host" 9 "nvme_lookup_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_lookup_host" 9 "nvme_lookup_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_lookup_host \- Lookup nvme_host_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_lookup_subsystem.2 b/doc/man/nvme_lookup_subsystem.2
index 5127f68..c80bda8 100644
--- a/doc/man/nvme_lookup_subsystem.2
+++ b/doc/man/nvme_lookup_subsystem.2
@@ -1,4 +1,4 @@
-.TH "nvme_lookup_subsystem" 9 "nvme_lookup_subsystem" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_lookup_subsystem" 9 "nvme_lookup_subsystem" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_lookup_subsystem \- Lookup nvme_subsystem_t object
.SH SYNOPSIS
@@ -15,6 +15,6 @@ Name of the subsystem (may be NULL)
Subsystem NQN
.SH "DESCRIPTION"
Lookup a \fInvme_subsystem_t\fP object in \fIh\fP base on \fIname\fP (if present)
-and \fIsubsystemnqn\fP or create one if not found.
+and \fIsubsysnqn\fP or create one if not found.
.SH "RETURN"
-nvme_subsystme_t object
+nvme_subsystem_t object
diff --git a/doc/man/nvme_media_unit_config_desc.2 b/doc/man/nvme_media_unit_config_desc.2
index e739f1d..f48eec8 100644
--- a/doc/man/nvme_media_unit_config_desc.2
+++ b/doc/man/nvme_media_unit_config_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_media_unit_config_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_media_unit_config_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_media_unit_config_desc \-
+struct nvme_media_unit_config_desc \- Media Unit Configuration Descriptor
.SH SYNOPSIS
struct nvme_media_unit_config_desc {
.br
@@ -17,8 +17,7 @@ struct nvme_media_unit_config_desc {
.SH Members
.IP "muid" 12
Media Unit Identifier
+.IP "rsvd2" 12
+Reserved
.IP "mudl" 12
Media Unit Descriptor Length
-.SH "Description"
-Media Unit Configuration Descriptor
-Structure Definitions
diff --git a/doc/man/nvme_media_unit_stat_desc.2 b/doc/man/nvme_media_unit_stat_desc.2
index 26282e3..efbdd9d 100644
--- a/doc/man/nvme_media_unit_stat_desc.2
+++ b/doc/man/nvme_media_unit_stat_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_media_unit_stat_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_media_unit_stat_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_media_unit_stat_desc \-
+struct nvme_media_unit_stat_desc \- Media Unit Status Descriptor
.SH SYNOPSIS
struct nvme_media_unit_stat_desc {
.br
diff --git a/doc/man/nvme_media_unit_stat_log.2 b/doc/man/nvme_media_unit_stat_log.2
index 45affc3..5fc33ec 100644
--- a/doc/man/nvme_media_unit_stat_log.2
+++ b/doc/man/nvme_media_unit_stat_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_media_unit_stat_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_media_unit_stat_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_media_unit_stat_log \-
+struct nvme_media_unit_stat_log \- Media Unit Status
.SH SYNOPSIS
struct nvme_media_unit_stat_log {
.br
diff --git a/doc/man/nvme_metadata_element_desc.2 b/doc/man/nvme_metadata_element_desc.2
index 32565a8..b43e9ff 100644
--- a/doc/man/nvme_metadata_element_desc.2
+++ b/doc/man/nvme_metadata_element_desc.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_metadata_element_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_metadata_element_desc" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_metadata_element_desc \- Metadata Element Descriptor
.SH SYNOPSIS
diff --git a/doc/man/nvme_mi_admin_get_log_page.2 b/doc/man/nvme_mi_admin_get_log_page.2
new file mode 100644
index 0000000..7d4156a
--- /dev/null
+++ b/doc/man/nvme_mi_admin_get_log_page.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_get_log_page" 9 "nvme_mi_admin_get_log_page" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_get_log_page \- Retrieve log page data from controller
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_get_log_page
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_get_log_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to query
+.IP "args" 12
+Get Log Page command arguments
+.SH "DESCRIPTION"
+Performs a Get Log Page Admin command as specified by \fIargs\fP. Response data
+is stored in \fIargs->data\fP, which should be a buffer of \fIargs->data_len\fP bytes.
+Resulting data length is stored in \fIargs->data_len\fP on successful
+command completion.
+
+This request may be implemented as multiple log page commands, in order
+to fit within MI message-size limits.
+
+See: \fIstruct nvme_get_log_args\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_identify.2 b/doc/man/nvme_mi_admin_identify.2
new file mode 100644
index 0000000..d73df9e
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify.2
@@ -0,0 +1,23 @@
+.TH "nvme_mi_admin_identify" 9 "nvme_mi_admin_identify" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify \- Perform an Admin identify command.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_identify_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "args" 12
+Identify command arguments
+.SH "DESCRIPTION"
+Perform an Identify command, using the Identify command parameters in \fIargs\fP.
+Stores the identify data in ->data, and (if set) the result from cdw0
+into args->result.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP.
+
+See: \fIstruct nvme_identify_args\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_identify_cns_nsid.2 b/doc/man/nvme_mi_admin_identify_cns_nsid.2
new file mode 100644
index 0000000..c9ebe0a
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_cns_nsid.2
@@ -0,0 +1,29 @@
+.TH "nvme_mi_admin_identify_cns_nsid" 9 "nvme_mi_admin_identify_cns_nsid" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_cns_nsid \- Perform an Admin identify command using specific CNS/NSID parameters.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_cns_nsid
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "enum nvme_identify_cns cns " ","
+.BI "__u32 nsid " ","
+.BI "void *data " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "cns" 12
+Controller or Namespace Structure, specifying identified object
+.IP "nsid" 12
+namespace ID
+.IP "data" 12
+buffer for identify data response
+.SH "DESCRIPTION"
+Perform an Identify command, using the CNS specifier \fIcns\fP, and the
+namespace ID \fInsid\fP if required by the CNS type.
+
+Stores the identify data in \fIdata\fP, which is expected to be a buffer of
+\fINVME_IDENTIFY_DATA_SIZE\fP bytes.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP.
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_identify_ctrl.2 b/doc/man/nvme_mi_admin_identify_ctrl.2
new file mode 100644
index 0000000..d624c3e
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_ctrl.2
@@ -0,0 +1,23 @@
+.TH "nvme_mi_admin_identify_ctrl" 9 "nvme_mi_admin_identify_ctrl" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_ctrl \- Perform an Admin identify for a controller
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_ctrl
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_id_ctrl *id " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "id" 12
+Controller identify data to populate
+.SH "DESCRIPTION"
+Perform an Identify command, for the controller specified by \fIctrl\fP,
+writing identify data to \fIid\fP.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIid\fP will be
+fully populated on success.
+
+See: \fIstruct nvme_id_ctrl\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_identify_ctrl_list.2 b/doc/man/nvme_mi_admin_identify_ctrl_list.2
new file mode 100644
index 0000000..cdac0f0
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_ctrl_list.2
@@ -0,0 +1,26 @@
+.TH "nvme_mi_admin_identify_ctrl_list" 9 "nvme_mi_admin_identify_ctrl_list" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_ctrl_list \- Perform an Admin identify for a controller list.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_ctrl_list
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "__u16 cntid " ","
+.BI "struct nvme_ctrl_list *list " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "cntid" 12
+Controller ID to specify list start
+.IP "list" 12
+List data to populate
+.SH "DESCRIPTION"
+Perform an Identify command, for the controller list starting with
+IDs greater than or equal to \fIcntid\fP.
+
+Will return an error if the length of the response data (from the
+controller) is not a full \fINVME_IDENTIFY_DATA_SIZE\fP, so \fIid\fP will be
+fully populated on success.
+
+See: \fIstruct nvme_ctrl_list\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_identify_partial.2 b/doc/man/nvme_mi_admin_identify_partial.2
new file mode 100644
index 0000000..8818ab0
--- /dev/null
+++ b/doc/man/nvme_mi_admin_identify_partial.2
@@ -0,0 +1,36 @@
+.TH "nvme_mi_admin_identify_partial" 9 "nvme_mi_admin_identify_partial" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_identify_partial \- Perform an Admin identify command, and retrieve partial response data.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_identify_partial
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_identify_args *args " ","
+.BI "off_t offset " ","
+.BI "size_t size " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to process identify command
+.IP "args" 12
+Identify command arguments
+.IP "offset" 12
+offset of identify data to retrieve from response
+.IP "size" 12
+size of identify data to return
+.SH "DESCRIPTION"
+Perform an Identify command, using the Identify command parameters in \fIargs\fP.
+The \fIoffset\fP and \fIsize\fP arguments allow the caller to retrieve part of
+the identify response. See NVMe-MI section 6.2 for the semantics (and some
+handy diagrams) of the offset & size parameters.
+
+Will return an error if the length of the response data (from the controller)
+did not match \fIsize\fP.
+
+Unless you're performing a vendor-unique identify command, You'll probably
+want to use one of the identify helpers (nvme_mi_admin_identify,
+nvme_mi_admin_identify_cns_nsid, or nvme_mi_admin_identify_<type>) instead
+of this. If the type of your identify command is standardized but not
+yet supported by libnvme-mi, please contact the maintainers.
+
+See: \fIstruct nvme_identify_args\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_req_hdr.2 b/doc/man/nvme_mi_admin_req_hdr.2
new file mode 100644
index 0000000..94d6bc7
--- /dev/null
+++ b/doc/man/nvme_mi_admin_req_hdr.2
@@ -0,0 +1,72 @@
+.TH "libnvme" 9 "struct nvme_mi_admin_req_hdr" "July 2022" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_admin_req_hdr \- Admin command request header.
+.SH SYNOPSIS
+struct nvme_mi_admin_req_hdr {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 opcode;"
+.br
+.BI " __u8 flags;"
+.br
+.BI " __le16 ctrl_id;"
+.br
+.BI " __le32 cdw1, cdw2, cdw3, cdw4, cdw5;"
+.br
+.BI " __le32 doff;"
+.br
+.BI " __le32 dlen;"
+.br
+.BI " __le32 rsvd0, rsvd1;"
+.br
+.BI " __le32 cdw10, cdw11, cdw12, cdw13, cdw14, cdw15;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+Generic MI message header
+.IP "opcode" 12
+Admin command opcode (using enum nvme_admin_opcode)
+.IP "flags" 12
+Command Flags, indicating dlen and doff validity; Only defined in
+NVMe-MI version 1.1, no fields defined in 1.2 (where the dlen/doff
+are always considered valid).
+.IP "ctrl_id" 12
+Controller ID target of command
+.IP "cdw1" 12
+Submission Queue Entry doubleword 1
+.IP "cdw2" 12
+Submission Queue Entry doubleword 2
+.IP "cdw3" 12
+Submission Queue Entry doubleword 3
+.IP "cdw4" 12
+Submission Queue Entry doubleword 4
+.IP "cdw5" 12
+Submission Queue Entry doubleword 5
+.IP "doff" 12
+Offset of data to return from command
+.IP "dlen" 12
+Length of sent/returned data
+.IP "rsvd0" 12
+Reserved
+.IP "rsvd1" 12
+Reserved
+.IP "cdw10" 12
+Submission Queue Entry doubleword 10
+.IP "cdw11" 12
+Submission Queue Entry doubleword 11
+.IP "cdw12" 12
+Submission Queue Entry doubleword 12
+.IP "cdw13" 12
+Submission Queue Entry doubleword 13
+.IP "cdw14" 12
+Submission Queue Entry doubleword 14
+.IP "cdw15" 12
+Submission Queue Entry doubleword 15
+.SH "Description"
+Wire format for Admin command message headers, defined in section 6 of
+NVMe-MI.
diff --git a/doc/man/nvme_mi_admin_resp_hdr.2 b/doc/man/nvme_mi_admin_resp_hdr.2
new file mode 100644
index 0000000..383a83f
--- /dev/null
+++ b/doc/man/nvme_mi_admin_resp_hdr.2
@@ -0,0 +1,34 @@
+.TH "libnvme" 9 "struct nvme_mi_admin_resp_hdr" "July 2022" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_admin_resp_hdr \- Admin command response header.
+.SH SYNOPSIS
+struct nvme_mi_admin_resp_hdr {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 status;"
+.br
+.BI " __u8 rsvd0[3];"
+.br
+.BI " __le32 cdw0, cdw1, cdw3;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+Generic MI message header
+.IP "status" 12
+Generic response code, non-zero on failure
+.IP "rsvd0" 12
+Reserved
+.IP "cdw0" 12
+Completion Queue Entry doubleword 0
+.IP "cdw1" 12
+Completion Queue Entry doubleword 1
+.IP "cdw3" 12
+Completion Queue Entry doubleword 3
+.SH "Description"
+This is the generic response format with the three doublewords of completion
+queue data, plus optional response data.
diff --git a/doc/man/nvme_mi_admin_security_recv.2 b/doc/man/nvme_mi_admin_security_recv.2
new file mode 100644
index 0000000..cb658d4
--- /dev/null
+++ b/doc/man/nvme_mi_admin_security_recv.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_security_recv" 9 "nvme_mi_admin_security_recv" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_security_recv \- Perform a Security Receive command on a controller.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_security_recv
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_security_receive_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "args" 12
+Security Receive command arguments
+.SH "DESCRIPTION"
+Performs a Security Receive Admin command as specified by \fIargs\fP. Response
+data is stored in \fIargs->data\fP, which should be a buffer of \fIargs->data_len\fP
+bytes. Resulting data length is stored in \fIargs->data_len\fP on successful
+command completion.
+
+Security Receive data length should not be greater than 4096 bytes to
+comply with specification limits.
+
+See: \fIstruct nvme_get_log_args\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_security_send.2 b/doc/man/nvme_mi_admin_security_send.2
new file mode 100644
index 0000000..37aed3e
--- /dev/null
+++ b/doc/man/nvme_mi_admin_security_send.2
@@ -0,0 +1,24 @@
+.TH "nvme_mi_admin_security_send" 9 "nvme_mi_admin_security_send" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_security_send \- Perform a Security Send command on a controller.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_security_send
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_security_send_args *args " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+Controller to send command to
+.IP "args" 12
+Security Send command arguments
+.SH "DESCRIPTION"
+Performs a Security Send Admin command as specified by \fIargs\fP. Response data
+is stored in \fIargs->data\fP, which should be a buffer of \fIargs->data_len\fP bytes.
+Resulting data length is stored in \fIargs->data_len\fP on successful
+command completion.
+
+Security Send data length should not be greater than 4096 bytes to
+comply with specification limits.
+
+See: \fIstruct nvme_get_log_args\fP
+.SH "RETURN"
+0 on success, non-zero on failure
diff --git a/doc/man/nvme_mi_admin_xfer.2 b/doc/man/nvme_mi_admin_xfer.2
new file mode 100644
index 0000000..a86e8bf
--- /dev/null
+++ b/doc/man/nvme_mi_admin_xfer.2
@@ -0,0 +1,41 @@
+.TH "nvme_mi_admin_xfer" 9 "nvme_mi_admin_xfer" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_admin_xfer \- Raw admin transfer interface.
+.SH SYNOPSIS
+.B "int" nvme_mi_admin_xfer
+.BI "(nvme_mi_ctrl_t ctrl " ","
+.BI "struct nvme_mi_admin_req_hdr *admin_req " ","
+.BI "size_t req_data_size " ","
+.BI "struct nvme_mi_admin_resp_hdr *admin_resp " ","
+.BI "off_t resp_data_offset " ","
+.BI "size_t *resp_data_size " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+controller to send the admin command to
+.IP "admin_req" 12
+request data
+.IP "req_data_size" 12
+size of request data payload
+.IP "admin_resp" 12
+buffer for response data
+.IP "resp_data_offset" 12
+offset into request data to retrieve from controller
+.IP "resp_data_size" 12
+size of response data buffer, updated to received size
+.SH "DESCRIPTION"
+Performs an arbitrary NVMe Admin command, using the provided request data,
+in \fIadmin_req\fP. The size of the request data *payload* is specified in
+\fIreq_data_size\fP - this does not include the standard header length (so a
+header-only request would have a size of 0).
+
+On success, response data is stored in \fIadmin_resp\fP, which has an optional
+appended payload buffer of \fIresp_data_size\fP bytes. The actual payload
+transferred will be stored in \fIresp_data_size\fP. These sizes do not include
+the Admin request header, so 0 represents no payload.
+
+As with all Admin commands, we can request partial data from the Admin
+Response payload, offset by \fIresp_data_offset\fP.
+
+See: \fIstruct nvme_mi_admin_req_hdr\fP and \fIstruct nvme_mi_admin_resp_hdr\fP.
+.SH "RETURN"
+0 on success, non-zero on failure.
diff --git a/doc/man/nvme_mi_ccs.2 b/doc/man/nvme_mi_ccs.2
new file mode 100644
index 0000000..266508c
--- /dev/null
+++ b/doc/man/nvme_mi_ccs.2
@@ -0,0 +1,78 @@
+.TH "libnvme" 9 "enum nvme_mi_ccs" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_ccs \- Get State Control Primitive Success Response Fields - Control Primitive Specific Response
+.SH SYNOPSIS
+enum nvme_mi_ccs {
+.br
+.BI " NVME_MI_CCS_RDY"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CFS"
+,
+.br
+.br
+.BI " NVME_MI_CCS_SHST"
+,
+.br
+.br
+.BI " NVME_MI_CCS_NSSRO"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CECO"
+,
+.br
+.br
+.BI " NVME_MI_CCS_NAC"
+,
+.br
+.br
+.BI " NVME_MI_CCS_FA"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CSTS"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CTEMP"
+,
+.br
+.br
+.BI " NVME_MI_CCS_PDLU"
+,
+.br
+.br
+.BI " NVME_MI_CCS_SPARE"
+,
+.br
+.br
+.BI " NVME_MI_CCS_CCWARN"
+
+};
+.SH Constants
+.IP "NVME_MI_CCS_RDY" 12
+Ready
+.IP "NVME_MI_CCS_CFS" 12
+Controller Fatal Status
+.IP "NVME_MI_CCS_SHST" 12
+Shutdown Status
+.IP "NVME_MI_CCS_NSSRO" 12
+NVM Subsystem Reset Occurred
+.IP "NVME_MI_CCS_CECO" 12
+Controller Enable Change Occurred
+.IP "NVME_MI_CCS_NAC" 12
+Namespace Attribute Changed
+.IP "NVME_MI_CCS_FA" 12
+Firmware Activated
+.IP "NVME_MI_CCS_CSTS" 12
+Controller Status Change
+.IP "NVME_MI_CCS_CTEMP" 12
+Composite Temperature Change
+.IP "NVME_MI_CCS_PDLU" 12
+Percentage Used
+.IP "NVME_MI_CCS_SPARE" 12
+Available Spare
+.IP "NVME_MI_CCS_CCWARN" 12
+Critical Warning
diff --git a/doc/man/nvme_mi_close.2 b/doc/man/nvme_mi_close.2
new file mode 100644
index 0000000..ab0f9b6
--- /dev/null
+++ b/doc/man/nvme_mi_close.2
@@ -0,0 +1,9 @@
+.TH "nvme_mi_close" 9 "nvme_mi_close" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_close \- Close an endpoint connection and release resources, including controller objects.
+.SH SYNOPSIS
+.B "void" nvme_mi_close
+.BI "(nvme_mi_ep_t ep " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+Endpoint object to close
diff --git a/doc/man/nvme_mi_close_ctrl.2 b/doc/man/nvme_mi_close_ctrl.2
new file mode 100644
index 0000000..51cbbf4
--- /dev/null
+++ b/doc/man/nvme_mi_close_ctrl.2
@@ -0,0 +1,9 @@
+.TH "nvme_mi_close_ctrl" 9 "nvme_mi_close_ctrl" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_close_ctrl \- free a controller
+.SH SYNOPSIS
+.B "void" nvme_mi_close_ctrl
+.BI "(nvme_mi_ctrl_t ctrl " ");"
+.SH ARGUMENTS
+.IP "ctrl" 12
+controller to free
diff --git a/doc/man/nvme_mi_cmd_supported_effects.2 b/doc/man/nvme_mi_cmd_supported_effects.2
index 14a723d..9ff7cc3 100644
--- a/doc/man/nvme_mi_cmd_supported_effects.2
+++ b/doc/man/nvme_mi_cmd_supported_effects.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_mi_cmd_supported_effects" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_mi_cmd_supported_effects" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_mi_cmd_supported_effects \- bit field definitions
+enum nvme_mi_cmd_supported_effects \- MI Command Supported and Effects Data Structure
.SH SYNOPSIS
enum nvme_mi_cmd_supported_effects {
.br
@@ -59,7 +59,7 @@ enum nvme_mi_cmd_supported_effects {
.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_CSUPP" 12
Command Supported
.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC" 12
-User Data Conttent Change
+User Data Content Change
.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_NCC" 12
Namespace Capability Change
.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_NIC" 12
@@ -82,5 +82,3 @@ Endurance Group Scope
Domain Scope
.IP "NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NSS" 12
NVM Subsystem Scope
-.SH "Description"
-MI Command Supported and Effects Data Structure definitions
diff --git a/doc/man/nvme_mi_cmd_supported_effects_log.2 b/doc/man/nvme_mi_cmd_supported_effects_log.2
index 96763e7..6d541bb 100644
--- a/doc/man/nvme_mi_cmd_supported_effects_log.2
+++ b/doc/man/nvme_mi_cmd_supported_effects_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_cmd_supported_effects_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_cmd_supported_effects_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_cmd_supported_effects_log \-
+struct nvme_mi_cmd_supported_effects_log \- NVMe-MI Commands Supported and Effects Log
.SH SYNOPSIS
struct nvme_mi_cmd_supported_effects_log {
.br
@@ -15,5 +15,5 @@ struct nvme_mi_cmd_supported_effects_log {
.SH Members
.IP "mi_cmd_support" 12
NVMe-MI Commands Supported
-.SH "Description"
-NVMe-MI Commands Supported and Effects (Log Identifier 13h)
+.IP "reserved1" 12
+Reserved
diff --git a/doc/man/nvme_mi_config_id.2 b/doc/man/nvme_mi_config_id.2
new file mode 100644
index 0000000..9d4bd2f
--- /dev/null
+++ b/doc/man/nvme_mi_config_id.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "enum nvme_mi_config_id" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_config_id \- NVMe-MI Configuration identifier.
+.SH SYNOPSIS
+enum nvme_mi_config_id {
+.br
+.BI " NVME_MI_CONFIG_SMBUS_FREQ"
+,
+.br
+.br
+.BI " NVME_MI_CONFIG_HEALTH_STATUS_CHANGE"
+,
+.br
+.br
+.BI " NVME_MI_CONFIG_MCTP_MTU"
+
+};
+.SH Constants
+.IP "NVME_MI_CONFIG_SMBUS_FREQ" 12
+Current SMBus/I2C frequency
+.IP "NVME_MI_CONFIG_HEALTH_STATUS_CHANGE" 12
+Health Status change - used to clear
+health status bits in CCS bits of
+status poll. Only for Set ops.
+.IP "NVME_MI_CONFIG_MCTP_MTU" 12
+MCTP maximum transmission unit size of port
+specified in dw 0
+.SH "Description"
+Configuration parameters for the MI Get/Set Configuration commands.
+
+See &\fBnvme_mi_mi_config_get\fP and &\fBnvme_mi_config_set\fP.
diff --git a/doc/man/nvme_mi_config_smbus_freq.2 b/doc/man/nvme_mi_config_smbus_freq.2
new file mode 100644
index 0000000..2987dca
--- /dev/null
+++ b/doc/man/nvme_mi_config_smbus_freq.2
@@ -0,0 +1,27 @@
+.TH "libnvme" 9 "enum nvme_mi_config_smbus_freq" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_config_smbus_freq \- SMBus/I2C frequency values
+.SH SYNOPSIS
+enum nvme_mi_config_smbus_freq {
+.br
+.BI " NVME_MI_CONFIG_SMBUS_FREQ_100kHz"
+,
+.br
+.br
+.BI " NVME_MI_CONFIG_SMBUS_FREQ_400kHz"
+,
+.br
+.br
+.BI " NVME_MI_CONFIG_SMBUS_FREQ_1MHz"
+
+};
+.SH Constants
+.IP "NVME_MI_CONFIG_SMBUS_FREQ_100kHz" 12
+100kHz
+.IP "NVME_MI_CONFIG_SMBUS_FREQ_400kHz" 12
+400kHz
+.IP "NVME_MI_CONFIG_SMBUS_FREQ_1MHz" 12
+1MHz
+.SH "Description"
+Values used in the SMBus Frequency device configuration. See
+&\fBnvme_mi_mi_config_get_smbus_freq\fP and &\fBnvme_mi_mi_config_set_smbus_freq\fP.
diff --git a/doc/man/nvme_mi_create_root.2 b/doc/man/nvme_mi_create_root.2
new file mode 100644
index 0000000..f24216a
--- /dev/null
+++ b/doc/man/nvme_mi_create_root.2
@@ -0,0 +1,20 @@
+.TH "nvme_mi_create_root" 9 "nvme_mi_create_root" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_create_root \- Create top-level MI (root) handle.
+.SH SYNOPSIS
+.B "nvme_root_t" nvme_mi_create_root
+.BI "(FILE *fp " ","
+.BI "int log_level " ");"
+.SH ARGUMENTS
+.IP "fp" 12
+File descriptor for logging messages
+.IP "log_level" 12
+Logging level to use
+.SH "DESCRIPTION"
+Create the top-level (library) handle for creating subsequent endpoint
+objects. Similar to \fBnvme_create_root\fP, but we provide this to allow linking
+without the core libnvme.
+
+See \fInvme_create_root\fP.
+.SH "RETURN"
+new root object, or NULL on failure.
diff --git a/doc/man/nvme_mi_css.2 b/doc/man/nvme_mi_css.2
deleted file mode 100644
index f75db9e..0000000
--- a/doc/man/nvme_mi_css.2
+++ /dev/null
@@ -1,78 +0,0 @@
-.TH "libnvme" 9 "enum nvme_mi_css" "April 2022" "API Manual" LINUX
-.SH NAME
-enum nvme_mi_css \-
-.SH SYNOPSIS
-enum nvme_mi_css {
-.br
-.BI " NVME_MI_CCS_RDY"
-,
-.br
-.br
-.BI " NVME_MI_CSS_CFS"
-,
-.br
-.br
-.BI " NVME_MI_CSS_SHST"
-,
-.br
-.br
-.BI " NVME_MI_CSS_NSSRO"
-,
-.br
-.br
-.BI " NVME_MI_CSS_CECO"
-,
-.br
-.br
-.BI " NVME_MI_CSS_NAC"
-,
-.br
-.br
-.BI " NVME_MI_CSS_FA"
-,
-.br
-.br
-.BI " NVME_MI_CSS_CSTS"
-,
-.br
-.br
-.BI " NVME_MI_CSS_CTEMP"
-,
-.br
-.br
-.BI " NVME_MI_CSS_PDLU"
-,
-.br
-.br
-.BI " NVME_MI_CSS_SPARE"
-,
-.br
-.br
-.BI " NVME_MI_CSS_CCWARN"
-
-};
-.SH Constants
-.IP "NVME_MI_CCS_RDY" 12
-Ready
-.IP "NVME_MI_CSS_CFS" 12
-Controller Fatal Status
-.IP "NVME_MI_CSS_SHST" 12
-Shutdown Status
-.IP "NVME_MI_CSS_NSSRO" 12
-NVM Subsystem Reset Occurred
-.IP "NVME_MI_CSS_CECO" 12
-Controller Enable Change Occurred
-.IP "NVME_MI_CSS_NAC" 12
-Namespace Attribute Changed
-.IP "NVME_MI_CSS_FA" 12
-Firmware Activated
-.IP "NVME_MI_CSS_CSTS" 12
-Controller Status Change
-.IP "NVME_MI_CSS_CTEMP" 12
-Composite Temperature Change
-.IP "NVME_MI_CSS_PDLU" 12
-Percentage Used
-.IP "NVME_MI_CSS_SPARE" 12
-Available Spare
-.IP "NVME_MI_CSS_CCWARN" 12
-Critical Warning
diff --git a/doc/man/nvme_mi_csts.2 b/doc/man/nvme_mi_csts.2
index f9e388a..23a009c 100644
--- a/doc/man/nvme_mi_csts.2
+++ b/doc/man/nvme_mi_csts.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_mi_csts" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_mi_csts" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_mi_csts \-
+enum nvme_mi_csts \- Controller Health Data Structure (CHDS) - Controller Status (CSTS)
.SH SYNOPSIS
enum nvme_mi_csts {
.br
diff --git a/doc/man/nvme_mi_ctrl_health_status.2 b/doc/man/nvme_mi_ctrl_health_status.2
index 76cb616..ab79056 100644
--- a/doc/man/nvme_mi_ctrl_health_status.2
+++ b/doc/man/nvme_mi_ctrl_health_status.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_ctrl_health_status" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_ctrl_health_status" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_ctrl_health_status \-
+struct nvme_mi_ctrl_health_status \- Controller Health Data Structure (CHDS)
.SH SYNOPSIS
struct nvme_mi_ctrl_health_status {
.br
diff --git a/doc/man/nvme_mi_cwarn.2 b/doc/man/nvme_mi_cwarn.2
index 11ccbc8..4b5ee22 100644
--- a/doc/man/nvme_mi_cwarn.2
+++ b/doc/man/nvme_mi_cwarn.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_mi_cwarn" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_mi_cwarn" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_mi_cwarn \-
+enum nvme_mi_cwarn \- Controller Health Data Structure (CHDS) - Critical Warning (CWARN)
.SH SYNOPSIS
enum nvme_mi_cwarn {
.br
diff --git a/doc/man/nvme_mi_dtyp.2 b/doc/man/nvme_mi_dtyp.2
new file mode 100644
index 0000000..20df415
--- /dev/null
+++ b/doc/man/nvme_mi_dtyp.2
@@ -0,0 +1,45 @@
+.TH "libnvme" 9 "enum nvme_mi_dtyp" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_dtyp \- Data Structure Type field.
+.SH SYNOPSIS
+enum nvme_mi_dtyp {
+.br
+.BI " nvme_mi_dtyp_subsys_info"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_port_info"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_ctrl_list"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_ctrl_info"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_opt_cmd_support"
+,
+.br
+.br
+.BI " nvme_mi_dtyp_meb_support"
+
+};
+.SH Constants
+.IP "nvme_mi_dtyp_subsys_info" 12
+NVM Subsystem Information
+.IP "nvme_mi_dtyp_port_info" 12
+Port information
+.IP "nvme_mi_dtyp_ctrl_list" 12
+Controller List
+.IP "nvme_mi_dtyp_ctrl_info" 12
+Controller Information
+.IP "nvme_mi_dtyp_opt_cmd_support" 12
+Optionally Supported Command List
+.IP "nvme_mi_dtyp_meb_support" 12
+Management Endpoint Buffer Command Support List
+.SH "Description"
+Data Structure Type field for Read NVMe-MI Data Structure command, used to
+indicate the particular structure to query from the endpoint.
diff --git a/doc/man/nvme_mi_elem.2 b/doc/man/nvme_mi_elem.2
index 17be0ef..10c4803 100644
--- a/doc/man/nvme_mi_elem.2
+++ b/doc/man/nvme_mi_elem.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_mi_elem" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_mi_elem" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_mi_elem \-
+enum nvme_mi_elem \- Element Descriptor Types
.SH SYNOPSIS
enum nvme_mi_elem {
.br
diff --git a/doc/man/nvme_mi_free_root.2 b/doc/man/nvme_mi_free_root.2
new file mode 100644
index 0000000..bb6e5cb
--- /dev/null
+++ b/doc/man/nvme_mi_free_root.2
@@ -0,0 +1,9 @@
+.TH "nvme_mi_free_root" 9 "nvme_mi_free_root" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_free_root \- Free root object.
+.SH SYNOPSIS
+.B "void" nvme_mi_free_root
+.BI "(nvme_root_t root " ");"
+.SH ARGUMENTS
+.IP "root" 12
+root to free
diff --git a/doc/man/nvme_mi_init_ctrl.2 b/doc/man/nvme_mi_init_ctrl.2
new file mode 100644
index 0000000..f8e84ec
--- /dev/null
+++ b/doc/man/nvme_mi_init_ctrl.2
@@ -0,0 +1,20 @@
+.TH "nvme_mi_init_ctrl" 9 "nvme_mi_init_ctrl" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_init_ctrl \- initialise a NVMe controller.
+.SH SYNOPSIS
+.B "nvme_mi_ctrl_t" nvme_mi_init_ctrl
+.BI "(nvme_mi_ep_t ep " ","
+.BI "__u16 ctrl_id " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+Endpoint to create under
+.IP "ctrl_id" 12
+ID of controller to initialize.
+.SH "DESCRIPTION"
+Create a connection to a controller behind the endpoint specified in \fIep\fP.
+Controller IDs may be queried from the endpoint through
+\fInvme_mi_mi_read_mi_data_ctrl_list\fP.
+
+See \fInvme_mi_close_ctrl\fP
+.SH "RETURN"
+New controller object, or NULL on failure.
diff --git a/doc/man/nvme_mi_message_type.2 b/doc/man/nvme_mi_message_type.2
new file mode 100644
index 0000000..450992f
--- /dev/null
+++ b/doc/man/nvme_mi_message_type.2
@@ -0,0 +1,33 @@
+.TH "libnvme" 9 "enum nvme_mi_message_type" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_message_type \- NVMe-MI message type field.
+.SH SYNOPSIS
+enum nvme_mi_message_type {
+.br
+.BI " NVME_MI_MT_CONTROL"
+,
+.br
+.br
+.BI " NVME_MI_MT_MI"
+,
+.br
+.br
+.BI " NVME_MI_MT_ADMIN"
+,
+.br
+.br
+.BI " NVME_MI_MT_PCIE"
+
+};
+.SH Constants
+.IP "NVME_MI_MT_CONTROL" 12
+NVME-MI Control Primitive
+.IP "NVME_MI_MT_MI" 12
+NVMe-MI command
+.IP "NVME_MI_MT_ADMIN" 12
+NVMe Admin command
+.IP "NVME_MI_MT_PCIE" 12
+PCIe command
+.SH "Description"
+Used as byte 1 of both request and response messages (NMIMT bits of NMP
+byte). Not to be confused with the MCTP message type in byte 0.
diff --git a/doc/man/nvme_mi_mi_opcode.2 b/doc/man/nvme_mi_mi_opcode.2
new file mode 100644
index 0000000..64cbac9
--- /dev/null
+++ b/doc/man/nvme_mi_mi_opcode.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "enum nvme_mi_mi_opcode" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_mi_opcode \- Operation code for supported NVMe-MI commands.
+.SH SYNOPSIS
+enum nvme_mi_mi_opcode {
+.br
+.BI " nvme_mi_mi_opcode_mi_data_read"
+,
+.br
+.br
+.BI " nvme_mi_mi_opcode_subsys_health_status_poll"
+,
+.br
+.br
+.BI " nvme_mi_mi_opcode_configuration_set"
+,
+.br
+.br
+.BI " nvme_mi_mi_opcode_configuration_get"
+
+};
+.SH Constants
+.IP "nvme_mi_mi_opcode_mi_data_read" 12
+Read NVMe-MI Data Structure
+.IP "nvme_mi_mi_opcode_subsys_health_status_poll" 12
+Subsystem Health Status Poll
+.IP "nvme_mi_mi_opcode_configuration_set" 12
+MI Configuration Set
+.IP "nvme_mi_mi_opcode_configuration_get" 12
+MI Configuration Get
diff --git a/doc/man/nvme_mi_mi_read_mi_data_ctrl.2 b/doc/man/nvme_mi_mi_read_mi_data_ctrl.2
new file mode 100644
index 0000000..8d5603c
--- /dev/null
+++ b/doc/man/nvme_mi_mi_read_mi_data_ctrl.2
@@ -0,0 +1,22 @@
+.TH "nvme_mi_mi_read_mi_data_ctrl" 9 "nvme_mi_mi_read_mi_data_ctrl" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_read_mi_data_ctrl \- Perform a Read MI Data Structure command, retrieving controller information
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_read_mi_data_ctrl
+.BI "(nvme_mi_ep_t ep " ","
+.BI "__u16 ctrl_id " ","
+.BI "struct nvme_mi_read_ctrl_info *ctrl " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "ctrl_id" 12
+ID of controller to query
+.IP "ctrl" 12
+controller data to populate
+.SH "DESCRIPTION"
+Retrieves the Controller Information Data Structure for the attached
+controller with ID \fIctrlid\fP.
+
+See \fIstruct nvme_mi_read_ctrl_info\fP.
+.SH "RETURN"
+0 on success, non-zero on failure.
diff --git a/doc/man/nvme_mi_mi_read_mi_data_ctrl_list.2 b/doc/man/nvme_mi_mi_read_mi_data_ctrl_list.2
new file mode 100644
index 0000000..9db63e5
--- /dev/null
+++ b/doc/man/nvme_mi_mi_read_mi_data_ctrl_list.2
@@ -0,0 +1,22 @@
+.TH "nvme_mi_mi_read_mi_data_ctrl_list" 9 "nvme_mi_mi_read_mi_data_ctrl_list" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_read_mi_data_ctrl_list \- Perform a Read MI Data Structure command, retrieving the list of attached controllers.
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_read_mi_data_ctrl_list
+.BI "(nvme_mi_ep_t ep " ","
+.BI "__u8 start_ctrlid " ","
+.BI "struct nvme_ctrl_list *list " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "start_ctrlid" 12
+starting controller ID
+.IP "list" 12
+controller list to populate
+.SH "DESCRIPTION"
+Retrieves the list of attached controllers, with IDs greater than or
+equal to \fIstart_ctrlid\fP.
+
+See \fIstruct nvme_ctrl_list\fP.
+.SH "RETURN"
+0 on success, non-zero on failure.
diff --git a/doc/man/nvme_mi_mi_read_mi_data_port.2 b/doc/man/nvme_mi_mi_read_mi_data_port.2
new file mode 100644
index 0000000..4a20637
--- /dev/null
+++ b/doc/man/nvme_mi_mi_read_mi_data_port.2
@@ -0,0 +1,23 @@
+.TH "nvme_mi_mi_read_mi_data_port" 9 "nvme_mi_mi_read_mi_data_port" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_read_mi_data_port \- Perform a Read MI Data Structure command, retrieving port data.
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_read_mi_data_port
+.BI "(nvme_mi_ep_t ep " ","
+.BI "__u8 portid " ","
+.BI "struct nvme_mi_read_port_info *p " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "portid" 12
+id of port data to retrieve
+.IP "p" 12
+port information to populate
+.SH "DESCRIPTION"
+Retrieves the Port information, for the specified port ID. The subsystem
+data (from \fInvme_mi_mi_read_mi_data_subsys\fP) nmp field contains the allowed
+range of port IDs.
+
+See \fIstruct nvme_mi_read_port_info\fP.
+.SH "RETURN"
+0 on success, non-zero on failure.
diff --git a/doc/man/nvme_mi_mi_read_mi_data_subsys.2 b/doc/man/nvme_mi_mi_read_mi_data_subsys.2
new file mode 100644
index 0000000..0250794
--- /dev/null
+++ b/doc/man/nvme_mi_mi_read_mi_data_subsys.2
@@ -0,0 +1,17 @@
+.TH "nvme_mi_mi_read_mi_data_subsys" 9 "nvme_mi_mi_read_mi_data_subsys" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_read_mi_data_subsys \- Perform a Read MI Data Structure command, retrieving subsystem data.
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_read_mi_data_subsys
+.BI "(nvme_mi_ep_t ep " ","
+.BI "struct nvme_mi_read_nvm_ss_info *s " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "s" 12
+subsystem information to populate
+.SH "DESCRIPTION"
+Retrieves the Subsystem information - number of external ports and
+NVMe version information. See \fIstruct nvme_mi_read_nvm_ss_info\fP.
+.SH "RETURN"
+0 on success, non-zero on failure.
diff --git a/doc/man/nvme_mi_mi_req_hdr.2 b/doc/man/nvme_mi_mi_req_hdr.2
new file mode 100644
index 0000000..6d2e9c5
--- /dev/null
+++ b/doc/man/nvme_mi_mi_req_hdr.2
@@ -0,0 +1,31 @@
+.TH "libnvme" 9 "struct nvme_mi_mi_req_hdr" "July 2022" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_mi_req_hdr \- MI request message header.
+.SH SYNOPSIS
+struct nvme_mi_mi_req_hdr {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 opcode;"
+.br
+.BI " __u8 rsvd0[3];"
+.br
+.BI " __le32 cdw0, cdw1;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+generic MI message header
+.IP "opcode" 12
+opcode (OPC) for the specific MI command
+.IP "rsvd0" 12
+reserved bytes
+.IP "cdw0" 12
+Management Request Doubleword 0 - command specific usage
+.IP "cdw1" 12
+Management Request Doubleword 1 - command specific usage
+.SH "Description"
+Wire format for MI request message headers, defined in section 5 of NVMe-MI.
diff --git a/doc/man/nvme_mi_mi_resp_hdr.2 b/doc/man/nvme_mi_mi_resp_hdr.2
new file mode 100644
index 0000000..6c601a5
--- /dev/null
+++ b/doc/man/nvme_mi_mi_resp_hdr.2
@@ -0,0 +1,25 @@
+.TH "libnvme" 9 "struct nvme_mi_mi_resp_hdr" "July 2022" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_mi_resp_hdr \- MI response message header.
+.SH SYNOPSIS
+struct nvme_mi_mi_resp_hdr {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 status;"
+.br
+.BI " __u8 nmresp[3];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+generic MI message header
+.IP "status" 12
+generic response status from command; non-zero on failure.
+.IP "nmresp" 12
+NVMe Management Response: command-type-specific response data
+.SH "Description"
+Wire format for MI response message header, defined in section 5 of NVMe-MI.
diff --git a/doc/man/nvme_mi_mi_subsystem_health_status_poll.2 b/doc/man/nvme_mi_mi_subsystem_health_status_poll.2
new file mode 100644
index 0000000..8f0dbb4
--- /dev/null
+++ b/doc/man/nvme_mi_mi_subsystem_health_status_poll.2
@@ -0,0 +1,23 @@
+.TH "nvme_mi_mi_subsystem_health_status_poll" 9 "nvme_mi_mi_subsystem_health_status_poll" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_mi_subsystem_health_status_poll \- Read the Subsystem Health Data Structure from the NVM subsystem
+.SH SYNOPSIS
+.B "int" nvme_mi_mi_subsystem_health_status_poll
+.BI "(nvme_mi_ep_t ep " ","
+.BI "bool clear " ","
+.BI "struct nvme_mi_nvm_ss_health_status *nshds " ");"
+.SH ARGUMENTS
+.IP "ep" 12
+endpoint for MI communication
+.IP "clear" 12
+flag to clear the Composite Controller Status state
+.IP "nshds" 12
+subsystem health status data to populate
+.SH "DESCRIPTION"
+Retrieves the Subsystem Health Data Structure into \fInshds\fP. If \fIclear\fP is
+set, requests that the Composite Controller Status bits are cleared after
+the read. See NVMe-MI section 5.6 for details on the CCS bits.
+
+See \fIstruct nvme_mi_nvm_ss_health_status\fP.
+.SH "RETURN"
+0 on success, non-zero on failure.
diff --git a/doc/man/nvme_mi_msg_hdr.2 b/doc/man/nvme_mi_msg_hdr.2
new file mode 100644
index 0000000..1609661
--- /dev/null
+++ b/doc/man/nvme_mi_msg_hdr.2
@@ -0,0 +1,30 @@
+.TH "libnvme" 9 "struct nvme_mi_msg_hdr" "July 2022" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_msg_hdr \- General MI message header.
+.SH SYNOPSIS
+struct nvme_mi_msg_hdr {
+.br
+.BI " __u8 type;"
+.br
+.BI " __u8 nmp;"
+.br
+.BI " __u8 meb;"
+.br
+.BI " __u8 rsvd0;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "type" 12
+MCTP message type, will always be NVME_MI_MSGTYPE_NVME
+.IP "nmp" 12
+NVMe-MI message parameters (including MI message type)
+.IP "meb" 12
+Management Endpoint Buffer flag; unused for libnvme-mi implementation
+.IP "rsvd0" 12
+currently reserved
+.SH "Description"
+Wire format shared by both request and response messages, per NVMe-MI
+section 3.1. This is used for all message types, MI and Admin.
diff --git a/doc/man/nvme_mi_msg_resp.2 b/doc/man/nvme_mi_msg_resp.2
new file mode 100644
index 0000000..2b85435
--- /dev/null
+++ b/doc/man/nvme_mi_msg_resp.2
@@ -0,0 +1,26 @@
+.TH "libnvme" 9 "struct nvme_mi_msg_resp" "July 2022" "API Manual" LINUX
+.SH NAME
+struct nvme_mi_msg_resp \- Generic response type.
+.SH SYNOPSIS
+struct nvme_mi_msg_resp {
+.br
+.BI " struct nvme_mi_msg_hdr hdr;"
+.br
+.BI " __u8 status;"
+.br
+.BI " __u8 rsvd0[3];"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "hdr" 12
+the general request/response message header
+.IP "status" 12
+response status value (see \fIenum nvme_mi_resp_status\fP)
+.IP "rsvd0" 12
+reserved data, may be defined by specific response
+.SH "Description"
+Every response will start with one of these; command-specific responses
+will define parts of the reserved data, and may add further fields.
diff --git a/doc/man/nvme_mi_nvm_ss_health_status.2 b/doc/man/nvme_mi_nvm_ss_health_status.2
index 55c6d96..7179d74 100644
--- a/doc/man/nvme_mi_nvm_ss_health_status.2
+++ b/doc/man/nvme_mi_nvm_ss_health_status.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_nvm_ss_health_status" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_nvm_ss_health_status" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_nvm_ss_health_status \-
+struct nvme_mi_nvm_ss_health_status \- Subsystem Management Data Structure
.SH SYNOPSIS
struct nvme_mi_nvm_ss_health_status {
.br
diff --git a/doc/man/nvme_mi_open_mctp.2 b/doc/man/nvme_mi_open_mctp.2
new file mode 100644
index 0000000..cb3c410
--- /dev/null
+++ b/doc/man/nvme_mi_open_mctp.2
@@ -0,0 +1,22 @@
+.TH "nvme_mi_open_mctp" 9 "nvme_mi_open_mctp" "July 2022" "libnvme API manual" LINUX
+.SH NAME
+nvme_mi_open_mctp \- Create an endpoint using a MCTP connection.
+.SH SYNOPSIS
+.B "nvme_mi_ep_t" nvme_mi_open_mctp
+.BI "(nvme_root_t root " ","
+.BI "unsigned int netid " ","
+.BI "uint8_t eid " ");"
+.SH ARGUMENTS
+.IP "root" 12
+root object to create under
+.IP "netid" 12
+MCTP network ID on this system
+.IP "eid" 12
+MCTP endpoint ID
+.SH "DESCRIPTION"
+Transport-specific endpoint initialization for MI-connected endpoints. Once
+an endpoint is created, the rest of the API is transport-independent.
+
+See \fInvme_mi_close\fP
+.SH "RETURN"
+New endpoint object for \fInetid\fP & \fIeid\fP, or NULL on failure.
diff --git a/doc/man/nvme_mi_osc.2 b/doc/man/nvme_mi_osc.2
index df270a2..a53da59 100644
--- a/doc/man/nvme_mi_osc.2
+++ b/doc/man/nvme_mi_osc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_osc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_osc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_osc \-
+struct nvme_mi_osc \- Optionally Supported Command Data Structure
.SH SYNOPSIS
struct nvme_mi_osc {
.br
diff --git a/doc/man/nvme_mi_port_pcie.2 b/doc/man/nvme_mi_port_pcie.2
index 5221f02..3b0bbb9 100644
--- a/doc/man/nvme_mi_port_pcie.2
+++ b/doc/man/nvme_mi_port_pcie.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_port_pcie" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_port_pcie" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_port_pcie \-
+struct nvme_mi_port_pcie \- PCIe Port Specific Data
.SH SYNOPSIS
struct nvme_mi_port_pcie {
.br
diff --git a/doc/man/nvme_mi_port_smb.2 b/doc/man/nvme_mi_port_smb.2
index e7f3bfa..6549917 100644
--- a/doc/man/nvme_mi_port_smb.2
+++ b/doc/man/nvme_mi_port_smb.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_port_smb" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_port_smb" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_port_smb \-
+struct nvme_mi_port_smb \- SMBus Port Specific Data
.SH SYNOPSIS
struct nvme_mi_port_smb {
.br
diff --git a/doc/man/nvme_mi_read_ctrl_info.2 b/doc/man/nvme_mi_read_ctrl_info.2
index 790b652..a5ea77f 100644
--- a/doc/man/nvme_mi_read_ctrl_info.2
+++ b/doc/man/nvme_mi_read_ctrl_info.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_read_ctrl_info" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_read_ctrl_info" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_read_ctrl_info \-
+struct nvme_mi_read_ctrl_info \- Controller Information Data Structure
.SH SYNOPSIS
struct nvme_mi_read_ctrl_info {
.br
diff --git a/doc/man/nvme_mi_read_nvm_ss_info.2 b/doc/man/nvme_mi_read_nvm_ss_info.2
index c063097..093af35 100644
--- a/doc/man/nvme_mi_read_nvm_ss_info.2
+++ b/doc/man/nvme_mi_read_nvm_ss_info.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_read_nvm_ss_info" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_read_nvm_ss_info" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_read_nvm_ss_info \-
+struct nvme_mi_read_nvm_ss_info \- NVM Subsystem Information Data Structure
.SH SYNOPSIS
struct nvme_mi_read_nvm_ss_info {
.br
diff --git a/doc/man/nvme_mi_read_port_info.2 b/doc/man/nvme_mi_read_port_info.2
index dd634cb..2362d39 100644
--- a/doc/man/nvme_mi_read_port_info.2
+++ b/doc/man/nvme_mi_read_port_info.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_read_port_info" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_read_port_info" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_read_port_info \-
+struct nvme_mi_read_port_info \- Port Information Data Structure
.SH SYNOPSIS
struct nvme_mi_read_port_info {
.br
diff --git a/doc/man/nvme_mi_read_sc_list.2 b/doc/man/nvme_mi_read_sc_list.2
index f7b9ba4..3680306 100644
--- a/doc/man/nvme_mi_read_sc_list.2
+++ b/doc/man/nvme_mi_read_sc_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_read_sc_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_read_sc_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_read_sc_list \-
+struct nvme_mi_read_sc_list \- Management Endpoint Buffer Supported Command List Data Structure
.SH SYNOPSIS
struct nvme_mi_read_sc_list {
.br
@@ -16,4 +16,5 @@ struct nvme_mi_read_sc_list {
.IP "numcmd" 12
Number of Commands
.IP "cmds" 12
-MEB supported Command Data Structure
+MEB supported Command Data Structure.
+See \fIstruct\fP nvme_mi_osc
diff --git a/doc/man/nvme_mi_resp_status.2 b/doc/man/nvme_mi_resp_status.2
new file mode 100644
index 0000000..ab32ff0
--- /dev/null
+++ b/doc/man/nvme_mi_resp_status.2
@@ -0,0 +1,120 @@
+.TH "libnvme" 9 "enum nvme_mi_resp_status" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_mi_resp_status \- values for the response status field
+.SH SYNOPSIS
+enum nvme_mi_resp_status {
+.br
+.BI " NVME_MI_RESP_SUCCESS"
+,
+.br
+.br
+.BI " NVME_MI_RESP_MPR"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INTERNAL_ERR"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INVALID_OPCODE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INVALID_PARAM"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INVALID_CMD_SIZE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_INVALID_INPUT_SIZE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ACCESS_DENIED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_VPD_UPDATES_EXCEEDED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_PCIE_INACCESSIBLE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_MEB_SANITIZED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_SERV_FAILURE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_SERV_XFER_FAILURE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_FAILURE"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_XFER_REFUSED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_FUNC_UNSUP"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_SERV_UNAVAIL"
+,
+.br
+.br
+.BI " NVME_MI_RESP_ENC_DEGRADED"
+,
+.br
+.br
+.BI " NVME_MI_RESP_SANITIZE_IN_PROGRESS"
+
+};
+.SH Constants
+.IP "NVME_MI_RESP_SUCCESS" 12
+success
+.IP "NVME_MI_RESP_MPR" 12
+More Processing Required
+.IP "NVME_MI_RESP_INTERNAL_ERR" 12
+Internal Error
+.IP "NVME_MI_RESP_INVALID_OPCODE" 12
+Invalid command opcode
+.IP "NVME_MI_RESP_INVALID_PARAM" 12
+Invalid command parameter
+.IP "NVME_MI_RESP_INVALID_CMD_SIZE" 12
+Invalid command size
+.IP "NVME_MI_RESP_INVALID_INPUT_SIZE" 12
+Invalid command input data size
+.IP "NVME_MI_RESP_ACCESS_DENIED" 12
+Access Denied
+.IP "NVME_MI_RESP_VPD_UPDATES_EXCEEDED" 12
+More VPD updates than allowed
+.IP "NVME_MI_RESP_PCIE_INACCESSIBLE" 12
+PCIe functionality currently unavailable
+.IP "NVME_MI_RESP_MEB_SANITIZED" 12
+MEB has been cleared due to sanitize
+.IP "NVME_MI_RESP_ENC_SERV_FAILURE" 12
+Enclosure services process failed
+.IP "NVME_MI_RESP_ENC_SERV_XFER_FAILURE" 12
+Transfer with enclosure services failed
+.IP "NVME_MI_RESP_ENC_FAILURE" 12
+Unreoverable enclosure failure
+.IP "NVME_MI_RESP_ENC_XFER_REFUSED" 12
+Enclosure services transfer refused
+.IP "NVME_MI_RESP_ENC_FUNC_UNSUP" 12
+Unsupported enclosure services function
+.IP "NVME_MI_RESP_ENC_SERV_UNAVAIL" 12
+Enclosure services unavailable
+.IP "NVME_MI_RESP_ENC_DEGRADED" 12
+Noncritical failure detected by enc. services
+.IP "NVME_MI_RESP_SANITIZE_IN_PROGRESS" 12
+Command prohibited during sanitize
diff --git a/doc/man/nvme_mi_vpd_hdr.2 b/doc/man/nvme_mi_vpd_hdr.2
index f3b646d..9cd18a5 100644
--- a/doc/man/nvme_mi_vpd_hdr.2
+++ b/doc/man/nvme_mi_vpd_hdr.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_vpd_hdr" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_vpd_hdr" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_vpd_hdr \-
+struct nvme_mi_vpd_hdr \- Vital Product Data Common Header
.SH SYNOPSIS
struct nvme_mi_vpd_hdr {
.br
diff --git a/doc/man/nvme_mi_vpd_mr_common.2 b/doc/man/nvme_mi_vpd_mr_common.2
index 7e8d7a2..6862437 100644
--- a/doc/man/nvme_mi_vpd_mr_common.2
+++ b/doc/man/nvme_mi_vpd_mr_common.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_vpd_mr_common" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_vpd_mr_common" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_vpd_mr_common \-
+struct nvme_mi_vpd_mr_common \- NVMe MultiRecord Area
.SH SYNOPSIS
struct nvme_mi_vpd_mr_common {
.br
diff --git a/doc/man/nvme_mi_vpd_mra.2 b/doc/man/nvme_mi_vpd_mra.2
index 6658d62..10a4215 100644
--- a/doc/man/nvme_mi_vpd_mra.2
+++ b/doc/man/nvme_mi_vpd_mra.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_vpd_mra" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_vpd_mra" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_vpd_mra \-
+struct nvme_mi_vpd_mra \- NVMe MultiRecord Area
.SH SYNOPSIS
struct nvme_mi_vpd_mra {
.br
@@ -58,7 +58,7 @@ Maximum 3.3 V Power Supply Requirements
.IP "rsvd17" 12
Reserved
.IP "m33vapsr" 12
-Maximum 3.3 V aux Power Supply Requirements
+Maximum 3.3 Vi aux Power Supply Requirements
.IP "i5vapsr" 12
Initial 5 V Power Supply Requirements
.IP "m5vapsr" 12
diff --git a/doc/man/nvme_mi_vpd_ppmra.2 b/doc/man/nvme_mi_vpd_ppmra.2
index 7e45525..0761806 100644
--- a/doc/man/nvme_mi_vpd_ppmra.2
+++ b/doc/man/nvme_mi_vpd_ppmra.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_vpd_ppmra" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_vpd_ppmra" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_vpd_ppmra \-
+struct nvme_mi_vpd_ppmra \- NVMe PCIe Port MultiRecord Area
.SH SYNOPSIS
struct nvme_mi_vpd_ppmra {
.br
diff --git a/doc/man/nvme_mi_vpd_telem.2 b/doc/man/nvme_mi_vpd_telem.2
index f7a754b..a9e4e65 100644
--- a/doc/man/nvme_mi_vpd_telem.2
+++ b/doc/man/nvme_mi_vpd_telem.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_vpd_telem" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_vpd_telem" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_vpd_telem \-
+struct nvme_mi_vpd_telem \- Vital Product Data Element Descriptor
.SH SYNOPSIS
struct nvme_mi_vpd_telem {
.br
diff --git a/doc/man/nvme_mi_vpd_tra.2 b/doc/man/nvme_mi_vpd_tra.2
index ed56dcd..6c53807 100644
--- a/doc/man/nvme_mi_vpd_tra.2
+++ b/doc/man/nvme_mi_vpd_tra.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_mi_vpd_tra" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_mi_vpd_tra" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_mi_vpd_tra \-
+struct nvme_mi_vpd_tra \- Vital Product Data Topology MultiRecord
.SH SYNOPSIS
struct nvme_mi_vpd_tra {
.br
diff --git a/doc/man/nvme_namespace_attach_ctrls.2 b/doc/man/nvme_namespace_attach_ctrls.2
index 22657bd..2459f68 100644
--- a/doc/man/nvme_namespace_attach_ctrls.2
+++ b/doc/man/nvme_namespace_attach_ctrls.2
@@ -1,4 +1,4 @@
-.TH "nvme_namespace_attach_ctrls" 9 "nvme_namespace_attach_ctrls" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_namespace_attach_ctrls" 9 "nvme_namespace_attach_ctrls" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_namespace_attach_ctrls \- Attach namespace to controller(s)
.SH SYNOPSIS
diff --git a/doc/man/nvme_namespace_detach_ctrls.2 b/doc/man/nvme_namespace_detach_ctrls.2
index 2d18cc5..6bfa91f 100644
--- a/doc/man/nvme_namespace_detach_ctrls.2
+++ b/doc/man/nvme_namespace_detach_ctrls.2
@@ -1,4 +1,4 @@
-.TH "nvme_namespace_detach_ctrls" 9 "nvme_namespace_detach_ctrls" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_namespace_detach_ctrls" 9 "nvme_namespace_detach_ctrls" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_namespace_detach_ctrls \- Detach namespace from controller(s)
.SH SYNOPSIS
diff --git a/doc/man/nvme_namespace_filter.2 b/doc/man/nvme_namespace_filter.2
index 5536b95..642e183 100644
--- a/doc/man/nvme_namespace_filter.2
+++ b/doc/man/nvme_namespace_filter.2
@@ -1,4 +1,4 @@
-.TH "nvme_namespace_filter" 9 "nvme_namespace_filter" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_namespace_filter" 9 "nvme_namespace_filter" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_namespace_filter \- Filter for namespaces
.SH SYNOPSIS
diff --git a/doc/man/nvme_namespace_first_path.2 b/doc/man/nvme_namespace_first_path.2
index faaace8..29f6806 100644
--- a/doc/man/nvme_namespace_first_path.2
+++ b/doc/man/nvme_namespace_first_path.2
@@ -1,4 +1,4 @@
-.TH "nvme_namespace_first_path" 9 "nvme_namespace_first_path" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_namespace_first_path" 9 "nvme_namespace_first_path" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_namespace_first_path \- Start path iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_namespace_for_each_path.2 b/doc/man/nvme_namespace_for_each_path.2
index c86bb59..eaf0d6d 100644
--- a/doc/man/nvme_namespace_for_each_path.2
+++ b/doc/man/nvme_namespace_for_each_path.2
@@ -1,12 +1,12 @@
-.TH "nvme_namespace_for_each_path" 9 "nvme_namespace_for_each_path" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_namespace_for_each_path" 9 "nvme_namespace_for_each_path" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_namespace_for_each_path \- Traverse paths
.SH SYNOPSIS
.B "nvme_namespace_for_each_path
-.BI "(c " ","
+.BI "(n " ","
.BI "p " ");"
.SH ARGUMENTS
-.IP "c" 12
--- undescribed --
+.IP "n" 12
+Namespace instance
.IP "p" 12
\fInvme_path_t\fP object
diff --git a/doc/man/nvme_namespace_for_each_path_safe.2 b/doc/man/nvme_namespace_for_each_path_safe.2
index 9202a27..d6bc5ff 100644
--- a/doc/man/nvme_namespace_for_each_path_safe.2
+++ b/doc/man/nvme_namespace_for_each_path_safe.2
@@ -1,4 +1,4 @@
-.TH "nvme_namespace_for_each_path_safe" 9 "nvme_namespace_for_each_path_safe" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_namespace_for_each_path_safe" 9 "nvme_namespace_for_each_path_safe" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_namespace_for_each_path_safe \- Traverse paths
.SH SYNOPSIS
@@ -8,7 +8,7 @@ nvme_namespace_for_each_path_safe \- Traverse paths
.BI "_p " ");"
.SH ARGUMENTS
.IP "n" 12
--- undescribed --
+Namespace instance
.IP "p" 12
\fInvme_path_t\fP object
.IP "_p" 12
diff --git a/doc/man/nvme_namespace_next_path.2 b/doc/man/nvme_namespace_next_path.2
index a380df3..b367fac 100644
--- a/doc/man/nvme_namespace_next_path.2
+++ b/doc/man/nvme_namespace_next_path.2
@@ -1,13 +1,13 @@
-.TH "nvme_namespace_next_path" 9 "nvme_namespace_next_path" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_namespace_next_path" 9 "nvme_namespace_next_path" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_namespace_next_path \- Next path iterator
.SH SYNOPSIS
.B "nvme_path_t" nvme_namespace_next_path
-.BI "(nvme_ns_t c " ","
+.BI "(nvme_ns_t ns " ","
.BI "nvme_path_t p " ");"
.SH ARGUMENTS
-.IP "c" 12
--- undescribed --
+.IP "ns" 12
+Namespace instance
.IP "p" 12
Previous \fInvme_path_t\fP object of an \fIns\fP iterator
.SH "RETURN"
diff --git a/doc/man/nvme_nd_ns_fpi.2 b/doc/man/nvme_nd_ns_fpi.2
index b3dfa5b..0675d12 100644
--- a/doc/man/nvme_nd_ns_fpi.2
+++ b/doc/man/nvme_nd_ns_fpi.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_nd_ns_fpi" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_nd_ns_fpi" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_nd_ns_fpi \- If a format operation is in progress, this field indicates the percentage of the namespace that remains to be formatted.
.SH SYNOPSIS
diff --git a/doc/man/nvme_next_host.2 b/doc/man/nvme_next_host.2
index 39cbf31..b53781c 100644
--- a/doc/man/nvme_next_host.2
+++ b/doc/man/nvme_next_host.2
@@ -1,4 +1,4 @@
-.TH "nvme_next_host" 9 "nvme_next_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_next_host" 9 "nvme_next_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_next_host \- Next host iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_next_subsystem.2 b/doc/man/nvme_next_subsystem.2
index d6a0b32..000f34d 100644
--- a/doc/man/nvme_next_subsystem.2
+++ b/doc/man/nvme_next_subsystem.2
@@ -1,4 +1,4 @@
-.TH "nvme_next_subsystem" 9 "nvme_next_subsystem" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_next_subsystem" 9 "nvme_next_subsystem" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_next_subsystem \- Next subsystem iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_attach.2 b/doc/man/nvme_ns_attach.2
index 806998c..efdd161 100644
--- a/doc/man/nvme_ns_attach.2
+++ b/doc/man/nvme_ns_attach.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_attach" 9 "nvme_ns_attach" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_attach" 9 "nvme_ns_attach" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_attach \- Attach or detach namespace to controller(s)
.SH SYNOPSIS
@@ -7,3 +7,6 @@ nvme_ns_attach \- Attach or detach namespace to controller(s)
.SH ARGUMENTS
.IP "args" 12
\fIstruct nvme_ns_attach_args\fP Argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_attach_args.2 b/doc/man/nvme_ns_attach_args.2
deleted file mode 100644
index 00f2d14..0000000
--- a/doc/man/nvme_ns_attach_args.2
+++ /dev/null
@@ -1,39 +0,0 @@
-.TH "libnvme" 9 "struct nvme_ns_attach_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_ns_attach_args \- Arguments for Nvme Namespace Management command
-.SH SYNOPSIS
-struct nvme_ns_attach_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " struct nvme_ctrl_list *ctrlist;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_ns_attach_sel sel;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-NVMe command result
-.IP "ctrlist" 12
-Controller list to modify attachment state of nsid
-.IP "args_size" 12
-Size of \fIstruct nvme_ns_attach_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID to execute attach selection
-.IP "sel" 12
-Attachment selection, see \fIenum nvme_ns_attach_sel\fP
diff --git a/doc/man/nvme_ns_attach_ctrls.2 b/doc/man/nvme_ns_attach_ctrls.2
index b28ddb3..1c57b4d 100644
--- a/doc/man/nvme_ns_attach_ctrls.2
+++ b/doc/man/nvme_ns_attach_ctrls.2
@@ -1,6 +1,6 @@
-.TH "nvme_ns_attach_ctrls" 9 "nvme_ns_attach_ctrls" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_attach_ctrls" 9 "nvme_ns_attach_ctrls" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_ns_attach_ctrls \-
+nvme_ns_attach_ctrls \- Attach namespace to controllers
.SH SYNOPSIS
.B "int" nvme_ns_attach_ctrls
.BI "(int fd " ","
@@ -13,3 +13,6 @@ File descriptor of nvme device
Namespace ID to attach
.IP "ctrlist" 12
Controller list to modify attachment state of nsid
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_attach_sel.2 b/doc/man/nvme_ns_attach_sel.2
index b3e0386..1dafaf2 100644
--- a/doc/man/nvme_ns_attach_sel.2
+++ b/doc/man/nvme_ns_attach_sel.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ns_attach_sel" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ns_attach_sel" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ns_attach_sel \-
+enum nvme_ns_attach_sel \- Namespace Attachment - Select
.SH SYNOPSIS
enum nvme_ns_attach_sel {
.br
diff --git a/doc/man/nvme_ns_compare.2 b/doc/man/nvme_ns_compare.2
index 0c1d267..4ae2020 100644
--- a/doc/man/nvme_ns_compare.2
+++ b/doc/man/nvme_ns_compare.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_compare" 9 "nvme_ns_compare" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_compare" 9 "nvme_ns_compare" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_compare \- Compare data on a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_detach_ctrls.2 b/doc/man/nvme_ns_detach_ctrls.2
index 28ea6f3..c505317 100644
--- a/doc/man/nvme_ns_detach_ctrls.2
+++ b/doc/man/nvme_ns_detach_ctrls.2
@@ -1,6 +1,6 @@
-.TH "nvme_ns_detach_ctrls" 9 "nvme_ns_detach_ctrls" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_detach_ctrls" 9 "nvme_ns_detach_ctrls" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_ns_detach_ctrls \-
+nvme_ns_detach_ctrls \- Detach namespace from controllers
.SH SYNOPSIS
.B "int" nvme_ns_detach_ctrls
.BI "(int fd " ","
@@ -13,3 +13,6 @@ File descriptor of nvme device
Namespace ID to detach
.IP "ctrlist" 12
Controller list to modify attachment state of nsid
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_flush.2 b/doc/man/nvme_ns_flush.2
index c7cab3a..18962c7 100644
--- a/doc/man/nvme_ns_flush.2
+++ b/doc/man/nvme_ns_flush.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_flush" 9 "nvme_ns_flush" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_flush" 9 "nvme_ns_flush" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_flush \- Flush data to a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_csi.2 b/doc/man/nvme_ns_get_csi.2
index b8ba92f..1651f0b 100644
--- a/doc/man/nvme_ns_get_csi.2
+++ b/doc/man/nvme_ns_get_csi.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_csi" 9 "nvme_ns_get_csi" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_csi" 9 "nvme_ns_get_csi" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_csi \- Command set identifier of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_ctrl.2 b/doc/man/nvme_ns_get_ctrl.2
index fb3467c..37406fb 100644
--- a/doc/man/nvme_ns_get_ctrl.2
+++ b/doc/man/nvme_ns_get_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_ctrl" 9 "nvme_ns_get_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_ctrl" 9 "nvme_ns_get_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_ctrl \- &nvme_ctrl_t of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_fd.2 b/doc/man/nvme_ns_get_fd.2
index 95c199e..be3e3b0 100644
--- a/doc/man/nvme_ns_get_fd.2
+++ b/doc/man/nvme_ns_get_fd.2
@@ -1,6 +1,6 @@
-.TH "nvme_ns_get_fd" 9 "nvme_ns_get_fd" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_fd" 9 "nvme_ns_get_fd" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_ns_get_fd \- Get associated filedescriptor
+nvme_ns_get_fd \- Get associated file descriptor
.SH SYNOPSIS
.B "int" nvme_ns_get_fd
.BI "(nvme_ns_t n " ");"
diff --git a/doc/man/nvme_ns_get_firmware.2 b/doc/man/nvme_ns_get_firmware.2
index cc721c7..2905572 100644
--- a/doc/man/nvme_ns_get_firmware.2
+++ b/doc/man/nvme_ns_get_firmware.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_firmware" 9 "nvme_ns_get_firmware" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_firmware" 9 "nvme_ns_get_firmware" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_firmware \- Firmware string of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_generic_name.2 b/doc/man/nvme_ns_get_generic_name.2
index 58176ca..524162b 100644
--- a/doc/man/nvme_ns_get_generic_name.2
+++ b/doc/man/nvme_ns_get_generic_name.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_generic_name" 9 "nvme_ns_get_generic_name" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_generic_name" 9 "nvme_ns_get_generic_name" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_generic_name \- Returns name of generic namespace chardev.
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_lba_count.2 b/doc/man/nvme_ns_get_lba_count.2
index 7d3c172..329da0d 100644
--- a/doc/man/nvme_ns_get_lba_count.2
+++ b/doc/man/nvme_ns_get_lba_count.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_lba_count" 9 "nvme_ns_get_lba_count" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_lba_count" 9 "nvme_ns_get_lba_count" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_lba_count \- LBA count of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_lba_size.2 b/doc/man/nvme_ns_get_lba_size.2
index 62f3850..2641508 100644
--- a/doc/man/nvme_ns_get_lba_size.2
+++ b/doc/man/nvme_ns_get_lba_size.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_lba_size" 9 "nvme_ns_get_lba_size" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_lba_size" 9 "nvme_ns_get_lba_size" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_lba_size \- LBA size of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_lba_util.2 b/doc/man/nvme_ns_get_lba_util.2
index 52eac40..55041d4 100644
--- a/doc/man/nvme_ns_get_lba_util.2
+++ b/doc/man/nvme_ns_get_lba_util.2
@@ -1,6 +1,6 @@
-.TH "nvme_ns_get_lba_util" 9 "nvme_ns_get_lba_util" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_lba_util" 9 "nvme_ns_get_lba_util" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_ns_get_lba_util \- LBA utilisation of a namespace
+nvme_ns_get_lba_util \- LBA utilization of a namespace
.SH SYNOPSIS
.B "uint64_t" nvme_ns_get_lba_util
.BI "(nvme_ns_t n " ");"
@@ -8,4 +8,4 @@ nvme_ns_get_lba_util \- LBA utilisation of a namespace
.IP "n" 12
Namespace instance
.SH "RETURN"
-LBA utilisation of \fIn\fP
+LBA utilization of \fIn\fP
diff --git a/doc/man/nvme_ns_get_meta_size.2 b/doc/man/nvme_ns_get_meta_size.2
index 7cd756a..c067cf0 100644
--- a/doc/man/nvme_ns_get_meta_size.2
+++ b/doc/man/nvme_ns_get_meta_size.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_meta_size" 9 "nvme_ns_get_meta_size" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_meta_size" 9 "nvme_ns_get_meta_size" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_meta_size \- Metadata size of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_model.2 b/doc/man/nvme_ns_get_model.2
index 3ca02f4..bfe75a9 100644
--- a/doc/man/nvme_ns_get_model.2
+++ b/doc/man/nvme_ns_get_model.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_model" 9 "nvme_ns_get_model" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_model" 9 "nvme_ns_get_model" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_model \- Model of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_name.2 b/doc/man/nvme_ns_get_name.2
index d4cf500..e4497cd 100644
--- a/doc/man/nvme_ns_get_name.2
+++ b/doc/man/nvme_ns_get_name.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_name" 9 "nvme_ns_get_name" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_name" 9 "nvme_ns_get_name" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_name \- sysfs name of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_nguid.2 b/doc/man/nvme_ns_get_nguid.2
index 43bb47c..e726036 100644
--- a/doc/man/nvme_ns_get_nguid.2
+++ b/doc/man/nvme_ns_get_nguid.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_nguid" 9 "nvme_ns_get_nguid" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_nguid" 9 "nvme_ns_get_nguid" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_nguid \- 128-bit nguid of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_nsid.2 b/doc/man/nvme_ns_get_nsid.2
index 2904471..004c7e8 100644
--- a/doc/man/nvme_ns_get_nsid.2
+++ b/doc/man/nvme_ns_get_nsid.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_nsid" 9 "nvme_ns_get_nsid" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_nsid" 9 "nvme_ns_get_nsid" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_nsid \- NSID of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_serial.2 b/doc/man/nvme_ns_get_serial.2
index cafedd7..c7f8ab1 100644
--- a/doc/man/nvme_ns_get_serial.2
+++ b/doc/man/nvme_ns_get_serial.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_serial" 9 "nvme_ns_get_serial" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_serial" 9 "nvme_ns_get_serial" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_serial \- Serial number of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_subsystem.2 b/doc/man/nvme_ns_get_subsystem.2
index b9404ad..f51f9f9 100644
--- a/doc/man/nvme_ns_get_subsystem.2
+++ b/doc/man/nvme_ns_get_subsystem.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_subsystem" 9 "nvme_ns_get_subsystem" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_subsystem" 9 "nvme_ns_get_subsystem" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_subsystem \- &nvme_subsystem_t of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_sysfs_dir.2 b/doc/man/nvme_ns_get_sysfs_dir.2
index 5ff53f5..60d452f 100644
--- a/doc/man/nvme_ns_get_sysfs_dir.2
+++ b/doc/man/nvme_ns_get_sysfs_dir.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_sysfs_dir" 9 "nvme_ns_get_sysfs_dir" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_sysfs_dir" 9 "nvme_ns_get_sysfs_dir" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_sysfs_dir \- sysfs directory of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_get_uuid.2 b/doc/man/nvme_ns_get_uuid.2
index ee0c607..b9f3991 100644
--- a/doc/man/nvme_ns_get_uuid.2
+++ b/doc/man/nvme_ns_get_uuid.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_get_uuid" 9 "nvme_ns_get_uuid" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_get_uuid" 9 "nvme_ns_get_uuid" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_get_uuid \- UUID of a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_id_desc.2 b/doc/man/nvme_ns_id_desc.2
index 2116046..094618c 100644
--- a/doc/man/nvme_ns_id_desc.2
+++ b/doc/man/nvme_ns_id_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_ns_id_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_ns_id_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_ns_id_desc \-
+struct nvme_ns_id_desc \- Namespace identifier type descriptor
.SH SYNOPSIS
struct nvme_ns_id_desc {
.br
diff --git a/doc/man/nvme_ns_id_desc_nidt.2 b/doc/man/nvme_ns_id_desc_nidt.2
index eb399b1..9c64b89 100644
--- a/doc/man/nvme_ns_id_desc_nidt.2
+++ b/doc/man/nvme_ns_id_desc_nidt.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_ns_id_desc_nidt" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ns_id_desc_nidt" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_ns_id_desc_nidt \- Known namespace identifier types
.SH SYNOPSIS
@@ -30,4 +30,4 @@ contains a copy of the NGUID field in struct nvme_id_ns.nguid.
The NID field contains a 128-bit Universally Unique
Identifier (UUID) as specified in RFC 4122.
.IP "NVME_NIDT_CSI" 12
-The NID field contains the command set indentifier.
+The NID field contains the command set identifier.
diff --git a/doc/man/nvme_ns_identify.2 b/doc/man/nvme_ns_identify.2
index 0aa1e53..487e56a 100644
--- a/doc/man/nvme_ns_identify.2
+++ b/doc/man/nvme_ns_identify.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_identify" 9 "nvme_ns_identify" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_identify" 9 "nvme_ns_identify" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_identify \- Issue an 'identify namespace' command
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_identify_descs.2 b/doc/man/nvme_ns_identify_descs.2
index e7a8e68..9a1e2c6 100644
--- a/doc/man/nvme_ns_identify_descs.2
+++ b/doc/man/nvme_ns_identify_descs.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_identify_descs" 9 "nvme_ns_identify_descs" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_identify_descs" 9 "nvme_ns_identify_descs" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_identify_descs \- Issue an 'identify descriptors' command
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_list.2 b/doc/man/nvme_ns_list.2
index 92943a0..f8c535b 100644
--- a/doc/man/nvme_ns_list.2
+++ b/doc/man/nvme_ns_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_ns_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_ns_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_ns_list \-
+struct nvme_ns_list \- Namespace List
.SH SYNOPSIS
struct nvme_ns_list {
.br
diff --git a/doc/man/nvme_ns_metadata_type.2 b/doc/man/nvme_ns_metadata_type.2
index 7de5c2d..50a19f0 100644
--- a/doc/man/nvme_ns_metadata_type.2
+++ b/doc/man/nvme_ns_metadata_type.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_ns_metadata_type" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ns_metadata_type" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_ns_metadata_type \- Namespace Metadata Element Types
.SH SYNOPSIS
@@ -21,7 +21,7 @@ enum nvme_ns_metadata_type {
};
.SH Constants
.IP "NVME_NS_METADATA_OS_NS_NAME" 12
-Name of the namespace in the the
+Name of the namespace in the
operating system
.IP "NVME_NS_METADATA_PRE_BOOT_NS_NAME" 12
Name of the namespace in the pre-boot
diff --git a/doc/man/nvme_ns_mgmt.2 b/doc/man/nvme_ns_mgmt.2
index 8916910..4bafe02 100644
--- a/doc/man/nvme_ns_mgmt.2
+++ b/doc/man/nvme_ns_mgmt.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_mgmt" 9 "nvme_ns_mgmt" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_mgmt" 9 "nvme_ns_mgmt" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_mgmt \- Issue a Namespace management command
.SH SYNOPSIS
@@ -7,3 +7,6 @@ nvme_ns_mgmt \- Issue a Namespace management command
.SH ARGUMENTS
.IP "args" 12
\fIstruct nvme_ns_mgmt_args\fP Argument structure
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_ns_mgmt_args.2 b/doc/man/nvme_ns_mgmt_args.2
deleted file mode 100644
index 9231c78..0000000
--- a/doc/man/nvme_ns_mgmt_args.2
+++ /dev/null
@@ -1,43 +0,0 @@
-.TH "libnvme" 9 "struct nvme_ns_mgmt_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_ns_mgmt_args \- Arguments for NVMe Namespace Management command
-.SH SYNOPSIS
-struct nvme_ns_mgmt_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " struct nvme_id_ns *ns;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_ns_mgmt_sel sel;"
-.br
-.BI " __u8 csi;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-NVMe command result
-.IP "ns" 12
-Namespace identication descriptors
-.IP "args_size" 12
-Size of \fIstruct nvme_ns_mgmt_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace identifier
-.IP "sel" 12
-Type of management operation to perform
-.IP "csi" 12
-Command Set Identifier
diff --git a/doc/man/nvme_ns_mgmt_create.2 b/doc/man/nvme_ns_mgmt_create.2
index 479d146..55ec80a 100644
--- a/doc/man/nvme_ns_mgmt_create.2
+++ b/doc/man/nvme_ns_mgmt_create.2
@@ -1,6 +1,6 @@
-.TH "nvme_ns_mgmt_create" 9 "nvme_ns_mgmt_create" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_mgmt_create" 9 "nvme_ns_mgmt_create" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_ns_mgmt_create \-
+nvme_ns_mgmt_create \- Create a non attached namespace
.SH SYNOPSIS
.B "int" nvme_ns_mgmt_create
.BI "(int fd " ","
@@ -16,7 +16,7 @@ Namespace identification that defines ns creation parameters
.IP "nsid" 12
On success, set to the namespace id that was created
.IP "timeout" 12
-Overide the default timeout to this value in milliseconds;
+Override the default timeout to this value in milliseconds;
set to 0 to use the system default.
.IP "csi" 12
Command Set Identifier
diff --git a/doc/man/nvme_ns_mgmt_delete.2 b/doc/man/nvme_ns_mgmt_delete.2
index dcbf3f0..a05b189 100644
--- a/doc/man/nvme_ns_mgmt_delete.2
+++ b/doc/man/nvme_ns_mgmt_delete.2
@@ -1,6 +1,6 @@
-.TH "nvme_ns_mgmt_delete" 9 "nvme_ns_mgmt_delete" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_mgmt_delete" 9 "nvme_ns_mgmt_delete" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_ns_mgmt_delete \-
+nvme_ns_mgmt_delete \- Delete a non attached namespace
.SH SYNOPSIS
.B "int" nvme_ns_mgmt_delete
.BI "(int fd " ","
diff --git a/doc/man/nvme_ns_mgmt_sel.2 b/doc/man/nvme_ns_mgmt_sel.2
index 8683f3b..6dc24bc 100644
--- a/doc/man/nvme_ns_mgmt_sel.2
+++ b/doc/man/nvme_ns_mgmt_sel.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ns_mgmt_sel" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ns_mgmt_sel" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ns_mgmt_sel \-
+enum nvme_ns_mgmt_sel \- Namespace Management - Select
.SH SYNOPSIS
enum nvme_ns_mgmt_sel {
.br
diff --git a/doc/man/nvme_ns_read.2 b/doc/man/nvme_ns_read.2
index b6d8441..455c691 100644
--- a/doc/man/nvme_ns_read.2
+++ b/doc/man/nvme_ns_read.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_read" 9 "nvme_ns_read" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_read" 9 "nvme_ns_read" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_read \- Read from a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_rescan.2 b/doc/man/nvme_ns_rescan.2
index c0334d3..7e7b4e5 100644
--- a/doc/man/nvme_ns_rescan.2
+++ b/doc/man/nvme_ns_rescan.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_rescan" 9 "nvme_ns_rescan" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_rescan" 9 "nvme_ns_rescan" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_rescan \- Initiate a controller rescan
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_verify.2 b/doc/man/nvme_ns_verify.2
index 1f669ad..93c5115 100644
--- a/doc/man/nvme_ns_verify.2
+++ b/doc/man/nvme_ns_verify.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_verify" 9 "nvme_ns_verify" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_verify" 9 "nvme_ns_verify" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_verify \- Verify data on a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_write.2 b/doc/man/nvme_ns_write.2
index 132ea2c..fbf2fff 100644
--- a/doc/man/nvme_ns_write.2
+++ b/doc/man/nvme_ns_write.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_write" 9 "nvme_ns_write" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_write" 9 "nvme_ns_write" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_write \- Write to a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_write_protect_cfg.2 b/doc/man/nvme_ns_write_protect_cfg.2
index 5a8dc11..c2c9dd1 100644
--- a/doc/man/nvme_ns_write_protect_cfg.2
+++ b/doc/man/nvme_ns_write_protect_cfg.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_ns_write_protect_cfg" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_ns_write_protect_cfg" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_ns_write_protect_cfg \-
+enum nvme_ns_write_protect_cfg \- Write Protection - Write Protection State
.SH SYNOPSIS
enum nvme_ns_write_protect_cfg {
.br
diff --git a/doc/man/nvme_ns_write_uncorrectable.2 b/doc/man/nvme_ns_write_uncorrectable.2
index b6de816..b0ee949 100644
--- a/doc/man/nvme_ns_write_uncorrectable.2
+++ b/doc/man/nvme_ns_write_uncorrectable.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_write_uncorrectable" 9 "nvme_ns_write_uncorrectable" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_write_uncorrectable" 9 "nvme_ns_write_uncorrectable" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_write_uncorrectable \- Issus a 'write uncorrectable' command
.SH SYNOPSIS
diff --git a/doc/man/nvme_ns_write_zeros.2 b/doc/man/nvme_ns_write_zeros.2
index ee2c2d1..2be6798 100644
--- a/doc/man/nvme_ns_write_zeros.2
+++ b/doc/man/nvme_ns_write_zeros.2
@@ -1,4 +1,4 @@
-.TH "nvme_ns_write_zeros" 9 "nvme_ns_write_zeros" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_ns_write_zeros" 9 "nvme_ns_write_zeros" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_ns_write_zeros \- Write zeros to a namespace
.SH SYNOPSIS
diff --git a/doc/man/nvme_nss_hw_err_event.2 b/doc/man/nvme_nss_hw_err_event.2
index a64966e..78d3cba 100644
--- a/doc/man/nvme_nss_hw_err_event.2
+++ b/doc/man/nvme_nss_hw_err_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_nss_hw_err_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_nss_hw_err_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_nss_hw_err_event \-
+struct nvme_nss_hw_err_event \- NVM Subsystem Hardware Error Event
.SH SYNOPSIS
struct nvme_nss_hw_err_event {
.br
diff --git a/doc/man/nvme_nvm_id_ns.2 b/doc/man/nvme_nvm_id_ns.2
index 13dae13..3809cb7 100644
--- a/doc/man/nvme_nvm_id_ns.2
+++ b/doc/man/nvme_nvm_id_ns.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_nvm_id_ns" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_nvm_id_ns" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_nvm_id_ns \-
+struct nvme_nvm_id_ns \- NVME Command Set I/O Command Set Specific Identify Namespace Data Structure
.SH SYNOPSIS
struct nvme_nvm_id_ns {
.br
diff --git a/doc/man/nvme_nvm_id_ns_elbaf.2 b/doc/man/nvme_nvm_id_ns_elbaf.2
new file mode 100644
index 0000000..4a48aff
--- /dev/null
+++ b/doc/man/nvme_nvm_id_ns_elbaf.2
@@ -0,0 +1,20 @@
+.TH "libnvme" 9 "enum nvme_nvm_id_ns_elbaf" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_nvm_id_ns_elbaf \- This field indicates the extended LBA format
+.SH SYNOPSIS
+enum nvme_nvm_id_ns_elbaf {
+.br
+.BI " NVME_NVM_ELBAF_STS_MASK"
+,
+.br
+.br
+.BI " NVME_NVM_ELBAF_PIF_MASK"
+
+};
+.SH Constants
+.IP "NVME_NVM_ELBAF_STS_MASK" 12
+Mask to get the storage tag size used to determine
+the variable-sized storage tag/reference tag fields
+.IP "NVME_NVM_ELBAF_PIF_MASK" 12
+Mask to get the protection information format for
+the extended LBA format.
diff --git a/doc/man/nvme_nvm_identify_ctrl.2 b/doc/man/nvme_nvm_identify_ctrl.2
index 313368a..0f36e26 100644
--- a/doc/man/nvme_nvm_identify_ctrl.2
+++ b/doc/man/nvme_nvm_identify_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_nvm_identify_ctrl" 9 "nvme_nvm_identify_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_nvm_identify_ctrl" 9 "nvme_nvm_identify_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_nvm_identify_ctrl \- Identify controller data
.SH SYNOPSIS
diff --git a/doc/man/nvme_nvmeset_pl_status.2 b/doc/man/nvme_nvmeset_pl_status.2
index 3c224b4..7a20f84 100644
--- a/doc/man/nvme_nvmeset_pl_status.2
+++ b/doc/man/nvme_nvmeset_pl_status.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_nvmeset_pl_status" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_nvmeset_pl_status" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_nvmeset_pl_status \-
+enum nvme_nvmeset_pl_status \- Predictable Latency Per NVM Set Log - Status
.SH SYNOPSIS
enum nvme_nvmeset_pl_status {
.br
@@ -17,5 +17,8 @@ enum nvme_nvmeset_pl_status {
};
.SH Constants
.IP "NVME_NVMSET_PL_STATUS_DISABLED" 12
+Not used (Predictable Latency Mode not enabled)
.IP "NVME_NVMSET_PL_STATUS_DTWIN" 12
+Deterministic Window (DTWIN)
.IP "NVME_NVMSET_PL_STATUS_NDWIN" 12
+Non-Deterministic Window (NDWIN)
diff --git a/doc/man/nvme_nvmset_attr.2 b/doc/man/nvme_nvmset_attr.2
index 450378c..fed79bf 100644
--- a/doc/man/nvme_nvmset_attr.2
+++ b/doc/man/nvme_nvmset_attr.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_nvmset_attr" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_nvmset_attr" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_nvmset_attr \- NVM Set Attributes Entry
.SH SYNOPSIS
diff --git a/doc/man/nvme_nvmset_pl_events.2 b/doc/man/nvme_nvmset_pl_events.2
index 36fe819..af53eec 100644
--- a/doc/man/nvme_nvmset_pl_events.2
+++ b/doc/man/nvme_nvmset_pl_events.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_nvmset_pl_events" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_nvmset_pl_events" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_nvmset_pl_events \-
+enum nvme_nvmset_pl_events \- Predictable Latency Per NVM Set Log - Event Type
.SH SYNOPSIS
enum nvme_nvmset_pl_events {
.br
@@ -25,7 +25,16 @@ enum nvme_nvmset_pl_events {
};
.SH Constants
.IP "NVME_NVMSET_PL_EVENT_DTWIN_READ_WARN" 12
+DTWIN Reads Warning
.IP "NVME_NVMSET_PL_EVENT_DTWIN_WRITE_WARN" 12
+DTWIN Writes Warning
.IP "NVME_NVMSET_PL_EVENT_DTWIN_TIME_WARN" 12
+DTWIN Time Warning
.IP "NVME_NVMSET_PL_EVENT_DTWIN_EXCEEDED" 12
+Autonomous transition from DTWIN
+to NDWIN due to typical or
+maximum value exceeded
.IP "NVME_NVMSET_PL_EVENT_DTWIN_EXCURSION" 12
+Autonomous transition from DTWIN
+to NDWIN due to Deterministic
+Excursion
diff --git a/doc/man/nvme_nvmset_predictable_lat_log.2 b/doc/man/nvme_nvmset_predictable_lat_log.2
index 172bdce..6e12c93 100644
--- a/doc/man/nvme_nvmset_predictable_lat_log.2
+++ b/doc/man/nvme_nvmset_predictable_lat_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_nvmset_predictable_lat_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_nvmset_predictable_lat_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_nvmset_predictable_lat_log \-
+struct nvme_nvmset_predictable_lat_log \- Predictable Latency Mode - Deterministic Threshold Configuration Data
.SH SYNOPSIS
struct nvme_nvmset_predictable_lat_log {
.br
diff --git a/doc/man/nvme_open.2 b/doc/man/nvme_open.2
index 5d7e7d0..410b683 100644
--- a/doc/man/nvme_open.2
+++ b/doc/man/nvme_open.2
@@ -1,4 +1,4 @@
-.TH "nvme_open" 9 "nvme_open" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_open" 9 "nvme_open" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_open \- Open an nvme controller or namespace device
.SH SYNOPSIS
diff --git a/doc/man/nvme_passthru_cmd.2 b/doc/man/nvme_passthru_cmd.2
index dbe721a..778b9a3 100644
--- a/doc/man/nvme_passthru_cmd.2
+++ b/doc/man/nvme_passthru_cmd.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_passthru_cmd" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_passthru_cmd" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_passthru_cmd \- nvme passthrough command structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_path_get_ana_state.2 b/doc/man/nvme_path_get_ana_state.2
index aea9250..07e3423 100644
--- a/doc/man/nvme_path_get_ana_state.2
+++ b/doc/man/nvme_path_get_ana_state.2
@@ -1,4 +1,4 @@
-.TH "nvme_path_get_ana_state" 9 "nvme_path_get_ana_state" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_path_get_ana_state" 9 "nvme_path_get_ana_state" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_path_get_ana_state \- ANA state of an nvme_path_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_path_get_ctrl.2 b/doc/man/nvme_path_get_ctrl.2
index eb5a046..c76b12f 100644
--- a/doc/man/nvme_path_get_ctrl.2
+++ b/doc/man/nvme_path_get_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_path_get_ctrl" 9 "nvme_path_get_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_path_get_ctrl" 9 "nvme_path_get_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_path_get_ctrl \- Parent controller of an nvme_path_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_path_get_name.2 b/doc/man/nvme_path_get_name.2
index 5d78c61..fd56240 100644
--- a/doc/man/nvme_path_get_name.2
+++ b/doc/man/nvme_path_get_name.2
@@ -1,4 +1,4 @@
-.TH "nvme_path_get_name" 9 "nvme_path_get_name" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_path_get_name" 9 "nvme_path_get_name" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_path_get_name \- sysfs name of an &nvme_path_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_path_get_ns.2 b/doc/man/nvme_path_get_ns.2
index 6fb4450..e929690 100644
--- a/doc/man/nvme_path_get_ns.2
+++ b/doc/man/nvme_path_get_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_path_get_ns" 9 "nvme_path_get_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_path_get_ns" 9 "nvme_path_get_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_path_get_ns \- Parent namespace of an nvme_path_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_path_get_sysfs_dir.2 b/doc/man/nvme_path_get_sysfs_dir.2
index f14b537..fb2c444 100644
--- a/doc/man/nvme_path_get_sysfs_dir.2
+++ b/doc/man/nvme_path_get_sysfs_dir.2
@@ -1,4 +1,4 @@
-.TH "nvme_path_get_sysfs_dir" 9 "nvme_path_get_sysfs_dir" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_path_get_sysfs_dir" 9 "nvme_path_get_sysfs_dir" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_path_get_sysfs_dir \- sysfs directory of an nvme_path_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_paths_filter.2 b/doc/man/nvme_paths_filter.2
index d2d2955..e9800e9 100644
--- a/doc/man/nvme_paths_filter.2
+++ b/doc/man/nvme_paths_filter.2
@@ -1,4 +1,4 @@
-.TH "nvme_paths_filter" 9 "nvme_paths_filter" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_paths_filter" 9 "nvme_paths_filter" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_paths_filter \- Filter for paths
.SH SYNOPSIS
diff --git a/doc/man/nvme_persistent_event_entry.2 b/doc/man/nvme_persistent_event_entry.2
index 0e19ab9..b4b2d0b 100644
--- a/doc/man/nvme_persistent_event_entry.2
+++ b/doc/man/nvme_persistent_event_entry.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_persistent_event_entry" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_persistent_event_entry" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_persistent_event_entry \-
+struct nvme_persistent_event_entry \- Persistent Event
.SH SYNOPSIS
struct nvme_persistent_event_entry {
.br
diff --git a/doc/man/nvme_persistent_event_log.2 b/doc/man/nvme_persistent_event_log.2
index 466b333..1fba166 100644
--- a/doc/man/nvme_persistent_event_log.2
+++ b/doc/man/nvme_persistent_event_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_persistent_event_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_persistent_event_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_persistent_event_log \-
+struct nvme_persistent_event_log \- Persistent Event Log
.SH SYNOPSIS
struct nvme_persistent_event_log {
.br
diff --git a/doc/man/nvme_persistent_event_types.2 b/doc/man/nvme_persistent_event_types.2
index 42900f8..36d142c 100644
--- a/doc/man/nvme_persistent_event_types.2
+++ b/doc/man/nvme_persistent_event_types.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_persistent_event_types" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_persistent_event_types" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_persistent_event_types \-
+enum nvme_persistent_event_types \- Persistent event log events
.SH SYNOPSIS
enum nvme_persistent_event_types {
.br
@@ -57,15 +57,28 @@ enum nvme_persistent_event_types {
};
.SH Constants
.IP "NVME_PEL_SMART_HEALTH_EVENT" 12
+SMART / Health Log Snapshot Event
.IP "NVME_PEL_FW_COMMIT_EVENT" 12
+Firmware Commit Event
.IP "NVME_PEL_TIMESTAMP_EVENT" 12
+Timestamp Change Event
.IP "NVME_PEL_POWER_ON_RESET_EVENT" 12
+Power-on or Reset Event
.IP "NVME_PEL_NSS_HW_ERROR_EVENT" 12
+NVM Subsystem Hardware Error Event
.IP "NVME_PEL_CHANGE_NS_EVENT" 12
+Change Namespace Event
.IP "NVME_PEL_FORMAT_START_EVENT" 12
+Format NVM Start Event
.IP "NVME_PEL_FORMAT_COMPLETION_EVENT" 12
+Format NVM Completion Event
.IP "NVME_PEL_SANITIZE_START_EVENT" 12
+Sanitize Start Event
.IP "NVME_PEL_SANITIZE_COMPLETION_EVENT" 12
+Sanitize Completion Event
.IP "NVME_PEL_SET_FEATURE_EVENT" 12
+Set Feature Event
.IP "NVME_PEL_TELEMETRY_CRT" 12
+Telemetry Log Create Event
.IP "NVME_PEL_THERMAL_EXCURSION_EVENT" 12
+Thermal Excursion Event
diff --git a/doc/man/nvme_pevent_log_action.2 b/doc/man/nvme_pevent_log_action.2
index d0e500b..3bf05d1 100644
--- a/doc/man/nvme_pevent_log_action.2
+++ b/doc/man/nvme_pevent_log_action.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_pevent_log_action" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_pevent_log_action" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_pevent_log_action \-
+enum nvme_pevent_log_action \- Persistent Event Log - Action
.SH SYNOPSIS
enum nvme_pevent_log_action {
.br
diff --git a/doc/man/nvme_plm_config.2 b/doc/man/nvme_plm_config.2
index 098aec6..ccb7078 100644
--- a/doc/man/nvme_plm_config.2
+++ b/doc/man/nvme_plm_config.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_plm_config" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_plm_config" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_plm_config \-
+struct nvme_plm_config \- Predictable Latency Mode - Deterministic Threshold Configuration Data Structure
.SH SYNOPSIS
struct nvme_plm_config {
.br
diff --git a/doc/man/nvme_pmr_size.2 b/doc/man/nvme_pmr_size.2
index 07e7906..e9968a5 100644
--- a/doc/man/nvme_pmr_size.2
+++ b/doc/man/nvme_pmr_size.2
@@ -1,4 +1,4 @@
-.TH "nvme_pmr_size" 9 "nvme_pmr_size" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_pmr_size" 9 "nvme_pmr_size" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_pmr_size \- Calculate size of persistent memory region elasticity buffer
.SH SYNOPSIS
@@ -7,5 +7,5 @@ nvme_pmr_size \- Calculate size of persistent memory region elasticity buffer
.SH ARGUMENTS
.IP "pmrebs" 12
Value from controller register NVME_REG_PMREBS
-.SH "DESCRIPTION"
-Returns size of controller persistent memory buffer in bytes
+.SH "RETURN"
+size of controller persistent memory buffer in bytes
diff --git a/doc/man/nvme_pmr_throughput.2 b/doc/man/nvme_pmr_throughput.2
index 5a1d88b..f8076b3 100644
--- a/doc/man/nvme_pmr_throughput.2
+++ b/doc/man/nvme_pmr_throughput.2
@@ -1,4 +1,4 @@
-.TH "nvme_pmr_throughput" 9 "nvme_pmr_throughput" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_pmr_throughput" 9 "nvme_pmr_throughput" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_pmr_throughput \- Calculate throughput of persistent memory buffer
.SH SYNOPSIS
@@ -7,5 +7,5 @@ nvme_pmr_throughput \- Calculate throughput of persistent memory buffer
.SH ARGUMENTS
.IP "pmrswtp" 12
Value from controller register NVME_REG_PMRSWTP
-.SH "DESCRIPTION"
-Returns throughput of controller persistent memory buffer in bytes/second
+.SH "RETURN"
+throughput of controller persistent memory buffer in bytes/second
diff --git a/doc/man/nvme_power_on_reset_info_list.2 b/doc/man/nvme_power_on_reset_info_list.2
index 2e08e42..5705622 100644
--- a/doc/man/nvme_power_on_reset_info_list.2
+++ b/doc/man/nvme_power_on_reset_info_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_power_on_reset_info_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_power_on_reset_info_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_power_on_reset_info_list \-
+struct nvme_power_on_reset_info_list \- Controller Reset Information
.SH SYNOPSIS
struct nvme_power_on_reset_info_list {
.br
diff --git a/doc/man/nvme_primary_ctrl_cap.2 b/doc/man/nvme_primary_ctrl_cap.2
index 05aa41d..7dc8975 100644
--- a/doc/man/nvme_primary_ctrl_cap.2
+++ b/doc/man/nvme_primary_ctrl_cap.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_primary_ctrl_cap" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_primary_ctrl_cap" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_primary_ctrl_cap \-
+struct nvme_primary_ctrl_cap \- Identify - Controller Capabilities Structure
.SH SYNOPSIS
struct nvme_primary_ctrl_cap {
.br
diff --git a/doc/man/nvme_psd_flags.2 b/doc/man/nvme_psd_flags.2
index 655a4db..4254bfa 100644
--- a/doc/man/nvme_psd_flags.2
+++ b/doc/man/nvme_psd_flags.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_psd_flags" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_psd_flags" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_psd_flags \- Possible flag values in nvme power state descriptor
.SH SYNOPSIS
diff --git a/doc/man/nvme_psd_power_scale.2 b/doc/man/nvme_psd_power_scale.2
index 974c60e..286a866 100644
--- a/doc/man/nvme_psd_power_scale.2
+++ b/doc/man/nvme_psd_power_scale.2
@@ -1,4 +1,4 @@
-.TH "nvme_psd_power_scale" 9 "nvme_psd_power_scale" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_psd_power_scale" 9 "nvme_psd_power_scale" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_psd_power_scale \- power scale occupies the upper 3 bits
.SH SYNOPSIS
@@ -7,3 +7,5 @@ nvme_psd_power_scale \- power scale occupies the upper 3 bits
.SH ARGUMENTS
.IP "ps" 12
power scale value
+.SH "RETURN"
+power scale value
diff --git a/doc/man/nvme_psd_ps.2 b/doc/man/nvme_psd_ps.2
index bd5e403..c05612c 100644
--- a/doc/man/nvme_psd_ps.2
+++ b/doc/man/nvme_psd_ps.2
@@ -1,9 +1,13 @@
-.TH "libnvme" 9 "enum nvme_psd_ps" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_psd_ps" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_psd_ps \- Known values for &struct nvme_psd %ips and %aps. Use with nvme_psd_power_scale() to extract the power scale field to match this enum.
.SH SYNOPSIS
enum nvme_psd_ps {
.br
+.BI " NVME_PSD_PS_NOT_REPORTED"
+,
+.br
+.br
.BI " NVME_PSD_PS_100_MICRO_WATT"
,
.br
@@ -12,6 +16,8 @@ enum nvme_psd_ps {
};
.SH Constants
+.IP "NVME_PSD_PS_NOT_REPORTED" 12
+Not reported
.IP "NVME_PSD_PS_100_MICRO_WATT" 12
0.0001 watt scale
.IP "NVME_PSD_PS_10_MILLI_WATT" 12
diff --git a/doc/man/nvme_psd_workload.2 b/doc/man/nvme_psd_workload.2
index 2e2fe26..1628262 100644
--- a/doc/man/nvme_psd_workload.2
+++ b/doc/man/nvme_psd_workload.2
@@ -1,9 +1,13 @@
-.TH "libnvme" 9 "enum nvme_psd_workload" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_psd_workload" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_psd_workload \- Specifies a workload hint in the Power Management Feature (see &struct nvme_psd.apw) to inform the NVM subsystem or indicate the conditions for the active power level.
.SH SYNOPSIS
enum nvme_psd_workload {
.br
+.BI " NVME_PSD_WORKLOAD_NP"
+,
+.br
+.br
.BI " NVME_PSD_WORKLOAD_1"
,
.br
@@ -12,6 +16,8 @@ enum nvme_psd_workload {
};
.SH Constants
+.IP "NVME_PSD_WORKLOAD_NP" 12
+The workload is unknown or not provided.
.IP "NVME_PSD_WORKLOAD_1" 12
Extended Idle Period with a Burst of Random Write
consists of five minutes of idle followed by
diff --git a/doc/man/nvme_read.2 b/doc/man/nvme_read.2
index 7e25fe3..04cef23 100644
--- a/doc/man/nvme_read.2
+++ b/doc/man/nvme_read.2
@@ -1,4 +1,4 @@
-.TH "nvme_read" 9 "nvme_read" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_read" 9 "nvme_read" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_read \- Submit an nvme user read command
.SH SYNOPSIS
diff --git a/doc/man/nvme_read_config.2 b/doc/man/nvme_read_config.2
index 3f5867f..361887d 100644
--- a/doc/man/nvme_read_config.2
+++ b/doc/man/nvme_read_config.2
@@ -1,4 +1,4 @@
-.TH "nvme_read_config" 9 "nvme_read_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_read_config" 9 "nvme_read_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_read_config \- Read NVMe JSON configuration file
.SH SYNOPSIS
diff --git a/doc/man/nvme_refresh_topology.2 b/doc/man/nvme_refresh_topology.2
index 625310c..d8e2e04 100644
--- a/doc/man/nvme_refresh_topology.2
+++ b/doc/man/nvme_refresh_topology.2
@@ -1,4 +1,4 @@
-.TH "nvme_refresh_topology" 9 "nvme_refresh_topology" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_refresh_topology" 9 "nvme_refresh_topology" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_refresh_topology \- Refresh nvme_root_t object contents
.SH SYNOPSIS
diff --git a/doc/man/nvme_register_offsets.2 b/doc/man/nvme_register_offsets.2
index c10bed5..1e8370d 100644
--- a/doc/man/nvme_register_offsets.2
+++ b/doc/man/nvme_register_offsets.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_register_offsets" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_register_offsets" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_register_offsets \- controller registers for all transports. This is the layout of BAR0/1 for PCIe, and properties for fabrics.
.SH SYNOPSIS
@@ -72,6 +72,10 @@ enum nvme_register_offsets {
,
.br
.br
+.BI " NVME_REG_CRTO"
+,
+.br
+.br
.BI " NVME_REG_PMRCAP"
,
.br
@@ -134,6 +138,8 @@ Boot Partition Memory Buffer Location
Controller Memory Buffer Memory Space Control
.IP "NVME_REG_CMBSTS" 12
Controller Memory Buffer Status
+.IP "NVME_REG_CRTO" 12
+Controller Ready Timeouts
.IP "NVME_REG_PMRCAP" 12
Persistent Memory Capabilities
.IP "NVME_REG_PMRCTL" 12
diff --git a/doc/man/nvme_registered_ctrl.2 b/doc/man/nvme_registered_ctrl.2
index b66824e..6cdc059 100644
--- a/doc/man/nvme_registered_ctrl.2
+++ b/doc/man/nvme_registered_ctrl.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_registered_ctrl" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_registered_ctrl" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_registered_ctrl \-
+struct nvme_registered_ctrl \- Registered Controller Data Structure
.SH SYNOPSIS
struct nvme_registered_ctrl {
.br
diff --git a/doc/man/nvme_registered_ctrl_ext.2 b/doc/man/nvme_registered_ctrl_ext.2
index 04e0da2..63c9174 100644
--- a/doc/man/nvme_registered_ctrl_ext.2
+++ b/doc/man/nvme_registered_ctrl_ext.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_registered_ctrl_ext" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_registered_ctrl_ext" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_registered_ctrl_ext \-
+struct nvme_registered_ctrl_ext \- Registered Controller Extended Data Structure
.SH SYNOPSIS
struct nvme_registered_ctrl_ext {
.br
diff --git a/doc/man/nvme_rescan_ctrl.2 b/doc/man/nvme_rescan_ctrl.2
index af1c791..9a8a35c 100644
--- a/doc/man/nvme_rescan_ctrl.2
+++ b/doc/man/nvme_rescan_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_rescan_ctrl" 9 "nvme_rescan_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_rescan_ctrl" 9 "nvme_rescan_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_rescan_ctrl \- Rescan an existing controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_resv_acquire.2 b/doc/man/nvme_resv_acquire.2
index 2a66281..ae09748 100644
--- a/doc/man/nvme_resv_acquire.2
+++ b/doc/man/nvme_resv_acquire.2
@@ -1,4 +1,4 @@
-.TH "nvme_resv_acquire" 9 "nvme_resv_acquire" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_resv_acquire" 9 "nvme_resv_acquire" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_resv_acquire \- Send an nvme reservation acquire
.SH SYNOPSIS
diff --git a/doc/man/nvme_resv_acquire_args.2 b/doc/man/nvme_resv_acquire_args.2
deleted file mode 100644
index bbbda30..0000000
--- a/doc/man/nvme_resv_acquire_args.2
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH "libnvme" 9 "struct nvme_resv_acquire_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_resv_acquire_args \- Arguments for the NVMe Reservation Acquire Comand
-.SH SYNOPSIS
-struct nvme_resv_acquire_args {
-.br
-.BI " __u64 crkey;"
-.br
-.BI " __u64 nrkey;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_resv_rtype rtype;"
-.br
-.BI " enum nvme_resv_racqa racqa;"
-.br
-.BI " bool iekey;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "crkey" 12
-The current reservation key associated with the host
-.IP "nrkey" 12
-The reservation key to be unregistered from the namespace if
-the action is preempt
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_resv_acquire_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace identifier
-.IP "rtype" 12
-The type of reservation to be create, see \fIenum nvme_resv_rtype\fP
-.IP "racqa" 12
-The action that is performed by the command, see \fIenum nvme_resv_racqa\fP
-.IP "iekey" 12
-Set to ignore the existing key
diff --git a/doc/man/nvme_resv_cptpl.2 b/doc/man/nvme_resv_cptpl.2
index e59177a..403981c 100644
--- a/doc/man/nvme_resv_cptpl.2
+++ b/doc/man/nvme_resv_cptpl.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_resv_cptpl" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_resv_cptpl" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_resv_cptpl \-
+enum nvme_resv_cptpl \- Reservation Register - Change Persist Through Power Loss State
.SH SYNOPSIS
enum nvme_resv_cptpl {
.br
diff --git a/doc/man/nvme_resv_notification_log.2 b/doc/man/nvme_resv_notification_log.2
index d1e2df8..8fcd985 100644
--- a/doc/man/nvme_resv_notification_log.2
+++ b/doc/man/nvme_resv_notification_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_resv_notification_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_resv_notification_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_resv_notification_log \-
+struct nvme_resv_notification_log \- Reservation Notification Log
.SH SYNOPSIS
struct nvme_resv_notification_log {
.br
diff --git a/doc/man/nvme_resv_notify_rnlpt.2 b/doc/man/nvme_resv_notify_rnlpt.2
index 26d54c5..039f01c 100644
--- a/doc/man/nvme_resv_notify_rnlpt.2
+++ b/doc/man/nvme_resv_notify_rnlpt.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_resv_notify_rnlpt" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_resv_notify_rnlpt" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_resv_notify_rnlpt \-
+enum nvme_resv_notify_rnlpt \- Reservation Notification Log - Reservation Notification Log Page Type
.SH SYNOPSIS
enum nvme_resv_notify_rnlpt {
.br
@@ -21,6 +21,10 @@ enum nvme_resv_notify_rnlpt {
};
.SH Constants
.IP "NVME_RESV_NOTIFY_RNLPT_EMPTY" 12
+Empty Log Page
.IP "NVME_RESV_NOTIFY_RNLPT_REGISTRATION_PREEMPTED" 12
+Registration Preempted
.IP "NVME_RESV_NOTIFY_RNLPT_RESERVATION_RELEASED" 12
+Reservation Released
.IP "NVME_RESV_NOTIFY_RNLPT_RESERVATION_PREEMPTED" 12
+Reservation Preempted
diff --git a/doc/man/nvme_resv_racqa.2 b/doc/man/nvme_resv_racqa.2
index 724eedf..7e8f839 100644
--- a/doc/man/nvme_resv_racqa.2
+++ b/doc/man/nvme_resv_racqa.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_resv_racqa" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_resv_racqa" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_resv_racqa \-
+enum nvme_resv_racqa \- Reservation Acquire - Reservation Acquire Action
.SH SYNOPSIS
enum nvme_resv_racqa {
.br
diff --git a/doc/man/nvme_resv_register.2 b/doc/man/nvme_resv_register.2
index af51199..ae296bc 100644
--- a/doc/man/nvme_resv_register.2
+++ b/doc/man/nvme_resv_register.2
@@ -1,4 +1,4 @@
-.TH "nvme_resv_register" 9 "nvme_resv_register" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_resv_register" 9 "nvme_resv_register" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_resv_register \- Send an nvme reservation register
.SH SYNOPSIS
diff --git a/doc/man/nvme_resv_register_args.2 b/doc/man/nvme_resv_register_args.2
deleted file mode 100644
index 5654c8d..0000000
--- a/doc/man/nvme_resv_register_args.2
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH "libnvme" 9 "struct nvme_resv_register_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_resv_register_args \- Arguments for the NVMe Reservation Register command
-.SH SYNOPSIS
-struct nvme_resv_register_args {
-.br
-.BI " __u64 crkey;"
-.br
-.BI " __u64 nrkey;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_resv_rrega rrega;"
-.br
-.BI " enum nvme_resv_cptpl cptpl;"
-.br
-.BI " bool iekey;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "crkey" 12
-The current reservation key associated with the host
-.IP "nrkey" 12
-The new reservation key to be register if action is register or
-replace
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_resv_register_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace identifier
-.IP "rrega" 12
-The registration action, see \fIenum nvme_resv_rrega\fP
-.IP "cptpl" 12
-Change persist through power loss, see \fIenum nvme_resv_cptpl\fP
-.IP "iekey" 12
-Set to ignore the existing key
diff --git a/doc/man/nvme_resv_release.2 b/doc/man/nvme_resv_release.2
index d656ddd..22b8f79 100644
--- a/doc/man/nvme_resv_release.2
+++ b/doc/man/nvme_resv_release.2
@@ -1,4 +1,4 @@
-.TH "nvme_resv_release" 9 "nvme_resv_release" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_resv_release" 9 "nvme_resv_release" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_resv_release \- Send an nvme reservation release
.SH SYNOPSIS
diff --git a/doc/man/nvme_resv_release_args.2 b/doc/man/nvme_resv_release_args.2
deleted file mode 100644
index ad4eeda..0000000
--- a/doc/man/nvme_resv_release_args.2
+++ /dev/null
@@ -1,47 +0,0 @@
-.TH "libnvme" 9 "struct nvme_resv_release_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_resv_release_args \- Arguments for the NVMe Reservation Release Command
-.SH SYNOPSIS
-struct nvme_resv_release_args {
-.br
-.BI " __u64 crkey;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_resv_rtype rtype;"
-.br
-.BI " enum nvme_resv_rrela rrela;"
-.br
-.BI " bool iekey;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "crkey" 12
-The current reservation key to release
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_resv_release_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace identifier
-.IP "rtype" 12
-The type of reservation to be create, see \fIenum nvme_resv_rtype\fP
-.IP "rrela" 12
-Reservation releast action, see \fIenum nvme_resv_rrela\fP
-.IP "iekey" 12
-Set to ignore the existing key
diff --git a/doc/man/nvme_resv_report.2 b/doc/man/nvme_resv_report.2
index 0e266d7..b187b78 100644
--- a/doc/man/nvme_resv_report.2
+++ b/doc/man/nvme_resv_report.2
@@ -1,4 +1,4 @@
-.TH "nvme_resv_report" 9 "nvme_resv_report" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_resv_report" 9 "nvme_resv_report" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_resv_report \- Send an nvme reservation report
.SH SYNOPSIS
@@ -9,7 +9,7 @@ nvme_resv_report \- Send an nvme reservation report
struct nvme_resv_report_args argument structure
.SH "DESCRIPTION"
Returns a Reservation Status data structure to memory that describes the
-registration and reservation status of a namespace. See the defintion for
+registration and reservation status of a namespace. See the definition for
the returned structure, \fIstruct nvme_reservation_status\fP, for more details.
.SH "RETURN"
The nvme command status if a response was received (see
diff --git a/doc/man/nvme_resv_report_args.2 b/doc/man/nvme_resv_report_args.2
deleted file mode 100644
index f98fd25..0000000
--- a/doc/man/nvme_resv_report_args.2
+++ /dev/null
@@ -1,44 +0,0 @@
-.TH "libnvme" 9 "struct nvme_resv_report_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_resv_report_args \- Arguments for the NVMe Reservation Report command
-.SH SYNOPSIS
-struct nvme_resv_report_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " struct nvme_resv_status *report;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 len;"
-.br
-.BI " bool eds;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "report" 12
-The user space destination address to store the reservation
-report
-.IP "args_size" 12
-Size of \fIstruct nvme_resv_report_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace identifier
-.IP "len" 12
-Number of bytes to request transfered with this command
-.IP "eds" 12
-Request extended Data Structure
diff --git a/doc/man/nvme_resv_rrega.2 b/doc/man/nvme_resv_rrega.2
index dfce261..fc5702a 100644
--- a/doc/man/nvme_resv_rrega.2
+++ b/doc/man/nvme_resv_rrega.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_resv_rrega" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_resv_rrega" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_resv_rrega \-
+enum nvme_resv_rrega \- Reservation Register - Reservation Register Action
.SH SYNOPSIS
enum nvme_resv_rrega {
.br
diff --git a/doc/man/nvme_resv_rrela.2 b/doc/man/nvme_resv_rrela.2
index b3eb068..c89638c 100644
--- a/doc/man/nvme_resv_rrela.2
+++ b/doc/man/nvme_resv_rrela.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_resv_rrela" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_resv_rrela" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_resv_rrela \-
+enum nvme_resv_rrela \- Reservation Release - Reservation Release Action
.SH SYNOPSIS
enum nvme_resv_rrela {
.br
diff --git a/doc/man/nvme_resv_rtype.2 b/doc/man/nvme_resv_rtype.2
index bdff164..c75d6fb 100644
--- a/doc/man/nvme_resv_rtype.2
+++ b/doc/man/nvme_resv_rtype.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_resv_rtype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_resv_rtype" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_resv_rtype \-
+enum nvme_resv_rtype \- Reservation Type Encoding
.SH SYNOPSIS
enum nvme_resv_rtype {
.br
diff --git a/doc/man/nvme_resv_status.2 b/doc/man/nvme_resv_status.2
index cdb117d..7683fbd 100644
--- a/doc/man/nvme_resv_status.2
+++ b/doc/man/nvme_resv_status.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_resv_status" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_resv_status" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_resv_status \-
+struct nvme_resv_status \- Reservation Status Data Structure
.SH SYNOPSIS
struct nvme_resv_status {
.br
diff --git a/doc/man/nvme_sanitize_compln_event.2 b/doc/man/nvme_sanitize_compln_event.2
index 456e3bc..1ab951e 100644
--- a/doc/man/nvme_sanitize_compln_event.2
+++ b/doc/man/nvme_sanitize_compln_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_sanitize_compln_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_sanitize_compln_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_sanitize_compln_event \-
+struct nvme_sanitize_compln_event \- Sanitize Completion Event Data
.SH SYNOPSIS
struct nvme_sanitize_compln_event {
.br
diff --git a/doc/man/nvme_sanitize_log_page.2 b/doc/man/nvme_sanitize_log_page.2
index 1a915f5..070635c 100644
--- a/doc/man/nvme_sanitize_log_page.2
+++ b/doc/man/nvme_sanitize_log_page.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_sanitize_log_page" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_sanitize_log_page" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_sanitize_log_page \- Sanitize Status (Log Identifier 81h)
.SH SYNOPSIS
diff --git a/doc/man/nvme_sanitize_nvm.2 b/doc/man/nvme_sanitize_nvm.2
index 89dbcf5..ddbac55 100644
--- a/doc/man/nvme_sanitize_nvm.2
+++ b/doc/man/nvme_sanitize_nvm.2
@@ -1,4 +1,4 @@
-.TH "nvme_sanitize_nvm" 9 "nvme_sanitize_nvm" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_sanitize_nvm" 9 "nvme_sanitize_nvm" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_sanitize_nvm \- Start a sanitize operation
.SH SYNOPSIS
diff --git a/doc/man/nvme_sanitize_nvm_args.2 b/doc/man/nvme_sanitize_nvm_args.2
deleted file mode 100644
index 1a414db..0000000
--- a/doc/man/nvme_sanitize_nvm_args.2
+++ /dev/null
@@ -1,51 +0,0 @@
-.TH "libnvme" 9 "struct nvme_sanitize_nvm_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_sanitize_nvm_args \- Arguments for the NVMe Sanitize NVM command
-.SH SYNOPSIS
-struct nvme_sanitize_nvm_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " enum nvme_sanitize_sanact sanact;"
-.br
-.BI " __u32 ovrpat;"
-.br
-.BI " bool ause;"
-.br
-.BI " __u8 owpass;"
-.br
-.BI " bool oipbp;"
-.br
-.BI " bool nodas;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_sanitize_nvm_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "sanact" 12
-Sanitize action, see \fIenum nvme_sanitize_sanact\fP
-.IP "ovrpat" 12
-Overwrite pattern
-.IP "ause" 12
-Set to allow unrestriced sanitize exit
-.IP "owpass" 12
-Overwrite pass count
-.IP "oipbp" 12
-Set to overwrite invert pattern between passes
-.IP "nodas" 12
-Set to not deallocate blocks after sanitizing
diff --git a/doc/man/nvme_sanitize_sanact.2 b/doc/man/nvme_sanitize_sanact.2
index 13d1163..baeb5c1 100644
--- a/doc/man/nvme_sanitize_sanact.2
+++ b/doc/man/nvme_sanitize_sanact.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_sanitize_sanact" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_sanitize_sanact" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_sanitize_sanact \- Sanitize Action
.SH SYNOPSIS
diff --git a/doc/man/nvme_sanitize_sstat.2 b/doc/man/nvme_sanitize_sstat.2
index abe4334..db970e4 100644
--- a/doc/man/nvme_sanitize_sstat.2
+++ b/doc/man/nvme_sanitize_sstat.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_sanitize_sstat" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_sanitize_sstat" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_sanitize_sstat \- Sanitize Status (SSTAT)
.SH SYNOPSIS
diff --git a/doc/man/nvme_sanitize_start_event.2 b/doc/man/nvme_sanitize_start_event.2
index 36ea6ea..ba50f4a 100644
--- a/doc/man/nvme_sanitize_start_event.2
+++ b/doc/man/nvme_sanitize_start_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_sanitize_start_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_sanitize_start_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_sanitize_start_event \-
+struct nvme_sanitize_start_event \- Sanitize Start Event Data
.SH SYNOPSIS
struct nvme_sanitize_start_event {
.br
diff --git a/doc/man/nvme_scan.2 b/doc/man/nvme_scan.2
index 962e786..40c3cf4 100644
--- a/doc/man/nvme_scan.2
+++ b/doc/man/nvme_scan.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan" 9 "nvme_scan" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan" 9 "nvme_scan" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan \- Scan NVMe topology
.SH SYNOPSIS
diff --git a/doc/man/nvme_scan_ctrl.2 b/doc/man/nvme_scan_ctrl.2
index bef86d0..6da34ea 100644
--- a/doc/man/nvme_scan_ctrl.2
+++ b/doc/man/nvme_scan_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan_ctrl" 9 "nvme_scan_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan_ctrl" 9 "nvme_scan_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan_ctrl \- Scan on a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_scan_ctrl_namespace_paths.2 b/doc/man/nvme_scan_ctrl_namespace_paths.2
index db2549e..697c8f2 100644
--- a/doc/man/nvme_scan_ctrl_namespace_paths.2
+++ b/doc/man/nvme_scan_ctrl_namespace_paths.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan_ctrl_namespace_paths" 9 "nvme_scan_ctrl_namespace_paths" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan_ctrl_namespace_paths" 9 "nvme_scan_ctrl_namespace_paths" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan_ctrl_namespace_paths \- Scan for namespace paths in a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_scan_ctrl_namespaces.2 b/doc/man/nvme_scan_ctrl_namespaces.2
index aba1eca..ce6e66c 100644
--- a/doc/man/nvme_scan_ctrl_namespaces.2
+++ b/doc/man/nvme_scan_ctrl_namespaces.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan_ctrl_namespaces" 9 "nvme_scan_ctrl_namespaces" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan_ctrl_namespaces" 9 "nvme_scan_ctrl_namespaces" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan_ctrl_namespaces \- Scan for namespaces in a controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_scan_ctrls.2 b/doc/man/nvme_scan_ctrls.2
index 9c04e6c..b618028 100644
--- a/doc/man/nvme_scan_ctrls.2
+++ b/doc/man/nvme_scan_ctrls.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan_ctrls" 9 "nvme_scan_ctrls" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan_ctrls" 9 "nvme_scan_ctrls" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan_ctrls \- Scan for controllers
.SH SYNOPSIS
diff --git a/doc/man/nvme_scan_namespace.2 b/doc/man/nvme_scan_namespace.2
index a4c8f83..7321136 100644
--- a/doc/man/nvme_scan_namespace.2
+++ b/doc/man/nvme_scan_namespace.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan_namespace" 9 "nvme_scan_namespace" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan_namespace" 9 "nvme_scan_namespace" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan_namespace \- scan namespace based on sysfs name
.SH SYNOPSIS
diff --git a/doc/man/nvme_scan_subsystem_namespaces.2 b/doc/man/nvme_scan_subsystem_namespaces.2
index 2915fa1..16222cd 100644
--- a/doc/man/nvme_scan_subsystem_namespaces.2
+++ b/doc/man/nvme_scan_subsystem_namespaces.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan_subsystem_namespaces" 9 "nvme_scan_subsystem_namespaces" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan_subsystem_namespaces" 9 "nvme_scan_subsystem_namespaces" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan_subsystem_namespaces \- Scan for namespaces in a subsystem
.SH SYNOPSIS
diff --git a/doc/man/nvme_scan_subsystems.2 b/doc/man/nvme_scan_subsystems.2
index 48e0eb8..8749e92 100644
--- a/doc/man/nvme_scan_subsystems.2
+++ b/doc/man/nvme_scan_subsystems.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan_subsystems" 9 "nvme_scan_subsystems" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan_subsystems" 9 "nvme_scan_subsystems" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan_subsystems \- Scan for subsystems
.SH SYNOPSIS
diff --git a/doc/man/nvme_scan_topology.2 b/doc/man/nvme_scan_topology.2
index 602d8ae..8f9f26f 100644
--- a/doc/man/nvme_scan_topology.2
+++ b/doc/man/nvme_scan_topology.2
@@ -1,4 +1,4 @@
-.TH "nvme_scan_topology" 9 "nvme_scan_topology" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_scan_topology" 9 "nvme_scan_topology" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_scan_topology \- Scan NVMe topology and apply filter
.SH SYNOPSIS
diff --git a/doc/man/nvme_secondary_ctrl.2 b/doc/man/nvme_secondary_ctrl.2
index b6eb2bd..27205b4 100644
--- a/doc/man/nvme_secondary_ctrl.2
+++ b/doc/man/nvme_secondary_ctrl.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_secondary_ctrl" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_secondary_ctrl" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_secondary_ctrl \-
+struct nvme_secondary_ctrl \- Secondary Controller Entry
.SH SYNOPSIS
struct nvme_secondary_ctrl {
.br
diff --git a/doc/man/nvme_secondary_ctrl_list.2 b/doc/man/nvme_secondary_ctrl_list.2
index 69afc87..6f4d346 100644
--- a/doc/man/nvme_secondary_ctrl_list.2
+++ b/doc/man/nvme_secondary_ctrl_list.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_secondary_ctrl_list" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_secondary_ctrl_list" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_secondary_ctrl_list \-
+struct nvme_secondary_ctrl_list \- Secondary Controller List
.SH SYNOPSIS
struct nvme_secondary_ctrl_list {
.br
diff --git a/doc/man/nvme_security_receive.2 b/doc/man/nvme_security_receive.2
index 008e6d0..a33e655 100644
--- a/doc/man/nvme_security_receive.2
+++ b/doc/man/nvme_security_receive.2
@@ -1,12 +1,12 @@
-.TH "nvme_security_receive" 9 "nvme_security_receive" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_security_receive" 9 "nvme_security_receive" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_security_receive \-
+nvme_security_receive \- Security Receive command
.SH SYNOPSIS
.B "int" nvme_security_receive
.BI "(struct nvme_security_receive_args *args " ");"
.SH ARGUMENTS
.IP "args" 12
-\fIstruct nvme_security_recevice\fP argument structure
+\fIstruct nvme_security_receive\fP argument structure
.SH "RETURN"
The nvme command status if a response was received (see
\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_security_receive_args.2 b/doc/man/nvme_security_receive_args.2
deleted file mode 100644
index 220d3ce..0000000
--- a/doc/man/nvme_security_receive_args.2
+++ /dev/null
@@ -1,59 +0,0 @@
-.TH "libnvme" 9 "struct nvme_security_receive_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_security_receive_args \- Arguments for the NVMe Security Receive command
-.SH SYNOPSIS
-struct nvme_security_receive_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 al;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u8 nssf;"
-.br
-.BI " __u8 spsp0;"
-.br
-.BI " __u8 spsp1;"
-.br
-.BI " __u8 secp;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-Security data payload to send
-.IP "args_size" 12
-Size of \fIstruct nvme_security_receive_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID to issue security command on
-.IP "al" 12
-Protocol specific allocation length
-.IP "data_len" 12
-Data length of the payload in bytes
-.IP "nssf" 12
-NVMe Security Specific field
-.IP "spsp0" 12
-Security Protocol Specific field
-.IP "spsp1" 12
-Security Protocol Specific field
-.IP "secp" 12
-Security Protocol
diff --git a/doc/man/nvme_security_send.2 b/doc/man/nvme_security_send.2
index cadb73f..85eba7d 100644
--- a/doc/man/nvme_security_send.2
+++ b/doc/man/nvme_security_send.2
@@ -1,6 +1,6 @@
-.TH "nvme_security_send" 9 "nvme_security_send" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_security_send" 9 "nvme_security_send" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_security_send \-
+nvme_security_send \- Security Send command
.SH SYNOPSIS
.B "int" nvme_security_send
.BI "(struct nvme_security_send_args *args " ");"
diff --git a/doc/man/nvme_security_send_args.2 b/doc/man/nvme_security_send_args.2
deleted file mode 100644
index ac9272b..0000000
--- a/doc/man/nvme_security_send_args.2
+++ /dev/null
@@ -1,59 +0,0 @@
-.TH "libnvme" 9 "struct nvme_security_send_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_security_send_args \- Arguments for the NVMe Security Send command
-.SH SYNOPSIS
-struct nvme_security_send_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 tl;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u8 nssf;"
-.br
-.BI " __u8 spsp0;"
-.br
-.BI " __u8 spsp1;"
-.br
-.BI " __u8 secp;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-Security data payload to send
-.IP "args_size" 12
-Size of \fIstruct nvme_security_send_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID to issue security command on
-.IP "tl" 12
-Protocol specific transfer length
-.IP "data_len" 12
-Data length of the payload in bytes
-.IP "nssf" 12
-NVMe Security Specific field
-.IP "spsp0" 12
-Security Protocol Specific field
-.IP "spsp1" 12
-Security Protocol Specific field
-.IP "secp" 12
-Security Protocol
diff --git a/doc/man/nvme_self_test_log.2 b/doc/man/nvme_self_test_log.2
index f46cd21..3f471b1 100644
--- a/doc/man/nvme_self_test_log.2
+++ b/doc/man/nvme_self_test_log.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_self_test_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_self_test_log" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_self_test_log \- Device Self-test (Log Identifier 06h)
.SH SYNOPSIS
diff --git a/doc/man/nvme_set_feature_event.2 b/doc/man/nvme_set_feature_event.2
index 00050af..e81f287 100644
--- a/doc/man/nvme_set_feature_event.2
+++ b/doc/man/nvme_set_feature_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_set_feature_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_set_feature_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_set_feature_event \-
+struct nvme_set_feature_event \- Set Feature Event Data
.SH SYNOPSIS
struct nvme_set_feature_event {
.br
diff --git a/doc/man/nvme_set_features.2 b/doc/man/nvme_set_features.2
index 9a41c06..fa7be81 100644
--- a/doc/man/nvme_set_features.2
+++ b/doc/man/nvme_set_features.2
@@ -1,4 +1,4 @@
-.TH "nvme_set_features" 9 "nvme_set_features" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features" 9 "nvme_set_features" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_set_features \- Set a feature attribute
.SH SYNOPSIS
diff --git a/doc/man/nvme_set_features_arbitration.2 b/doc/man/nvme_set_features_arbitration.2
index 141d152..3b3040b 100644
--- a/doc/man/nvme_set_features_arbitration.2
+++ b/doc/man/nvme_set_features_arbitration.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_arbitration" 9 "nvme_set_features_arbitration" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_arbitration" 9 "nvme_set_features_arbitration" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_arbitration \-
+nvme_set_features_arbitration \- Set arbitration features
.SH SYNOPSIS
.B "int" nvme_set_features_arbitration
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_args.2 b/doc/man/nvme_set_features_args.2
deleted file mode 100644
index 9c15083..0000000
--- a/doc/man/nvme_set_features_args.2
+++ /dev/null
@@ -1,65 +0,0 @@
-.TH "libnvme" 9 "struct nvme_set_features_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_set_features_args \- Arguments for the NVMe Admin Set Feature command
-.SH SYNOPSIS
-struct nvme_set_features_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 cdw11;"
-.br
-.BI " __u32 cdw12;"
-.br
-.BI " __u32 cdw13;"
-.br
-.BI " __u32 cdw15;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " bool save;"
-.br
-.BI " __u8 uuidx;"
-.br
-.BI " __u8 fid;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-User address of feature data, if applicable
-.IP "args_size" 12
-Size of \fIstruct nvme_set_features_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID, if applicable
-.IP "cdw11" 12
-Value to set the feature to
-.IP "cdw12" 12
-Feature specific command dword12 field
-.IP "cdw15" 12
-Feature specific command dword15 field
-.IP "data_len" 12
-Length of feature data, if applicable, in bytes
-.IP "save" 12
-Save value across power states
-.IP "uuidx" 12
-UUID Index for differentiating vendor specific encoding
-.IP "fid" 12
-Feature identifier
diff --git a/doc/man/nvme_set_features_async_event.2 b/doc/man/nvme_set_features_async_event.2
index e8084db..74a1b57 100644
--- a/doc/man/nvme_set_features_async_event.2
+++ b/doc/man/nvme_set_features_async_event.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_async_event" 9 "nvme_set_features_async_event" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_async_event" 9 "nvme_set_features_async_event" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_async_event \-
+nvme_set_features_async_event \- Set asynchronous event feature
.SH SYNOPSIS
.B "int" nvme_set_features_async_event
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_auto_pst.2 b/doc/man/nvme_set_features_auto_pst.2
index 21597e2..fe49e0e 100644
--- a/doc/man/nvme_set_features_auto_pst.2
+++ b/doc/man/nvme_set_features_auto_pst.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_auto_pst" 9 "nvme_set_features_auto_pst" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_auto_pst" 9 "nvme_set_features_auto_pst" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_auto_pst \-
+nvme_set_features_auto_pst \- Set autonomous power state feature
.SH SYNOPSIS
.B "int" nvme_set_features_auto_pst
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_data.2 b/doc/man/nvme_set_features_data.2
index 43e81bf..b93d06a 100644
--- a/doc/man/nvme_set_features_data.2
+++ b/doc/man/nvme_set_features_data.2
@@ -1,4 +1,4 @@
-.TH "nvme_set_features_data" 9 "nvme_set_features_data" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_data" 9 "nvme_set_features_data" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_set_features_data \- Helper function for @nvme_set_features()
.SH SYNOPSIS
@@ -28,3 +28,6 @@ Length of feature data, if applicable, in bytes
User address of feature data, if applicable
.IP "result" 12
The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_endurance_evt_cfg.2 b/doc/man/nvme_set_features_endurance_evt_cfg.2
index c8e796a..f02853b 100644
--- a/doc/man/nvme_set_features_endurance_evt_cfg.2
+++ b/doc/man/nvme_set_features_endurance_evt_cfg.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_endurance_evt_cfg" 9 "nvme_set_features_endurance_evt_cfg" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_endurance_evt_cfg" 9 "nvme_set_features_endurance_evt_cfg" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_endurance_evt_cfg \-
+nvme_set_features_endurance_evt_cfg \- Set endurance event config feature
.SH SYNOPSIS
.B "int" nvme_set_features_endurance_evt_cfg
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_err_recovery.2 b/doc/man/nvme_set_features_err_recovery.2
index 69de02e..90f3e60 100644
--- a/doc/man/nvme_set_features_err_recovery.2
+++ b/doc/man/nvme_set_features_err_recovery.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_err_recovery" 9 "nvme_set_features_err_recovery" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_err_recovery" 9 "nvme_set_features_err_recovery" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_err_recovery \-
+nvme_set_features_err_recovery \- Set error recovery feature
.SH SYNOPSIS
.B "int" nvme_set_features_err_recovery
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_hctm.2 b/doc/man/nvme_set_features_hctm.2
index 6b47711..5c7e921 100644
--- a/doc/man/nvme_set_features_hctm.2
+++ b/doc/man/nvme_set_features_hctm.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_hctm" 9 "nvme_set_features_hctm" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_hctm" 9 "nvme_set_features_hctm" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_hctm \-
+nvme_set_features_hctm \- Set thermal management feature
.SH SYNOPSIS
.B "int" nvme_set_features_hctm
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_host_behavior.2 b/doc/man/nvme_set_features_host_behavior.2
index 271dbb2..6ce30b1 100644
--- a/doc/man/nvme_set_features_host_behavior.2
+++ b/doc/man/nvme_set_features_host_behavior.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_host_behavior" 9 "nvme_set_features_host_behavior" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_host_behavior" 9 "nvme_set_features_host_behavior" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_host_behavior \-
+nvme_set_features_host_behavior \- Set host behavior feature
.SH SYNOPSIS
.B "int" nvme_set_features_host_behavior
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_host_id.2 b/doc/man/nvme_set_features_host_id.2
index 09de5d5..26da6c4 100644
--- a/doc/man/nvme_set_features_host_id.2
+++ b/doc/man/nvme_set_features_host_id.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_host_id" 9 "nvme_set_features_host_id" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_host_id" 9 "nvme_set_features_host_id" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_host_id \-
+nvme_set_features_host_id \- Set enable extended host identifers feature
.SH SYNOPSIS
.B "int" nvme_set_features_host_id
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_irq_coalesce.2 b/doc/man/nvme_set_features_irq_coalesce.2
index 58d2e3f..ab16b73 100644
--- a/doc/man/nvme_set_features_irq_coalesce.2
+++ b/doc/man/nvme_set_features_irq_coalesce.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_irq_coalesce" 9 "nvme_set_features_irq_coalesce" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_irq_coalesce" 9 "nvme_set_features_irq_coalesce" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_irq_coalesce \-
+nvme_set_features_irq_coalesce \- Set IRQ coalesce feature
.SH SYNOPSIS
.B "int" nvme_set_features_irq_coalesce
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_irq_config.2 b/doc/man/nvme_set_features_irq_config.2
index ffce575..0b28efa 100644
--- a/doc/man/nvme_set_features_irq_config.2
+++ b/doc/man/nvme_set_features_irq_config.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_irq_config" 9 "nvme_set_features_irq_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_irq_config" 9 "nvme_set_features_irq_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_irq_config \-
+nvme_set_features_irq_config \- Set IRQ config feature
.SH SYNOPSIS
.B "int" nvme_set_features_irq_config
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_lba_range.2 b/doc/man/nvme_set_features_lba_range.2
index 94ca62d..85636da 100644
--- a/doc/man/nvme_set_features_lba_range.2
+++ b/doc/man/nvme_set_features_lba_range.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_lba_range" 9 "nvme_set_features_lba_range" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_lba_range" 9 "nvme_set_features_lba_range" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_lba_range \-
+nvme_set_features_lba_range \- Set LBA range feature
.SH SYNOPSIS
.B "int" nvme_set_features_lba_range
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_lba_sts_interval.2 b/doc/man/nvme_set_features_lba_sts_interval.2
index 1507a76..61fe46f 100644
--- a/doc/man/nvme_set_features_lba_sts_interval.2
+++ b/doc/man/nvme_set_features_lba_sts_interval.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_lba_sts_interval" 9 "nvme_set_features_lba_sts_interval" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_lba_sts_interval" 9 "nvme_set_features_lba_sts_interval" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_lba_sts_interval \-
+nvme_set_features_lba_sts_interval \- Set LBA status information feature
.SH SYNOPSIS
.B "int" nvme_set_features_lba_sts_interval
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_nopsc.2 b/doc/man/nvme_set_features_nopsc.2
index c3ed464..07f7062 100644
--- a/doc/man/nvme_set_features_nopsc.2
+++ b/doc/man/nvme_set_features_nopsc.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_nopsc" 9 "nvme_set_features_nopsc" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_nopsc" 9 "nvme_set_features_nopsc" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_nopsc \-
+nvme_set_features_nopsc \- Set non-operational power state feature
.SH SYNOPSIS
.B "int" nvme_set_features_nopsc
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_plm_config.2 b/doc/man/nvme_set_features_plm_config.2
index 3443b6f..bcb2a2d 100644
--- a/doc/man/nvme_set_features_plm_config.2
+++ b/doc/man/nvme_set_features_plm_config.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_plm_config" 9 "nvme_set_features_plm_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_plm_config" 9 "nvme_set_features_plm_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_plm_config \-
+nvme_set_features_plm_config \- Set predictable latency feature
.SH SYNOPSIS
.B "int" nvme_set_features_plm_config
.BI "(int fd " ","
@@ -8,7 +8,7 @@ nvme_set_features_plm_config \-
.BI "__u16 nvmsetid " ","
.BI "bool save " ","
.BI "struct nvme_plm_config *data " ","
-.BI "__u32*result " ");"
+.BI "__u32 *result " ");"
.SH ARGUMENTS
.IP "fd" 12
File descriptor of nvme device
diff --git a/doc/man/nvme_set_features_plm_window.2 b/doc/man/nvme_set_features_plm_window.2
index 66cf86d..67d00fe 100644
--- a/doc/man/nvme_set_features_plm_window.2
+++ b/doc/man/nvme_set_features_plm_window.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_plm_window" 9 "nvme_set_features_plm_window" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_plm_window" 9 "nvme_set_features_plm_window" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_plm_window \-
+nvme_set_features_plm_window \- Set window select feature
.SH SYNOPSIS
.B "int" nvme_set_features_plm_window
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_power_mgmt.2 b/doc/man/nvme_set_features_power_mgmt.2
index 1cce50e..9937d6e 100644
--- a/doc/man/nvme_set_features_power_mgmt.2
+++ b/doc/man/nvme_set_features_power_mgmt.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_power_mgmt" 9 "nvme_set_features_power_mgmt" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_power_mgmt" 9 "nvme_set_features_power_mgmt" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_power_mgmt \-
+nvme_set_features_power_mgmt \- Set power management feature
.SH SYNOPSIS
.B "int" nvme_set_features_power_mgmt
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_resv_mask.2 b/doc/man/nvme_set_features_resv_mask.2
index 5804011..3772603 100644
--- a/doc/man/nvme_set_features_resv_mask.2
+++ b/doc/man/nvme_set_features_resv_mask.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_resv_mask" 9 "nvme_set_features_resv_mask" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_resv_mask" 9 "nvme_set_features_resv_mask" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_resv_mask \-
+nvme_set_features_resv_mask \- Set reservation notification mask feature
.SH SYNOPSIS
.B "int" nvme_set_features_resv_mask
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_resv_persist.2 b/doc/man/nvme_set_features_resv_persist.2
index e487d6f..fc6e934 100644
--- a/doc/man/nvme_set_features_resv_persist.2
+++ b/doc/man/nvme_set_features_resv_persist.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_resv_persist" 9 "nvme_set_features_resv_persist" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_resv_persist" 9 "nvme_set_features_resv_persist" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_resv_persist \-
+nvme_set_features_resv_persist \- Set persist through power loss feature
.SH SYNOPSIS
.B "int" nvme_set_features_resv_persist
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_rrl.2 b/doc/man/nvme_set_features_rrl.2
index d2b264c..7201d10 100644
--- a/doc/man/nvme_set_features_rrl.2
+++ b/doc/man/nvme_set_features_rrl.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_rrl" 9 "nvme_set_features_rrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_rrl" 9 "nvme_set_features_rrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_rrl \-
+nvme_set_features_rrl \- Set read recovery level feature
.SH SYNOPSIS
.B "int" nvme_set_features_rrl
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_sanitize.2 b/doc/man/nvme_set_features_sanitize.2
index c1fe032..ec70e22 100644
--- a/doc/man/nvme_set_features_sanitize.2
+++ b/doc/man/nvme_set_features_sanitize.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_sanitize" 9 "nvme_set_features_sanitize" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_sanitize" 9 "nvme_set_features_sanitize" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_sanitize \-
+nvme_set_features_sanitize \- Set sanitize feature
.SH SYNOPSIS
.B "int" nvme_set_features_sanitize
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_simple.2 b/doc/man/nvme_set_features_simple.2
index 3a1d8de..736f067 100644
--- a/doc/man/nvme_set_features_simple.2
+++ b/doc/man/nvme_set_features_simple.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_simple" 9 "nvme_set_features_simple" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_simple" 9 "nvme_set_features_simple" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_simple \- Helper functionn for @nvme_set_features()
+nvme_set_features_simple \- Helper function for @nvme_set_features()
.SH SYNOPSIS
.B "int" nvme_set_features_simple
.BI "(int fd " ","
@@ -22,3 +22,6 @@ Value to set the feature to
Save value across power states
.IP "result" 12
The command completion result from CQE dword0
+.SH "RETURN"
+The nvme command status if a response was received (see
+\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_sw_progress.2 b/doc/man/nvme_set_features_sw_progress.2
index eb48ccd..95e3f16 100644
--- a/doc/man/nvme_set_features_sw_progress.2
+++ b/doc/man/nvme_set_features_sw_progress.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_sw_progress" 9 "nvme_set_features_sw_progress" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_sw_progress" 9 "nvme_set_features_sw_progress" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_sw_progress \-
+nvme_set_features_sw_progress \- Set pre-boot software load count feature
.SH SYNOPSIS
.B "int" nvme_set_features_sw_progress
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_temp_thresh.2 b/doc/man/nvme_set_features_temp_thresh.2
index ae653c1..d7b4e88 100644
--- a/doc/man/nvme_set_features_temp_thresh.2
+++ b/doc/man/nvme_set_features_temp_thresh.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_temp_thresh" 9 "nvme_set_features_temp_thresh" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_temp_thresh" 9 "nvme_set_features_temp_thresh" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_temp_thresh \-
+nvme_set_features_temp_thresh \- Set temperature threshold feature
.SH SYNOPSIS
.B "int" nvme_set_features_temp_thresh
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_timestamp.2 b/doc/man/nvme_set_features_timestamp.2
index f286a0d..9c9c511 100644
--- a/doc/man/nvme_set_features_timestamp.2
+++ b/doc/man/nvme_set_features_timestamp.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_timestamp" 9 "nvme_set_features_timestamp" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_timestamp" 9 "nvme_set_features_timestamp" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_timestamp \-
+nvme_set_features_timestamp \- Set timestamp feature
.SH SYNOPSIS
.B "int" nvme_set_features_timestamp
.BI "(int fd " ","
@@ -12,7 +12,7 @@ File descriptor of nvme device
.IP "save" 12
Save value across power states
.IP "timestamp" 12
-The current timestamp value to assign to this this feature
+The current timestamp value to assign to this feature
.SH "RETURN"
The nvme command status if a response was received (see
\fIenum nvme_status_field\fP) or -1 with errno set otherwise.
diff --git a/doc/man/nvme_set_features_volatile_wc.2 b/doc/man/nvme_set_features_volatile_wc.2
index 4ec60c8..15ff174 100644
--- a/doc/man/nvme_set_features_volatile_wc.2
+++ b/doc/man/nvme_set_features_volatile_wc.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_volatile_wc" 9 "nvme_set_features_volatile_wc" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_volatile_wc" 9 "nvme_set_features_volatile_wc" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_volatile_wc \-
+nvme_set_features_volatile_wc \- Set volatile write cache feature
.SH SYNOPSIS
.B "int" nvme_set_features_volatile_wc
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_write_atomic.2 b/doc/man/nvme_set_features_write_atomic.2
index 5037a0b..92823ef 100644
--- a/doc/man/nvme_set_features_write_atomic.2
+++ b/doc/man/nvme_set_features_write_atomic.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_write_atomic" 9 "nvme_set_features_write_atomic" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_write_atomic" 9 "nvme_set_features_write_atomic" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_write_atomic \-
+nvme_set_features_write_atomic \- Set write atomic feature
.SH SYNOPSIS
.B "int" nvme_set_features_write_atomic
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_features_write_protect.2 b/doc/man/nvme_set_features_write_protect.2
index e87dfe1..1808846 100644
--- a/doc/man/nvme_set_features_write_protect.2
+++ b/doc/man/nvme_set_features_write_protect.2
@@ -1,6 +1,6 @@
-.TH "nvme_set_features_write_protect" 9 "nvme_set_features_write_protect" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_features_write_protect" 9 "nvme_set_features_write_protect" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_set_features_write_protect \-
+nvme_set_features_write_protect \- Set write protect feature
.SH SYNOPSIS
.B "int" nvme_set_features_write_protect
.BI "(int fd " ","
diff --git a/doc/man/nvme_set_property.2 b/doc/man/nvme_set_property.2
index 6d484a1..10056d5 100644
--- a/doc/man/nvme_set_property.2
+++ b/doc/man/nvme_set_property.2
@@ -1,4 +1,4 @@
-.TH "nvme_set_property" 9 "nvme_set_property" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_set_property" 9 "nvme_set_property" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_set_property \- Set controller property
.SH SYNOPSIS
diff --git a/doc/man/nvme_set_property_args.2 b/doc/man/nvme_set_property_args.2
deleted file mode 100644
index 3d40857..0000000
--- a/doc/man/nvme_set_property_args.2
+++ /dev/null
@@ -1,35 +0,0 @@
-.TH "libnvme" 9 "struct nvme_set_property_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_set_property_args \- Arguments for NVMe Set Property command
-.SH SYNOPSIS
-struct nvme_set_property_args {
-.br
-.BI " __u64 value;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " int offset;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "value" 12
-The value to set the property
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_set_property_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "offset" 12
-Property offset from the base to set
diff --git a/doc/man/nvme_smart_crit.2 b/doc/man/nvme_smart_crit.2
index 9a23b81..a7a5dd2 100644
--- a/doc/man/nvme_smart_crit.2
+++ b/doc/man/nvme_smart_crit.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_smart_crit" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_smart_crit" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_smart_crit \- Critical Warning
.SH SYNOPSIS
diff --git a/doc/man/nvme_smart_egcw.2 b/doc/man/nvme_smart_egcw.2
index 9bb08a9..50574e1 100644
--- a/doc/man/nvme_smart_egcw.2
+++ b/doc/man/nvme_smart_egcw.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_smart_egcw" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_smart_egcw" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_smart_egcw \- Endurance Group Critical Warning Summary
.SH SYNOPSIS
diff --git a/doc/man/nvme_smart_log.2 b/doc/man/nvme_smart_log.2
index beac84c..642a95b 100644
--- a/doc/man/nvme_smart_log.2
+++ b/doc/man/nvme_smart_log.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_smart_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_smart_log" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_smart_log \- SMART / Health Information Log (Log Identifier 02h)
.SH SYNOPSIS
diff --git a/doc/man/nvme_st_code.2 b/doc/man/nvme_st_code.2
index 83b3aaa..5828169 100644
--- a/doc/man/nvme_st_code.2
+++ b/doc/man/nvme_st_code.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_st_code" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_st_code" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_st_code \- Self-test Code value
.SH SYNOPSIS
diff --git a/doc/man/nvme_st_curr_op.2 b/doc/man/nvme_st_curr_op.2
index 1148499..e7c4efe 100644
--- a/doc/man/nvme_st_curr_op.2
+++ b/doc/man/nvme_st_curr_op.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_st_curr_op" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_st_curr_op" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_st_curr_op \- Current Device Self-Test Operation
.SH SYNOPSIS
diff --git a/doc/man/nvme_st_result.2 b/doc/man/nvme_st_result.2
index e8b2b34..a8062ff 100644
--- a/doc/man/nvme_st_result.2
+++ b/doc/man/nvme_st_result.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_st_result" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_st_result" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_st_result \- Self-test Result
.SH SYNOPSIS
diff --git a/doc/man/nvme_st_valid_diag_info.2 b/doc/man/nvme_st_valid_diag_info.2
index 09d123a..40eaaf3 100644
--- a/doc/man/nvme_st_valid_diag_info.2
+++ b/doc/man/nvme_st_valid_diag_info.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_st_valid_diag_info" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_st_valid_diag_info" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_st_valid_diag_info \- Valid Diagnostic Information
.SH SYNOPSIS
diff --git a/doc/man/nvme_status_code.2 b/doc/man/nvme_status_code.2
index 2087a4f..bf04cb5 100644
--- a/doc/man/nvme_status_code.2
+++ b/doc/man/nvme_status_code.2
@@ -1,4 +1,4 @@
-.TH "nvme_status_code" 9 "nvme_status_code" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_status_code" 9 "nvme_status_code" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_status_code \- Returns the NVMe Status Code
.SH SYNOPSIS
@@ -7,5 +7,6 @@ nvme_status_code \- Returns the NVMe Status Code
.SH ARGUMENTS
.IP "status_field" 12
The NVMe Completion Queue Entry's Status Field
-.SH "DESCRIPTION"
See \fIenum nvme_status_field\fP
+.SH "RETURN"
+status code
diff --git a/doc/man/nvme_status_code_type.2 b/doc/man/nvme_status_code_type.2
index 39fb999..7a1684d 100644
--- a/doc/man/nvme_status_code_type.2
+++ b/doc/man/nvme_status_code_type.2
@@ -1,4 +1,4 @@
-.TH "nvme_status_code_type" 9 "nvme_status_code_type" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_status_code_type" 9 "nvme_status_code_type" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_status_code_type \- Returns the NVMe Status Code Type
.SH SYNOPSIS
@@ -7,5 +7,6 @@ nvme_status_code_type \- Returns the NVMe Status Code Type
.SH ARGUMENTS
.IP "status_field" 12
The NVMe Completion Queue Entry's Status Field
-.SH "DESCRIPTION"
See \fIenum nvme_status_field\fP
+.SH "RETURN"
+status code type
diff --git a/doc/man/nvme_status_field.2 b/doc/man/nvme_status_field.2
index d39a561..b5e43ef 100644
--- a/doc/man/nvme_status_field.2
+++ b/doc/man/nvme_status_field.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_status_field" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_status_field" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_status_field \- Defines all parts of the nvme status field: status code, status code type, and additional flags.
.SH SYNOPSIS
@@ -585,11 +585,13 @@ Vendor specific errors
.IP "NVME_SCT_MASK" 12
Mask to get the value of the Status Code Type
.IP "NVME_SCT_SHIFT" 12
--- undescribed --
+Shift value to get the value of the Status
+Code Type
.IP "NVME_SC_MASK" 12
Mask to get the value of the status code.
.IP "NVME_SC_SHIFT" 12
--- undescribed --
+Shift value to get the value of the status
+code.
.IP "NVME_SC_SUCCESS" 12
Successful Completion: The command
completed without error.
@@ -996,7 +998,10 @@ transient condition.
Fabric Zoning is not enabled on the
CDC
.IP "NVME_SC_ZONEGRP_ORIGINATOR_INVLD" 12
--- undescribed --
+The NQN contained in the ZoneGroup
+Originator field does not match the
+Host NQN used by the DDC to connect
+to the CDC.
.IP "NVME_SC_BAD_ATTRIBUTES" 12
Conflicting Dataset Management Attributes
.IP "NVME_SC_INVALID_PI" 12
diff --git a/doc/man/nvme_status_result.2 b/doc/man/nvme_status_result.2
index e1e51ad..3b01c3f 100644
--- a/doc/man/nvme_status_result.2
+++ b/doc/man/nvme_status_result.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_status_result" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_status_result" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_status_result \- Result of the device self-test operation
.SH SYNOPSIS
diff --git a/doc/man/nvme_status_to_errno.2 b/doc/man/nvme_status_to_errno.2
index d5174a7..438c7fd 100644
--- a/doc/man/nvme_status_to_errno.2
+++ b/doc/man/nvme_status_to_errno.2
@@ -1,4 +1,4 @@
-.TH "nvme_status_to_errno" 9 "nvme_status_to_errno" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_status_to_errno" 9 "nvme_status_to_errno" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_status_to_errno \- Converts nvme return status to errno
.SH SYNOPSIS
@@ -7,7 +7,7 @@ nvme_status_to_errno \- Converts nvme return status to errno
.BI "bool fabrics " ");"
.SH ARGUMENTS
.IP "status" 12
-Return status from an nvme passthrough commmand
+Return status from an nvme passthrough command
.IP "fabrics" 12
Set to true if \fIstatus\fP is to a fabrics target.
.SH "RETURN"
diff --git a/doc/man/nvme_status_to_string.2 b/doc/man/nvme_status_to_string.2
index c91938d..a86e3d9 100644
--- a/doc/man/nvme_status_to_string.2
+++ b/doc/man/nvme_status_to_string.2
@@ -1,4 +1,4 @@
-.TH "nvme_status_to_string" 9 "nvme_status_to_string" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_status_to_string" 9 "nvme_status_to_string" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_status_to_string \- Returns string describing nvme return status.
.SH SYNOPSIS
@@ -7,7 +7,7 @@ nvme_status_to_string \- Returns string describing nvme return status.
.BI "bool fabrics " ");"
.SH ARGUMENTS
.IP "status" 12
-Return status from an nvme passthrough commmand
+Return status from an nvme passthrough command
.IP "fabrics" 12
Set to true if \fIstatus\fP is to a fabrics target.
.SH "RETURN"
diff --git a/doc/man/nvme_streams_directive_params.2 b/doc/man/nvme_streams_directive_params.2
index c2dd59a..1f9197d 100644
--- a/doc/man/nvme_streams_directive_params.2
+++ b/doc/man/nvme_streams_directive_params.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_streams_directive_params" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_streams_directive_params" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_streams_directive_params \-
+struct nvme_streams_directive_params \- Streams Directive - Return Parameters Data Structure
.SH SYNOPSIS
struct nvme_streams_directive_params {
.br
diff --git a/doc/man/nvme_streams_directive_status.2 b/doc/man/nvme_streams_directive_status.2
index 5b0a192..a86ba6c 100644
--- a/doc/man/nvme_streams_directive_status.2
+++ b/doc/man/nvme_streams_directive_status.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_streams_directive_status" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_streams_directive_status" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_streams_directive_status \-
+struct nvme_streams_directive_status \- Streams Directive - Get Status Data Structure
.SH SYNOPSIS
struct nvme_streams_directive_status {
.br
diff --git a/doc/man/nvme_submit_admin_passthru.2 b/doc/man/nvme_submit_admin_passthru.2
index 823bbff..c19296e 100644
--- a/doc/man/nvme_submit_admin_passthru.2
+++ b/doc/man/nvme_submit_admin_passthru.2
@@ -1,4 +1,4 @@
-.TH "nvme_submit_admin_passthru" 9 "nvme_submit_admin_passthru" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_submit_admin_passthru" 9 "nvme_submit_admin_passthru" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_submit_admin_passthru \- Submit an nvme passthrough admin command
.SH SYNOPSIS
diff --git a/doc/man/nvme_submit_io_passthru.2 b/doc/man/nvme_submit_io_passthru.2
index 8319a47..e939991 100644
--- a/doc/man/nvme_submit_io_passthru.2
+++ b/doc/man/nvme_submit_io_passthru.2
@@ -1,4 +1,4 @@
-.TH "nvme_submit_io_passthru" 9 "nvme_submit_io_passthru" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_submit_io_passthru" 9 "nvme_submit_io_passthru" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_submit_io_passthru \- Submit an nvme passthrough command
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsys_filter.2 b/doc/man/nvme_subsys_filter.2
index c53a5e5..97abdfa 100644
--- a/doc/man/nvme_subsys_filter.2
+++ b/doc/man/nvme_subsys_filter.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsys_filter" 9 "nvme_subsys_filter" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsys_filter" 9 "nvme_subsys_filter" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsys_filter \- Filter for subsystems
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsys_type.2 b/doc/man/nvme_subsys_type.2
index 8abd195..e753988 100644
--- a/doc/man/nvme_subsys_type.2
+++ b/doc/man/nvme_subsys_type.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_subsys_type" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_subsys_type" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_subsys_type \- Type of the NVM subsystem.
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_first_ctrl.2 b/doc/man/nvme_subsystem_first_ctrl.2
index 0080c21..126b4ce 100644
--- a/doc/man/nvme_subsystem_first_ctrl.2
+++ b/doc/man/nvme_subsystem_first_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_first_ctrl" 9 "nvme_subsystem_first_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_first_ctrl" 9 "nvme_subsystem_first_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_first_ctrl \- First ctrl iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_first_ns.2 b/doc/man/nvme_subsystem_first_ns.2
index 77e6f06..20d02e1 100644
--- a/doc/man/nvme_subsystem_first_ns.2
+++ b/doc/man/nvme_subsystem_first_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_first_ns" 9 "nvme_subsystem_first_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_first_ns" 9 "nvme_subsystem_first_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_first_ns \- Start namespace iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_for_each_ctrl.2 b/doc/man/nvme_subsystem_for_each_ctrl.2
index b2f90f1..8c053b4 100644
--- a/doc/man/nvme_subsystem_for_each_ctrl.2
+++ b/doc/man/nvme_subsystem_for_each_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_for_each_ctrl" 9 "nvme_subsystem_for_each_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_for_each_ctrl" 9 "nvme_subsystem_for_each_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_for_each_ctrl \- Traverse controllers
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_for_each_ctrl_safe.2 b/doc/man/nvme_subsystem_for_each_ctrl_safe.2
index 5c61ad8..5e158b9 100644
--- a/doc/man/nvme_subsystem_for_each_ctrl_safe.2
+++ b/doc/man/nvme_subsystem_for_each_ctrl_safe.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_for_each_ctrl_safe" 9 "nvme_subsystem_for_each_ctrl_safe" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_for_each_ctrl_safe" 9 "nvme_subsystem_for_each_ctrl_safe" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_for_each_ctrl_safe \- Traverse controllers
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_for_each_ns.2 b/doc/man/nvme_subsystem_for_each_ns.2
index ed20603..65af75b 100644
--- a/doc/man/nvme_subsystem_for_each_ns.2
+++ b/doc/man/nvme_subsystem_for_each_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_for_each_ns" 9 "nvme_subsystem_for_each_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_for_each_ns" 9 "nvme_subsystem_for_each_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_for_each_ns \- Traverse namespaces
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_for_each_ns_safe.2 b/doc/man/nvme_subsystem_for_each_ns_safe.2
index 7b565bf..055963a 100644
--- a/doc/man/nvme_subsystem_for_each_ns_safe.2
+++ b/doc/man/nvme_subsystem_for_each_ns_safe.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_for_each_ns_safe" 9 "nvme_subsystem_for_each_ns_safe" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_for_each_ns_safe" 9 "nvme_subsystem_for_each_ns_safe" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_for_each_ns_safe \- Traverse namespaces
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_get_host.2 b/doc/man/nvme_subsystem_get_host.2
index cdabc3f..4f147ff 100644
--- a/doc/man/nvme_subsystem_get_host.2
+++ b/doc/man/nvme_subsystem_get_host.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_get_host" 9 "nvme_subsystem_get_host" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_get_host" 9 "nvme_subsystem_get_host" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_get_host \- Returns nvme_host_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_get_name.2 b/doc/man/nvme_subsystem_get_name.2
index a5c7335..2951bff 100644
--- a/doc/man/nvme_subsystem_get_name.2
+++ b/doc/man/nvme_subsystem_get_name.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_get_name" 9 "nvme_subsystem_get_name" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_get_name" 9 "nvme_subsystem_get_name" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_get_name \- sysfs name of an nvme_subsystem_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_get_nqn.2 b/doc/man/nvme_subsystem_get_nqn.2
index 45aea5e..6f70784 100644
--- a/doc/man/nvme_subsystem_get_nqn.2
+++ b/doc/man/nvme_subsystem_get_nqn.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_get_nqn" 9 "nvme_subsystem_get_nqn" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_get_nqn" 9 "nvme_subsystem_get_nqn" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_get_nqn \- Retrieve NQN from subsystem
.SH SYNOPSIS
@@ -8,4 +8,4 @@ nvme_subsystem_get_nqn \- Retrieve NQN from subsystem
.IP "s" 12
nvme_subsystem_t object
.SH "RETURN"
-NQN of systemstem
+NQN of subsystem
diff --git a/doc/man/nvme_subsystem_get_sysfs_dir.2 b/doc/man/nvme_subsystem_get_sysfs_dir.2
index d07e445..be05669 100644
--- a/doc/man/nvme_subsystem_get_sysfs_dir.2
+++ b/doc/man/nvme_subsystem_get_sysfs_dir.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_get_sysfs_dir" 9 "nvme_subsystem_get_sysfs_dir" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_get_sysfs_dir" 9 "nvme_subsystem_get_sysfs_dir" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_get_sysfs_dir \- sysfs directory of an nvme_subsystem_t object
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_get_type.2 b/doc/man/nvme_subsystem_get_type.2
index 55c1b99..3cb01bf 100644
--- a/doc/man/nvme_subsystem_get_type.2
+++ b/doc/man/nvme_subsystem_get_type.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_get_type" 9 "nvme_subsystem_get_type" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_get_type" 9 "nvme_subsystem_get_type" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_get_type \- Returns the type of a subsystem
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_lookup_namespace.2 b/doc/man/nvme_subsystem_lookup_namespace.2
index 201c3fd..2c770aa 100644
--- a/doc/man/nvme_subsystem_lookup_namespace.2
+++ b/doc/man/nvme_subsystem_lookup_namespace.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_lookup_namespace" 9 "nvme_subsystem_lookup_namespace" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_lookup_namespace" 9 "nvme_subsystem_lookup_namespace" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_lookup_namespace \- lookup namespace by NSID
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_next_ctrl.2 b/doc/man/nvme_subsystem_next_ctrl.2
index 971ab8a..8c742a0 100644
--- a/doc/man/nvme_subsystem_next_ctrl.2
+++ b/doc/man/nvme_subsystem_next_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_next_ctrl" 9 "nvme_subsystem_next_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_next_ctrl" 9 "nvme_subsystem_next_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_next_ctrl \- Next ctrl iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_next_ns.2 b/doc/man/nvme_subsystem_next_ns.2
index fad424e..0a266ea 100644
--- a/doc/man/nvme_subsystem_next_ns.2
+++ b/doc/man/nvme_subsystem_next_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_next_ns" 9 "nvme_subsystem_next_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_next_ns" 9 "nvme_subsystem_next_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_next_ns \- Next namespace iterator
.SH SYNOPSIS
diff --git a/doc/man/nvme_subsystem_reset.2 b/doc/man/nvme_subsystem_reset.2
index 6f96dcf..80769a0 100644
--- a/doc/man/nvme_subsystem_reset.2
+++ b/doc/man/nvme_subsystem_reset.2
@@ -1,4 +1,4 @@
-.TH "nvme_subsystem_reset" 9 "nvme_subsystem_reset" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_subsystem_reset" 9 "nvme_subsystem_reset" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_subsystem_reset \- Initiate a subsystem reset
.SH SYNOPSIS
diff --git a/doc/man/nvme_supported_cap_config_list_log.2 b/doc/man/nvme_supported_cap_config_list_log.2
index b842e36..cbf92ab 100644
--- a/doc/man/nvme_supported_cap_config_list_log.2
+++ b/doc/man/nvme_supported_cap_config_list_log.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_supported_cap_config_list_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_supported_cap_config_list_log" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_supported_cap_config_list_log \-
+struct nvme_supported_cap_config_list_log \- Supported Capacity Configuration list log page
.SH SYNOPSIS
struct nvme_supported_cap_config_list_log {
.br
@@ -16,7 +16,9 @@ struct nvme_supported_cap_config_list_log {
.SH Members
.IP "sccn" 12
-number of capacity configuration
-.SH "Description"
-Supported Capacity Configuration list log page
-structure definitions
+Number of capacity configuration
+.IP "rsvd1" 12
+Reserved
+.IP "cap_config_desc" 12
+Capacity configuration descriptor.
+See \fIstruct\fP nvme_capacity_config_desc
diff --git a/doc/man/nvme_supported_log_pages.2 b/doc/man/nvme_supported_log_pages.2
index 4ff8d55..9912e20 100644
--- a/doc/man/nvme_supported_log_pages.2
+++ b/doc/man/nvme_supported_log_pages.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_supported_log_pages" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_supported_log_pages" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_supported_log_pages \-
+struct nvme_supported_log_pages \- Supported Log Pages - Log
.SH SYNOPSIS
struct nvme_supported_log_pages {
.br
diff --git a/doc/man/nvme_telemetry_da.2 b/doc/man/nvme_telemetry_da.2
index 7ba72d7..6a6199f 100644
--- a/doc/man/nvme_telemetry_da.2
+++ b/doc/man/nvme_telemetry_da.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvme_telemetry_da" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_telemetry_da" "July 2022" "API Manual" LINUX
.SH NAME
enum nvme_telemetry_da \- Telemetry Log Data Area
.SH SYNOPSIS
diff --git a/doc/man/nvme_telemetry_log.2 b/doc/man/nvme_telemetry_log.2
index 4ee5d67..6fb11b0 100644
--- a/doc/man/nvme_telemetry_log.2
+++ b/doc/man/nvme_telemetry_log.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_telemetry_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_telemetry_log" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_telemetry_log \- Retrieve internal data specific to the manufacturer.
.SH SYNOPSIS
@@ -77,7 +77,7 @@ Telemetry Controller-Initiated Data Generation Number is
a value that is incremented each time the controller initiates a
capture of its internal controller state in the controller .
.IP "rsnident" 12
-Reason Identifieris a vendor specific identifier that describes
+Reason Identifiers a vendor specific identifier that describes
the operating conditions of the controller at the time of
capture.
.IP "data_area" 12
diff --git a/doc/man/nvme_thermal_exc_event.2 b/doc/man/nvme_thermal_exc_event.2
index a50ff57..d98b429 100644
--- a/doc/man/nvme_thermal_exc_event.2
+++ b/doc/man/nvme_thermal_exc_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_thermal_exc_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_thermal_exc_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_thermal_exc_event \-
+struct nvme_thermal_exc_event \- Thermal Excursion Event Data
.SH SYNOPSIS
struct nvme_thermal_exc_event {
.br
diff --git a/doc/man/nvme_time_stamp_change_event.2 b/doc/man/nvme_time_stamp_change_event.2
index 3a01771..36916bd 100644
--- a/doc/man/nvme_time_stamp_change_event.2
+++ b/doc/man/nvme_time_stamp_change_event.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_time_stamp_change_event" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_time_stamp_change_event" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_time_stamp_change_event \-
+struct nvme_time_stamp_change_event \- Timestamp Change Event
.SH SYNOPSIS
struct nvme_time_stamp_change_event {
.br
diff --git a/doc/man/nvme_timestamp.2 b/doc/man/nvme_timestamp.2
index 97d6ee3..c161ebc 100644
--- a/doc/man/nvme_timestamp.2
+++ b/doc/man/nvme_timestamp.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_timestamp" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_timestamp" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_timestamp \-
+struct nvme_timestamp \- Timestamp - Data Structure for Get Features
.SH SYNOPSIS
struct nvme_timestamp {
.br
diff --git a/doc/man/nvme_unlink_ctrl.2 b/doc/man/nvme_unlink_ctrl.2
index 8ef69e8..eef6c85 100644
--- a/doc/man/nvme_unlink_ctrl.2
+++ b/doc/man/nvme_unlink_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_unlink_ctrl" 9 "nvme_unlink_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_unlink_ctrl" 9 "nvme_unlink_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_unlink_ctrl \- Unlink controller
.SH SYNOPSIS
diff --git a/doc/man/nvme_update_config.2 b/doc/man/nvme_update_config.2
index c3357e2..f1feba1 100644
--- a/doc/man/nvme_update_config.2
+++ b/doc/man/nvme_update_config.2
@@ -1,4 +1,4 @@
-.TH "nvme_update_config" 9 "nvme_update_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_update_config" 9 "nvme_update_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_update_config \- Update JSON configuration
.SH SYNOPSIS
diff --git a/doc/man/nvme_uring_cmd.2 b/doc/man/nvme_uring_cmd.2
new file mode 100644
index 0000000..e36a0e6
--- /dev/null
+++ b/doc/man/nvme_uring_cmd.2
@@ -0,0 +1,83 @@
+.TH "libnvme" 9 "struct nvme_uring_cmd" "July 2022" "API Manual" LINUX
+.SH NAME
+struct nvme_uring_cmd \- nvme uring command structure
+.SH SYNOPSIS
+struct nvme_uring_cmd {
+.br
+.BI " __u8 opcode;"
+.br
+.BI " __u8 flags;"
+.br
+.BI " __u16 rsvd1;"
+.br
+.BI " __u32 nsid;"
+.br
+.BI " __u32 cdw2;"
+.br
+.BI " __u32 cdw3;"
+.br
+.BI " __u64 metadata;"
+.br
+.BI " __u64 addr;"
+.br
+.BI " __u32 metadata_len;"
+.br
+.BI " __u32 data_len;"
+.br
+.BI " __u32 cdw10;"
+.br
+.BI " __u32 cdw11;"
+.br
+.BI " __u32 cdw12;"
+.br
+.BI " __u32 cdw13;"
+.br
+.BI " __u32 cdw14;"
+.br
+.BI " __u32 cdw15;"
+.br
+.BI " __u32 timeout_ms;"
+.br
+.BI " __u32 rsvd2;"
+.br
+.BI "
+};
+.br
+
+.SH Members
+.IP "opcode" 12
+Operation code, see \fIenum nvme_io_opcodes\fP and \fIenum nvme_admin_opcodes\fP
+.IP "flags" 12
+Not supported: intended for command flags (eg: SGL, FUSE)
+.IP "rsvd1" 12
+Reserved for future use
+.IP "nsid" 12
+Namespace Identifier, or Fabrics type
+.IP "cdw2" 12
+Command Dword 2 (no spec defined use)
+.IP "cdw3" 12
+Command Dword 3 (no spec defined use)
+.IP "metadata" 12
+User space address to metadata buffer (NULL if not used)
+.IP "addr" 12
+User space address to data buffer (NULL if not used)
+.IP "metadata_len" 12
+Metadata buffer transfer length
+.IP "data_len" 12
+Data buffer transfer length
+.IP "cdw10" 12
+Command Dword 10 (command specific)
+.IP "cdw11" 12
+Command Dword 11 (command specific)
+.IP "cdw12" 12
+Command Dword 12 (command specific)
+.IP "cdw13" 12
+Command Dword 13 (command specific)
+.IP "cdw14" 12
+Command Dword 14 (command specific)
+.IP "cdw15" 12
+Command Dword 15 (command specific)
+.IP "timeout_ms" 12
+If non-zero, overrides system default timeout in milliseconds
+.IP "rsvd2" 12
+Reserved for future use (and fills an implicit struct pad
diff --git a/doc/man/nvme_verify.2 b/doc/man/nvme_verify.2
index 000ae7f..170267f 100644
--- a/doc/man/nvme_verify.2
+++ b/doc/man/nvme_verify.2
@@ -1,4 +1,4 @@
-.TH "nvme_verify" 9 "nvme_verify" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_verify" 9 "nvme_verify" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_verify \- Send an nvme verify command
.SH SYNOPSIS
diff --git a/doc/man/nvme_version.2 b/doc/man/nvme_version.2
new file mode 100644
index 0000000..aae7fee
--- /dev/null
+++ b/doc/man/nvme_version.2
@@ -0,0 +1,18 @@
+.TH "libnvme" 9 "enum nvme_version" "July 2022" "API Manual" LINUX
+.SH NAME
+enum nvme_version \- Selector for version to be returned by @nvme_get_version
+.SH SYNOPSIS
+enum nvme_version {
+.br
+.BI " NVME_VERSION_PROJECT"
+,
+.br
+.br
+.BI " NVME_VERSION_GIT"
+
+};
+.SH Constants
+.IP "NVME_VERSION_PROJECT" 12
+Project release version
+.IP "NVME_VERSION_GIT" 12
+Git reference
diff --git a/doc/man/nvme_virt_mgmt_act.2 b/doc/man/nvme_virt_mgmt_act.2
index a04cf35..0795832 100644
--- a/doc/man/nvme_virt_mgmt_act.2
+++ b/doc/man/nvme_virt_mgmt_act.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_virt_mgmt_act" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_virt_mgmt_act" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_virt_mgmt_act \-
+enum nvme_virt_mgmt_act \- Virtualization Management - Action
.SH SYNOPSIS
enum nvme_virt_mgmt_act {
.br
diff --git a/doc/man/nvme_virt_mgmt_rt.2 b/doc/man/nvme_virt_mgmt_rt.2
index 99db5e0..3f9c612 100644
--- a/doc/man/nvme_virt_mgmt_rt.2
+++ b/doc/man/nvme_virt_mgmt_rt.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_virt_mgmt_rt" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_virt_mgmt_rt" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_virt_mgmt_rt \-
+enum nvme_virt_mgmt_rt \- Virtualization Management - Resource Type
.SH SYNOPSIS
enum nvme_virt_mgmt_rt {
.br
diff --git a/doc/man/nvme_virtual_mgmt.2 b/doc/man/nvme_virtual_mgmt.2
index ece162d..a43ff0f 100644
--- a/doc/man/nvme_virtual_mgmt.2
+++ b/doc/man/nvme_virtual_mgmt.2
@@ -1,4 +1,4 @@
-.TH "nvme_virtual_mgmt" 9 "nvme_virtual_mgmt" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_virtual_mgmt" 9 "nvme_virtual_mgmt" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_virtual_mgmt \- Virtualization resource management
.SH SYNOPSIS
diff --git a/doc/man/nvme_virtual_mgmt_args.2 b/doc/man/nvme_virtual_mgmt_args.2
deleted file mode 100644
index d072b4c..0000000
--- a/doc/man/nvme_virtual_mgmt_args.2
+++ /dev/null
@@ -1,43 +0,0 @@
-.TH "libnvme" 9 "struct nvme_virtual_mgmt_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_virtual_mgmt_args \- Arguments for the NVMe Virtualization resource management command
-.SH SYNOPSIS
-struct nvme_virtual_mgmt_args {
-.br
-.BI " __u32 *result;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " enum nvme_virt_mgmt_act act;"
-.br
-.BI " enum nvme_virt_mgmt_rt rt;"
-.br
-.BI " __u16 cntlid;"
-.br
-.BI " __u16 nr;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "result" 12
-If successful, the CQE dword0
-.IP "args_size" 12
-Size of \fIstruct nvme_virtual_mgmt_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "act" 12
-Virtual resource action, see \fIenum nvme_virt_mgmt_act\fP
-.IP "rt" 12
-Resource type to modify, see \fIenum nvme_virt_mgmt_rt\fP
-.IP "cntlid" 12
-Controller id for which resources are bing modified
-.IP "nr" 12
-Number of resources being allocated or assigned
diff --git a/doc/man/nvme_write.2 b/doc/man/nvme_write.2
index ca701a9..6b7eb63 100644
--- a/doc/man/nvme_write.2
+++ b/doc/man/nvme_write.2
@@ -1,4 +1,4 @@
-.TH "nvme_write" 9 "nvme_write" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_write" 9 "nvme_write" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_write \- Submit an nvme user write command
.SH SYNOPSIS
diff --git a/doc/man/nvme_write_uncorrectable.2 b/doc/man/nvme_write_uncorrectable.2
index 018f526..6b67c0a 100644
--- a/doc/man/nvme_write_uncorrectable.2
+++ b/doc/man/nvme_write_uncorrectable.2
@@ -1,4 +1,4 @@
-.TH "nvme_write_uncorrectable" 9 "nvme_write_uncorrectable" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_write_uncorrectable" 9 "nvme_write_uncorrectable" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_write_uncorrectable \- Submit an nvme write uncorrectable command
.SH SYNOPSIS
diff --git a/doc/man/nvme_write_zeros.2 b/doc/man/nvme_write_zeros.2
index 26f17e0..0fb3ce8 100644
--- a/doc/man/nvme_write_zeros.2
+++ b/doc/man/nvme_write_zeros.2
@@ -1,4 +1,4 @@
-.TH "nvme_write_zeros" 9 "nvme_write_zeros" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_write_zeros" 9 "nvme_write_zeros" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_write_zeros \- Submit an nvme write zeroes command
.SH SYNOPSIS
diff --git a/doc/man/nvme_zns_append.2 b/doc/man/nvme_zns_append.2
index ee381ea..eb0d414 100644
--- a/doc/man/nvme_zns_append.2
+++ b/doc/man/nvme_zns_append.2
@@ -1,4 +1,4 @@
-.TH "nvme_zns_append" 9 "nvme_zns_append" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_zns_append" 9 "nvme_zns_append" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_zns_append \- Append data to a zone
.SH SYNOPSIS
diff --git a/doc/man/nvme_zns_append_args.2 b/doc/man/nvme_zns_append_args.2
deleted file mode 100644
index 7c87dce..0000000
--- a/doc/man/nvme_zns_append_args.2
+++ /dev/null
@@ -1,70 +0,0 @@
-.TH "libnvme" 9 "struct nvme_zns_append_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_zns_append_args \- Arguments for the NVMe ZNS Append command
-.SH SYNOPSIS
-struct nvme_zns_append_args {
-.br
-.BI " __u64 zslba;"
-.br
-.BI " __u64 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " void *metadata;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " __u32 ilbrt;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u32 metadata_len;"
-.br
-.BI " __u16 nlb;"
-.br
-.BI " __u16 control;"
-.br
-.BI " __u16 lbat;"
-.br
-.BI " __u16 lbatm;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "zslba" 12
-Zone start logical block address
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-Userspace address of the data
-.IP "metadata" 12
-Userspace address of the metadata
-.IP "args_size" 12
-Size of \fIstruct nvme_zns_append_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-Timeout in ms
-.IP "nsid" 12
-Namespace ID
-.IP "ilbrt" 12
-Initial logical block reference tag
-.IP "data_len" 12
-Length of \fIdata\fP
-.IP "metadata_len" 12
-Length of \fImetadata\fP
-.IP "nlb" 12
-Number of logical blocks
-.IP "control" 12
-.IP "lbat" 12
-Logical block application tag
-.IP "lbatm" 12
-Logical block application tag mask
diff --git a/doc/man/nvme_zns_changed_zone_log.2 b/doc/man/nvme_zns_changed_zone_log.2
index 31a9aef..a901f7d 100644
--- a/doc/man/nvme_zns_changed_zone_log.2
+++ b/doc/man/nvme_zns_changed_zone_log.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_zns_changed_zone_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_zns_changed_zone_log" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_zns_changed_zone_log \- ZNS Changed Zone List log
.SH SYNOPSIS
diff --git a/doc/man/nvme_zns_desc.2 b/doc/man/nvme_zns_desc.2
index 06bc3a4..e299549 100644
--- a/doc/man/nvme_zns_desc.2
+++ b/doc/man/nvme_zns_desc.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_zns_desc" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_zns_desc" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_zns_desc \-
+struct nvme_zns_desc \- Zone Descriptor Data Structure
.SH SYNOPSIS
struct nvme_zns_desc {
.br
diff --git a/doc/man/nvme_zns_id_ctrl.2 b/doc/man/nvme_zns_id_ctrl.2
index fc0898f..0c59364 100644
--- a/doc/man/nvme_zns_id_ctrl.2
+++ b/doc/man/nvme_zns_id_ctrl.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_zns_id_ctrl" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_zns_id_ctrl" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_zns_id_ctrl \-
+struct nvme_zns_id_ctrl \- I/O Command Set Specific Identify Controller Data Structure for the Zoned Namespace Command Set
.SH SYNOPSIS
struct nvme_zns_id_ctrl {
.br
@@ -14,5 +14,6 @@ struct nvme_zns_id_ctrl {
.SH Members
.IP "zasl" 12
+Zone Append Size Limit
.IP "rsvd1" 12
Reserved
diff --git a/doc/man/nvme_zns_id_ns.2 b/doc/man/nvme_zns_id_ns.2
index 4e9ac06..176247d 100644
--- a/doc/man/nvme_zns_id_ns.2
+++ b/doc/man/nvme_zns_id_ns.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvme_zns_id_ns" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_zns_id_ns" "July 2022" "API Manual" LINUX
.SH NAME
struct nvme_zns_id_ns \- Zoned Namespace Command Set Specific Identify Namespace Data Structure
.SH SYNOPSIS
diff --git a/doc/man/nvme_zns_identify_ctrl.2 b/doc/man/nvme_zns_identify_ctrl.2
index bf3ebd3..d6b7b80 100644
--- a/doc/man/nvme_zns_identify_ctrl.2
+++ b/doc/man/nvme_zns_identify_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvme_zns_identify_ctrl" 9 "nvme_zns_identify_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_zns_identify_ctrl" 9 "nvme_zns_identify_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_zns_identify_ctrl \- ZNS identify controller data
.SH SYNOPSIS
diff --git a/doc/man/nvme_zns_identify_ns.2 b/doc/man/nvme_zns_identify_ns.2
index 4b95bb9..55618b2 100644
--- a/doc/man/nvme_zns_identify_ns.2
+++ b/doc/man/nvme_zns_identify_ns.2
@@ -1,4 +1,4 @@
-.TH "nvme_zns_identify_ns" 9 "nvme_zns_identify_ns" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_zns_identify_ns" 9 "nvme_zns_identify_ns" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_zns_identify_ns \- ZNS identify namespace data
.SH SYNOPSIS
diff --git a/doc/man/nvme_zns_lbafe.2 b/doc/man/nvme_zns_lbafe.2
index 846d775..7db1249 100644
--- a/doc/man/nvme_zns_lbafe.2
+++ b/doc/man/nvme_zns_lbafe.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_zns_lbafe" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_zns_lbafe" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_zns_lbafe \-
+struct nvme_zns_lbafe \- LBA Format Extension Data Structure
.SH SYNOPSIS
struct nvme_zns_lbafe {
.br
diff --git a/doc/man/nvme_zns_mgmt_recv.2 b/doc/man/nvme_zns_mgmt_recv.2
index 222d828..8227a75 100644
--- a/doc/man/nvme_zns_mgmt_recv.2
+++ b/doc/man/nvme_zns_mgmt_recv.2
@@ -1,6 +1,6 @@
-.TH "nvme_zns_mgmt_recv" 9 "nvme_zns_mgmt_recv" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_zns_mgmt_recv" 9 "nvme_zns_mgmt_recv" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_zns_mgmt_recv \-
+nvme_zns_mgmt_recv \- ZNS management receive command
.SH SYNOPSIS
.B "int" nvme_zns_mgmt_recv
.BI "(struct nvme_zns_mgmt_recv_args *args " ");"
diff --git a/doc/man/nvme_zns_mgmt_recv_args.2 b/doc/man/nvme_zns_mgmt_recv_args.2
deleted file mode 100644
index 556b136..0000000
--- a/doc/man/nvme_zns_mgmt_recv_args.2
+++ /dev/null
@@ -1,55 +0,0 @@
-.TH "libnvme" 9 "struct nvme_zns_mgmt_recv_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_zns_mgmt_recv_args \- Arguments for the NVMe ZNS Management Receive command
-.SH SYNOPSIS
-struct nvme_zns_mgmt_recv_args {
-.br
-.BI " __u64 slba;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_zns_recv_action zra;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " __u16 zrasf;"
-.br
-.BI " bool zras_feat;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "slba" 12
-Starting logical block address
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-Userspace address of the data
-.IP "args_size" 12
-Size of \fIstruct nvme_zns_mgmt_recv_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-timeout in ms
-.IP "nsid" 12
-Namespace ID
-.IP "zra" 12
-zone receive action
-.IP "data_len" 12
-Length of \fIdata\fP
-.IP "zrasf" 12
-Zone receive action specific field
-.IP "zras_feat" 12
-Zone receive action specific features
diff --git a/doc/man/nvme_zns_mgmt_send.2 b/doc/man/nvme_zns_mgmt_send.2
index e91a032..6875aac 100644
--- a/doc/man/nvme_zns_mgmt_send.2
+++ b/doc/man/nvme_zns_mgmt_send.2
@@ -1,6 +1,6 @@
-.TH "nvme_zns_mgmt_send" 9 "nvme_zns_mgmt_send" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_zns_mgmt_send" 9 "nvme_zns_mgmt_send" "July 2022" "libnvme API manual" LINUX
.SH NAME
-nvme_zns_mgmt_send \-
+nvme_zns_mgmt_send \- ZNS management send command
.SH SYNOPSIS
.B "int" nvme_zns_mgmt_send
.BI "(struct nvme_zns_mgmt_send_args *args " ");"
diff --git a/doc/man/nvme_zns_mgmt_send_args.2 b/doc/man/nvme_zns_mgmt_send_args.2
deleted file mode 100644
index 0b1b53c..0000000
--- a/doc/man/nvme_zns_mgmt_send_args.2
+++ /dev/null
@@ -1,55 +0,0 @@
-.TH "libnvme" 9 "struct nvme_zns_mgmt_send_args" "April 2022" "API Manual" LINUX
-.SH NAME
-struct nvme_zns_mgmt_send_args \- Arguments for the NVMe ZNS Management Send command
-.SH SYNOPSIS
-struct nvme_zns_mgmt_send_args {
-.br
-.BI " __u64 slba;"
-.br
-.BI " __u32 *result;"
-.br
-.BI " void *data;"
-.br
-.BI " int args_size;"
-.br
-.BI " int fd;"
-.br
-.BI " __u32 timeout;"
-.br
-.BI " __u32 nsid;"
-.br
-.BI " enum nvme_zns_send_action zsa;"
-.br
-.BI " __u32 data_len;"
-.br
-.BI " bool select_all;"
-.br
-.BI " __u8 zsaso;"
-.br
-.BI "
-};
-.br
-
-.SH Members
-.IP "slba" 12
-Starting logical block address
-.IP "result" 12
-The command completion result from CQE dword0
-.IP "data" 12
-Userspace address of the data
-.IP "args_size" 12
-Size of \fIstruct nvme_zns_mgmt_send_args\fP
-.IP "fd" 12
-File descriptor of nvme device
-.IP "timeout" 12
-timeout in ms
-.IP "nsid" 12
-Namespace ID
-.IP "zsa" 12
-Zone send action
-.IP "data_len" 12
-Length of \fIdata\fP
-.IP "select_all" 12
-Select all flag
-.IP "zsaso" 12
-Zone Send Action Specific Option
diff --git a/doc/man/nvme_zns_recv_action.2 b/doc/man/nvme_zns_recv_action.2
index a14d83e..1082f5d 100644
--- a/doc/man/nvme_zns_recv_action.2
+++ b/doc/man/nvme_zns_recv_action.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_zns_recv_action" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_zns_recv_action" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_zns_recv_action \-
+enum nvme_zns_recv_action \- Zone Management Receive - Zone Receive Action Specific Features
.SH SYNOPSIS
enum nvme_zns_recv_action {
.br
diff --git a/doc/man/nvme_zns_report_options.2 b/doc/man/nvme_zns_report_options.2
index f938ffd..037010c 100644
--- a/doc/man/nvme_zns_report_options.2
+++ b/doc/man/nvme_zns_report_options.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_zns_report_options" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_zns_report_options" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_zns_report_options \-
+enum nvme_zns_report_options \- Zone Management Receive - Zone Receive Action Specific Field
.SH SYNOPSIS
enum nvme_zns_report_options {
.br
diff --git a/doc/man/nvme_zns_report_zones.2 b/doc/man/nvme_zns_report_zones.2
index 6d61605..586f904 100644
--- a/doc/man/nvme_zns_report_zones.2
+++ b/doc/man/nvme_zns_report_zones.2
@@ -1,4 +1,4 @@
-.TH "nvme_zns_report_zones" 9 "nvme_zns_report_zones" "April 2022" "libnvme API manual" LINUX
+.TH "nvme_zns_report_zones" 9 "nvme_zns_report_zones" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvme_zns_report_zones \- Return the list of zones
.SH SYNOPSIS
diff --git a/doc/man/nvme_zns_send_action.2 b/doc/man/nvme_zns_send_action.2
index 0c13f63..ee4c419 100644
--- a/doc/man/nvme_zns_send_action.2
+++ b/doc/man/nvme_zns_send_action.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_zns_send_action" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_zns_send_action" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_zns_send_action \-
+enum nvme_zns_send_action \- Zone Management Send - Zone Send Action
.SH SYNOPSIS
enum nvme_zns_send_action {
.br
diff --git a/doc/man/nvme_zns_za.2 b/doc/man/nvme_zns_za.2
index ab9cb27..25ed00c 100644
--- a/doc/man/nvme_zns_za.2
+++ b/doc/man/nvme_zns_za.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_zns_za" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_zns_za" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_zns_za \-
+enum nvme_zns_za \- Zone Descriptor Data Structure
.SH SYNOPSIS
enum nvme_zns_za {
.br
diff --git a/doc/man/nvme_zns_zs.2 b/doc/man/nvme_zns_zs.2
index ee0d193..483af75 100644
--- a/doc/man/nvme_zns_zs.2
+++ b/doc/man/nvme_zns_zs.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_zns_zs" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_zns_zs" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_zns_zs \-
+enum nvme_zns_zs \- Zone Descriptor Data Structure - Zone State
.SH SYNOPSIS
enum nvme_zns_zs {
.br
diff --git a/doc/man/nvme_zns_zt.2 b/doc/man/nvme_zns_zt.2
index 97b1291..342db2d 100644
--- a/doc/man/nvme_zns_zt.2
+++ b/doc/man/nvme_zns_zt.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "enum nvme_zns_zt" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvme_zns_zt" "July 2022" "API Manual" LINUX
.SH NAME
-enum nvme_zns_zt \-
+enum nvme_zns_zt \- Zone Descriptor Data Structure - Zone Type
.SH SYNOPSIS
enum nvme_zns_zt {
.br
@@ -9,3 +9,4 @@ enum nvme_zns_zt {
};
.SH Constants
.IP "NVME_ZONE_TYPE_SEQWRITE_REQ" 12
+Sequential Write Required
diff --git a/doc/man/nvme_zone_report.2 b/doc/man/nvme_zone_report.2
index 26a3495..23c2a35 100644
--- a/doc/man/nvme_zone_report.2
+++ b/doc/man/nvme_zone_report.2
@@ -1,6 +1,6 @@
-.TH "libnvme" 9 "struct nvme_zone_report" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvme_zone_report" "July 2022" "API Manual" LINUX
.SH NAME
-struct nvme_zone_report \-
+struct nvme_zone_report \- Report Zones Data Structure
.SH SYNOPSIS
struct nvme_zone_report {
.br
diff --git a/doc/man/nvmf_add_ctrl.2 b/doc/man/nvmf_add_ctrl.2
index d4ac1ac..65d2cf6 100644
--- a/doc/man/nvmf_add_ctrl.2
+++ b/doc/man/nvmf_add_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvmf_add_ctrl" 9 "nvmf_add_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_add_ctrl" 9 "nvmf_add_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_add_ctrl \- Connect a controller and update topology
.SH SYNOPSIS
diff --git a/doc/man/nvmf_addr_family.2 b/doc/man/nvmf_addr_family.2
index 333509c..d19c24b 100644
--- a/doc/man/nvmf_addr_family.2
+++ b/doc/man/nvmf_addr_family.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_addr_family" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_addr_family" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_addr_family \- Address Family codes for Discovery Log Page entry ADRFAM field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_adrfam_str.2 b/doc/man/nvmf_adrfam_str.2
index d58dc90..1d3de9e 100644
--- a/doc/man/nvmf_adrfam_str.2
+++ b/doc/man/nvmf_adrfam_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_adrfam_str" 9 "nvmf_adrfam_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_adrfam_str" 9 "nvmf_adrfam_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_adrfam_str \- Decode ADRFAM field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_cms_str.2 b/doc/man/nvmf_cms_str.2
index dffcf85..7166f9c 100644
--- a/doc/man/nvmf_cms_str.2
+++ b/doc/man/nvmf_cms_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_cms_str" 9 "nvmf_cms_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_cms_str" 9 "nvmf_cms_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_cms_str \- Decode RDMA connection management service field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_connect_data.2 b/doc/man/nvmf_connect_data.2
index 6164c0a..3c466b3 100644
--- a/doc/man/nvmf_connect_data.2
+++ b/doc/man/nvmf_connect_data.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvmf_connect_data" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvmf_connect_data" "July 2022" "API Manual" LINUX
.SH NAME
struct nvmf_connect_data \- Data payload for the 'connect' command
.SH SYNOPSIS
diff --git a/doc/man/nvmf_connect_disc_entry.2 b/doc/man/nvmf_connect_disc_entry.2
index dd15474..6248a27 100644
--- a/doc/man/nvmf_connect_disc_entry.2
+++ b/doc/man/nvmf_connect_disc_entry.2
@@ -1,4 +1,4 @@
-.TH "nvmf_connect_disc_entry" 9 "nvmf_connect_disc_entry" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_connect_disc_entry" 9 "nvmf_connect_disc_entry" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_connect_disc_entry \- Connect controller based on the discovery log page entry
.SH SYNOPSIS
@@ -13,7 +13,7 @@ Host to which the controller should be connected
.IP "e" 12
Discovery log page entry
.IP "defcfg" 12
-Default configurationn to be used for the new controller
+Default configuration to be used for the new controller
.IP "discover" 12
Set to 'true' if the new controller is a discovery controller
.SH "RETURN"
diff --git a/doc/man/nvmf_default_config.2 b/doc/man/nvmf_default_config.2
index 3b958db..90d149f 100644
--- a/doc/man/nvmf_default_config.2
+++ b/doc/man/nvmf_default_config.2
@@ -1,4 +1,4 @@
-.TH "nvmf_default_config" 9 "nvmf_default_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_default_config" 9 "nvmf_default_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_default_config \- Default values for fabrics configuration
.SH SYNOPSIS
diff --git a/doc/man/nvmf_dim_data.2 b/doc/man/nvmf_dim_data.2
index 85d2be9..7e54b00 100644
--- a/doc/man/nvmf_dim_data.2
+++ b/doc/man/nvmf_dim_data.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvmf_dim_data" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvmf_dim_data" "July 2022" "API Manual" LINUX
.SH NAME
struct nvmf_dim_data \- Discovery Information Management (DIM) - Data
.SH SYNOPSIS
diff --git a/doc/man/nvmf_dim_entfmt.2 b/doc/man/nvmf_dim_entfmt.2
index b0903fd..cb7fb3b 100644
--- a/doc/man/nvmf_dim_entfmt.2
+++ b/doc/man/nvmf_dim_entfmt.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_dim_entfmt" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_dim_entfmt" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_dim_entfmt \- Discovery Information Management Entry Format
.SH SYNOPSIS
diff --git a/doc/man/nvmf_dim_etype.2 b/doc/man/nvmf_dim_etype.2
index 4f3a9eb..8263ec1 100644
--- a/doc/man/nvmf_dim_etype.2
+++ b/doc/man/nvmf_dim_etype.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_dim_etype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_dim_etype" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_dim_etype \- Discovery Information Management Entity Type
.SH SYNOPSIS
diff --git a/doc/man/nvmf_dim_tas.2 b/doc/man/nvmf_dim_tas.2
index 156a7da..99d3666 100644
--- a/doc/man/nvmf_dim_tas.2
+++ b/doc/man/nvmf_dim_tas.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_dim_tas" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_dim_tas" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_dim_tas \- Discovery Information Management Task
.SH SYNOPSIS
diff --git a/doc/man/nvmf_disc_eflags.2 b/doc/man/nvmf_disc_eflags.2
index 60f4ba3..9eaffd8 100644
--- a/doc/man/nvmf_disc_eflags.2
+++ b/doc/man/nvmf_disc_eflags.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_disc_eflags" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_disc_eflags" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_disc_eflags \- Discovery Log Page entry flags.
.SH SYNOPSIS
@@ -16,7 +16,7 @@ enum nvmf_disc_eflags {
,
.br
.br
-.BI " NVMF_DISC_EFLAGS_BOTH"
+.BI " NVMF_DISC_EFLAGS_NCC"
};
.SH Constants
@@ -34,6 +34,13 @@ this flag set.
Explicit Persistent Connection Support for Discovery (EPCSD):
Indicates that Explicit Persistent Connections are
supported for the Discovery controller.
-.IP "NVMF_DISC_EFLAGS_BOTH" 12
-Indicates that both the DUPRETINFO and EPCSD
-features are supported.
+.IP "NVMF_DISC_EFLAGS_NCC" 12
+No CDC Connectivity (NCC): If set to
+'1', then no DDC that describes this entry
+is currently connected to the CDC. If
+cleared to '0', then at least one DDC that
+describes this entry is currently
+connected to the CDC. If the Discovery
+controller returning this log page is not
+a CDC, then this bit shall be cleared to
+'0' and should be ignored by the host.
diff --git a/doc/man/nvmf_disc_log_entry.2 b/doc/man/nvmf_disc_log_entry.2
index 73ef858..f21c65b 100644
--- a/doc/man/nvmf_disc_log_entry.2
+++ b/doc/man/nvmf_disc_log_entry.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvmf_disc_log_entry" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvmf_disc_log_entry" "July 2022" "API Manual" LINUX
.SH NAME
struct nvmf_disc_log_entry \- Discovery Log Page entry
.SH SYNOPSIS
diff --git a/doc/man/nvmf_discovery_log.2 b/doc/man/nvmf_discovery_log.2
index f8707c1..f1aa742 100644
--- a/doc/man/nvmf_discovery_log.2
+++ b/doc/man/nvmf_discovery_log.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvmf_discovery_log" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvmf_discovery_log" "July 2022" "API Manual" LINUX
.SH NAME
struct nvmf_discovery_log \- Discovery Log Page (Log Identifier 70h)
.SH SYNOPSIS
diff --git a/doc/man/nvmf_eflags_str.2 b/doc/man/nvmf_eflags_str.2
index dbe1065..9ac5cb8 100644
--- a/doc/man/nvmf_eflags_str.2
+++ b/doc/man/nvmf_eflags_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_eflags_str" 9 "nvmf_eflags_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_eflags_str" 9 "nvmf_eflags_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_eflags_str \- Decode EFLAGS field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_exat_len.2 b/doc/man/nvmf_exat_len.2
index 2daeaea..02dae1b 100644
--- a/doc/man/nvmf_exat_len.2
+++ b/doc/man/nvmf_exat_len.2
@@ -1,4 +1,4 @@
-.TH "nvmf_exat_len" 9 "nvmf_exat_len" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_exat_len" 9 "nvmf_exat_len" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_exat_len \- Return length rounded up by 4
.SH SYNOPSIS
diff --git a/doc/man/nvmf_exattype.2 b/doc/man/nvmf_exattype.2
index 07d0a92..91c03dd 100644
--- a/doc/man/nvmf_exattype.2
+++ b/doc/man/nvmf_exattype.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_exattype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_exattype" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_exattype \- Extended Attribute Type
.SH SYNOPSIS
diff --git a/doc/man/nvmf_ext_attr.2 b/doc/man/nvmf_ext_attr.2
index 4215edc..87b96b8 100644
--- a/doc/man/nvmf_ext_attr.2
+++ b/doc/man/nvmf_ext_attr.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvmf_ext_attr" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvmf_ext_attr" "July 2022" "API Manual" LINUX
.SH NAME
struct nvmf_ext_attr \- Extended Attribute (EXAT)
.SH SYNOPSIS
diff --git a/doc/man/nvmf_ext_die.2 b/doc/man/nvmf_ext_die.2
index 4d50926..76c1060 100644
--- a/doc/man/nvmf_ext_die.2
+++ b/doc/man/nvmf_ext_die.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "struct nvmf_ext_die" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "struct nvmf_ext_die" "July 2022" "API Manual" LINUX
.SH NAME
struct nvmf_ext_die \- Extended Discovery Information Entry (DIE)
.SH SYNOPSIS
@@ -76,4 +76,4 @@ Number of Extended Attributes
.IP "resv1030" 12
Reserved
.IP "exat" 12
-Extented Attributes 0 (\fIstruct nvmf_ext_attr\fP)
+Extended Attributes 0 (\fIstruct nvmf_ext_attr\fP)
diff --git a/doc/man/nvmf_get_discovery_log.2 b/doc/man/nvmf_get_discovery_log.2
index aee9c17..f60331a 100644
--- a/doc/man/nvmf_get_discovery_log.2
+++ b/doc/man/nvmf_get_discovery_log.2
@@ -1,4 +1,4 @@
-.TH "nvmf_get_discovery_log" 9 "nvmf_get_discovery_log" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_get_discovery_log" 9 "nvmf_get_discovery_log" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_get_discovery_log \- Return the discovery log page
.SH SYNOPSIS
@@ -8,7 +8,7 @@ nvmf_get_discovery_log \- Return the discovery log page
.BI "int max_retries " ");"
.SH ARGUMENTS
.IP "c" 12
-Discover controller to use
+Discover controller to use
.IP "logp" 12
Pointer to the log page to be returned
.IP "max_retries" 12
diff --git a/doc/man/nvmf_hostid_from_file.2 b/doc/man/nvmf_hostid_from_file.2
index 72e5002..5e82688 100644
--- a/doc/man/nvmf_hostid_from_file.2
+++ b/doc/man/nvmf_hostid_from_file.2
@@ -1,4 +1,4 @@
-.TH "nvmf_hostid_from_file" 9 "nvmf_hostid_from_file" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_hostid_from_file" 9 "nvmf_hostid_from_file" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_hostid_from_file \- Reads the host identifier from the config default location in /etc/nvme/.
.SH SYNOPSIS
diff --git a/doc/man/nvmf_hostnqn_from_file.2 b/doc/man/nvmf_hostnqn_from_file.2
index ce84ae5..d621633 100644
--- a/doc/man/nvmf_hostnqn_from_file.2
+++ b/doc/man/nvmf_hostnqn_from_file.2
@@ -1,4 +1,4 @@
-.TH "nvmf_hostnqn_from_file" 9 "nvmf_hostnqn_from_file" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_hostnqn_from_file" 9 "nvmf_hostnqn_from_file" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_hostnqn_from_file \- Reads the host nvm qualified name from the config default location in /etc/nvme/
.SH SYNOPSIS
diff --git a/doc/man/nvmf_hostnqn_generate.2 b/doc/man/nvmf_hostnqn_generate.2
index baa5c12..c4dea93 100644
--- a/doc/man/nvmf_hostnqn_generate.2
+++ b/doc/man/nvmf_hostnqn_generate.2
@@ -1,4 +1,4 @@
-.TH "nvmf_hostnqn_generate" 9 "nvmf_hostnqn_generate" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_hostnqn_generate" 9 "nvmf_hostnqn_generate" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_hostnqn_generate \- Generate a machine specific host nqn
.SH SYNOPSIS
diff --git a/doc/man/nvmf_prtype_str.2 b/doc/man/nvmf_prtype_str.2
index fb33189..176c361 100644
--- a/doc/man/nvmf_prtype_str.2
+++ b/doc/man/nvmf_prtype_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_prtype_str" 9 "nvmf_prtype_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_prtype_str" 9 "nvmf_prtype_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_prtype_str \- Decode RDMA Provider type field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_qptype_str.2 b/doc/man/nvmf_qptype_str.2
index f67f9f6..5184bf8 100644
--- a/doc/man/nvmf_qptype_str.2
+++ b/doc/man/nvmf_qptype_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_qptype_str" 9 "nvmf_qptype_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_qptype_str" 9 "nvmf_qptype_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_qptype_str \- Decode RDMA QP Service type field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_rdma_cms.2 b/doc/man/nvmf_rdma_cms.2
index 0b4d2fe..d582a51 100644
--- a/doc/man/nvmf_rdma_cms.2
+++ b/doc/man/nvmf_rdma_cms.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_rdma_cms" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_rdma_cms" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_rdma_cms \- RDMA Connection Management Service Type codes for Discovery Log Page entry TSAS RDMA_CMS field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_rdma_prtype.2 b/doc/man/nvmf_rdma_prtype.2
index 997fe6d..6ab1188 100644
--- a/doc/man/nvmf_rdma_prtype.2
+++ b/doc/man/nvmf_rdma_prtype.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_rdma_prtype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_rdma_prtype" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_rdma_prtype \- RDMA Provider Type codes for Discovery Log Page entry TSAS RDMA_PRTYPE field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_rdma_qptype.2 b/doc/man/nvmf_rdma_qptype.2
index c6a01d7..a98972c 100644
--- a/doc/man/nvmf_rdma_qptype.2
+++ b/doc/man/nvmf_rdma_qptype.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_rdma_qptype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_rdma_qptype" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_rdma_qptype \- RDMA QP Service Type codes for Discovery Log Page entry TSAS RDMA_QPTYPE field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_register_ctrl.2 b/doc/man/nvmf_register_ctrl.2
index 813cac6..3934f86 100644
--- a/doc/man/nvmf_register_ctrl.2
+++ b/doc/man/nvmf_register_ctrl.2
@@ -1,4 +1,4 @@
-.TH "nvmf_register_ctrl" 9 "nvmf_register_ctrl" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_register_ctrl" 9 "nvmf_register_ctrl" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_register_ctrl \- Perform registration task with a DC
.SH SYNOPSIS
diff --git a/doc/man/nvmf_sectype_str.2 b/doc/man/nvmf_sectype_str.2
index 8dc8515..df54e8a 100644
--- a/doc/man/nvmf_sectype_str.2
+++ b/doc/man/nvmf_sectype_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_sectype_str" 9 "nvmf_sectype_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_sectype_str" 9 "nvmf_sectype_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_sectype_str \- Decode SECTYPE field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_subtype_str.2 b/doc/man/nvmf_subtype_str.2
index 1134736..5248d72 100644
--- a/doc/man/nvmf_subtype_str.2
+++ b/doc/man/nvmf_subtype_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_subtype_str" 9 "nvmf_subtype_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_subtype_str" 9 "nvmf_subtype_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_subtype_str \- Decode SUBTYPE field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_tcp_sectype.2 b/doc/man/nvmf_tcp_sectype.2
index 770e684..5287b46 100644
--- a/doc/man/nvmf_tcp_sectype.2
+++ b/doc/man/nvmf_tcp_sectype.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_tcp_sectype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_tcp_sectype" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_tcp_sectype \- Transport Specific Address Subtype Definition for NVMe/TCP Transport
.SH SYNOPSIS
diff --git a/doc/man/nvmf_treq.2 b/doc/man/nvmf_treq.2
index a1c01a1..036c731 100644
--- a/doc/man/nvmf_treq.2
+++ b/doc/man/nvmf_treq.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_treq" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_treq" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_treq \- Transport Requirements codes for Discovery Log Page entry TREQ field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_treq_str.2 b/doc/man/nvmf_treq_str.2
index 3c5e7c3..defe7e8 100644
--- a/doc/man/nvmf_treq_str.2
+++ b/doc/man/nvmf_treq_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_treq_str" 9 "nvmf_treq_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_treq_str" 9 "nvmf_treq_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_treq_str \- Decode TREQ field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_trtype.2 b/doc/man/nvmf_trtype.2
index 7d00ca7..aa3aa88 100644
--- a/doc/man/nvmf_trtype.2
+++ b/doc/man/nvmf_trtype.2
@@ -1,4 +1,4 @@
-.TH "libnvme" 9 "enum nvmf_trtype" "April 2022" "API Manual" LINUX
+.TH "libnvme" 9 "enum nvmf_trtype" "July 2022" "API Manual" LINUX
.SH NAME
enum nvmf_trtype \- Transport Type codes for Discovery Log Page entry TRTYPE field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_trtype_str.2 b/doc/man/nvmf_trtype_str.2
index b46fe99..0c45e9e 100644
--- a/doc/man/nvmf_trtype_str.2
+++ b/doc/man/nvmf_trtype_str.2
@@ -1,4 +1,4 @@
-.TH "nvmf_trtype_str" 9 "nvmf_trtype_str" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_trtype_str" 9 "nvmf_trtype_str" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_trtype_str \- Decode TRTYPE field
.SH SYNOPSIS
diff --git a/doc/man/nvmf_update_config.2 b/doc/man/nvmf_update_config.2
index c23097b..0f4b5c4 100644
--- a/doc/man/nvmf_update_config.2
+++ b/doc/man/nvmf_update_config.2
@@ -1,4 +1,4 @@
-.TH "nvmf_update_config" 9 "nvmf_update_config" "April 2022" "libnvme API manual" LINUX
+.TH "nvmf_update_config" 9 "nvmf_update_config" "July 2022" "libnvme API manual" LINUX
.SH NAME
nvmf_update_config \- Update fabrics configuration values
.SH SYNOPSIS
diff --git a/doc/meson.build b/doc/meson.build
index 0f04343..d716c8b 100644
--- a/doc/meson.build
+++ b/doc/meson.build
@@ -13,22 +13,45 @@ api_files = [
'ioctl.h',
'linux.h',
'log.h',
+ 'mi.h',
'tree.h',
'types.h',
'fabrics.h',
'util.h'
]
+api_paths = []
+foreach f: api_files
+ api_paths += files('../src/nvme/' + f)
+endforeach
+
sphinx_sources = [
'conf.py',
+ 'api.rst',
'index.rst',
+ 'quickstart.rst',
+ 'installation.rst',
+ 'mi.rst',
'config-schema.json'
]
+static_sources = []
+foreach file : sphinx_sources
+ static_sources += configure_file(input: file + '.in',
+ output: file,
+ configuration: substs)
+endforeach
+
+subdir('rst')
+
want_docs = get_option('docs')
want_docs_build = get_option('docs-build')
+kernel_doc = find_program('kernel-doc')
+kernel_doc_check = find_program('kernel-doc-check')
+
+test('kdoc', kernel_doc_check, args: api_paths)
+
if want_docs != 'false'
- kernel_doc = find_program('kernel-doc')
conf = configuration_data()
conf.set('SYSCONFDIR', sysconfdir)
@@ -37,29 +60,27 @@ if want_docs != 'false'
mandir = join_paths(get_option('mandir'), 'man2')
list_man_pages = find_program('list-man-pages.sh')
if want_docs_build
- foreach apif : api_files
- foreach file : files('../src/nvme/' + apif)
- subst = configure_file(
- input: file,
- output: '@BASENAME@.msubst',
- configuration: conf)
- c = run_command(list_man_pages, subst)
- man_pages = c.stdout().split()
- foreach page : man_pages
- custom_target(
- page.underscorify() + '_man',
- input: subst,
- output: page + '.2',
- capture: true,
- command: [kernel_doc,
- '-module', 'libnvme',
- '-man',
- '-function',
- page,
- subst],
- install: true,
- install_dir: mandir)
- endforeach
+ foreach apif : api_paths
+ subst = configure_file(
+ input: apif,
+ output: '@BASENAME@.subst',
+ configuration: conf)
+ c = run_command(list_man_pages, subst, check: true)
+ man_pages = c.stdout().split()
+ foreach page : man_pages
+ custom_target(
+ page.underscorify() + '_man',
+ input: subst,
+ output: page + '.2',
+ capture: true,
+ command: [kernel_doc,
+ '-module', 'libnvme',
+ '-man',
+ '-function',
+ page,
+ subst],
+ install: true,
+ install_dir: mandir)
endforeach
endforeach
else
@@ -73,37 +94,9 @@ if want_docs != 'false'
htmldir = join_paths(get_option('htmldir'), 'nvme')
sphinx_build = find_program('sphinx-build-3', 'sphinx-build')
if sphinx_build.found() and want_docs_build
- cat = find_program('cat')
- rsts = []
- foreach apif : api_files
- afile = files('../src/nvme/' + apif)
- subst = configure_file(
- input: afile,
- output: '@BASENAME@.hsubst',
- configuration: conf)
- rst = custom_target(
- apif.underscorify() + '_rst',
- input: subst,
- output: '@BASENAME@._rst',
- capture: true,
- command: [kernel_doc,
- '-rst',
- '@INPUT@'])
- rsts += rst
- endforeach
- libnvme = custom_target(
- 'libnvme',
- command: [ cat, '@INPUT@' ],
- capture: true,
- input: rsts,
- output: 'libnvme.rst')
- static_sources = []
- foreach file : sphinx_sources
- static_sources += configure_file(input: file, output: file, copy: true)
- endforeach
custom_target(
'generate_doc_html',
- input: [static_sources, libnvme],
+ input: [static_sources, rst],
output: 'html',
command: [sphinx_build,
'-b', 'html',
diff --git a/doc/mi.rst b/doc/mi.rst
new file mode 100644
index 0000000..2806668
--- /dev/null
+++ b/doc/mi.rst
@@ -0,0 +1,43 @@
+NVMe Management Interface (NVMe-MI) support
+===========================================
+
+This libnvme project also includes support for the NVMe Management Interface
+(NVMe-MI), currently over a Management Component Transport (MCTP)
+protocol link. This MCTP link will typically use i2c/SMBus as the
+hardware transport, enabling out-of-band management and control over NVMe
+devices using a simple SMBus interface.
+
+The MI interface is compiled into a separate shared object, ``libnvme-mi.so``.
+
+Most of the MI API is transport-agnostic, except for the endpoint constructor
+functions. Once an endpoint object (``nvme_mi_ep_t``) is created, the generic
+functions can be used to manage it.
+
+MCTP Transport
+--------------
+
+The MI API is generally transport-agnostic, but the only currently-supported
+transport is MCTP, using the kernel ``AF_MCTP`` socket interface.
+
+MCTP endpoints are addressed by a (network-id, endpoint-id) pair. Endpoint
+IDs (EIDs) are defined by the MCTP standard as an 8-bit value. Since the
+address space is somewhat limited, the Linux `AF_MCTP` support allows for
+separate MCTP "networks", which provide separate address spaces. These networks
+each have a unique ``unsigned int`` as their ID.
+
+The default Network ID is 1; unless you have configured otherwise, MCTP
+endpoints will appear on this network.
+
+If compiled with D-Bus support, ``libnvme-mi`` can query the system MCTP daemon
+("``mctpd``") to find attached NVMe devices, via the ``nvme_mi_scan_mctp()``
+function. Calling this will establish a ``nvme_root_t`` object, populated
+with the results of that scan. Use the ``nvme_mi_for_each_endpoint`` macro
+to iterate through the scanned endpoints.
+
+Note that the MCTP daemon is provided separately, as part of the MCTP userspace
+tools, at https://github.com/CodeConstruct/mctp . ``mctpd`` is responsible for
+discovery and enumeration for MCTP endpoints on the system, and will query
+each for its protocol capabilities during enumeration. Consequently, NVMe-MI
+endpoints will need to report support for NVMe-MI-over-MCTP (protocol 0x4) in
+their supported protocols list (ie., as returned by the MCTP Get Message Type
+Support command) in order to be discovered.
diff --git a/doc/mi.rst.in b/doc/mi.rst.in
new file mode 100644
index 0000000..2806668
--- /dev/null
+++ b/doc/mi.rst.in
@@ -0,0 +1,43 @@
+NVMe Management Interface (NVMe-MI) support
+===========================================
+
+This libnvme project also includes support for the NVMe Management Interface
+(NVMe-MI), currently over a Management Component Transport (MCTP)
+protocol link. This MCTP link will typically use i2c/SMBus as the
+hardware transport, enabling out-of-band management and control over NVMe
+devices using a simple SMBus interface.
+
+The MI interface is compiled into a separate shared object, ``libnvme-mi.so``.
+
+Most of the MI API is transport-agnostic, except for the endpoint constructor
+functions. Once an endpoint object (``nvme_mi_ep_t``) is created, the generic
+functions can be used to manage it.
+
+MCTP Transport
+--------------
+
+The MI API is generally transport-agnostic, but the only currently-supported
+transport is MCTP, using the kernel ``AF_MCTP`` socket interface.
+
+MCTP endpoints are addressed by a (network-id, endpoint-id) pair. Endpoint
+IDs (EIDs) are defined by the MCTP standard as an 8-bit value. Since the
+address space is somewhat limited, the Linux `AF_MCTP` support allows for
+separate MCTP "networks", which provide separate address spaces. These networks
+each have a unique ``unsigned int`` as their ID.
+
+The default Network ID is 1; unless you have configured otherwise, MCTP
+endpoints will appear on this network.
+
+If compiled with D-Bus support, ``libnvme-mi`` can query the system MCTP daemon
+("``mctpd``") to find attached NVMe devices, via the ``nvme_mi_scan_mctp()``
+function. Calling this will establish a ``nvme_root_t`` object, populated
+with the results of that scan. Use the ``nvme_mi_for_each_endpoint`` macro
+to iterate through the scanned endpoints.
+
+Note that the MCTP daemon is provided separately, as part of the MCTP userspace
+tools, at https://github.com/CodeConstruct/mctp . ``mctpd`` is responsible for
+discovery and enumeration for MCTP endpoints on the system, and will query
+each for its protocol capabilities during enumeration. Consequently, NVMe-MI
+endpoints will need to report support for NVMe-MI-over-MCTP (protocol 0x4) in
+their supported protocols list (ie., as returned by the MCTP Get Message Type
+Support command) in order to be discovered.
diff --git a/doc/quickstart.rst b/doc/quickstart.rst
new file mode 100644
index 0000000..d356188
--- /dev/null
+++ b/doc/quickstart.rst
@@ -0,0 +1,5 @@
+==========
+Quickstart
+==========
+
+tbd \ No newline at end of file
diff --git a/doc/quickstart.rst.in b/doc/quickstart.rst.in
new file mode 100644
index 0000000..d356188
--- /dev/null
+++ b/doc/quickstart.rst.in
@@ -0,0 +1,5 @@
+==========
+Quickstart
+==========
+
+tbd \ No newline at end of file
diff --git a/doc/rst/fabrics.rst b/doc/rst/fabrics.rst
new file mode 100644
index 0000000..b89dc0f
--- /dev/null
+++ b/doc/rst/fabrics.rst
@@ -0,0 +1,446 @@
+.. _fabrics.h:
+
+**fabrics.h**
+
+
+Fabrics-specific definitions.
+
+
+
+.. c:struct:: nvme_fabrics_config
+
+ Defines all linux nvme fabrics initiator options
+
+**Definition**
+
+::
+
+ struct nvme_fabrics_config {
+ char *host_traddr;
+ char *host_iface;
+ int queue_size;
+ int nr_io_queues;
+ int reconnect_delay;
+ int ctrl_loss_tmo;
+ int fast_io_fail_tmo;
+ int keep_alive_tmo;
+ int nr_write_queues;
+ int nr_poll_queues;
+ int tos;
+ bool duplicate_connect;
+ bool disable_sqflow;
+ bool hdr_digest;
+ bool data_digest;
+ bool tls;
+ };
+
+**Members**
+
+``host_traddr``
+ Host transport address
+
+``host_iface``
+ Host interface name
+
+``queue_size``
+ Number of IO queue entries
+
+``nr_io_queues``
+ Number of controller IO queues to establish
+
+``reconnect_delay``
+ Time between two consecutive reconnect attempts.
+
+``ctrl_loss_tmo``
+ Override the default controller reconnect attempt timeout in seconds
+
+``fast_io_fail_tmo``
+ Set the fast I/O fail timeout in seconds.
+
+``keep_alive_tmo``
+ Override the default keep-alive-timeout to this value in seconds
+
+``nr_write_queues``
+ Number of queues to use for exclusively for writing
+
+``nr_poll_queues``
+ Number of queues to reserve for polling completions
+
+``tos``
+ Type of service
+
+``duplicate_connect``
+ Allow multiple connections to the same target
+
+``disable_sqflow``
+ Disable controller sq flow control
+
+``hdr_digest``
+ Generate/verify header digest (TCP)
+
+``data_digest``
+ Generate/verify data digest (TCP)
+
+``tls``
+ Start TLS on the connection (TCP)
+
+
+
+.. c:function:: const char * nvmf_trtype_str (__u8 trtype)
+
+ Decode TRTYPE field
+
+**Parameters**
+
+``__u8 trtype``
+ value to be decoded
+
+**Description**
+
+Decode the transport type field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_adrfam_str (__u8 adrfam)
+
+ Decode ADRFAM field
+
+**Parameters**
+
+``__u8 adrfam``
+ value to be decoded
+
+**Description**
+
+Decode the address family field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_subtype_str (__u8 subtype)
+
+ Decode SUBTYPE field
+
+**Parameters**
+
+``__u8 subtype``
+ value to be decoded
+
+**Description**
+
+Decode the subsystem type field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_treq_str (__u8 treq)
+
+ Decode TREQ field
+
+**Parameters**
+
+``__u8 treq``
+ value to be decoded
+
+**Description**
+
+Decode the transport requirements field in the
+discovery log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_eflags_str (__u16 eflags)
+
+ Decode EFLAGS field
+
+**Parameters**
+
+``__u16 eflags``
+ value to be decoded
+
+**Description**
+
+Decode the EFLAGS field in the discovery log page
+entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_sectype_str (__u8 sectype)
+
+ Decode SECTYPE field
+
+**Parameters**
+
+``__u8 sectype``
+ value to be decoded
+
+**Description**
+
+Decode the SECTYPE field in the discovery log page
+entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_prtype_str (__u8 prtype)
+
+ Decode RDMA Provider type field
+
+**Parameters**
+
+``__u8 prtype``
+ value to be decoded
+
+**Description**
+
+Decode the RDMA Provider type field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_qptype_str (__u8 qptype)
+
+ Decode RDMA QP Service type field
+
+**Parameters**
+
+``__u8 qptype``
+ value to be decoded
+
+**Description**
+
+Decode the RDMA QP Service type field in the discovery log page
+entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: const char * nvmf_cms_str (__u8 cms)
+
+ Decode RDMA connection management service field
+
+**Parameters**
+
+``__u8 cms``
+ value to be decoded
+
+**Description**
+
+Decode the RDMA connection management service field in the discovery
+log page entry.
+
+**Return**
+
+decoded string
+
+
+.. c:function:: void nvmf_default_config (struct nvme_fabrics_config *cfg)
+
+ Default values for fabrics configuration
+
+**Parameters**
+
+``struct nvme_fabrics_config *cfg``
+ config values to set
+
+**Description**
+
+Initializes **cfg** with default values.
+
+
+.. c:function:: void nvmf_update_config (nvme_ctrl_t c, const struct nvme_fabrics_config *cfg)
+
+ Update fabrics configuration values
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be modified
+
+``const struct nvme_fabrics_config *cfg``
+ Updated configuration values
+
+**Description**
+
+Updates the values from **c** with the configuration values from **cfg**;
+all non-default values from **cfg** will overwrite the values in **c**.
+
+
+.. c:function:: int nvmf_add_ctrl (nvme_host_t h, nvme_ctrl_t c, const struct nvme_fabrics_config *cfg)
+
+ Connect a controller and update topology
+
+**Parameters**
+
+``nvme_host_t h``
+ Host to which the controller should be attached
+
+``nvme_ctrl_t c``
+ Controller to be connected
+
+``const struct nvme_fabrics_config *cfg``
+ Default configuration for the controller
+
+**Description**
+
+Issues a 'connect' command to the NVMe-oF controller and inserts **c**
+into the topology using **h** as parent.
+**c** must be initialized and not connected to the topology.
+
+**Return**
+
+0 on success; on failure errno is set and -1 is returned.
+
+
+.. c:function:: int nvmf_get_discovery_log (nvme_ctrl_t c, struct nvmf_discovery_log **logp, int max_retries)
+
+ Return the discovery log page
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Discover controller to use
+
+``struct nvmf_discovery_log **logp``
+ Pointer to the log page to be returned
+
+``int max_retries``
+ maximum number of log page entries to be returned
+
+**Return**
+
+0 on success; on failure -1 is returned and errno is set
+
+
+.. c:function:: char * nvmf_hostnqn_generate ()
+
+ Generate a machine specific host nqn
+
+**Parameters**
+
+**Return**
+
+An nvm namespace qualified name string based on the machine
+identifier, or NULL if not successful.
+
+
+.. c:function:: char * nvmf_hostnqn_from_file ()
+
+ Reads the host nvm qualified name from the config default location in /etc/nvme/
+
+**Parameters**
+
+**Return**
+
+The host nqn, or NULL if unsuccessful. If found, the caller
+is responsible to free the string.
+
+
+.. c:function:: char * nvmf_hostid_from_file ()
+
+ Reads the host identifier from the config default location in /etc/nvme/.
+
+**Parameters**
+
+**Return**
+
+The host identifier, or NULL if unsuccessful. If found, the caller
+ is responsible to free the string.
+
+
+.. c:function:: nvme_ctrl_t nvmf_connect_disc_entry (nvme_host_t h, struct nvmf_disc_log_entry *e, const struct nvme_fabrics_config *defcfg, bool *discover)
+
+ Connect controller based on the discovery log page entry
+
+**Parameters**
+
+``nvme_host_t h``
+ Host to which the controller should be connected
+
+``struct nvmf_disc_log_entry *e``
+ Discovery log page entry
+
+``const struct nvme_fabrics_config *defcfg``
+ Default configuration to be used for the new controller
+
+``bool *discover``
+ Set to 'true' if the new controller is a discovery controller
+
+**Return**
+
+Pointer to the new controller
+
+
+.. c:function:: bool nvmf_is_registration_supported (nvme_ctrl_t c)
+
+ check whether registration can be performed.
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Description**
+
+Only discovery controllers (DC) that comply with TP8010 support
+explicit registration with the DIM PDU. These can be identified by
+looking at the value of a dctype in the Identify command
+response. A value of 1 (DDC) or 2 (CDC) indicates that the DC
+supports explicit registration.
+
+**Return**
+
+true if controller supports explicit registration. false
+otherwise.
+
+
+.. c:function:: int nvmf_register_ctrl (nvme_ctrl_t c, enum nvmf_dim_tas tas, __u32 *result)
+
+ Perform registration task with a DC
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``enum nvmf_dim_tas tas``
+ Task field of the Command Dword 10 (cdw10). Indicates whether to
+ perform a Registration, Deregistration, or Registration-update.
+
+``__u32 *result``
+ The command-specific result returned by the DC upon command
+ completion.
+
+**Description**
+
+Perform registration task with a Discovery Controller (DC). Three
+tasks are supported: register, deregister, and registration update.
+
+**Return**
+
+0 on success; on failure -1 is returned and errno is set
+
+
diff --git a/doc/rst/filters.rst b/doc/rst/filters.rst
new file mode 100644
index 0000000..3e8c997
--- /dev/null
+++ b/doc/rst/filters.rst
@@ -0,0 +1,142 @@
+.. _filters.h:
+
+**filters.h**
+
+
+libnvme directory filter
+
+.. c:function:: int nvme_namespace_filter (const struct dirent *d)
+
+ Filter for namespaces
+
+**Parameters**
+
+``const struct dirent *d``
+ dirent to check
+
+**Return**
+
+1 if **d** matches, 0 otherwise
+
+
+.. c:function:: int nvme_paths_filter (const struct dirent *d)
+
+ Filter for paths
+
+**Parameters**
+
+``const struct dirent *d``
+ dirent to check
+
+**Return**
+
+1 if **d** matches, 0 otherwise
+
+
+.. c:function:: int nvme_ctrls_filter (const struct dirent *d)
+
+ Filter for controllers
+
+**Parameters**
+
+``const struct dirent *d``
+ dirent to check
+
+**Return**
+
+1 if **d** matches, 0 otherwise
+
+
+.. c:function:: int nvme_subsys_filter (const struct dirent *d)
+
+ Filter for subsystems
+
+**Parameters**
+
+``const struct dirent *d``
+ dirent to check
+
+**Return**
+
+1 if **d** matches, 0 otherwise
+
+
+.. c:function:: int nvme_scan_subsystems (struct dirent ***subsys)
+
+ Scan for subsystems
+
+**Parameters**
+
+``struct dirent ***subsys``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **subsys**
+
+
+.. c:function:: int nvme_scan_subsystem_namespaces (nvme_subsystem_t s, struct dirent ***ns)
+
+ Scan for namespaces in a subsystem
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ Subsystem to scan
+
+``struct dirent ***ns``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **ns**
+
+
+.. c:function:: int nvme_scan_ctrls (struct dirent ***ctrls)
+
+ Scan for controllers
+
+**Parameters**
+
+``struct dirent ***ctrls``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **ctrls**
+
+
+.. c:function:: int nvme_scan_ctrl_namespace_paths (nvme_ctrl_t c, struct dirent ***paths)
+
+ Scan for namespace paths in a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to scan
+
+``struct dirent ***paths``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **paths**
+
+
+.. c:function:: int nvme_scan_ctrl_namespaces (nvme_ctrl_t c, struct dirent ***ns)
+
+ Scan for namespaces in a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to scan
+
+``struct dirent ***ns``
+ Pointer to array of dirents
+
+**Return**
+
+number of entries in **ns**
+
+
diff --git a/doc/rst/ioctl.rst b/doc/rst/ioctl.rst
new file mode 100644
index 0000000..aaf6b55
--- /dev/null
+++ b/doc/rst/ioctl.rst
@@ -0,0 +1,4712 @@
+.. _ioctl.h:
+
+**ioctl.h**
+
+
+Linux NVMe ioctl interface functions
+
+
+
+.. c:struct:: nvme_passthru_cmd
+
+ nvme passthrough command structure
+
+**Definition**
+
+::
+
+ struct nvme_passthru_cmd {
+ __u8 opcode;
+ __u8 flags;
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 result;
+ };
+
+**Members**
+
+``opcode``
+ Operation code, see :c:type:`enum nvme_io_opcodes <nvme_io_opcodes>` and :c:type:`enum nvme_admin_opcodes <nvme_admin_opcodes>`
+
+``flags``
+ Not supported: intended for command flags (eg: SGL, FUSE)
+
+``rsvd1``
+ Reserved for future use
+
+``nsid``
+ Namespace Identifier, or Fabrics type
+
+``cdw2``
+ Command Dword 2 (no spec defined use)
+
+``cdw3``
+ Command Dword 3 (no spec defined use)
+
+``metadata``
+ User space address to metadata buffer (NULL if not used)
+
+``addr``
+ User space address to data buffer (NULL if not used)
+
+``metadata_len``
+ Metadata buffer transfer length
+
+``data_len``
+ Data buffer transfer length
+
+``cdw10``
+ Command Dword 10 (command specific)
+
+``cdw11``
+ Command Dword 11 (command specific)
+
+``cdw12``
+ Command Dword 12 (command specific)
+
+``cdw13``
+ Command Dword 13 (command specific)
+
+``cdw14``
+ Command Dword 14 (command specific)
+
+``cdw15``
+ Command Dword 15 (command specific)
+
+``timeout_ms``
+ If non-zero, overrides system default timeout in milliseconds
+
+``result``
+ Set on completion to the command's CQE DWORD 0 controller response
+
+
+
+
+
+.. c:struct:: nvme_passthru_cmd64
+
+ 64-bit nvme passthrough command structure
+
+**Definition**
+
+::
+
+ struct nvme_passthru_cmd64 {
+ __u8 opcode;
+ __u8 flags;
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 rsvd2;
+ __u64 result;
+ };
+
+**Members**
+
+``opcode``
+ Operation code, see :c:type:`enum nvme_io_opcodes <nvme_io_opcodes>` and :c:type:`enum nvme_admin_opcodes <nvme_admin_opcodes>`
+
+``flags``
+ Not supported: intended for command flags (eg: SGL, FUSE)
+
+``rsvd1``
+ Reserved for future use
+
+``nsid``
+ Namespace Identifier, or Fabrics type
+
+``cdw2``
+ Command Dword 2 (no spec defined use)
+
+``cdw3``
+ Command Dword 3 (no spec defined use)
+
+``metadata``
+ User space address to metadata buffer (NULL if not used)
+
+``addr``
+ User space address to data buffer (NULL if not used)
+
+``metadata_len``
+ Metadata buffer transfer length
+
+``data_len``
+ Data buffer transfer length
+
+``cdw10``
+ Command Dword 10 (command specific)
+
+``cdw11``
+ Command Dword 11 (command specific)
+
+``cdw12``
+ Command Dword 12 (command specific)
+
+``cdw13``
+ Command Dword 13 (command specific)
+
+``cdw14``
+ Command Dword 14 (command specific)
+
+``cdw15``
+ Command Dword 15 (command specific)
+
+``timeout_ms``
+ If non-zero, overrides system default timeout in milliseconds
+
+``rsvd2``
+ Reserved for future use (and fills an implicit struct pad
+
+``result``
+ Set on completion to the command's CQE DWORD 0-1 controller response
+
+
+
+
+
+.. c:struct:: nvme_uring_cmd
+
+ nvme uring command structure
+
+**Definition**
+
+::
+
+ struct nvme_uring_cmd {
+ __u8 opcode;
+ __u8 flags;
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 rsvd2;
+ };
+
+**Members**
+
+``opcode``
+ Operation code, see :c:type:`enum nvme_io_opcodes <nvme_io_opcodes>` and :c:type:`enum nvme_admin_opcodes <nvme_admin_opcodes>`
+
+``flags``
+ Not supported: intended for command flags (eg: SGL, FUSE)
+
+``rsvd1``
+ Reserved for future use
+
+``nsid``
+ Namespace Identifier, or Fabrics type
+
+``cdw2``
+ Command Dword 2 (no spec defined use)
+
+``cdw3``
+ Command Dword 3 (no spec defined use)
+
+``metadata``
+ User space address to metadata buffer (NULL if not used)
+
+``addr``
+ User space address to data buffer (NULL if not used)
+
+``metadata_len``
+ Metadata buffer transfer length
+
+``data_len``
+ Data buffer transfer length
+
+``cdw10``
+ Command Dword 10 (command specific)
+
+``cdw11``
+ Command Dword 11 (command specific)
+
+``cdw12``
+ Command Dword 12 (command specific)
+
+``cdw13``
+ Command Dword 13 (command specific)
+
+``cdw14``
+ Command Dword 14 (command specific)
+
+``cdw15``
+ Command Dword 15 (command specific)
+
+``timeout_ms``
+ If non-zero, overrides system default timeout in milliseconds
+
+``rsvd2``
+ Reserved for future use (and fills an implicit struct pad
+
+
+
+.. c:macro:: sizeof_args
+
+``sizeof_args (type, member, align)``
+
+ Helper function used to determine structure sizes
+
+**Parameters**
+
+``type``
+ Argument structure type
+
+``member``
+ Member inside the type
+
+``align``
+ Alignment information
+
+
+.. c:function:: int nvme_submit_admin_passthru64 (int fd, struct nvme_passthru_cmd64 *cmd, __u64 *result)
+
+ Submit a 64-bit nvme passthrough admin command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_passthru_cmd64 *cmd``
+ The nvme admin command to send
+
+``__u64 *result``
+ Optional field to return the result from the CQE DW0-1
+
+**Description**
+
+Uses NVME_IOCTL_ADMIN64_CMD for the ioctl request.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_admin_passthru64 (int fd, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u64 *result)
+
+ Submit a 64-bit nvme passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 opcode``
+ The nvme io command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command
+
+``void *metadata``
+ Pointer to user address of the metadata buffer
+
+``__u32 timeout_ms``
+ How long the kernel waits for the command to complete
+
+``__u64 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Parameterized form of nvme_submit_admin_passthru64(). This sets up and
+submits a :c:type:`struct nvme_passthru_cmd64 <nvme_passthru_cmd64>`.
+
+Known values for **opcode** are defined in :c:type:`enum nvme_admin_opcode <nvme_admin_opcode>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_submit_admin_passthru (int fd, struct nvme_passthru_cmd *cmd, __u32 *result)
+
+ Submit an nvme passthrough admin command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_passthru_cmd *cmd``
+ The nvme admin command to send
+
+``__u32 *result``
+ Optional field to return the result from the CQE DW0
+
+**Description**
+
+Uses NVME_IOCTL_ADMIN_CMD for the ioctl request.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_admin_passthru (int fd, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u32 *result)
+
+ Submit an nvme passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 opcode``
+ The nvme io command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command
+
+``void *metadata``
+ Pointer to user address of the metadata buffer
+
+``__u32 timeout_ms``
+ How long the kernel waits for the command to complete
+
+``__u32 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Parameterized form of nvme_submit_admin_passthru(). This sets up and
+submits a :c:type:`struct nvme_passthru_cmd <nvme_passthru_cmd>`.
+
+Known values for **opcode** are defined in :c:type:`enum nvme_admin_opcode <nvme_admin_opcode>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_submit_io_passthru64 (int fd, struct nvme_passthru_cmd64 *cmd, __u64 *result)
+
+ Submit a 64-bit nvme passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_passthru_cmd64 *cmd``
+ The nvme io command to send
+
+``__u64 *result``
+ Optional field to return the result from the CQE DW0-1
+
+**Description**
+
+Uses NVME_IOCTL_IO64_CMD for the ioctl request.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_io_passthru64 (int fd, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u64 *result)
+
+ Submit an nvme io passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 opcode``
+ The nvme io command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command
+
+``void *metadata``
+ Pointer to user address of the metadata buffer
+
+``__u32 timeout_ms``
+ How long the kernel waits for the command to complete
+
+``__u64 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Parameterized form of nvme_submit_io_passthru64(). This sets up and submits
+a :c:type:`struct nvme_passthru_cmd64 <nvme_passthru_cmd64>`.
+
+Known values for **opcode** are defined in :c:type:`enum nvme_io_opcode <nvme_io_opcode>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_submit_io_passthru (int fd, struct nvme_passthru_cmd *cmd, __u32 *result)
+
+ Submit an nvme passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_passthru_cmd *cmd``
+ The nvme io command to send
+
+``__u32 *result``
+ Optional field to return the result from the CQE DW0
+
+**Description**
+
+Uses NVME_IOCTL_IO_CMD for the ioctl request.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_io_passthru (int fd, __u8 opcode, __u8 flags, __u16 rsvd, __u32 nsid, __u32 cdw2, __u32 cdw3, __u32 cdw10, __u32 cdw11, __u32 cdw12, __u32 cdw13, __u32 cdw14, __u32 cdw15, __u32 data_len, void *data, __u32 metadata_len, void *metadata, __u32 timeout_ms, __u32 *result)
+
+ Submit an nvme io passthrough command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 opcode``
+ The nvme io command to send
+
+``__u8 flags``
+ NVMe command flags (not used)
+
+``__u16 rsvd``
+ Reserved for future use
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u32 cdw2``
+ Command dword 2
+
+``__u32 cdw3``
+ Command dword 3
+
+``__u32 cdw10``
+ Command dword 10
+
+``__u32 cdw11``
+ Command dword 11
+
+``__u32 cdw12``
+ Command dword 12
+
+``__u32 cdw13``
+ Command dword 13
+
+``__u32 cdw14``
+ Command dword 14
+
+``__u32 cdw15``
+ Command dword 15
+
+``__u32 data_len``
+ Length of the data transferred in this command in bytes
+
+``void *data``
+ Pointer to user address of the data buffer
+
+``__u32 metadata_len``
+ Length of metadata transferred in this command
+
+``void *metadata``
+ Pointer to user address of the metadata buffer
+
+``__u32 timeout_ms``
+ How long the kernel waits for the command to complete
+
+``__u32 *result``
+ Optional field to return the result from the CQE dword 0
+
+**Description**
+
+Parameterized form of nvme_submit_io_passthru(). This sets up and submits
+a :c:type:`struct nvme_passthru_cmd <nvme_passthru_cmd>`.
+
+Known values for **opcode** are defined in :c:type:`enum nvme_io_opcode <nvme_io_opcode>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_subsystem_reset (int fd)
+
+ Initiate a subsystem reset
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+**Description**
+
+This should only be sent to controller handles, not to namespaces.
+
+**Return**
+
+Zero if a subsystem reset was initiated or -1 with errno set
+otherwise.
+
+
+.. c:function:: int nvme_ctrl_reset (int fd)
+
+ Initiate a controller reset
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+**Description**
+
+This should only be sent to controller handles, not to namespaces.
+
+**Return**
+
+0 if a reset was initiated or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_rescan (int fd)
+
+ Initiate a controller rescan
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+**Description**
+
+This should only be sent to controller handles, not to namespaces.
+
+**Return**
+
+0 if a rescan was initiated or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_nsid (int fd, __u32 *nsid)
+
+ Retrieve the NSID from a namespace file descriptor
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme namespace
+
+``__u32 *nsid``
+ User pointer to namespace id
+
+**Description**
+
+This should only be sent to namespace handles, not to controllers. The
+kernel's interface returns the nsid as the return value. This is unfortunate
+for many architectures that are incapable of allowing distinguishing a
+namespace id > 0x80000000 from a negative error number.
+
+**Return**
+
+0 if **nsid** was set successfully or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify (struct nvme_identify_args *args)
+
+ Send the NVMe Identify command
+
+**Parameters**
+
+``struct nvme_identify_args *args``
+ :c:type:`struct nvme_identify_args <nvme_identify_args>` argument structure
+
+**Description**
+
+The Identify command returns a data buffer that describes information about
+the NVM subsystem, the controller or the namespace(s).
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ctrl (int fd, struct nvme_id_ctrl *id)
+
+ Retrieves nvme identify controller
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_ctrl *id``
+ User space destination address to transfer the data,
+
+**Description**
+
+Sends nvme identify with CNS value ``NVME_IDENTIFY_CNS_CTRL``.
+
+See :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>` for details on the data returned.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ns (int fd, __u32 nsid, struct nvme_id_ns *ns)
+
+ Retrieves nvme identify namespace
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace to identify
+
+``struct nvme_id_ns *ns``
+ User space destination address to transfer the data
+
+**Description**
+
+If the Namespace Identifier (NSID) field specifies an active NSID, then the
+Identify Namespace data structure is returned to the host for that specified
+namespace.
+
+If the controller supports the Namespace Management capability and the NSID
+field is set to ``NVME_NSID_ALL``, then the controller returns an Identify Namespace
+data structure that specifies capabilities that are common across namespaces
+for this controller.
+
+See :c:type:`struct nvme_id_ns <nvme_id_ns>` for details on the structure returned.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_allocated_ns (int fd, __u32 nsid, struct nvme_id_ns *ns)
+
+ Same as nvme_identify_ns, but only for allocated namespaces
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace to identify
+
+``struct nvme_id_ns *ns``
+ User space destination address to transfer the data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_active_ns_list (int fd, __u32 nsid, struct nvme_ns_list *list)
+
+ Retrieves active namespaces id list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``struct nvme_ns_list *list``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of 1024 namespace IDs is returned to the host containing NSIDs in
+increasing order that are greater than the value specified in the Namespace
+Identifier (nsid) field of the command.
+
+See :c:type:`struct nvme_ns_list <nvme_ns_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_allocated_ns_list (int fd, __u32 nsid, struct nvme_ns_list *list)
+
+ Retrieves allocated namespace id list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``struct nvme_ns_list *list``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of 1024 namespace IDs is returned to the host containing NSIDs in
+increasing order that are greater than the value specified in the Namespace
+Identifier (nsid) field of the command.
+
+See :c:type:`struct nvme_ns_list <nvme_ns_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ctrl_list (int fd, __u16 cntid, struct nvme_ctrl_list *cntlist)
+
+ Retrieves identify controller list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 cntid``
+ Starting CNTLID to return in the list
+
+``struct nvme_ctrl_list *cntlist``
+ User space destination address to transfer the data
+
+**Description**
+
+Up to 2047 controller identifiers is returned containing a controller
+identifier greater than or equal to the controller identifier specified in
+**cntid**.
+
+See :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>` for a definition of the structure returned.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_nsid_ctrl_list (int fd, __u32 nsid, __u16 cntid, struct nvme_ctrl_list *cntlist)
+
+ Retrieves controller list attached to an nsid
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return controllers that are attached to this nsid
+
+``__u16 cntid``
+ Starting CNTLID to return in the list
+
+``struct nvme_ctrl_list *cntlist``
+ User space destination address to transfer the data
+
+**Description**
+
+Up to 2047 controller identifiers are returned containing a controller
+identifier greater than or equal to the controller identifier specified in
+**cntid** attached to **nsid**.
+
+See :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>` for a definition of the structure returned.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1
+
+
+.. c:function:: int nvme_identify_ns_descs (int fd, __u32 nsid, struct nvme_ns_id_desc *descs)
+
+ Retrieves namespace descriptor list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ The namespace id to retrieve descriptors
+
+``struct nvme_ns_id_desc *descs``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of Namespace Identification Descriptor structures is returned to the
+host for the namespace specified in the Namespace Identifier (NSID) field if
+it is an active NSID.
+
+The data returned is in the form of an array of 'struct nvme_ns_id_desc'.
+
+See :c:type:`struct nvme_ns_id_desc <nvme_ns_id_desc>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_nvmset_list (int fd, __u16 nvmsetid, struct nvme_id_nvmset_list *nvmset)
+
+ Retrieves NVM Set List
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 nvmsetid``
+ NVM Set Identifier
+
+``struct nvme_id_nvmset_list *nvmset``
+ User space destination address to transfer the data
+
+**Description**
+
+Retrieves an NVM Set List, :c:type:`struct nvme_id_nvmset_list <nvme_id_nvmset_list>`. The data structure
+is an ordered list by NVM Set Identifier, starting with the first NVM Set
+Identifier supported by the NVM subsystem that is equal to or greater than
+the NVM Set Identifier.
+
+See :c:type:`struct nvme_id_nvmset_list <nvme_id_nvmset_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_primary_ctrl (int fd, __u16 cntid, struct nvme_primary_ctrl_cap *cap)
+
+ Retrieve NVMe Primary Controller identification
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 cntid``
+ Return controllers starting at this identifier
+
+``struct nvme_primary_ctrl_cap *cap``
+ User space destination buffer address to transfer the data
+
+**Description**
+
+See :c:type:`struct nvme_primary_ctrl_cap <nvme_primary_ctrl_cap>` for the definition of the returned structure, **cap**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_secondary_ctrl_list (int fd, __u32 nsid, __u16 cntid, struct nvme_secondary_ctrl_list *sc_list)
+
+ Retrieves secondary controller list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace identifier
+
+``__u16 cntid``
+ Return controllers starting at this identifier
+
+``struct nvme_secondary_ctrl_list *sc_list``
+ User space destination address to transfer the data
+
+**Description**
+
+A Secondary Controller List is returned to the host for up to 127 secondary
+controllers associated with the primary controller processing this command.
+The list contains entries for controller identifiers greater than or equal
+to the value specified in the Controller Identifier (cntid).
+
+See :c:type:`struct nvme_secondary_ctrls_list <nvme_secondary_ctrls_list>` for a definition of the returned
+structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ns_granularity (int fd, struct nvme_id_ns_granularity_list *gr_list)
+
+ Retrieves namespace granularity identification
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_ns_granularity_list *gr_list``
+ User space destination address to transfer the data
+
+**Description**
+
+If the controller supports reporting of Namespace Granularity, then a
+Namespace Granularity List is returned to the host for up to sixteen
+namespace granularity descriptors
+
+See :c:type:`struct nvme_id_ns_granularity_list <nvme_id_ns_granularity_list>` for the definition of the returned
+structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_uuid (int fd, struct nvme_id_uuid_list *uuid_list)
+
+ Retrieves device's UUIDs
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_uuid_list *uuid_list``
+ User space destination address to transfer the data
+
+**Description**
+
+Each UUID List entry is either 0h, the NVMe Invalid UUID, or a valid UUID.
+Valid UUIDs are those which are non-zero and are not the NVMe Invalid UUID.
+
+See :c:type:`struct nvme_id_uuid_list <nvme_id_uuid_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ns_csi (int fd, __u32 nsid, __u8 uuidx, enum nvme_csi csi, void *data)
+
+ I/O command set specific identify namespace data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace to identify
+
+``__u8 uuidx``
+ UUID Index for differentiating vendor specific encoding
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``void *data``
+ User space destination address to transfer the data
+
+**Description**
+
+An I/O Command Set specific Identify Namespace data structure is returned
+for the namespace specified in **nsid**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ctrl_csi (int fd, enum nvme_csi csi, void *data)
+
+ I/O command set specific Identify Controller data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``void *data``
+ User space destination address to transfer the data
+
+**Description**
+
+An I/O Command Set specific Identify Controller data structure is returned
+to the host for the controller processing the command. The specific Identify
+Controller data structure to be returned is specified by **csi**.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_active_ns_list_csi (int fd, __u32 nsid, enum nvme_csi csi, struct nvme_ns_list *ns_list)
+
+ Active namespace ID list associated with a specified I/O command set
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``struct nvme_ns_list *ns_list``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of 1024 namespace IDs is returned to the host containing active
+NSIDs in increasing order that are greater than the value specified in
+the Namespace Identifier (nsid) field of the command and matching the
+I/O Command Set specified in the **csi** argument.
+
+See :c:type:`struct nvme_ns_list <nvme_ns_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_allocated_ns_list_csi (int fd, __u32 nsid, enum nvme_csi csi, struct nvme_ns_list *ns_list)
+
+ Allocated namespace ID list associated with a specified I/O command set
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``struct nvme_ns_list *ns_list``
+ User space destination address to transfer the data
+
+**Description**
+
+A list of 1024 namespace IDs is returned to the host containing allocated
+NSIDs in increasing order that are greater than the value specified in
+the **nsid** field of the command and matching the I/O Command Set
+specified in the **csi** argument.
+
+See :c:type:`struct nvme_ns_list <nvme_ns_list>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_independent_identify_ns (int fd, __u32 nsid, struct nvme_id_independent_id_ns *ns)
+
+ I/O command set independent Identify namespace data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Return namespaces greater than this identifier
+
+``struct nvme_id_independent_id_ns *ns``
+ I/O Command Set Independent Identify Namespace data
+ structure
+
+**Description**
+
+The I/O command set independent Identify namespace data structure for
+the namespace identified with **ns** is returned to the host.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_ns_csi_user_data_format (int fd, __u16 user_data_format, __u8 uuidx, enum nvme_csi csi, void *data)
+
+ Identify namespace user data format
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 user_data_format``
+ Return namespaces capability of identifier
+
+``__u8 uuidx``
+ UUID selection, if supported
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``void *data``
+ User space destination address to transfer the data
+
+**Description**
+
+Identify Namespace data structure for the specified User Data Format
+index containing the namespace capabilities for the NVM Command Set.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_iocs_ns_csi_user_data_format (int fd, __u16 user_data_format, __u8 uuidx, enum nvme_csi csi, void *data)
+
+ Identify I/O command set namespace data structure
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 user_data_format``
+ Return namespaces capability of identifier
+
+``__u8 uuidx``
+ UUID selection, if supported
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``void *data``
+ User space destination address to transfer the data
+
+**Description**
+
+I/O Command Set specific Identify Namespace data structure for
+the specified User Data Format index containing the namespace
+capabilities for the I/O Command Set specified in the CSI field.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_nvm_identify_ctrl (int fd, struct nvme_id_ctrl_nvm *id)
+
+ Identify controller data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_ctrl_nvm *id``
+ User space destination address to transfer the data
+
+**Description**
+
+Return an identify controller data structure to the host of
+processing controller.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_domain_list (int fd, __u16 domid, struct nvme_id_domain_list *list)
+
+ Domain list data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 domid``
+ Domain ID
+
+``struct nvme_id_domain_list *list``
+ User space destination address to transfer data
+
+**Description**
+
+A list of 31 domain IDs is returned to the host containing domain
+attributes in increasing order that are greater than the value
+specified in the **domid** field.
+
+See :c:type:`struct nvme_identify_domain_attr <nvme_identify_domain_attr>` for the definition of the
+returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_endurance_group_list (int fd, __u16 endgrp_id, struct nvme_id_endurance_group_list *list)
+
+ Endurance group list data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 endgrp_id``
+ Endurance group identifier
+
+``struct nvme_id_endurance_group_list *list``
+ Array of endurance group identifiers
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_identify_iocs (int fd, __u16 cntlid, struct nvme_id_iocs *iocs)
+
+ I/O command set data structure
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 cntlid``
+ Controller ID
+
+``struct nvme_id_iocs *iocs``
+ User space destination address to transfer the data
+
+**Description**
+
+Retrieves list of the controller's supported io command set vectors. See
+:c:type:`struct nvme_id_iocs <nvme_id_iocs>`.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_identify_ns (int fd, __u32 nsid, struct nvme_zns_id_ns *data)
+
+ ZNS identify namespace data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace to identify
+
+``struct nvme_zns_id_ns *data``
+ User space destination address to transfer the data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_identify_ctrl (int fd, struct nvme_zns_id_ctrl *id)
+
+ ZNS identify controller data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_zns_id_ctrl *id``
+ User space destination address to transfer the data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log (struct nvme_get_log_args *args)
+
+ NVMe Admin Get Log command
+
+**Parameters**
+
+``struct nvme_get_log_args *args``
+ :c:type:`struct nvme_get_log_args <nvme_get_log_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_supported_log_pages (int fd, bool rae, struct nvme_supported_log_pages *log)
+
+ Retrieve nmve supported log pages
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_supported_log_pages *log``
+ Array of LID supported and Effects data structures
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_error (int fd, unsigned int nr_entries, bool rae, struct nvme_error_log_page *err_log)
+
+ Retrieve nvme error log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``unsigned int nr_entries``
+ Number of error log entries allocated
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_error_log_page *err_log``
+ Array of error logs of size 'entries'
+
+**Description**
+
+This log page describes extended error information for a command that
+completed with error, or may report an error that is not specific to a
+particular command.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_smart (int fd, __u32 nsid, bool rae, struct nvme_smart_log *smart_log)
+
+ Retrieve nvme smart log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Optional namespace identifier
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_smart_log *smart_log``
+ User address to store the smart log
+
+**Description**
+
+This log page provides SMART and general health information. The information
+provided is over the life of the controller and is retained across power
+cycles. To request the controller log page, the namespace identifier
+specified is FFFFFFFFh. The controller may also support requesting the log
+page on a per namespace basis, as indicated by bit 0 of the LPA field in the
+Identify Controller data structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_fw_slot (int fd, bool rae, struct nvme_firmware_slot *fw_log)
+
+ Retrieves the controller firmware log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_firmware_slot *fw_log``
+ User address to store the log page
+
+**Description**
+
+This log page describes the firmware revision stored in each firmware slot
+supported. The firmware revision is indicated as an ASCII string. The log
+page also indicates the active slot number.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_changed_ns_list (int fd, bool rae, struct nvme_ns_list *ns_log)
+
+ Retrieve namespace changed list
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_ns_list *ns_log``
+ User address to store the log page
+
+**Description**
+
+This log page describes namespaces attached to this controller that have
+changed since the last time the namespace was identified, been added, or
+deleted.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_cmd_effects (int fd, enum nvme_csi csi, struct nvme_cmd_effects_log *effects_log)
+
+ Retrieve nvme command effects log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_csi csi``
+ Command Set Identifier
+
+``struct nvme_cmd_effects_log *effects_log``
+ User address to store the effects log
+
+**Description**
+
+This log page describes the commands that the controller supports and the
+effects of those commands on the state of the NVM subsystem.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_device_self_test (int fd, struct nvme_self_test_log *log)
+
+ Retrieve the device self test log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_self_test_log *log``
+ Userspace address of the log payload
+
+**Description**
+
+The log page indicates the status of an in progress self test and the
+percent complete of that operation, and the results of the previous 20
+self-test operations.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_create_telemetry_host (int fd, struct nvme_telemetry_log *log)
+
+ Create host telemetry log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_telemetry_log *log``
+ Userspace address of the log payload
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_telemetry_host (int fd, __u64 offset, __u32 len, void *log)
+
+ Get Telemetry Host-Initiated log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u64 offset``
+ Offset into the telemetry data
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Description**
+
+Retrieves the Telemetry Host-Initiated log page at the requested offset
+using the previously existing capture.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_telemetry_ctrl (int fd, bool rae, __u64 offset, __u32 len, void *log)
+
+ Get Telemetry Controller-Initiated log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset into the telemetry data
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Description**
+
+Retrieves the Telemetry Controller-Initiated log page at the requested offset
+using the previously existing capture.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_endurance_group (int fd, __u16 endgid, struct nvme_endurance_group_log *log)
+
+ Get Endurance Group log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 endgid``
+ Starting group identifier to return in the list
+
+``struct nvme_endurance_group_log *log``
+ User address to store the endurance log
+
+**Description**
+
+This log page indicates if an Endurance Group Event has occurred for a
+particular Endurance Group. If an Endurance Group Event has occurred, the
+details of the particular event are included in the Endurance Group
+Information log page for that Endurance Group. An asynchronous event is
+generated when an entry for an Endurance Group is newly added to this log
+page.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_predictable_lat_nvmset (int fd, __u16 nvmsetid, struct nvme_nvmset_predictable_lat_log *log)
+
+ Predictable Latency Per NVM Set
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 nvmsetid``
+ NVM set id
+
+``struct nvme_nvmset_predictable_lat_log *log``
+ User address to store the predictable latency log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_predictable_lat_event (int fd, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Predictable Latency Event Aggregate Log Page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset into the predictable latency event
+
+``__u32 len``
+ Length of provided user buffer to hold the log data in bytes
+
+``void *log``
+ User address for log page data
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_ana (int fd, enum nvme_log_ana_lsp lsp, bool rae, __u64 offset, __u32 len, void *log)
+
+ Retrieve Asymmetric Namespace Access log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_log_ana_lsp lsp``
+ Log specific, see :c:type:`enum nvme_get_log_ana_lsp <nvme_get_log_ana_lsp>`
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the ana log
+
+**Description**
+
+This log consists of a header describing the log and descriptors containing
+the asymmetric namespace access information for ANA Groups that contain
+namespaces that are attached to the controller processing the command.
+
+See :c:type:`struct nvme_ana_rsp_hdr <nvme_ana_rsp_hdr>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_ana_groups (int fd, bool rae, __u32 len, struct nvme_ana_group_desc *log)
+
+ Retrieve Asymmetric Namespace Access groups only log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 len``
+ The allocated length of the log page
+
+``struct nvme_ana_group_desc *log``
+ User address to store the ana group log
+
+**Description**
+
+See :c:type:`struct nvme_ana_group_desc <nvme_ana_group_desc>` for the definition of the returned structure.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_lba_status (int fd, bool rae, __u64 offset, __u32 len, void *log)
+
+ Retrieve LBA Status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u64 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_endurance_grp_evt (int fd, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Rotational Media Information
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset to the start of the log page
+
+``__u32 len``
+ The allocated length of the log page
+
+``void *log``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_fid_supported_effects (int fd, bool rae, struct nvme_fid_supported_effects_log *log)
+
+ Retrieve Feature Identifiers Supported and Effects
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_fid_supported_effects_log *log``
+ FID Supported and Effects data structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_mi_cmd_supported_effects (int fd, bool rae, struct nvme_mi_cmd_supported_effects_log *log)
+
+ displays the MI Commands Supported by the controller
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_mi_cmd_supported_effects_log *log``
+ MI Command Supported and Effects data structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_boot_partition (int fd, bool rae, __u8 lsp, __u32 len, struct nvme_boot_partition *part)
+
+ Retrieve Boot Partition
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u8 lsp``
+ The log specified field of LID
+
+``__u32 len``
+ The allocated size, minimum
+ struct nvme_boot_partition
+
+``struct nvme_boot_partition *part``
+ User address to store the log page
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_discovery (int fd, bool rae, __u32 offset, __u32 len, void *log)
+
+ Retrieve Discovery log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``__u32 offset``
+ Offset of this log to retrieve
+
+``__u32 len``
+ The allocated size for this portion of the log
+
+``void *log``
+ User address to store the discovery log
+
+**Description**
+
+Supported only by fabrics discovery controllers, returning discovery
+records.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_media_unit_stat (int fd, __u16 domid, struct nvme_media_unit_stat_log *mus)
+
+ Retrieve Media Unit Status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 domid``
+ Domain Identifier selection, if supported
+
+``struct nvme_media_unit_stat_log *mus``
+ User address to store the Media Unit statistics log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_support_cap_config_list (int fd, __u16 domid, struct nvme_supported_cap_config_list_log *cap)
+
+ Retrieve Supported Capacity Configuration List
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 domid``
+ Domain Identifier selection, if supported
+
+``struct nvme_supported_cap_config_list_log *cap``
+ User address to store supported capabilities config list
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_reservation (int fd, bool rae, struct nvme_resv_notification_log *log)
+
+ Retrieve Reservation Notification
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_resv_notification_log *log``
+ User address to store the reservation log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise
+
+
+.. c:function:: int nvme_get_log_sanitize (int fd, bool rae, struct nvme_sanitize_log_page *log)
+
+ Retrieve Sanitize Status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_sanitize_log_page *log``
+ User address to store the sanitize log
+
+**Description**
+
+The Sanitize Status log page reports sanitize operation time estimates and
+information about the most recent sanitize operation.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_zns_changed_zones (int fd, __u32 nsid, bool rae, struct nvme_zns_changed_zone_log *log)
+
+ Retrieve list of zones that have changed
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_zns_changed_zone_log *log``
+ User address to store the changed zone log
+
+**Description**
+
+The list of zones that have changed state due to an exceptional event.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_persistent_event (int fd, enum nvme_pevent_log_action action, __u32 size, void *pevent_log)
+
+ Retrieve Persistent Event Log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_pevent_log_action action``
+ Action the controller should take during processing this command
+
+``__u32 size``
+ Size of **pevent_log**
+
+``void *pevent_log``
+ User address to store the persistent event log
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features (struct nvme_set_features_args *args)
+
+ Set a feature attribute
+
+**Parameters**
+
+``struct nvme_set_features_args *args``
+ :c:type:`struct nvme_set_features_args <nvme_set_features_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_data (int fd, __u8 fid, __u32 nsid, __u32 cdw11, bool save, __u32 data_len, void *data, __u32 *result)
+
+ Helper function for **nvme_set_features\(\)**
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable
+
+``__u32 cdw11``
+ Value to set the feature to
+
+``bool save``
+ Save value across power states
+
+``__u32 data_len``
+ Length of feature data, if applicable, in bytes
+
+``void *data``
+ User address of feature data, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_simple (int fd, __u8 fid, __u32 nsid, __u32 cdw11, bool save, __u32 *result)
+
+ Helper function for **nvme_set_features\(\)**
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable
+
+``__u32 cdw11``
+ Value to set the feature to
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_arbitration (int fd, __u8 ab, __u8 lpw, __u8 mpw, __u8 hpw, bool save, __u32 *result)
+
+ Set arbitration features
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 ab``
+ Arbitration Burst
+
+``__u8 lpw``
+ Low Priority Weight
+
+``__u8 mpw``
+ Medium Priority Weight
+
+``__u8 hpw``
+ High Priority Weight
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_power_mgmt (int fd, __u8 ps, __u8 wh, bool save, __u32 *result)
+
+ Set power management feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 ps``
+ Power State
+
+``__u8 wh``
+ Workload Hint
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_lba_range (int fd, __u32 nsid, __u32 nr_ranges, bool save, struct nvme_lba_range_type *data, __u32 *result)
+
+ Set LBA range feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u32 nr_ranges``
+ Number of ranges in **data**
+
+``bool save``
+ Save value across power states
+
+``struct nvme_lba_range_type *data``
+ User address of feature data
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_temp_thresh (int fd, __u16 tmpth, __u8 tmpsel, enum nvme_feat_tmpthresh_thsel thsel, bool save, __u32 *result)
+
+ Set temperature threshold feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 tmpth``
+ Temperature Threshold
+
+``__u8 tmpsel``
+ Threshold Temperature Select
+
+``enum nvme_feat_tmpthresh_thsel thsel``
+ Threshold Type Select
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_err_recovery (int fd, __u32 nsid, __u16 tler, bool dulbe, bool save, __u32 *result)
+
+ Set error recovery feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u16 tler``
+ Time-limited error recovery value
+
+``bool dulbe``
+ Deallocated or Unwritten Logical Block Error Enable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_volatile_wc (int fd, bool wce, bool save, __u32 *result)
+
+ Set volatile write cache feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool wce``
+ Write cache enable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_irq_coalesce (int fd, __u8 thr, __u8 time, bool save, __u32 *result)
+
+ Set IRQ coalesce feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 thr``
+ Aggregation Threshold
+
+``__u8 time``
+ Aggregation Time
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_irq_config (int fd, __u16 iv, bool cd, bool save, __u32 *result)
+
+ Set IRQ config feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 iv``
+ Interrupt Vector
+
+``bool cd``
+ Coalescing Disable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_write_atomic (int fd, bool dn, bool save, __u32 *result)
+
+ Set write atomic feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool dn``
+ Disable Normal
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_async_event (int fd, __u32 events, bool save, __u32 *result)
+
+ Set asynchronous event feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 events``
+ Events to enable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_auto_pst (int fd, bool apste, bool save, struct nvme_feat_auto_pst *apst, __u32 *result)
+
+ Set autonomous power state feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool apste``
+ Autonomous Power State Transition Enable
+
+``bool save``
+ Save value across power states
+
+``struct nvme_feat_auto_pst *apst``
+ Autonomous Power State Transition
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_timestamp (int fd, bool save, __u64 timestamp)
+
+ Set timestamp feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool save``
+ Save value across power states
+
+``__u64 timestamp``
+ The current timestamp value to assign to this feature
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_hctm (int fd, __u16 tmt2, __u16 tmt1, bool save, __u32 *result)
+
+ Set thermal management feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 tmt2``
+ Thermal Management Temperature 2
+
+``__u16 tmt1``
+ Thermal Management Temperature 1
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_nopsc (int fd, bool noppme, bool save, __u32 *result)
+
+ Set non-operational power state feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool noppme``
+ Non-Operational Power State Permissive Mode Enable
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_rrl (int fd, __u8 rrl, __u16 nvmsetid, bool save, __u32 *result)
+
+ Set read recovery level feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 rrl``
+ Read recovery level setting
+
+``__u16 nvmsetid``
+ NVM set id
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_plm_config (int fd, bool enable, __u16 nvmsetid, bool save, struct nvme_plm_config *data, __u32 *result)
+
+ Set predictable latency feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool enable``
+ Predictable Latency Enable
+
+``__u16 nvmsetid``
+ NVM Set Identifier
+
+``bool save``
+ Save value across power states
+
+``struct nvme_plm_config *data``
+ Pointer to structure nvme_plm_config
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_plm_window (int fd, enum nvme_feat_plm_window_select sel, __u16 nvmsetid, bool save, __u32 *result)
+
+ Set window select feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_feat_plm_window_select sel``
+ Window Select
+
+``__u16 nvmsetid``
+ NVM Set Identifier
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_lba_sts_interval (int fd, __u16 lsiri, __u16 lsipi, bool save, __u32 *result)
+
+ Set LBA status information feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 lsiri``
+ LBA Status Information Report Interval
+
+``__u16 lsipi``
+ LBA Status Information Poll Interval
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_host_behavior (int fd, bool save, struct nvme_feat_host_behavior *data)
+
+ Set host behavior feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool save``
+ Save value across power states
+
+``struct nvme_feat_host_behavior *data``
+ Pointer to structure nvme_feat_host_behavior
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_sanitize (int fd, bool nodrm, bool save, __u32 *result)
+
+ Set sanitize feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool nodrm``
+ No-Deallocate Response Mode
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_endurance_evt_cfg (int fd, __u16 endgid, __u8 egwarn, bool save, __u32 *result)
+
+ Set endurance event config feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u16 endgid``
+ Endurance Group Identifier
+
+``__u8 egwarn``
+ Flags to enable warning, see :c:type:`enum nvme_eg_critical_warning_flags <nvme_eg_critical_warning_flags>`
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_sw_progress (int fd, __u8 pbslc, bool save, __u32 *result)
+
+ Set pre-boot software load count feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u8 pbslc``
+ Pre-boot Software Load Count
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_host_id (int fd, bool exhid, bool save, __u8 *hostid)
+
+ Set enable extended host identifers feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool exhid``
+ Enable Extended Host Identifier
+
+``bool save``
+ Save value across power states
+
+``__u8 *hostid``
+ Host ID to set
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_resv_mask (int fd, __u32 mask, bool save, __u32 *result)
+
+ Set reservation notification mask feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 mask``
+ Reservation Notification Mask Field
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_resv_persist (int fd, bool ptpl, bool save, __u32 *result)
+
+ Set persist through power loss feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool ptpl``
+ Persist Through Power Loss
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_features_write_protect (int fd, enum nvme_feat_nswpcfg_state state, bool save, __u32 *result)
+
+ Set write protect feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_feat_nswpcfg_state state``
+ Write Protection State
+
+``bool save``
+ Save value across power states
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features (struct nvme_get_features_args *args)
+
+ Retrieve a feature attribute
+
+**Parameters**
+
+``struct nvme_get_features_args *args``
+ :c:type:`struct nvme_get_features_args <nvme_get_features_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_data (int fd, enum nvme_features_id fid, __u32 nsid, __u32 data_len, void *data, __u32 *result)
+
+ Helper function for **nvme_get_features\(\)**
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_features_id fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable
+
+``__u32 data_len``
+ Length of feature data, if applicable, in bytes
+
+``void *data``
+ User address of feature data, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_simple (int fd, enum nvme_features_id fid, __u32 nsid, __u32 *result)
+
+ Helper function for **nvme_get_features\(\)**
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_features_id fid``
+ Feature identifier
+
+``__u32 nsid``
+ Namespace ID, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_arbitration (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get arbitration feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_power_mgmt (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get power management feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_lba_range (int fd, enum nvme_get_features_sel sel, struct nvme_lba_range_type *data, __u32 *result)
+
+ Get LBA range feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``struct nvme_lba_range_type *data``
+ User address of feature data, if applicable
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_temp_thresh (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get temperature threshold feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_err_recovery (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get error recovery feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_volatile_wc (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get volatile write cache feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_num_queues (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get number of queues feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_irq_coalesce (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get IRQ coalesce feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_irq_config (int fd, enum nvme_get_features_sel sel, __u16 iv, __u32 *result)
+
+ Get IRQ config feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u16 iv``
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_write_atomic (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get write atomic feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_async_event (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get asynchronous event feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_auto_pst (int fd, enum nvme_get_features_sel sel, struct nvme_feat_auto_pst *apst, __u32 *result)
+
+ Get autonomous power state feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``struct nvme_feat_auto_pst *apst``
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_host_mem_buf (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get host memory buffer feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_timestamp (int fd, enum nvme_get_features_sel sel, struct nvme_timestamp *ts)
+
+ Get timestamp feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``struct nvme_timestamp *ts``
+ Current timestamp
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_kato (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get keep alive timeout feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_hctm (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get thermal management feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_nopsc (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get non-operational power state feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_rrl (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get read recovery level feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_plm_config (int fd, enum nvme_get_features_sel sel, __u16 nvmsetid, struct nvme_plm_config *data, __u32 *result)
+
+ Get predictable latency feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u16 nvmsetid``
+ NVM set id
+
+``struct nvme_plm_config *data``
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_plm_window (int fd, enum nvme_get_features_sel sel, __u16 nvmsetid, __u32 *result)
+
+ Get window select feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u16 nvmsetid``
+ NVM set id
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_lba_sts_interval (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get LBA status information feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_host_behavior (int fd, enum nvme_get_features_sel sel, struct nvme_feat_host_behavior *data, __u32 *result)
+
+ Get host behavior feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``struct nvme_feat_host_behavior *data``
+ Pointer to structure nvme_feat_host_behavior
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_sanitize (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get sanitize feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_endurance_event_cfg (int fd, enum nvme_get_features_sel sel, __u16 endgid, __u32 *result)
+
+ Get endurance event config feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u16 endgid``
+ Endurance Group Identifier
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_sw_progress (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get software progress feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_host_id (int fd, enum nvme_get_features_sel sel, bool exhid, __u32 len, __u8 *hostid)
+
+ Get host id feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``bool exhid``
+ Enable Extended Host Identifier
+
+``__u32 len``
+ Length of **hostid**
+
+``__u8 *hostid``
+ Buffer for returned host ID
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_resv_mask (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get reservation mask feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_resv_persist (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get reservation persist feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_write_protect (int fd, __u32 nsid, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get write protect feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_features_iocs_profile (int fd, enum nvme_get_features_sel sel, __u32 *result)
+
+ Get IOCS profile feature
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``enum nvme_get_features_sel sel``
+ Select which type of attribute to return, see :c:type:`enum nvme_get_features_sel <nvme_get_features_sel>`
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_format_nvm (struct nvme_format_nvm_args *args)
+
+ Format nvme namespace(s)
+
+**Parameters**
+
+``struct nvme_format_nvm_args *args``
+ :c:type:`struct nvme_format_nvme_args <nvme_format_nvme_args>` argument structure
+
+**Description**
+
+The Format NVM command low level formats the NVM media. This command is used
+by the host to change the LBA data size and/or metadata size. A low level
+format may destroy all data and metadata associated with all namespaces or
+only the specific namespace associated with the command
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_mgmt (struct nvme_ns_mgmt_args *args)
+
+ Issue a Namespace management command
+
+**Parameters**
+
+``struct nvme_ns_mgmt_args *args``
+ :c:type:`struct nvme_ns_mgmt_args <nvme_ns_mgmt_args>` Argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_mgmt_create (int fd, struct nvme_id_ns *ns, __u32 *nsid, __u32 timeout, __u8 csi)
+
+ Create a non attached namespace
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_id_ns *ns``
+ Namespace identification that defines ns creation parameters
+
+``__u32 *nsid``
+ On success, set to the namespace id that was created
+
+``__u32 timeout``
+ Override the default timeout to this value in milliseconds;
+ set to 0 to use the system default.
+
+``__u8 csi``
+ Command Set Identifier
+
+**Description**
+
+On successful creation, the namespace exists in the subsystem, but is not
+attached to any controller. Use the nvme_ns_attach_ctrls() to assign the
+namespace to one or more controllers.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_mgmt_delete (int fd, __u32 nsid)
+
+ Delete a non attached namespace
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace identifier to delete
+
+**Description**
+
+It is recommended that a namespace being deleted is not attached to any
+controller. Use the nvme_ns_detach_ctrls() first if the namespace is still
+attached.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_attach (struct nvme_ns_attach_args *args)
+
+ Attach or detach namespace to controller(s)
+
+**Parameters**
+
+``struct nvme_ns_attach_args *args``
+ :c:type:`struct nvme_ns_attach_args <nvme_ns_attach_args>` Argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_attach_ctrls (int fd, __u32 nsid, struct nvme_ctrl_list *ctrlist)
+
+ Attach namespace to controllers
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID to attach
+
+``struct nvme_ctrl_list *ctrlist``
+ Controller list to modify attachment state of nsid
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_ns_detach_ctrls (int fd, __u32 nsid, struct nvme_ctrl_list *ctrlist)
+
+ Detach namespace from controllers
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID to detach
+
+``struct nvme_ctrl_list *ctrlist``
+ Controller list to modify attachment state of nsid
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_fw_download (struct nvme_fw_download_args *args)
+
+ Download part or all of a firmware image to the controller
+
+**Parameters**
+
+``struct nvme_fw_download_args *args``
+ :c:type:`struct nvme_fw_download_args <nvme_fw_download_args>` argument structure
+
+**Description**
+
+The Firmware Image Download command downloads all or a portion of an image
+for a future update to the controller. The Firmware Image Download command
+downloads a new image (in whole or in part) to the controller.
+
+The image may be constructed of multiple pieces that are individually
+downloaded with separate Firmware Image Download commands. Each Firmware
+Image Download command includes a Dword Offset and Number of Dwords that
+specify a dword range.
+
+The new firmware image is not activated as part of the Firmware Image
+Download command. Use the nvme_fw_commit() to activate a newly downloaded
+image.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_fw_commit (struct nvme_fw_commit_args *args)
+
+ Commit firmware using the specified action
+
+**Parameters**
+
+``struct nvme_fw_commit_args *args``
+ :c:type:`struct nvme_fw_commit_args <nvme_fw_commit_args>` argument structure
+
+**Description**
+
+The Firmware Commit command modifies the firmware image or Boot Partitions.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise. The command
+status response may specify additional reset actions required to complete
+the commit process.
+
+
+.. c:function:: int nvme_security_send (struct nvme_security_send_args *args)
+
+ Security Send command
+
+**Parameters**
+
+``struct nvme_security_send_args *args``
+ :c:type:`struct nvme_security_send <nvme_security_send>` argument structure
+
+**Description**
+
+The Security Send command transfers security protocol data to the
+controller. The data structure transferred to the controller as part of this
+command contains security protocol specific commands to be performed by the
+controller. The data structure transferred may also contain data or
+parameters associated with the security protocol commands.
+
+The security data is protocol specific and is not defined by the NVMe
+specification.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_security_receive (struct nvme_security_receive_args *args)
+
+ Security Receive command
+
+**Parameters**
+
+``struct nvme_security_receive_args *args``
+ :c:type:`struct nvme_security_receive <nvme_security_receive>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_lba_status (struct nvme_get_lba_status_args *args)
+
+ Retrieve information on possibly unrecoverable LBAs
+
+**Parameters**
+
+``struct nvme_get_lba_status_args *args``
+ :c:type:`struct nvme_get_lba_status_args <nvme_get_lba_status_args>` argument structure
+
+**Description**
+
+The Get LBA Status command requests information about Potentially
+Unrecoverable LBAs. Refer to the specification for action type descriptions.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_send (struct nvme_directive_send_args *args)
+
+ Send directive command
+
+**Parameters**
+
+``struct nvme_directive_send_args *args``
+ :c:type:`struct nvme_directive_send_args <nvme_directive_send_args>` argument structure
+
+**Description**
+
+Directives is a mechanism to enable host and NVM subsystem or controller
+information exchange. The Directive Send command transfers data related to a
+specific Directive Type from the host to the controller.
+
+See the NVMe specification for more information.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_send_id_endir (int fd, __u32 nsid, bool endir, enum nvme_directive_dtype dtype, struct nvme_id_directives *id)
+
+ Directive Send Enable Directive
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace Identifier
+
+``bool endir``
+ Enable Directive
+
+``enum nvme_directive_dtype dtype``
+ Directive Type
+
+``struct nvme_id_directives *id``
+ Pointer to structure nvme_id_directives
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_send_stream_release_identifier (int fd, __u32 nsid, __u16 stream_id)
+
+ Directive Send Stream release
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u16 stream_id``
+ Stream identifier
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_send_stream_release_resource (int fd, __u32 nsid)
+
+ Directive Send Stream release resources
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv (struct nvme_directive_recv_args *args)
+
+ Receive directive specific data
+
+**Parameters**
+
+``struct nvme_directive_recv_args *args``
+ :c:type:`struct nvme_directive_recv_args <nvme_directive_recv_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv_identify_parameters (int fd, __u32 nsid, struct nvme_id_directives *id)
+
+ Directive receive identifier parameters
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``struct nvme_id_directives *id``
+ Identify parameters buffer
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv_stream_parameters (int fd, __u32 nsid, struct nvme_streams_directive_params *parms)
+
+ Directive receive stream parameters
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``struct nvme_streams_directive_params *parms``
+ Streams directive parameters buffer
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv_stream_status (int fd, __u32 nsid, unsigned int nr_entries, struct nvme_streams_directive_status *id)
+
+ Directive receive stream status
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``unsigned int nr_entries``
+ Number of streams to receive
+
+``struct nvme_streams_directive_status *id``
+ Stream status buffer
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_directive_recv_stream_allocate (int fd, __u32 nsid, __u16 nsr, __u32 *result)
+
+ Directive receive stream allocate
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u16 nsr``
+ Namespace Streams Requested
+
+``__u32 *result``
+ If successful, the CQE dword0 value
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_capacity_mgmt (struct nvme_capacity_mgmt_args *args)
+
+ Capacity management command
+
+**Parameters**
+
+``struct nvme_capacity_mgmt_args *args``
+ :c:type:`struct nvme_capacity_mgmt_args <nvme_capacity_mgmt_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_lockdown (struct nvme_lockdown_args *args)
+
+ Issue lockdown command
+
+**Parameters**
+
+``struct nvme_lockdown_args *args``
+ :c:type:`struct nvme_lockdown_args <nvme_lockdown_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_set_property (struct nvme_set_property_args *args)
+
+ Set controller property
+
+**Parameters**
+
+``struct nvme_set_property_args *args``
+ :c:type:`struct nvme_set_property_args <nvme_set_property_args>` argument structure
+
+**Description**
+
+This is an NVMe-over-Fabrics specific command, not applicable to PCIe. These
+properties align to the PCI MMIO controller registers.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_property (struct nvme_get_property_args *args)
+
+ Get a controller property
+
+**Parameters**
+
+``struct nvme_get_property_args *args``
+ :c:type:`struct nvme_get_propert_args <nvme_get_propert_args>` argument structure
+
+**Description**
+
+This is an NVMe-over-Fabrics specific command, not applicable to PCIe. These
+properties align to the PCI MMIO controller registers.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_sanitize_nvm (struct nvme_sanitize_nvm_args *args)
+
+ Start a sanitize operation
+
+**Parameters**
+
+``struct nvme_sanitize_nvm_args *args``
+ :c:type:`struct nvme_sanitize_nvm_args <nvme_sanitize_nvm_args>` argument structure
+
+**Description**
+
+A sanitize operation alters all user data in the NVM subsystem such that
+recovery of any previous user data from any cache, the non-volatile media,
+or any Controller Memory Buffer is not possible.
+
+The Sanitize command starts a sanitize operation or to recover from a
+previously failed sanitize operation. The sanitize operation types that may
+be supported are Block Erase, Crypto Erase, and Overwrite. All sanitize
+operations are processed in the background, i.e., completion of the sanitize
+command does not indicate completion of the sanitize operation.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_dev_self_test (struct nvme_dev_self_test_args *args)
+
+ Start or abort a self test
+
+**Parameters**
+
+``struct nvme_dev_self_test_args *args``
+ :c:type:`struct nvme_dev_self_test <nvme_dev_self_test>` argument structure
+
+**Description**
+
+The Device Self-test command starts a device self-test operation or abort a
+device self-test operation. A device self-test operation is a diagnostic
+testing sequence that tests the integrity and functionality of the
+controller and may include testing of the media associated with namespaces.
+The controller may return a response to this command immediately while
+running the self-test in the background.
+
+Set the 'nsid' field to 0 to not include namepsaces in the test. Set to
+0xffffffff to test all namespaces. All other values tests a specific
+namespace, if present.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_virtual_mgmt (struct nvme_virtual_mgmt_args *args)
+
+ Virtualization resource management
+
+**Parameters**
+
+``struct nvme_virtual_mgmt_args *args``
+ :c:type:`struct nvme_virtual_mgmt_args <nvme_virtual_mgmt_args>` argument structure
+
+**Description**
+
+The Virtualization Management command is supported by primary controllers
+that support the Virtualization Enhancements capability. This command is
+used for several functions:
+
+ - Modifying Flexible Resource allocation for the primary controller
+ - Assigning Flexible Resources for secondary controllers
+ - Setting the Online and Offline state for secondary controllers
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_flush (int fd, __u32 nsid)
+
+ Send an nvme flush command
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace identifier
+
+**Description**
+
+The Flush command requests that the contents of volatile write cache be made
+non-volatile.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_io (struct nvme_io_args *args, __u8 opcode)
+
+ Submit an nvme user I/O command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+``__u8 opcode``
+ Opcode to execute
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_read (struct nvme_io_args *args)
+
+ Submit an nvme user read command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_write (struct nvme_io_args *args)
+
+ Submit an nvme user write command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_compare (struct nvme_io_args *args)
+
+ Submit an nvme user compare command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_write_zeros (struct nvme_io_args *args)
+
+ Submit an nvme write zeroes command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Description**
+
+The Write Zeroes command sets a range of logical blocks to zero. After
+successful completion of this command, the value returned by subsequent
+reads of logical blocks in this range shall be all bytes cleared to 0h until
+a write occurs to this LBA range.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_write_uncorrectable (struct nvme_io_args *args)
+
+ Submit an nvme write uncorrectable command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Description**
+
+The Write Uncorrectable command marks a range of logical blocks as invalid.
+When the specified logical block(s) are read after this operation, a failure
+is returned with Unrecovered Read Error status. To clear the invalid logical
+block status, a write operation on those logical blocks is required.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_verify (struct nvme_io_args *args)
+
+ Send an nvme verify command
+
+**Parameters**
+
+``struct nvme_io_args *args``
+ :c:type:`struct nvme_io_args <nvme_io_args>` argument structure
+
+**Description**
+
+The Verify command verifies integrity of stored information by reading data
+and metadata, if applicable, for the LBAs indicated without transferring any
+data or metadata to the host.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_dsm (struct nvme_dsm_args *args)
+
+ Send an nvme data set management command
+
+**Parameters**
+
+``struct nvme_dsm_args *args``
+ :c:type:`struct nvme_dsm_args <nvme_dsm_args>` argument structure
+
+**Description**
+
+The Dataset Management command is used by the host to indicate attributes
+for ranges of logical blocks. This includes attributes like frequency that
+data is read or written, access size, and other information that may be used
+to optimize performance and reliability, and may be used to
+deallocate/unmap/trim those logical blocks.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_copy (struct nvme_copy_args *args)
+
+ Copy command
+
+**Parameters**
+
+``struct nvme_copy_args *args``
+ :c:type:`struct nvme_copy_args <nvme_copy_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_resv_acquire (struct nvme_resv_acquire_args *args)
+
+ Send an nvme reservation acquire
+
+**Parameters**
+
+``struct nvme_resv_acquire_args *args``
+ :c:type:`struct nvme_resv_acquire <nvme_resv_acquire>` argument structure
+
+**Description**
+
+The Reservation Acquire command acquires a reservation on a namespace,
+preempt a reservation held on a namespace, and abort a reservation held on a
+namespace.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_resv_register (struct nvme_resv_register_args *args)
+
+ Send an nvme reservation register
+
+**Parameters**
+
+``struct nvme_resv_register_args *args``
+ :c:type:`struct nvme_resv_register_args <nvme_resv_register_args>` argument structure
+
+**Description**
+
+The Reservation Register command registers, unregisters, or replaces a
+reservation key.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_resv_release (struct nvme_resv_release_args *args)
+
+ Send an nvme reservation release
+
+**Parameters**
+
+``struct nvme_resv_release_args *args``
+ :c:type:`struct nvme_resv_release_args <nvme_resv_release_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_resv_report (struct nvme_resv_report_args *args)
+
+ Send an nvme reservation report
+
+**Parameters**
+
+``struct nvme_resv_report_args *args``
+ struct nvme_resv_report_args argument structure
+
+**Description**
+
+Returns a Reservation Status data structure to memory that describes the
+registration and reservation status of a namespace. See the definition for
+the returned structure, :c:type:`struct nvme_reservation_status <nvme_reservation_status>`, for more details.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_mgmt_send (struct nvme_zns_mgmt_send_args *args)
+
+ ZNS management send command
+
+**Parameters**
+
+``struct nvme_zns_mgmt_send_args *args``
+ :c:type:`struct nvme_zns_mgmt_send_args <nvme_zns_mgmt_send_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_mgmt_recv (struct nvme_zns_mgmt_recv_args *args)
+
+ ZNS management receive command
+
+**Parameters**
+
+``struct nvme_zns_mgmt_recv_args *args``
+ :c:type:`struct nvme_zns_mgmt_recv_args <nvme_zns_mgmt_recv_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_report_zones (int fd, __u32 nsid, __u64 slba, enum nvme_zns_report_options opts, bool extended, bool partial, __u32 data_len, void *data, __u32 timeout, __u32 *result)
+
+ Return the list of zones
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID
+
+``__u64 slba``
+ Starting LBA
+
+``enum nvme_zns_report_options opts``
+ Reporting options
+
+``bool extended``
+ Extended report
+
+``bool partial``
+ Partial report requested
+
+``__u32 data_len``
+ Length of the data buffer
+
+``void *data``
+ Userspace address of the report zones data
+
+``__u32 timeout``
+ timeout in ms
+
+``__u32 *result``
+ The command completion result from CQE dword0
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_zns_append (struct nvme_zns_append_args *args)
+
+ Append data to a zone
+
+**Parameters**
+
+``struct nvme_zns_append_args *args``
+ :c:type:`struct nvme_zns_append_args <nvme_zns_append_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_dim_send (struct nvme_dim_args *args)
+
+ Send a Discovery Information Management (DIM) command
+
+**Parameters**
+
+``struct nvme_dim_args *args``
+ :c:type:`struct nvme_dim_args <nvme_dim_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
diff --git a/doc/rst/linux.rst b/doc/rst/linux.rst
new file mode 100644
index 0000000..83dbca9
--- /dev/null
+++ b/doc/rst/linux.rst
@@ -0,0 +1,342 @@
+.. _linux.h:
+
+**linux.h**
+
+
+linux-specific utility functions
+
+.. c:function:: int nvme_fw_download_seq (int fd, __u32 size, __u32 xfer, __u32 offset, void *buf)
+
+ Firmware download sequence
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 size``
+ Total size of the firmware image to transfer
+
+``__u32 xfer``
+ Maximum size to send with each partial transfer
+
+``__u32 offset``
+ Starting offset to send with this firmware download
+
+``void *buf``
+ Address of buffer containing all or part of the firmware image.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+
+
+.. c:enum:: nvme_telemetry_da
+
+ Telemetry Log Data Area
+
+**Constants**
+
+``NVME_TELEMETRY_DA_1``
+ Data Area 1
+
+``NVME_TELEMETRY_DA_2``
+ Data Area 2
+
+``NVME_TELEMETRY_DA_3``
+ Data Area 3
+
+``NVME_TELEMETRY_DA_4``
+ Data Area 4
+
+
+.. c:function:: int nvme_get_ctrl_telemetry (int fd, bool rae, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
+
+ Get controller telemetry log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_telemetry_log **log``
+ On success, set to the value of the allocated and retrieved log.
+
+``enum nvme_telemetry_da da``
+ Log page data area, valid values: :c:type:`enum nvme_telemetry_da <nvme_telemetry_da>`
+
+``size_t *size``
+ Ptr to the telemetry log size, so it can be returned
+
+**Description**
+
+The total size allocated can be calculated as:
+ (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_host_telemetry (int fd, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
+
+ Get host telemetry log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_telemetry_log **log``
+ On success, set to the value of the allocated and retrieved log.
+
+``enum nvme_telemetry_da da``
+ Log page data area, valid values: :c:type:`enum nvme_telemetry_da <nvme_telemetry_da>`
+
+``size_t *size``
+ Ptr to the telemetry log size, so it can be returned
+
+**Description**
+
+The total size allocated can be calculated as:
+ (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_new_host_telemetry (int fd, struct nvme_telemetry_log **log, enum nvme_telemetry_da da, size_t *size)
+
+ Get new host telemetry log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``struct nvme_telemetry_log **log``
+ On success, set to the value of the allocated and retrieved log.
+
+``enum nvme_telemetry_da da``
+ Log page data area, valid values: :c:type:`enum nvme_telemetry_da <nvme_telemetry_da>`
+
+``size_t *size``
+ Ptr to the telemetry log size, so it can be returned
+
+**Description**
+
+The total size allocated can be calculated as:
+ (nvme_telemetry_log da size + 1) * NVME_LOG_TELEM_BLOCK_SIZE.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_log_page (int fd, __u32 xfer_len, struct nvme_get_log_args *args)
+
+ Get log page data
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 xfer_len``
+ Max log transfer size per request to split the total.
+
+``struct nvme_get_log_args *args``
+ :c:type:`struct nvme_get_log_args <nvme_get_log_args>` argument structure
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_ana_log_len (int fd, size_t *analen)
+
+ Retrieve size of the current ANA log
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``size_t *analen``
+ Pointer to where the length will be set on success
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_logical_block_size (int fd, __u32 nsid, int *blksize)
+
+ Retrieve block size
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace id
+
+``int *blksize``
+ Pointer to where the block size will be set on success
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_get_lba_status_log (int fd, bool rae, struct nvme_lba_status_log **log)
+
+ Retrieve the LBA Status log page
+
+**Parameters**
+
+``int fd``
+ File descriptor of the nvme device
+
+``bool rae``
+ Retain asynchronous events
+
+``struct nvme_lba_status_log **log``
+ On success, set to the value of the allocated and retrieved log.
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_namespace_attach_ctrls (int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist)
+
+ Attach namespace to controller(s)
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID to attach
+
+``__u16 num_ctrls``
+ Number of controllers in ctrlist
+
+``__u16 *ctrlist``
+ List of controller IDs to perform the attach action
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_namespace_detach_ctrls (int fd, __u32 nsid, __u16 num_ctrls, __u16 *ctrlist)
+
+ Detach namespace from controller(s)
+
+**Parameters**
+
+``int fd``
+ File descriptor of nvme device
+
+``__u32 nsid``
+ Namespace ID to detach
+
+``__u16 num_ctrls``
+ Number of controllers in ctrlist
+
+``__u16 *ctrlist``
+ List of controller IDs to perform the detach action
+
+**Return**
+
+The nvme command status if a response was received (see
+:c:type:`enum nvme_status_field <nvme_status_field>`) or -1 with errno set otherwise.
+
+
+.. c:function:: int nvme_open (const char *name)
+
+ Open an nvme controller or namespace device
+
+**Parameters**
+
+``const char *name``
+ The basename of the device to open
+
+**Description**
+
+This will look for the handle in /dev/ and validate the name and filetype
+match linux conventions.
+
+**Return**
+
+A file descriptor for the device on a successful open, or -1 with
+errno set otherwise.
+
+
+
+
+.. c:enum:: nvme_hmac_alg
+
+ HMAC algorithm
+
+**Constants**
+
+``NVME_HMAC_ALG_NONE``
+ No HMAC algorithm
+
+``NVME_HMAC_ALG_SHA2_256``
+ SHA2-256
+
+``NVME_HMAC_ALG_SHA2_384``
+ SHA2-384
+
+``NVME_HMAC_ALG_SHA2_512``
+ SHA2-512
+
+
+.. c:function:: int nvme_gen_dhchap_key (char *hostnqn, enum nvme_hmac_alg hmac, unsigned int key_len, unsigned char *secret, unsigned char *key)
+
+ DH-HMAC-CHAP key generation
+
+**Parameters**
+
+``char *hostnqn``
+ Host NVMe Qualified Name
+
+``enum nvme_hmac_alg hmac``
+ HMAC algorithm
+
+``unsigned int key_len``
+ Output key length
+
+``unsigned char *secret``
+ Secret to used for digest
+
+``unsigned char *key``
+ Generated DH-HMAC-CHAP key
+
+**Return**
+
+If key generation was successful the function returns 0 or
+-1 with errno set otherwise.
+
+
diff --git a/doc/rst/log.rst b/doc/rst/log.rst
new file mode 100644
index 0000000..45b4689
--- /dev/null
+++ b/doc/rst/log.rst
@@ -0,0 +1,30 @@
+.. _log.h:
+
+**log.h**
+
+
+logging functions
+
+.. c:function:: void nvme_init_logging (nvme_root_t r, int lvl, bool log_pid, bool log_tstamp)
+
+ Initialize logging
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t context
+
+``int lvl``
+ Logging level to set
+
+``bool log_pid``
+ Boolean to enable logging of the PID
+
+``bool log_tstamp``
+ Boolean to enable logging of the timestamp
+
+**Description**
+
+Sets the default logging variables for the library.
+
+
diff --git a/doc/rst/meson.build b/doc/rst/meson.build
new file mode 100644
index 0000000..43874f0
--- /dev/null
+++ b/doc/rst/meson.build
@@ -0,0 +1,36 @@
+want_docs = get_option('docs')
+
+if want_docs != 'false'
+ want_docs_build = get_option('docs-build')
+ rstdir = get_option('rstdir')
+ if want_docs_build
+ kernel_doc = find_program('../kernel-doc')
+
+ conf = configuration_data()
+ conf.set('SYSCONFDIR', sysconfdir)
+
+ if want_docs == 'all' or want_docs == 'rst' or want_docs == 'html'
+ foreach apif : api_files
+ afile = files('../../src/nvme/' + apif)
+ subst = configure_file(
+ input: afile,
+ output: '@BASENAME@.subst',
+ configuration: conf)
+ rst = custom_target(
+ apif.underscorify() + '_rst',
+ input: subst,
+ output: '@BASENAME@.rst',
+ capture: true,
+ command: [kernel_doc,
+ '-rst',
+ '@INPUT@'],
+ install: true,
+ install_dir: rstdir)
+ endforeach
+ endif
+ else
+ if want_docs == 'all' or want_docs == 'rst'
+ install_subdir('rst', install_dir: rstdir)
+ endif
+ endif
+endif
diff --git a/doc/rst/mi.rst b/doc/rst/mi.rst
new file mode 100644
index 0000000..b9f2f84
--- /dev/null
+++ b/doc/rst/mi.rst
@@ -0,0 +1,1590 @@
+.. _mi.h - NVMe Management Interface library (libnvme-mi) definitions.:
+
+**mi.h - NVMe Management Interface library (libnvme-mi) definitions.**
+
+
+These provide an abstraction for the MI messaging between controllers
+and a host, typically over an MCTP-over-i2c link to a NVMe device, used
+as part of the out-of-band management of a system.
+
+We have a few data structures define here to reflect the topology
+of a MI connection with an NVMe subsystem:
+
+ - :c:type:`nvme_mi_ep_t`: an MI endpoint - our mechanism of communication with a
+ NVMe subsystem. For MCTP, an endpoint will be the component that
+ holds the MCTP address (EID), and receives our request message.
+
+ endpoints are defined in the NVMe-MI spec, and are specific to the MI
+ interface.
+
+ Each endpoint will provide access to one or more of:
+
+ - :c:type:`nvme_mi_ctrl_t`: a NVMe controller, as defined by the NVMe base spec.
+ The controllers are responsible for processing any NVMe standard
+ commands (eg, the Admin command set). An endpoint (:c:type:`nvme_mi_ep_t`)
+ may provide access to multiple controllers - so each of the controller-
+ type commands will require a :c:type:`nvme_mi_ctrl_t` to be specified, rather than
+ an endpoint
+
+A couple of conventions with the libnvme-mi API:
+
+ - All types and functions have the nvme_mi prefix, to distinguish from
+ the libnvme core.
+
+ - We currently support either MI commands and Admin commands. The
+ former adds a _mi prefix, the latter an _admin prefix. [This does
+ result in the MI functions having a double _mi, like
+ :c:type:`nvme_mi_mi_subsystem_health_status_poll`, which is apparently amusing
+ for our German-speaking readers]
+
+For return values: unless specified in the per-function documentation,
+all functions:
+
+ - return 0 on success
+
+ - return -1, with errno set, for errors communicating with the MI device,
+ either in request or response data
+
+ - return >1 on MI status errors. This value is the 8-bit MI status
+ value, represented by :c:type:`enum nvme_mi_resp_status <nvme_mi_resp_status>`. Note that the
+ status values may be vendor-defined above 0xe0.
+
+For the second case, we have a few conventions for errno values:
+
+ - EPROTO: response data violated the MI protocol, and libnvme cannot
+ validly interpret the response
+
+ - EIO: Other I/O error communicating with device (eg., valid but
+ unexpected response data)
+
+ - EINVAL: invalid input arguments for a command
+
+In line with the core NVMe API, the Admin command functions take an
+`_args` structure to provide the command-specific parameters. However,
+for the MI interface, the fd and timeout members of these _args structs
+are ignored.
+
+References to the specifications here will either to be the NVM Express
+Management Interface ("NVMe-MI") or the NVM Express Base specification
+("NVMe"). At the time of writing, the versions we're referencing here
+are:
+ - NVMe-MI 1.2b
+ - NVMe 2.0b
+with a couple of accommodations for older spec types, particularly NVMe-MI
+1.1, where possible.
+
+.. c:macro:: NVME_MI_MSGTYPE_NVME
+
+``NVME_MI_MSGTYPE_NVME ()``
+
+ MCTP message type for NVMe-MI messages.
+
+**Parameters**
+
+**Description**
+
+
+This is defined by MCTP, but is referenced as part of the NVMe-MI message
+spec. This is the MCTP NVMe message type (0x4), with the message-integrity
+bit (0x80) set.
+
+
+
+
+.. c:enum:: nvme_mi_message_type
+
+ NVMe-MI message type field.
+
+**Constants**
+
+``NVME_MI_MT_CONTROL``
+ NVME-MI Control Primitive
+
+``NVME_MI_MT_MI``
+ NVMe-MI command
+
+``NVME_MI_MT_ADMIN``
+ NVMe Admin command
+
+``NVME_MI_MT_PCIE``
+ PCIe command
+
+**Description**
+
+Used as byte 1 of both request and response messages (NMIMT bits of NMP
+byte). Not to be confused with the MCTP message type in byte 0.
+
+
+
+
+.. c:enum:: nvme_mi_ror
+
+ Request or response field.
+
+**Constants**
+
+``NVME_MI_ROR_REQ``
+ request message
+
+``NVME_MI_ROR_RSP``
+ response message
+
+
+
+
+.. c:enum:: nvme_mi_resp_status
+
+ values for the response status field
+
+**Constants**
+
+``NVME_MI_RESP_SUCCESS``
+ success
+
+``NVME_MI_RESP_MPR``
+ More Processing Required
+
+``NVME_MI_RESP_INTERNAL_ERR``
+ Internal Error
+
+``NVME_MI_RESP_INVALID_OPCODE``
+ Invalid command opcode
+
+``NVME_MI_RESP_INVALID_PARAM``
+ Invalid command parameter
+
+``NVME_MI_RESP_INVALID_CMD_SIZE``
+ Invalid command size
+
+``NVME_MI_RESP_INVALID_INPUT_SIZE``
+ Invalid command input data size
+
+``NVME_MI_RESP_ACCESS_DENIED``
+ Access Denied
+
+``NVME_MI_RESP_VPD_UPDATES_EXCEEDED``
+ More VPD updates than allowed
+
+``NVME_MI_RESP_PCIE_INACCESSIBLE``
+ PCIe functionality currently unavailable
+
+``NVME_MI_RESP_MEB_SANITIZED``
+ MEB has been cleared due to sanitize
+
+``NVME_MI_RESP_ENC_SERV_FAILURE``
+ Enclosure services process failed
+
+``NVME_MI_RESP_ENC_SERV_XFER_FAILURE``
+ Transfer with enclosure services failed
+
+``NVME_MI_RESP_ENC_FAILURE``
+ Unreoverable enclosure failure
+
+``NVME_MI_RESP_ENC_XFER_REFUSED``
+ Enclosure services transfer refused
+
+``NVME_MI_RESP_ENC_FUNC_UNSUP``
+ Unsupported enclosure services function
+
+``NVME_MI_RESP_ENC_SERV_UNAVAIL``
+ Enclosure services unavailable
+
+``NVME_MI_RESP_ENC_DEGRADED``
+ Noncritical failure detected by enc. services
+
+``NVME_MI_RESP_SANITIZE_IN_PROGRESS``
+ Command prohibited during sanitize
+
+
+
+
+.. c:struct:: nvme_mi_msg_hdr
+
+ General MI message header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_msg_hdr {
+ __u8 type;
+ __u8 nmp;
+ __u8 meb;
+ __u8 rsvd0;
+ };
+
+**Members**
+
+``type``
+ MCTP message type, will always be NVME_MI_MSGTYPE_NVME
+
+``nmp``
+ NVMe-MI message parameters (including MI message type)
+
+``meb``
+ Management Endpoint Buffer flag; unused for libnvme-mi implementation
+
+``rsvd0``
+ currently reserved
+
+
+**Description**
+
+Wire format shared by both request and response messages, per NVMe-MI
+section 3.1. This is used for all message types, MI and Admin.
+
+
+
+
+.. c:struct:: nvme_mi_msg_resp
+
+ Generic response type.
+
+**Definition**
+
+::
+
+ struct nvme_mi_msg_resp {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 rsvd0[3];
+ };
+
+**Members**
+
+``hdr``
+ the general request/response message header
+
+``status``
+ response status value (see :c:type:`enum nvme_mi_resp_status <nvme_mi_resp_status>`)
+
+``rsvd0``
+ reserved data, may be defined by specific response
+
+
+**Description**
+
+Every response will start with one of these; command-specific responses
+will define parts of the reserved data, and may add further fields.
+
+
+
+
+.. c:enum:: nvme_mi_mi_opcode
+
+ Operation code for supported NVMe-MI commands.
+
+**Constants**
+
+``nvme_mi_mi_opcode_mi_data_read``
+ Read NVMe-MI Data Structure
+
+``nvme_mi_mi_opcode_subsys_health_status_poll``
+ Subsystem Health Status Poll
+
+``nvme_mi_mi_opcode_configuration_set``
+ MI Configuration Set
+
+``nvme_mi_mi_opcode_configuration_get``
+ MI Configuration Get
+
+
+
+
+.. c:struct:: nvme_mi_mi_req_hdr
+
+ MI request message header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_mi_req_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 opcode;
+ __u8 rsvd0[3];
+ __le32 cdw0, cdw1;
+ };
+
+**Members**
+
+``hdr``
+ generic MI message header
+
+``opcode``
+ opcode (OPC) for the specific MI command
+
+``rsvd0``
+ reserved bytes
+
+``cdw0``
+ Management Request Doubleword 0 - command specific usage
+
+``cdw1``
+ Management Request Doubleword 1 - command specific usage
+
+
+**Description**
+
+Wire format for MI request message headers, defined in section 5 of NVMe-MI.
+
+
+
+
+.. c:struct:: nvme_mi_mi_resp_hdr
+
+ MI response message header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_mi_resp_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 nmresp[3];
+ };
+
+**Members**
+
+``hdr``
+ generic MI message header
+
+``status``
+ generic response status from command; non-zero on failure.
+
+``nmresp``
+ NVMe Management Response: command-type-specific response data
+
+
+**Description**
+
+Wire format for MI response message header, defined in section 5 of NVMe-MI.
+
+
+
+
+.. c:enum:: nvme_mi_dtyp
+
+ Data Structure Type field.
+
+**Constants**
+
+``nvme_mi_dtyp_subsys_info``
+ NVM Subsystem Information
+
+``nvme_mi_dtyp_port_info``
+ Port information
+
+``nvme_mi_dtyp_ctrl_list``
+ Controller List
+
+``nvme_mi_dtyp_ctrl_info``
+ Controller Information
+
+``nvme_mi_dtyp_opt_cmd_support``
+ Optionally Supported Command List
+
+``nvme_mi_dtyp_meb_support``
+ Management Endpoint Buffer Command Support List
+
+**Description**
+
+Data Structure Type field for Read NVMe-MI Data Structure command, used to
+indicate the particular structure to query from the endpoint.
+
+
+
+
+.. c:enum:: nvme_mi_config_id
+
+ NVMe-MI Configuration identifier.
+
+**Constants**
+
+``NVME_MI_CONFIG_SMBUS_FREQ``
+ Current SMBus/I2C frequency
+
+``NVME_MI_CONFIG_HEALTH_STATUS_CHANGE``
+ Health Status change - used to clear
+ health status bits in CCS bits of
+ status poll. Only for Set ops.
+
+``NVME_MI_CONFIG_MCTP_MTU``
+ MCTP maximum transmission unit size of port
+ specified in dw 0
+
+**Description**
+
+Configuration parameters for the MI Get/Set Configuration commands.
+
+See :c:type:`nvme_mi_mi_config_get`() and :c:type:`nvme_mi_config_set`().
+
+
+
+
+.. c:enum:: nvme_mi_config_smbus_freq
+
+ SMBus/I2C frequency values
+
+**Constants**
+
+``NVME_MI_CONFIG_SMBUS_FREQ_100kHz``
+ 100kHz
+
+``NVME_MI_CONFIG_SMBUS_FREQ_400kHz``
+ 400kHz
+
+``NVME_MI_CONFIG_SMBUS_FREQ_1MHz``
+ 1MHz
+
+**Description**
+
+Values used in the SMBus Frequency device configuration. See
+:c:type:`nvme_mi_mi_config_get_smbus_freq`() and :c:type:`nvme_mi_mi_config_set_smbus_freq`().
+
+
+
+
+.. c:struct:: nvme_mi_admin_req_hdr
+
+ Admin command request header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_admin_req_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 opcode;
+ __u8 flags;
+ __le16 ctrl_id;
+ __le32 cdw1, cdw2, cdw3, cdw4, cdw5;
+ __le32 doff;
+ __le32 dlen;
+ __le32 rsvd0, rsvd1;
+ __le32 cdw10, cdw11, cdw12, cdw13, cdw14, cdw15;
+ };
+
+**Members**
+
+``hdr``
+ Generic MI message header
+
+``opcode``
+ Admin command opcode (using enum nvme_admin_opcode)
+
+``flags``
+ Command Flags, indicating dlen and doff validity; Only defined in
+ NVMe-MI version 1.1, no fields defined in 1.2 (where the dlen/doff
+ are always considered valid).
+
+``ctrl_id``
+ Controller ID target of command
+
+``cdw1``
+ Submission Queue Entry doubleword 1
+
+``cdw2``
+ Submission Queue Entry doubleword 2
+
+``cdw3``
+ Submission Queue Entry doubleword 3
+
+``cdw4``
+ Submission Queue Entry doubleword 4
+
+``cdw5``
+ Submission Queue Entry doubleword 5
+
+``doff``
+ Offset of data to return from command
+
+``dlen``
+ Length of sent/returned data
+
+``rsvd0``
+ Reserved
+
+``rsvd1``
+ Reserved
+
+``cdw10``
+ Submission Queue Entry doubleword 10
+
+``cdw11``
+ Submission Queue Entry doubleword 11
+
+``cdw12``
+ Submission Queue Entry doubleword 12
+
+``cdw13``
+ Submission Queue Entry doubleword 13
+
+``cdw14``
+ Submission Queue Entry doubleword 14
+
+``cdw15``
+ Submission Queue Entry doubleword 15
+
+
+**Description**
+
+Wire format for Admin command message headers, defined in section 6 of
+NVMe-MI.
+
+
+
+
+.. c:struct:: nvme_mi_admin_resp_hdr
+
+ Admin command response header.
+
+**Definition**
+
+::
+
+ struct nvme_mi_admin_resp_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 rsvd0[3];
+ __le32 cdw0, cdw1, cdw3;
+ };
+
+**Members**
+
+``hdr``
+ Generic MI message header
+
+``status``
+ Generic response code, non-zero on failure
+
+``rsvd0``
+ Reserved
+
+``cdw0``
+ Completion Queue Entry doubleword 0
+
+``cdw1``
+ Completion Queue Entry doubleword 1
+
+``cdw3``
+ Completion Queue Entry doubleword 3
+
+
+**Description**
+
+This is the generic response format with the three doublewords of completion
+queue data, plus optional response data.
+
+
+.. c:function:: nvme_root_t nvme_mi_create_root (FILE *fp, int log_level)
+
+ Create top-level MI (root) handle.
+
+**Parameters**
+
+``FILE *fp``
+ File descriptor for logging messages
+
+``int log_level``
+ Logging level to use
+
+**Description**
+
+Create the top-level (library) handle for creating subsequent endpoint
+objects. Similar to nvme_create_root(), but we provide this to allow linking
+without the core libnvme.
+
+See :c:type:`nvme_create_root`.
+
+**Return**
+
+new root object, or NULL on failure.
+
+
+.. c:function:: void nvme_mi_free_root (nvme_root_t root)
+
+ Free root object.
+
+**Parameters**
+
+``nvme_root_t root``
+ root to free
+
+
+
+
+.. c:type:: nvme_mi_ep_t
+
+ MI Endpoint object.
+
+**Description**
+
+
+Represents our communication endpoint on the remote MI-capable device.
+To be used for direct MI commands for the endpoint (through the
+nvme_mi_mi_* functions(), or to communicate with individual controllers
+(see :c:type:`nvme_mi_init_ctrl`).
+
+Endpoints are created through a transport-specific constructor; currently
+only MCTP-connected endpoints are supported, through :c:type:`nvme_mi_open_mctp`.
+Subsequent operations on the endpoint (and related controllers) are
+transport-independent.
+
+
+.. c:function:: nvme_mi_ep_t nvme_mi_first_endpoint (nvme_root_t m)
+
+ Start endpoint iterator
+
+**Parameters**
+
+``nvme_root_t m``
+ :c:type:`nvme_root_t` object
+
+**Return**
+
+first MI endpoint object under this root, or NULL if no endpoints
+ are present.
+
+**Description**
+
+See: :c:type:`nvme_mi_next_endpoint`, :c:type:`nvme_mi_for_each_endpoint`
+
+
+.. c:function:: nvme_mi_ep_t nvme_mi_next_endpoint (nvme_root_t m, nvme_mi_ep_t e)
+
+ Continue endpoint iterator
+
+**Parameters**
+
+``nvme_root_t m``
+ :c:type:`nvme_root_t` object
+
+``nvme_mi_ep_t e``
+ :c:type:`nvme_mi_ep_t` current position of iterator
+
+**Return**
+
+next endpoint MI endpoint object after **e** under this root, or NULL
+ if no further endpoints are present.
+
+**Description**
+
+See: :c:type:`nvme_mi_first_endpoint`, :c:type:`nvme_mi_for_each_endpoint`
+
+
+.. c:macro:: nvme_mi_for_each_endpoint
+
+``nvme_mi_for_each_endpoint (m, e)``
+
+ Iterator for NVMe-MI endpoints.
+
+**Parameters**
+
+``m``
+ :c:type:`nvme_root_t` containing endpoints
+
+``e``
+ :c:type:`nvme_mi_ep_t` object, set on each iteration
+
+
+.. c:macro:: nvme_mi_for_each_endpoint_safe
+
+``nvme_mi_for_each_endpoint_safe (m, e, _e)``
+
+ Iterator for NVMe-MI endpoints, allowing deletion during traversal
+
+**Parameters**
+
+``m``
+ :c:type:`nvme_root_t` containing endpoints
+
+``e``
+ :c:type:`nvme_mi_ep_t` object, set on each iteration
+
+``_e``
+ :c:type:`nvme_mi_ep_t` object used as temporary storage
+
+
+
+
+.. c:type:: nvme_mi_ctrl_t
+
+ NVMe-MI Controller object.
+
+**Description**
+
+
+Provides NVMe command functionality, through the MI interface.
+
+
+.. c:function:: nvme_mi_ctrl_t nvme_mi_first_ctrl (nvme_mi_ep_t ep)
+
+ Start controller iterator
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ :c:type:`nvme_mi_ep_t` object
+
+**Return**
+
+first MI controller object under this root, or NULL if no controllers
+ are present.
+
+**Description**
+
+See: :c:type:`nvme_mi_next_ctrl`, :c:type:`nvme_mi_for_each_ctrl`
+
+
+.. c:function:: nvme_mi_ctrl_t nvme_mi_next_ctrl (nvme_mi_ep_t ep, nvme_mi_ctrl_t c)
+
+ Continue ctrl iterator
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ :c:type:`nvme_mi_ep_t` object
+
+``nvme_mi_ctrl_t c``
+ :c:type:`nvme_mi_ctrl_t` current position of iterator
+
+**Return**
+
+next MI controller object after **c** under this endpoint, or NULL
+ if no further controllers are present.
+
+**Description**
+
+See: :c:type:`nvme_mi_first_ctrl`, :c:type:`nvme_mi_for_each_ctrl`
+
+
+.. c:macro:: nvme_mi_for_each_ctrl
+
+``nvme_mi_for_each_ctrl (ep, c)``
+
+ Iterator for NVMe-MI controllers.
+
+**Parameters**
+
+``ep``
+ :c:type:`nvme_mi_ep_t` containing endpoints
+
+``c``
+ :c:type:`nvme_mi_ctrl_t` object, set on each iteration
+
+**Description**
+
+Allows iteration of the list of controllers behind an endpoint. Unless the
+controllers have already been created explicitly, you'll probably want to
+call :c:type:`nvme_mi_scan_ep`() to scan for the controllers first.
+
+See: :c:type:`nvme_mi_scan_ep`()
+
+
+.. c:macro:: nvme_mi_for_each_ctrl_safe
+
+``nvme_mi_for_each_ctrl_safe (ep, c, _c)``
+
+ Iterator for NVMe-MI controllers, allowing deletion during traversal
+
+**Parameters**
+
+``ep``
+ :c:type:`nvme_mi_ep_t` containing controllers
+
+``c``
+ :c:type:`nvme_mi_ctrl_t` object, set on each iteration
+
+``_c``
+ :c:type:`nvme_mi_ctrl_t` object used as temporary storage
+
+**Description**
+
+Allows iteration of the list of controllers behind an endpoint, safe against
+deletion during iteration. Unless the controllers have already been created
+explicitly (or you're just iterating to destroy controllers) you'll probably
+want to call :c:type:`nvme_mi_scan_ep`() to scan for the controllers first.
+
+See: :c:type:`nvme_mi_scan_ep`()
+
+
+.. c:function:: nvme_mi_ep_t nvme_mi_open_mctp (nvme_root_t root, unsigned int netid, uint8_t eid)
+
+ Create an endpoint using a MCTP connection.
+
+**Parameters**
+
+``nvme_root_t root``
+ root object to create under
+
+``unsigned int netid``
+ MCTP network ID on this system
+
+``uint8_t eid``
+ MCTP endpoint ID
+
+**Description**
+
+Transport-specific endpoint initialization for MI-connected endpoints. Once
+an endpoint is created, the rest of the API is transport-independent.
+
+See :c:type:`nvme_mi_close`
+
+**Return**
+
+New endpoint object for **netid** & **eid**, or NULL on failure.
+
+
+.. c:function:: void nvme_mi_close (nvme_mi_ep_t ep)
+
+ Close an endpoint connection and release resources, including controller objects.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ Endpoint object to close
+
+
+.. c:function:: nvme_root_t nvme_mi_scan_mctp (void)
+
+ look for MCTP-connected NVMe-MI endpoints.
+
+**Parameters**
+
+``void``
+ no arguments
+
+**Description**
+
+This function queries the system MCTP daemon ("mctpd") over
+D-Bus, to find MCTP endpoints that report support for NVMe-MI over MCTP.
+
+This requires libvnme-mi to be compiled with D-Bus support; if not, this
+will return NULL.
+
+**Return**
+
+A **nvme_root_t** populated with a set of MCTP-connected endpoints,
+ or NULL on failure
+
+
+.. c:function:: int nvme_mi_scan_ep (nvme_mi_ep_t ep, bool force_rescan)
+
+ query an endpoint for its NVMe controllers.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ Endpoint to scan
+
+``bool force_rescan``
+ close existing controllers and rescan
+
+**Description**
+
+This function queries an MI endpoint for the controllers available, by
+performing an MI Read MI Data Structure command (requesting the
+controller list). The controllers are stored in the endpoint's internal
+list, and can be iterated with nvme_mi_for_each_ctrl.
+
+This will only scan the endpoint once, unless **force_rescan** is set. If
+so, all existing controller objects will be freed - the caller must not
+hold a reference to those across this call.
+
+See: :c:type:`nvme_mi_for_each_ctrl`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: nvme_mi_ctrl_t nvme_mi_init_ctrl (nvme_mi_ep_t ep, __u16 ctrl_id)
+
+ initialise a NVMe controller.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ Endpoint to create under
+
+``__u16 ctrl_id``
+ ID of controller to initialize.
+
+**Description**
+
+Create a connection to a controller behind the endpoint specified in **ep**.
+Controller IDs may be queried from the endpoint through
+:c:type:`nvme_mi_mi_read_mi_data_ctrl_list`.
+
+See :c:type:`nvme_mi_close_ctrl`
+
+**Return**
+
+New controller object, or NULL on failure.
+
+
+.. c:function:: void nvme_mi_close_ctrl (nvme_mi_ctrl_t ctrl)
+
+ free a controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ controller to free
+
+
+.. c:function:: char * nvme_mi_endpoint_desc (nvme_mi_ep_t ep)
+
+ Get a string describing a MI endpoint.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint to describe
+
+**Description**
+
+Generates a human-readable string describing the endpoint, with possibly
+transport-specific data. The string is allocated during the call, and the
+caller is responsible for free()-ing the string.
+
+**Return**
+
+a newly-allocated string containing the endpoint description, or
+ NULL on failure.
+
+
+.. c:function:: int nvme_mi_mi_read_mi_data_subsys (nvme_mi_ep_t ep, struct nvme_mi_read_nvm_ss_info *s)
+
+ Perform a Read MI Data Structure command, retrieving subsystem data.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``struct nvme_mi_read_nvm_ss_info *s``
+ subsystem information to populate
+
+**Description**
+
+Retrieves the Subsystem information - number of external ports and
+NVMe version information. See :c:type:`struct nvme_mi_read_nvm_ss_info <nvme_mi_read_nvm_ss_info>`.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_read_mi_data_port (nvme_mi_ep_t ep, __u8 portid, struct nvme_mi_read_port_info *p)
+
+ Perform a Read MI Data Structure command, retrieving port data.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 portid``
+ id of port data to retrieve
+
+``struct nvme_mi_read_port_info *p``
+ port information to populate
+
+**Description**
+
+Retrieves the Port information, for the specified port ID. The subsystem
+data (from :c:type:`nvme_mi_mi_read_mi_data_subsys`) nmp field contains the allowed
+range of port IDs.
+
+See :c:type:`struct nvme_mi_read_port_info <nvme_mi_read_port_info>`.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_read_mi_data_ctrl_list (nvme_mi_ep_t ep, __u8 start_ctrlid, struct nvme_ctrl_list *list)
+
+ Perform a Read MI Data Structure command, retrieving the list of attached controllers.
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 start_ctrlid``
+ starting controller ID
+
+``struct nvme_ctrl_list *list``
+ controller list to populate
+
+**Description**
+
+Retrieves the list of attached controllers, with IDs greater than or
+equal to **start_ctrlid**.
+
+See :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>`.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_read_mi_data_ctrl (nvme_mi_ep_t ep, __u16 ctrl_id, struct nvme_mi_read_ctrl_info *ctrl)
+
+ Perform a Read MI Data Structure command, retrieving controller information
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u16 ctrl_id``
+ ID of controller to query
+
+``struct nvme_mi_read_ctrl_info *ctrl``
+ controller data to populate
+
+**Description**
+
+Retrieves the Controller Information Data Structure for the attached
+controller with ID **ctrlid**.
+
+See :c:type:`struct nvme_mi_read_ctrl_info <nvme_mi_read_ctrl_info>`.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_subsystem_health_status_poll (nvme_mi_ep_t ep, bool clear, struct nvme_mi_nvm_ss_health_status *nshds)
+
+ Read the Subsystem Health Data Structure from the NVM subsystem
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``bool clear``
+ flag to clear the Composite Controller Status state
+
+``struct nvme_mi_nvm_ss_health_status *nshds``
+ subsystem health status data to populate
+
+**Description**
+
+Retrieves the Subsystem Health Data Structure into **nshds**. If **clear** is
+set, requests that the Composite Controller Status bits are cleared after
+the read. See NVMe-MI section 5.6 for details on the CCS bits.
+
+See :c:type:`struct nvme_mi_nvm_ss_health_status <nvme_mi_nvm_ss_health_status>`.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_config_get (nvme_mi_ep_t ep, __u32 dw0, __u32 dw1, __u32 *nmresp)
+
+ query a configuration parameter
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u32 dw0``
+ management doubleword 0, containing configuration identifier, plus
+ config-specific fields
+
+``__u32 dw1``
+ management doubleword 0, config-specific.
+
+``__u32 *nmresp``
+ set to queried configuration data in NMRESP field of response.
+
+**Description**
+
+Performs a MI Configuration Get command, with the configuration identifier
+as the LSB of **dw0**. Other **dw0** and **dw1** data is configuration-identifier
+specific.
+
+On a successful Configuration Get, the **nmresp** pointer will be populated with
+the bytes from the 3-byte NMRESP field, converted to native endian.
+
+See :c:type:`enum nvme_mi_config_id <nvme_mi_config_id>` for identifiers.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_config_set (nvme_mi_ep_t ep, __u32 dw0, __u32 dw1)
+
+ set a configuration parameter
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u32 dw0``
+ management doubleword 0, containing configuration identifier, plus
+ config-specific fields
+
+``__u32 dw1``
+ management doubleword 0, config-specific.
+
+**Description**
+
+Performs a MI Configuration Set command, with the command as the LSB of
+**dw0**. Other **dw0** and **dw1** data is configuration-identifier specific.
+
+See :c:type:`enum nvme_mi_config_id <nvme_mi_config_id>` for identifiers.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_config_get_smbus_freq (nvme_mi_ep_t ep, __u8 port, enum nvme_mi_config_smbus_freq *freq)
+
+ get configuration: SMBus port frequency
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 port``
+ port ID to query
+
+``enum nvme_mi_config_smbus_freq *freq``
+ output value for current frequency configuration
+
+**Description**
+
+Performs a MI Configuration Get, to query the current SMBus frequency of
+the port specified in **port**. On success, populates **freq** with the port
+frequency
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_config_set_smbus_freq (nvme_mi_ep_t ep, __u8 port, enum nvme_mi_config_smbus_freq freq)
+
+ set configuration: SMBus port frequency
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 port``
+ port ID to set
+
+``enum nvme_mi_config_smbus_freq freq``
+ new frequency configuration
+
+**Description**
+
+Performs a MI Configuration Set, to update the current SMBus frequency of
+the port specified in **port**.
+
+See :c:type:`struct nvme_mi_read_port_info <nvme_mi_read_port_info>` for the maximum supported SMBus frequency
+for the port.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_config_set_health_status_change (nvme_mi_ep_t ep, __u32 mask)
+
+ clear CCS bits in health status
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u32 mask``
+ bitmask to clear
+
+**Description**
+
+Performs a MI Configuration Set, to update the current health status poll
+values of the Composite Controller Status bits. Bits set in **mask** will
+be cleared from future health status poll data, and may be re-triggered by
+a future health change event.
+
+See :c:type:`nvme_mi_mi_subsystem_health_status_poll`(), :c:type:`enum nvme_mi_ccs <nvme_mi_ccs>` for
+values in **mask**.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_config_get_mctp_mtu (nvme_mi_ep_t ep, __u8 port, __u16 *mtu)
+
+ get configuration: MCTP MTU
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 port``
+ port ID to query
+
+``__u16 *mtu``
+ output value for current MCTP MTU configuration
+
+**Description**
+
+Performs a MI Configuration Get, to query the current MCTP Maximum
+Transmission Unit size (MTU) of the port specified in **port**. On success,
+populates **mtu** with the MTU.
+
+The default reset value is 64, corresponding to the MCTP baseline MTU.
+
+Some controllers may also use this as the maximum receive unit size, and
+may not accept MCTP messages larger than the configured MTU.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_mi_config_set_mctp_mtu (nvme_mi_ep_t ep, __u8 port, __u16 mtu)
+
+ set configuration: MCTP MTU
+
+**Parameters**
+
+``nvme_mi_ep_t ep``
+ endpoint for MI communication
+
+``__u8 port``
+ port ID to set
+
+``__u16 mtu``
+ new MTU configuration
+
+**Description**
+
+Performs a MI Configuration Set, to update the current MCTP MTU value for
+the port specified in **port**.
+
+Some controllers may also use this as the maximum receive unit size, and
+may not accept MCTP messages larger than the configured MTU. When setting
+this value, you will likely need to change the MTU of the local MCTP
+interface(s) to match.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_admin_xfer (nvme_mi_ctrl_t ctrl, struct nvme_mi_admin_req_hdr *admin_req, size_t req_data_size, struct nvme_mi_admin_resp_hdr *admin_resp, off_t resp_data_offset, size_t *resp_data_size)
+
+ Raw admin transfer interface.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ controller to send the admin command to
+
+``struct nvme_mi_admin_req_hdr *admin_req``
+ request data
+
+``size_t req_data_size``
+ size of request data payload
+
+``struct nvme_mi_admin_resp_hdr *admin_resp``
+ buffer for response data
+
+``off_t resp_data_offset``
+ offset into request data to retrieve from controller
+
+``size_t *resp_data_size``
+ size of response data buffer, updated to received size
+
+**Description**
+
+Performs an arbitrary NVMe Admin command, using the provided request data,
+in **admin_req**. The size of the request data *payload* is specified in
+**req_data_size** - this does not include the standard header length (so a
+header-only request would have a size of 0).
+
+On success, response data is stored in **admin_resp**, which has an optional
+appended payload buffer of **resp_data_size** bytes. The actual payload
+transferred will be stored in **resp_data_size**. These sizes do not include
+the Admin request header, so 0 represents no payload.
+
+As with all Admin commands, we can request partial data from the Admin
+Response payload, offset by **resp_data_offset**.
+
+See: :c:type:`struct nvme_mi_admin_req_hdr <nvme_mi_admin_req_hdr>` and :c:type:`struct nvme_mi_admin_resp_hdr <nvme_mi_admin_resp_hdr>`.
+
+**Return**
+
+0 on success, non-zero on failure.
+
+
+.. c:function:: int nvme_mi_admin_identify_partial (nvme_mi_ctrl_t ctrl, struct nvme_identify_args *args, off_t offset, size_t size)
+
+ Perform an Admin identify command, and retrieve partial response data.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``struct nvme_identify_args *args``
+ Identify command arguments
+
+``off_t offset``
+ offset of identify data to retrieve from response
+
+``size_t size``
+ size of identify data to return
+
+**Description**
+
+Perform an Identify command, using the Identify command parameters in **args**.
+The **offset** and **size** arguments allow the caller to retrieve part of
+the identify response. See NVMe-MI section 6.2 for the semantics (and some
+handy diagrams) of the offset & size parameters.
+
+Will return an error if the length of the response data (from the controller)
+did not match **size**.
+
+Unless you're performing a vendor-unique identify command, You'll probably
+want to use one of the identify helpers (nvme_mi_admin_identify,
+nvme_mi_admin_identify_cns_nsid, or nvme_mi_admin_identify_<type>) instead
+of this. If the type of your identify command is standardized but not
+yet supported by libnvme-mi, please contact the maintainers.
+
+See: :c:type:`struct nvme_identify_args <nvme_identify_args>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_identify (nvme_mi_ctrl_t ctrl, struct nvme_identify_args *args)
+
+ Perform an Admin identify command.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``struct nvme_identify_args *args``
+ Identify command arguments
+
+**Description**
+
+Perform an Identify command, using the Identify command parameters in **args**.
+Stores the identify data in ->data, and (if set) the result from cdw0
+into args->result.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`.
+
+See: :c:type:`struct nvme_identify_args <nvme_identify_args>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_identify_cns_nsid (nvme_mi_ctrl_t ctrl, enum nvme_identify_cns cns, __u32 nsid, void *data)
+
+ Perform an Admin identify command using specific CNS/NSID parameters.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``enum nvme_identify_cns cns``
+ Controller or Namespace Structure, specifying identified object
+
+``__u32 nsid``
+ namespace ID
+
+``void *data``
+ buffer for identify data response
+
+**Description**
+
+Perform an Identify command, using the CNS specifier **cns**, and the
+namespace ID **nsid** if required by the CNS type.
+
+Stores the identify data in **data**, which is expected to be a buffer of
+:c:type:`NVME_IDENTIFY_DATA_SIZE` bytes.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`.
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_identify_ctrl (nvme_mi_ctrl_t ctrl, struct nvme_id_ctrl *id)
+
+ Perform an Admin identify for a controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``struct nvme_id_ctrl *id``
+ Controller identify data to populate
+
+**Description**
+
+Perform an Identify command, for the controller specified by **ctrl**,
+writing identify data to **id**.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **id** will be
+fully populated on success.
+
+See: :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_identify_ctrl_list (nvme_mi_ctrl_t ctrl, __u16 cntid, struct nvme_ctrl_list *list)
+
+ Perform an Admin identify for a controller list.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to process identify command
+
+``__u16 cntid``
+ Controller ID to specify list start
+
+``struct nvme_ctrl_list *list``
+ List data to populate
+
+**Description**
+
+Perform an Identify command, for the controller list starting with
+IDs greater than or equal to **cntid**.
+
+Will return an error if the length of the response data (from the
+controller) is not a full :c:type:`NVME_IDENTIFY_DATA_SIZE`, so **id** will be
+fully populated on success.
+
+See: :c:type:`struct nvme_ctrl_list <nvme_ctrl_list>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_get_log_page (nvme_mi_ctrl_t ctrl, struct nvme_get_log_args *args)
+
+ Retrieve log page data from controller
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to query
+
+``struct nvme_get_log_args *args``
+ Get Log Page command arguments
+
+**Description**
+
+Performs a Get Log Page Admin command as specified by **args**. Response data
+is stored in **args->data**, which should be a buffer of **args->data_len** bytes.
+Resulting data length is stored in **args->data_len** on successful
+command completion.
+
+This request may be implemented as multiple log page commands, in order
+to fit within MI message-size limits.
+
+See: :c:type:`struct nvme_get_log_args <nvme_get_log_args>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_security_send (nvme_mi_ctrl_t ctrl, struct nvme_security_send_args *args)
+
+ Perform a Security Send command on a controller.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_security_send_args *args``
+ Security Send command arguments
+
+**Description**
+
+Performs a Security Send Admin command as specified by **args**. Response data
+is stored in **args->data**, which should be a buffer of **args->data_len** bytes.
+Resulting data length is stored in **args->data_len** on successful
+command completion.
+
+Security Send data length should not be greater than 4096 bytes to
+comply with specification limits.
+
+See: :c:type:`struct nvme_get_log_args <nvme_get_log_args>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
+.. c:function:: int nvme_mi_admin_security_recv (nvme_mi_ctrl_t ctrl, struct nvme_security_receive_args *args)
+
+ Perform a Security Receive command on a controller.
+
+**Parameters**
+
+``nvme_mi_ctrl_t ctrl``
+ Controller to send command to
+
+``struct nvme_security_receive_args *args``
+ Security Receive command arguments
+
+**Description**
+
+Performs a Security Receive Admin command as specified by **args**. Response
+data is stored in **args->data**, which should be a buffer of **args->data_len**
+bytes. Resulting data length is stored in **args->data_len** on successful
+command completion.
+
+Security Receive data length should not be greater than 4096 bytes to
+comply with specification limits.
+
+See: :c:type:`struct nvme_get_log_args <nvme_get_log_args>`
+
+**Return**
+
+0 on success, non-zero on failure
+
+
diff --git a/doc/rst/tree.rst b/doc/rst/tree.rst
new file mode 100644
index 0000000..2334464
--- /dev/null
+++ b/doc/rst/tree.rst
@@ -0,0 +1,2108 @@
+.. _tree.h:
+
+**tree.h**
+
+
+libnvme tree object interface
+
+.. c:function:: nvme_root_t nvme_create_root (FILE *fp, int log_level)
+
+ Initialize root object
+
+**Parameters**
+
+``FILE *fp``
+ File descriptor for logging messages
+
+``int log_level``
+ Logging level to use
+
+**Return**
+
+Initialized :c:type:`nvme_root_t` object
+
+
+.. c:function:: void nvme_free_tree (nvme_root_t r)
+
+ Free root object
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+**Description**
+
+Free an :c:type:`nvme_root_t` object and all attached objects
+
+
+.. c:function:: nvme_host_t nvme_first_host (nvme_root_t r)
+
+ Start host iterator
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+**Return**
+
+First :c:type:`nvme_host_t` object in an iterator
+
+
+.. c:function:: nvme_host_t nvme_next_host (nvme_root_t r, nvme_host_t h)
+
+ Next host iterator
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+``nvme_host_t h``
+ Previous :c:type:`nvme_host_t` iterator
+
+**Return**
+
+Next :c:type:`nvme_host_t` object in an iterator
+
+
+.. c:function:: nvme_root_t nvme_host_get_root (nvme_host_t h)
+
+ Returns nvme_root_t object
+
+**Parameters**
+
+``nvme_host_t h``
+ :c:type:`nvme_host_t` object
+
+**Return**
+
+:c:type:`nvme_root_t` object from **h**
+
+
+.. c:function:: nvme_host_t nvme_lookup_host (nvme_root_t r, const char *hostnqn, const char *hostid)
+
+ Lookup nvme_host_t object
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+``const char *hostnqn``
+ Host NQN
+
+``const char *hostid``
+ Host ID
+
+**Description**
+
+Lookup a nvme_host_t object based on **hostnqn** and **hostid**
+or create one if not found.
+
+**Return**
+
+:c:type:`nvme_host_t` object
+
+
+.. c:function:: const char * nvme_host_get_dhchap_key (nvme_host_t h)
+
+ Return host key
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the key should be returned
+
+**Return**
+
+DH-HMAC-CHAP host key or NULL if not set
+
+
+.. c:function:: void nvme_host_set_dhchap_key (nvme_host_t h, const char *key)
+
+ set host key
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the key should be set
+
+``const char *key``
+ DH-HMAC-CHAP Key to set or NULL to clear existing key
+
+
+.. c:function:: nvme_host_t nvme_default_host (nvme_root_t r)
+
+ Initializes the default host
+
+**Parameters**
+
+``nvme_root_t r``
+ :c:type:`nvme_root_t` object
+
+**Description**
+
+Initializes the default host object based on the values in
+/etc/nvme/hostnqn and /etc/nvme/hostid and attaches it to **r**.
+
+**Return**
+
+:c:type:`nvme_host_t` object
+
+
+.. c:function:: nvme_subsystem_t nvme_first_subsystem (nvme_host_t h)
+
+ Start subsystem iterator
+
+**Parameters**
+
+``nvme_host_t h``
+ :c:type:`nvme_host_t` object
+
+**Return**
+
+first :c:type:`nvme_subsystem_t` object in an iterator
+
+
+.. c:function:: nvme_subsystem_t nvme_next_subsystem (nvme_host_t h, nvme_subsystem_t s)
+
+ Next subsystem iterator
+
+**Parameters**
+
+``nvme_host_t h``
+ :c:type:`nvme_host_t` object
+
+``nvme_subsystem_t s``
+ Previous :c:type:`nvme_subsystem_t` iterator
+
+**Return**
+
+next :c:type:`nvme_subsystem_t` object in an iterator
+
+
+.. c:function:: nvme_subsystem_t nvme_lookup_subsystem (struct nvme_host *h, const char *name, const char *subsysnqn)
+
+ Lookup nvme_subsystem_t object
+
+**Parameters**
+
+``struct nvme_host *h``
+ :c:type:`nvme_host_t` object
+
+``const char *name``
+ Name of the subsystem (may be NULL)
+
+``const char *subsysnqn``
+ Subsystem NQN
+
+**Description**
+
+Lookup a :c:type:`nvme_subsystem_t` object in **h** base on **name** (if present)
+and **subsysnqn** or create one if not found.
+
+**Return**
+
+nvme_subsystem_t object
+
+
+.. c:function:: void nvme_free_subsystem (struct nvme_subsystem *s)
+
+ Free a subsystem
+
+**Parameters**
+
+``struct nvme_subsystem *s``
+ subsystem
+
+**Description**
+
+Frees **s** and all related objects.
+
+
+.. c:function:: nvme_host_t nvme_subsystem_get_host (nvme_subsystem_t s)
+
+ Returns nvme_host_t object
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ subsystem
+
+**Return**
+
+:c:type:`nvme_host_t` object from **s**
+
+
+.. c:function:: nvme_ns_t nvme_ctrl_first_ns (nvme_ctrl_t c)
+
+ Start namespace iterator
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+First :c:type:`nvme_ns_t` object of an **c** iterator
+
+
+.. c:function:: nvme_ns_t nvme_ctrl_next_ns (nvme_ctrl_t c, nvme_ns_t n)
+
+ Next namespace iterator
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``nvme_ns_t n``
+ Previous nvme_ns_t iterator
+
+**Return**
+
+Next nvme_ns_t object of an **c** iterator
+
+
+.. c:function:: nvme_path_t nvme_ctrl_first_path (nvme_ctrl_t c)
+
+ Start path iterator
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+First :c:type:`nvme_path_t` object of an **c** iterator
+
+
+.. c:function:: nvme_path_t nvme_ctrl_next_path (nvme_ctrl_t c, nvme_path_t p)
+
+ Next path iterator
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``nvme_path_t p``
+ Previous :c:type:`nvme_path_t` object of an **c** iterator
+
+**Return**
+
+Next :c:type:`nvme_path_t` object of an **c** iterator
+
+
+.. c:function:: nvme_ctrl_t nvme_subsystem_first_ctrl (nvme_subsystem_t s)
+
+ First ctrl iterator
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+**Return**
+
+First controller of an **s** iterator
+
+
+.. c:function:: nvme_ctrl_t nvme_subsystem_next_ctrl (nvme_subsystem_t s, nvme_ctrl_t c)
+
+ Next ctrl iterator
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+``nvme_ctrl_t c``
+ Previous controller instance of an **s** iterator
+
+**Return**
+
+Next controller of an **s** iterator
+
+
+.. c:function:: nvme_path_t nvme_namespace_first_path (nvme_ns_t ns)
+
+ Start path iterator
+
+**Parameters**
+
+``nvme_ns_t ns``
+ Namespace instance
+
+**Return**
+
+First :c:type:`nvme_path_t` object of an **ns** iterator
+
+
+.. c:function:: nvme_path_t nvme_namespace_next_path (nvme_ns_t ns, nvme_path_t p)
+
+ Next path iterator
+
+**Parameters**
+
+``nvme_ns_t ns``
+ Namespace instance
+
+``nvme_path_t p``
+ Previous :c:type:`nvme_path_t` object of an **ns** iterator
+
+**Return**
+
+Next :c:type:`nvme_path_t` object of an **ns** iterator
+
+
+.. c:function:: nvme_ctrl_t nvme_lookup_ctrl (nvme_subsystem_t s, const char *transport, const char *traddr, const char *host_traddr, const char *host_iface, const char *trsvcid, nvme_ctrl_t p)
+
+ Lookup nvme_ctrl_t object
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+``const char *transport``
+ Transport name
+
+``const char *traddr``
+ Transport address
+
+``const char *host_traddr``
+ Host transport address
+
+``const char *host_iface``
+ Host interface name
+
+``const char *trsvcid``
+ Transport service identifier
+
+``nvme_ctrl_t p``
+ Previous controller instance
+
+**Description**
+
+Lookup a controller in **s** based on **transport**, **traddr**,
+**host_traddr**, **host_iface**, and **trsvcid**. **transport** must be specified,
+other fields may be required depending on the transport. A new
+object is created if none is found. If **p** is specified the lookup
+will start at **p** instead of the first controller.
+
+**Return**
+
+Controller instance
+
+
+.. c:function:: nvme_ctrl_t nvme_create_ctrl (nvme_root_t r, const char *subsysnqn, const char *transport, const char *traddr, const char *host_traddr, const char *host_iface, const char *trsvcid)
+
+ Allocate an unconnected NVMe controller
+
+**Parameters**
+
+``nvme_root_t r``
+ NVMe root element
+
+``const char *subsysnqn``
+ Subsystem NQN
+
+``const char *transport``
+ Transport type
+
+``const char *traddr``
+ Transport address
+
+``const char *host_traddr``
+ Host transport address
+
+``const char *host_iface``
+ Host interface name
+
+``const char *trsvcid``
+ Transport service ID
+
+**Description**
+
+Creates an unconnected controller to be used for nvme_add_ctrl().
+
+**Return**
+
+Controller instance
+
+
+.. c:function:: nvme_ns_t nvme_subsystem_first_ns (nvme_subsystem_t s)
+
+ Start namespace iterator
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+**Return**
+
+First :c:type:`nvme_ns_t` object of an **s** iterator
+
+
+.. c:function:: nvme_ns_t nvme_subsystem_next_ns (nvme_subsystem_t s, nvme_ns_t n)
+
+ Next namespace iterator
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ :c:type:`nvme_subsystem_t` object
+
+``nvme_ns_t n``
+ Previous :c:type:`nvme_ns_t` iterator
+
+**Return**
+
+Next :c:type:`nvme_ns_t` object of an **s** iterator
+
+
+.. c:macro:: nvme_for_each_host_safe
+
+``nvme_for_each_host_safe (r, h, _h)``
+
+ Traverse host list
+
+**Parameters**
+
+``r``
+ :c:type:`nvme_root_t` object
+
+``h``
+ :c:type:`nvme_host_t` object
+
+``_h``
+ Temporary :c:type:`nvme_host_t` object
+
+
+.. c:macro:: nvme_for_each_host
+
+``nvme_for_each_host (r, h)``
+
+ Traverse host list
+
+**Parameters**
+
+``r``
+ :c:type:`nvme_root_t` object
+
+``h``
+ :c:type:`nvme_host_t` object
+
+
+.. c:macro:: nvme_for_each_subsystem_safe
+
+``nvme_for_each_subsystem_safe (h, s, _s)``
+
+ Traverse subsystems
+
+**Parameters**
+
+``h``
+ :c:type:`nvme_host_t` object
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``_s``
+ Temporary :c:type:`nvme_subsystem_t` object
+
+
+.. c:macro:: nvme_for_each_subsystem
+
+``nvme_for_each_subsystem (h, s)``
+
+ Traverse subsystems
+
+**Parameters**
+
+``h``
+ :c:type:`nvme_host_t` object
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+
+.. c:macro:: nvme_subsystem_for_each_ctrl_safe
+
+``nvme_subsystem_for_each_ctrl_safe (s, c, _c)``
+
+ Traverse controllers
+
+**Parameters**
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``c``
+ Controller instance
+
+``_c``
+ A :c:type:`nvme_ctrl_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_subsystem_for_each_ctrl
+
+``nvme_subsystem_for_each_ctrl (s, c)``
+
+ Traverse controllers
+
+**Parameters**
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``c``
+ Controller instance
+
+
+.. c:macro:: nvme_ctrl_for_each_ns_safe
+
+``nvme_ctrl_for_each_ns_safe (c, n, _n)``
+
+ Traverse namespaces
+
+**Parameters**
+
+``c``
+ Controller instance
+
+``n``
+ :c:type:`nvme_ns_t` object
+
+``_n``
+ A :c:type:`nvme_ns_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_ctrl_for_each_ns
+
+``nvme_ctrl_for_each_ns (c, n)``
+
+ Traverse namespaces
+
+**Parameters**
+
+``c``
+ Controller instance
+
+``n``
+ :c:type:`nvme_ns_t` object
+
+
+.. c:macro:: nvme_ctrl_for_each_path_safe
+
+``nvme_ctrl_for_each_path_safe (c, p, _p)``
+
+ Traverse paths
+
+**Parameters**
+
+``c``
+ Controller instance
+
+``p``
+ :c:type:`nvme_path_t` object
+
+``_p``
+ A :c:type:`nvme_path_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_ctrl_for_each_path
+
+``nvme_ctrl_for_each_path (c, p)``
+
+ Traverse paths
+
+**Parameters**
+
+``c``
+ Controller instance
+
+``p``
+ :c:type:`nvme_path_t` object
+
+
+.. c:macro:: nvme_subsystem_for_each_ns_safe
+
+``nvme_subsystem_for_each_ns_safe (s, n, _n)``
+
+ Traverse namespaces
+
+**Parameters**
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``n``
+ :c:type:`nvme_ns_t` object
+
+``_n``
+ A :c:type:`nvme_ns_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_subsystem_for_each_ns
+
+``nvme_subsystem_for_each_ns (s, n)``
+
+ Traverse namespaces
+
+**Parameters**
+
+``s``
+ :c:type:`nvme_subsystem_t` object
+
+``n``
+ :c:type:`nvme_ns_t` object
+
+
+.. c:macro:: nvme_namespace_for_each_path_safe
+
+``nvme_namespace_for_each_path_safe (n, p, _p)``
+
+ Traverse paths
+
+**Parameters**
+
+``n``
+ Namespace instance
+
+``p``
+ :c:type:`nvme_path_t` object
+
+``_p``
+ A :c:type:`nvme_path_t_node` to use as temporary storage
+
+
+.. c:macro:: nvme_namespace_for_each_path
+
+``nvme_namespace_for_each_path (n, p)``
+
+ Traverse paths
+
+**Parameters**
+
+``n``
+ Namespace instance
+
+``p``
+ :c:type:`nvme_path_t` object
+
+
+.. c:function:: int nvme_ns_get_fd (nvme_ns_t n)
+
+ Get associated file descriptor
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+File descriptor associated with **n** or -1
+
+
+.. c:function:: int nvme_ns_get_nsid (nvme_ns_t n)
+
+ NSID of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+NSID of **n**
+
+
+.. c:function:: int nvme_ns_get_lba_size (nvme_ns_t n)
+
+ LBA size of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+LBA size of **n**
+
+
+.. c:function:: int nvme_ns_get_meta_size (nvme_ns_t n)
+
+ Metadata size of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Metadata size of **n**
+
+
+.. c:function:: uint64_t nvme_ns_get_lba_count (nvme_ns_t n)
+
+ LBA count of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+LBA count of **n**
+
+
+.. c:function:: uint64_t nvme_ns_get_lba_util (nvme_ns_t n)
+
+ LBA utilization of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+LBA utilization of **n**
+
+
+.. c:function:: enum nvme_csi nvme_ns_get_csi (nvme_ns_t n)
+
+ Command set identifier of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+The namespace's command set identifier in use
+
+
+.. c:function:: const uint8_t * nvme_ns_get_eui64 (nvme_ns_t n)
+
+ 64-bit eui of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+A pointer to the 64-bit eui
+
+
+.. c:function:: const uint8_t * nvme_ns_get_nguid (nvme_ns_t n)
+
+ 128-bit nguid of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+A pointer to the 128-bit nguid
+
+
+.. c:function:: void nvme_ns_get_uuid (nvme_ns_t n, uuid_t out)
+
+ UUID of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``uuid_t out``
+ buffer for the UUID
+
+**Description**
+
+Copies the namespace's uuid into **out**
+
+
+.. c:function:: const char * nvme_ns_get_sysfs_dir (nvme_ns_t n)
+
+ sysfs directory of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+sysfs directory name of **n**
+
+
+.. c:function:: const char * nvme_ns_get_name (nvme_ns_t n)
+
+ sysfs name of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+sysfs name of **n**
+
+
+.. c:function:: const char * nvme_ns_get_generic_name (nvme_ns_t n)
+
+ Returns name of generic namespace chardev.
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Name of generic namespace chardev
+
+
+.. c:function:: const char * nvme_ns_get_firmware (nvme_ns_t n)
+
+ Firmware string of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Firmware string of **n**
+
+
+.. c:function:: const char * nvme_ns_get_serial (nvme_ns_t n)
+
+ Serial number of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Serial number string of **n**
+
+
+.. c:function:: const char * nvme_ns_get_model (nvme_ns_t n)
+
+ Model of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+Model string of **n**
+
+
+.. c:function:: nvme_subsystem_t nvme_ns_get_subsystem (nvme_ns_t n)
+
+ :c:type:`nvme_subsystem_t` of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+nvme_subsystem_t object of **n**
+
+
+.. c:function:: nvme_ctrl_t nvme_ns_get_ctrl (nvme_ns_t n)
+
+ :c:type:`nvme_ctrl_t` of a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Description**
+
+nvme_ctrl_t object may be NULL for a multipathed namespace
+
+**Return**
+
+nvme_ctrl_t object of **n** if present
+
+
+.. c:function:: void nvme_free_ns (struct nvme_ns *n)
+
+ Free a namespace object
+
+**Parameters**
+
+``struct nvme_ns *n``
+ Namespace instance
+
+
+.. c:function:: int nvme_ns_read (nvme_ns_t n, void *buf, off_t offset, size_t count)
+
+ Read from a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``void *buf``
+ Buffer into which the data will be transferred
+
+``off_t offset``
+ LBA offset of **n**
+
+``size_t count``
+ Number of sectors in **buf**
+
+**Return**
+
+Number of sectors read or -1 on error.
+
+
+.. c:function:: int nvme_ns_write (nvme_ns_t n, void *buf, off_t offset, size_t count)
+
+ Write to a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``void *buf``
+ Buffer with data to be written
+
+``off_t offset``
+ LBA offset of **n**
+
+``size_t count``
+ Number of sectors in **buf**
+
+**Return**
+
+Number of sectors written or -1 on error
+
+
+.. c:function:: int nvme_ns_verify (nvme_ns_t n, off_t offset, size_t count)
+
+ Verify data on a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``off_t offset``
+ LBA offset of **n**
+
+``size_t count``
+ Number of sectors to be verified
+
+**Return**
+
+Number of sectors verified
+
+
+.. c:function:: int nvme_ns_compare (nvme_ns_t n, void *buf, off_t offset, size_t count)
+
+ Compare data on a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``void *buf``
+ Buffer with data to be compared
+
+``off_t offset``
+ LBA offset of **n**
+
+``size_t count``
+ Number of sectors in **buf**
+
+**Return**
+
+Number of sectors compared
+
+
+.. c:function:: int nvme_ns_write_zeros (nvme_ns_t n, off_t offset, size_t count)
+
+ Write zeros to a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``off_t offset``
+ LBA offset in **n**
+
+``size_t count``
+ Number of sectors to be written
+
+**Return**
+
+Number of sectors written
+
+
+.. c:function:: int nvme_ns_write_uncorrectable (nvme_ns_t n, off_t offset, size_t count)
+
+ Issus a 'write uncorrectable' command
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``off_t offset``
+ LBA offset in **n**
+
+``size_t count``
+ Number of sectors to be written
+
+**Return**
+
+Number of sectors written
+
+
+.. c:function:: int nvme_ns_flush (nvme_ns_t n)
+
+ Flush data to a namespace
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+**Return**
+
+0 on success, -1 on error.
+
+
+.. c:function:: int nvme_ns_identify (nvme_ns_t n, struct nvme_id_ns *ns)
+
+ Issue an 'identify namespace' command
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``struct nvme_id_ns *ns``
+ :c:type:`nvme_id_ns` buffer
+
+**Description**
+
+Writes the data returned by the 'identify namespace' command
+into **ns**.
+
+**Return**
+
+0 on success, -1 on error.
+
+
+.. c:function:: int nvme_ns_identify_descs (nvme_ns_t n, struct nvme_ns_id_desc *descs)
+
+ Issue an 'identify descriptors' command
+
+**Parameters**
+
+``nvme_ns_t n``
+ Namespace instance
+
+``struct nvme_ns_id_desc *descs``
+ List of identify descriptors
+
+**Description**
+
+Writes the data returned by the 'identify descriptors' command
+into **descs**.
+
+**Return**
+
+0 on success, -1 on error.
+
+
+.. c:function:: const char * nvme_path_get_name (nvme_path_t p)
+
+ sysfs name of an :c:type:`nvme_path_t` object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+sysfs name of **p**
+
+
+.. c:function:: const char * nvme_path_get_sysfs_dir (nvme_path_t p)
+
+ sysfs directory of an nvme_path_t object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+sysfs directory of **p**
+
+
+.. c:function:: const char * nvme_path_get_ana_state (nvme_path_t p)
+
+ ANA state of an nvme_path_t object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+ANA (Asynchronous Namespace Access) state of **p**
+
+
+.. c:function:: nvme_ctrl_t nvme_path_get_ctrl (nvme_path_t p)
+
+ Parent controller of an nvme_path_t object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+Parent controller if present
+
+
+.. c:function:: nvme_ns_t nvme_path_get_ns (nvme_path_t p)
+
+ Parent namespace of an nvme_path_t object
+
+**Parameters**
+
+``nvme_path_t p``
+ :c:type:`nvme_path_t` object
+
+**Return**
+
+Parent namespace if present
+
+
+.. c:function:: int nvme_ctrl_get_fd (nvme_ctrl_t c)
+
+ Get associated file descriptor
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+File descriptor associated with **c** or -1
+
+
+.. c:function:: const char * nvme_ctrl_get_name (nvme_ctrl_t c)
+
+ sysfs name of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+sysfs name of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_sysfs_dir (nvme_ctrl_t c)
+
+ sysfs directory of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+sysfs directory name of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_address (nvme_ctrl_t c)
+
+ Address string of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+NVMe-over-Fabrics address string of **c** or empty string
+of no address is present.
+
+
+.. c:function:: const char * nvme_ctrl_get_firmware (nvme_ctrl_t c)
+
+ Firmware string of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Firmware string of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_model (nvme_ctrl_t c)
+
+ Model of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Model string of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_state (nvme_ctrl_t c)
+
+ Running state of an controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+String indicating the running state of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_numa_node (nvme_ctrl_t c)
+
+ NUMA node of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+String indicating the NUMA node
+
+
+.. c:function:: const char * nvme_ctrl_get_queue_count (nvme_ctrl_t c)
+
+ Queue count of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Queue count of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_serial (nvme_ctrl_t c)
+
+ Serial number of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Serial number string of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_sqsize (nvme_ctrl_t c)
+
+ SQ size of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+SQ size (as string) of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_transport (nvme_ctrl_t c)
+
+ Transport type of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Transport type of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_subsysnqn (nvme_ctrl_t c)
+
+ Subsystem NQN of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Subsystem NQN of **c**
+
+
+.. c:function:: nvme_subsystem_t nvme_ctrl_get_subsystem (nvme_ctrl_t c)
+
+ Parent subsystem of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Parent nvme_subsystem_t object
+
+
+.. c:function:: const char * nvme_ctrl_get_traddr (nvme_ctrl_t c)
+
+ Transport address of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Transport address of **c**
+
+
+.. c:function:: const char * nvme_ctrl_get_trsvcid (nvme_ctrl_t c)
+
+ Transport service identifier of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Transport service identifier of **c** (if present)
+
+
+.. c:function:: const char * nvme_ctrl_get_host_traddr (nvme_ctrl_t c)
+
+ Host transport address of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Host transport address of **c** (if present)
+
+
+.. c:function:: const char * nvme_ctrl_get_host_iface (nvme_ctrl_t c)
+
+ Host interface name of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Host interface name of **c** (if present)
+
+
+.. c:function:: const char * nvme_ctrl_get_dhchap_key (nvme_ctrl_t c)
+
+ Return controller key
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller for which the key should be set
+
+**Return**
+
+DH-HMAC-CHAP controller key or NULL if not set
+
+
+.. c:function:: void nvme_ctrl_set_dhchap_key (nvme_ctrl_t c, const char *key)
+
+ Set controller key
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller for which the key should be set
+
+``const char *key``
+ DH-HMAC-CHAP Key to set or NULL to clear existing key
+
+
+.. c:function:: struct nvme_fabrics_config * nvme_ctrl_get_config (nvme_ctrl_t c)
+
+ Fabrics configuration of a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Fabrics configuration of **c**
+
+
+.. c:function:: void nvme_ctrl_set_discovered (nvme_ctrl_t c, bool discovered)
+
+ Set the 'discovered' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ nvme_ctrl_t object
+
+``bool discovered``
+ Value of the 'discovered' flag
+
+**Description**
+
+Set the 'discovered' flag of **c** to **discovered**
+
+
+.. c:function:: bool nvme_ctrl_is_discovered (nvme_ctrl_t c)
+
+ Returns the value of the 'discovered' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Value of the 'discovered' flag of **c**
+
+
+.. c:function:: void nvme_ctrl_set_persistent (nvme_ctrl_t c, bool persistent)
+
+ Set the 'persistent' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``bool persistent``
+ value of the 'persistent' flag
+
+**Description**
+
+Set the 'persistent' flag of **c** to **persistent**
+
+
+.. c:function:: bool nvme_ctrl_is_persistent (nvme_ctrl_t c)
+
+ Returns the value of the 'persistent' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Return**
+
+Value of the 'persistent' flag of **c**
+
+
+.. c:function:: void nvme_ctrl_set_discovery_ctrl (nvme_ctrl_t c, bool discovery)
+
+ Set the 'discovery_ctrl' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be modified
+
+``bool discovery``
+ value of the discovery_ctrl flag
+
+**Description**
+
+Sets the 'discovery_ctrl' flag in **c** to specify whether
+**c** connects to a discovery subsystem.
+
+
+.. c:function:: bool nvme_ctrl_is_discovery_ctrl (nvme_ctrl_t c)
+
+ Check the 'discovery_ctrl' flag
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller to be checked
+
+**Description**
+
+Returns the value of the 'discovery_ctrl' flag which specifies whether
+**c** connects to a discovery subsystem.
+
+**Return**
+
+Value of the 'discover_ctrl' flag
+
+
+.. c:function:: int nvme_ctrl_identify (nvme_ctrl_t c, struct nvme_id_ctrl *id)
+
+ Issues an 'identify controller' command
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``struct nvme_id_ctrl *id``
+ Identify controller data structure
+
+**Description**
+
+Issues an 'identify controller' command to **c** and copies the
+data into **id**.
+
+**Return**
+
+0 on success or -1 on failure.
+
+
+.. c:function:: int nvme_disconnect_ctrl (nvme_ctrl_t c)
+
+ Disconnect a controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+**Description**
+
+Issues a 'disconnect' fabrics command to **c**
+
+**Return**
+
+0 on success, -1 on failure.
+
+
+.. c:function:: nvme_ctrl_t nvme_scan_ctrl (nvme_root_t r, const char *name)
+
+ Scan on a controller
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+``const char *name``
+ Name of the controller
+
+**Description**
+
+Scans a controller with sysfs name **name** and add it to **r**.
+
+**Return**
+
+nvme_ctrl_t object
+
+
+.. c:function:: void nvme_rescan_ctrl (nvme_ctrl_t c)
+
+ Rescan an existing controller
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+
+.. c:function:: int nvme_init_ctrl (nvme_host_t h, nvme_ctrl_t c, int instance)
+
+ Initialize nvme_ctrl_t object for an existing controller.
+
+**Parameters**
+
+``nvme_host_t h``
+ nvme_host_t object
+
+``nvme_ctrl_t c``
+ nvme_ctrl_t object
+
+``int instance``
+ Instance number (e.g. 1 for nvme1)
+
+**Return**
+
+The ioctl() return code. Typically 0 on success.
+
+
+.. c:function:: void nvme_free_ctrl (struct nvme_ctrl *c)
+
+ Free controller
+
+**Parameters**
+
+``struct nvme_ctrl *c``
+ Controller instance
+
+
+.. c:function:: void nvme_unlink_ctrl (struct nvme_ctrl *c)
+
+ Unlink controller
+
+**Parameters**
+
+``struct nvme_ctrl *c``
+ Controller instance
+
+
+.. c:function:: const char * nvme_subsystem_get_nqn (nvme_subsystem_t s)
+
+ Retrieve NQN from subsystem
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+**Return**
+
+NQN of subsystem
+
+
+.. c:function:: const char * nvme_subsystem_get_sysfs_dir (nvme_subsystem_t s)
+
+ sysfs directory of an nvme_subsystem_t object
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+**Return**
+
+sysfs directory name of **s**
+
+
+.. c:function:: const char * nvme_subsystem_get_name (nvme_subsystem_t s)
+
+ sysfs name of an nvme_subsystem_t object
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+**Return**
+
+sysfs name of **s**
+
+
+.. c:function:: const char * nvme_subsystem_get_type (nvme_subsystem_t s)
+
+ Returns the type of a subsystem
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+**Description**
+
+Returns the subsystem type of **s**.
+
+**Return**
+
+'nvm' or 'discovery'
+
+
+.. c:function:: int nvme_scan_topology (nvme_root_t r, nvme_scan_filter_t f, void *f_args)
+
+ Scan NVMe topology and apply filter
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+``nvme_scan_filter_t f``
+ filter to apply
+
+``void *f_args``
+ user-specified argument to **f**
+
+**Description**
+
+Scans the NVMe topology and filters out the resulting elements
+by applying **f**.
+
+**Return**
+
+Number of elements scanned
+
+
+.. c:function:: const char * nvme_host_get_hostnqn (nvme_host_t h)
+
+ Host NQN of an nvme_host_t object
+
+**Parameters**
+
+``nvme_host_t h``
+ nvme_host_t object
+
+**Return**
+
+Host NQN of **h**
+
+
+.. c:function:: const char * nvme_host_get_hostid (nvme_host_t h)
+
+ Host ID of an nvme_host_t object
+
+**Parameters**
+
+``nvme_host_t h``
+ nvme_host_t object
+
+**Return**
+
+Host ID of **h**
+
+
+.. c:function:: void nvme_free_host (nvme_host_t h)
+
+ Free nvme_host_t object
+
+**Parameters**
+
+``nvme_host_t h``
+ nvme_host_t object
+
+
+.. c:function:: nvme_root_t nvme_scan (const char *config_file)
+
+ Scan NVMe topology
+
+**Parameters**
+
+``const char *config_file``
+ Configuration file
+
+**Return**
+
+nvme_root_t object of found elements
+
+
+.. c:function:: int nvme_read_config (nvme_root_t r, const char *config_file)
+
+ Read NVMe JSON configuration file
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+``const char *config_file``
+ JSON configuration file
+
+**Description**
+
+Read in the contents of **config_file** and merge them with
+the elements in **r**.
+
+**Return**
+
+0 on success, -1 on failure with errno set.
+
+
+.. c:function:: void nvme_refresh_topology (nvme_root_t r)
+
+ Refresh nvme_root_t object contents
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+**Description**
+
+Removes all elements in **r** and rescans the existing topology.
+
+
+.. c:function:: int nvme_update_config (nvme_root_t r)
+
+ Update JSON configuration
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+**Description**
+
+Updates the JSON configuration file with the contents of **r**.
+
+**Return**
+
+0 on success, -1 on failure.
+
+
+.. c:function:: int nvme_dump_config (nvme_root_t r)
+
+ Print the JSON configuration
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+**Description**
+
+Prints the current contents of the JSON configuration
+file to stdout.
+
+**Return**
+
+0 on success, -1 on failure.
+
+
+.. c:function:: int nvme_dump_tree (nvme_root_t r)
+
+ Dump internal object tree
+
+**Parameters**
+
+``nvme_root_t r``
+ nvme_root_t object
+
+**Description**
+
+Prints the internal object tree in JSON format
+to stdout.
+
+**Return**
+
+0 on success, -1 on failure.
+
+
+.. c:function:: char * nvme_get_attr (const char *d, const char *attr)
+
+ Read sysfs attribute
+
+**Parameters**
+
+``const char *d``
+ sysfs directory
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: char * nvme_get_subsys_attr (nvme_subsystem_t s, const char *attr)
+
+ Read subsystem sysfs attribute
+
+**Parameters**
+
+``nvme_subsystem_t s``
+ nvme_subsystem_t object
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: char * nvme_get_ctrl_attr (nvme_ctrl_t c, const char *attr)
+
+ Read controller sysfs attribute
+
+**Parameters**
+
+``nvme_ctrl_t c``
+ Controller instance
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: char * nvme_get_ns_attr (nvme_ns_t n, const char *attr)
+
+ Read namespace sysfs attribute
+
+**Parameters**
+
+``nvme_ns_t n``
+ nvme_ns_t object
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: nvme_ns_t nvme_subsystem_lookup_namespace (struct nvme_subsystem *s, __u32 nsid)
+
+ lookup namespace by NSID
+
+**Parameters**
+
+``struct nvme_subsystem *s``
+ nvme_subsystem_t object
+
+``__u32 nsid``
+ Namespace id
+
+**Return**
+
+nvme_ns_t of the namespace with id **nsid** in subsystem **s**
+
+
+.. c:function:: char * nvme_get_path_attr (nvme_path_t p, const char *attr)
+
+ Read path sysfs attribute
+
+**Parameters**
+
+``nvme_path_t p``
+ nvme_path_t object
+
+``const char *attr``
+ sysfs attribute name
+
+**Return**
+
+String with the contents of **attr** or ``NULL`` in case of an empty value
+ or in case of an error (indicated by non-zero errno code).
+
+
+.. c:function:: nvme_ns_t nvme_scan_namespace (const char *name)
+
+ scan namespace based on sysfs name
+
+**Parameters**
+
+``const char *name``
+ sysfs name of the namespace to scan
+
+**Return**
+
+nvme_ns_t object or NULL if not found.
+
+
+.. c:function:: const char * nvme_host_get_hostsymname (nvme_host_t h)
+
+ Get the host's symbolic name
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the symbolic name should be returned.
+
+**Return**
+
+The symbolic name or NULL if a symbolic name hasn't been
+configure.
+
+
+.. c:function:: void nvme_host_set_hostsymname (nvme_host_t h, const char *hostsymname)
+
+ Set the host's symbolic name
+
+**Parameters**
+
+``nvme_host_t h``
+ Host for which the symbolic name should be set.
+
+``const char *hostsymname``
+ Symbolic name
+
+
diff --git a/doc/rst/types.rst b/doc/rst/types.rst
new file mode 100644
index 0000000..43e2049
--- /dev/null
+++ b/doc/rst/types.rst
@@ -0,0 +1,10936 @@
+.. _types.h:
+
+**types.h**
+
+
+NVMe standard definitions
+
+.. c:macro:: NVME_GET
+
+``NVME_GET (value, name)``
+
+ extract field from complex value
+
+**Parameters**
+
+``value``
+ The original value of a complex field
+
+``name``
+ The name of the sub-field within an nvme value
+
+**Description**
+
+By convention, this library defines _SHIFT and _MASK such that mask can be
+applied after the shift to isolate a specific set of bits that decode to a
+sub-field.
+
+**Return**
+
+The 'name' field from 'value'
+
+
+.. c:macro:: NVME_SET
+
+``NVME_SET (value, name)``
+
+ set field into complex value
+
+**Parameters**
+
+``value``
+ The value to be set in its completed position
+
+``name``
+ The name of the sub-field within an nvme value
+
+**Return**
+
+The 'name' field from 'value'
+
+
+
+
+.. c:enum:: nvme_constants
+
+ A place to stash various constant nvme values
+
+**Constants**
+
+``NVME_NSID_ALL``
+ A broadcast value that is used to specify all
+ namespaces
+
+``NVME_NSID_NONE``
+ The invalid namespace id, for when the nsid
+ parameter is not used in a command
+
+``NVME_UUID_NONE``
+ Use to omit a uuid command parameter
+
+``NVME_CNTLID_NONE``
+ Use to omit a cntlid command parameter
+
+``NVME_CNSSPECID_NONE``
+ Use to omit a cns_specific_id command parameter
+
+``NVME_LOG_LSP_NONE``
+ Use to omit a log lsp command parameter
+
+``NVME_LOG_LSI_NONE``
+ Use to omit a log lsi command parameter
+
+``NVME_LOG_LPO_NONE``
+ Use to omit a log lpo command parameter
+
+``NVME_IDENTIFY_DATA_SIZE``
+ The transfer size for nvme identify commands
+
+``NVME_LOG_SUPPORTED_LOG_PAGES_MAX``
+ The largest possible index in the supported
+ log pages log.
+
+``NVME_ID_NVMSET_LIST_MAX``
+ The largest possible nvmset index in identify
+ nvmeset
+
+``NVME_ID_UUID_LIST_MAX``
+ The largest possible uuid index in identify
+ uuid list
+
+``NVME_ID_CTRL_LIST_MAX``
+ The largest possible controller index in
+ identify controller list
+
+``NVME_ID_NS_LIST_MAX``
+ The largest possible namespace index in
+ identify namespace list
+
+``NVME_ID_SECONDARY_CTRL_MAX``
+ The largest possible secondary controller index
+ in identify secondary controller
+
+``NVME_ID_DOMAIN_LIST_MAX``
+ The largest possible domain index in the
+ in domain list
+
+``NVME_ID_ENDURANCE_GROUP_LIST_MAX``
+ The largest possible endurance group
+ index in the endurance group list
+
+``NVME_ID_ND_DESCRIPTOR_MAX``
+ The largest possible namespace granularity
+ index in the namespace granularity descriptor
+ list
+
+``NVME_FEAT_LBA_RANGE_MAX``
+ The largest possible LBA range index in feature
+ lba range type
+
+``NVME_LOG_ST_MAX_RESULTS``
+ The largest possible self test result index in the
+ device self test log
+
+``NVME_LOG_TELEM_BLOCK_SIZE``
+ Specification defined size of Telemetry Data Blocks
+
+``NVME_LOG_FID_SUPPORTED_EFFECTS_MAX``
+ The largest possible FID index in the
+ feature identifiers effects log.
+
+``NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX``
+ The largest possible MI Command index
+ in the MI Command effects log.
+
+``NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_RESERVED``
+ The reserved space in the MI Command
+ effects log.
+
+``NVME_DSM_MAX_RANGES``
+ The largest possible range index in a data-set
+ management command
+
+``NVME_NQN_LENGTH``
+ Max length for NVMe Qualified Name
+
+``NVMF_TRADDR_SIZE``
+ Max Transport Address size
+
+``NVMF_TSAS_SIZE``
+ Max Transport Specific Address Subtype size
+
+``NVME_ZNS_CHANGED_ZONES_MAX``
+ Max number of zones in the changed zones log
+ page
+
+
+
+
+.. c:enum:: nvme_csi
+
+ Defined command set indicators
+
+**Constants**
+
+``NVME_CSI_NVM``
+ NVM Command Set Indicator
+
+``NVME_CSI_KV``
+ Key Value Command Set
+
+``NVME_CSI_ZNS``
+ Zoned Namespace Command Set
+
+
+
+
+.. c:enum:: nvme_register_offsets
+
+ controller registers for all transports. This is the layout of BAR0/1 for PCIe, and properties for fabrics.
+
+**Constants**
+
+``NVME_REG_CAP``
+ Controller Capabilities
+
+``NVME_REG_VS``
+ Version
+
+``NVME_REG_INTMS``
+ Interrupt Mask Set
+
+``NVME_REG_INTMC``
+ Interrupt Mask Clear
+
+``NVME_REG_CC``
+ Controller Configuration
+
+``NVME_REG_CSTS``
+ Controller Status
+
+``NVME_REG_NSSR``
+ NVM Subsystem Reset
+
+``NVME_REG_AQA``
+ Admin Queue Attributes
+
+``NVME_REG_ASQ``
+ Admin SQ Base Address
+
+``NVME_REG_ACQ``
+ Admin CQ Base Address
+
+``NVME_REG_CMBLOC``
+ Controller Memory Buffer Location
+
+``NVME_REG_CMBSZ``
+ Controller Memory Buffer Size
+
+``NVME_REG_BPINFO``
+ Boot Partition Information
+
+``NVME_REG_BPRSEL``
+ Boot Partition Read Select
+
+``NVME_REG_BPMBL``
+ Boot Partition Memory Buffer Location
+
+``NVME_REG_CMBMSC``
+ Controller Memory Buffer Memory Space Control
+
+``NVME_REG_CMBSTS``
+ Controller Memory Buffer Status
+
+``NVME_REG_CRTO``
+ Controller Ready Timeouts
+
+``NVME_REG_PMRCAP``
+ Persistent Memory Capabilities
+
+``NVME_REG_PMRCTL``
+ Persistent Memory Region Control
+
+``NVME_REG_PMRSTS``
+ Persistent Memory Region Status
+
+``NVME_REG_PMREBS``
+ Persistent Memory Region Elasticity Buffer Size
+
+``NVME_REG_PMRSWTP``
+ Memory Region Sustained Write Throughput
+
+``NVME_REG_PMRMSCL``
+ Persistent Memory Region Controller Memory Space Control Lower
+
+``NVME_REG_PMRMSCU``
+ Persistent Memory Region Controller Memory Space Control Upper
+
+
+.. c:function:: bool nvme_is_64bit_reg (__u32 offset)
+
+ Checks if offset of the controller register is a know 64bit value.
+
+**Parameters**
+
+``__u32 offset``
+ Offset of controller register field in bytes
+
+**Description**
+
+This function does not care about transport so that the offset is not going
+to be checked inside of this function for the unsupported fields in a
+specific transport. For example, BPMBL(Boot Partition Memory Buffer
+Location) register is not supported by fabrics, but it can be checked here.
+
+**Return**
+
+true if given offset is 64bit register, otherwise it returns false.
+
+
+.. c:function:: __u64 nvme_cmb_size (__u32 cmbsz)
+
+ Calculate size of the controller memory buffer
+
+**Parameters**
+
+``__u32 cmbsz``
+ Value from controller register ``NVME_REG_CMBSZ``
+
+**Return**
+
+size of controller memory buffer in bytes
+
+
+.. c:function:: __u64 nvme_pmr_size (__u32 pmrebs)
+
+ Calculate size of persistent memory region elasticity buffer
+
+**Parameters**
+
+``__u32 pmrebs``
+ Value from controller register ``NVME_REG_PMREBS``
+
+**Return**
+
+size of controller persistent memory buffer in bytes
+
+
+.. c:function:: __u64 nvme_pmr_throughput (__u32 pmrswtp)
+
+ Calculate throughput of persistent memory buffer
+
+**Parameters**
+
+``__u32 pmrswtp``
+ Value from controller register ``NVME_REG_PMRSWTP``
+
+**Return**
+
+throughput of controller persistent memory buffer in bytes/second
+
+
+
+
+.. c:enum:: nvme_psd_flags
+
+ Possible flag values in nvme power state descriptor
+
+**Constants**
+
+``NVME_PSD_FLAGS_MXPS``
+ Indicates the scale for the Maximum Power
+ field. If this bit is cleared, then the scale of the
+ Maximum Power field is in 0.01 Watts. If this bit is
+ set, then the scale of the Maximum Power field is in
+ 0.0001 Watts.
+
+``NVME_PSD_FLAGS_NOPS``
+ Indicates whether the controller processes I/O
+ commands in this power state. If this bit is cleared,
+ then the controller processes I/O commands in this
+ power state. If this bit is set, then the controller
+ does not process I/O commands in this power state.
+
+
+
+
+.. c:enum:: nvme_psd_ps
+
+ Known values for :c:type:`struct nvme_psd <nvme_psd>` ``ips`` and ``aps``. Use with nvme_psd_power_scale() to extract the power scale field to match this enum.
+
+**Constants**
+
+``NVME_PSD_PS_NOT_REPORTED``
+ Not reported
+
+``NVME_PSD_PS_100_MICRO_WATT``
+ 0.0001 watt scale
+
+``NVME_PSD_PS_10_MILLI_WATT``
+ 0.01 watt scale
+
+
+.. c:function:: unsigned int nvme_psd_power_scale (__u8 ps)
+
+ power scale occupies the upper 3 bits
+
+**Parameters**
+
+``__u8 ps``
+ power scale value
+
+**Return**
+
+power scale value
+
+
+
+
+.. c:enum:: nvme_psd_workload
+
+ Specifies a workload hint in the Power Management Feature (see :c:type:`struct nvme_psd <nvme_psd>`.apw) to inform the NVM subsystem or indicate the conditions for the active power level.
+
+**Constants**
+
+``NVME_PSD_WORKLOAD_NP``
+ The workload is unknown or not provided.
+
+``NVME_PSD_WORKLOAD_1``
+ Extended Idle Period with a Burst of Random Write
+ consists of five minutes of idle followed by
+ thirty-two random write commands of size 1 MiB
+ submitted to a single controller while all other
+ controllers in the NVM subsystem are idle, and then
+ thirty (30) seconds of idle.
+
+``NVME_PSD_WORKLOAD_2``
+ Heavy Sequential Writes consists of 80,000
+ sequential write commands of size 128 KiB submitted to
+ a single controller while all other controllers in the
+ NVM subsystem are idle. The submission queue(s)
+ should be sufficiently large allowing the host to
+ ensure there are multiple commands pending at all
+ times during the workload.
+
+
+
+
+.. c:struct:: nvme_id_psd
+
+ Power Management data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_psd {
+ __le16 mp;
+ __u8 rsvd2;
+ __u8 flags;
+ __le32 enlat;
+ __le32 exlat;
+ __u8 rrt;
+ __u8 rrl;
+ __u8 rwt;
+ __u8 rwl;
+ __le16 idlp;
+ __u8 ips;
+ __u8 rsvd19;
+ __le16 actp;
+ __u8 apws;
+ __u8 rsvd23[9];
+ };
+
+**Members**
+
+``mp``
+ Maximum Power indicates the sustained maximum power consumed by the
+ NVM subsystem in this power state. The power in Watts is equal to
+ the value in this field multiplied by the scale specified in the Max
+ Power Scale bit (see :c:type:`enum nvme_psd_flags <nvme_psd_flags>`). A value of 0 indicates
+ Maximum Power is not reported.
+
+``rsvd2``
+ Reserved
+
+``flags``
+ Additional decoding flags, see :c:type:`enum nvme_psd_flags <nvme_psd_flags>`.
+
+``enlat``
+ Entry Latency indicates the maximum latency in microseconds
+ associated with entering this power state. A value of 0 indicates
+ Entry Latency is not reported.
+
+``exlat``
+ Exit Latency indicates the maximum latency in microseconds
+ associated with exiting this power state. A value of 0 indicates
+ Exit Latency is not reported.
+
+``rrt``
+ Relative Read Throughput indicates the read throughput rank
+ associated with this power state relative to others. The value in
+ this is less than the number of supported power states.
+
+``rrl``
+ Relative Read Latency indicates the read latency rank associated
+ with this power state relative to others. The value in this field is
+ less than the number of supported power states.
+
+``rwt``
+ Relative Write Throughput indicates write throughput rank associated
+ with this power state relative to others. The value in this field is
+ less than the number of supported power states
+
+``rwl``
+ Relative Write Latency indicates the write latency rank associated
+ with this power state relative to others. The value in this field is
+ less than the number of supported power states
+
+``idlp``
+ Idle Power indicates the typical power consumed by the NVM
+ subsystem over 30 seconds in this power state when idle.
+
+``ips``
+ Idle Power Scale indicates the scale for :c:type:`struct nvme_id_psd <nvme_id_psd>`.idlp,
+ see :c:type:`enum nvme_psd_ps <nvme_psd_ps>` for decoding this field.
+
+``rsvd19``
+ Reserved
+
+``actp``
+ Active Power indicates the largest average power consumed by the
+ NVM subsystem over a 10 second period in this power state with
+ the workload indicated in the Active Power Workload field.
+
+``apws``
+ Bits 7-6: Active Power Scale(APS) indicates the scale for the :c:type:`struct
+ nvme_id_psd <nvme_id_psd>`.actp, see :c:type:`enum nvme_psd_ps <nvme_psd_ps>` for decoding this value.
+ Bits 2-0: Active Power Workload(APW) indicates the workload
+ used to calculate maximum power for this power state.
+ See :c:type:`enum nvme_psd_workload <nvme_psd_workload>` for decoding this field.
+
+``rsvd23``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_id_ctrl
+
+ Identify Controller data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_ctrl {
+ __le16 vid;
+ __le16 ssvid;
+ char sn[20];
+ char mn[40];
+ char fr[8];
+ __u8 rab;
+ __u8 ieee[3];
+ __u8 cmic;
+ __u8 mdts;
+ __le16 cntlid;
+ __le32 ver;
+ __le32 rtd3r;
+ __le32 rtd3e;
+ __le32 oaes;
+ __le32 ctratt;
+ __le16 rrls;
+ __u8 rsvd102[9];
+ __u8 cntrltype;
+ __u8 fguid[16];
+ __le16 crdt1;
+ __le16 crdt2;
+ __le16 crdt3;
+ __u8 rsvd134[119];
+ __u8 nvmsr;
+ __u8 vwci;
+ __u8 mec;
+ __le16 oacs;
+ __u8 acl;
+ __u8 aerl;
+ __u8 frmw;
+ __u8 lpa;
+ __u8 elpe;
+ __u8 npss;
+ __u8 avscc;
+ __u8 apsta;
+ __le16 wctemp;
+ __le16 cctemp;
+ __le16 mtfa;
+ __le32 hmpre;
+ __le32 hmmin;
+ __u8 tnvmcap[16];
+ __u8 unvmcap[16];
+ __le32 rpmbs;
+ __le16 edstt;
+ __u8 dsto;
+ __u8 fwug;
+ __le16 kas;
+ __le16 hctma;
+ __le16 mntmt;
+ __le16 mxtmt;
+ __le32 sanicap;
+ __le32 hmminds;
+ __le16 hmmaxd;
+ __le16 nsetidmax;
+ __le16 endgidmax;
+ __u8 anatt;
+ __u8 anacap;
+ __le32 anagrpmax;
+ __le32 nanagrpid;
+ __le32 pels;
+ __le16 domainid;
+ __u8 rsvd358[10];
+ __u8 megcap[16];
+ __u8 rsvd384[128];
+ __u8 sqes;
+ __u8 cqes;
+ __le16 maxcmd;
+ __le32 nn;
+ __le16 oncs;
+ __le16 fuses;
+ __u8 fna;
+ __u8 vwc;
+ __le16 awun;
+ __le16 awupf;
+ __u8 icsvscc;
+ __u8 nwpc;
+ __le16 acwu;
+ __le16 ocfs;
+ __le32 sgls;
+ __le32 mnan;
+ __u8 maxdna[16];
+ __le32 maxcna;
+ __u8 rsvd564[204];
+ char subnqn[NVME_NQN_LENGTH];
+ __u8 rsvd1024[768];
+ __le32 ioccsz;
+ __le32 iorcsz;
+ __le16 icdoff;
+ __u8 fcatt;
+ __u8 msdbd;
+ __le16 ofcs;
+ __u8 dctype;
+ __u8 rsvd1807[241];
+ struct nvme_id_psd psd[32];
+ __u8 vs[1024];
+ };
+
+**Members**
+
+``vid``
+ PCI Vendor ID, the company vendor identifier that is assigned by
+ the PCI SIG.
+
+``ssvid``
+ PCI Subsystem Vendor ID, the company vendor identifier that is
+ assigned by the PCI SIG for the subsystem.
+
+``sn``
+ Serial Number in ASCII
+
+``mn``
+ Model Number in ASCII
+
+``fr``
+ Firmware Revision in ASCII, the currently active firmware
+ revision for the NVM subsystem
+
+``rab``
+ Recommended Arbitration Burst, reported as a power of two
+
+``ieee``
+ IEEE assigned Organization Unique Identifier
+
+``cmic``
+ Controller Multipath IO and Namespace Sharing Capabilities of
+ the controller and NVM subsystem. See :c:type:`enum nvme_id_ctrl_cmic <nvme_id_ctrl_cmic>`.
+
+``mdts``
+ Max Data Transfer Size is the largest data transfer size. The
+ host should not submit a command that exceeds this maximum data
+ transfer size. The value is in units of the minimum memory page
+ size (CAP.MPSMIN) and is reported as a power of two
+
+``cntlid``
+ Controller ID, the NVM subsystem unique controller identifier
+ associated with the controller.
+
+``ver``
+ Version, this field contains the value reported in the Version
+ register, or property (see :c:type:`enum nvme_registers <nvme_registers>` ``NVME_REG_VS``).
+
+``rtd3r``
+ RTD3 Resume Latency, the expected latency in microseconds to resume
+ from Runtime D3
+
+``rtd3e``
+ RTD3 Exit Latency, the typical latency in microseconds to enter
+ Runtime D3.
+
+``oaes``
+ Optional Async Events Supported, see **enum** nvme_id_ctrl_oaes.
+
+``ctratt``
+ Controller Attributes, see **enum** nvme_id_ctrl_ctratt.
+
+``rrls``
+ Read Recovery Levels. If a bit is set, then the corresponding
+ Read Recovery Level is supported. If a bit is cleared, then the
+ corresponding Read Recovery Level is not supported.
+
+``rsvd102``
+ Reserved
+
+``cntrltype``
+ Controller Type, see :c:type:`enum nvme_id_ctrl_cntrltype <nvme_id_ctrl_cntrltype>`
+
+``fguid``
+ FRU GUID, a 128-bit value that is globally unique for a given
+ Field Replaceable Unit
+
+``crdt1``
+ Controller Retry Delay time in 100 millisecond units if CQE CRD
+ field is 1
+
+``crdt2``
+ Controller Retry Delay time in 100 millisecond units if CQE CRD
+ field is 2
+
+``crdt3``
+ Controller Retry Delay time in 100 millisecond units if CQE CRD
+ field is 3
+
+``rsvd134``
+ Reserved
+
+``nvmsr``
+ NVM Subsystem Report, see :c:type:`enum nvme_id_ctrl_nvmsr <nvme_id_ctrl_nvmsr>`
+
+``vwci``
+ VPD Write Cycle Information, see :c:type:`enum nvme_id_ctrl_vwci <nvme_id_ctrl_vwci>`
+
+``mec``
+ Management Endpoint Capabilities, see :c:type:`enum nvme_id_ctrl_mec <nvme_id_ctrl_mec>`
+
+``oacs``
+ Optional Admin Command Support,the optional Admin commands and
+ features supported by the controller, see :c:type:`enum nvme_id_ctrl_oacs <nvme_id_ctrl_oacs>`.
+
+``acl``
+ Abort Command Limit, the maximum number of concurrently
+ executing Abort commands supported by the controller. This is a
+ 0's based value.
+
+``aerl``
+ Async Event Request Limit, the maximum number of concurrently
+ outstanding Asynchronous Event Request commands supported by the
+ controller This is a 0's based value.
+
+``frmw``
+ Firmware Updates indicates capabilities regarding firmware
+ updates. See :c:type:`enum nvme_id_ctrl_frmw <nvme_id_ctrl_frmw>`.
+
+``lpa``
+ Log Page Attributes, see :c:type:`enum nvme_id_ctrl_lpa <nvme_id_ctrl_lpa>`.
+
+``elpe``
+ Error Log Page Entries, the maximum number of Error Information
+ log entries that are stored by the controller. This field is a
+ 0's based value.
+
+``npss``
+ Number of Power States Supported, the number of NVM Express
+ power states supported by the controller, indicating the number
+ of valid entries in :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.psd. This is a 0's
+ based value.
+
+``avscc``
+ Admin Vendor Specific Command Configuration, see
+ :c:type:`enum nvme_id_ctrl_avscc <nvme_id_ctrl_avscc>`.
+
+``apsta``
+ Autonomous Power State Transition Attributes, see
+ :c:type:`enum nvme_id_ctrl_apsta <nvme_id_ctrl_apsta>`.
+
+``wctemp``
+ Warning Composite Temperature Threshold indicates
+ the minimum Composite Temperature field value (see :c:type:`struct
+ nvme_smart_log <nvme_smart_log>`.critical_comp_time) that indicates an overheating
+ condition during which controller operation continues.
+
+``cctemp``
+ Critical Composite Temperature Threshold, field indicates the
+ minimum Composite Temperature field value (see :c:type:`struct
+ nvme_smart_log <nvme_smart_log>`.critical_comp_time) that indicates a critical
+ overheating condition.
+
+``mtfa``
+ Maximum Time for Firmware Activation indicates the maximum time
+ the controller temporarily stops processing commands to activate
+ the firmware image, specified in 100 millisecond units. This
+ field is always valid if the controller supports firmware
+ activation without a reset.
+
+``hmpre``
+ Host Memory Buffer Preferred Size indicates the preferred size
+ that the host is requested to allocate for the Host Memory
+ Buffer feature in 4 KiB units.
+
+``hmmin``
+ Host Memory Buffer Minimum Size indicates the minimum size that
+ the host is requested to allocate for the Host Memory Buffer
+ feature in 4 KiB units.
+
+``tnvmcap``
+ Total NVM Capacity, the total NVM capacity in the NVM subsystem.
+ The value is in bytes.
+
+``unvmcap``
+ Unallocated NVM Capacity, the unallocated NVM capacity in the
+ NVM subsystem. The value is in bytes.
+
+``rpmbs``
+ Replay Protected Memory Block Support, see
+ :c:type:`enum nvme_id_ctrl_rpmbs <nvme_id_ctrl_rpmbs>`.
+
+``edstt``
+ Extended Device Self-test Time, if Device Self-test command is
+ supported (see :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.oacs, ``NVME_CTRL_OACS_SELF_TEST``),
+ then this field indicates the nominal amount of time in one
+ minute units that the controller takes to complete an extended
+ device self-test operation when in power state 0.
+
+``dsto``
+ Device Self-test Options, see :c:type:`enum nvme_id_ctrl_dsto <nvme_id_ctrl_dsto>`.
+
+``fwug``
+ Firmware Update Granularity indicates the granularity and
+ alignment requirement of the firmware image being updated by the
+ Firmware Image Download command. The value is reported in 4 KiB
+ units. A value of 0h indicates no information on granularity is
+ provided. A value of FFh indicates no restriction
+
+``kas``
+ Keep Alive Support indicates the granularity of the Keep Alive
+ Timer in 100 millisecond units.
+
+``hctma``
+ Host Controlled Thermal Management Attributes, see
+ :c:type:`enum nvme_id_ctrl_hctm <nvme_id_ctrl_hctm>`.
+
+``mntmt``
+ Minimum Thermal Management Temperature indicates the minimum
+ temperature, in degrees Kelvin, that the host may request in the
+ Thermal Management Temperature 1 field and Thermal Management
+ Temperature 2 field of a Set Features command with the Feature
+ Identifier field set to ``NVME_FEAT_FID_HCTM``.
+
+``mxtmt``
+ Maximum Thermal Management Temperature indicates the maximum
+ temperature, in degrees Kelvin, that the host may request in the
+ Thermal Management Temperature 1 field and Thermal Management
+ Temperature 2 field of the Set Features command with the Feature
+ Identifier set to ``NVME_FEAT_FID_HCTM``.
+
+``sanicap``
+ Sanitize Capabilities, see :c:type:`enum nvme_id_ctrl_sanicap <nvme_id_ctrl_sanicap>`
+
+``hmminds``
+ Host Memory Buffer Minimum Descriptor Entry Size indicates the
+ minimum usable size of a Host Memory Buffer Descriptor Entry in
+ 4 KiB units.
+
+``hmmaxd``
+ Host Memory Maximum Descriptors Entries indicates the number of
+ usable Host Memory Buffer Descriptor Entries.
+
+``nsetidmax``
+ NVM Set Identifier Maximum, defines the maximum value of a valid
+ NVM Set Identifier for any controller in the NVM subsystem.
+
+``endgidmax``
+ Endurance Group Identifier Maximum, defines the maximum value of
+ a valid Endurance Group Identifier for any controller in the NVM
+ subsystem.
+
+``anatt``
+ ANA Transition Time indicates the maximum amount of time, in
+ seconds, for a transition between ANA states or the maximum
+ amount of time, in seconds, that the controller reports the ANA
+ change state.
+
+``anacap``
+ Asymmetric Namespace Access Capabilities, see
+ :c:type:`enum nvme_id_ctrl_anacap <nvme_id_ctrl_anacap>`.
+
+``anagrpmax``
+ ANA Group Identifier Maximum indicates the maximum value of a
+ valid ANA Group Identifier for any controller in the NVM
+ subsystem.
+
+``nanagrpid``
+ Number of ANA Group Identifiers indicates the number of ANA
+ groups supported by this controller.
+
+``pels``
+ Persistent Event Log Size indicates the maximum reportable size
+ for the Persistent Event Log.
+
+``domainid``
+ Domain Identifier indicates the identifier of the domain
+ that contains this controller.
+
+``rsvd358``
+ Reserved
+
+``megcap``
+ Max Endurance Group Capacity indicates the maximum capacity
+ of a single Endurance Group.
+
+``rsvd384``
+ Reserved
+
+``sqes``
+ Submission Queue Entry Size, see :c:type:`enum nvme_id_ctrl_sqes <nvme_id_ctrl_sqes>`.
+
+``cqes``
+ Completion Queue Entry Size, see :c:type:`enum nvme_id_ctrl_cqes <nvme_id_ctrl_cqes>`.
+
+``maxcmd``
+ Maximum Outstanding Commands indicates the maximum number of
+ commands that the controller processes at one time for a
+ particular queue.
+
+``nn``
+ Number of Namespaces indicates the maximum value of a valid
+ nsid for the NVM subsystem. If the MNAN (:c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.mnan
+ field is cleared to 0h, then this field also indicates the
+ maximum number of namespaces supported by the NVM subsystem.
+
+``oncs``
+ Optional NVM Command Support, see :c:type:`enum nvme_id_ctrl_oncs <nvme_id_ctrl_oncs>`.
+
+``fuses``
+ Fused Operation Support, see :c:type:`enum nvme_id_ctrl_fuses <nvme_id_ctrl_fuses>`.
+
+``fna``
+ Format NVM Attributes, see :c:type:`enum nvme_id_ctrl_fna <nvme_id_ctrl_fna>`.
+
+``vwc``
+ Volatile Write Cache, see :c:type:`enum nvme_id_ctrl_vwc <nvme_id_ctrl_vwc>`.
+
+``awun``
+ Atomic Write Unit Normal indicates the size of the write
+ operation guaranteed to be written atomically to the NVM across
+ all namespaces with any supported namespace format during normal
+ operation. This field is specified in logical blocks and is a
+ 0's based value.
+
+``awupf``
+ Atomic Write Unit Power Fail indicates the size of the write
+ operation guaranteed to be written atomically to the NVM across
+ all namespaces with any supported namespace format during a
+ power fail or error condition. This field is specified in
+ logical blocks and is a 0’s based value.
+
+``icsvscc``
+ NVM Vendor Specific Command Configuration, see
+ :c:type:`enum nvme_id_ctrl_nvscc <nvme_id_ctrl_nvscc>`.
+
+``nwpc``
+ Namespace Write Protection Capabilities, see
+ :c:type:`enum nvme_id_ctrl_nwpc <nvme_id_ctrl_nwpc>`.
+
+``acwu``
+ Atomic Compare & Write Unit indicates the size of the write
+ operation guaranteed to be written atomically to the NVM across
+ all namespaces with any supported namespace format for a Compare
+ and Write fused operation. This field is specified in logical
+ blocks and is a 0’s based value.
+
+``ocfs``
+ Optional Copy Formats Supported, each bit n means controller
+ supports Copy Format n.
+
+``sgls``
+ SGL Support, see :c:type:`enum nvme_id_ctrl_sgls <nvme_id_ctrl_sgls>`
+
+``mnan``
+ Maximum Number of Allowed Namespaces indicates the maximum
+ number of namespaces supported by the NVM subsystem.
+
+``maxdna``
+ Maximum Domain Namespace Attachments indicates the maximum
+ of the sum of the number of namespaces attached to each I/O
+ controller in the Domain.
+
+``maxcna``
+ Maximum I/O Controller Namespace Attachments indicates the
+ maximum number of namespaces that are allowed to be attached to
+ this I/O controller.
+
+``rsvd564``
+ Reserved
+
+``subnqn``
+ NVM Subsystem NVMe Qualified Name, UTF-8 null terminated string
+
+``rsvd1024``
+ Reserved
+
+``ioccsz``
+ I/O Queue Command Capsule Supported Size, defines the maximum
+ I/O command capsule size in 16 byte units.
+
+``iorcsz``
+ I/O Queue Response Capsule Supported Size, defines the maximum
+ I/O response capsule size in 16 byte units.
+
+``icdoff``
+ In Capsule Data Offset, defines the offset where data starts
+ within a capsule. This value is applicable to I/O Queues only.
+
+``fcatt``
+ Fabrics Controller Attributes, see :c:type:`enum nvme_id_ctrl_fcatt <nvme_id_ctrl_fcatt>`.
+
+``msdbd``
+ Maximum SGL Data Block Descriptors indicates the maximum
+ number of SGL Data Block or Keyed SGL Data Block descriptors
+ that a host is allowed to place in a capsule. A value of 0h
+ indicates no limit.
+
+``ofcs``
+ Optional Fabric Commands Support, see :c:type:`enum nvme_id_ctrl_ofcs <nvme_id_ctrl_ofcs>`.
+
+``dctype``
+ Discovery Controller Type (DCTYPE). This field indicates what
+ type of Discovery controller the controller is (see enum
+ nvme_id_ctrl_dctype)
+
+``rsvd1807``
+ Reserved
+
+``psd``
+ Power State Descriptors, see :c:type:`struct nvme_id_psd <nvme_id_psd>`.
+
+``vs``
+ Vendor Specific
+
+
+
+
+
+.. c:enum:: nvme_id_ctrl_cmic
+
+ Controller Multipath IO and Namespace Sharing Capabilities of the controller and NVM subsystem.
+
+**Constants**
+
+``NVME_CTRL_CMIC_MULTI_PORT``
+ If set, then the NVM subsystem may contain
+ more than one NVM subsystem port, otherwise
+ the NVM subsystem contains only a single
+ NVM subsystem port.
+
+``NVME_CTRL_CMIC_MULTI_CTRL``
+ If set, then the NVM subsystem may contain
+ two or more controllers, otherwise the
+ NVM subsystem contains only a single
+ controller. An NVM subsystem that contains
+ multiple controllers may be used by
+ multiple hosts, or may provide multiple
+ paths for a single host.
+
+``NVME_CTRL_CMIC_MULTI_SRIOV``
+ If set, then the controller is associated
+ with an SR-IOV Virtual Function, otherwise
+ it is associated with a PCI Function
+ or a Fabrics connection.
+
+``NVME_CTRL_CMIC_MULTI_ANA_REPORTING``
+ If set, then the NVM subsystem supports
+ Asymmetric Namespace Access Reporting.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_oaes
+
+ Optional Asynchronous Events Supported
+
+**Constants**
+
+``NVME_CTRL_OAES_NA``
+ Namespace Attribute Notices event supported
+
+``NVME_CTRL_OAES_FA``
+ Firmware Activation Notices event supported
+
+``NVME_CTRL_OAES_ANA``
+ ANA Change Notices supported
+
+``NVME_CTRL_OAES_PLEA``
+ Predictable Latency Event Aggregate Log
+ Change Notices event supported
+
+``NVME_CTRL_OAES_LBAS``
+ LBA Status Information Notices event supported
+
+``NVME_CTRL_OAES_EGE``
+ Endurance Group Events Aggregate Log Change
+ Notices event supported
+
+``NVME_CTRL_OAES_NS``
+ Normal NVM Subsystem Shutdown event supported
+
+``NVME_CTRL_OAES_ZD``
+ Zone Descriptor Change Notifications supported
+
+``NVME_CTRL_OAES_DL``
+ Discover Log Page Change Notifications supported
+
+
+
+
+.. c:enum:: nvme_id_ctrl_ctratt
+
+ Controller attributes
+
+**Constants**
+
+``NVME_CTRL_CTRATT_128_ID``
+ 128-bit Host Identifier supported
+
+``NVME_CTRL_CTRATT_NON_OP_PSP``
+ Non-Operational Poser State Permissive Mode
+ supported
+
+``NVME_CTRL_CTRATT_NVM_SETS``
+ NVM Sets supported
+
+``NVME_CTRL_CTRATT_READ_RECV_LVLS``
+ Read Recovery Levels supported
+
+``NVME_CTRL_CTRATT_ENDURANCE_GROUPS``
+ Endurance Groups supported
+
+``NVME_CTRL_CTRATT_PREDICTABLE_LAT``
+ Predictable Latency Mode supported
+
+``NVME_CTRL_CTRATT_TBKAS``
+ Traffic Based Keep Alive Support
+
+``NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY``
+ Namespace Granularity reporting
+ supported
+
+``NVME_CTRL_CTRATT_SQ_ASSOCIATIONS``
+ SQ Associations supported
+
+``NVME_CTRL_CTRATT_UUID_LIST``
+ UUID List reporting supported
+
+``NVME_CTRL_CTRATT_MDS``
+ Multi-Domain Subsystem supported
+
+``NVME_CTRL_CTRATT_FIXED_CAP``
+ Fixed Capacity Management supported
+
+``NVME_CTRL_CTRATT_VARIABLE_CAP``
+ Variable Capacity Management supported
+
+``NVME_CTRL_CTRATT_DEL_ENDURANCE_GROUPS``
+ Delete Endurance Groups supported
+
+``NVME_CTRL_CTRATT_DEL_NVM_SETS``
+ Delete NVM Sets supported
+
+``NVME_CTRL_CTRATT_ELBAS``
+ Extended LBA Formats supported
+
+
+
+
+.. c:enum:: nvme_id_ctrl_cntrltype
+
+ Controller types
+
+**Constants**
+
+``NVME_CTRL_CNTRLTYPE_IO``
+ NVM I/O controller
+
+``NVME_CTRL_CNTRLTYPE_DISCOVERY``
+ Discovery controller
+
+``NVME_CTRL_CNTRLTYPE_ADMIN``
+ Admin controller
+
+
+
+
+.. c:enum:: nvme_id_ctrl_dctype
+
+ Discovery Controller types
+
+**Constants**
+
+``NVME_CTRL_DCTYPE_NOT_REPORTED``
+ Not reported (I/O, Admin, and pre-TP8010)
+
+``NVME_CTRL_DCTYPE_DDC``
+ Direct Discovery controller
+
+``NVME_CTRL_DCTYPE_CDC``
+ Central Discovery controller
+
+
+
+
+.. c:enum:: nvme_id_ctrl_nvmsr
+
+ This field reports information associated with the NVM Subsystem, see :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.nvmsr.
+
+**Constants**
+
+``NVME_CTRL_NVMSR_NVMESD``
+ If set, then the NVM Subsystem is part of an NVMe
+ Storage Device; if cleared, then the NVM Subsystem
+ is not part of an NVMe Storage Device.
+
+``NVME_CTRL_NVMSR_NVMEE``
+ If set’, then the NVM Subsystem is part of an NVMe
+ Enclosure; if cleared, then the NVM Subsystem is
+ not part of an NVMe Enclosure.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_vwci
+
+ This field indicates information about remaining number of times that VPD contents are able to be updated using the VPD Write command, see :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.vwci.
+
+**Constants**
+
+``NVME_CTRL_VWCI_VWCR``
+ Mask to get value of VPD Write Cycles Remaining. If
+ the VPD Write Cycle Remaining Valid bit is set, then
+ this field contains a value indicating the remaining
+ number of times that VPD contents are able to be
+ updated using the VPD Write command. If this field is
+ set to 7Fh, then the remaining number of times that
+ VPD contents are able to be updated using the VPD
+ Write command is greater than or equal to 7Fh.
+
+``NVME_CTRL_VWCI_VWCRV``
+ VPD Write Cycle Remaining Valid. If this bit is set,
+ then the VPD Write Cycle Remaining field is valid. If
+ this bit is cleared, then the VPD Write Cycles
+ Remaining field is invalid and cleared to 0h.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_mec
+
+ Flags indicating the capabilities of the Management Endpoint in the Controller, :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.mec.
+
+**Constants**
+
+``NVME_CTRL_MEC_SMBUSME``
+ If set, then the NVM Subsystem contains a Management
+ Endpoint on an SMBus/I2C port.
+
+``NVME_CTRL_MEC_PCIEME``
+ If set, then the NVM Subsystem contains a Management
+ Endpoint on a PCIe port.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_oacs
+
+ Flags indicating the optional Admin commands and features supported by the controller, see :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.oacs.
+
+**Constants**
+
+``NVME_CTRL_OACS_SECURITY``
+ If set, then the controller supports the
+ Security Send and Security Receive commands.
+
+``NVME_CTRL_OACS_FORMAT``
+ If set then the controller supports the Format
+ NVM command.
+
+``NVME_CTRL_OACS_FW``
+ If set, then the controller supports the
+ Firmware Commit and Firmware Image Download commands.
+
+``NVME_CTRL_OACS_NS_MGMT``
+ If set, then the controller supports the
+ Namespace Management capability
+
+``NVME_CTRL_OACS_SELF_TEST``
+ If set, then the controller supports the Device
+ Self-test command.
+
+``NVME_CTRL_OACS_DIRECTIVES``
+ If set, then the controller supports Directives
+ and the Directive Send and Directive Receive
+ commands.
+
+``NVME_CTRL_OACS_NVME_MI``
+ If set, then the controller supports the NVMe-MI
+ Send and NVMe-MI Receive commands.
+
+``NVME_CTRL_OACS_VIRT_MGMT``
+ If set, then the controller supports the
+ Virtualization Management command.
+
+``NVME_CTRL_OACS_DBBUF_CFG``
+ If set, then the controller supports the
+ Doorbell Buffer Config command.
+
+``NVME_CTRL_OACS_LBA_STATUS``
+ If set, then the controller supports the Get LBA
+ Status capability.
+
+``NVME_CTRL_OACS_CMD_FEAT_LD``
+ If set, then the controller supports the command
+ and feature lockdown capability.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_frmw
+
+ Flags and values indicates capabilities regarding firmware updates from :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.frmw.
+
+**Constants**
+
+``NVME_CTRL_FRMW_1ST_RO``
+ If set, the first firmware slot is readonly
+
+``NVME_CTRL_FRMW_NR_SLOTS``
+ Mask to get the value of the number of
+ firmware slots that the controller supports.
+
+``NVME_CTRL_FRMW_FW_ACT_NO_RESET``
+ If set, the controller supports firmware
+ activation without a reset.
+
+``NVME_CTRL_FRMW_MP_UP_DETECTION``
+ If set, the controller is able to detect
+ overlapping firmware/boot partition
+ image update.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_lpa
+
+ Flags indicating optional attributes for log pages that are accessed via the Get Log Page command.
+
+**Constants**
+
+``NVME_CTRL_LPA_SMART_PER_NS``
+ If set, controller supports SMART/Health log
+ page on a per namespace basis.
+
+``NVME_CTRL_LPA_CMD_EFFECTS``
+ If Set, the controller supports the commands
+ supported and effects log page.
+
+``NVME_CTRL_LPA_EXTENDED``
+ If set, the controller supports extended data
+ for log page command including extended number
+ of dwords and log page offset fields.
+
+``NVME_CTRL_LPA_TELEMETRY``
+ If set, the controller supports the telemetry
+ host-initiated and telemetry controller-initiated
+ log pages and sending telemetry log notices.
+
+``NVME_CTRL_LPA_PERSETENT_EVENT``
+ If set, the controller supports
+ persistent event log.
+
+``NVME_CTRL_LPA_LI0_LI5_LI12_LI13``
+ If set, the controller supports
+ - log pages log page.
+ - returning scope of each command in
+ commands supported and effects log
+ page.
+ - feature identifiers supported and
+ effects log page.
+ - NVMe-MI commands supported and
+ effects log page.
+
+``NVME_CTRL_LPA_DA4_TELEMETRY``
+ If set, the controller supports data
+ area 4 for telemetry host-initiated and
+ telemetry.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_avscc
+
+ Flags indicating the configuration settings for Admin Vendor Specific command handling.
+
+**Constants**
+
+``NVME_CTRL_AVSCC_AVS``
+ If set, all Admin Vendor Specific Commands use the
+ optional vendor specific command format with NDT and
+ NDM fields.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_apsta
+
+ Flags indicating the attributes of the autonomous power state transition feature.
+
+**Constants**
+
+``NVME_CTRL_APSTA_APST``
+ If set, then the controller supports autonomous power
+ state transitions.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_rpmbs
+
+ This field indicates if the controller supports one or more Replay Protected Memory Blocks, from :c:type:`struct nvme_id_ctrl <nvme_id_ctrl>`.rpmbs.
+
+**Constants**
+
+``NVME_CTRL_RPMBS_NR_UNITS``
+ Mask to get the value of the Number of RPMB Units
+
+``NVME_CTRL_RPMBS_AUTH_METHOD``
+ Mask to get the value of the Authentication Method
+
+``NVME_CTRL_RPMBS_TOTAL_SIZE``
+ Mask to get the value of Total Size
+
+``NVME_CTRL_RPMBS_ACCESS_SIZE``
+ Mask to get the value of Access Size
+
+
+
+
+.. c:enum:: nvme_id_ctrl_dsto
+
+ Flags indicating the optional Device Self-test command or operation behaviors supported by the controller or NVM subsystem.
+
+**Constants**
+
+``NVME_CTRL_DSTO_ONE_DST``
+ If set, then the NVM subsystem supports only one
+ device self-test operation in progress at a time.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_hctm
+
+ Flags indicate the attributes of the host controlled thermal management feature
+
+**Constants**
+
+``NVME_CTRL_HCTMA_HCTM``
+ then the controller supports host controlled thermal
+ management, and the Set Features command and Get
+ Features command with the Feature Identifier field
+ set to ``NVME_FEAT_FID_HCTM``.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_sanicap
+
+ Indicates attributes for sanitize operations.
+
+**Constants**
+
+``NVME_CTRL_SANICAP_CES``
+ Crypto Erase Support. If set, then the
+ controller supports the Crypto Erase sanitize operation.
+
+``NVME_CTRL_SANICAP_BES``
+ Block Erase Support. If set, then the controller
+ supports the Block Erase sanitize operation.
+
+``NVME_CTRL_SANICAP_OWS``
+ Overwrite Support. If set, then the controller
+ supports the Overwrite sanitize operation.
+
+``NVME_CTRL_SANICAP_NDI``
+ No-Deallocate Inhibited. If set and the No-
+ Deallocate Response Mode bit is set, then the
+ controller deallocates after the sanitize
+ operation even if the No-Deallocate After
+ Sanitize bit is set in a Sanitize command.
+
+``NVME_CTRL_SANICAP_NODMMAS``
+ No-Deallocate Modifies Media After Sanitize,
+ mask to extract value.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_anacap
+
+ This field indicates the capabilities associated with Asymmetric Namespace Access Reporting.
+
+**Constants**
+
+``NVME_CTRL_ANACAP_OPT``
+ If set, then the controller is able to
+ report ANA Optimized state.
+
+``NVME_CTRL_ANACAP_NON_OPT``
+ If set, then the controller is able to
+ report ANA Non-Optimized state.
+
+``NVME_CTRL_ANACAP_INACCESSIBLE``
+ If set, then the controller is able to
+ report ANA Inaccessible state.
+
+``NVME_CTRL_ANACAP_PERSISTENT_LOSS``
+ If set, then the controller is able to
+ report ANA Persistent Loss state.
+
+``NVME_CTRL_ANACAP_CHANGE``
+ If set, then the controller is able to
+ report ANA Change state.
+
+``NVME_CTRL_ANACAP_GRPID_NO_CHG``
+ If set, then the ANAGRPID field in the
+ Identify Namespace data structure
+ (:c:type:`struct nvme_id_ns <nvme_id_ns>`.anagrpid), does not
+ change while the namespace is attached to
+ any controller.
+
+``NVME_CTRL_ANACAP_GRPID_MGMT``
+ If set, then the controller supports a
+ non-zero value in the ANAGRPID field of
+ the Namespace Management command.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_sqes
+
+ Defines the required and maximum Submission Queue entry size when using the NVM Command Set.
+
+**Constants**
+
+``NVME_CTRL_SQES_MIN``
+ Mask to get the value of the required Submission Queue
+ Entry size when using the NVM Command Set.
+
+``NVME_CTRL_SQES_MAX``
+ Mask to get the value of the maximum Submission Queue
+ entry size when using the NVM Command Set.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_cqes
+
+ Defines the required and maximum Completion Queue entry size when using the NVM Command Set.
+
+**Constants**
+
+``NVME_CTRL_CQES_MIN``
+ Mask to get the value of the required Completion Queue
+ Entry size when using the NVM Command Set.
+
+``NVME_CTRL_CQES_MAX``
+ Mask to get the value of the maximum Completion Queue
+ entry size when using the NVM Command Set.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_oncs
+
+ This field indicates the optional NVM commands and features supported by the controller.
+
+**Constants**
+
+``NVME_CTRL_ONCS_COMPARE``
+ If set, then the controller supports
+ the Compare command.
+
+``NVME_CTRL_ONCS_WRITE_UNCORRECTABLE``
+ If set, then the controller supports
+ the Write Uncorrectable command.
+
+``NVME_CTRL_ONCS_DSM``
+ If set, then the controller supports
+ the Dataset Management command.
+
+``NVME_CTRL_ONCS_WRITE_ZEROES``
+ If set, then the controller supports
+ the Write Zeroes command.
+
+``NVME_CTRL_ONCS_SAVE_FEATURES``
+ If set, then the controller supports
+ the Save field set to a non-zero value
+ in the Set Features command and the
+ Select field set to a non-zero value in
+ the Get Features command.
+
+``NVME_CTRL_ONCS_RESERVATIONS``
+ If set, then the controller supports
+ reservations.
+
+``NVME_CTRL_ONCS_TIMESTAMP``
+ If set, then the controller supports
+ the Timestamp feature.
+
+``NVME_CTRL_ONCS_VERIFY``
+ If set, then the controller supports
+ the Verify command.
+
+``NVME_CTRL_ONCS_COPY``
+ If set, then the controller supports
+ the copy command.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_fuses
+
+ This field indicates the fused operations that the controller supports.
+
+**Constants**
+
+``NVME_CTRL_FUSES_COMPARE_AND_WRITE``
+ If set, then the controller supports the
+ Compare and Write fused operation.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_fna
+
+ This field indicates attributes for the Format NVM command.
+
+**Constants**
+
+``NVME_CTRL_FNA_FMT_ALL_NAMESPACES``
+ If set, then all namespaces in an NVM
+ subsystem shall be configured with the
+ same attributes and a format (excluding
+ secure erase) of any namespace results in
+ a format of all namespaces in an NVM
+ subsystem. If cleared, then the
+ controller supports format on a per
+ namespace basis.
+
+``NVME_CTRL_FNA_SEC_ALL_NAMESPACES``
+ If set, then any secure erase performed
+ as part of a format operation results in
+ a secure erase of all namespaces in the
+ NVM subsystem. If cleared, then any
+ secure erase performed as part of a
+ format results in a secure erase of the
+ particular namespace specified.
+
+``NVME_CTRL_FNA_CRYPTO_ERASE``
+ If set, then cryptographic erase is
+ supported. If cleared, then cryptographic
+ erase is not supported.
+
+``NVME_CTRL_FNA_NSID_FFFFFFFF``
+ If set, then format does not support
+ nsid value set to FFFFFFFFh. If cleared,
+ format supports nsid value set to
+ FFFFFFFFh.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_vwc
+
+ Volatile write cache
+
+**Constants**
+
+``NVME_CTRL_VWC_PRESENT``
+ If set, indicates a volatile write cache is present.
+ If a volatile write cache is present, then the host
+ controls whether the volatile write cache is enabled
+ with a Set Features command specifying the value
+ ``NVME_FEAT_FID_VOLATILE_WC``.
+
+``NVME_CTRL_VWC_FLUSH``
+ Mask to get the value of the flush command behavior.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_nvscc
+
+ This field indicates the configuration settings for NVM Vendor Specific command handling.
+
+**Constants**
+
+``NVME_CTRL_NVSCC_FMT``
+ If set, all NVM Vendor Specific Commands use the
+ format with NDT and NDM fields.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_nwpc
+
+ This field indicates the optional namespace write protection capabilities supported by the controller.
+
+**Constants**
+
+``NVME_CTRL_NWPC_WRITE_PROTECT``
+ If set, then the controller shall
+ support the No Write Protect and
+ Write Protect namespace write
+ protection states and may support
+ the Write Protect Until Power
+ Cycle state and Permanent Write
+ Protect namespace write
+ protection states.
+
+``NVME_CTRL_NWPC_WRITE_PROTECT_POWER_CYCLE``
+ If set, then the controller
+ supports the Write Protect Until
+ Power Cycle state.
+
+``NVME_CTRL_NWPC_WRITE_PROTECT_PERMANENT``
+ If set, then the controller
+ supports the Permanent Write
+ Protect state.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_sgls
+
+ This field indicates if SGLs are supported for the NVM Command Set and the particular SGL types supported.
+
+**Constants**
+
+``NVME_CTRL_SGLS_SUPPORTED``
+
+``NVME_CTRL_SGLS_KEYED``
+
+``NVME_CTRL_SGLS_BIT_BUCKET``
+
+``NVME_CTRL_SGLS_MPTR_BYTE_ALIGNED``
+
+``NVME_CTRL_SGLS_OVERSIZE``
+
+``NVME_CTRL_SGLS_MPTR_SGL``
+
+``NVME_CTRL_SGLS_OFFSET``
+
+``NVME_CTRL_SGLS_TPORT``
+
+
+
+
+.. c:enum:: nvme_id_ctrl_fcatt
+
+ This field indicates attributes of the controller that are specific to NVMe over Fabrics.
+
+**Constants**
+
+``NVME_CTRL_FCATT_DYNAMIC``
+ If cleared, then the NVM subsystem uses a dynamic
+ controller model. If set, then the NVM subsystem
+ uses a static controller model.
+
+
+
+
+.. c:enum:: nvme_id_ctrl_ofcs
+
+ Indicate whether the controller supports optional fabric commands.
+
+**Constants**
+
+``NVME_CTRL_OFCS_DISCONNECT``
+ If set, then the controller supports the
+ Disconnect command and deletion of individual
+ I/O Queues.
+
+
+
+
+.. c:struct:: nvme_lbaf
+
+ LBA Format Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_lbaf {
+ __le16 ms;
+ __u8 ds;
+ __u8 rp;
+ };
+
+**Members**
+
+``ms``
+ Metadata Size indicates the number of metadata bytes provided per LBA
+ based on the LBA Data Size indicated.
+
+``ds``
+ LBA Data Size indicates the LBA data size supported, reported as a
+ power of two.
+
+``rp``
+ Relative Performance, see :c:type:`enum nvme_lbaf_rp <nvme_lbaf_rp>`.
+
+
+
+
+
+.. c:enum:: nvme_lbaf_rp
+
+ This field indicates the relative performance of the LBA format indicated relative to other LBA formats supported by the controller.
+
+**Constants**
+
+``NVME_LBAF_RP_BEST``
+ Best performance
+
+``NVME_LBAF_RP_BETTER``
+ Better performance
+
+``NVME_LBAF_RP_GOOD``
+ Good performance
+
+``NVME_LBAF_RP_DEGRADED``
+ Degraded performance
+
+``NVME_LBAF_RP_MASK``
+ Mask to get the relative performance value from the
+ field
+
+
+
+
+.. c:struct:: nvme_id_ns
+
+ Identify Namespace data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_ns {
+ __le64 nsze;
+ __le64 ncap;
+ __le64 nuse;
+ __u8 nsfeat;
+ __u8 nlbaf;
+ __u8 flbas;
+ __u8 mc;
+ __u8 dpc;
+ __u8 dps;
+ __u8 nmic;
+ __u8 rescap;
+ __u8 fpi;
+ __u8 dlfeat;
+ __le16 nawun;
+ __le16 nawupf;
+ __le16 nacwu;
+ __le16 nabsn;
+ __le16 nabo;
+ __le16 nabspf;
+ __le16 noiob;
+ __u8 nvmcap[16];
+ __le16 npwg;
+ __le16 npwa;
+ __le16 npdg;
+ __le16 npda;
+ __le16 nows;
+ __le16 mssrl;
+ __le32 mcl;
+ __u8 msrc;
+ __u8 rsvd81;
+ __u8 nulbaf;
+ __u8 rsvd83[9];
+ __le32 anagrpid;
+ __u8 rsvd96[3];
+ __u8 nsattr;
+ __le16 nvmsetid;
+ __le16 endgid;
+ __u8 nguid[16];
+ __u8 eui64[8];
+ struct nvme_lbaf lbaf[64];
+ __le64 lbstm;
+ __u8 vs[3704];
+ };
+
+**Members**
+
+``nsze``
+ Namespace Size indicates the total size of the namespace in
+ logical blocks. The number of logical blocks is based on the
+ formatted LBA size.
+
+``ncap``
+ Namespace Capacity indicates the maximum number of logical blocks
+ that may be allocated in the namespace at any point in time. The
+ number of logical blocks is based on the formatted LBA size.
+
+``nuse``
+ Namespace Utilization indicates the current number of logical
+ blocks allocated in the namespace. This field is smaller than or
+ equal to the Namespace Capacity. The number of logical blocks is
+ based on the formatted LBA size.
+
+``nsfeat``
+ Namespace Features, see :c:type:`enum nvme_id_nsfeat <nvme_id_nsfeat>`.
+
+``nlbaf``
+ Number of LBA Formats defines the number of supported LBA data
+ size and metadata size combinations supported by the namespace
+ and the highest possible index to :c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
+
+``flbas``
+ Formatted LBA Size, see :c:type:`enum nvme_id_ns_flbas <nvme_id_ns_flbas>`.
+
+``mc``
+ Metadata Capabilities, see :c:type:`enum nvme_id_ns_mc <nvme_id_ns_mc>`.
+
+``dpc``
+ End-to-end Data Protection Capabilities, see
+ :c:type:`enum nvme_id_ns_dpc <nvme_id_ns_dpc>`.
+
+``dps``
+ End-to-end Data Protection Type Settings, see
+ :c:type:`enum nvme_id_ns_dps <nvme_id_ns_dps>`.
+
+``nmic``
+ Namespace Multi-path I/O and Namespace Sharing Capabilities, see
+ :c:type:`enum nvme_id_ns_nmic <nvme_id_ns_nmic>`.
+
+``rescap``
+ Reservation Capabilities, see :c:type:`enum nvme_id_ns_rescap <nvme_id_ns_rescap>`.
+
+``fpi``
+ Format Progress Indicator, see :c:type:`enum nvme_nd_ns_fpi <nvme_nd_ns_fpi>`.
+
+``dlfeat``
+ Deallocate Logical Block Features, see :c:type:`enum nvme_id_ns_dlfeat <nvme_id_ns_dlfeat>`.
+
+``nawun``
+ Namespace Atomic Write Unit Normal indicates the
+ namespace specific size of the write operation guaranteed to be
+ written atomically to the NVM during normal operation.
+
+``nawupf``
+ Namespace Atomic Write Unit Power Fail indicates the
+ namespace specific size of the write operation guaranteed to be
+ written atomically to the NVM during a power fail or error
+ condition.
+
+``nacwu``
+ Namespace Atomic Compare & Write Unit indicates the namespace
+ specific size of the write operation guaranteed to be written
+ atomically to the NVM for a Compare and Write fused command.
+
+``nabsn``
+ Namespace Atomic Boundary Size Normal indicates the atomic
+ boundary size for this namespace for the NAWUN value. This field
+ is specified in logical blocks.
+
+``nabo``
+ Namespace Atomic Boundary Offset indicates the LBA on this
+ namespace where the first atomic boundary starts.
+
+``nabspf``
+ Namespace Atomic Boundary Size Power Fail indicates the atomic
+ boundary size for this namespace specific to the Namespace Atomic
+ Write Unit Power Fail value. This field is specified in logical
+ blocks.
+
+``noiob``
+ Namespace Optimal I/O Boundary indicates the optimal I/O boundary
+ for this namespace. This field is specified in logical blocks.
+ The host should construct Read and Write commands that do not
+ cross the I/O boundary to achieve optimal performance.
+
+``nvmcap``
+ NVM Capacity indicates the total size of the NVM allocated to
+ this namespace. The value is in bytes.
+
+``npwg``
+ Namespace Preferred Write Granularity indicates the smallest
+ recommended write granularity in logical blocks for this
+ namespace. This is a 0's based value.
+
+``npwa``
+ Namespace Preferred Write Alignment indicates the recommended
+ write alignment in logical blocks for this namespace. This is a
+ 0's based value.
+
+``npdg``
+ Namespace Preferred Deallocate Granularity indicates the
+ recommended granularity in logical blocks for the Dataset
+ Management command with the Attribute - Deallocate bit.
+
+``npda``
+ Namespace Preferred Deallocate Alignment indicates the
+ recommended alignment in logical blocks for the Dataset
+ Management command with the Attribute - Deallocate bit
+
+``nows``
+ Namespace Optimal Write Size indicates the size in logical blocks
+ for optimal write performance for this namespace. This is a 0's
+ based value.
+
+``mssrl``
+ Maximum Single Source Range Length indicates the maximum number
+ of logical blocks that may be specified in each valid Source Range
+ field of a Copy command.
+
+``mcl``
+ Maximum Copy Length indicates the maximum number of logical
+ blocks that may be specified in a Copy command.
+
+``msrc``
+ Maximum Source Range Count indicates the maximum number of Source
+ Range entries that may be used to specify source data in a Copy
+ command. This is a 0’s based value.
+
+``rsvd81``
+ Reserved
+
+``nulbaf``
+ Number of Unique Capability LBA Formats defines the number of
+ supported user data size and metadata size combinations supported
+ by the namespace that may not share the same capabilities. LBA
+ formats shall be allocated in order and packed sequentially.
+
+``rsvd83``
+ Reserved
+
+``anagrpid``
+ ANA Group Identifier indicates the ANA Group Identifier of the
+ ANA group of which the namespace is a member.
+
+``rsvd96``
+ Reserved
+
+``nsattr``
+ Namespace Attributes, see :c:type:`enum nvme_id_ns_attr <nvme_id_ns_attr>`.
+
+``nvmsetid``
+ NVM Set Identifier indicates the NVM Set with which this
+ namespace is associated.
+
+``endgid``
+ Endurance Group Identifier indicates the Endurance Group with
+ which this namespace is associated.
+
+``nguid``
+ Namespace Globally Unique Identifier contains a 128-bit value
+ that is globally unique and assigned to the namespace when the
+ namespace is created. This field remains fixed throughout the
+ life of the namespace and is preserved across namespace and
+ controller operations
+
+``eui64``
+ IEEE Extended Unique Identifier contains a 64-bit IEEE Extended
+ Unique Identifier (EUI-64) that is globally unique and assigned
+ to the namespace when the namespace is created. This field
+ remains fixed throughout the life of the namespace and is
+ preserved across namespace and controller operations
+
+``lbaf``
+ LBA Format, see :c:type:`struct nvme_lbaf <nvme_lbaf>`.
+
+``lbstm``
+ Logical Block Storage Tag Mask for end-to-end protection
+
+``vs``
+ Vendor Specific
+
+
+
+
+
+.. c:enum:: nvme_id_nsfeat
+
+ This field defines features of the namespace.
+
+**Constants**
+
+``NVME_NS_FEAT_THIN``
+ If set, indicates that the namespace supports thin
+ provisioning. Specifically, the Namespace Capacity
+ reported may be less than the Namespace Size.
+
+``NVME_NS_FEAT_NATOMIC``
+ If set, indicates that the fields NAWUN, NAWUPF, and
+ NACWU are defined for this namespace and should be
+ used by the host for this namespace instead of the
+ AWUN, AWUPF, and ACWU fields in the Identify
+ Controller data structure.
+
+``NVME_NS_FEAT_DULBE``
+ If set, indicates that the controller supports the
+ Deallocated or Unwritten Logical Block error for
+ this namespace.
+
+``NVME_NS_FEAT_ID_REUSE``
+ If set, indicates that the value in the NGUID field
+ for this namespace, if non- zero, is never reused by
+ the controller and that the value in the EUI64 field
+ for this namespace, if non-zero, is never reused by
+ the controller.
+
+``NVME_NS_FEAT_IO_OPT``
+ If set, indicates that the fields NPWG, NPWA, NPDG,
+ NPDA, and NOWS are defined for this namespace and
+ should be used by the host for I/O optimization
+
+
+
+
+.. c:enum:: nvme_id_ns_flbas
+
+ This field indicates the LBA data size & metadata size combination that the namespace has been formatted with
+
+**Constants**
+
+``NVME_NS_FLBAS_LOWER_MASK``
+ Mask to get the index of one of the supported
+ LBA Formats's least significant
+ 4bits indicated in
+ :c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
+
+``NVME_NS_FLBAS_META_EXT``
+ Applicable only if format contains metadata. If
+ this bit is set, indicates that the metadata is
+ transferred at the end of the data LBA, creating an
+ extended data LBA. If cleared, indicates that all
+ of the metadata for a command is transferred as a
+ separate contiguous buffer of data.
+
+``NVME_NS_FLBAS_HIGHER_MASK``
+ Mask to get the index of one of
+ the supported LBA Formats's most significant
+ 2bits indicated in
+ :c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
+
+
+
+
+.. c:enum:: nvme_nvm_id_ns_elbaf
+
+ This field indicates the extended LBA format
+
+**Constants**
+
+``NVME_NVM_ELBAF_STS_MASK``
+ Mask to get the storage tag size used to determine
+ the variable-sized storage tag/reference tag fields
+
+``NVME_NVM_ELBAF_PIF_MASK``
+ Mask to get the protection information format for
+ the extended LBA format.
+
+
+
+
+.. c:enum:: nvme_id_ns_mc
+
+ This field indicates the capabilities for metadata.
+
+**Constants**
+
+``NVME_NS_MC_EXTENDED``
+ If set, indicates the namespace supports the metadata
+ being transferred as part of a separate buffer that is
+ specified in the Metadata Pointer.
+
+``NVME_NS_MC_SEPARATE``
+ If set, indicates that the namespace supports the
+ metadata being transferred as part of an extended data LBA.
+
+
+
+
+.. c:enum:: nvme_id_ns_dpc
+
+ This field indicates the capabilities for the end-to-end data protection feature.
+
+**Constants**
+
+``NVME_NS_DPC_PI_TYPE1``
+ If set, indicates that the namespace supports
+ Protection Information Type 1.
+
+``NVME_NS_DPC_PI_TYPE2``
+ If set, indicates that the namespace supports
+ Protection Information Type 2.
+
+``NVME_NS_DPC_PI_TYPE3``
+ If set, indicates that the namespace supports
+ Protection Information Type 3.
+
+``NVME_NS_DPC_PI_FIRST``
+ If set, indicates that the namespace supports
+ protection information transferred as the first eight
+ bytes of metadata.
+
+``NVME_NS_DPC_PI_LAST``
+ If set, indicates that the namespace supports
+ protection information transferred as the last eight
+ bytes of metadata.
+
+
+
+
+.. c:enum:: nvme_id_ns_dps
+
+ This field indicates the Type settings for the end-to-end data protection feature.
+
+**Constants**
+
+``NVME_NS_DPS_PI_NONE``
+ Protection information is not enabled
+
+``NVME_NS_DPS_PI_TYPE1``
+ Protection information is enabled, Type 1
+
+``NVME_NS_DPS_PI_TYPE2``
+ Protection information is enabled, Type 2
+
+``NVME_NS_DPS_PI_TYPE3``
+ Protection information is enabled, Type 3
+
+``NVME_NS_DPS_PI_MASK``
+ Mask to get the value of the PI type
+
+``NVME_NS_DPS_PI_FIRST``
+ If set, indicates that the protection information, if
+ enabled, is transferred as the first eight bytes of
+ metadata.
+
+
+
+
+.. c:enum:: nvme_id_ns_nmic
+
+ This field specifies multi-path I/O and namespace sharing capabilities of the namespace.
+
+**Constants**
+
+``NVME_NS_NMIC_SHARED``
+ If set, then the namespace may be attached to two or
+ more controllers in the NVM subsystem concurrently
+
+
+
+
+.. c:enum:: nvme_id_ns_rescap
+
+ This field indicates the reservation capabilities of the namespace.
+
+**Constants**
+
+``NVME_NS_RESCAP_PTPL``
+ If set, indicates that the namespace supports the
+ Persist Through Power Loss capability.
+
+``NVME_NS_RESCAP_WE``
+ If set, indicates that the namespace supports the
+ Write Exclusive reservation type.
+
+``NVME_NS_RESCAP_EA``
+ If set, indicates that the namespace supports the
+ Exclusive Access reservation type.
+
+``NVME_NS_RESCAP_WERO``
+ If set, indicates that the namespace supports the
+ Write Exclusive - Registrants Only reservation type.
+
+``NVME_NS_RESCAP_EARO``
+ If set, indicates that the namespace supports the
+ Exclusive Access - Registrants Only reservation type.
+
+``NVME_NS_RESCAP_WEAR``
+ If set, indicates that the namespace supports the
+ Write Exclusive - All Registrants reservation type.
+
+``NVME_NS_RESCAP_EAAR``
+ If set, indicates that the namespace supports the
+ Exclusive Access - All Registrants reservation type.
+
+``NVME_NS_RESCAP_IEK_13``
+ If set, indicates that Ignore Existing Key is used
+ as defined in revision 1.3 or later of this specification.
+
+
+
+
+.. c:enum:: nvme_nd_ns_fpi
+
+ If a format operation is in progress, this field indicates the percentage of the namespace that remains to be formatted.
+
+**Constants**
+
+``NVME_NS_FPI_REMAINING``
+ Mask to get the format percent remaining value
+
+``NVME_NS_FPI_SUPPORTED``
+ If set, indicates that the namespace supports the
+ Format Progress Indicator defined for the field.
+
+
+
+
+.. c:enum:: nvme_id_ns_dlfeat
+
+ This field indicates information about features that affect deallocating logical blocks for this namespace.
+
+**Constants**
+
+``NVME_NS_DLFEAT_RB``
+ Mask to get the value of the read behavior
+
+``NVME_NS_DLFEAT_RB_NR``
+ Read behvaior is not reported
+
+``NVME_NS_DLFEAT_RB_ALL_0S``
+ A deallocated logical block returns all bytes
+ cleared to 0h.
+
+``NVME_NS_DLFEAT_RB_ALL_FS``
+ A deallocated logical block returns all bytes
+ set to FFh.
+
+``NVME_NS_DLFEAT_WRITE_ZEROES``
+ If set, indicates that the controller supports
+ the Deallocate bit in the Write Zeroes command
+ for this namespace.
+
+``NVME_NS_DLFEAT_CRC_GUARD``
+ If set, indicates that the Guard field for
+ deallocated logical blocks that contain
+ protection information is set to the CRC for
+ the value read from the deallocated logical
+ block and its metadata
+
+
+
+
+.. c:enum:: nvme_id_ns_attr
+
+ Specifies attributes of the namespace.
+
+**Constants**
+
+``NVME_NS_NSATTR_WRITE_PROTECTED``
+ If set, then the namespace is currently
+ write protected and all write access to the
+ namespace shall fail.
+
+
+
+
+.. c:struct:: nvme_ns_id_desc
+
+ Namespace identifier type descriptor
+
+**Definition**
+
+::
+
+ struct nvme_ns_id_desc {
+ __u8 nidt;
+ __u8 nidl;
+ __le16 rsvd;
+ __u8 nid[];
+ };
+
+**Members**
+
+``nidt``
+ Namespace Identifier Type, see :c:type:`enum nvme_ns_id_desc_nidt <nvme_ns_id_desc_nidt>`
+
+``nidl``
+ Namespace Identifier Length contains the length in bytes of the
+ :c:type:`struct nvme_id_ns <nvme_id_ns>`.nid.
+
+``rsvd``
+ Reserved
+
+``nid``
+ Namespace Identifier contains a value that is globally unique and
+ assigned to the namespace when the namespace is created. The length
+ is defined in :c:type:`struct nvme_id_ns <nvme_id_ns>`.nidl.
+
+
+
+
+
+.. c:enum:: nvme_ns_id_desc_nidt
+
+ Known namespace identifier types
+
+**Constants**
+
+``NVME_NIDT_EUI64``
+ IEEE Extended Unique Identifier, the NID field contains a
+ copy of the EUI64 field in the struct nvme_id_ns.eui64.
+
+``NVME_NIDT_NGUID``
+ Namespace Globally Unique Identifier, the NID field
+ contains a copy of the NGUID field in struct nvme_id_ns.nguid.
+
+``NVME_NIDT_UUID``
+ The NID field contains a 128-bit Universally Unique
+ Identifier (UUID) as specified in RFC 4122.
+
+``NVME_NIDT_CSI``
+ The NID field contains the command set identifier.
+
+
+
+
+.. c:struct:: nvme_nvmset_attr
+
+ NVM Set Attributes Entry
+
+**Definition**
+
+::
+
+ struct nvme_nvmset_attr {
+ __le16 nvmsetid;
+ __le16 endgid;
+ __u8 rsvd4[4];
+ __le32 rr4kt;
+ __le32 ows;
+ __u8 tnvmsetcap[16];
+ __u8 unvmsetcap[16];
+ __u8 rsvd48[80];
+ };
+
+**Members**
+
+``nvmsetid``
+ NVM Set Identifier
+
+``endgid``
+ Endurance Group Identifier
+
+``rsvd4``
+ Reserved
+
+``rr4kt``
+ Random 4 KiB Read Typical indicates the typical
+ time to complete a 4 KiB random read in 100 nanosecond units
+ when the NVM Set is in a Predictable Latency Mode Deterministic
+ Window and there is 1 outstanding command per NVM Set.
+
+``ows``
+ Optimal Write Size
+
+``tnvmsetcap``
+ Total NVM Set Capacity
+
+``unvmsetcap``
+ Unallocated NVM Set Capacity
+
+``rsvd48``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_id_nvmset_list
+
+ NVM set list
+
+**Definition**
+
+::
+
+ struct nvme_id_nvmset_list {
+ __u8 nid;
+ __u8 rsvd1[127];
+ struct nvme_nvmset_attr ent[NVME_ID_NVMSET_LIST_MAX];
+ };
+
+**Members**
+
+``nid``
+ Nvmset id
+
+``rsvd1``
+ Reserved
+
+``ent``
+ nvmset id list
+
+
+
+
+
+.. c:struct:: nvme_id_independent_id_ns
+
+ Identify - I/O Command Set Independent Identify Namespace Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_id_independent_id_ns {
+ __u8 nsfeat;
+ __u8 nmic;
+ __u8 rescap;
+ __u8 fpi;
+ __le32 anagrpid;
+ __u8 nsattr;
+ __u8 rsvd9;
+ __le16 nvmsetid;
+ __le16 endgid;
+ __u8 nstat;
+ __u8 rsvd15[4081];
+ };
+
+**Members**
+
+``nsfeat``
+ common namespace features
+
+``nmic``
+ Namespace Multi-path I/O and Namespace
+ Sharing Capabilities
+
+``rescap``
+ Reservation Capabilities
+
+``fpi``
+ Format Progress Indicator
+
+``anagrpid``
+ ANA Group Identifier
+
+``nsattr``
+ Namespace Attributes
+
+``rsvd9``
+ reserved
+
+``nvmsetid``
+ NVM Set Identifier
+
+``endgid``
+ Endurance Group Identifier
+
+``nstat``
+ Namespace Status
+
+``rsvd15``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_id_ns_granularity_desc
+
+ Namespace Granularity Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_id_ns_granularity_desc {
+ __le64 nszegran;
+ __le64 ncapgran;
+ };
+
+**Members**
+
+``nszegran``
+ Namespace Size Granularity
+
+``ncapgran``
+ Namespace Capacity Granularity
+
+
+
+
+
+.. c:struct:: nvme_id_ns_granularity_list
+
+ Namespace Granularity List
+
+**Definition**
+
+::
+
+ struct nvme_id_ns_granularity_list {
+ __le32 attributes;
+ __u8 num_descriptors;
+ __u8 rsvd5[27];
+ struct nvme_id_ns_granularity_desc entry[NVME_ID_ND_DESCRIPTOR_MAX];
+ __u8 rsvd288[3808];
+ };
+
+**Members**
+
+``attributes``
+ Namespace Granularity Attributes
+
+``num_descriptors``
+ Number of Descriptors
+
+``rsvd5``
+ reserved
+
+``entry``
+ Namespace Granularity Descriptor
+
+``rsvd288``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_id_uuid_list_entry
+
+ UUID List Entry
+
+**Definition**
+
+::
+
+ struct nvme_id_uuid_list_entry {
+ __u8 header;
+ __u8 rsvd1[15];
+ __u8 uuid[16];
+ };
+
+**Members**
+
+``header``
+ UUID Lists Entry Header
+
+``rsvd1``
+ reserved
+
+``uuid``
+ 128-bit Universally Unique Identifier
+
+
+
+
+
+.. c:enum:: nvme_id_uuid
+
+ Identifier Association
+
+**Constants**
+
+``NVME_ID_UUID_HDR_ASSOCIATION_MASK``
+
+``NVME_ID_UUID_ASSOCIATION_NONE``
+
+``NVME_ID_UUID_ASSOCIATION_VENDOR``
+
+``NVME_ID_UUID_ASSOCIATION_SUBSYSTEM_VENDOR``
+
+
+
+
+.. c:struct:: nvme_id_uuid_list
+
+ UUID list
+
+**Definition**
+
+::
+
+ struct nvme_id_uuid_list {
+ __u8 rsvd0[32];
+ struct nvme_id_uuid_list_entry entry[NVME_ID_UUID_LIST_MAX];
+ };
+
+**Members**
+
+``rsvd0``
+ reserved
+
+``entry``
+ UUID list entry
+
+
+
+
+
+.. c:struct:: nvme_ctrl_list
+
+ Controller List
+
+**Definition**
+
+::
+
+ struct nvme_ctrl_list {
+ __le16 num;
+ __le16 identifier[NVME_ID_CTRL_LIST_MAX];
+ };
+
+**Members**
+
+``num``
+ Number of Identifiers
+
+``identifier``
+ NVM subsystem unique controller identifier
+
+
+
+
+
+.. c:struct:: nvme_ns_list
+
+ Namespace List
+
+**Definition**
+
+::
+
+ struct nvme_ns_list {
+ __le32 ns[NVME_ID_NS_LIST_MAX];
+ };
+
+**Members**
+
+``ns``
+ Namespace Identifier
+
+
+
+
+
+.. c:struct:: nvme_id_ctrl_nvm
+
+ I/O Command Set Specific Identify Controller data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_ctrl_nvm {
+ __u8 vsl;
+ __u8 wzsl;
+ __u8 wusl;
+ __u8 dmrl;
+ __u32 dmrsl;
+ __u64 dmsl;
+ __u8 rsvd16[4080];
+ };
+
+**Members**
+
+``vsl``
+ Verify Size Limit
+
+``wzsl``
+ Write Zeroes Size Limit
+
+``wusl``
+ Write Uncorrectable Size Limit
+
+``dmrl``
+ Dataset Management Ranges Limit
+
+``dmrsl``
+ Dataset Management Range Size Limit
+
+``dmsl``
+ Dataset Management Size Limit
+
+``rsvd16``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_nvm_id_ns
+
+ NVME Command Set I/O Command Set Specific Identify Namespace Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_nvm_id_ns {
+ __le64 lbstm;
+ __u8 pic;
+ __u8 rsvd9[3];
+ __le32 elbaf[64];
+ __u8 rsvd268[3828];
+ };
+
+**Members**
+
+``lbstm``
+ Logical Block Storage Tag Mask
+
+``pic``
+ Protection Information Capabilities
+
+``rsvd9``
+ Reserved
+
+``elbaf``
+ List of Extended LBA Format Support
+
+``rsvd268``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_zns_lbafe
+
+ LBA Format Extension Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_zns_lbafe {
+ __le64 zsze;
+ __u8 zdes;
+ __u8 rsvd9[7];
+ };
+
+**Members**
+
+``zsze``
+ Zone Size
+
+``zdes``
+ Zone Descriptor Extension Size
+
+``rsvd9``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_zns_id_ns
+
+ Zoned Namespace Command Set Specific Identify Namespace Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_zns_id_ns {
+ __le16 zoc;
+ __le16 ozcs;
+ __le32 mar;
+ __le32 mor;
+ __le32 rrl;
+ __le32 frl;
+ __le32 rrl1;
+ __le32 rrl2;
+ __le32 rrl3;
+ __le32 frl1;
+ __le32 frl2;
+ __le32 frl3;
+ __le32 numzrwa;
+ __le16 zrwafg;
+ __le16 zrwasz;
+ __u8 zrwacap;
+ __u8 rsvd53[2763];
+ struct nvme_zns_lbafe lbafe[64];
+ __u8 vs[256];
+ };
+
+**Members**
+
+``zoc``
+ Zone Operation Characteristics
+
+``ozcs``
+ Optional Zoned Command Support
+
+``mar``
+ Maximum Active Resources
+
+``mor``
+ Maximum Open Resources
+
+``rrl``
+ Reset Recommended Limit
+
+``frl``
+ Finish Recommended Limit
+
+``rrl1``
+ Reset Recommended Limit 1
+
+``rrl2``
+ Reset Recommended Limit 2
+
+``rrl3``
+ Reset Recommended Limit 3
+
+``frl1``
+ Finish Recommended Limit 1
+
+``frl2``
+ Finish Recommended Limit 2
+
+``frl3``
+ Finish Recommended Limit 3
+
+``numzrwa``
+ Number of ZRWA Resources
+
+``zrwafg``
+ ZRWA Flush Granularity
+
+``zrwasz``
+ ZRWA Size
+
+``zrwacap``
+ ZRWA Capability
+
+``rsvd53``
+ Reserved
+
+``lbafe``
+ LBA Format Extension
+
+``vs``
+ Vendor Specific
+
+
+
+
+
+.. c:struct:: nvme_zns_id_ctrl
+
+ I/O Command Set Specific Identify Controller Data Structure for the Zoned Namespace Command Set
+
+**Definition**
+
+::
+
+ struct nvme_zns_id_ctrl {
+ __u8 zasl;
+ __u8 rsvd1[4095];
+ };
+
+**Members**
+
+``zasl``
+ Zone Append Size Limit
+
+``rsvd1``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_primary_ctrl_cap
+
+ Identify - Controller Capabilities Structure
+
+**Definition**
+
+::
+
+ struct nvme_primary_ctrl_cap {
+ __le16 cntlid;
+ __le16 portid;
+ __u8 crt;
+ __u8 rsvd5[27];
+ __le32 vqfrt;
+ __le32 vqrfa;
+ __le16 vqrfap;
+ __le16 vqprt;
+ __le16 vqfrsm;
+ __le16 vqgran;
+ __u8 rsvd48[16];
+ __le32 vifrt;
+ __le32 virfa;
+ __le16 virfap;
+ __le16 viprt;
+ __le16 vifrsm;
+ __le16 vigran;
+ __u8 rsvd80[4016];
+ };
+
+**Members**
+
+``cntlid``
+ Controller Identifier
+
+``portid``
+ Port Identifier
+
+``crt``
+ Controller Resource Types
+
+``rsvd5``
+ reserved
+
+``vqfrt``
+ VQ Resources Flexible Total
+
+``vqrfa``
+ VQ Resources Flexible Assigned
+
+``vqrfap``
+ VQ Resources Flexible Allocated to Primary
+
+``vqprt``
+ VQ Resources Private Total
+
+``vqfrsm``
+ VQ Resources Flexible Secondary Maximum
+
+``vqgran``
+ VQ Flexible Resource Preferred Granularity
+
+``rsvd48``
+ reserved
+
+``vifrt``
+ VI Resources Flexible Total
+
+``virfa``
+ VI Resources Flexible Assigned
+
+``virfap``
+ VI Resources Flexible Allocated to Primary
+
+``viprt``
+ VI Resources Private Total
+
+``vifrsm``
+ VI Resources Flexible Secondary Maximum
+
+``vigran``
+ VI Flexible Resource Preferred Granularity
+
+``rsvd80``
+ reserved
+
+
+
+
+
+.. c:struct:: nvme_secondary_ctrl
+
+ Secondary Controller Entry
+
+**Definition**
+
+::
+
+ struct nvme_secondary_ctrl {
+ __le16 scid;
+ __le16 pcid;
+ __u8 scs;
+ __u8 rsvd5[3];
+ __le16 vfn;
+ __le16 nvq;
+ __le16 nvi;
+ __u8 rsvd14[18];
+ };
+
+**Members**
+
+``scid``
+ Secondary Controller Identifier
+
+``pcid``
+ Primary Controller Identifier
+
+``scs``
+ Secondary Controller State
+
+``rsvd5``
+ Reserved
+
+``vfn``
+ Virtual Function Number
+
+``nvq``
+ Number of VQ Flexible Resources Assigned
+
+``nvi``
+ Number of VI Flexible Resources Assigned
+
+``rsvd14``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_secondary_ctrl_list
+
+ Secondary Controller List
+
+**Definition**
+
+::
+
+ struct nvme_secondary_ctrl_list {
+ __u8 num;
+ __u8 rsvd[31];
+ struct nvme_secondary_ctrl sc_entry[NVME_ID_SECONDARY_CTRL_MAX];
+ };
+
+**Members**
+
+``num``
+ Number of Identifiers
+
+``rsvd``
+ Reserved
+
+``sc_entry``
+ Secondary Controller Entry
+
+
+
+
+
+.. c:struct:: nvme_id_iocs
+
+ NVMe Identify IO Command Set data structure
+
+**Definition**
+
+::
+
+ struct nvme_id_iocs {
+ __u64 iocsc[512];
+ };
+
+**Members**
+
+``iocsc``
+ List of supported IO Command Set Combination vectors
+
+
+
+
+
+.. c:struct:: nvme_id_domain_attr
+
+ Domain Attributes Entry
+
+**Definition**
+
+::
+
+ struct nvme_id_domain_attr {
+ __le16 dom_id;
+ __u8 rsvd2[14];
+ __u8 dom_cap[16];
+ __u8 unalloc_dom_cap[16];
+ __u8 max_egrp_dom_cap[16];
+ __u8 rsvd64[64];
+ };
+
+**Members**
+
+``dom_id``
+ Domain Identifier
+
+``rsvd2``
+ Reserved
+
+``dom_cap``
+ Total Domain Capacity
+
+``unalloc_dom_cap``
+ Unallocated Domain Capacity
+
+``max_egrp_dom_cap``
+ Max Endurance Group Domain Capacity
+
+``rsvd64``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_id_domain_list
+
+ Domain List
+
+**Definition**
+
+::
+
+ struct nvme_id_domain_list {
+ __u8 num;
+ __u8 rsvd[127];
+ struct nvme_id_domain_attr domain_attr[NVME_ID_DOMAIN_LIST_MAX];
+ };
+
+**Members**
+
+``num``
+ Number of domain attributes
+
+``rsvd``
+ Reserved
+
+``domain_attr``
+ List of domain attributes
+
+
+
+
+
+.. c:struct:: nvme_id_endurance_group_list
+
+ Endurance Group List
+
+**Definition**
+
+::
+
+ struct nvme_id_endurance_group_list {
+ __le16 num;
+ __le16 identifier[NVME_ID_ENDURANCE_GROUP_LIST_MAX];
+ };
+
+**Members**
+
+``num``
+ Number of Identifiers
+
+``identifier``
+ Endurance Group Identifier
+
+
+
+
+
+.. c:struct:: nvme_supported_log_pages
+
+ Supported Log Pages - Log
+
+**Definition**
+
+::
+
+ struct nvme_supported_log_pages {
+ __le32 lid_support[NVME_LOG_SUPPORTED_LOG_PAGES_MAX];
+ };
+
+**Members**
+
+``lid_support``
+ Log Page Identifier Supported
+
+
+**Description**
+
+Supported Log Pages (Log Identifier 00h)
+
+
+
+
+.. c:struct:: nvme_error_log_page
+
+ Error Information Log Entry (Log Identifier 01h)
+
+**Definition**
+
+::
+
+ struct nvme_error_log_page {
+ __le64 error_count;
+ __le16 sqid;
+ __le16 cmdid;
+ __le16 status_field;
+ __le16 parm_error_location;
+ __le64 lba;
+ __le32 nsid;
+ __u8 vs;
+ __u8 trtype;
+ __u8 rsvd[2];
+ __le64 cs;
+ __le16 trtype_spec_info;
+ __u8 rsvd2[22];
+ };
+
+**Members**
+
+``error_count``
+ Error Count: a 64-bit incrementing error count,
+ indicating a unique identifier for this error. The error
+ count starts at ``1h``, is incremented for each unique error
+ log entry, and is retained across power off conditions.
+ A value of ``0h`` indicates an invalid entry; this value
+ is used when there are lost entries or when there are
+ fewer errors than the maximum number of entries the
+ controller supports. If the value of this field is
+ ``FFFFFFFFh``, then the field shall be set to 1h when
+ incremented (i.e., rolls over to ``1h``). Prior to NVMe
+ 1.4, processing of incrementing beyond ``FFFFFFFFh`` is
+ unspecified.
+
+``sqid``
+ Submission Queue ID: indicates the Submission Queue
+ Identifier of the command that the error information is
+ associated with. If the error is not specific to
+ a particular command, then this field shall be set to
+ ``FFFFh``.
+
+``cmdid``
+ Command ID: indicates the Command Identifier of the
+ command that the error is associated with. If the error
+ is not specific to a particular command, then this field
+ shall be set to ``FFFFh``.
+
+``status_field``
+ Bits 15-1: Status Field: indicates the Status Field for
+ the command that completed. If the error is not specific
+ to a particular command, then this field reports the most
+ applicable status value.
+ Bit 0: Phase Tag: may indicate the Phase Tag posted for
+ the command.
+
+``parm_error_location``
+ Parameter Error Location: indicates the byte and bit of
+ the command parameter that the error is associated with,
+ if applicable. If the parameter spans multiple bytes or
+ bits, then the location indicates the first byte and bit
+ of the parameter.
+ Bits 10-8: Bit in command that contained the error.
+ Valid values are 0 to 7.
+ Bits 7-0: Byte in command that contained the error.
+ Valid values are 0 to 63.
+
+``lba``
+ LBA: This field indicates the first LBA that experienced
+ the error condition, if applicable.
+
+``nsid``
+ Namespace: This field indicates the NSID of the namespace
+ that the error is associated with, if applicable.
+
+``vs``
+ Vendor Specific Information Available: If there is
+ additional vendor specific error information available,
+ this field provides the log page identifier associated
+ with that page. A value of ``0h`` indicates that no additional
+ information is available. Valid values are in the range
+ of ``80h`` to ``FFh``.
+
+``trtype``
+ Transport Type (TRTYPE): indicates the Transport Type of
+ the transport associated with the error. The values in
+ this field are the same as the TRTYPE values in the
+ Discovery Log Page Entry. If the error is not transport
+ related, this field shall be cleared to ``0h``. If the error
+ is transport related, this field shall be set to the type
+ of the transport - see :c:type:`enum nvme_trtype <nvme_trtype>`.
+
+``rsvd``
+ Reserved
+
+``cs``
+ Command Specific Information: This field contains command
+ specific information. If used, the command definition
+ specifies the information returned.
+
+``trtype_spec_info``
+ Transport Type Specific Information
+
+``rsvd2``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_smart_log
+
+ SMART / Health Information Log (Log Identifier 02h)
+
+**Definition**
+
+::
+
+ struct nvme_smart_log {
+ __u8 critical_warning;
+ __u8 temperature[2];
+ __u8 avail_spare;
+ __u8 spare_thresh;
+ __u8 percent_used;
+ __u8 endu_grp_crit_warn_sumry;
+ __u8 rsvd7[25];
+ __u8 data_units_read[16];
+ __u8 data_units_written[16];
+ __u8 host_reads[16];
+ __u8 host_writes[16];
+ __u8 ctrl_busy_time[16];
+ __u8 power_cycles[16];
+ __u8 power_on_hours[16];
+ __u8 unsafe_shutdowns[16];
+ __u8 media_errors[16];
+ __u8 num_err_log_entries[16];
+ __le32 warning_temp_time;
+ __le32 critical_comp_time;
+ __le16 temp_sensor[8];
+ __le32 thm_temp1_trans_count;
+ __le32 thm_temp2_trans_count;
+ __le32 thm_temp1_total_time;
+ __le32 thm_temp2_total_time;
+ __u8 rsvd232[280];
+ };
+
+**Members**
+
+``critical_warning``
+ This field indicates critical warnings for the state
+ of the controller. Critical warnings may result in an
+ asynchronous event notification to the host. Bits in
+ this field represent the current associated state and
+ are not persistent (see :c:type:`enum nvme_smart_crit <nvme_smart_crit>`).
+
+``temperature``
+ Composite Temperature: Contains a value corresponding
+ to a temperature in Kelvins that represents the current
+ composite temperature of the controller and namespace(s)
+ associated with that controller. The manner in which
+ this value is computed is implementation specific and
+ may not represent the actual temperature of any physical
+ point in the NVM subsystem. Warning and critical
+ overheating composite temperature threshold values are
+ reported by the WCTEMP and CCTEMP fields in the Identify
+ Controller data structure.
+
+``avail_spare``
+ Available Spare: Contains a normalized percentage (0%
+ to 100%) of the remaining spare capacity available.
+
+``spare_thresh``
+ Available Spare Threshold: When the Available Spare
+ falls below the threshold indicated in this field, an
+ asynchronous event completion may occur. The value is
+ indicated as a normalized percentage (0% to 100%).
+ The values 101 to 255 are reserved.
+
+``percent_used``
+ Percentage Used: Contains a vendor specific estimate
+ of the percentage of NVM subsystem life used based on
+ the actual usage and the manufacturer's prediction of
+ NVM life. A value of 100 indicates that the estimated
+ endurance of the NVM in the NVM subsystem has been
+ consumed, but may not indicate an NVM subsystem failure.
+ The value is allowed to exceed 100. Percentages greater
+ than 254 shall be represented as 255. This value shall
+ be updated once per power-on hour (when the controller
+ is not in a sleep state).
+
+``endu_grp_crit_warn_sumry``
+ Endurance Group Critical Warning Summary: This field
+ indicates critical warnings for the state of Endurance
+ Groups. Bits in this field represent the current associated
+ state and are not persistent (see :c:type:`enum nvme_smart_egcw <nvme_smart_egcw>`).
+
+``rsvd7``
+ Reserved
+
+``data_units_read``
+ Data Units Read: Contains the number of 512 byte data
+ units the host has read from the controller; this value
+ does not include metadata. This value is reported in
+ thousands (i.e., a value of 1 corresponds to 1000
+ units of 512 bytes read) and is rounded up (e.g., one
+ indicates the that number of 512 byte data units read
+ is from 1 to 1000, three indicates that the number of
+ 512 byte data units read is from 2001 to 3000). When
+ the LBA size is a value other than 512 bytes, the
+ controller shall convert the amount of data read to
+ 512 byte units. For the NVM command set, logical blocks
+ read as part of Compare, Read, and Verify operations
+ shall be included in this value. A value of ``0h`` in
+ this field indicates that the number of Data Units Read
+ is not reported.
+
+``data_units_written``
+ Data Units Written: Contains the number of 512 byte
+ data units the host has written to the controller;
+ this value does not include metadata. This value is
+ reported in thousands (i.e., a value of 1 corresponds
+ to 1000 units of 512 bytes written) and is rounded up
+ (e.g., one indicates that the number of 512 byte data
+ units written is from 1 to 1,000, three indicates that
+ the number of 512 byte data units written is from 2001
+ to 3000). When the LBA size is a value other than 512
+ bytes, the controller shall convert the amount of data
+ written to 512 byte units. For the NVM command set,
+ logical blocks written as part of Write operations shall
+ be included in this value. Write Uncorrectable commands
+ and Write Zeroes commands shall not impact this value.
+ A value of ``0h`` in this field indicates that the number
+ of Data Units Written is not reported.
+
+``host_reads``
+ Host Read Commands: Contains the number of read commands
+ completed by the controller. For the NVM command set,
+ this value is the sum of the number of Compare commands
+ and the number of Read commands.
+
+``host_writes``
+ Host Write Commands: Contains the number of write
+ commands completed by the controller. For the NVM
+ command set, this is the number of Write commands.
+
+``ctrl_busy_time``
+ Controller Busy Time: Contains the amount of time the
+ controller is busy with I/O commands. The controller
+ is busy when there is a command outstanding to an I/O
+ Queue (specifically, a command was issued via an I/O
+ Submission Queue Tail doorbell write and the corresponding
+ completion queue entry has not been posted yet to the
+ associated I/O Completion Queue). This value is
+ reported in minutes.
+
+``power_cycles``
+ Power Cycles: Contains the number of power cycles.
+
+``power_on_hours``
+ Power On Hours: Contains the number of power-on hours.
+ This may not include time that the controller was
+ powered and in a non-operational power state.
+
+``unsafe_shutdowns``
+ Unsafe Shutdowns: Contains the number of unsafe
+ shutdowns. This count is incremented when a Shutdown
+ Notification (CC.SHN) is not received prior to loss of power.
+
+``media_errors``
+ Media and Data Integrity Errors: Contains the number
+ of occurrences where the controller detected an
+ unrecovered data integrity error. Errors such as
+ uncorrectable ECC, CRC checksum failure, or LBA tag
+ mismatch are included in this field. Errors introduced
+ as a result of a Write Uncorrectable command may or
+ may not be included in this field.
+
+``num_err_log_entries``
+ Number of Error Information Log Entries: Contains the
+ number of Error Information log entries over the life
+ of the controller.
+
+``warning_temp_time``
+ Warning Composite Temperature Time: Contains the amount
+ of time in minutes that the controller is operational
+ and the Composite Temperature is greater than or equal
+ to the Warning Composite Temperature Threshold (WCTEMP)
+ field and less than the Critical Composite Temperature
+ Threshold (CCTEMP) field in the Identify Controller
+ data structure. If the value of the WCTEMP or CCTEMP
+ field is ``0h``, then this field is always cleared to ``0h``
+ regardless of the Composite Temperature value.
+
+``critical_comp_time``
+ Critical Composite Temperature Time: Contains the amount
+ of time in minutes that the controller is operational
+ and the Composite Temperature is greater than or equal
+ to the Critical Composite Temperature Threshold (CCTEMP)
+ field in the Identify Controller data structure. If
+ the value of the CCTEMP field is ``0h``, then this field
+ is always cleared to 0h regardless of the Composite
+ Temperature value.
+
+``temp_sensor``
+ Temperature Sensor 1-8: Contains the current temperature
+ in degrees Kelvin reported by temperature sensors 1-8.
+ The physical point in the NVM subsystem whose temperature
+ is reported by the temperature sensor and the temperature
+ accuracy is implementation specific. An implementation
+ that does not implement the temperature sensor reports
+ a value of ``0h``.
+
+``thm_temp1_trans_count``
+ Thermal Management Temperature 1 Transition Count:
+ Contains the number of times the controller transitioned
+ to lower power active power states or performed vendor
+ specific thermal management actions while minimizing
+ the impact on performance in order to attempt to reduce
+ the Composite Temperature because of the host controlled
+ thermal management feature (i.e., the Composite
+ Temperature rose above the Thermal Management
+ Temperature 1). This counter shall not wrap once the
+ value ``FFFFFFFFh`` is reached. A value of ``0h``, indicates
+ that this transition has never occurred or this field
+ is not implemented.
+
+``thm_temp2_trans_count``
+ Thermal Management Temperature 2 Transition Count
+
+``thm_temp1_total_time``
+ Total Time For Thermal Management Temperature 1:
+ Contains the number of seconds that the controller
+ had transitioned to lower power active power states or
+ performed vendor specific thermal management actions
+ while minimizing the impact on performance in order to
+ attempt to reduce the Composite Temperature because of
+ the host controlled thermal management feature. This
+ counter shall not wrap once the value ``FFFFFFFFh`` is
+ reached. A value of ``0h``, indicates that this transition
+ has never occurred or this field is not implemented.
+
+``thm_temp2_total_time``
+ Total Time For Thermal Management Temperature 2
+
+``rsvd232``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_smart_crit
+
+ Critical Warning
+
+**Constants**
+
+``NVME_SMART_CRIT_SPARE``
+ If set, then the available spare capacity has fallen
+ below the threshold.
+
+``NVME_SMART_CRIT_TEMPERATURE``
+ If set, then a temperature is either greater
+ than or equal to an over temperature threshold; or
+ less than or equal to an under temperature threshold.
+
+``NVME_SMART_CRIT_DEGRADED``
+ If set, then the NVM subsystem reliability has
+ been degraded due to significant media related errors
+ or any internal error that degrades NVM subsystem
+ reliability.
+
+``NVME_SMART_CRIT_MEDIA``
+ If set, then all of the media has been placed in read
+ only mode. The controller shall not set this bit if
+ the read-only condition on the media is a result of
+ a change in the write protection state of a namespace.
+
+``NVME_SMART_CRIT_VOLATILE_MEMORY``
+ If set, then the volatile memory backup
+ device has failed. This field is only valid if the
+ controller has a volatile memory backup solution.
+
+``NVME_SMART_CRIT_PMR_RO``
+ If set, then the Persistent Memory Region has become
+ read-only or unreliable.
+
+
+
+
+.. c:enum:: nvme_smart_egcw
+
+ Endurance Group Critical Warning Summary
+
+**Constants**
+
+``NVME_SMART_EGCW_SPARE``
+ If set, then the available spare capacity of one or
+ more Endurance Groups has fallen below the threshold.
+
+``NVME_SMART_EGCW_DEGRADED``
+ If set, then the reliability of one or more
+ Endurance Groups has been degraded due to significant
+ media related errors or any internal error that
+ degrades NVM subsystem reliability.
+
+``NVME_SMART_EGCW_RO``
+ If set, then the namespaces in one or more Endurance
+ Groups have been placed in read only mode not as
+ a result of a change in the write protection state
+ of a namespace.
+
+
+
+
+.. c:struct:: nvme_firmware_slot
+
+ Firmware Slot Information Log
+
+**Definition**
+
+::
+
+ struct nvme_firmware_slot {
+ __u8 afi;
+ __u8 rsvd1[7];
+ char frs[7][8];
+ __u8 rsvd2[448];
+ };
+
+**Members**
+
+``afi``
+ Active Firmware Info
+
+``rsvd1``
+ Reserved
+
+``frs``
+ Firmware Revision for Slot
+
+``rsvd2``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_cmd_effects_log
+
+ Commands Supported and Effects Log
+
+**Definition**
+
+::
+
+ struct nvme_cmd_effects_log {
+ __le32 acs[256];
+ __le32 iocs[256];
+ __u8 rsvd[2048];
+ };
+
+**Members**
+
+``acs``
+ Admin Command Supported
+
+``iocs``
+ I/O Command Supported
+
+``rsvd``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_cmd_effects
+
+ Commands Supported and Effects
+
+**Constants**
+
+``NVME_CMD_EFFECTS_CSUPP``
+ Command Supported
+
+``NVME_CMD_EFFECTS_LBCC``
+ Logical Block Content Change
+
+``NVME_CMD_EFFECTS_NCC``
+ Namespace Capability Change
+
+``NVME_CMD_EFFECTS_NIC``
+ Namespace Inventory Change
+
+``NVME_CMD_EFFECTS_CCC``
+ Controller Capability Change
+
+``NVME_CMD_EFFECTS_CSE_MASK``
+ Command Submission and Execution
+
+``NVME_CMD_EFFECTS_UUID_SEL``
+ UUID Selection Supported
+
+
+
+
+.. c:struct:: nvme_st_result
+
+ Self-test Result
+
+**Definition**
+
+::
+
+ struct nvme_st_result {
+ __u8 dsts;
+ __u8 seg;
+ __u8 vdi;
+ __u8 rsvd;
+ __le64 poh;
+ __le32 nsid;
+ __le64 flba;
+ __u8 sct;
+ __u8 sc;
+ __u8 vs[2];
+ };
+
+**Members**
+
+``dsts``
+ Device Self-test Status: Indicates the device self-test code and the
+ status of the operation (see :c:type:`enum nvme_status_result <nvme_status_result>` and :c:type:`enum nvme_st_code <nvme_st_code>`).
+
+``seg``
+ Segment Number: Iindicates the segment number where the first self-test
+ failure occurred. If Device Self-test Status (**dsts**) is not set to
+ #NVME_ST_RESULT_KNOWN_SEG_FAIL, then this field should be ignored.
+
+``vdi``
+ Valid Diagnostic Information: Indicates the diagnostic failure
+ information that is reported. See :c:type:`enum nvme_st_valid_diag_info <nvme_st_valid_diag_info>`.
+
+``rsvd``
+ Reserved
+
+``poh``
+ Power On Hours (POH): Indicates the number of power-on hours at the
+ time the device self-test operation was completed or aborted. This
+ does not include time that the controller was powered and in a low
+ power state condition.
+
+``nsid``
+ Namespace Identifier (NSID): Indicates the namespace that the Failing
+ LBA occurred on. Valid only when the NSID Valid bit
+ (#NVME_ST_VALID_DIAG_INFO_NSID) is set in the Valid Diagnostic
+ Information (**vdi**) field.
+
+``flba``
+ Failing LBA: indicates the LBA of the logical block that caused the
+ test to fail. If the device encountered more than one failed logical
+ block during the test, then this field only indicates one of those
+ failed logical blocks. Valid only when the NSID Valid bit
+ (#NVME_ST_VALID_DIAG_INFO_FLBA) is set in the Valid Diagnostic
+ Information (**vdi**) field.
+
+``sct``
+ Status Code Type: This field may contain additional information related
+ to errors or conditions. Bits 2:0 may contain additional information
+ relating to errors or conditions that occurred during the device
+ self-test operation represented in the same format used in the Status
+ Code Type field of the completion queue entry (refer to :c:type:`enum nvme_status_field <nvme_status_field>`).
+ Valid only when the NSID Valid bit (#NVME_ST_VALID_DIAG_INFO_SCT) is
+ set in the Valid Diagnostic Information (**vdi**) field.
+
+``sc``
+ Status Code: This field may contain additional information relating
+ to errors or conditions that occurred during the device self-test
+ operation represented in the same format used in the Status Code field
+ of the completion queue entry. Valid only when the SCT Valid bit
+ (#NVME_ST_VALID_DIAG_INFO_SC) is set in the Valid Diagnostic
+ Information (**vdi**) field.
+
+``vs``
+ Vendor Specific.
+
+
+
+
+
+.. c:enum:: nvme_status_result
+
+ Result of the device self-test operation
+
+**Constants**
+
+``NVME_ST_RESULT_NO_ERR``
+ Operation completed without error.
+
+``NVME_ST_RESULT_ABORTED``
+ Operation was aborted by a Device Self-test command.
+
+``NVME_ST_RESULT_CLR``
+ Operation was aborted by a Controller Level Reset.
+
+``NVME_ST_RESULT_NS_REMOVED``
+ Operation was aborted due to a removal of
+ a namespace from the namespace inventory.
+
+``NVME_ST_RESULT_ABORTED_FORMAT``
+ Operation was aborted due to the processing
+ of a Format NVM command.
+
+``NVME_ST_RESULT_FATAL_ERR``
+ A fatal error or unknown test error occurred
+ while the controller was executing the device
+ self-test operation and the operation did
+ not complete.
+
+``NVME_ST_RESULT_UNKNOWN_SEG_FAIL``
+ Operation completed with a segment that failed
+ and the segment that failed is not known.
+
+``NVME_ST_RESULT_KNOWN_SEG_FAIL``
+ Operation completed with one or more failed
+ segments and the first segment that failed
+ is indicated in the Segment Number field.
+
+``NVME_ST_RESULT_ABORTED_UNKNOWN``
+ Operation was aborted for unknown reason.
+
+``NVME_ST_RESULT_ABORTED_SANITIZE``
+ Operation was aborted due to a sanitize operation.
+
+``NVME_ST_RESULT_NOT_USED``
+ Entry not used (does not contain a test result).
+
+``NVME_ST_RESULT_MASK``
+ Mask to get the status result value from
+ the :c:type:`struct nvme_st_result <nvme_st_result>`.dsts field.
+
+
+
+
+.. c:enum:: nvme_st_code
+
+ Self-test Code value
+
+**Constants**
+
+``NVME_ST_CODE_RESERVED``
+ Reserved.
+
+``NVME_ST_CODE_SHORT``
+ Short device self-test operation.
+
+``NVME_ST_CODE_EXTENDED``
+ Extended device self-test operation.
+
+``NVME_ST_CODE_VS``
+ Vendor specific.
+
+``NVME_ST_CODE_SHIFT``
+ Shift amount to get the code value from the
+ :c:type:`struct nvme_st_result <nvme_st_result>`.dsts field.
+
+
+
+
+.. c:enum:: nvme_st_curr_op
+
+ Current Device Self-Test Operation
+
+**Constants**
+
+``NVME_ST_CURR_OP_NOT_RUNNING``
+ No device self-test operation in progress.
+
+``NVME_ST_CURR_OP_SHORT``
+ Short device self-test operation in progress.
+
+``NVME_ST_CURR_OP_EXTENDED``
+ Extended device self-test operation in progress.
+
+``NVME_ST_CURR_OP_VS``
+ Vendor specific.
+
+``NVME_ST_CURR_OP_RESERVED``
+ Reserved.
+
+``NVME_ST_CURR_OP_MASK``
+ Mask to get the current operation value from the
+ :c:type:`struct nvme_self_test_log <nvme_self_test_log>`.current_operation field.
+
+``NVME_ST_CURR_OP_CMPL_MASK``
+ Mask to get the current operation completion value
+ from the :c:type:`struct nvme_self_test_log <nvme_self_test_log>`.completion field.
+
+
+
+
+.. c:enum:: nvme_st_valid_diag_info
+
+ Valid Diagnostic Information
+
+**Constants**
+
+``NVME_ST_VALID_DIAG_INFO_NSID``
+ NSID Valid: if set, then the contents of
+ the Namespace Identifier field are valid.
+
+``NVME_ST_VALID_DIAG_INFO_FLBA``
+ FLBA Valid: if set, then the contents of
+ the Failing LBA field are valid.
+
+``NVME_ST_VALID_DIAG_INFO_SCT``
+ SCT Valid: if set, then the contents of
+ the Status Code Type field are valid.
+
+``NVME_ST_VALID_DIAG_INFO_SC``
+ SC Valid: if set, then the contents of
+ the Status Code field are valid.
+
+
+
+
+.. c:struct:: nvme_self_test_log
+
+ Device Self-test (Log Identifier 06h)
+
+**Definition**
+
+::
+
+ struct nvme_self_test_log {
+ __u8 current_operation;
+ __u8 completion;
+ __u8 rsvd[2];
+ struct nvme_st_result result[NVME_LOG_ST_MAX_RESULTS];
+ };
+
+**Members**
+
+``current_operation``
+ Current Device Self-Test Operation: indicates the status
+ of the current device self-test operation. If a device
+ self-test operation is in process (i.e., this field is set
+ to #NVME_ST_CURR_OP_SHORT or #NVME_ST_CURR_OP_EXTENDED),
+ then the controller shall not set this field to
+ #NVME_ST_CURR_OP_NOT_RUNNING until a new Self-test Result
+ Data Structure is created (i.e., if a device self-test
+ operation completes or is aborted, then the controller
+ shall create a Self-test Result Data Structure prior to
+ setting this field to #NVME_ST_CURR_OP_NOT_RUNNING).
+ See :c:type:`enum nvme_st_curr_op <nvme_st_curr_op>`.
+
+``completion``
+ Current Device Self-Test Completion: indicates the percentage
+ of the device self-test operation that is complete (e.g.,
+ a value of 25 indicates that 25% of the device self-test
+ operation is complete and 75% remains to be tested).
+ If the **current_operation** field is cleared to
+ #NVME_ST_CURR_OP_NOT_RUNNING (indicating there is no device
+ self-test operation in progress), then this field is ignored.
+
+``rsvd``
+ Reserved
+
+``result``
+ Self-test Result Data Structures, see :c:type:`struct nvme_st_result <nvme_st_result>`.
+
+
+
+
+
+.. c:enum:: nvme_cmd_get_log_telemetry_host_lsp
+
+ Telemetry Host-Initiated log specific field
+
+**Constants**
+
+``NVME_LOG_TELEM_HOST_LSP_RETAIN``
+ Get Telemetry Data Blocks
+
+``NVME_LOG_TELEM_HOST_LSP_CREATE``
+ Create Telemetry Data Blocks
+
+
+
+
+.. c:struct:: nvme_telemetry_log
+
+ Retrieve internal data specific to the manufacturer.
+
+**Definition**
+
+::
+
+ struct nvme_telemetry_log {
+ __u8 lpi;
+ __u8 rsvd1[4];
+ __u8 ieee[3];
+ __le16 dalb1;
+ __le16 dalb2;
+ __le16 dalb3;
+ __u8 rsvd14[2];
+ __le32 dalb4;
+ __u8 rsvd20[361];
+ __u8 hostdgn;
+ __u8 ctrlavail;
+ __u8 ctrldgn;
+ __u8 rsnident[128];
+ __u8 data_area[];
+ };
+
+**Members**
+
+``lpi``
+ Log Identifier, either ``NVME_LOG_LID_TELEMETRY_HOST`` or
+ ``NVME_LOG_LID_TELEMETRY_CTRL``
+
+``rsvd1``
+ Reserved
+
+``ieee``
+ IEEE OUI Identifier is the Organization Unique Identifier (OUI)
+ for the controller vendor that is able to interpret the data.
+
+``dalb1``
+ Telemetry Controller-Initiated Data Area 1 Last Block is
+ the value of the last block in this area.
+
+``dalb2``
+ Telemetry Controller-Initiated Data Area 1 Last Block is
+ the value of the last block in this area.
+
+``dalb3``
+ Telemetry Controller-Initiated Data Area 1 Last Block is
+ the value of the last block in this area.
+
+``rsvd14``
+ Reserved
+
+``dalb4``
+ Telemetry Controller-Initiated Data Area 4 Last Block is
+ the value of the last block in this area.
+
+``rsvd20``
+ Reserved
+
+``hostdgn``
+ Telemetry Host-Initiated Data Generation Number is a
+ value that is incremented each time the host initiates a
+ capture of its internal controller state in the controller .
+
+``ctrlavail``
+ Telemetry Controller-Initiated Data Available, if cleared,
+ then the controller telemetry log does not contain saved
+ internal controller state. If this field is set to 1h, the
+ controller log contains saved internal controller state. If
+ this field is set to 1h, the data will be latched until the
+ host releases it by reading the log with RAE cleared.
+
+``ctrldgn``
+ Telemetry Controller-Initiated Data Generation Number is
+ a value that is incremented each time the controller initiates a
+ capture of its internal controller state in the controller .
+
+``rsnident``
+ Reason Identifiers a vendor specific identifier that describes
+ the operating conditions of the controller at the time of
+ capture.
+
+``data_area``
+ Telemetry data blocks, vendor specific information data.
+
+
+**Description**
+
+This log consists of a header describing the log and zero or more Telemetry
+Data Blocks. All Telemetry Data Blocks are ``NVME_LOG_TELEM_BLOCK_SIZE``, 512
+bytes, in size. This log captures the controller’s internal state.
+
+
+
+
+.. c:struct:: nvme_endurance_group_log
+
+ Endurance Group Information Log
+
+**Definition**
+
+::
+
+ struct nvme_endurance_group_log {
+ __u8 critical_warning;
+ __u8 rsvd1[2];
+ __u8 avl_spare;
+ __u8 avl_spare_threshold;
+ __u8 percent_used;
+ __u8 rsvd6[26];
+ __u8 endurance_estimate[16];
+ __u8 data_units_read[16];
+ __u8 data_units_written[16];
+ __u8 media_units_written[16];
+ __u8 host_read_cmds[16];
+ __u8 host_write_cmds[16];
+ __u8 media_data_integrity_err[16];
+ __u8 num_err_info_log_entries[16];
+ __u8 rsvd160[352];
+ };
+
+**Members**
+
+``critical_warning``
+ Critical Warning
+
+``rsvd1``
+ Reserved
+
+``avl_spare``
+ Available Spare
+
+``avl_spare_threshold``
+ Available Spare Threshold
+
+``percent_used``
+ Percentage Used
+
+``rsvd6``
+ Reserved
+
+``endurance_estimate``
+ Endurance Estimate
+
+``data_units_read``
+ Data Units Read
+
+``data_units_written``
+ Data Units Written
+
+``media_units_written``
+ Media Units Written
+
+``host_read_cmds``
+ Host Read Commands
+
+``host_write_cmds``
+ Host Write Commands
+
+``media_data_integrity_err``
+ Media and Data Integrity Errors
+
+``num_err_info_log_entries``
+ Number of Error Information Log Entries
+
+``rsvd160``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_eg_critical_warning_flags
+
+ Endurance Group Information Log - Critical Warning
+
+**Constants**
+
+``NVME_EG_CRITICAL_WARNING_SPARE``
+ Available spare capacity of the Endurance Group
+ has fallen below the threshold
+
+``NVME_EG_CRITICAL_WARNING_DEGRADED``
+ Endurance Group reliability has been degraded
+
+``NVME_EG_CRITICAL_WARNING_READ_ONLY``
+ Endurance Group have been placed in read only
+ mode
+
+
+
+
+.. c:struct:: nvme_aggregate_endurance_group_event
+
+ Endurance Group Event Aggregate
+
+**Definition**
+
+::
+
+ struct nvme_aggregate_endurance_group_event {
+ __le64 num_entries;
+ __le16 entries[];
+ };
+
+**Members**
+
+``num_entries``
+ Number or entries
+
+``entries``
+ List of entries
+
+
+
+
+
+.. c:struct:: nvme_nvmset_predictable_lat_log
+
+ Predictable Latency Mode - Deterministic Threshold Configuration Data
+
+**Definition**
+
+::
+
+ struct nvme_nvmset_predictable_lat_log {
+ __u8 status;
+ __u8 rsvd1;
+ __le16 event_type;
+ __u8 rsvd4[28];
+ __le64 dtwin_rt;
+ __le64 dtwin_wt;
+ __le64 dtwin_tmax;
+ __le64 ndwin_tmin_hi;
+ __le64 ndwin_tmin_lo;
+ __u8 rsvd72[56];
+ __le64 dtwin_re;
+ __le64 dtwin_we;
+ __le64 dtwin_te;
+ __u8 rsvd152[360];
+ };
+
+**Members**
+
+``status``
+ Status
+
+``rsvd1``
+ Reserved
+
+``event_type``
+ Event Type
+
+``rsvd4``
+ Reserved
+
+``dtwin_rt``
+ DTWIN Reads Typical
+
+``dtwin_wt``
+ DTWIN Writes Typical
+
+``dtwin_tmax``
+ DTWIN Time Maximum
+
+``ndwin_tmin_hi``
+ NDWIN Time Minimum High
+
+``ndwin_tmin_lo``
+ NDWIN Time Minimum Low
+
+``rsvd72``
+ Reserved
+
+``dtwin_re``
+ DTWIN Reads Estimate
+
+``dtwin_we``
+ DTWIN Writes Estimate
+
+``dtwin_te``
+ DTWIN Time Estimate
+
+``rsvd152``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_nvmeset_pl_status
+
+ Predictable Latency Per NVM Set Log - Status
+
+**Constants**
+
+``NVME_NVMSET_PL_STATUS_DISABLED``
+ Not used (Predictable Latency Mode not enabled)
+
+``NVME_NVMSET_PL_STATUS_DTWIN``
+ Deterministic Window (DTWIN)
+
+``NVME_NVMSET_PL_STATUS_NDWIN``
+ Non-Deterministic Window (NDWIN)
+
+
+
+
+.. c:enum:: nvme_nvmset_pl_events
+
+ Predictable Latency Per NVM Set Log - Event Type
+
+**Constants**
+
+``NVME_NVMSET_PL_EVENT_DTWIN_READ_WARN``
+ DTWIN Reads Warning
+
+``NVME_NVMSET_PL_EVENT_DTWIN_WRITE_WARN``
+ DTWIN Writes Warning
+
+``NVME_NVMSET_PL_EVENT_DTWIN_TIME_WARN``
+ DTWIN Time Warning
+
+``NVME_NVMSET_PL_EVENT_DTWIN_EXCEEDED``
+ Autonomous transition from DTWIN
+ to NDWIN due to typical or
+ maximum value exceeded
+
+``NVME_NVMSET_PL_EVENT_DTWIN_EXCURSION``
+ Autonomous transition from DTWIN
+ to NDWIN due to Deterministic
+ Excursion
+
+
+
+
+.. c:struct:: nvme_aggregate_predictable_lat_event
+
+ Predictable Latency Event Aggregate Log Page
+
+**Definition**
+
+::
+
+ struct nvme_aggregate_predictable_lat_event {
+ __le64 num_entries;
+ __le16 entries[];
+ };
+
+**Members**
+
+``num_entries``
+ Number of entries
+
+``entries``
+ Entry list
+
+
+
+
+
+.. c:struct:: nvme_ana_group_desc
+
+ ANA Group Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_ana_group_desc {
+ __le32 grpid;
+ __le32 nnsids;
+ __le64 chgcnt;
+ __u8 state;
+ __u8 rsvd17[15];
+ __le32 nsids[];
+ };
+
+**Members**
+
+``grpid``
+ ANA group id
+
+``nnsids``
+ Number of namespaces in **nsids**
+
+``chgcnt``
+ Change counter
+
+``state``
+ ANA state
+
+``rsvd17``
+ Reserved
+
+``nsids``
+ List of namespaces
+
+
+
+
+
+.. c:enum:: nvme_ana_state
+
+ ANA Group Descriptor - Asymmetric Namespace Access State
+
+**Constants**
+
+``NVME_ANA_STATE_OPTIMIZED``
+ ANA Optimized state
+
+``NVME_ANA_STATE_NONOPTIMIZED``
+ ANA Non-Optimized state
+
+``NVME_ANA_STATE_INACCESSIBLE``
+ ANA Inaccessible state
+
+``NVME_ANA_STATE_PERSISTENT_LOSS``
+ ANA Persistent Loss state
+
+``NVME_ANA_STATE_CHANGE``
+ ANA Change state
+
+
+
+
+.. c:struct:: nvme_ana_log
+
+ Asymmetric Namespace Access Log
+
+**Definition**
+
+::
+
+ struct nvme_ana_log {
+ __le64 chgcnt;
+ __le16 ngrps;
+ __u8 rsvd10[6];
+ struct nvme_ana_group_desc descs[];
+ };
+
+**Members**
+
+``chgcnt``
+ Change Count
+
+``ngrps``
+ Number of ANA Group Descriptors
+
+``rsvd10``
+ Reserved
+
+``descs``
+ ANA Group Descriptor
+
+
+
+
+
+.. c:struct:: nvme_persistent_event_log
+
+ Persistent Event Log
+
+**Definition**
+
+::
+
+ struct nvme_persistent_event_log {
+ __u8 lid;
+ __u8 rsvd1[3];
+ __le32 tnev;
+ __le64 tll;
+ __u8 rv;
+ __u8 rsvd17;
+ __le16 lhl;
+ __le64 ts;
+ __u8 poh[16];
+ __le64 pcc;
+ __le16 vid;
+ __le16 ssvid;
+ char sn[20];
+ char mn[40];
+ char subnqn[NVME_NQN_LENGTH];
+ __le16 gen_number;
+ __le32 rci;
+ __u8 rsvd378[102];
+ __u8 seb[32];
+ };
+
+**Members**
+
+``lid``
+ Log Identifier
+
+``rsvd1``
+ Reserved
+
+``tnev``
+ Total Number of Events
+
+``tll``
+ Total Log Length
+
+``rv``
+ Log Revision
+
+``rsvd17``
+ Reserved
+
+``lhl``
+ Log Header Length
+
+``ts``
+ Timestamp
+
+``poh``
+ Power on Hours
+
+``pcc``
+ Power Cycle Count
+
+``vid``
+ PCI Vendor ID
+
+``ssvid``
+ PCI Subsystem Vendor ID
+
+``sn``
+ Serial Number
+
+``mn``
+ Model Number
+
+``subnqn``
+ NVM Subsystem NVMe Qualified Name
+
+``gen_number``
+ Generation Number
+
+``rci``
+ Reporting Context Information
+
+``rsvd378``
+ Reserved
+
+``seb``
+ Supported Events Bitmap
+
+
+
+
+
+.. c:struct:: nvme_persistent_event_entry
+
+ Persistent Event
+
+**Definition**
+
+::
+
+ struct nvme_persistent_event_entry {
+ __u8 etype;
+ __u8 etype_rev;
+ __u8 ehl;
+ __u8 ehai;
+ __le16 cntlid;
+ __le64 ets;
+ __le16 pelpid;
+ __u8 rsvd16[4];
+ __le16 vsil;
+ __le16 el;
+ };
+
+**Members**
+
+``etype``
+ Event Type
+
+``etype_rev``
+ Event Type Revision
+
+``ehl``
+ Event Header Length
+
+``ehai``
+ Event Header Additional Info
+
+``cntlid``
+ Controller Identifier
+
+``ets``
+ Event Timestamp
+
+``pelpid``
+ Port Identifier
+
+``rsvd16``
+ Reserved
+
+``vsil``
+ Vendor Specific Information Length
+
+``el``
+ Event Length
+
+
+
+
+
+.. c:enum:: nvme_persistent_event_types
+
+ Persistent event log events
+
+**Constants**
+
+``NVME_PEL_SMART_HEALTH_EVENT``
+ SMART / Health Log Snapshot Event
+
+``NVME_PEL_FW_COMMIT_EVENT``
+ Firmware Commit Event
+
+``NVME_PEL_TIMESTAMP_EVENT``
+ Timestamp Change Event
+
+``NVME_PEL_POWER_ON_RESET_EVENT``
+ Power-on or Reset Event
+
+``NVME_PEL_NSS_HW_ERROR_EVENT``
+ NVM Subsystem Hardware Error Event
+
+``NVME_PEL_CHANGE_NS_EVENT``
+ Change Namespace Event
+
+``NVME_PEL_FORMAT_START_EVENT``
+ Format NVM Start Event
+
+``NVME_PEL_FORMAT_COMPLETION_EVENT``
+ Format NVM Completion Event
+
+``NVME_PEL_SANITIZE_START_EVENT``
+ Sanitize Start Event
+
+``NVME_PEL_SANITIZE_COMPLETION_EVENT``
+ Sanitize Completion Event
+
+``NVME_PEL_SET_FEATURE_EVENT``
+ Set Feature Event
+
+``NVME_PEL_TELEMETRY_CRT``
+ Telemetry Log Create Event
+
+``NVME_PEL_THERMAL_EXCURSION_EVENT``
+ Thermal Excursion Event
+
+
+
+
+.. c:struct:: nvme_fw_commit_event
+
+ Firmware Commit Event Data
+
+**Definition**
+
+::
+
+ struct nvme_fw_commit_event {
+ __le64 old_fw_rev;
+ __le64 new_fw_rev;
+ __u8 fw_commit_action;
+ __u8 fw_slot;
+ __u8 sct_fw;
+ __u8 sc_fw;
+ __le16 vndr_assign_fw_commit_rc;
+ };
+
+**Members**
+
+``old_fw_rev``
+ Old Firmware Revision
+
+``new_fw_rev``
+ New Firmware Revision
+
+``fw_commit_action``
+ Firmware Commit Action
+
+``fw_slot``
+ Firmware Slot
+
+``sct_fw``
+ Status Code Type for Firmware Commit Command
+
+``sc_fw``
+ Status Returned for Firmware Commit Command
+
+``vndr_assign_fw_commit_rc``
+ Vendor Assigned Firmware Commit Result Code
+
+
+
+
+
+.. c:struct:: nvme_time_stamp_change_event
+
+ Timestamp Change Event
+
+**Definition**
+
+::
+
+ struct nvme_time_stamp_change_event {
+ __le64 previous_timestamp;
+ __le64 ml_secs_since_reset;
+ };
+
+**Members**
+
+``previous_timestamp``
+ Previous Timestamp
+
+``ml_secs_since_reset``
+ Milliseconds Since Reset
+
+
+
+
+
+.. c:struct:: nvme_power_on_reset_info_list
+
+ Controller Reset Information
+
+**Definition**
+
+::
+
+ struct nvme_power_on_reset_info_list {
+ __le16 cid;
+ __u8 fw_act;
+ __u8 op_in_prog;
+ __u8 rsvd4[12];
+ __le32 ctrl_power_cycle;
+ __le64 power_on_ml_seconds;
+ __le64 ctrl_time_stamp;
+ };
+
+**Members**
+
+``cid``
+ Controller ID
+
+``fw_act``
+ Firmware Activation
+
+``op_in_prog``
+ Operation in Progress
+
+``rsvd4``
+ Reserved
+
+``ctrl_power_cycle``
+ Controller Power Cycle
+
+``power_on_ml_seconds``
+ Power on milliseconds
+
+``ctrl_time_stamp``
+ Controller Timestamp
+
+
+
+
+
+.. c:struct:: nvme_nss_hw_err_event
+
+ NVM Subsystem Hardware Error Event
+
+**Definition**
+
+::
+
+ struct nvme_nss_hw_err_event {
+ __le16 nss_hw_err_event_code;
+ __u8 rsvd2[2];
+ __u8 *add_hw_err_info;
+ };
+
+**Members**
+
+``nss_hw_err_event_code``
+ NVM Subsystem Hardware Error Event Code
+
+``rsvd2``
+ Reserved
+
+``add_hw_err_info``
+ Additional Hardware Error Information
+
+
+
+
+
+.. c:struct:: nvme_change_ns_event
+
+ Change Namespace Event Data
+
+**Definition**
+
+::
+
+ struct nvme_change_ns_event {
+ __le32 nsmgt_cdw10;
+ __u8 rsvd4[4];
+ __le64 nsze;
+ __u8 rsvd16[8];
+ __le64 nscap;
+ __u8 flbas;
+ __u8 dps;
+ __u8 nmic;
+ __u8 rsvd35;
+ __le32 ana_grp_id;
+ __le16 nvmset_id;
+ __le16 rsvd42;
+ __le32 nsid;
+ };
+
+**Members**
+
+``nsmgt_cdw10``
+ Namespace Management CDW10
+
+``rsvd4``
+ Reserved
+
+``nsze``
+ Namespace Size
+
+``rsvd16``
+ Reserved
+
+``nscap``
+ Namespace Capacity
+
+``flbas``
+ Formatted LBA Size
+
+``dps``
+ End-to-end Data Protection Type Settings
+
+``nmic``
+ Namespace Multi-path I/O and Namespace Sharing Capabilities
+
+``rsvd35``
+ Reserved
+
+``ana_grp_id``
+ ANA Group Identifier
+
+``nvmset_id``
+ NVM Set Identifier
+
+``rsvd42``
+ Reserved
+
+``nsid``
+ Namespace ID
+
+
+
+
+
+.. c:struct:: nvme_format_nvm_start_event
+
+ Format NVM Start Event Data
+
+**Definition**
+
+::
+
+ struct nvme_format_nvm_start_event {
+ __le32 nsid;
+ __u8 fna;
+ __u8 rsvd5[3];
+ __le32 format_nvm_cdw10;
+ };
+
+**Members**
+
+``nsid``
+ Namespace Identifier
+
+``fna``
+ Format NVM Attributes
+
+``rsvd5``
+ Reserved
+
+``format_nvm_cdw10``
+ Format NVM CDW10
+
+
+
+
+
+.. c:struct:: nvme_format_nvm_compln_event
+
+ Format NVM Completion Event Data
+
+**Definition**
+
+::
+
+ struct nvme_format_nvm_compln_event {
+ __le32 nsid;
+ __u8 smallest_fpi;
+ __u8 format_nvm_status;
+ __le16 compln_info;
+ __le32 status_field;
+ };
+
+**Members**
+
+``nsid``
+ Namespace Identifier
+
+``smallest_fpi``
+ Smallest Format Progress Indicator
+
+``format_nvm_status``
+ Format NVM Status
+
+``compln_info``
+ Completion Information
+
+``status_field``
+ Status Field
+
+
+
+
+
+.. c:struct:: nvme_sanitize_start_event
+
+ Sanitize Start Event Data
+
+**Definition**
+
+::
+
+ struct nvme_sanitize_start_event {
+ __le32 sani_cap;
+ __le32 sani_cdw10;
+ __le32 sani_cdw11;
+ };
+
+**Members**
+
+``sani_cap``
+ SANICAP
+
+``sani_cdw10``
+ Sanitize CDW10
+
+``sani_cdw11``
+ Sanitize CDW11
+
+
+
+
+
+.. c:struct:: nvme_sanitize_compln_event
+
+ Sanitize Completion Event Data
+
+**Definition**
+
+::
+
+ struct nvme_sanitize_compln_event {
+ __le16 sani_prog;
+ __le16 sani_status;
+ __le16 cmpln_info;
+ __u8 rsvd6[2];
+ };
+
+**Members**
+
+``sani_prog``
+ Sanitize Progress
+
+``sani_status``
+ Sanitize Status
+
+``cmpln_info``
+ Completion Information
+
+``rsvd6``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_set_feature_event
+
+ Set Feature Event Data
+
+**Definition**
+
+::
+
+ struct nvme_set_feature_event {
+ __le32 layout;
+ __le32 cdw_mem[0];
+ };
+
+**Members**
+
+``layout``
+ Set Feature Event Layout
+
+``cdw_mem``
+ Command Dwords Memory buffer
+
+
+
+
+
+.. c:struct:: nvme_thermal_exc_event
+
+ Thermal Excursion Event Data
+
+**Definition**
+
+::
+
+ struct nvme_thermal_exc_event {
+ __u8 over_temp;
+ __u8 threshold;
+ };
+
+**Members**
+
+``over_temp``
+ Over Temperature
+
+``threshold``
+ temperature threshold
+
+
+
+
+
+.. c:struct:: nvme_lba_rd
+
+ LBA Range Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_lba_rd {
+ __le64 rslba;
+ __le32 rnlb;
+ __u8 rsvd12[4];
+ };
+
+**Members**
+
+``rslba``
+ Range Starting LBA
+
+``rnlb``
+ Range Number of Logical Blocks
+
+``rsvd12``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_lbas_ns_element
+
+ LBA Status Log Namespace Element
+
+**Definition**
+
+::
+
+ struct nvme_lbas_ns_element {
+ __le32 neid;
+ __le32 nlrd;
+ __u8 ratype;
+ __u8 rsvd8[7];
+ struct nvme_lba_rd lba_rd[];
+ };
+
+**Members**
+
+``neid``
+ Namespace Element Identifier
+
+``nlrd``
+ Number of LBA Range Descriptors
+
+``ratype``
+ Recommended Action Type. see **enum** nvme_lba_status_atype
+
+``rsvd8``
+ Reserved
+
+``lba_rd``
+ LBA Range Descriptor
+
+
+
+
+
+.. c:enum:: nvme_lba_status_atype
+
+ Potentially Unrecoverable LBAs
+
+**Constants**
+
+``NVME_LBA_STATUS_ATYPE_SCAN_UNTRACKED``
+ Potentially Unrecoverable LBAs
+
+``NVME_LBA_STATUS_ATYPE_SCAN_TRACKED``
+ Potentially Unrecoverable LBAs
+ associated with physical storage
+
+
+
+
+.. c:struct:: nvme_lba_status_log
+
+ LBA Status Information Log
+
+**Definition**
+
+::
+
+ struct nvme_lba_status_log {
+ __le32 lslplen;
+ __le32 nlslne;
+ __le32 estulb;
+ __u8 rsvd12[2];
+ __le16 lsgc;
+ struct nvme_lbas_ns_element elements[];
+ };
+
+**Members**
+
+``lslplen``
+ LBA Status Log Page Length
+
+``nlslne``
+ Number of LBA Status Log Namespace Elements
+
+``estulb``
+ Estimate of Unrecoverable Logical Blocks
+
+``rsvd12``
+ Reserved
+
+``lsgc``
+ LBA Status Generation Counter
+
+``elements``
+ LBA Status Log Namespace Element List
+
+
+
+
+
+.. c:struct:: nvme_eg_event_aggregate_log
+
+ Endurance Group Event Aggregate
+
+**Definition**
+
+::
+
+ struct nvme_eg_event_aggregate_log {
+ __le64 nr_entries;
+ __le16 egids[];
+ };
+
+**Members**
+
+``nr_entries``
+ Number of Entries
+
+``egids``
+ Endurance Group Identifier
+
+
+
+
+
+.. c:enum:: nvme_fid_supported_effects
+
+ FID Supported and Effects Data Structure definitions
+
+**Constants**
+
+``NVME_FID_SUPPORTED_EFFECTS_FSUPP``
+ FID Supported
+
+``NVME_FID_SUPPORTED_EFFECTS_UDCC``
+ User Data Content Change
+
+``NVME_FID_SUPPORTED_EFFECTS_NCC``
+ Namespace Capability Change
+
+``NVME_FID_SUPPORTED_EFFECTS_NIC``
+ Namespace Inventory Change
+
+``NVME_FID_SUPPORTED_EFFECTS_CCC``
+ Controller Capability Change
+
+``NVME_FID_SUPPORTED_EFFECTS_UUID_SEL``
+ UUID Selection Supported
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_SHIFT``
+ FID Scope Shift
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_MASK``
+ FID Scope Mask
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_NS``
+ Namespace Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_CTRL``
+ Controller Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_NVM_SET``
+ NVM Set Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_ENDGRP``
+ Endurance Group Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_DOMAIN``
+ Domain Scope
+
+``NVME_FID_SUPPORTED_EFFECTS_SCOPE_NSS``
+ NVM Subsystem Scope
+
+
+
+
+.. c:struct:: nvme_fid_supported_effects_log
+
+ Feature Identifiers Supported and Effects
+
+**Definition**
+
+::
+
+ struct nvme_fid_supported_effects_log {
+ __le32 fid_support[NVME_LOG_FID_SUPPORTED_EFFECTS_MAX];
+ };
+
+**Members**
+
+``fid_support``
+ Feature Identifier Supported
+
+
+
+
+
+.. c:enum:: nvme_mi_cmd_supported_effects
+
+ MI Command Supported and Effects Data Structure
+
+**Constants**
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_CSUPP``
+ Command Supported
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC``
+ User Data Content Change
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_NCC``
+ Namespace Capability Change
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_NIC``
+ Namespace Inventory Change
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_CCC``
+ Controller Capability Change
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_SHIFT``
+ 20 bit shift
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_MASK``
+ 12 bit mask - 0xfff
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NS``
+ Namespace Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_CTRL``
+ Controller Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NVM_SET``
+ NVM Set Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_ENDGRP``
+ Endurance Group Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_DOMAIN``
+ Domain Scope
+
+``NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NSS``
+ NVM Subsystem Scope
+
+
+
+
+.. c:struct:: nvme_mi_cmd_supported_effects_log
+
+ NVMe-MI Commands Supported and Effects Log
+
+**Definition**
+
+::
+
+ struct nvme_mi_cmd_supported_effects_log {
+ __le32 mi_cmd_support[NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX];
+ __le32 reserved1[NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_RESERVED];
+ };
+
+**Members**
+
+``mi_cmd_support``
+ NVMe-MI Commands Supported
+
+``reserved1``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_boot_partition
+
+ Boot Partition Log
+
+**Definition**
+
+::
+
+ struct nvme_boot_partition {
+ __u8 lid;
+ __u8 rsvd1[3];
+ __le32 bpinfo;
+ __u8 rsvd8[8];
+ __u8 boot_partition_data[];
+ };
+
+**Members**
+
+``lid``
+ Boot Partition Identifier
+
+``rsvd1``
+ Reserved
+
+``bpinfo``
+ Boot Partition Information
+
+``rsvd8``
+ Reserved
+
+``boot_partition_data``
+ Contains the contents of the
+ specified Boot Partition
+
+
+
+
+
+.. c:struct:: nvme_media_unit_stat_desc
+
+ Media Unit Status Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_media_unit_stat_desc {
+ __le16 muid;
+ __le16 domainid;
+ __le16 endgid;
+ __le16 nvmsetid;
+ __le16 cap_adj_fctr;
+ __u8 avl_spare;
+ __u8 percent_used;
+ __u8 mucs;
+ __u8 cio;
+ };
+
+**Members**
+
+``muid``
+ Media Unit Identifier
+
+``domainid``
+ Domain Identifier
+
+``endgid``
+ Endurance Group Identifier
+
+``nvmsetid``
+ NVM Set Identifier
+
+``cap_adj_fctr``
+ Capacity Adjustment Factor
+
+``avl_spare``
+ Available Spare
+
+``percent_used``
+ Percentage Used
+
+``mucs``
+ Number of Channels attached to media units
+
+``cio``
+ Channel Identifiers Offset
+
+
+
+
+
+.. c:struct:: nvme_media_unit_stat_log
+
+ Media Unit Status
+
+**Definition**
+
+::
+
+ struct nvme_media_unit_stat_log {
+ __le16 nmu;
+ __le16 cchans;
+ __le16 sel_config;
+ __u8 rsvd6[10];
+ struct nvme_media_unit_stat_desc mus_desc[];
+ };
+
+**Members**
+
+``nmu``
+ Number unit status descriptor
+
+``cchans``
+ Number of Channels
+
+``sel_config``
+ Selected Configuration
+
+``rsvd6``
+ Reserved
+
+``mus_desc``
+ Media unit statistic descriptors
+
+
+
+
+
+.. c:struct:: nvme_media_unit_config_desc
+
+ Media Unit Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_media_unit_config_desc {
+ __le16 muid;
+ __u8 rsvd2[4];
+ __le16 mudl;
+ };
+
+**Members**
+
+``muid``
+ Media Unit Identifier
+
+``rsvd2``
+ Reserved
+
+``mudl``
+ Media Unit Descriptor Length
+
+
+
+
+
+.. c:struct:: nvme_channel_config_desc
+
+ Channel Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_channel_config_desc {
+ __le16 chanid;
+ __le16 chmus;
+ struct nvme_media_unit_config_desc mu_config_desc[];
+ };
+
+**Members**
+
+``chanid``
+ Channel Identifier
+
+``chmus``
+ Number Channel Media Units
+
+``mu_config_desc``
+ Channel Unit config descriptors.
+ See **struct** nvme_media_unit_config_desc
+
+
+
+
+
+.. c:struct:: nvme_end_grp_chan_desc
+
+ Endurance Group Channel Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_end_grp_chan_desc {
+ __le16 egchans;
+ struct nvme_channel_config_desc chan_config_desc[];
+ };
+
+**Members**
+
+``egchans``
+ Number of Channels
+
+``chan_config_desc``
+ Channel config descriptors.
+ See **struct** nvme_channel_config_desc
+
+
+
+
+
+.. c:struct:: nvme_end_grp_config_desc
+
+ Endurance Group Configuration Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_end_grp_config_desc {
+ __le16 endgid;
+ __le16 cap_adj_factor;
+ __u8 rsvd4[12];
+ __u8 tegcap[16];
+ __u8 segcap[16];
+ __u8 end_est[16];
+ __u8 rsvd64[16];
+ __le16 egsets;
+ __le16 nvmsetid[];
+ };
+
+**Members**
+
+``endgid``
+ Endurance Group Identifier
+
+``cap_adj_factor``
+ Capacity Adjustment Factor
+
+``rsvd4``
+ Reserved
+
+``tegcap``
+ Total Endurance Group Capacity
+
+``segcap``
+ Spare Endurance Group Capacity
+
+``end_est``
+ Endurance Estimate
+
+``rsvd64``
+ Reserved
+
+``egsets``
+ Number of NVM Sets
+
+``nvmsetid``
+ NVM Set Identifier
+
+
+
+
+
+.. c:struct:: nvme_capacity_config_desc
+
+ Capacity Configuration structure definitions
+
+**Definition**
+
+::
+
+ struct nvme_capacity_config_desc {
+ __le16 cap_config_id;
+ __le16 domainid;
+ __le16 egcn;
+ __u8 rsvd6[26];
+ struct nvme_end_grp_config_desc egcd[];
+ };
+
+**Members**
+
+``cap_config_id``
+ Capacity Configuration Identifier
+
+``domainid``
+ Domain Identifier
+
+``egcn``
+ Number Endurance Group Configuration
+ Descriptors
+
+``rsvd6``
+ Reserved
+
+``egcd``
+ Endurance Group Config descriptors.
+ See **struct** nvme_end_grp_config_desc
+
+
+
+
+
+.. c:struct:: nvme_supported_cap_config_list_log
+
+ Supported Capacity Configuration list log page
+
+**Definition**
+
+::
+
+ struct nvme_supported_cap_config_list_log {
+ __u8 sccn;
+ __u8 rsvd1[15];
+ struct nvme_capacity_config_desc cap_config_desc[];
+ };
+
+**Members**
+
+``sccn``
+ Number of capacity configuration
+
+``rsvd1``
+ Reserved
+
+``cap_config_desc``
+ Capacity configuration descriptor.
+ See **struct** nvme_capacity_config_desc
+
+
+
+
+
+.. c:struct:: nvme_resv_notification_log
+
+ Reservation Notification Log
+
+**Definition**
+
+::
+
+ struct nvme_resv_notification_log {
+ __le64 lpc;
+ __u8 rnlpt;
+ __u8 nalp;
+ __u8 rsvd9[2];
+ __le32 nsid;
+ __u8 rsvd16[48];
+ };
+
+**Members**
+
+``lpc``
+ Log Page Count
+
+``rnlpt``
+ See :c:type:`enum nvme_resv_notify_rnlpt <nvme_resv_notify_rnlpt>`.
+
+``nalp``
+ Number of Available Log Pages
+
+``rsvd9``
+ Reserved
+
+``nsid``
+ Namespace ID
+
+``rsvd16``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_resv_notify_rnlpt
+
+ Reservation Notification Log - Reservation Notification Log Page Type
+
+**Constants**
+
+``NVME_RESV_NOTIFY_RNLPT_EMPTY``
+ Empty Log Page
+
+``NVME_RESV_NOTIFY_RNLPT_REGISTRATION_PREEMPTED``
+ Registration Preempted
+
+``NVME_RESV_NOTIFY_RNLPT_RESERVATION_RELEASED``
+ Reservation Released
+
+``NVME_RESV_NOTIFY_RNLPT_RESERVATION_PREEMPTED``
+ Reservation Preempted
+
+
+
+
+.. c:struct:: nvme_sanitize_log_page
+
+ Sanitize Status (Log Identifier 81h)
+
+**Definition**
+
+::
+
+ struct nvme_sanitize_log_page {
+ __le16 sprog;
+ __le16 sstat;
+ __le32 scdw10;
+ __le32 eto;
+ __le32 etbe;
+ __le32 etce;
+ __le32 etond;
+ __le32 etbend;
+ __le32 etcend;
+ __u8 rsvd32[480];
+ };
+
+**Members**
+
+``sprog``
+ Sanitize Progress (SPROG): indicates the fraction complete of the
+ sanitize operation. The value is a numerator of the fraction
+ complete that has 65,536 (10000h) as its denominator. This value
+ shall be set to FFFFh if the **sstat** field is not set to
+ ``NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS``.
+
+``sstat``
+ Sanitize Status (SSTAT): indicates the status associated with
+ the most recent sanitize operation. See :c:type:`enum nvme_sanitize_sstat <nvme_sanitize_sstat>`.
+
+``scdw10``
+ Sanitize Command Dword 10 Information (SCDW10): contains the value
+ of the Command Dword 10 field of the Sanitize command that started
+ the sanitize operation.
+
+``eto``
+ Estimated Time For Overwrite: indicates the number of seconds required
+ to complete an Overwrite sanitize operation with 16 passes in
+ the background when the No-Deallocate Modifies Media After Sanitize
+ field is not set to 10b. A value of 0h indicates that the sanitize
+ operation is expected to be completed in the background when the
+ Sanitize command that started that operation is completed. A value
+ of FFFFFFFFh indicates that no time period is reported.
+
+``etbe``
+ Estimated Time For Block Erase: indicates the number of seconds
+ required to complete a Block Erase sanitize operation in the
+ background when the No-Deallocate Modifies Media After Sanitize
+ field is not set to 10b. A value of 0h indicates that the sanitize
+ operation is expected to be completed in the background when the
+ Sanitize command that started that operation is completed.
+ A value of FFFFFFFFh indicates that no time period is reported.
+
+``etce``
+ Estimated Time For Crypto Erase: indicates the number of seconds
+ required to complete a Crypto Erase sanitize operation in the
+ background when the No-Deallocate Modifies Media After Sanitize
+ field is not set to 10b. A value of 0h indicates that the sanitize
+ operation is expected to be completed in the background when the
+ Sanitize command that started that operation is completed.
+ A value of FFFFFFFFh indicates that no time period is reported.
+
+``etond``
+ Estimated Time For Overwrite With No-Deallocate Media Modification:
+ indicates the number of seconds required to complete an Overwrite
+ sanitize operation and the associated additional media modification
+ after the Overwrite sanitize operation in the background when
+ the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ command that requested the Overwrite sanitize operation; and
+ the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ A value of 0h indicates that the sanitize operation is expected
+ to be completed in the background when the Sanitize command that
+ started that operation is completed. A value of FFFFFFFFh indicates
+ that no time period is reported.
+
+``etbend``
+ Estimated Time For Block Erase With No-Deallocate Media Modification:
+ indicates the number of seconds required to complete a Block Erase
+ sanitize operation and the associated additional media modification
+ after the Block Erase sanitize operation in the background when
+ the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ command that requested the Overwrite sanitize operation; and
+ the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ A value of 0h indicates that the sanitize operation is expected
+ to be completed in the background when the Sanitize command that
+ started that operation is completed. A value of FFFFFFFFh indicates
+ that no time period is reported.
+
+``etcend``
+ Estimated Time For Crypto Erase With No-Deallocate Media Modification:
+ indicates the number of seconds required to complete a Crypto Erase
+ sanitize operation and the associated additional media modification
+ after the Crypto Erase sanitize operation in the background when
+ the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ command that requested the Overwrite sanitize operation; and
+ the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ A value of 0h indicates that the sanitize operation is expected
+ to be completed in the background when the Sanitize command that
+ started that operation is completed. A value of FFFFFFFFh indicates
+ that no time period is reported.
+
+``rsvd32``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_sanitize_sstat
+
+ Sanitize Status (SSTAT)
+
+**Constants**
+
+``NVME_SANITIZE_SSTAT_STATUS_SHIFT``
+ Shift amount to get the status value of
+ the most recent sanitize operation from
+ the :c:type:`struct nvme_sanitize_log_page <nvme_sanitize_log_page>`.sstat
+ field.
+
+``NVME_SANITIZE_SSTAT_STATUS_MASK``
+ Mask to get the status value of the most
+ recent sanitize operation.
+
+``NVME_SANITIZE_SSTAT_STATUS_NEVER_SANITIZED``
+ The NVM subsystem has never been
+ sanitized.
+
+``NVME_SANITIZE_SSTAT_STATUS_COMPLETE_SUCCESS``
+ The most recent sanitize operation
+ completed successfully including any
+ additional media modification.
+
+``NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS``
+ A sanitize operation is currently in progress.
+
+``NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED``
+ The most recent sanitize operation
+ failed.
+
+``NVME_SANITIZE_SSTAT_STATUS_ND_COMPLETE_SUCCESS``
+ The most recent sanitize operation
+ for which No-Deallocate After Sanitize was
+ requested has completed successfully with
+ deallocation of all user data.
+
+``NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT``
+ Shift amount to get the number
+ of completed passes if the most recent
+ sanitize operation was an Overwrite. This
+ value shall be cleared to 0h if the most
+ recent sanitize operation was not
+ an Overwrite.
+
+``NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK``
+ Mask to get the number of completed
+ passes.
+
+``NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_SHIFT``
+ Shift amount to get the Global
+ Data Erased value from the
+ :c:type:`struct nvme_sanitize_log_page <nvme_sanitize_log_page>`.sstat field.
+
+``NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_MASK``
+ Mask to get the Global Data Erased
+ value.
+
+``NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED``
+ Global Data Erased: if set, then no
+ namespace user data in the NVM subsystem
+ has been written to and no Persistent
+ Memory Region in the NVM subsystem has
+ been enabled since being manufactured and
+ the NVM subsystem has never been sanitized;
+ or since the most recent successful sanitize
+ operation.
+
+
+
+
+.. c:struct:: nvme_zns_changed_zone_log
+
+ ZNS Changed Zone List log
+
+**Definition**
+
+::
+
+ struct nvme_zns_changed_zone_log {
+ __le16 nrzid;
+ __u8 rsvd2[6];
+ __le64 zid[NVME_ZNS_CHANGED_ZONES_MAX];
+ };
+
+**Members**
+
+``nrzid``
+ Number of Zone Identifiers
+
+``rsvd2``
+ Reserved
+
+``zid``
+ Zone Identifier
+
+
+
+
+
+.. c:enum:: nvme_zns_zt
+
+ Zone Descriptor Data Structure - Zone Type
+
+**Constants**
+
+``NVME_ZONE_TYPE_SEQWRITE_REQ``
+ Sequential Write Required
+
+
+
+
+.. c:enum:: nvme_zns_za
+
+ Zone Descriptor Data Structure
+
+**Constants**
+
+``NVME_ZNS_ZA_ZFC``
+ Zone Finished by Controller
+
+``NVME_ZNS_ZA_FZR``
+ Finish Zone Recommended
+
+``NVME_ZNS_ZA_RZR``
+ Reset Zone Recommended
+
+``NVME_ZNS_ZA_ZRWAV``
+
+``NVME_ZNS_ZA_ZDEV``
+ Zone Descriptor Extension Valid
+
+
+
+
+.. c:enum:: nvme_zns_zs
+
+ Zone Descriptor Data Structure - Zone State
+
+**Constants**
+
+``NVME_ZNS_ZS_EMPTY``
+ Empty state
+
+``NVME_ZNS_ZS_IMPL_OPEN``
+ Implicitly open state
+
+``NVME_ZNS_ZS_EXPL_OPEN``
+ Explicitly open state
+
+``NVME_ZNS_ZS_CLOSED``
+ Closed state
+
+``NVME_ZNS_ZS_READ_ONLY``
+ Read only state
+
+``NVME_ZNS_ZS_FULL``
+ Full state
+
+``NVME_ZNS_ZS_OFFLINE``
+ Offline state
+
+
+
+
+.. c:struct:: nvme_zns_desc
+
+ Zone Descriptor Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_zns_desc {
+ __u8 zt;
+ __u8 zs;
+ __u8 za;
+ __u8 zai;
+ __u8 rsvd4[4];
+ __le64 zcap;
+ __le64 zslba;
+ __le64 wp;
+ __u8 rsvd32[32];
+ };
+
+**Members**
+
+``zt``
+ Zone Type
+
+``zs``
+ Zone State
+
+``za``
+ Zone Attributes
+
+``zai``
+ Zone Attributes Information
+
+``rsvd4``
+ Reserved
+
+``zcap``
+ Zone Capacity
+
+``zslba``
+ Zone Start Logical Block Address
+
+``wp``
+ Write Pointer
+
+``rsvd32``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_zone_report
+
+ Report Zones Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_zone_report {
+ __le64 nr_zones;
+ __u8 rsvd8[56];
+ struct nvme_zns_desc entries[];
+ };
+
+**Members**
+
+``nr_zones``
+ Number of descriptors in **entries**
+
+``rsvd8``
+ Reserved
+
+``entries``
+ Zoned namespace descriptors
+
+
+
+
+
+.. c:struct:: nvme_lba_status_desc
+
+ LBA Status Descriptor Entry
+
+**Definition**
+
+::
+
+ struct nvme_lba_status_desc {
+ __le64 dslba;
+ __le32 nlb;
+ __u8 rsvd12;
+ __u8 status;
+ __u8 rsvd14[2];
+ };
+
+**Members**
+
+``dslba``
+ Descriptor Starting LBA
+
+``nlb``
+ Number of Logical Blocks
+
+``rsvd12``
+ Reserved
+
+``status``
+ Additional status about this LBA range
+
+``rsvd14``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_lba_status
+
+ LBA Status Descriptor List
+
+**Definition**
+
+::
+
+ struct nvme_lba_status {
+ __le32 nlsd;
+ __u8 cmpc;
+ __u8 rsvd5[3];
+ struct nvme_lba_status_desc descs[];
+ };
+
+**Members**
+
+``nlsd``
+ Number of LBA Status Descriptors
+
+``cmpc``
+ Completion Condition
+
+``rsvd5``
+ Reserved
+
+``descs``
+ LBA status descriptor Entry
+
+
+
+
+
+.. c:struct:: nvme_feat_auto_pst
+
+ Autonomous Power State Transition
+
+**Definition**
+
+::
+
+ struct nvme_feat_auto_pst {
+ __le64 apst_entry[32];
+ };
+
+**Members**
+
+``apst_entry``
+ See :c:type:`enum nvme_apst_entry <nvme_apst_entry>`
+
+
+
+
+
+.. c:enum:: nvme_apst_entry
+
+ Autonomous Power State Transition
+
+**Constants**
+
+``NVME_APST_ENTRY_ITPS_SHIFT``
+ Idle Transition Power State Shift
+
+``NVME_APST_ENTRY_ITPT_SHIFT``
+ Idle Time Prior to Transition Shift
+
+``NVME_APST_ENTRY_ITPS_MASK``
+ Idle Transition Power State Mask
+
+``NVME_APST_ENTRY_ITPT_MASK``
+ Idle Time Prior to Transition Mask
+
+
+
+
+.. c:struct:: nvme_metadata_element_desc
+
+ Metadata Element Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_metadata_element_desc {
+ __u8 type;
+ __u8 rev;
+ __u16 len;
+ __u8 val[0];
+ };
+
+**Members**
+
+``type``
+ Element Type (ET)
+
+``rev``
+ Element Revision (ER)
+
+``len``
+ Element Length (ELEN)
+
+``val``
+ Element Value (EVAL), UTF-8 string
+
+
+
+
+
+.. c:struct:: nvme_host_metadata
+
+ Host Metadata Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_host_metadata {
+ __u8 ndesc;
+ __u8 rsvd1;
+ union {
+ struct nvme_metadata_element_desc descs[0];
+ __u8 descs_buf[4094];
+ };
+ };
+
+**Members**
+
+``ndesc``
+ Number of metadata element descriptors
+
+``rsvd1``
+ Reserved
+
+``{unnamed_union}``
+ anonymous
+
+``descs``
+ Metadata element descriptors
+
+``descs_buf``
+ Metadata element descriptor buffer
+
+
+
+
+
+.. c:enum:: nvme_ctrl_metadata_type
+
+ Controller Metadata Element Types
+
+**Constants**
+
+``NVME_CTRL_METADATA_OS_CTRL_NAME``
+ Name of the controller in
+ the operating system.
+
+``NVME_CTRL_METADATA_OS_DRIVER_NAME``
+ Name of the driver in the
+ operating system.
+
+``NVME_CTRL_METADATA_OS_DRIVER_VER``
+ Version of the driver in
+ the operating system.
+
+``NVME_CTRL_METADATA_PRE_BOOT_CTRL_NAME``
+ Name of the controller in
+ the pre-boot environment.
+
+``NVME_CTRL_METADATA_PRE_BOOT_DRIVER_NAME``
+ Name of the driver in the
+ pre-boot environment.
+
+``NVME_CTRL_METADATA_PRE_BOOT_DRIVER_VER``
+ Version of the driver in the
+ pre-boot environment.
+
+``NVME_CTRL_METADATA_SYS_PROC_MODEL``
+ Model of the processor.
+
+``NVME_CTRL_METADATA_CHIPSET_DRV_NAME``
+ Chipset driver name.
+
+``NVME_CTRL_METADATA_CHIPSET_DRV_VERSION``
+ Chipset driver version.
+
+``NVME_CTRL_METADATA_OS_NAME_AND_BUILD``
+ Operating system name and build.
+
+``NVME_CTRL_METADATA_SYS_PROD_NAME``
+ System product name.
+
+``NVME_CTRL_METADATA_FIRMWARE_VERSION``
+ Host firmware (e.g UEFI) version.
+
+``NVME_CTRL_METADATA_OS_DRIVER_FILENAME``
+ Operating system driver filename.
+
+``NVME_CTRL_METADATA_DISPLAY_DRV_NAME``
+ Display driver name.
+
+``NVME_CTRL_METADATA_DISPLAY_DRV_VERSION``
+ Display driver version.
+
+``NVME_CTRL_METADATA_HOST_DET_FAIL_REC``
+ Failure record.
+
+
+
+
+.. c:enum:: nvme_ns_metadata_type
+
+ Namespace Metadata Element Types
+
+**Constants**
+
+``NVME_NS_METADATA_OS_NS_NAME``
+ Name of the namespace in the
+ operating system
+
+``NVME_NS_METADATA_PRE_BOOT_NS_NAME``
+ Name of the namespace in the pre-boot
+ environment.
+
+``NVME_NS_METADATA_OS_NS_QUAL_1``
+ First qualifier of the Operating System
+ Namespace Name.
+
+``NVME_NS_METADATA_OS_NS_QUAL_2``
+ Second qualifier of the Operating System
+ Namespace Name.
+
+
+
+
+.. c:struct:: nvme_timestamp
+
+ Timestamp - Data Structure for Get Features
+
+**Definition**
+
+::
+
+ struct nvme_timestamp {
+ __u8 timestamp[6];
+ __u8 attr;
+ __u8 rsvd;
+ };
+
+**Members**
+
+``timestamp``
+ Timestamp value based on origin and synch field
+
+``attr``
+ Attribute
+
+``rsvd``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_lba_range_type_entry
+
+ LBA Range Type - Data Structure Entry
+
+**Definition**
+
+::
+
+ struct nvme_lba_range_type_entry {
+ __u8 type;
+ __u8 attributes;
+ __u8 rsvd2[14];
+ __u64 slba;
+ __u64 nlb;
+ __u8 guid[16];
+ __u8 rsvd48[16];
+ };
+
+**Members**
+
+``type``
+ Specifies the Type of the LBA range
+
+``attributes``
+ Specifies attributes of the LBA range
+
+``rsvd2``
+ Reserved
+
+``slba``
+ Starting LBA
+
+``nlb``
+ Number of Logical Blocks
+
+``guid``
+ Unique Identifier
+
+``rsvd48``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_lbart
+
+ LBA Range Type - Data Structure Entry
+
+**Constants**
+
+``NVME_LBART_TYPE_GP``
+ General Purpose
+
+``NVME_LBART_TYPE_FS``
+ Filesystem
+
+``NVME_LBART_TYPE_RAID``
+ RAID
+
+``NVME_LBART_TYPE_CACHE``
+ Cache
+
+``NVME_LBART_TYPE_SWAP``
+ Page / swap file
+
+``NVME_LBART_ATTRIB_TEMP``
+ Temp
+
+``NVME_LBART_ATTRIB_HIDE``
+ Hidden
+
+
+
+
+.. c:struct:: nvme_lba_range_type
+
+ LBA Range Type
+
+**Definition**
+
+::
+
+ struct nvme_lba_range_type {
+ struct nvme_lba_range_type_entry entry[NVME_FEAT_LBA_RANGE_MAX];
+ };
+
+**Members**
+
+``entry``
+ LBA range type entry. See **struct** nvme_lba_range_type_entry
+
+
+
+
+
+.. c:struct:: nvme_plm_config
+
+ Predictable Latency Mode - Deterministic Threshold Configuration Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_plm_config {
+ __le16 ee;
+ __u8 rsvd2[30];
+ __le64 dtwinrt;
+ __le64 dtwinwt;
+ __le64 dtwintt;
+ __u8 rsvd56[456];
+ };
+
+**Members**
+
+``ee``
+ Enable Event
+
+``rsvd2``
+ Reserved
+
+``dtwinrt``
+ DTWIN Reads Threshold
+
+``dtwinwt``
+ DTWIN Writes Threshold
+
+``dtwintt``
+ DTWIN Time Threshold
+
+``rsvd56``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_feat_host_behavior
+
+ Host Behavior Support - Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_feat_host_behavior {
+ __u8 acre;
+ __u8 rsvd1[511];
+ };
+
+**Members**
+
+``acre``
+ Advanced Command Retry Enable
+
+``rsvd1``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_host_behavior_support
+
+ Enable Advanced Command
+
+**Constants**
+
+``NVME_ENABLE_ACRE``
+ Enable Advanced Command Retry Enable
+
+
+
+
+.. c:struct:: nvme_dsm_range
+
+ Dataset Management - Range Definition
+
+**Definition**
+
+::
+
+ struct nvme_dsm_range {
+ __le32 cattr;
+ __le32 nlb;
+ __le64 slba;
+ };
+
+**Members**
+
+``cattr``
+ Context Attributes
+
+``nlb``
+ Length in logical blocks
+
+``slba``
+ Starting LBA
+
+
+
+
+
+.. c:struct:: nvme_copy_range
+
+ Copy - Source Range Entries Descriptor Format
+
+**Definition**
+
+::
+
+ struct nvme_copy_range {
+ __u8 rsvd0[8];
+ __le64 slba;
+ __le16 nlb;
+ __u8 rsvd18[6];
+ __le32 eilbrt;
+ __le16 elbatm;
+ __le16 elbat;
+ };
+
+**Members**
+
+``rsvd0``
+ Reserved
+
+``slba``
+ Starting LBA
+
+``nlb``
+ Number of Logical Blocks
+
+``rsvd18``
+ Reserved
+
+``eilbrt``
+ Expected Initial Logical Block Reference Tag /
+ Expected Logical Block Storage Tag
+
+``elbatm``
+ Expected Logical Block Application Tag Mask
+
+``elbat``
+ Expected Logical Block Application Tag
+
+
+
+
+
+.. c:struct:: nvme_copy_range_f1
+
+ Copy - Source Range Entries Descriptor Format 1h
+
+**Definition**
+
+::
+
+ struct nvme_copy_range_f1 {
+ __u8 rsvd0[8];
+ __le64 slba;
+ __le16 nlb;
+ __u8 rsvd18[8];
+ __u8 elbt[10];
+ __le16 elbatm;
+ __le16 elbat;
+ };
+
+**Members**
+
+``rsvd0``
+ Reserved
+
+``slba``
+ Starting LBA
+
+``nlb``
+ Number of Logical Blocks
+
+``rsvd18``
+ Reserved
+
+``elbt``
+ Expected Initial Logical Block Reference Tag /
+ Expected Logical Block Storage Tag
+
+``elbatm``
+ Expected Logical Block Application Tag Mask
+
+``elbat``
+ Expected Logical Block Application Tag
+
+
+
+
+
+.. c:struct:: nvme_registered_ctrl
+
+ Registered Controller Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_registered_ctrl {
+ __le16 cntlid;
+ __u8 rcsts;
+ __u8 rsvd3[5];
+ __le64 hostid;
+ __le64 rkey;
+ };
+
+**Members**
+
+``cntlid``
+ Controller ID
+
+``rcsts``
+ Reservation Status
+
+``rsvd3``
+ Reserved
+
+``hostid``
+ Host Identifier
+
+``rkey``
+ Reservation Key
+
+
+
+
+
+.. c:struct:: nvme_registered_ctrl_ext
+
+ Registered Controller Extended Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_registered_ctrl_ext {
+ __le16 cntlid;
+ __u8 rcsts;
+ __u8 rsvd3[5];
+ __le64 rkey;
+ __u8 hostid[16];
+ __u8 rsvd32[32];
+ };
+
+**Members**
+
+``cntlid``
+ Controller ID
+
+``rcsts``
+ Reservation Status
+
+``rsvd3``
+ Reserved
+
+``rkey``
+ Reservation Key
+
+``hostid``
+ Host Identifier
+
+``rsvd32``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_resv_status
+
+ Reservation Status Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_resv_status {
+ __le32 gen;
+ __u8 rtype;
+ __u8 regctl[2];
+ __u8 rsvd7[2];
+ __u8 ptpls;
+ __u8 rsvd10[14];
+ union {
+ struct {
+ __u8 rsvd24[40];
+ struct nvme_registered_ctrl_ext regctl_eds[0];
+ };
+ struct nvme_registered_ctrl regctl_ds[0];
+ };
+ };
+
+**Members**
+
+``gen``
+ Generation
+
+``rtype``
+ Reservation Type
+
+``regctl``
+ Number of Registered Controllers
+
+``rsvd7``
+ Reserved
+
+``ptpls``
+ Persist Through Power Loss State
+
+``rsvd10``
+ Reserved
+
+``{unnamed_union}``
+ anonymous
+
+``{unnamed_struct}``
+ anonymous
+
+``rsvd24``
+ Reserved
+
+``regctl_eds``
+ Registered Controller Extended Data Structure
+
+``regctl_ds``
+ Registered Controller Data Structure
+
+
+
+
+
+.. c:struct:: nvme_streams_directive_params
+
+ Streams Directive - Return Parameters Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_streams_directive_params {
+ __le16 msl;
+ __le16 nssa;
+ __le16 nsso;
+ __u8 nssc;
+ __u8 rsvd[9];
+ __le32 sws;
+ __le16 sgs;
+ __le16 nsa;
+ __le16 nso;
+ __u8 rsvd2[6];
+ };
+
+**Members**
+
+``msl``
+ Max Streams Limit
+
+``nssa``
+ NVM Subsystem Streams Available
+
+``nsso``
+ NVM Subsystem Streams Open
+
+``nssc``
+ NVM Subsystem Stream Capability
+
+``rsvd``
+ Reserved
+
+``sws``
+ Stream Write Size
+
+``sgs``
+ Stream Granularity Size
+
+``nsa``
+ Namespace Streams Allocated
+
+``nso``
+ Namespace Streams Open
+
+``rsvd2``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_streams_directive_status
+
+ Streams Directive - Get Status Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_streams_directive_status {
+ __le16 osc;
+ __le16 sid[];
+ };
+
+**Members**
+
+``osc``
+ Open Stream Count
+
+``sid``
+ Stream Identifier
+
+
+
+
+
+.. c:struct:: nvme_id_directives
+
+ Identify Directive - Return Parameters Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_id_directives {
+ __u8 supported[32];
+ __u8 enabled[32];
+ __u8 rsvd64[4032];
+ };
+
+**Members**
+
+``supported``
+ Identify directive is supported
+
+``enabled``
+ Identify directive is Enabled
+
+``rsvd64``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_directive_types
+
+ Directives Supported or Enabled
+
+**Constants**
+
+``NVME_ID_DIR_ID_BIT``
+ Identify directive is supported
+
+``NVME_ID_DIR_SD_BIT``
+ Streams directive is supported
+
+
+
+
+.. c:struct:: nvme_host_mem_buf_attrs
+
+ Host Memory Buffer - Attributes Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_host_mem_buf_attrs {
+ __le32 hsize;
+ __le32 hmdlal;
+ __le32 hmdlau;
+ __le32 hmdlec;
+ __u8 rsvd16[4080];
+ };
+
+**Members**
+
+``hsize``
+ Host Memory Buffer Size
+
+``hmdlal``
+ Host Memory Descriptor List Lower Address
+
+``hmdlau``
+ Host Memory Descriptor List Upper Address
+
+``hmdlec``
+ Host Memory Descriptor List Entry Count
+
+``rsvd16``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_ae_type
+
+ Asynchronous Event Type
+
+**Constants**
+
+``NVME_AER_ERROR``
+ Error event
+
+``NVME_AER_SMART``
+ SMART / Health Status event
+
+``NVME_AER_NOTICE``
+ Notice event
+
+``NVME_AER_CSS``
+ NVM Command Set Specific events
+
+``NVME_AER_VS``
+ Vendor Specific event
+
+
+
+
+.. c:enum:: nvme_ae_info_error
+
+ Asynchronous Event Information - Error Status
+
+**Constants**
+
+``NVME_AER_ERROR_INVALID_DB_REG``
+ Write to Invalid Doorbell Register
+
+``NVME_AER_ERROR_INVALID_DB_VAL``
+ Invalid Doorbell Write Value
+
+``NVME_AER_ERROR_DIAG_FAILURE``
+ Diagnostic Failure
+
+``NVME_AER_ERROR_PERSISTENT_INTERNAL_ERROR``
+ Persistent Internal Error
+
+``NVME_AER_ERROR_TRANSIENT_INTERNAL_ERROR``
+ Transient Internal Error
+
+``NVME_AER_ERROR_FW_IMAGE_LOAD_ERROR``
+ Firmware Image Load Error
+
+
+
+
+.. c:enum:: nvme_ae_info_smart
+
+ Asynchronous Event Information - SMART / Health Status
+
+**Constants**
+
+``NVME_AER_SMART_SUBSYSTEM_RELIABILITY``
+ NVM subsystem Reliability
+
+``NVME_AER_SMART_TEMPERATURE_THRESHOLD``
+ Temperature Threshold
+
+``NVME_AER_SMART_SPARE_THRESHOLD``
+ Spare Below Threshold
+
+
+
+
+.. c:enum:: nvme_ae_info_css_nvm
+
+ Asynchronous Event Information - I/O Command Specific Status
+
+**Constants**
+
+``NVME_AER_CSS_NVM_RESERVATION``
+ Reservation Log Page Available
+
+``NVME_AER_CSS_NVM_SANITIZE_COMPLETED``
+ Sanitize Operation Completed
+
+``NVME_AER_CSS_NVM_UNEXPECTED_SANITIZE_DEALLOC``
+ Sanitize Operation Completed
+ With Unexpected Deallocation
+
+
+
+
+.. c:enum:: nvme_ae_info_notice
+
+ Asynchronous Event Information - Notice
+
+**Constants**
+
+``NVME_AER_NOTICE_NS_CHANGED``
+ Namespace Attribute Changed
+
+``NVME_AER_NOTICE_FW_ACT_STARTING``
+ Firmware Activation Starting
+
+``NVME_AER_NOTICE_TELEMETRY``
+ Telemetry Log Changed
+
+``NVME_AER_NOTICE_ANA``
+ Asymmetric Namespace Access Change
+
+``NVME_AER_NOTICE_PL_EVENT``
+ Predictable Latency Event Aggregate Log Change
+
+``NVME_AER_NOTICE_LBA_STATUS_ALERT``
+ LBA Status Information Alert
+
+``NVME_AER_NOTICE_EG_EVENT``
+ Endurance Group Event Aggregate Log Page Change
+
+``NVME_AER_NOTICE_DISC_CHANGED``
+ Discovery Log Page Change
+
+
+
+
+.. c:enum:: nvme_subsys_type
+
+ Type of the NVM subsystem.
+
+**Constants**
+
+``NVME_NQN_DISC``
+ Discovery type target subsystem. Describes a referral to another
+ Discovery Service composed of Discovery controllers that provide
+ additional discovery records. Multiple Referral entries may
+ be reported for each Discovery Service (if that Discovery Service
+ has multiple NVM subsystem ports or supports multiple protocols).
+
+``NVME_NQN_NVME``
+ NVME type target subsystem. Describes an NVM subsystem whose
+ controllers may have attached namespaces (an NVM subsystem
+ that is not composed of Discovery controllers). Multiple NVM
+ Subsystem entries may be reported for each NVM subsystem if
+ that NVM subsystem has multiple NVM subsystem ports.
+
+``NVME_NQN_CURR``
+ Current Discovery type target subsystem. Describes this Discovery
+ subsystem (the Discovery Service that contains the controller
+ processing the Get Log Page command). Multiple Current Discovery
+ Subsystem entries may be reported for this Discovery subsystem
+ if the current Discovery subsystem has multiple NVM subsystem
+ ports.
+
+
+
+
+.. c:enum:: nvmf_disc_eflags
+
+ Discovery Log Page entry flags.
+
+**Constants**
+
+``NVMF_DISC_EFLAGS_NONE``
+ Indicates that none of the DUPRETINFO or EPCSD
+ features are supported.
+
+``NVMF_DISC_EFLAGS_DUPRETINFO``
+ Duplicate Returned Information (DUPRETINFO):
+ Indicates that using the content of this entry
+ to access this Discovery Service returns the same
+ information that is returned by using the content
+ of other entries in this log page that also have
+ this flag set.
+
+``NVMF_DISC_EFLAGS_EPCSD``
+ Explicit Persistent Connection Support for Discovery (EPCSD):
+ Indicates that Explicit Persistent Connections are
+ supported for the Discovery controller.
+
+``NVMF_DISC_EFLAGS_NCC``
+ No CDC Connectivity (NCC): If set to
+ '1', then no DDC that describes this entry
+ is currently connected to the CDC. If
+ cleared to '0', then at least one DDC that
+ describes this entry is currently
+ connected to the CDC. If the Discovery
+ controller returning this log page is not
+ a CDC, then this bit shall be cleared to
+ '0' and should be ignored by the host.
+
+
+
+
+.. c:union:: nvmf_tsas
+
+ Transport Specific Address Subtype
+
+**Definition**
+
+::
+
+ union nvmf_tsas {
+ char common[NVMF_TSAS_SIZE];
+ struct rdma {
+ __u8 qptype;
+ __u8 prtype;
+ __u8 cms;
+ __u8 rsvd3[5];
+ __u16 pkey;
+ __u8 rsvd10[246];
+ } rdma;
+ struct tcp {
+ __u8 sectype;
+ } tcp;
+ };
+
+**Members**
+
+``common``
+ Common transport specific attributes
+
+``rdma``
+ RDMA transport specific attribute settings
+
+``tcp``
+ TCP transport specific attribute settings
+
+
+
+
+
+.. c:struct:: nvmf_disc_log_entry
+
+ Discovery Log Page entry
+
+**Definition**
+
+::
+
+ struct nvmf_disc_log_entry {
+ __u8 trtype;
+ __u8 adrfam;
+ __u8 subtype;
+ __u8 treq;
+ __le16 portid;
+ __le16 cntlid;
+ __le16 asqsz;
+ __le16 eflags;
+ __u8 rsvd12[20];
+ char trsvcid[NVMF_TRSVCID_SIZE];
+ __u8 rsvd64[192];
+ char subnqn[NVME_NQN_LENGTH];
+ char traddr[NVMF_TRADDR_SIZE];
+ union nvmf_tsas tsas;
+ };
+
+**Members**
+
+``trtype``
+ Transport Type (TRTYPE): Specifies the NVMe Transport type.
+ See :c:type:`enum nvmf_trtype <nvmf_trtype>`.
+
+``adrfam``
+ Address Family (ADRFAM): Specifies the address family.
+ See :c:type:`enum nvmf_addr_family <nvmf_addr_family>`.
+
+``subtype``
+ Subsystem Type (SUBTYPE): Specifies the type of the NVM subsystem
+ that is indicated in this entry. See :c:type:`enum nvme_subsys_type <nvme_subsys_type>`.
+
+``treq``
+ Transport Requirements (TREQ): Indicates requirements for the NVMe
+ Transport. See :c:type:`enum nvmf_treq <nvmf_treq>`.
+
+``portid``
+ Port ID (PORTID): Specifies a particular NVM subsystem port.
+ Different NVMe Transports or address families may utilize the same
+ Port ID value (e.g. a Port ID may support both iWARP and RoCE).
+
+``cntlid``
+ Controller ID (CNTLID): Specifies the controller ID. If the NVM
+ subsystem uses a dynamic controller model, then this field shall
+ be set to FFFFh. If the NVM subsystem uses a static controller model,
+ then this field may be set to a specific controller ID (values 0h
+ to FFEFh are valid). If the NVM subsystem uses a static controller
+ model and the value indicated is FFFEh, then the host should remember
+ the Controller ID returned as part of the Fabrics Connect command
+ in order to re-establish an association in the future with the same
+ controller.
+
+``asqsz``
+ Admin Max SQ Size (ASQSZ): Specifies the maximum size of an Admin
+ Submission Queue. This applies to all controllers in the NVM
+ subsystem. The value shall be a minimum of 32 entries.
+
+``eflags``
+ Entry Flags (EFLAGS): Indicates additional information related to
+ the current entry. See :c:type:`enum nvmf_disc_eflags <nvmf_disc_eflags>`.
+
+``rsvd12``
+ Reserved
+
+``trsvcid``
+ Transport Service Identifier (TRSVCID): Specifies the NVMe Transport
+ service identifier as an ASCII string. The NVMe Transport service
+ identifier is specified by the associated NVMe Transport binding
+ specification.
+
+``rsvd64``
+ Reserved
+
+``subnqn``
+ NVM Subsystem Qualified Name (SUBNQN): NVMe Qualified Name (NQN)
+ that uniquely identifies the NVM subsystem. For a subsystem, if that
+ Discovery subsystem has a unique NQN (i.e., the NVM Subsystem NVMe
+ Qualified Name (SUBNQN) field in that Discovery subsystem's Identify
+ Controller data structure contains a unique NQN value), then the
+ value returned shall be that unique NQN. If the Discovery subsystem
+ does not have a unique NQN, then the value returned shall be the
+ well-known Discovery Service NQN (nqn.2014-08.org.nvmexpress.discovery).
+
+``traddr``
+ Transport Address (TRADDR): Specifies the address of the NVM subsystem
+ that may be used for a Connect command as an ASCII string. The
+ Address Family field describes the reference for parsing this field.
+
+``tsas``
+ Transport specific attribute settings
+
+
+
+
+
+.. c:enum:: nvmf_trtype
+
+ Transport Type codes for Discovery Log Page entry TRTYPE field
+
+**Constants**
+
+``NVMF_TRTYPE_UNSPECIFIED``
+ Not indicated
+
+``NVMF_TRTYPE_RDMA``
+ RDMA
+
+``NVMF_TRTYPE_FC``
+ Fibre Channel
+
+``NVMF_TRTYPE_TCP``
+ TCP
+
+``NVMF_TRTYPE_LOOP``
+ Intra-host Transport (i.e., loopback), reserved
+ for host usage.
+
+``NVMF_TRTYPE_MAX``
+ Maximum value for :c:type:`enum nvmf_trtype <nvmf_trtype>`
+
+
+
+
+.. c:enum:: nvmf_addr_family
+
+ Address Family codes for Discovery Log Page entry ADRFAM field
+
+**Constants**
+
+``NVMF_ADDR_FAMILY_PCI``
+ PCIe
+
+``NVMF_ADDR_FAMILY_IP4``
+ AF_INET: IPv4 address family.
+
+``NVMF_ADDR_FAMILY_IP6``
+ AF_INET6: IPv6 address family.
+
+``NVMF_ADDR_FAMILY_IB``
+ AF_IB: InfiniBand address family.
+
+``NVMF_ADDR_FAMILY_FC``
+ Fibre Channel address family.
+
+``NVMF_ADDR_FAMILY_LOOP``
+ Intra-host Transport (i.e., loopback), reserved
+ for host usage.
+
+
+
+
+.. c:enum:: nvmf_treq
+
+ Transport Requirements codes for Discovery Log Page entry TREQ field
+
+**Constants**
+
+``NVMF_TREQ_NOT_SPECIFIED``
+ Not specified
+
+``NVMF_TREQ_REQUIRED``
+ Required
+
+``NVMF_TREQ_NOT_REQUIRED``
+ Not Required
+
+``NVMF_TREQ_DISABLE_SQFLOW``
+ SQ flow control disable supported
+
+
+
+
+.. c:enum:: nvmf_rdma_qptype
+
+ RDMA QP Service Type codes for Discovery Log Page entry TSAS RDMA_QPTYPE field
+
+**Constants**
+
+``NVMF_RDMA_QPTYPE_CONNECTED``
+ Reliable Connected
+
+``NVMF_RDMA_QPTYPE_DATAGRAM``
+ Reliable Datagram
+
+
+
+
+.. c:enum:: nvmf_rdma_prtype
+
+ RDMA Provider Type codes for Discovery Log Page entry TSAS RDMA_PRTYPE field
+
+**Constants**
+
+``NVMF_RDMA_PRTYPE_NOT_SPECIFIED``
+ No Provider Specified
+
+``NVMF_RDMA_PRTYPE_IB``
+ InfiniBand
+
+``NVMF_RDMA_PRTYPE_ROCE``
+ InfiniBand RoCE
+
+``NVMF_RDMA_PRTYPE_ROCEV2``
+ InfiniBand RoCEV2
+
+``NVMF_RDMA_PRTYPE_IWARP``
+ iWARP
+
+
+
+
+.. c:enum:: nvmf_rdma_cms
+
+ RDMA Connection Management Service Type codes for Discovery Log Page entry TSAS RDMA_CMS field
+
+**Constants**
+
+``NVMF_RDMA_CMS_RDMA_CM``
+ Sockets based endpoint addressing
+
+
+
+
+.. c:enum:: nvmf_tcp_sectype
+
+ Transport Specific Address Subtype Definition for NVMe/TCP Transport
+
+**Constants**
+
+``NVMF_TCP_SECTYPE_NONE``
+ No Security
+
+``NVMF_TCP_SECTYPE_TLS``
+ Transport Layer Security version 1.2
+
+``NVMF_TCP_SECTYPE_TLS13``
+ Transport Layer Security version 1.3 or a subsequent
+ version. The TLS protocol negotiates the version and
+ cipher suite for each TCP connection.
+
+
+
+
+.. c:struct:: nvmf_discovery_log
+
+ Discovery Log Page (Log Identifier 70h)
+
+**Definition**
+
+::
+
+ struct nvmf_discovery_log {
+ __le64 genctr;
+ __le64 numrec;
+ __le16 recfmt;
+ __u8 rsvd14[1006];
+ struct nvmf_disc_log_entry entries[];
+ };
+
+**Members**
+
+``genctr``
+ Generation Counter (GENCTR): Indicates the version of the discovery
+ information, starting at a value of 0h. For each change in the
+ Discovery Log Page, this counter is incremented by one. If the value
+ of this field is FFFFFFFF_FFFFFFFFh, then the field shall be cleared
+ to 0h when incremented (i.e., rolls over to 0h).
+
+``numrec``
+ Number of Records (NUMREC): Indicates the number of records
+ contained in the log.
+
+``recfmt``
+ Record Format (RECFMT): Specifies the format of the Discovery Log
+ Page. If a new format is defined, this value is incremented by one.
+ The format of the record specified in this definition shall be 0h.
+
+``rsvd14``
+ Reserved
+
+``entries``
+ Discovery Log Page Entries - see :c:type:`struct nvmf_disc_log_entry <nvmf_disc_log_entry>`.
+
+
+
+
+
+.. c:enum:: nvmf_dim_tas
+
+ Discovery Information Management Task
+
+**Constants**
+
+``NVMF_DIM_TAS_REGISTER``
+ Register
+
+``NVMF_DIM_TAS_DEREGISTER``
+ Deregister
+
+``NVMF_DIM_TAS_UPDATE``
+ Update
+
+
+
+
+.. c:enum:: nvmf_dim_entfmt
+
+ Discovery Information Management Entry Format
+
+**Constants**
+
+``NVMF_DIM_ENTFMT_BASIC``
+ Basic discovery information entry
+
+``NVMF_DIM_ENTFMT_EXTENDED``
+ Extended discovery information entry
+
+
+
+
+.. c:enum:: nvmf_dim_etype
+
+ Discovery Information Management Entity Type
+
+**Constants**
+
+``NVMF_DIM_ETYPE_HOST``
+ Host
+
+``NVMF_DIM_ETYPE_DDC``
+ Direct Discovery controller
+
+``NVMF_DIM_ETYPE_CDC``
+ Centralized Discovery controller
+
+
+
+
+.. c:enum:: nvmf_exattype
+
+ Extended Attribute Type
+
+**Constants**
+
+``NVMF_EXATTYPE_HOSTID``
+ Host Identifier
+
+``NVMF_EXATTYPE_SYMNAME``
+ Symblic Name
+
+
+
+
+.. c:struct:: nvmf_ext_attr
+
+ Extended Attribute (EXAT)
+
+**Definition**
+
+::
+
+ struct nvmf_ext_attr {
+ __le16 exattype;
+ __le16 exatlen;
+ __u8 exatval[];
+ };
+
+**Members**
+
+``exattype``
+ Extended Attribute Type (EXATTYPE) - see **enum** nvmf_exattype
+
+``exatlen``
+ Extended Attribute Length (EXATLEN)
+
+``exatval``
+ Extended Attribute Value (EXATVAL) - size allocated for array
+ must be a multiple of 4 bytes
+
+
+
+
+
+.. c:struct:: nvmf_ext_die
+
+ Extended Discovery Information Entry (DIE)
+
+**Definition**
+
+::
+
+ struct nvmf_ext_die {
+ __u8 trtype;
+ __u8 adrfam;
+ __u8 subtype;
+ __u8 treq;
+ __le16 portid;
+ __le16 cntlid;
+ __le16 asqsz;
+ __u8 rsvd10[22];
+ char trsvcid[NVMF_TRSVCID_SIZE];
+ __u8 resv64[192];
+ char nqn[NVME_NQN_LENGTH];
+ char traddr[NVMF_TRADDR_SIZE];
+ union nvmf_tsas tsas;
+ __le32 tel;
+ __le16 numexat;
+ __u8 resv1030[2];
+ struct nvmf_ext_attr exat[];
+ };
+
+**Members**
+
+``trtype``
+ Transport Type (:c:type:`enum nvmf_trtype <nvmf_trtype>`)
+
+``adrfam``
+ Address Family (:c:type:`enum nvmf_addr_family <nvmf_addr_family>`)
+
+``subtype``
+ Subsystem Type (:c:type:`enum nvme_subsys_type <nvme_subsys_type>`)
+
+``treq``
+ Transport Requirements (:c:type:`enum nvmf_treq <nvmf_treq>`)
+
+``portid``
+ Port ID
+
+``cntlid``
+ Controller ID
+
+``asqsz``
+ Admin Max SQ Size
+
+``rsvd10``
+ Reserved
+
+``trsvcid``
+ Transport Service Identifier
+
+``resv64``
+ Reserved
+
+``nqn``
+ NVM Qualified Name
+
+``traddr``
+ Transport Address
+
+``tsas``
+ Transport Specific Address Subtype (:c:type:`union nvmf_tsas <nvmf_tsas>`)
+
+``tel``
+ Total Entry Length
+
+``numexat``
+ Number of Extended Attributes
+
+``resv1030``
+ Reserved
+
+``exat``
+ Extended Attributes 0 (:c:type:`struct nvmf_ext_attr <nvmf_ext_attr>`)
+
+
+
+
+
+.. c:union:: nvmf_die
+
+ Discovery Information Entry (DIE)
+
+**Definition**
+
+::
+
+ union nvmf_die {
+ struct nvmf_disc_log_entry basic[0];
+ struct nvmf_ext_die extended;
+ };
+
+**Members**
+
+``basic``
+ Basic format (:c:type:`struct nvmf_disc_log_entry <nvmf_disc_log_entry>`)
+
+``extended``
+ Extended format (:c:type:`struct nvmf_ext_die <nvmf_ext_die>`)
+
+
+**Description**
+
+Depending on the ENTFMT specified in the DIM, DIEs can be entered
+with the Basic or Extended formats. For Basic format, each entry
+has a fixed length. Therefore, the "basic" field defined below can
+be accessed as a C array. For the Extended format, however, each
+entry is of variable length (TEL). Therefore, the "extended" field
+defined below cannot be accessed as a C array. Instead, the
+"extended" field is akin to a linked-list, where one can "walk"
+through the list. To move to the next entry, one simply adds the
+current entry's length (TEL) to the "walk" pointer. The number of
+entries in the list is specified by NUMENT. Although extended
+entries are of a variable lengths (TEL), TEL is always a multiple of
+4 bytes.
+
+
+
+
+.. c:struct:: nvmf_dim_data
+
+ Discovery Information Management (DIM) - Data
+
+**Definition**
+
+::
+
+ struct nvmf_dim_data {
+ __le32 tdl;
+ __u8 rsvd4[4];
+ __le64 nument;
+ __le16 entfmt;
+ __le16 etype;
+ __u8 portlcl;
+ __u8 rsvd21;
+ __le16 ektype;
+ char eid[NVME_NQN_LENGTH];
+ char ename[NVMF_ENAME_LEN];
+ char ever[NVMF_EVER_LEN];
+ __u8 rsvd600[424];
+ union nvmf_die die[];
+ };
+
+**Members**
+
+``tdl``
+ Total Data Length
+
+``rsvd4``
+ Reserved
+
+``nument``
+ Number of entries
+
+``entfmt``
+ Entry Format (:c:type:`enum nvmf_dim_entfmt <nvmf_dim_entfmt>`)
+
+``etype``
+ Entity Type (:c:type:`enum nvmf_dim_etype <nvmf_dim_etype>`)
+
+``portlcl``
+ Port Local
+
+``rsvd21``
+ Reserved
+
+``ektype``
+ Entry Key Type
+
+``eid``
+ Entity Identifier (e.g. Host NQN)
+
+``ename``
+ Entity Name (e.g. hostname)
+
+``ever``
+ Entity Version (e.g. OS Name/Version)
+
+``rsvd600``
+ Reserved
+
+``die``
+ Discovery Information Entry (see **nument** above)
+
+
+
+
+
+.. c:struct:: nvmf_connect_data
+
+ Data payload for the 'connect' command
+
+**Definition**
+
+::
+
+ struct nvmf_connect_data {
+ __u8 hostid[16];
+ __le16 cntlid;
+ char rsvd4[238];
+ char subsysnqn[NVME_NQN_LENGTH];
+ char hostnqn[NVME_NQN_LENGTH];
+ char rsvd5[256];
+ };
+
+**Members**
+
+``hostid``
+ Host ID of the connecting host
+
+``cntlid``
+ Requested controller ID
+
+``rsvd4``
+ Reserved
+
+``subsysnqn``
+ Subsystem NQN to connect to
+
+``hostnqn``
+ Host NQN of the connecting host
+
+``rsvd5``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_read_nvm_ss_info
+
+ NVM Subsystem Information Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_read_nvm_ss_info {
+ __u8 nump;
+ __u8 mjr;
+ __u8 mnr;
+ __u8 rsvd3[29];
+ };
+
+**Members**
+
+``nump``
+ Number of Ports
+
+``mjr``
+ NVMe-MI Major Version Number
+
+``mnr``
+ NVMe-MI Minor Version Number
+
+``rsvd3``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_port_pcie
+
+ PCIe Port Specific Data
+
+**Definition**
+
+::
+
+ struct nvme_mi_port_pcie {
+ __u8 mps;
+ __u8 sls;
+ __u8 cls;
+ __u8 mlw;
+ __u8 nlw;
+ __u8 pn;
+ __u8 rsvd14[18];
+ };
+
+**Members**
+
+``mps``
+ PCIe Maximum Payload Size
+
+``sls``
+ PCIe Supported Link Speeds Vector
+
+``cls``
+ PCIe Current Link Speed
+
+``mlw``
+ PCIe Maximum Link Width
+
+``nlw``
+ PCIe Negotiated Link Width
+
+``pn``
+ PCIe Port Number
+
+``rsvd14``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_port_smb
+
+ SMBus Port Specific Data
+
+**Definition**
+
+::
+
+ struct nvme_mi_port_smb {
+ __u8 vpd_addr;
+ __u8 mvpd_freq;
+ __u8 mme_addr;
+ __u8 mme_freq;
+ __u8 nvmebm;
+ __u8 rsvd13[19];
+ };
+
+**Members**
+
+``vpd_addr``
+ Current VPD SMBus/I2C Address
+
+``mvpd_freq``
+ Maximum VPD Access SMBus/I2C Frequency
+
+``mme_addr``
+ Current Management Endpoint SMBus/I2C Address
+
+``mme_freq``
+ Maximum Management Endpoint SMBus/I2C Frequency
+
+``nvmebm``
+ NVMe Basic Management
+
+``rsvd13``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_read_port_info
+
+ Port Information Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_read_port_info {
+ __u8 portt;
+ __u8 rsvd1;
+ __le16 mmctptus;
+ __le32 meb;
+ union {
+ struct nvme_mi_port_pcie pcie;
+ struct nvme_mi_port_smb smb;
+ };
+ };
+
+**Members**
+
+``portt``
+ Port Type
+
+``rsvd1``
+ Reserved
+
+``mmctptus``
+ Maximum MCTP Transmission Unit Size
+
+``meb``
+ Management Endpoint Buffer Size
+
+``{unnamed_union}``
+ anonymous
+
+``pcie``
+ PCIe Port Specific Data
+
+``smb``
+ SMBus Port Specific Data
+
+
+
+
+
+.. c:struct:: nvme_mi_read_ctrl_info
+
+ Controller Information Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_read_ctrl_info {
+ __u8 portid;
+ __u8 rsvd1[4];
+ __u8 prii;
+ __le16 pri;
+ __le16 vid;
+ __le16 did;
+ __le16 ssvid;
+ __le16 ssid;
+ __u8 rsvd16[16];
+ };
+
+**Members**
+
+``portid``
+ Port Identifier
+
+``rsvd1``
+ Reserved
+
+``prii``
+ PCIe Routing ID Information
+
+``pri``
+ PCIe Routing ID
+
+``vid``
+ PCI Vendor ID
+
+``did``
+ PCI Device ID
+
+``ssvid``
+ PCI Subsystem Vendor ID
+
+``ssid``
+ PCI Subsystem Device ID
+
+``rsvd16``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_osc
+
+ Optionally Supported Command Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_osc {
+ __u8 type;
+ __u8 opc;
+ };
+
+**Members**
+
+``type``
+ Command Type
+
+``opc``
+ Opcode
+
+
+
+
+
+.. c:struct:: nvme_mi_read_sc_list
+
+ Management Endpoint Buffer Supported Command List Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_read_sc_list {
+ __le16 numcmd;
+ struct nvme_mi_osc cmds[];
+ };
+
+**Members**
+
+``numcmd``
+ Number of Commands
+
+``cmds``
+ MEB supported Command Data Structure.
+ See **struct** nvme_mi_osc
+
+
+
+
+
+.. c:struct:: nvme_mi_nvm_ss_health_status
+
+ Subsystem Management Data Structure
+
+**Definition**
+
+::
+
+ struct nvme_mi_nvm_ss_health_status {
+ __u8 nss;
+ __u8 sw;
+ __u8 ctemp;
+ __u8 pdlu;
+ __le16 ccs;
+ __u8 rsvd8[2];
+ };
+
+**Members**
+
+``nss``
+ NVM Subsystem Status
+
+``sw``
+ Smart Warnings
+
+``ctemp``
+ Composite Temperature
+
+``pdlu``
+ Percentage Drive Life Used
+
+``ccs``
+ Composite Controller Status
+
+``rsvd8``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_mi_ccs
+
+ Get State Control Primitive Success Response Fields - Control Primitive Specific Response
+
+**Constants**
+
+``NVME_MI_CCS_RDY``
+ Ready
+
+``NVME_MI_CCS_CFS``
+ Controller Fatal Status
+
+``NVME_MI_CCS_SHST``
+ Shutdown Status
+
+``NVME_MI_CCS_NSSRO``
+ NVM Subsystem Reset Occurred
+
+``NVME_MI_CCS_CECO``
+ Controller Enable Change Occurred
+
+``NVME_MI_CCS_NAC``
+ Namespace Attribute Changed
+
+``NVME_MI_CCS_FA``
+ Firmware Activated
+
+``NVME_MI_CCS_CSTS``
+ Controller Status Change
+
+``NVME_MI_CCS_CTEMP``
+ Composite Temperature Change
+
+``NVME_MI_CCS_PDLU``
+ Percentage Used
+
+``NVME_MI_CCS_SPARE``
+ Available Spare
+
+``NVME_MI_CCS_CCWARN``
+ Critical Warning
+
+
+
+
+.. c:struct:: nvme_mi_ctrl_health_status
+
+ Controller Health Data Structure (CHDS)
+
+**Definition**
+
+::
+
+ struct nvme_mi_ctrl_health_status {
+ __le16 ctlid;
+ __le16 csts;
+ __le16 ctemp;
+ __u8 pdlu;
+ __u8 spare;
+ __u8 cwarn;
+ __u8 rsvd9[7];
+ };
+
+**Members**
+
+``ctlid``
+ Controller Identifier
+
+``csts``
+ Controller Status
+
+``ctemp``
+ Composite Temperature
+
+``pdlu``
+ Percentage Used
+
+``spare``
+ Available Spare
+
+``cwarn``
+ Critical Warning
+
+``rsvd9``
+ Reserved
+
+
+
+
+
+.. c:enum:: nvme_mi_csts
+
+ Controller Health Data Structure (CHDS) - Controller Status (CSTS)
+
+**Constants**
+
+``NVME_MI_CSTS_RDY``
+ Ready
+
+``NVME_MI_CSTS_CFS``
+ Controller Fatal Status
+
+``NVME_MI_CSTS_SHST``
+ Shutdown Status
+
+``NVME_MI_CSTS_NSSRO``
+ NVM Subsystem Reset Occurred
+
+``NVME_MI_CSTS_CECO``
+ Controller Enable Change Occurred
+
+``NVME_MI_CSTS_NAC``
+ Namespace Attribute Changed
+
+``NVME_MI_CSTS_FA``
+ Firmware Activated
+
+
+
+
+.. c:enum:: nvme_mi_cwarn
+
+ Controller Health Data Structure (CHDS) - Critical Warning (CWARN)
+
+**Constants**
+
+``NVME_MI_CWARN_ST``
+ Spare Threshold
+
+``NVME_MI_CWARN_TAUT``
+ Temperature Above or Under Threshold
+
+``NVME_MI_CWARN_RD``
+ Reliability Degraded
+
+``NVME_MI_CWARN_RO``
+ Read Only
+
+``NVME_MI_CWARN_VMBF``
+ Volatile Memory Backup Failed
+
+
+
+
+.. c:struct:: nvme_mi_vpd_mra
+
+ NVMe MultiRecord Area
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_mra {
+ __u8 nmravn;
+ __u8 ff;
+ __u8 rsvd7[6];
+ __u8 i18vpwr;
+ __u8 m18vpwr;
+ __u8 i33vpwr;
+ __u8 m33vpwr;
+ __u8 rsvd17;
+ __u8 m33vapsr;
+ __u8 i5vapsr;
+ __u8 m5vapsr;
+ __u8 i12vapsr;
+ __u8 m12vapsr;
+ __u8 mtl;
+ __u8 tnvmcap[16];
+ __u8 rsvd37[27];
+ };
+
+**Members**
+
+``nmravn``
+ NVMe MultiRecord Area Version Number
+
+``ff``
+ Form Factor
+
+``rsvd7``
+ Reserved
+
+``i18vpwr``
+ Initial 1.8 V Power Supply Requirements
+
+``m18vpwr``
+ Maximum 1.8 V Power Supply Requirements
+
+``i33vpwr``
+ Initial 3.3 V Power Supply Requirements
+
+``m33vpwr``
+ Maximum 3.3 V Power Supply Requirements
+
+``rsvd17``
+ Reserved
+
+``m33vapsr``
+ Maximum 3.3 Vi aux Power Supply Requirements
+
+``i5vapsr``
+ Initial 5 V Power Supply Requirements
+
+``m5vapsr``
+ Maximum 5 V Power Supply Requirements
+
+``i12vapsr``
+ Initial 12 V Power Supply Requirements
+
+``m12vapsr``
+ Maximum 12 V Power Supply Requirements
+
+``mtl``
+ Maximum Thermal Load
+
+``tnvmcap``
+ Total NVM Capacity
+
+``rsvd37``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_vpd_ppmra
+
+ NVMe PCIe Port MultiRecord Area
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_ppmra {
+ __u8 nppmravn;
+ __u8 pn;
+ __u8 ppi;
+ __u8 ls;
+ __u8 mlw;
+ __u8 mctp;
+ __u8 refccap;
+ __u8 pi;
+ __u8 rsvd13[3];
+ };
+
+**Members**
+
+``nppmravn``
+ NVMe PCIe Port MultiRecord Area Version Number
+
+``pn``
+ PCIe Port Number
+
+``ppi``
+ Port Information
+
+``ls``
+ PCIe Link Speed
+
+``mlw``
+ PCIe Maximum Link Width
+
+``mctp``
+ MCTP Support
+
+``refccap``
+ Ref Clk Capability
+
+``pi``
+ Port Identifier
+
+``rsvd13``
+ Reserved
+
+
+
+
+
+.. c:struct:: nvme_mi_vpd_telem
+
+ Vital Product Data Element Descriptor
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_telem {
+ __u8 type;
+ __u8 rev;
+ __u8 len;
+ __u8 data[0];
+ };
+
+**Members**
+
+``type``
+ Type of the Element Descriptor
+
+``rev``
+ Revision of the Element Descriptor
+
+``len``
+ Number of bytes in the Element Descriptor
+
+``data``
+ Type-specific information associated with
+ the Element Descriptor
+
+
+
+
+
+.. c:enum:: nvme_mi_elem
+
+ Element Descriptor Types
+
+**Constants**
+
+``NVME_MI_ELEM_EED``
+ Extended Element Descriptor
+
+``NVME_MI_ELEM_USCE``
+ Upstream Connector Element Descriptor
+
+``NVME_MI_ELEM_ECED``
+ Expansion Connector Element Descriptor
+
+``NVME_MI_ELEM_LED``
+ Label Element Descriptor
+
+``NVME_MI_ELEM_SMBMED``
+ SMBus/I2C Mux Element Descriptor
+
+``NVME_MI_ELEM_PCIESED``
+ PCIe Switch Element Descriptor
+
+``NVME_MI_ELEM_NVMED``
+ NVM Subsystem Element Descriptor
+
+
+
+
+.. c:struct:: nvme_mi_vpd_tra
+
+ Vital Product Data Topology MultiRecord
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_tra {
+ __u8 vn;
+ __u8 rsvd6;
+ __u8 ec;
+ struct nvme_mi_vpd_telem elems[0];
+ };
+
+**Members**
+
+``vn``
+ Version Number
+
+``rsvd6``
+ Reserved
+
+``ec``
+ Element Count
+
+``elems``
+ Element Descriptor
+
+
+
+
+
+.. c:struct:: nvme_mi_vpd_mr_common
+
+ NVMe MultiRecord Area
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_mr_common {
+ __u8 type;
+ __u8 rf;
+ __u8 rlen;
+ __u8 rchksum;
+ __u8 hchksum;
+ union {
+ struct nvme_mi_vpd_mra nmra;
+ struct nvme_mi_vpd_ppmra ppmra;
+ struct nvme_mi_vpd_tra tmra;
+ };
+ };
+
+**Members**
+
+``type``
+ NVMe Record Type ID
+
+``rf``
+ Record Format
+
+``rlen``
+ Record Length
+
+``rchksum``
+ Record Checksum
+
+``hchksum``
+ Header Checksum
+
+``{unnamed_union}``
+ anonymous
+
+``nmra``
+ NVMe MultiRecord Area
+
+``ppmra``
+ NVMe PCIe Port MultiRecord Area
+
+``tmra``
+ Topology MultiRecord Area
+
+
+
+
+
+.. c:struct:: nvme_mi_vpd_hdr
+
+ Vital Product Data Common Header
+
+**Definition**
+
+::
+
+ struct nvme_mi_vpd_hdr {
+ __u8 ipmiver;
+ __u8 iuaoff;
+ __u8 ciaoff;
+ __u8 biaoff;
+ __u8 piaoff;
+ __u8 mrioff;
+ __u8 rsvd6;
+ __u8 chchk;
+ __u8 vpd[];
+ };
+
+**Members**
+
+``ipmiver``
+ IPMI Format Version Number
+
+``iuaoff``
+ Internal Use Area Starting Offset
+
+``ciaoff``
+ Chassis Info Area Starting Offset
+
+``biaoff``
+ Board Info Area Starting Offset
+
+``piaoff``
+ Product Info Area Starting Offset
+
+``mrioff``
+ MultiRecord Info Area Starting Offset
+
+``rsvd6``
+ Reserved
+
+``chchk``
+ Common Header Checksum
+
+``vpd``
+ Vital Product Data
+
+
+
+
+
+.. c:enum:: nvme_status_field
+
+ Defines all parts of the nvme status field: status code, status code type, and additional flags.
+
+**Constants**
+
+``NVME_SCT_GENERIC``
+ Generic errors applicable to multiple opcodes
+
+``NVME_SCT_CMD_SPECIFIC``
+ Errors associated to a specific opcode
+
+``NVME_SCT_MEDIA``
+ Errors associated with media and data integrity
+
+``NVME_SCT_PATH``
+ Errors associated with the paths connection
+
+``NVME_SCT_VS``
+ Vendor specific errors
+
+``NVME_SCT_MASK``
+ Mask to get the value of the Status Code Type
+
+``NVME_SCT_SHIFT``
+ Shift value to get the value of the Status
+ Code Type
+
+``NVME_SC_MASK``
+ Mask to get the value of the status code.
+
+``NVME_SC_SHIFT``
+ Shift value to get the value of the status
+ code.
+
+``NVME_SC_SUCCESS``
+ Successful Completion: The command
+ completed without error.
+
+``NVME_SC_INVALID_OPCODE``
+ Invalid Command Opcode: A reserved coded
+ value or an unsupported value in the
+ command opcode field.
+
+``NVME_SC_INVALID_FIELD``
+ Invalid Field in Command: A reserved
+ coded value or an unsupported value in a
+ defined field.
+
+``NVME_SC_CMDID_CONFLICT``
+ Command ID Conflict: The command
+ identifier is already in use.
+
+``NVME_SC_DATA_XFER_ERROR``
+ Data Transfer Error: Transferring the
+ data or metadata associated with a
+ command experienced an error.
+
+``NVME_SC_POWER_LOSS``
+ Commands Aborted due to Power Loss
+ Notification: Indicates that the command
+ was aborted due to a power loss
+ notification.
+
+``NVME_SC_INTERNAL``
+ Internal Error: The command was not
+ completed successfully due to an internal error.
+
+``NVME_SC_ABORT_REQ``
+ Command Abort Requested: The command was
+ aborted due to an Abort command being
+ received that specified the Submission
+ Queue Identifier and Command Identifier
+ of this command.
+
+``NVME_SC_ABORT_QUEUE``
+ Command Aborted due to SQ Deletion: The
+ command was aborted due to a Delete I/O
+ Submission Queue request received for the
+ Submission Queue to which the command was
+ submitted.
+
+``NVME_SC_FUSED_FAIL``
+ Command Aborted due to Failed Fused Command:
+ The command was aborted due to the other
+ command in a fused operation failing.
+
+``NVME_SC_FUSED_MISSING``
+ Aborted due to Missing Fused Command: The
+ fused command was aborted due to the
+ adjacent submission queue entry not
+ containing a fused command that is the
+ other command.
+
+``NVME_SC_INVALID_NS``
+ Invalid Namespace or Format: The
+ namespace or the format of that namespace
+ is invalid.
+
+``NVME_SC_CMD_SEQ_ERROR``
+ Command Sequence Error: The command was
+ aborted due to a protocol violation in a
+ multi-command sequence.
+
+``NVME_SC_SGL_INVALID_LAST``
+ Invalid SGL Segment Descriptor: The
+ command includes an invalid SGL Last
+ Segment or SGL Segment descriptor.
+
+``NVME_SC_SGL_INVALID_COUNT``
+ Invalid Number of SGL Descriptors: There
+ is an SGL Last Segment descriptor or an
+ SGL Segment descriptor in a location
+ other than the last descriptor of a
+ segment based on the length indicated.
+
+``NVME_SC_SGL_INVALID_DATA``
+ Data SGL Length Invalid: This may occur
+ if the length of a Data SGL is too short.
+ This may occur if the length of a Data
+ SGL is too long and the controller does
+ not support SGL transfers longer than the
+ amount of data to be transferred as
+ indicated in the SGL Support field of the
+ Identify Controller data structure.
+
+``NVME_SC_SGL_INVALID_METADATA``
+ Metadata SGL Length Invalid: This may
+ occur if the length of a Metadata SGL is
+ too short. This may occur if the length
+ of a Metadata SGL is too long and the
+ controller does not support SGL transfers
+ longer than the amount of data to be
+ transferred as indicated in the SGL
+ Support field of the Identify Controller
+ data structure.
+
+``NVME_SC_SGL_INVALID_TYPE``
+ SGL Descriptor Type Invalid: The type of
+ an SGL Descriptor is a type that is not
+ supported by the controller.
+
+``NVME_SC_CMB_INVALID_USE``
+ Invalid Use of Controller Memory Buffer:
+ The attempted use of the Controller
+ Memory Buffer is not supported by the
+ controller.
+
+``NVME_SC_PRP_INVALID_OFFSET``
+ PRP Offset Invalid: The Offset field for
+ a PRP entry is invalid.
+
+``NVME_SC_AWU_EXCEEDED``
+ Atomic Write Unit Exceeded: The length
+ specified exceeds the atomic write unit size.
+
+``NVME_SC_OP_DENIED``
+ Operation Denied: The command was denied
+ due to lack of access rights. Refer to
+ the appropriate security specification.
+
+``NVME_SC_SGL_INVALID_OFFSET``
+ SGL Offset Invalid: The offset specified
+ in a descriptor is invalid. This may
+ occur when using capsules for data
+ transfers in NVMe over Fabrics
+ implementations and an invalid offset in
+ the capsule is specified.
+
+``NVME_SC_HOSTID_FORMAT``
+ Host Identifier Inconsistent Format: The
+ NVM subsystem detected the simultaneous
+ use of 64- bit and 128-bit Host
+ Identifier values on different
+ controllers.
+
+``NVME_SC_KAT_EXPIRED``
+ Keep Alive Timer Expired: The Keep Alive
+ Timer expired.
+
+``NVME_SC_KAT_INVALID``
+ Keep Alive Timeout Invalid: The Keep
+ Alive Timeout value specified is invalid.
+
+``NVME_SC_CMD_ABORTED_PREMEPT``
+ Command Aborted due to Preempt and Abort:
+ The command was aborted due to a
+ Reservation Acquire command.
+
+``NVME_SC_SANITIZE_FAILED``
+ Sanitize Failed: The most recent sanitize
+ operation failed and no recovery action
+ has been successfully completed.
+
+``NVME_SC_SANITIZE_IN_PROGRESS``
+ Sanitize In Progress: The requested
+ function (e.g., command) is prohibited
+ while a sanitize operation is in
+ progress.
+
+``NVME_SC_SGL_INVALID_GRANULARITY``
+ SGL Data Block Granularity Invalid: The
+ Address alignment or Length granularity
+ for an SGL Data Block descriptor is
+ invalid.
+
+``NVME_SC_CMD_IN_CMBQ_NOT_SUPP``
+ Command Not Supported for Queue in CMB:
+ The implementation does not support
+ submission of the command to a Submission
+ Queue in the Controller Memory Buffer or
+ command completion to a Completion Queue
+ in the Controller Memory Buffer.
+
+``NVME_SC_NS_WRITE_PROTECTED``
+ Namespace is Write Protected: The command
+ is prohibited while the namespace is
+ write protected as a result of a change
+ in the namespace write protection state
+ as defined by the Namespace Write
+ Protection State Machine.
+
+``NVME_SC_CMD_INTERRUPTED``
+ Command Interrupted: Command processing
+ was interrupted and the controller is
+ unable to successfully complete the
+ command. The host should retry the
+ command.
+
+``NVME_SC_TRAN_TPORT_ERROR``
+ Transient Transport Error: A transient
+ transport error was detected. If the
+ command is retried on the same
+ controller, the command is likely to
+ succeed. A command that fails with a
+ transient transport error four or more
+ times should be treated as a persistent
+ transport error that is not likely to
+ succeed if retried on the same
+ controller.
+
+``NVME_SC_PROHIBITED_BY_CMD_AND_FEAT``
+ Command Prohibited by Command and Feature
+ Lockdown: The command was aborted due to
+ command execution being prohibited by
+ the Command and Feature Lockdown.
+
+``NVME_SC_ADMIN_CMD_MEDIA_NOT_READY``
+ Admin Command Media Not Ready: The Admin
+ command requires access to media and
+ the media is not ready.
+
+``NVME_SC_LBA_RANGE``
+ LBA Out of Range: The command references
+ an LBA that exceeds the size of the namespace.
+
+``NVME_SC_CAP_EXCEEDED``
+ Capacity Exceeded: Execution of the
+ command has caused the capacity of the
+ namespace to be exceeded.
+
+``NVME_SC_NS_NOT_READY``
+ Namespace Not Ready: The namespace is not
+ ready to be accessed as a result of a
+ condition other than a condition that is
+ reported as an Asymmetric Namespace
+ Access condition.
+
+``NVME_SC_RESERVATION_CONFLICT``
+ Reservation Conflict: The command was
+ aborted due to a conflict with a
+ reservation held on the accessed
+ namespace.
+
+``NVME_SC_FORMAT_IN_PROGRESS``
+ Format In Progress: A Format NVM command
+ is in progress on the namespace.
+
+``NVME_SC_CQ_INVALID``
+ Completion Queue Invalid: The Completion
+ Queue identifier specified in the command
+ does not exist.
+
+``NVME_SC_QID_INVALID``
+ Invalid Queue Identifier: The creation of
+ the I/O Completion Queue failed due to an
+ invalid queue identifier specified as
+ part of the command. An invalid queue
+ identifier is one that is currently in
+ use or one that is outside the range
+ supported by the controller.
+
+``NVME_SC_QUEUE_SIZE``
+ Invalid Queue Size: The host attempted to
+ create an I/O Completion Queue with an
+ invalid number of entries.
+
+``NVME_SC_ABORT_LIMIT``
+ Abort Command Limit Exceeded: The number
+ of concurrently outstanding Abort commands
+ has exceeded the limit indicated in the
+ Identify Controller data structure.
+
+``NVME_SC_ABORT_MISSING``
+ Abort Command is missing: The abort
+ command is missing.
+
+``NVME_SC_ASYNC_LIMIT``
+ Asynchronous Event Request Limit
+ Exceeded: The number of concurrently
+ outstanding Asynchronous Event Request
+ commands has been exceeded.
+
+``NVME_SC_FIRMWARE_SLOT``
+ Invalid Firmware Slot: The firmware slot
+ indicated is invalid or read only. This
+ error is indicated if the firmware slot
+ exceeds the number supported.
+
+``NVME_SC_FIRMWARE_IMAGE``
+ Invalid Firmware Image: The firmware
+ image specified for activation is invalid
+ and not loaded by the controller.
+
+``NVME_SC_INVALID_VECTOR``
+ Invalid Interrupt Vector: The creation of
+ the I/O Completion Queue failed due to an
+ invalid interrupt vector specified as
+ part of the command.
+
+``NVME_SC_INVALID_LOG_PAGE``
+ Invalid Log Page: The log page indicated
+ is invalid. This error condition is also
+ returned if a reserved log page is
+ requested.
+
+``NVME_SC_INVALID_FORMAT``
+ Invalid Format: The LBA Format specified
+ is not supported.
+
+``NVME_SC_FW_NEEDS_CONV_RESET``
+ Firmware Activation Requires Conventional Reset:
+ The firmware commit was successful,
+ however, activation of the firmware image
+ requires a conventional reset.
+
+``NVME_SC_INVALID_QUEUE``
+ Invalid Queue Deletion: Invalid I/O
+ Completion Queue specified to delete.
+
+``NVME_SC_FEATURE_NOT_SAVEABLE``
+ Feature Identifier Not Saveable: The
+ Feature Identifier specified does not
+ support a saveable value.
+
+``NVME_SC_FEATURE_NOT_CHANGEABLE``
+ Feature Not Changeable: The Feature
+ Identifier is not able to be changed.
+
+``NVME_SC_FEATURE_NOT_PER_NS``
+ Feature Not Namespace Specific: The
+ Feature Identifier specified is not
+ namespace specific. The Feature
+ Identifier settings apply across all
+ namespaces.
+
+``NVME_SC_FW_NEEDS_SUBSYS_RESET``
+ Firmware Activation Requires NVM
+ Subsystem Reset: The firmware commit was
+ successful, however, activation of the
+ firmware image requires an NVM Subsystem.
+
+``NVME_SC_FW_NEEDS_RESET``
+ Firmware Activation Requires Controller
+ Level Reset: The firmware commit was
+ successful; however, the image specified
+ does not support being activated without
+ a reset.
+
+``NVME_SC_FW_NEEDS_MAX_TIME``
+ Firmware Activation Requires Maximum Time
+ Violation: The image specified if
+ activated immediately would exceed the
+ Maximum Time for Firmware Activation
+ (MTFA) value reported in Identify
+ Controller.
+
+``NVME_SC_FW_ACTIVATE_PROHIBITED``
+ Firmware Activation Prohibited: The image
+ specified is being prohibited from
+ activation by the controller for vendor
+ specific reasons.
+
+``NVME_SC_OVERLAPPING_RANGE``
+ Overlapping Range: The downloaded
+ firmware image has overlapping ranges.
+
+``NVME_SC_NS_INSUFFICIENT_CAP``
+ Namespace Insufficient Capacity: Creating
+ the namespace requires more free space
+ than is currently available.
+
+``NVME_SC_NS_ID_UNAVAILABLE``
+ Namespace Identifier Unavailable: The
+ number of namespaces supported has been
+ exceeded.
+
+``NVME_SC_NS_ALREADY_ATTACHED``
+ Namespace Already Attached: The
+ controller is already attached to the
+ namespace specified.
+
+``NVME_SC_NS_IS_PRIVATE``
+ Namespace Is Private: The namespace is
+ private and is already attached to one
+ controller.
+
+``NVME_SC_NS_NOT_ATTACHED``
+ Namespace Not Attached: The request to
+ detach the controller could not be
+ completed because the controller is not
+ attached to the namespace.
+
+``NVME_SC_THIN_PROV_NOT_SUPP``
+ Thin Provisioning Not Supported: Thin
+ provisioning is not supported by the
+ controller.
+
+``NVME_SC_CTRL_LIST_INVALID``
+ Controller List Invalid: The controller
+ list provided contains invalid controller
+ ids.
+
+``NVME_SC_SELF_TEST_IN_PROGRESS``
+ Device Self-test In Progress: The controller
+ or NVM subsystem already has a device
+ self-test operation in process.
+
+``NVME_SC_BP_WRITE_PROHIBITED``
+ Boot Partition Write Prohibited: The
+ command is trying to modify a locked Boot
+ Partition.
+
+``NVME_SC_INVALID_CTRL_ID``
+ Invalid Controller Identifier:
+
+``NVME_SC_INVALID_SEC_CTRL_STATE``
+ Invalid Secondary Controller State
+
+``NVME_SC_INVALID_CTRL_RESOURCES``
+ Invalid Number of Controller Resources
+
+``NVME_SC_INVALID_RESOURCE_ID``
+ Invalid Resource Identifier
+
+``NVME_SC_PMR_SAN_PROHIBITED``
+ Sanitize Prohibited While Persistent
+ Memory Region is Enabled
+
+``NVME_SC_ANA_GROUP_ID_INVALID``
+ ANA Group Identifier Invalid: The specified
+ ANA Group Identifier (ANAGRPID) is not
+ supported in the submitted command.
+
+``NVME_SC_ANA_ATTACH_FAILED``
+ ANA Attach Failed: The controller is not
+ attached to the namespace as a result
+ of an ANA condition.
+
+``NVME_SC_INSUFFICIENT_CAP``
+ Insufficient Capacity: Requested operation
+ requires more free space than is currently
+ available.
+
+``NVME_SC_NS_ATTACHMENT_LIMIT_EXCEEDED``
+ Namespace Attachment Limit Exceeded:
+ Attaching the ns to a controller causes
+ max number of ns attachments allowed
+ to be exceeded.
+
+``NVME_SC_PROHIBIT_CMD_EXEC_NOT_SUPPORTED``
+ Prohibition of Command Execution
+ Not Supported
+
+``NVME_SC_IOCS_NOT_SUPPORTED``
+ I/O Command Set Not Supported
+
+``NVME_SC_IOCS_NOT_ENABLED``
+ I/O Command Set Not Enabled
+
+``NVME_SC_IOCS_COMBINATION_REJECTED``
+ I/O Command Set Combination Rejected
+
+``NVME_SC_INVALID_IOCS``
+ Invalid I/O Command Set
+
+``NVME_SC_ID_UNAVAILABLE``
+ Identifier Unavailable
+
+``NVME_SC_INVALID_DISCOVERY_INFO``
+ The discovery information provided in
+ one or more extended discovery
+ information entries is not applicable
+ for the type of entity selected in
+ the Entity Type (ETYPE) field of the
+ Discovery Information Management
+ command data portion’s header.
+
+``NVME_SC_ZONING_DATA_STRUCT_LOCKED``
+ The requested Zoning data structure
+ is locked on the CDC.
+
+``NVME_SC_ZONING_DATA_STRUCT_NOTFND``
+ The requested Zoning data structure
+ does not exist on the CDC.
+
+``NVME_SC_INSUFFICIENT_DISC_RES``
+ The number of discover information
+ entries provided in the data portion
+ of the Discovery Information
+ Management command for a registration
+ task (i.e., TAS field cleared to 0h)
+ exceeds the available capacity for
+ new discovery information entries on
+ the CDC or DDC. This may be a
+ transient condition.
+
+``NVME_SC_REQSTD_FUNCTION_DISABLED``
+ Fabric Zoning is not enabled on the
+ CDC
+
+``NVME_SC_ZONEGRP_ORIGINATOR_INVLD``
+ The NQN contained in the ZoneGroup
+ Originator field does not match the
+ Host NQN used by the DDC to connect
+ to the CDC.
+
+``NVME_SC_BAD_ATTRIBUTES``
+ Conflicting Dataset Management Attributes
+
+``NVME_SC_INVALID_PI``
+ Invalid Protection Information
+
+``NVME_SC_READ_ONLY``
+ Attempted Write to Read Only Range
+
+``NVME_SC_CMD_SIZE_LIMIT_EXCEEDED``
+ Command Size Limit Exceeded
+
+``NVME_SC_CONNECT_FORMAT``
+ Incompatible Format: The NVM subsystem
+ does not support the record format
+ specified by the host.
+
+``NVME_SC_CONNECT_CTRL_BUSY``
+ Controller Busy: The controller is
+ already associated with a host.
+
+``NVME_SC_CONNECT_INVALID_PARAM``
+ Connect Invalid Parameters: One or more
+ of the command parameters.
+
+``NVME_SC_CONNECT_RESTART_DISC``
+ Connect Restart Discovery: The NVM
+ subsystem requested is not available.
+
+``NVME_SC_CONNECT_INVALID_HOST``
+ Connect Invalid Host: The host is either
+ not allowed to establish an association
+ to any controller in the NVM subsystem or
+ the host is not allowed to establish an
+ association to the specified controller
+
+``NVME_SC_DISCONNECT_INVALID_QTYPE``
+ Invalid Queue Type: The command was sent
+ on the wrong queue type.
+
+``NVME_SC_DISCOVERY_RESTART``
+ Discover Restart: The snapshot of the
+ records is now invalid or out of date.
+
+``NVME_SC_AUTH_REQUIRED``
+ Authentication Required: NVMe in-band
+ authentication is required and the queue
+ has not yet been authenticated.
+
+``NVME_SC_ZNS_INVALID_OP_REQUEST``
+ Invalid Zone Operation Request:
+ The operation requested is invalid. This may be due to
+ various conditions, including: attempting to allocate a
+ ZRWA when a zone is not in the ZSE:Empty state; or
+ invalid Flush Explicit ZRWA Range Send Zone Action
+ operation.
+
+``NVME_SC_ZNS_ZRWA_RESOURCES_UNAVAILABLE``
+ ZRWA Resources Unavailable:
+ No ZRWAs are available.
+
+``NVME_SC_ZNS_BOUNDARY_ERROR``
+ Zone Boundary Error: The command specifies
+ logical blocks in more than one zone.
+
+``NVME_SC_ZNS_FULL``
+ Zone Is Full: The accessed zone is in the
+ ZSF:Full state.
+
+``NVME_SC_ZNS_READ_ONLY``
+ Zone Is Read Only: The accessed zone is
+ in the ZSRO:Read Only state.
+
+``NVME_SC_ZNS_OFFLINE``
+ Zone Is Offline: The accessed zone is
+ in the ZSO:Offline state.
+
+``NVME_SC_ZNS_INVALID_WRITE``
+ Zone Invalid Write: The write to a zone
+ was not at the write pointer.
+
+``NVME_SC_ZNS_TOO_MANY_ACTIVE``
+ Too Many Active Zones: The controller
+ does not allow additional active zones.
+
+``NVME_SC_ZNS_TOO_MANY_OPENS``
+ Too Many Open Zones: The controller does
+ not allow additional open zones.
+
+``NVME_SC_ZNS_INVAL_TRANSITION``
+ Invalid Zone State Transition: The request
+ is not a valid zone state transition.
+
+``NVME_SC_WRITE_FAULT``
+ Write Fault: The write data could not be
+ committed to the media.
+
+``NVME_SC_READ_ERROR``
+ Unrecovered Read Error: The read data
+ could not be recovered from the media.
+
+``NVME_SC_GUARD_CHECK``
+ End-to-end Guard Check Error: The command
+ was aborted due to an end-to-end guard
+ check failure.
+
+``NVME_SC_APPTAG_CHECK``
+ End-to-end Application Tag Check Error:
+ The command was aborted due to an
+ end-to-end application tag check failure.
+
+``NVME_SC_REFTAG_CHECK``
+ End-to-end Reference Tag Check Error: The
+ command was aborted due to an end-to-end
+ reference tag check failure.
+
+``NVME_SC_COMPARE_FAILED``
+ Compare Failure: The command failed due
+ to a miscompare during a Compare command.
+
+``NVME_SC_ACCESS_DENIED``
+ Access Denied: Access to the namespace
+ and/or LBA range is denied due to lack of
+ access rights.
+
+``NVME_SC_UNWRITTEN_BLOCK``
+ Deallocated or Unwritten Logical Block:
+ The command failed due to an attempt to
+ read from or verify an LBA range
+ containing a deallocated or unwritten
+ logical block.
+
+``NVME_SC_STORAGE_TAG_CHECK``
+ End-to-End Storage Tag Check Error: The
+ command was aborted due to an end-to-end
+ storage tag check failure.
+
+``NVME_SC_ANA_INTERNAL_PATH_ERROR``
+ Internal Path Error: The command was not
+ completed as the result of a controller
+ internal error that is specific to the
+ controller processing the command.
+
+``NVME_SC_ANA_PERSISTENT_LOSS``
+ Asymmetric Access Persistent Loss: The
+ requested function (e.g., command) is not
+ able to be performed as a result of the
+ relationship between the controller and
+ the namespace being in the ANA Persistent
+ Loss state.
+
+``NVME_SC_ANA_INACCESSIBLE``
+ Asymmetric Access Inaccessible: The
+ requested function (e.g., command) is not
+ able to be performed as a result of the
+ relationship between the controller and
+ the namespace being in the ANA
+ Inaccessible state.
+
+``NVME_SC_ANA_TRANSITION``
+ Asymmetric Access Transition: The
+ requested function (e.g., command) is not
+ able to be performed as a result of the
+ relationship between the controller and
+ the namespace transitioning between
+ Asymmetric Namespace Access states.
+
+``NVME_SC_CTRL_PATH_ERROR``
+ Controller Pathing Error: A pathing error
+ was detected by the controller.
+
+``NVME_SC_HOST_PATH_ERROR``
+ Host Pathing Error: A pathing error was
+ detected by the host.
+
+``NVME_SC_CMD_ABORTED_BY_HOST``
+ Command Aborted By Host: The command was
+ aborted as a result of host action.
+
+``NVME_SC_CRD``
+ Mask to get value of Command Retry Delay
+ index
+
+``NVME_SC_MORE``
+ More bit. If set, more status information
+ for this command as part of the Error
+ Information log that may be retrieved with
+ the Get Log Page command.
+
+``NVME_SC_DNR``
+ Do Not Retry bit. If set, if the same
+ command is re-submitted to any controller
+ in the NVM subsystem, then that
+ re-submitted command is expected to fail.
+
+
+.. c:function:: __u16 nvme_status_code_type (__u16 status_field)
+
+ Returns the NVMe Status Code Type
+
+**Parameters**
+
+``__u16 status_field``
+ The NVMe Completion Queue Entry's Status Field
+ See :c:type:`enum nvme_status_field <nvme_status_field>`
+
+**Return**
+
+status code type
+
+
+.. c:function:: __u16 nvme_status_code (__u16 status_field)
+
+ Returns the NVMe Status Code
+
+**Parameters**
+
+``__u16 status_field``
+ The NVMe Completion Queue Entry's Status Field
+ See :c:type:`enum nvme_status_field <nvme_status_field>`
+
+**Return**
+
+status code
+
+
+
+
+.. c:enum:: nvme_admin_opcode
+
+ Known NVMe admin opcodes
+
+**Constants**
+
+``nvme_admin_delete_sq``
+ Delete I/O Submission Queue
+
+``nvme_admin_create_sq``
+ Create I/O Submission Queue
+
+``nvme_admin_get_log_page``
+ Get Log Page
+
+``nvme_admin_delete_cq``
+ Delete I/O Completion Queue
+
+``nvme_admin_create_cq``
+ Create I/O Completion Queue
+
+``nvme_admin_identify``
+ Identify
+
+``nvme_admin_abort_cmd``
+ Abort
+
+``nvme_admin_set_features``
+ Set Features
+
+``nvme_admin_get_features``
+ Get Features
+
+``nvme_admin_async_event``
+ Asynchronous Event Request
+
+``nvme_admin_ns_mgmt``
+ Namespace Management
+
+``nvme_admin_fw_commit``
+ Firmware Commit
+
+``nvme_admin_fw_activate``
+ Firmware Commit
+
+``nvme_admin_fw_download``
+ Firmware Image Download
+
+``nvme_admin_dev_self_test``
+ Device Self-test
+
+``nvme_admin_ns_attach``
+ Namespace Attachment
+
+``nvme_admin_keep_alive``
+ Keep Alive
+
+``nvme_admin_directive_send``
+ Directive Send
+
+``nvme_admin_directive_recv``
+ Directive Receive
+
+``nvme_admin_virtual_mgmt``
+ Virtualization Management
+
+``nvme_admin_nvme_mi_send``
+ NVMe-MI Send
+
+``nvme_admin_nvme_mi_recv``
+ NVMe-MI Receive
+
+``nvme_admin_capacity_mgmt``
+ Capacity Management
+
+``nvme_admin_discovery_info_mgmt``
+ Discovery Information Management (DIM)
+
+``nvme_admin_fabric_zoning_recv``
+ Fabric Zoning Receive
+
+``nvme_admin_lockdown``
+ Lockdown
+
+``nvme_admin_fabric_zoning_lookup``
+ Fabric Zoning Lookup
+
+``nvme_admin_fabric_zoning_send``
+ Fabric Zoning Send
+
+``nvme_admin_dbbuf``
+ Doorbell Buffer Config
+
+``nvme_admin_fabrics``
+ Fabrics Commands
+
+``nvme_admin_format_nvm``
+ Format NVM
+
+``nvme_admin_security_send``
+ Security Send
+
+``nvme_admin_security_recv``
+ Security Receive
+
+``nvme_admin_sanitize_nvm``
+ Sanitize
+
+``nvme_admin_get_lba_status``
+ Get LBA Status
+
+
+
+
+.. c:enum:: nvme_identify_cns
+
+ Identify - CNS Values
+
+**Constants**
+
+``NVME_IDENTIFY_CNS_NS``
+ Identify Namespace data structure
+
+``NVME_IDENTIFY_CNS_CTRL``
+ Identify Controller data structure
+
+``NVME_IDENTIFY_CNS_NS_ACTIVE_LIST``
+ Active Namespace ID list
+
+``NVME_IDENTIFY_CNS_NS_DESC_LIST``
+ Namespace Identification Descriptor list
+
+``NVME_IDENTIFY_CNS_NVMSET_LIST``
+ NVM Set List
+
+``NVME_IDENTIFY_CNS_CSI_NS``
+ I/O Command Set specific Identify
+ Namespace data structure
+
+``NVME_IDENTIFY_CNS_CSI_CTRL``
+ I/O Command Set specific Identify
+ Controller data structure
+
+``NVME_IDENTIFY_CNS_CSI_NS_ACTIVE_LIST``
+ Active Namespace ID list associated
+ with the specified I/O Command Set
+
+``NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS``
+ I/O Command Set Independent Identify
+
+``NVME_IDENTIFY_CNS_NS_USER_DATA_FORMAT``
+ Namespace user data format
+
+``NVME_IDENTIFY_CNS_CSI_NS_USER_DATA_FORMAT``
+ I/O Command Set specific user data
+ format
+ Namespace data structure
+
+``NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST``
+ Allocated Namespace ID list
+
+``NVME_IDENTIFY_CNS_ALLOCATED_NS``
+ Identify Namespace data structure for
+ the specified allocated NSID
+
+``NVME_IDENTIFY_CNS_NS_CTRL_LIST``
+ Controller List of controllers attached
+ to the specified NSID
+
+``NVME_IDENTIFY_CNS_CTRL_LIST``
+ Controller List of controllers that exist
+ in the NVM subsystem
+
+``NVME_IDENTIFY_CNS_PRIMARY_CTRL_CAP``
+ Primary Controller Capabilities data
+ structure for the specified primary controller
+
+``NVME_IDENTIFY_CNS_SECONDARY_CTRL_LIST``
+ Secondary Controller list of controllers
+ associated with the primary controller
+ processing the command
+
+``NVME_IDENTIFY_CNS_NS_GRANULARITY``
+ A Namespace Granularity List
+
+``NVME_IDENTIFY_CNS_UUID_LIST``
+ A UUID List
+
+``NVME_IDENTIFY_CNS_DOMAIN_LIST``
+ Domain List
+
+``NVME_IDENTIFY_CNS_ENDURANCE_GROUP_ID``
+ Endurance Group List
+
+``NVME_IDENTIFY_CNS_CSI_ALLOCATED_NS_LIST``
+ I/O Command Set specific Allocated Namespace
+ ID list
+
+``NVME_IDENTIFY_CNS_CSI_ID_NS_DATA_STRUCTURE``
+ I/O Command Set specific ID Namespace
+ Data Structure for Allocated Namespace ID
+
+``NVME_IDENTIFY_CNS_COMMAND_SET_STRUCTURE``
+ Base Specification 2.0a section 5.17.2.21
+
+
+
+
+.. c:enum:: nvme_cmd_get_log_lid
+
+ Get Log Page -Log Page Identifiers
+
+**Constants**
+
+``NVME_LOG_LID_SUPPORTED_LOG_PAGES``
+ Supported Log Pages
+
+``NVME_LOG_LID_ERROR``
+ Error Information
+
+``NVME_LOG_LID_SMART``
+ SMART / Health Information
+
+``NVME_LOG_LID_FW_SLOT``
+ Firmware Slot Information
+
+``NVME_LOG_LID_CHANGED_NS``
+ Changed Namespace List
+
+``NVME_LOG_LID_CMD_EFFECTS``
+ Commands Supported and Effects
+
+``NVME_LOG_LID_DEVICE_SELF_TEST``
+ Device Self-test
+
+``NVME_LOG_LID_TELEMETRY_HOST``
+ Telemetry Host-Initiated
+
+``NVME_LOG_LID_TELEMETRY_CTRL``
+ Telemetry Controller-Initiated
+
+``NVME_LOG_LID_ENDURANCE_GROUP``
+ Endurance Group Information
+
+``NVME_LOG_LID_PREDICTABLE_LAT_NVMSET``
+ Predictable Latency Per NVM Set
+
+``NVME_LOG_LID_PREDICTABLE_LAT_AGG``
+ Predictable Latency Event Aggregate
+
+``NVME_LOG_LID_ANA``
+ Asymmetric Namespace Access
+
+``NVME_LOG_LID_PERSISTENT_EVENT``
+ Persistent Event Log
+
+``NVME_LOG_LID_LBA_STATUS``
+ LBA Status Information
+
+``NVME_LOG_LID_ENDURANCE_GRP_EVT``
+ Endurance Group Event Aggregate
+
+``NVME_LOG_LID_MEDIA_UNIT_STATUS``
+ Media Unit Status
+
+``NVME_LOG_LID_SUPPORTED_CAP_CONFIG_LIST``
+ Supported Capacity Configuration Lis
+
+``NVME_LOG_LID_FID_SUPPORTED_EFFECTS``
+ Feature Identifiers Supported and Effects
+
+``NVME_LOG_LID_MI_CMD_SUPPORTED_EFFECTS``
+ NVMe-MI Commands Supported and Effects
+
+``NVME_LOG_LID_BOOT_PARTITION``
+ Boot Partition
+
+``NVME_LOG_LID_DISCOVER``
+ Discovery
+
+``NVME_LOG_LID_RESERVATION``
+ Reservation Notification
+
+``NVME_LOG_LID_SANITIZE``
+ Sanitize Status
+
+``NVME_LOG_LID_ZNS_CHANGED_ZONES``
+ Changed Zone List
+
+
+
+
+.. c:enum:: nvme_features_id
+
+ Features - Feature Identifiers
+
+**Constants**
+
+``NVME_FEAT_FID_ARBITRATION``
+ Arbitration
+
+``NVME_FEAT_FID_POWER_MGMT``
+ Power Management
+
+``NVME_FEAT_FID_LBA_RANGE``
+ LBA Range Type
+
+``NVME_FEAT_FID_TEMP_THRESH``
+ Temperature Threshold
+
+``NVME_FEAT_FID_ERR_RECOVERY``
+ Error Recovery
+
+``NVME_FEAT_FID_VOLATILE_WC``
+ Volatile Write Cache
+
+``NVME_FEAT_FID_NUM_QUEUES``
+ Number of Queues
+
+``NVME_FEAT_FID_IRQ_COALESCE``
+ Interrupt Coalescing
+
+``NVME_FEAT_FID_IRQ_CONFIG``
+ Interrupt Vector Configuration
+
+``NVME_FEAT_FID_WRITE_ATOMIC``
+ Write Atomicity Normal
+
+``NVME_FEAT_FID_ASYNC_EVENT``
+ Asynchronous Event Configuration
+
+``NVME_FEAT_FID_AUTO_PST``
+ Autonomous Power State Transition
+
+``NVME_FEAT_FID_HOST_MEM_BUF``
+ Host Memory Buffer
+
+``NVME_FEAT_FID_TIMESTAMP``
+ Timestamp
+
+``NVME_FEAT_FID_KATO``
+ Keep Alive Timer
+
+``NVME_FEAT_FID_HCTM``
+ Host Controlled Thermal Management
+
+``NVME_FEAT_FID_NOPSC``
+ Non-Operational Power State Config
+
+``NVME_FEAT_FID_RRL``
+ Read Recovery Level Config
+
+``NVME_FEAT_FID_PLM_CONFIG``
+ Predictable Latency Mode Config
+
+``NVME_FEAT_FID_PLM_WINDOW``
+ Predictable Latency Mode Window
+
+``NVME_FEAT_FID_LBA_STS_INTERVAL``
+ LBA Status Information Report Interval
+
+``NVME_FEAT_FID_HOST_BEHAVIOR``
+ Host Behavior Support
+
+``NVME_FEAT_FID_SANITIZE``
+ Endurance Group Event Configuration
+
+``NVME_FEAT_FID_ENDURANCE_EVT_CFG``
+ Endurance Group Event Configuration
+
+``NVME_FEAT_FID_IOCS_PROFILE``
+ I/O Command Set Profile
+
+``NVME_FEAT_FID_SPINUP_CONTROL``
+ Spinup Control
+
+``NVME_FEAT_FID_ENH_CTRL_METADATA``
+ Enhanced Controller Metadata
+
+``NVME_FEAT_FID_CTRL_METADATA``
+ Controller Metadata
+
+``NVME_FEAT_FID_NS_METADATA``
+ Namespace Metadata
+
+``NVME_FEAT_FID_SW_PROGRESS``
+ Software Progress Marker
+
+``NVME_FEAT_FID_HOST_ID``
+ Host Identifier
+
+``NVME_FEAT_FID_RESV_MASK``
+ Reservation Notification Mask
+
+``NVME_FEAT_FID_RESV_PERSIST``
+ Reservation Persistence
+
+``NVME_FEAT_FID_WRITE_PROTECT``
+ Namespace Write Protection Config
+
+
+
+
+.. c:enum:: nvme_feat
+
+ Features Access Shifts/Masks values
+
+**Constants**
+
+``NVME_FEAT_ARBITRATION_BURST_SHIFT``
+
+``NVME_FEAT_ARBITRATION_BURST_MASK``
+
+``NVME_FEAT_ARBITRATION_LPW_SHIFT``
+
+``NVME_FEAT_ARBITRATION_LPW_MASK``
+
+``NVME_FEAT_ARBITRATION_MPW_SHIFT``
+
+``NVME_FEAT_ARBITRATION_MPW_MASK``
+
+``NVME_FEAT_ARBITRATION_HPW_SHIFT``
+
+``NVME_FEAT_ARBITRATION_HPW_MASK``
+
+``NVME_FEAT_PWRMGMT_PS_SHIFT``
+
+``NVME_FEAT_PWRMGMT_PS_MASK``
+
+``NVME_FEAT_PWRMGMT_WH_SHIFT``
+
+``NVME_FEAT_PWRMGMT_WH_MASK``
+
+``NVME_FEAT_LBAR_NR_SHIFT``
+
+``NVME_FEAT_LBAR_NR_MASK``
+
+``NVME_FEAT_TT_TMPTH_SHIFT``
+
+``NVME_FEAT_TT_TMPTH_MASK``
+
+``NVME_FEAT_TT_TMPSEL_SHIFT``
+
+``NVME_FEAT_TT_TMPSEL_MASK``
+
+``NVME_FEAT_TT_THSEL_SHIFT``
+
+``NVME_FEAT_TT_THSEL_MASK``
+
+``NVME_FEAT_ERROR_RECOVERY_TLER_SHIFT``
+
+``NVME_FEAT_ERROR_RECOVERY_TLER_MASK``
+
+``NVME_FEAT_ERROR_RECOVERY_DULBE_SHIFT``
+
+``NVME_FEAT_ERROR_RECOVERY_DULBE_MASK``
+
+``NVME_FEAT_VWC_WCE_SHIFT``
+
+``NVME_FEAT_VWC_WCE_MASK``
+
+``NVME_FEAT_NRQS_NSQR_SHIFT``
+
+``NVME_FEAT_NRQS_NSQR_MASK``
+
+``NVME_FEAT_NRQS_NCQR_SHIFT``
+
+``NVME_FEAT_NRQS_NCQR_MASK``
+
+``NVME_FEAT_IRQC_THR_SHIFT``
+
+``NVME_FEAT_IRQC_THR_MASK``
+
+``NVME_FEAT_IRQC_TIME_SHIFT``
+
+``NVME_FEAT_IRQC_TIME_MASK``
+
+``NVME_FEAT_ICFG_IV_SHIFT``
+
+``NVME_FEAT_ICFG_IV_MASK``
+
+``NVME_FEAT_ICFG_CD_SHIFT``
+
+``NVME_FEAT_ICFG_CD_MASK``
+
+``NVME_FEAT_WA_DN_SHIFT``
+
+``NVME_FEAT_WA_DN_MASK``
+
+``NVME_FEAT_AE_SMART_SHIFT``
+
+``NVME_FEAT_AE_SMART_MASK``
+
+``NVME_FEAT_AE_NAN_SHIFT``
+
+``NVME_FEAT_AE_NAN_MASK``
+
+``NVME_FEAT_AE_FW_SHIFT``
+
+``NVME_FEAT_AE_FW_MASK``
+
+``NVME_FEAT_AE_TELEM_SHIFT``
+
+``NVME_FEAT_AE_TELEM_MASK``
+
+``NVME_FEAT_AE_ANA_SHIFT``
+
+``NVME_FEAT_AE_ANA_MASK``
+
+``NVME_FEAT_AE_PLA_SHIFT``
+
+``NVME_FEAT_AE_PLA_MASK``
+
+``NVME_FEAT_AE_LBAS_SHIFT``
+
+``NVME_FEAT_AE_LBAS_MASK``
+
+``NVME_FEAT_AE_EGA_SHIFT``
+
+``NVME_FEAT_AE_EGA_MASK``
+
+``NVME_FEAT_APST_APSTE_SHIFT``
+
+``NVME_FEAT_APST_APSTE_MASK``
+
+``NVME_FEAT_HMEM_EHM_SHIFT``
+
+``NVME_FEAT_HMEM_EHM_MASK``
+
+``NVME_FEAT_HCTM_TMT2_SHIFT``
+
+``NVME_FEAT_HCTM_TMT2_MASK``
+
+``NVME_FEAT_HCTM_TMT1_SHIFT``
+
+``NVME_FEAT_HCTM_TMT1_MASK``
+
+``NVME_FEAT_NOPS_NOPPME_SHIFT``
+
+``NVME_FEAT_NOPS_NOPPME_MASK``
+
+``NVME_FEAT_RRL_RRL_SHIFT``
+
+``NVME_FEAT_RRL_RRL_MASK``
+
+``NVME_FEAT_PLM_PLME_SHIFT``
+
+``NVME_FEAT_PLM_PLME_MASK``
+
+``NVME_FEAT_PLMW_WS_SHIFT``
+
+``NVME_FEAT_PLMW_WS_MASK``
+
+``NVME_FEAT_LBAS_LSIRI_SHIFT``
+
+``NVME_FEAT_LBAS_LSIRI_MASK``
+
+``NVME_FEAT_LBAS_LSIPI_SHIFT``
+
+``NVME_FEAT_LBAS_LSIPI_MASK``
+
+``NVME_FEAT_SC_NODRM_SHIFT``
+
+``NVME_FEAT_SC_NODRM_MASK``
+
+``NVME_FEAT_EG_ENDGID_SHIFT``
+
+``NVME_FEAT_EG_ENDGID_MASK``
+
+``NVME_FEAT_EG_EGCW_SHIFT``
+
+``NVME_FEAT_EG_EGCW_MASK``
+
+``NVME_FEAT_SPM_PBSLC_SHIFT``
+
+``NVME_FEAT_SPM_PBSLC_MASK``
+
+``NVME_FEAT_HOSTID_EXHID_SHIFT``
+
+``NVME_FEAT_HOSTID_EXHID_MASK``
+
+``NVME_FEAT_RM_REGPRE_SHIFT``
+
+``NVME_FEAT_RM_REGPRE_MASK``
+
+``NVME_FEAT_RM_RESREL_SHIFT``
+
+``NVME_FEAT_RM_RESREL_MASK``
+
+``NVME_FEAT_RM_RESPRE_SHIFT``
+
+``NVME_FEAT_RM_RESPRE_MASK``
+
+``NVME_FEAT_RP_PTPL_SHIFT``
+
+``NVME_FEAT_RP_PTPL_MASK``
+
+``NVME_FEAT_WP_WPS_SHIFT``
+
+``NVME_FEAT_WP_WPS_MASK``
+
+``NVME_FEAT_IOCSP_IOCSCI_SHIFT``
+
+``NVME_FEAT_IOCSP_IOCSCI_MASK``
+
+
+
+
+.. c:enum:: nvme_get_features_sel
+
+ Get Features - Select
+
+**Constants**
+
+``NVME_GET_FEATURES_SEL_CURRENT``
+ Current value
+
+``NVME_GET_FEATURES_SEL_DEFAULT``
+ Default value
+
+``NVME_GET_FEATURES_SEL_SAVED``
+ Saved value
+
+``NVME_GET_FEATURES_SEL_SUPPORTED``
+ Supported capabilities
+
+
+
+
+.. c:enum:: nvme_cmd_format_mset
+
+ Format NVM - Metadata Settings
+
+**Constants**
+
+``NVME_FORMAT_MSET_SEPARATE``
+ indicates that the metadata is transferred
+ as part of a separate buffer.
+
+``NVME_FORMAT_MSET_EXTENDED``
+ indicates that the metadata is transferred
+ as part of an extended data LBA.
+
+
+
+
+.. c:enum:: nvme_cmd_format_pi
+
+ Format NVM - Protection Information
+
+**Constants**
+
+``NVME_FORMAT_PI_DISABLE``
+ Protection information is not enabled.
+
+``NVME_FORMAT_PI_TYPE1``
+ Protection information is enabled, Type 1.
+
+``NVME_FORMAT_PI_TYPE2``
+ Protection information is enabled, Type 2.
+
+``NVME_FORMAT_PI_TYPE3``
+ Protection information is enabled, Type 3.
+
+
+
+
+.. c:enum:: nvme_cmd_format_pil
+
+ Format NVM - Protection Information Location
+
+**Constants**
+
+``NVME_FORMAT_PIL_LAST``
+ Protection information is transferred as the last
+ bytes of metadata.
+
+``NVME_FORMAT_PIL_FIRST``
+ Protection information is transferred as the first
+ bytes of metadata.
+
+
+
+
+.. c:enum:: nvme_cmd_format_ses
+
+ Format NVM - Secure Erase Settings
+
+**Constants**
+
+``NVME_FORMAT_SES_NONE``
+ No secure erase operation requested.
+
+``NVME_FORMAT_SES_USER_DATA_ERASE``
+ User Data Erase: All user data shall be erased,
+ contents of the user data after the erase is
+ indeterminate (e.g. the user data may be zero
+ filled, one filled, etc.). If a User Data Erase
+ is requested and all affected user data is
+ encrypted, then the controller is allowed
+ to use a cryptographic erase to perform
+ the requested User Data Erase.
+
+``NVME_FORMAT_SES_CRYPTO_ERASE``
+ Cryptographic Erase: All user data shall
+ be erased cryptographically. This is
+ accomplished by deleting the encryption key.
+
+
+
+
+.. c:enum:: nvme_ns_mgmt_sel
+
+ Namespace Management - Select
+
+**Constants**
+
+``NVME_NS_MGMT_SEL_CREATE``
+ Namespace Create selection
+
+``NVME_NS_MGMT_SEL_DELETE``
+ Namespace Delete selection
+
+
+
+
+.. c:enum:: nvme_ns_attach_sel
+
+ Namespace Attachment - Select
+
+**Constants**
+
+``NVME_NS_ATTACH_SEL_CTRL_ATTACH``
+ Namespace attach selection
+
+``NVME_NS_ATTACH_SEL_CTRL_DEATTACH``
+ Namespace detach selection
+
+
+
+
+.. c:enum:: nvme_fw_commit_ca
+
+ Firmware Commit - Commit Action
+
+**Constants**
+
+``NVME_FW_COMMIT_CA_REPLACE``
+ Downloaded image replaces the existing
+ image, if any, in the specified Firmware
+ Slot. The newly placed image is not
+ activated.
+
+``NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE``
+ Downloaded image replaces the existing
+ image, if any, in the specified Firmware
+ Slot. The newly placed image is activated
+ at the next Controller Level Reset.
+
+``NVME_FW_COMMIT_CA_SET_ACTIVE``
+ The existing image in the specified
+ Firmware Slot is activated at the
+ next Controller Level Reset.
+
+``NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE_IMMEDIATE``
+ Downloaded image replaces the existing
+ image, if any, in the specified Firmware
+ Slot and is then activated immediately.
+ If there is not a newly downloaded image,
+ then the existing image in the specified
+ firmware slot is activated immediately.
+
+``NVME_FW_COMMIT_CA_REPLACE_BOOT_PARTITION``
+ Downloaded image replaces the Boot
+ Partition specified by the Boot
+ Partition ID field.
+
+``NVME_FW_COMMIT_CA_ACTIVATE_BOOT_PARTITION``
+ Mark the Boot Partition specified in
+ the BPID field as active and update
+ BPINFO.ABPID.
+
+
+
+
+.. c:enum:: nvme_directive_dtype
+
+ Directive Types
+
+**Constants**
+
+``NVME_DIRECTIVE_DTYPE_IDENTIFY``
+ Identify directive type
+
+``NVME_DIRECTIVE_DTYPE_STREAMS``
+ Streams directive type
+
+
+
+
+.. c:enum:: nvme_directive_receive_doper
+
+ Directive Receive Directive Operation
+
+**Constants**
+
+``NVME_DIRECTIVE_RECEIVE_IDENTIFY_DOPER_PARAM``
+
+``NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_PARAM``
+
+``NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_STATUS``
+
+``NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_RESOURCE``
+
+
+
+
+.. c:enum:: nvme_directive_send_doper
+
+ Directive Send Directive Operation
+
+**Constants**
+
+``NVME_DIRECTIVE_SEND_IDENTIFY_DOPER_ENDIR``
+
+``NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_IDENTIFIER``
+
+``NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_RESOURCE``
+
+
+
+
+.. c:enum:: nvme_directive_send_identify_endir
+
+ Enable Directive
+
+**Constants**
+
+``NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_DISABLE``
+
+``NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_ENABLE``
+
+
+
+
+.. c:enum:: nvme_sanitize_sanact
+
+ Sanitize Action
+
+**Constants**
+
+``NVME_SANITIZE_SANACT_EXIT_FAILURE``
+ Exit Failure Mode.
+
+``NVME_SANITIZE_SANACT_START_BLOCK_ERASE``
+ Start a Block Erase sanitize operation.
+
+``NVME_SANITIZE_SANACT_START_OVERWRITE``
+ Start an Overwrite sanitize operation.
+
+``NVME_SANITIZE_SANACT_START_CRYPTO_ERASE``
+ Start a Crypto Erase sanitize operation.
+
+
+
+
+.. c:enum:: nvme_dst_stc
+
+ Action taken by the Device Self-test command
+
+**Constants**
+
+``NVME_DST_STC_SHORT``
+ Start a short device self-test operation
+
+``NVME_DST_STC_LONG``
+ Start an extended device self-test operation
+
+``NVME_DST_STC_VS``
+ Start a vendor specific device self-test operation
+
+``NVME_DST_STC_ABORT``
+ Abort device self-test operation
+
+
+
+
+.. c:enum:: nvme_virt_mgmt_act
+
+ Virtualization Management - Action
+
+**Constants**
+
+``NVME_VIRT_MGMT_ACT_PRIM_CTRL_FLEX_ALLOC``
+ Primary Controller Flexible
+ Allocation
+
+``NVME_VIRT_MGMT_ACT_OFFLINE_SEC_CTRL``
+ Secondary Controller Offline
+
+``NVME_VIRT_MGMT_ACT_ASSIGN_SEC_CTRL``
+ Secondary Controller Assign
+
+``NVME_VIRT_MGMT_ACT_ONLINE_SEC_CTRL``
+ Secondary Controller Online
+
+
+
+
+.. c:enum:: nvme_virt_mgmt_rt
+
+ Virtualization Management - Resource Type
+
+**Constants**
+
+``NVME_VIRT_MGMT_RT_VQ_RESOURCE``
+ VQ Resources
+
+``NVME_VIRT_MGMT_RT_VI_RESOURCE``
+ VI Resources
+
+
+
+
+.. c:enum:: nvme_ns_write_protect_cfg
+
+ Write Protection - Write Protection State
+
+**Constants**
+
+``NVME_NS_WP_CFG_NONE``
+ No Write Protect
+
+``NVME_NS_WP_CFG_PROTECT``
+ Write Protect
+
+``NVME_NS_WP_CFG_PROTECT_POWER_CYCLE``
+ Write Protect Until Power Cycle
+
+``NVME_NS_WP_CFG_PROTECT_PERMANENT``
+ Permanent Write Protect
+
+
+
+
+.. c:enum:: nvme_log_ana_lsp
+
+ Asymmetric Namespace Access - Return Groups Only
+
+**Constants**
+
+``NVME_LOG_ANA_LSP_RGO_NAMESPACES``
+
+``NVME_LOG_ANA_LSP_RGO_GROUPS_ONLY``
+
+
+
+
+.. c:enum:: nvme_pevent_log_action
+
+ Persistent Event Log - Action
+
+**Constants**
+
+``NVME_PEVENT_LOG_READ``
+ Read Log Data
+
+``NVME_PEVENT_LOG_EST_CTX_AND_READ``
+ Establish Context and Read Log Data
+
+``NVME_PEVENT_LOG_RELEASE_CTX``
+ Release Context
+
+
+
+
+.. c:enum:: nvme_feat_tmpthresh_thsel
+
+ Temperature Threshold - Threshold Type Select
+
+**Constants**
+
+``NVME_FEATURE_TEMPTHRESH_THSEL_OVER``
+ Over temperature threshold select
+
+``NVME_FEATURE_TEMPTHRESH_THSEL_UNDER``
+ Under temperature threshold select
+
+
+
+
+.. c:enum:: nvme_features_async_event_config_flags
+
+ Asynchronous Event Configuration configuration flags
+
+**Constants**
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_SPARE``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_TEMPERATURE``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_DEGRADED``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_READ_ONLY``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_VOLATILE_BACKUP``
+
+``NVME_FEATURE_AENCFG_SMART_CRIT_READ_ONLY_PMR``
+
+``NVME_FEATURE_AENCFG_NOTICE_NAMESPACE_ATTRIBUTES``
+
+``NVME_FEATURE_AENCFG_NOTICE_FIRMWARE_ACTIVATION``
+
+``NVME_FEATURE_AENCFG_NOTICE_TELEMETRY_LOG``
+
+``NVME_FEATURE_AENCFG_NOTICE_ANA_CHANGE``
+
+``NVME_FEATURE_AENCFG_NOTICE_PL_EVENT``
+
+``NVME_FEATURE_AENCFG_NOTICE_LBA_STATUS``
+
+``NVME_FEATURE_AENCFG_NOTICE_EG_EVENT``
+
+``NVME_FEATURE_AENCFG_NOTICE_DISCOVERY_CHANGE``
+
+
+
+
+.. c:enum:: nvme_feat_plm_window_select
+
+ Predictable Latency Per NVM Set Log
+
+**Constants**
+
+``NVME_FEATURE_PLM_DTWIN``
+ Deterministic Window select
+
+``NVME_FEATURE_PLM_NDWIN``
+ Non-Deterministic Window select
+
+
+
+
+.. c:enum:: nvme_feat_resv_notify_flags
+
+ Reservation Notification Configuration
+
+**Constants**
+
+``NVME_FEAT_RESV_NOTIFY_REGPRE``
+ Mask Registration Preempted Notification
+
+``NVME_FEAT_RESV_NOTIFY_RESREL``
+ Mask Reservation Released Notification
+
+``NVME_FEAT_RESV_NOTIFY_RESPRE``
+ Mask Reservation Preempted Notification
+
+
+
+
+.. c:enum:: nvme_feat_nswpcfg_state
+
+ Write Protection - Write Protection State
+
+**Constants**
+
+``NVME_FEAT_NS_NO_WRITE_PROTECT``
+ No Write Protect
+
+``NVME_FEAT_NS_WRITE_PROTECT``
+ Write Protect
+
+``NVME_FEAT_NS_WRITE_PROTECT_PWR_CYCLE``
+ Write Protect Until Power Cycle
+
+``NVME_FEAT_NS_WRITE_PROTECT_PERMANENT``
+ Permanent Write Protect
+
+
+
+
+.. c:enum:: nvme_fctype
+
+ Fabrics Command Types
+
+**Constants**
+
+``nvme_fabrics_type_property_set``
+ Property set
+
+``nvme_fabrics_type_connect``
+ Connect
+
+``nvme_fabrics_type_property_get``
+ Property Get
+
+``nvme_fabrics_type_auth_send``
+ Authentication Send
+
+``nvme_fabrics_type_auth_receive``
+ Authentication Receive
+
+``nvme_fabrics_type_disconnect``
+ Disconnect
+
+
+
+
+.. c:enum:: nvme_io_opcode
+
+ Opcodes for I/O Commands
+
+**Constants**
+
+``nvme_cmd_flush``
+ Flush
+
+``nvme_cmd_write``
+ Write
+
+``nvme_cmd_read``
+ Read
+
+``nvme_cmd_write_uncor``
+ Write Uncorrectable
+
+``nvme_cmd_compare``
+ Compare
+
+``nvme_cmd_write_zeroes``
+ write Zeros
+
+``nvme_cmd_dsm``
+ Dataset Management
+
+``nvme_cmd_verify``
+ Verify
+
+``nvme_cmd_resv_register``
+ Reservation Register
+
+``nvme_cmd_resv_report``
+ Reservation Report
+
+``nvme_cmd_resv_acquire``
+ Reservation Acquire
+
+``nvme_cmd_resv_release``
+ Reservation Release
+
+``nvme_cmd_copy``
+ Copy
+
+``nvme_zns_cmd_mgmt_send``
+ Zone Management Send
+
+``nvme_zns_cmd_mgmt_recv``
+ Zone Management Receive
+
+``nvme_zns_cmd_append``
+ Zone Append
+
+
+
+
+.. c:enum:: nvme_io_control_flags
+
+ I/O control flags
+
+**Constants**
+
+``NVME_IO_DTYPE_STREAMS``
+ Directive Type Streams
+
+``NVME_IO_STC``
+ Storage Tag Check
+
+``NVME_IO_DEAC``
+ Deallocate
+
+``NVME_IO_ZNS_APPEND_PIREMAP``
+ Protection Information Remap
+
+``NVME_IO_PRINFO_PRCHK_REF``
+ Protection Information Check Reference Tag
+
+``NVME_IO_PRINFO_PRCHK_APP``
+ Protection Information Check Application Tag
+
+``NVME_IO_PRINFO_PRCHK_GUARD``
+ Protection Information Check Guard field
+
+``NVME_IO_PRINFO_PRACT``
+ Protection Information Action
+
+``NVME_IO_FUA``
+ Force Unit Access
+
+``NVME_IO_LR``
+ Limited Retry
+
+
+
+
+.. c:enum:: nvme_io_dsm_flags
+
+ Dataset Management flags
+
+**Constants**
+
+``NVME_IO_DSM_FREQ_UNSPEC``
+ No frequency information provided
+
+``NVME_IO_DSM_FREQ_TYPICAL``
+ Typical number of reads and writes
+ expected for this LBA range
+
+``NVME_IO_DSM_FREQ_RARE``
+ Infrequent writes and infrequent
+ reads to the LBA range indicated
+
+``NVME_IO_DSM_FREQ_READS``
+ Infrequent writes and frequent
+ reads to the LBA range indicated
+
+``NVME_IO_DSM_FREQ_WRITES``
+ Frequent writes and infrequent
+ reads to the LBA range indicated
+
+``NVME_IO_DSM_FREQ_RW``
+ Frequent writes and frequent reads
+ to the LBA range indicated
+
+``NVME_IO_DSM_FREQ_ONCE``
+
+``NVME_IO_DSM_FREQ_PREFETCH``
+
+``NVME_IO_DSM_FREQ_TEMP``
+
+``NVME_IO_DSM_LATENCY_NONE``
+ No latency information provided
+
+``NVME_IO_DSM_LATENCY_IDLE``
+ Longer latency acceptable
+
+``NVME_IO_DSM_LATENCY_NORM``
+ Typical latency
+
+``NVME_IO_DSM_LATENCY_LOW``
+ Smallest possible latency
+
+``NVME_IO_DSM_SEQ_REQ``
+
+``NVME_IO_DSM_COMPRESSED``
+
+
+
+
+.. c:enum:: nvme_dsm_attributes
+
+ Dataset Management attributes
+
+**Constants**
+
+``NVME_DSMGMT_IDR``
+ Attribute -Integral Dataset for Read
+
+``NVME_DSMGMT_IDW``
+ Attribute - Integral Dataset for Write
+
+``NVME_DSMGMT_AD``
+ Attribute - Deallocate
+
+
+
+
+.. c:enum:: nvme_resv_rtype
+
+ Reservation Type Encoding
+
+**Constants**
+
+``NVME_RESERVATION_RTYPE_WE``
+ Write Exclusive Reservation
+
+``NVME_RESERVATION_RTYPE_EA``
+ Exclusive Access Reservation
+
+``NVME_RESERVATION_RTYPE_WERO``
+ Write Exclusive - Registrants Only Reservation
+
+``NVME_RESERVATION_RTYPE_EARO``
+ Exclusive Access - Registrants Only Reservation
+
+``NVME_RESERVATION_RTYPE_WEAR``
+ Write Exclusive - All Registrants Reservation
+
+``NVME_RESERVATION_RTYPE_EAAR``
+ Exclusive Access - All Registrants Reservation
+
+
+
+
+.. c:enum:: nvme_resv_racqa
+
+ Reservation Acquire - Reservation Acquire Action
+
+**Constants**
+
+``NVME_RESERVATION_RACQA_ACQUIRE``
+ Acquire
+
+``NVME_RESERVATION_RACQA_PREEMPT``
+ Preempt
+
+``NVME_RESERVATION_RACQA_PREEMPT_AND_ABORT``
+ Preempt and Abort
+
+
+
+
+.. c:enum:: nvme_resv_rrega
+
+ Reservation Register - Reservation Register Action
+
+**Constants**
+
+``NVME_RESERVATION_RREGA_REGISTER_KEY``
+ Register Reservation Key
+
+``NVME_RESERVATION_RREGA_UNREGISTER_KEY``
+ Unregister Reservation Key
+
+``NVME_RESERVATION_RREGA_REPLACE_KEY``
+ Replace Reservation Key
+
+
+
+
+.. c:enum:: nvme_resv_cptpl
+
+ Reservation Register - Change Persist Through Power Loss State
+
+**Constants**
+
+``NVME_RESERVATION_CPTPL_NO_CHANGE``
+ No change to PTPL state
+
+``NVME_RESERVATION_CPTPL_CLEAR``
+ Reservations are released and
+ registrants are cleared on a power on
+
+``NVME_RESERVATION_CPTPL_PERSIST``
+ Reservations and registrants persist
+ across a power loss
+
+
+
+
+.. c:enum:: nvme_resv_rrela
+
+ Reservation Release - Reservation Release Action
+
+**Constants**
+
+``NVME_RESERVATION_RRELA_RELEASE``
+ Release
+
+``NVME_RESERVATION_RRELA_CLEAR``
+ Clear
+
+
+
+
+.. c:enum:: nvme_zns_send_action
+
+ Zone Management Send - Zone Send Action
+
+**Constants**
+
+``NVME_ZNS_ZSA_CLOSE``
+ Close Zone
+
+``NVME_ZNS_ZSA_FINISH``
+ Finish Zone
+
+``NVME_ZNS_ZSA_OPEN``
+ Open Zone
+
+``NVME_ZNS_ZSA_RESET``
+ Reset Zone
+
+``NVME_ZNS_ZSA_OFFLINE``
+ Offline Zone
+
+``NVME_ZNS_ZSA_SET_DESC_EXT``
+ Set Zone Descriptor Extension
+
+``NVME_ZNS_ZSA_ZRWA_FLUSH``
+ Flush
+
+
+
+
+.. c:enum:: nvme_zns_recv_action
+
+ Zone Management Receive - Zone Receive Action Specific Features
+
+**Constants**
+
+``NVME_ZNS_ZRA_REPORT_ZONES``
+ Report Zones
+
+``NVME_ZNS_ZRA_EXTENDED_REPORT_ZONES``
+ Extended Report Zones
+
+
+
+
+.. c:enum:: nvme_zns_report_options
+
+ Zone Management Receive - Zone Receive Action Specific Field
+
+**Constants**
+
+``NVME_ZNS_ZRAS_REPORT_ALL``
+ List all zones
+
+``NVME_ZNS_ZRAS_REPORT_EMPTY``
+ List the zones in the ZSE:Empty state
+
+``NVME_ZNS_ZRAS_REPORT_IMPL_OPENED``
+ List the zones in the ZSIO:Implicitly Opened state
+
+``NVME_ZNS_ZRAS_REPORT_EXPL_OPENED``
+ List the zones in the ZSEO:Explicitly Opened state
+
+``NVME_ZNS_ZRAS_REPORT_CLOSED``
+ List the zones in the ZSC:Closed state
+
+``NVME_ZNS_ZRAS_REPORT_FULL``
+ List the zones in the ZSF:Full state
+
+``NVME_ZNS_ZRAS_REPORT_READ_ONLY``
+ List the zones in the ZSRO:Read Only state
+
+``NVME_ZNS_ZRAS_REPORT_OFFLINE``
+ List the zones in the ZSO:Offline state
+
+
diff --git a/doc/rst/util.rst b/doc/rst/util.rst
new file mode 100644
index 0000000..68ac03b
--- /dev/null
+++ b/doc/rst/util.rst
@@ -0,0 +1,494 @@
+.. _util.h:
+
+**util.h**
+
+
+libnvme utility functions
+
+
+
+.. c:enum:: nvme_connect_err
+
+ nvme connect error codes
+
+**Constants**
+
+``ENVME_CONNECT_RESOLVE``
+ failed to resolve host
+
+``ENVME_CONNECT_ADDRFAM``
+ unrecognized address family
+
+``ENVME_CONNECT_TRADDR``
+ failed to get traddr
+
+``ENVME_CONNECT_TARG``
+ need a transport (-t) argument
+
+``ENVME_CONNECT_AARG``
+ need a address (-a) argument
+
+``ENVME_CONNECT_OPEN``
+ failed to open nvme-fabrics device
+
+``ENVME_CONNECT_WRITE``
+ failed to write to nvme-fabrics device
+
+``ENVME_CONNECT_READ``
+ failed to read from nvme-fabrics device
+
+``ENVME_CONNECT_PARSE``
+ failed to parse ctrl info
+
+``ENVME_CONNECT_INVAL_TR``
+ invalid transport type
+
+``ENVME_CONNECT_LOOKUP_SUBSYS_NAME``
+ failed to lookup subsystem name
+
+``ENVME_CONNECT_LOOKUP_SUBSYS``
+ failed to lookup subsystem
+
+``ENVME_CONNECT_ALREADY``
+ the connect attempt failed, already connected
+
+``ENVME_CONNECT_INVAL``
+ invalid arguments/configuration
+
+``ENVME_CONNECT_ADDRINUSE``
+ hostnqn already in use
+
+``ENVME_CONNECT_NODEV``
+ invalid interface
+
+``ENVME_CONNECT_OPNOTSUPP``
+ not supported
+
+
+.. c:function:: __u8 nvme_status_to_errno (int status, bool fabrics)
+
+ Converts nvme return status to errno
+
+**Parameters**
+
+``int status``
+ Return status from an nvme passthrough command
+
+``bool fabrics``
+ Set to true if :c:type:`status` is to a fabrics target.
+
+**Return**
+
+An errno representing the nvme status if it is an nvme status field,
+or unchanged status is < 0 since errno is already set.
+
+
+.. c:function:: const char * nvme_status_to_string (int status, bool fabrics)
+
+ Returns string describing nvme return status.
+
+**Parameters**
+
+``int status``
+ Return status from an nvme passthrough command
+
+``bool fabrics``
+ Set to true if :c:type:`status` is to a fabrics target.
+
+**Return**
+
+String representation of the nvme status if it is an nvme status field,
+or a standard errno string if status is < 0.
+
+
+.. c:function:: const char * nvme_errno_to_string (int err)
+
+ Returns string describing nvme connect failures
+
+**Parameters**
+
+``int err``
+ Returned error code from nvme_add_ctrl()
+
+**Return**
+
+String representation of the nvme connect error codes
+
+
+.. c:function:: void nvme_init_ctrl_list (struct nvme_ctrl_list *cntlist, __u16 num_ctrls, __u16 *ctrlist)
+
+ Initialize an nvme_ctrl_list structure from an array.
+
+**Parameters**
+
+``struct nvme_ctrl_list *cntlist``
+ The controller list structure to initialize
+
+``__u16 num_ctrls``
+ The number of controllers in the array, :c:type:`ctrlist`.
+
+``__u16 *ctrlist``
+ An array of controller identifiers in CPU native endian.
+
+**Description**
+
+This is intended to be used with any command that takes a controller list
+argument. See nvme_ns_attach_ctrls() and nvme_ns_detach().
+
+
+.. c:function:: void nvme_init_dsm_range (struct nvme_dsm_range *dsm, __u32 *ctx_attrs, __u32 *llbas, __u64 *slbas, __u16 nr_ranges)
+
+ Constructs a data set range structure
+
+**Parameters**
+
+``struct nvme_dsm_range *dsm``
+ DSM range array
+
+``__u32 *ctx_attrs``
+ Array of context attributes
+
+``__u32 *llbas``
+ Array of length in logical blocks
+
+``__u64 *slbas``
+ Array of starting logical blocks
+
+``__u16 nr_ranges``
+ The size of the dsm arrays
+
+**Description**
+
+Each array must be the same size of size 'nr_ranges'. This is intended to be
+used with constructing a payload for nvme_dsm().
+
+**Return**
+
+The nvme command status if a response was received or -errno
+otherwise.
+
+
+.. c:function:: void nvme_init_copy_range (struct nvme_copy_range *copy, __u16 *nlbs, __u64 *slbas, __u32 *eilbrts, __u32 *elbatms, __u32 *elbats, __u16 nr)
+
+ Constructs a copy range structure
+
+**Parameters**
+
+``struct nvme_copy_range *copy``
+ Copy range array
+
+``__u16 *nlbs``
+ Number of logical blocks
+
+``__u64 *slbas``
+ Starting LBA
+
+``__u32 *eilbrts``
+ Expected initial logical block reference tag
+
+``__u32 *elbatms``
+ Expected logical block application tag mask
+
+``__u32 *elbats``
+ Expected logical block application tag
+
+``__u16 nr``
+ Number of descriptors to construct
+
+
+.. c:function:: void nvme_init_copy_range_f1 (struct nvme_copy_range_f1 *copy, __u16 *nlbs, __u64 *slbas, __u64 *eilbrts, __u32 *elbatms, __u32 *elbats, __u16 nr)
+
+ Constructs a copy range f1 structure
+
+**Parameters**
+
+``struct nvme_copy_range_f1 *copy``
+ Copy range array
+
+``__u16 *nlbs``
+ Number of logical blocks
+
+``__u64 *slbas``
+ Starting LBA
+
+``__u64 *eilbrts``
+ Expected initial logical block reference tag
+
+``__u32 *elbatms``
+ Expected logical block application tag mask
+
+``__u32 *elbats``
+ Expected logical block application tag
+
+``__u16 nr``
+ Number of descriptors to construct
+
+
+.. c:function:: int nvme_get_feature_length (int fid, __u32 cdw11, __u32 *len)
+
+ Retreive the command payload length for a specific feature identifier
+
+**Parameters**
+
+``int fid``
+ Feature identifier, see :c:type:`enum nvme_features_id <nvme_features_id>`.
+
+``__u32 cdw11``
+ The cdw11 value may affect the transfer (only known fid is
+ ``NVME_FEAT_FID_HOST_ID``)
+
+``__u32 *len``
+ On success, set to this features payload length in bytes.
+
+**Return**
+
+0 on success, -1 with errno set to EINVAL if the function did not
+recognize :c:type:`fid`.
+
+
+.. c:function:: int nvme_get_directive_receive_length (enum nvme_directive_dtype dtype, enum nvme_directive_receive_doper doper, __u32 *len)
+
+ Get directive receive length
+
+**Parameters**
+
+``enum nvme_directive_dtype dtype``
+ Directive type, see :c:type:`enum nvme_directive_dtype <nvme_directive_dtype>`
+
+``enum nvme_directive_receive_doper doper``
+ Directive receive operation, see :c:type:`enum nvme_directive_receive_doper <nvme_directive_receive_doper>`
+
+``__u32 *len``
+ On success, set to this directives payload length in bytes.
+
+**Return**
+
+0 on success, -1 with errno set to EINVAL if the function did not
+recognize :c:type:`dtype` or :c:type:`doper`.
+
+
+.. c:function:: size_t get_entity_name (char *buffer, size_t bufsz)
+
+ Get Entity Name (ENAME).
+
+**Parameters**
+
+``char *buffer``
+ The buffer where the ENAME will be saved as an ASCII string.
+
+``size_t bufsz``
+ The size of **buffer**.
+
+**Description**
+
+Per TP8010, ENAME is defined as the name associated with the host (i.e.
+hostname).
+
+**Return**
+
+Number of characters copied to **buffer**.
+
+
+.. c:function:: size_t get_entity_version (char *buffer, size_t bufsz)
+
+ Get Entity Version (EVER).
+
+**Parameters**
+
+``char *buffer``
+ The buffer where the EVER will be saved as an ASCII string.
+
+``size_t bufsz``
+ The size of **buffer**.
+
+**Description**
+
+EVER is defined as the operating system name and version as an ASCII
+string. This function reads different files from the file system and
+builds a string as follows: [os type] [os release] [distro release]
+
+ E.g. "Linux 5.17.0-rc1 SLES 15.4"
+
+**Return**
+
+Number of characters copied to **buffer**.
+
+
+.. c:function:: char * kv_strip (char *kv)
+
+ Strip blanks from key value string
+
+**Parameters**
+
+``char *kv``
+ The key-value string to strip
+
+**Description**
+
+Strip leading/trailing blanks as well as trailing comments from the
+Key=Value string pointed to by **kv**.
+
+**Return**
+
+A pointer to the stripped string. Note that the original string,
+**kv**, gets modified.
+
+
+.. c:function:: char * kv_keymatch (const char *kv, const char *key)
+
+ Look for key in key value string
+
+**Parameters**
+
+``const char *kv``
+ The key=value string to search for the presence of **key**
+
+``const char *key``
+ The key to look for
+
+**Description**
+
+Look for **key** in the Key=Value pair pointed to by **k** and return a
+pointer to the Value if **key** is found.
+
+Check if **kv** starts with **key**. If it does then make sure that we
+have a whole-word match on the **key**, and if we do, return a pointer
+to the first character of value (i.e. skip leading spaces, tabs,
+and equal sign)
+
+**Return**
+
+A pointer to the first character of "value" if a match is found.
+NULL otherwise.
+
+
+.. c:function:: char * startswith (const char *s, const char *prefix)
+
+ Checks that a string starts with a given prefix.
+
+**Parameters**
+
+``const char *s``
+ The string to check
+
+``const char *prefix``
+ A string that **s** could be starting with
+
+**Return**
+
+If **s** starts with **prefix**, then return a pointer within **s** at
+the first character after the matched **prefix**. NULL otherwise.
+
+
+.. c:macro:: round_up
+
+``round_up (val, mult)``
+
+ Round a value **val** to the next multiple specified by **mult**.
+
+**Parameters**
+
+``val``
+ Value to round
+
+``mult``
+ Multiple to round to.
+
+**Description**
+
+usage: int x = round_up(13, sizeof(__u32)); // 13 -> 16
+
+
+.. c:function:: __u16 nvmf_exat_len (size_t val_len)
+
+ Return length rounded up by 4
+
+**Parameters**
+
+``size_t val_len``
+ Value lenght
+
+**Description**
+
+Return the size in bytes, rounded to a multiple of 4 (e.g., size of
+__u32), of the buffer needed to hold the exat value of size
+**val_len**.
+
+**Return**
+
+Lenght rounded up by 4
+
+
+.. c:function:: __u16 nvmf_exat_size (size_t val_len)
+
+ Return min aligned size to hold value
+
+**Parameters**
+
+``size_t val_len``
+ This is the length of the data to be copied to the "exatval"
+ field of a "struct nvmf_ext_attr".
+
+**Description**
+
+Return the size of the "struct nvmf_ext_attr" needed to hold
+a value of size **val_len**.
+
+**Return**
+
+The size in bytes, rounded to a multiple of 4 (i.e. size of
+__u32), of the "struct nvmf_ext_attr" required to hold a string of
+length **val_len**.
+
+
+.. c:function:: struct nvmf_ext_attr * nvmf_exat_ptr_next (struct nvmf_ext_attr *p)
+
+ Increment **p** to the next element in the array.
+
+**Parameters**
+
+``struct nvmf_ext_attr *p``
+ Pointer to an element of an array of "struct nvmf_ext_attr".
+
+**Description**
+
+Extended attributes are saved to an array of "struct nvmf_ext_attr"
+where each element of the array is of variable size. In order to
+move to the next element in the array one must increment the
+pointer to the current element (**p**) by the size of the current
+element.
+
+**Return**
+
+Pointer to the next element in the array.
+
+
+
+
+.. c:enum:: nvme_version
+
+ Selector for version to be returned by **nvme_get_version**
+
+**Constants**
+
+``NVME_VERSION_PROJECT``
+ Project release version
+
+``NVME_VERSION_GIT``
+ Git reference
+
+
+.. c:function:: const char * nvme_get_version (enum nvme_version type)
+
+ Return version libnvme string
+
+**Parameters**
+
+``enum nvme_version type``
+ Selects which version type (see **struct** nvme_version)
+
+**Return**
+
+Returns version string for known types or else "n/a"
+
+
diff --git a/doc/update-docs.sh b/doc/update-docs.sh
index 7765b9b..dfa1fd8 100755
--- a/doc/update-docs.sh
+++ b/doc/update-docs.sh
@@ -1,8 +1,11 @@
-#!/bin/sh -x
+#!/bin/sh
+# SPDX-License-Identifier: LGPL-2.1-or-later
DESTDIR=$(pwd)
+# build man docs
BUILDDIR="$(mktemp -d)"
+echo $BUILDDIR
trap 'rm -rf -- $BUILDDIR' EXIT
meson $BUILDDIR -Ddocs=man -Ddocs-build=true
@@ -13,6 +16,25 @@ mkdir $DESTDIR/doc/man
find $BUILDDIR/doc -maxdepth 1 -name '*.2' -exec cp {} $DESTDIR/doc/man \;
+# build ReST docs
+rm -rf -- $BUILDDIR
+BUILDDIR="$(mktemp -d)"
+echo $BUILDDIR
+trap 'rm -rf -- $BUILDDIR' EXIT
+
+meson $BUILDDIR -Ddocs=rst -Ddocs-build=true
+ninja -C $BUILDDIR
+
+rm -rf $DESTDIR/doc/rst/*.rst
+mkdir -p $DESTDIR/doc/rst
+
+find $BUILDDIR/doc/rst -maxdepth 1 -name '*.rst' -exec cp {} $DESTDIR/doc/rst \;
+
+cp $BUILDDIR/doc/conf.py $DESTDIR/doc
+cp $BUILDDIR/doc/index.rst $DESTDIR/doc
+cp $BUILDDIR/doc/config-schema.json $DESTDIR/doc
+
+# build html docs
# The HTML doc is not ready yet
# rm -rf $DESTDIR/doc/html
# cp -R $BUILDDIR/doc/html $DESTDIR/doc/
diff --git a/examples/discover-loop.c b/examples/discover-loop.c
index a577cd4..10c72b8 100644
--- a/examples/discover-loop.c
+++ b/examples/discover-loop.c
@@ -12,6 +12,8 @@
* system (no existing connection required). The output will look more
* interesting with more targets.
*/
+#define __SANE_USERSPACE_TYPES__
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/examples/discover-loop.py b/examples/discover-loop.py
index 94e8c72..22c51e6 100644
--- a/examples/discover-loop.py
+++ b/examples/discover-loop.py
@@ -1,4 +1,5 @@
#!/usr/bin/python3
+# SPDX-License-Identifier: Apache-2.0
'''
Example script for nvme discovery
diff --git a/examples/display-tree.c b/examples/display-tree.c
index f5bddb2..b9ea75f 100644
--- a/examples/display-tree.c
+++ b/examples/display-tree.c
@@ -11,6 +11,7 @@
* selected attributes for each component.
*/
#include <stdio.h>
+#include <inttypes.h>
#include <libnvme.h>
int main()
@@ -34,7 +35,7 @@ int main()
nvme_subsystem_get_nqn(s));
nvme_subsystem_for_each_ns_safe(s, n, _n) {
- printf("%c |-- %s lba size:%d lba max:%lu\n",
+ printf("%c |-- %s lba size:%d lba max:%" PRIu64 "\n",
_s ? '|' : ' ',
nvme_ns_get_name(n),
nvme_ns_get_lba_size(n),
@@ -50,7 +51,7 @@ int main()
nvme_ctrl_get_state(c));
nvme_ctrl_for_each_ns_safe(c, n, _n)
- printf("%c %c %c-- %s lba size:%d lba max:%lu\n",
+ printf("%c %c %c-- %s lba size:%d lba max:%" PRIu64 "\n",
_s ? '|' : ' ', _c ? '|' : ' ',
_n ? '|' : '`',
nvme_ns_get_name(n),
diff --git a/examples/meson.build b/examples/meson.build
index f1f8ee5..fcea3fb 100644
--- a/examples/meson.build
+++ b/examples/meson.build
@@ -8,27 +8,34 @@
executable(
'telemetry-listen',
['telemetry-listen.c'],
- link_with: libnvme,
+ dependencies: libnvme_dep,
include_directories: [incdir, internal_incdir]
)
executable(
'display-columnar',
['display-columnar.c'],
- link_with: libnvme,
+ dependencies: libnvme_dep,
include_directories: [incdir, internal_incdir]
)
executable(
'display-tree',
['display-tree.c'],
- link_with: libnvme,
+ dependencies: libnvme_dep,
include_directories: [incdir, internal_incdir]
)
executable(
'discover-loop',
['discover-loop.c'],
- link_with: libnvme,
+ dependencies: libnvme_dep,
+ include_directories: [incdir, internal_incdir]
+)
+
+executable(
+ 'mi-mctp',
+ ['mi-mctp.c'],
+ dependencies: libnvme_mi_dep,
include_directories: [incdir, internal_incdir]
)
diff --git a/examples/mi-mctp.c b/examples/mi-mctp.c
new file mode 100644
index 0000000..ac0ecb3
--- /dev/null
+++ b/examples/mi-mctp.c
@@ -0,0 +1,772 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/**
+ * This file is part of libnvme.
+ * Copyright (c) 2021 Code Construct Pty Ltd.
+ *
+ * Authors: Jeremy Kerr <jk@codeconstruct.com.au>
+ */
+
+/**
+ * mi-mctp: open a MI connection over MCTP, and query controller info
+ */
+
+#include <assert.h>
+#include <ctype.h>
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+
+#include <libnvme-mi.h>
+
+#include <ccan/array_size/array_size.h>
+#include <ccan/endian/endian.h>
+
+static void show_port_pcie(struct nvme_mi_read_port_info *port)
+{
+ printf(" PCIe max payload: 0x%x\n", 0x80 << port->pcie.mps);
+ printf(" PCIe link speeds: 0x%02x\n", port->pcie.sls);
+ printf(" PCIe current speed: 0x%02x\n", port->pcie.cls);
+ printf(" PCIe max link width: 0x%02x\n", port->pcie.mlw);
+ printf(" PCIe neg link width: 0x%02x\n", port->pcie.nlw);
+ printf(" PCIe port: 0x%02x\n", port->pcie.pn);
+}
+
+static void show_port_smbus(struct nvme_mi_read_port_info *port)
+{
+ printf(" SMBus address: 0x%02x\n", port->smb.vpd_addr);
+ printf(" VPD access freq: 0x%02x\n", port->smb.mvpd_freq);
+ printf(" MCTP address: 0x%02x\n", port->smb.mme_addr);
+ printf(" MCTP access freq: 0x%02x\n", port->smb.mme_freq);
+ printf(" NVMe basic management: %s\n",
+ (port->smb.nvmebm & 0x1) ? "enabled" : "disabled");
+}
+
+static struct {
+ int typeid;
+ const char *name;
+ void (*fn)(struct nvme_mi_read_port_info *);
+} port_types[] = {
+ { 0x00, "inactive", NULL },
+ { 0x01, "PCIe", show_port_pcie },
+ { 0x02, "SMBus", show_port_smbus },
+};
+
+static int show_port(nvme_mi_ep_t ep, int portid)
+{
+ void (*show_fn)(struct nvme_mi_read_port_info *);
+ struct nvme_mi_read_port_info port;
+ const char *typestr;
+ int rc;
+
+ rc = nvme_mi_mi_read_mi_data_port(ep, portid, &port);
+ if (rc)
+ return rc;
+
+ if (port.portt < ARRAY_SIZE(port_types)) {
+ show_fn = port_types[port.portt].fn;
+ typestr = port_types[port.portt].name;
+ } else {
+ show_fn = NULL;
+ typestr = "INVALID";
+ }
+
+ printf(" port %d\n", portid);
+ printf(" type %s[%d]\n", typestr, port.portt);
+ printf(" MCTP MTU: %d\n", port.mmctptus);
+ printf(" MEB size: %d\n", port.meb);
+
+ if (show_fn)
+ show_fn(&port);
+
+ return 0;
+}
+
+int do_info(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_nvm_ss_health_status ss_health;
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int i, rc;
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ if (rc) {
+ warn("can't perform Read MI Data operation");
+ return -1;
+ }
+
+ printf("NVMe MI subsys info:\n");
+ printf(" num ports: %d\n", ss_info.nump + 1);
+ printf(" major ver: %d\n", ss_info.mjr);
+ printf(" minor ver: %d\n", ss_info.mnr);
+
+ printf("NVMe MI port info:\n");
+ for (i = 0; i <= ss_info.nump; i++)
+ show_port(ep, i);
+
+ rc = nvme_mi_mi_subsystem_health_status_poll(ep, true, &ss_health);
+ if (rc)
+ err(EXIT_FAILURE, "can't perform Health Status Poll operation");
+
+ printf("NVMe MI subsys health:\n");
+ printf(" subsystem status: 0x%x\n", ss_health.nss);
+ printf(" smart warnings: 0x%x\n", ss_health.sw);
+ printf(" composite temp: %d\n", ss_health.ctemp);
+ printf(" drive life used: %d%%\n", ss_health.pdlu);
+ printf(" controller status: 0x%04x\n", le16_to_cpu(ss_health.pdlu));
+
+ return 0;
+}
+
+static int show_ctrl(nvme_mi_ep_t ep, uint16_t ctrl_id)
+{
+ struct nvme_mi_read_ctrl_info ctrl;
+ int rc;
+
+ rc = nvme_mi_mi_read_mi_data_ctrl(ep, ctrl_id, &ctrl);
+ if (rc)
+ return rc;
+
+ printf(" Controller id: %d\n", ctrl_id);
+ printf(" port id: %d\n", ctrl.portid);
+ if (ctrl.prii & 0x1) {
+ uint16_t bdfn = le16_to_cpu(ctrl.pri);
+ printf(" PCIe routing valid\n");
+ printf(" PCIe bus: 0x%02x\n", bdfn >> 8);
+ printf(" PCIe dev: 0x%02x\n", bdfn >> 3 & 0x1f);
+ printf(" PCIe fn : 0x%02x\n", bdfn & 0x7);
+ } else {
+ printf(" PCIe routing invalid\n");
+ }
+ printf(" PCI vendor: %04x\n", le16_to_cpu(ctrl.vid));
+ printf(" PCI device: %04x\n", le16_to_cpu(ctrl.did));
+ printf(" PCI subsys vendor: %04x\n", le16_to_cpu(ctrl.ssvid));
+ printf(" PCI subsys device: %04x\n", le16_to_cpu(ctrl.ssvid));
+
+ return 0;
+}
+
+static int do_controllers(nvme_mi_ep_t ep)
+{
+ struct nvme_ctrl_list ctrl_list;
+ int rc, i;
+
+ rc = nvme_mi_mi_read_mi_data_ctrl_list(ep, 0, &ctrl_list);
+ if (rc) {
+ warnx("Can't perform Controller List operation");
+ return rc;
+ }
+
+ printf("NVMe controller list:\n");
+ for (i = 0; i < le16_to_cpu(ctrl_list.num); i++) {
+ uint16_t id = le16_to_cpu(ctrl_list.identifier[i]);
+ show_ctrl(ep, id);
+ }
+ return 0;
+}
+
+static const char *__copy_id_str(const void *field, size_t size,
+ char *buf, size_t buf_size)
+{
+ assert(size < buf_size);
+ strncpy(buf, field, size);
+ buf[size] = '\0';
+ return buf;
+}
+
+#define copy_id_str(f,b) __copy_id_str(f, sizeof(f), b, sizeof(b))
+
+int do_identify(nvme_mi_ep_t ep, int argc, char **argv)
+{
+ struct nvme_identify_args id_args = { 0 };
+ struct nvme_mi_ctrl *ctrl;
+ struct nvme_id_ctrl id;
+ uint16_t ctrl_id;
+ char buf[41];
+ bool partial;
+ int rc, tmp;
+
+ if (argc < 2) {
+ fprintf(stderr, "no controller ID specified\n");
+ return -1;
+ }
+
+ tmp = atoi(argv[1]);
+ if (tmp < 0 || tmp > 0xffff) {
+ fprintf(stderr, "invalid controller ID\n");
+ return -1;
+ }
+
+ ctrl_id = tmp & 0xffff;
+
+ partial = argc > 2 && !strcmp(argv[2], "--partial");
+
+ ctrl = nvme_mi_init_ctrl(ep, tmp);
+ if (!ctrl) {
+ warn("can't create controller");
+ return -1;
+ }
+
+ id_args.data = &id;
+ id_args.args_size = sizeof(id_args);
+ id_args.cns = NVME_IDENTIFY_CNS_CTRL;
+ id_args.nsid = NVME_NSID_NONE;
+ id_args.cntid = ctrl_id;
+ id_args.csi = NVME_CSI_NVM;
+
+ /* for this example code, we can either do a full or partial identify;
+ * since we're only printing the fields before the 'rab' member,
+ * these will be equivalent, aside from the size of the MI
+ * response.
+ */
+ if (partial) {
+ rc = nvme_mi_admin_identify_partial(ctrl, &id_args, 0,
+ offsetof(struct nvme_id_ctrl, rab));
+ } else {
+ rc = nvme_mi_admin_identify(ctrl, &id_args);
+ }
+
+ if (rc) {
+ warn("can't perform Admin Identify command");
+ return -1;
+ }
+
+ printf("NVMe Controller %d identify\n", ctrl_id);
+ printf(" PCI vendor: %04x\n", le16_to_cpu(id.vid));
+ printf(" PCI subsys vendor: %04x\n", le16_to_cpu(id.ssvid));
+ printf(" Serial number: %s\n", copy_id_str(id.sn, buf));
+ printf(" Model number: %s\n", copy_id_str(id.mn, buf));
+ printf(" Firmware rev: %s\n", copy_id_str(id.fr, buf));
+
+ return 0;
+}
+
+void fhexdump(FILE *fp, const unsigned char *buf, int len)
+{
+ const int row_len = 16;
+ int i, j;
+
+ for (i = 0; i < len; i += row_len) {
+ char hbuf[row_len * strlen("00 ") + 1];
+ char cbuf[row_len + strlen("|") + 1];
+
+ for (j = 0; (j < row_len) && ((i+j) < len); j++) {
+ unsigned char c = buf[i + j];
+
+ sprintf(hbuf + j * 3, "%02x ", c);
+
+ if (!isprint(c))
+ c = '.';
+
+ sprintf(cbuf + j, "%c", c);
+ }
+
+ strcat(cbuf, "|");
+
+ fprintf(fp, "%08x %*s |%s\n", i,
+ 0 - (int)sizeof(hbuf) + 1, hbuf, cbuf);
+ }
+}
+
+void hexdump(const unsigned char *buf, int len)
+{
+ fhexdump(stdout, buf, len);
+}
+
+int do_get_log_page(nvme_mi_ep_t ep, int argc, char **argv)
+{
+ struct nvme_get_log_args args = { 0 };
+ struct nvme_mi_ctrl *ctrl;
+ uint8_t buf[512];
+ uint16_t ctrl_id;
+ int rc, tmp;
+
+ if (argc < 2) {
+ fprintf(stderr, "no controller ID specified\n");
+ return -1;
+ }
+
+ tmp = atoi(argv[1]);
+ if (tmp < 0 || tmp > 0xffff) {
+ fprintf(stderr, "invalid controller ID\n");
+ return -1;
+ }
+
+ ctrl_id = tmp & 0xffff;
+
+ args.args_size = sizeof(args);
+ args.log = buf;
+ args.len = sizeof(buf);
+
+ if (argc > 2) {
+ tmp = atoi(argv[2]);
+ args.lid = tmp & 0xff;
+ } else {
+ args.lid = 0x1;
+ }
+
+ ctrl = nvme_mi_init_ctrl(ep, ctrl_id);
+ if (!ctrl) {
+ warn("can't create controller");
+ return -1;
+ }
+
+ rc = nvme_mi_admin_get_log_page(ctrl, &args);
+ if (rc) {
+ warn("can't perform Get Log page command");
+ return -1;
+ }
+
+ printf("Get log page (log id = 0x%02x) data:\n", args.lid);
+ hexdump(buf, args.len);
+
+ return 0;
+}
+
+int do_admin_raw(nvme_mi_ep_t ep, int argc, char **argv)
+{
+ struct nvme_mi_admin_req_hdr req;
+ struct nvme_mi_admin_resp_hdr *resp;
+ struct nvme_mi_ctrl *ctrl;
+ size_t resp_data_len;
+ unsigned long tmp;
+ uint8_t buf[512];
+ uint16_t ctrl_id;
+ uint8_t opcode;
+ __le32 *cdw;
+ int i, rc;
+
+ if (argc < 2) {
+ fprintf(stderr, "no controller ID specified\n");
+ return -1;
+ }
+
+ if (argc < 3) {
+ fprintf(stderr, "no opcode specified\n");
+ return -1;
+ }
+
+ tmp = atoi(argv[1]);
+ if (tmp < 0 || tmp > 0xffff) {
+ fprintf(stderr, "invalid controller ID\n");
+ return -1;
+ }
+ ctrl_id = tmp & 0xffff;
+
+ tmp = atoi(argv[2]);
+ if (tmp < 0 || tmp > 0xff) {
+ fprintf(stderr, "invalid opcode\n");
+ return -1;
+ }
+ opcode = tmp & 0xff;
+
+ memset(&req, 0, sizeof(req));
+ req.opcode = opcode;
+ req.ctrl_id = cpu_to_le16(ctrl_id);
+
+ /* The cdw10 - cdw16 fields are contiguous in req; set from argv. */
+ cdw = (void *)&req + offsetof(typeof(req), cdw10);
+ for (i = 0; i < 6; i++) {
+ if (argc >= 4 + i)
+ tmp = strtoul(argv[3 + i], NULL, 0);
+ else
+ tmp = 0;
+ *cdw = cpu_to_le32(tmp & 0xffffffff);
+ cdw++;
+ }
+
+ printf("Admin request:\n");
+ printf(" opcode: 0x%02x\n", req.opcode);
+ printf(" ctrl: 0x%04x\n", le16_to_cpu(req.ctrl_id));
+ printf(" cdw10: 0x%08x\n", le32_to_cpu(req.cdw10));
+ printf(" cdw11: 0x%08x\n", le32_to_cpu(req.cdw11));
+ printf(" cdw12: 0x%08x\n", le32_to_cpu(req.cdw12));
+ printf(" cdw13: 0x%08x\n", le32_to_cpu(req.cdw13));
+ printf(" cdw14: 0x%08x\n", le32_to_cpu(req.cdw14));
+ printf(" cdw15: 0x%08x\n", le32_to_cpu(req.cdw15));
+ printf(" raw:\n");
+ hexdump((void *)&req, sizeof(req));
+
+ memset(buf, 0, sizeof(buf));
+ resp = (void *)buf;
+
+ ctrl = nvme_mi_init_ctrl(ep, ctrl_id);
+ if (!ctrl) {
+ warn("can't create controller");
+ return -1;
+ }
+
+ resp_data_len = sizeof(buf) - sizeof(*resp);
+
+ rc = nvme_mi_admin_xfer(ctrl, &req, 0, resp, 0, &resp_data_len);
+ if (rc) {
+ warn("nvme_admin_xfer failed: %d", rc);
+ return -1;
+ }
+
+ printf("Admin response:\n");
+ printf(" Status: 0x%02x\n", resp->status);
+ printf(" cdw0: 0x%08x\n", le32_to_cpu(resp->cdw0));
+ printf(" cdw1: 0x%08x\n", le32_to_cpu(resp->cdw1));
+ printf(" cdw3: 0x%08x\n", le32_to_cpu(resp->cdw3));
+ printf(" data [%zd bytes]\n", resp_data_len);
+
+ hexdump(buf + sizeof(*resp), resp_data_len);
+ return 0;
+}
+
+static struct {
+ uint8_t id;
+ const char *name;
+} sec_protos[] = {
+ { 0x00, "Security protocol information" },
+ { 0xea, "NVMe" },
+ { 0xec, "JEDEC Universal Flash Storage" },
+ { 0xed, "SDCard TrustedFlash Security" },
+ { 0xee, "IEEE 1667" },
+ { 0xef, "ATA Device Server Password Security" },
+};
+
+static const char *sec_proto_description(uint8_t id)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(sec_protos); i++) {
+ if (sec_protos[i].id == id)
+ return sec_protos[i].name;
+ }
+
+ if (id >= 0xf0)
+ return "Vendor specific";
+
+ return "unknown";
+}
+
+int do_security_info(nvme_mi_ep_t ep, int argc, char **argv)
+{
+ struct nvme_security_receive_args args = { 0 };
+ nvme_mi_ctrl_t ctrl;
+ int i, rc, n_proto;
+ unsigned long tmp;
+ uint16_t ctrl_id;
+ struct {
+ uint8_t rsvd[6];
+ uint16_t len;
+ uint8_t protocols[256];
+ } proto_info;
+
+ if (argc != 2) {
+ fprintf(stderr, "no controller ID specified\n");
+ return -1;
+ }
+
+ tmp = atoi(argv[1]);
+ if (tmp < 0 || tmp > 0xffff) {
+ fprintf(stderr, "invalid controller ID\n");
+ return -1;
+ }
+
+ ctrl_id = tmp & 0xffff;
+
+ ctrl = nvme_mi_init_ctrl(ep, ctrl_id);
+ if (!ctrl) {
+ warn("can't create controller");
+ return -1;
+ }
+
+ /* protocol 0x00, spsp 0x0000: retrieve supported protocols */
+ args.args_size = sizeof(args);
+ args.data = &proto_info;
+ args.data_len = sizeof(proto_info);
+
+ rc = nvme_mi_admin_security_recv(ctrl, &args);
+ if (rc) {
+ warnx("can't perform Security Receive command: rc %d", rc);
+ return -1;
+ }
+
+ if (args.data_len < 6) {
+ warnx("Short response in security receive command (%d bytes)",
+ args.data_len);
+ return -1;
+ }
+
+ n_proto = be16_to_cpu(proto_info.len);
+ if (args.data_len < 6 + n_proto) {
+ warnx("Short response in security receive command (%d bytes), "
+ "for %d protocols", args.data_len, n_proto);
+ return -1;
+ }
+
+ printf("Supported protocols:\n");
+ for (i = 0; i < n_proto; i++) {
+ uint8_t id = proto_info.protocols[i];
+ printf(" 0x%02x: %s\n", id, sec_proto_description(id));
+ }
+
+ return 0;
+}
+
+struct {
+ enum nvme_mi_config_smbus_freq id;
+ const char *str;
+} smbus_freqs[] = {
+ { NVME_MI_CONFIG_SMBUS_FREQ_100kHz, "100k" },
+ { NVME_MI_CONFIG_SMBUS_FREQ_400kHz, "400k" },
+ { NVME_MI_CONFIG_SMBUS_FREQ_1MHz, "1M" },
+};
+
+static const char *smbus_freq_str(enum nvme_mi_config_smbus_freq freq)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(smbus_freqs); i++) {
+ if (smbus_freqs[i].id == freq)
+ return smbus_freqs[i].str;
+ }
+
+ return NULL;
+}
+
+static int smbus_freq_val(const char *str, enum nvme_mi_config_smbus_freq *freq)
+{
+ unsigned int i;
+
+ for (i = 0; i < ARRAY_SIZE(smbus_freqs); i++) {
+ if (!strcmp(smbus_freqs[i].str, str)) {
+ *freq = smbus_freqs[i].id;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+int do_config_get(nvme_mi_ep_t ep, int argc, char **argv)
+{
+ enum nvme_mi_config_smbus_freq freq;
+ uint16_t mtu;
+ uint8_t port;
+ int rc;
+
+ if (argc > 1)
+ port = atoi(argv[1]) & 0xff;
+ else
+ port = 0;
+
+ rc = nvme_mi_mi_config_get_smbus_freq(ep, port, &freq);
+ if (rc) {
+ warn("can't query SMBus freq for port %d\n", port);
+ } else {
+ const char *fstr = smbus_freq_str(freq);
+ printf("SMBus access frequency (port %d): %s [0x%x]\n", port,
+ fstr ?: "unknown", freq);
+ }
+
+ rc = nvme_mi_mi_config_get_mctp_mtu(ep, port, &mtu);
+ if (rc)
+ warn("can't query MCTP MTU for port %d\n", port);
+ else
+ printf("MCTP MTU (port %d): %d\n", port, mtu);
+
+ return 0;
+}
+
+int do_config_set(nvme_mi_ep_t ep, int argc, char **argv)
+{
+ const char *name, *val;
+ uint8_t port;
+ int rc;
+
+ if (argc != 4) {
+ fprintf(stderr, "config set requires <port> <type> <val>\n");
+ return -1;
+ }
+
+ port = atoi(argv[1]) & 0xff;
+ name = argv[2];
+ val = argv[3];
+
+ if (!strcmp(name, "freq")) {
+ enum nvme_mi_config_smbus_freq freq;
+ rc = smbus_freq_val(val, &freq);
+ if (rc) {
+ fprintf(stderr, "unknown SMBus freq %s. "
+ "Try 100k, 400k or 1M\n", val);
+ return -1;
+ }
+ rc = nvme_mi_mi_config_set_smbus_freq(ep, port, freq);
+
+ } else if (!strcmp(name, "mtu")) {
+ uint16_t mtu;
+ mtu = atoi(val) & 0xffff;
+ /* controllers should reject this, but prevent the potential
+ * footgun of disabling futher comunication with the device
+ */
+ if (mtu < 64) {
+ fprintf(stderr, "MTU value too small\n");
+ return -1;
+ }
+ rc = nvme_mi_mi_config_set_mctp_mtu(ep, port, mtu);
+
+ } else {
+ fprintf(stderr, "Invalid configuration '%s', "
+ "try freq or mtu\n", name);
+ return -1;
+ }
+
+ if (rc)
+ fprintf(stderr, "config set failed with status %d\n", rc);
+
+ return rc;
+}
+
+enum action {
+ ACTION_INFO,
+ ACTION_CONTROLLERS,
+ ACTION_IDENTIFY,
+ ACTION_GET_LOG_PAGE,
+ ACTION_ADMIN_RAW,
+ ACTION_SECURITY_INFO,
+ ACTION_CONFIG_GET,
+ ACTION_CONFIG_SET,
+};
+
+static int do_action_endpoint(enum action action, nvme_mi_ep_t ep, int argc, char** argv)
+{
+ int rc;
+
+ switch (action) {
+ case ACTION_INFO:
+ rc = do_info(ep);
+ break;
+ case ACTION_CONTROLLERS:
+ rc = do_controllers(ep);
+ break;
+ case ACTION_IDENTIFY:
+ rc = do_identify(ep, argc, argv);
+ break;
+ case ACTION_GET_LOG_PAGE:
+ rc = do_get_log_page(ep, argc, argv);
+ break;
+ case ACTION_ADMIN_RAW:
+ rc = do_admin_raw(ep, argc, argv);
+ break;
+ case ACTION_SECURITY_INFO:
+ rc = do_security_info(ep, argc, argv);
+ break;
+ case ACTION_CONFIG_GET:
+ rc = do_config_get(ep, argc, argv);
+ break;
+ case ACTION_CONFIG_SET:
+ rc = do_config_set(ep, argc, argv);
+ break;
+ }
+ return rc;
+}
+
+int main(int argc, char **argv)
+{
+ enum action action;
+ nvme_root_t root;
+ nvme_mi_ep_t ep;
+ bool dbus = false, usage = true;
+ uint8_t eid;
+ int rc = 0, net;
+
+ if (argc >= 2 && strcmp(argv[1], "dbus") == 0) {
+ usage = false;
+ dbus= true;
+ argv += 1;
+ argc -= 1;
+ } else if (argc >= 3) {
+ usage = false;
+ net = atoi(argv[1]);
+ eid = atoi(argv[2]) & 0xff;
+ argv += 2;
+ argc -= 2;
+ }
+
+ if (usage) {
+ fprintf(stderr,
+ "usage: %s <net> <eid> [action] [action args]\n"
+ " %s 'dbus' [action] [action args]\n",
+ argv[0], argv[0]);
+ fprintf(stderr, "where action is:\n"
+ " info\n"
+ " controllers\n"
+ " identify <controller-id> [--partial]\n"
+ " get-log-page <controller-id> [<log-id>]\n"
+ " admin <controller-id> <opcode> [<cdw10>, <cdw11>, ...]\n"
+ " security-info <controller-id>\n"
+ " get-config [port]\n"
+ " set-config <port> <type> <val>\n"
+ "\n"
+ " 'dbus' target will query D-Bus for known MCTP endpoints\n"
+ );
+ return EXIT_FAILURE;
+ }
+
+ if (argc == 1) {
+ action = ACTION_INFO;
+ } else {
+ char *action_str = argv[1];
+ argc--;
+ argv++;
+
+ if (!strcmp(action_str, "info")) {
+ action = ACTION_INFO;
+ } else if (!strcmp(action_str, "controllers")) {
+ action = ACTION_CONTROLLERS;
+ } else if (!strcmp(action_str, "identify")) {
+ action = ACTION_IDENTIFY;
+ } else if (!strcmp(action_str, "get-log-page")) {
+ action = ACTION_GET_LOG_PAGE;
+ } else if (!strcmp(action_str, "admin")) {
+ action = ACTION_ADMIN_RAW;
+ } else if (!strcmp(action_str, "security-info")) {
+ action = ACTION_SECURITY_INFO;
+ } else if (!strcmp(action_str, "get-config")) {
+ action = ACTION_CONFIG_GET;
+ } else if (!strcmp(action_str, "set-config")) {
+ action = ACTION_CONFIG_SET;
+ } else {
+ fprintf(stderr, "invalid action '%s'\n", action_str);
+ return EXIT_FAILURE;
+ }
+ }
+ if (dbus) {
+ nvme_root_t root;
+ int i = 0;
+
+ root = nvme_mi_scan_mctp();
+ if (!root)
+ errx(EXIT_FAILURE, "can't scan D-Bus entries");
+
+ nvme_mi_for_each_endpoint(root, ep) i++;
+ printf("Found %d endpoints in D-Bus:\n", i);
+ nvme_mi_for_each_endpoint(root, ep) {
+ char *desc = nvme_mi_endpoint_desc(ep);
+ printf("%s\n", desc);
+ rc = do_action_endpoint(action, ep, argc, argv);
+ printf("---\n");
+ free(desc);
+ }
+ nvme_mi_free_root(root);
+ } else {
+ root = nvme_mi_create_root(stderr, DEFAULT_LOGLEVEL);
+ if (!root)
+ err(EXIT_FAILURE, "can't create NVMe root");
+
+ ep = nvme_mi_open_mctp(root, net, eid);
+ if (!ep)
+ errx(EXIT_FAILURE, "can't open MCTP endpoint %d:%d", net, eid);
+ rc = do_action_endpoint(action, ep, argc, argv);
+ nvme_mi_close(ep);
+ nvme_mi_free_root(root);
+ }
+
+ return rc ? EXIT_FAILURE : EXIT_SUCCESS;
+}
+
+
diff --git a/examples/telemetry-listen.c b/examples/telemetry-listen.c
index 746992b..ec5edb3 100644
--- a/examples/telemetry-listen.c
+++ b/examples/telemetry-listen.c
@@ -55,7 +55,6 @@ static void save_telemetry(nvme_ctrl_t c)
free(log);
return;
}
- log_size = (le16_to_cpu(log->dalb3) + 1) * NVME_LOG_TELEM_BLOCK_SIZE;
fd = open(buf, O_CREAT|O_WRONLY, S_IRUSR|S_IRGRP);
if (fd < 0) {
@@ -67,7 +66,7 @@ static void save_telemetry(nvme_ctrl_t c)
if (ret < 0)
printf("failed to write telemetry log\n");
else
- printf("telemetry log save as %s, wrote:%d size:%ld\n", buf,
+ printf("telemetry log save as %s, wrote:%d size:%zd\n", buf,
ret, log_size);
close(fd);
free(log);
@@ -77,8 +76,10 @@ static void check_telemetry(nvme_ctrl_t c, int ufd)
{
char buf[0x1000] = { 0 };
char *p, *ptr;
+ int len;
- if (read(ufd, buf, sizeof(buf)) < 0)
+ len = read(ufd, buf, sizeof(buf) - 1);
+ if (len < 0)
return;
ptr = buf;
@@ -140,7 +141,7 @@ int main()
nvme_subsystem_for_each_ctrl(s, c)
i++;
- e = calloc(i, sizeof(e));
+ e = calloc(i, sizeof(struct events));
FD_ZERO(&fds);
i = 0;
diff --git a/libnvme/__init__.py b/libnvme/__init__.py
index e69de29..b2fe8dd 100644
--- a/libnvme/__init__.py
+++ b/libnvme/__init__.py
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+#
+# This file is part of libnvme.
+# Copyright (c) 2022 Dell Inc.
+#
+# Authors: Martin Belanger <Martin.Belanger@dell.com>
+
+__version__ = @PROJECT_VERSION@
+__git_version__ = @GIT_VERSION@
diff --git a/libnvme/meson.build b/libnvme/meson.build
index c95444e..e9589fc 100644
--- a/libnvme/meson.build
+++ b/libnvme/meson.build
@@ -29,9 +29,9 @@ if have_python_support
pynvme_clib = python3.extension_module(
'_nvme',
pymod_swig[1],
- dependencies : py3_dep,
+ dependencies : [libnvme_dep, py3_dep],
include_directories: [incdir, internal_incdir],
- link_with: [libnvme, libccan],
+ link_with: [libccan],
install: true,
subdir: 'libnvme',
)
@@ -46,7 +46,7 @@ if have_python_support
configure_file(
input: '__init__.py',
output: '__init__.py',
- copy: true,
+ configuration: conf,
install_dir: python3.get_install_dir(pure: false, subdir: 'libnvme'),
)
diff --git a/libnvme/nvme.i b/libnvme/nvme.i
index ec680be..a295068 100644
--- a/libnvme/nvme.i
+++ b/libnvme/nvme.i
@@ -269,6 +269,8 @@ static void PyDict_SetItemStringDecRef(PyObject *p, const char *key, PyObject *v
PyDict_SetItemStringDecRef(entry, "cntlid", val);
val = PyLong_FromLong(e->asqsz);
PyDict_SetItemStringDecRef(entry, "asqsz", val);
+ val = PyLong_FromLong(e->eflags);
+ PyDict_SetItemStringDecRef(entry, "eflags", val);
PyList_SetItem(obj, i, entry); /* steals ref. to entry */
}
$result = obj;
diff --git a/libnvme/tests/create-ctrl-obj.py b/libnvme/tests/create-ctrl-obj.py
index 51915cc..f7b5f41 100755
--- a/libnvme/tests/create-ctrl-obj.py
+++ b/libnvme/tests/create-ctrl-obj.py
@@ -1,4 +1,5 @@
#!/usr/bin/env python3
+# SPDX-License-Identifier: LGPL-2.1-or-later
import sys
import pprint
from libnvme import nvme
diff --git a/meson-vcs-tag.sh b/meson-vcs-tag.sh
new file mode 100755
index 0000000..8ce6924
--- /dev/null
+++ b/meson-vcs-tag.sh
@@ -0,0 +1,17 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+set -eu
+set -o pipefail
+
+dir="${1:?}"
+fallback="${2:?}"
+
+# Apparently git describe has a bug where it always considers the work-tree
+# dirty when invoked with --git-dir (even though 'git status' is happy). Work
+# around this issue by cd-ing to the source directory.
+cd "$dir"
+# Check that we have either .git/ (a normal clone) or a .git file (a work-tree)
+# and that we don't get confused if a tarball is extracted in a higher-level
+# git repository.
+[ -e .git ] && git describe --abbrev=7 --dirty=+ 2>/dev/null | sed 's/^v//' || echo "$fallback"
diff --git a/meson.build b/meson.build
index da7d05e..f64bd7a 100644
--- a/meson.build
+++ b/meson.build
@@ -6,10 +6,10 @@
# Authors: Martin Belanger <Martin.Belanger@dell.com>
#
project(
- 'libnvme', ['c', 'cpp'],
+ 'libnvme', ['c'],
meson_version: '>= 0.47.0',
- version: '1.0',
- license: 'LGPLv2+',
+ version: '1.1',
+ license: 'LGPL-2.1-or-later',
default_options: [
'c_std=gnu99',
'warning_level=1',
@@ -22,6 +22,7 @@ library_version = meson.project_version() + '.0'
################################################################################
cc = meson.get_compiler('c')
+cxx_available = add_languages('cpp', required: false)
prefixdir = get_option('prefix')
libdir = join_paths(prefixdir, get_option('libdir'))
@@ -36,10 +37,22 @@ pkgconfiglibdir = get_option('pkgconfiglibdir') == '' ? join_paths(libdir, 'pkgc
################################################################################
conf = configuration_data()
+version_tag = get_option('version-tag')
+if version_tag != ''
+ conf.set('GIT_VERSION', '"@0@"'.format(version_tag))
+else
+ r = run_command('meson-vcs-tag.sh',
+ meson.current_source_dir(),
+ meson.project_version(),
+ check: true)
+ conf.set('GIT_VERSION', '"@0@"'.format(r.stdout().strip()))
+endif
+conf.set('PROJECT_VERSION', '"@0@"'.format(meson.project_version()))
+
conf.set('SYSCONFDIR', '"@0@"'.format(sysconfdir))
# Check for libuuid availability
-libuuid_dep = dependency('uuid', required: true)
+libuuid_dep = dependency('uuid', required: true, fallback : ['uuid', 'uuid_dep'])
conf.set('CONFIG_LIBUUID', libuuid_dep.found(), description: 'Is libuuid required?')
# Check for json-c availability
@@ -65,6 +78,10 @@ if openssl_dep.found()
description: 'OpenSSL version 3.x')
endif
+# Check for libsystemd availability. Optional, only required for MCTP dbus scan
+libsystemd_dep = dependency('libsystemd', version: '>219', required: false)
+conf.set('CONFIG_LIBSYSTEMD', libsystemd_dep.found(), description: 'Is libsystemd(>219) available?')
+
# local (cross-compilable) implementations of ccan configure steps
conf.set10(
'HAVE_BUILTIN_TYPES_COMPATIBLE_P',
@@ -112,12 +129,12 @@ conf.set10(
)
conf.set10(
'HAVE_LITTLE_ENDIAN',
- build_machine.endian() == 'little',
+ host_machine.endian() == 'little',
description: 'Building for little-endian'
)
conf.set10(
'HAVE_BIG_ENDIAN',
- build_machine.endian() == 'big',
+ host_machine.endian() == 'big',
description: 'Building for big-endian'
)
conf.set10(
@@ -143,6 +160,14 @@ conf.set10(
),
description: 'Is isblank() available?'
)
+conf.set10(
+ 'HAVE_LINUX_MCTP_H',
+ cc.compiles(
+ '''#include <linux/mctp.h>''',
+ name: 'linux/mctp.h'
+ ),
+ description: 'Is linux/mctp.h include-able?'
+)
################################################################################
substs = configuration_data()
diff --git a/meson_options.txt b/meson_options.txt
index f5cac6e..0df190d 100644
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -1,8 +1,11 @@
# -*- mode: meson -*-
+# SPDX-License-Identifier: LGPL-2.1-or-later
+option('version-tag', type : 'string', description : 'override the git version string')
option('pkgconfiglibdir', type : 'string', value : '', description : 'directory for standard pkg-config files')
option('htmldir', type : 'string', value : '', description : 'directory for HTML documentation')
+option('rstdir', type : 'string', value : '', description : 'directory for ReST documentation')
-option('docs', type : 'combo', choices : ['false', 'html', 'man', 'all'], description : 'install documentation')
+option('docs', type : 'combo', choices : ['false', 'html', 'man', 'rst', 'all'], description : 'install documentation')
option('docs-build', type : 'boolean', value : false, description : 'build documentation')
option('python', type : 'combo', choices : ['auto', 'true', 'false'], description : 'Generate libnvme python bindings')
diff --git a/pyproject.toml b/pyproject.toml
index 5681e77..5416f3d 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,3 +1,4 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
[build-system]
requires = ["mesonpep517", "wheel", "meson==0.61.2", "ninja"] # PEP 508 specifications.
build-backend = "mesonpep517.buildapi"
diff --git a/release.sh b/release.sh
new file mode 100755
index 0000000..2199eac
--- /dev/null
+++ b/release.sh
@@ -0,0 +1,84 @@
+#!/bin/bash
+
+usage() {
+ echo "release.sh: VERSION"
+ echo ""
+ echo "The script does all necessary steps to create a new release."
+ echo ""
+ echo "Note: The version number needs to be exactly"
+ echo " '^v[\d]+.[\d]+(-rc[0-9]+)?$'"
+ echo ""
+ echo "example:"
+ echo " release.sh v2.1-rc0 # v2.1 release candidate 0 -> sets the project "
+ echo " # version to '1.1' and sets the tag"
+ echo " release.sh v2.1-rc1 # v2.1 release canditate 1 -> only sets the tag"
+ echo " release.sh v2.1 # v2.1 release -> sets the final tag"
+}
+
+VERSION=$1
+
+if [ -z "$VERSION" ] ; then
+ usage
+ exit 1
+fi
+
+new_ver=""
+rc=""
+
+re='^v([0-9]+\.[0-9]+)(-rc[0-9]+)?$'
+if [[ "$VERSION" =~ $re ]]; then
+ echo "Valid version $VERSION string"
+ new_ver=${BASH_REMATCH[1]}
+ rc=${BASH_REMATCH[2]}
+else
+ echo "Invalid version string $VERSION"
+ echo ""
+ usage
+ exit 1
+fi
+
+if [[ -n $(git status -s) ]]; then
+ echo "tree is dirty. abort."
+ exit 1
+fi
+
+if [ "$(git rev-parse --abbrev-ref HEAD)" != "master" ] ; then
+ echo "currently not on master branch. abort."
+ exit 1
+fi
+
+# update all docs
+doc_dir=""
+if [ -d "Documentation" ]; then
+ doc_dir="Documentation"
+elif [ -d "doc" ]; then
+ doc_dir="doc"
+else
+ echo "documenation directory not found"
+ exit 1
+fi
+
+./$doc_dir/update-docs.sh
+git add $doc_dir
+git commit -s -m "Regenerate all documentation" \
+ -m "Regenerate documentation for $VERSION release"
+
+# update meson.build
+old_ver=$(sed -n "0,/[ \t]\+version: /s/[ \t]\+version: '\([0-9]\+.[0-9]\+\)',$/\1/p" meson.build)
+if [ "$old_ver" != "$new_ver" ]; then
+ # Only update project version once, that is either
+ # - for the first RC phase or
+ # - for the release when there was no RC
+ sed -i -e "0,/[ \t]version: /s/\([ \t]version: \).*/\1\'$new_ver\',/" meson.build
+ git add meson.build
+fi
+
+git commit -s -m "Release $VERSION"
+git tag -s -m "Release $VERSION" "$VERSION"
+git push --dry-run origin "$VERSION"^{}:master tag "$VERSION"
+
+read -p "All good? Ready to push changes to remote? [Yy]" -n 1 -r
+echo
+if [[ $REPLY =~ ^[Yy]$ ]]; then
+ git push origin "$VERSION"^{}:master tag "$VERSION"
+fi
diff --git a/src/libnvme-mi.h b/src/libnvme-mi.h
new file mode 100644
index 0000000..f0b1a91
--- /dev/null
+++ b/src/libnvme-mi.h
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * This file is part of libnvme.
+ * Copyright (c) 2021 Code Construct Pty Ltd
+ *
+ * Authors: Jeremy Kerr <jk@codeconstruct.com.au>
+ */
+
+#ifndef _LIBNVME_MI_H
+#define _LIBNVME_MI_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "nvme/types.h"
+#include "nvme/mi.h"
+#include "nvme/log.h"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _LIBNVME_MI_H */
diff --git a/src/libnvme-mi.map b/src/libnvme-mi.map
new file mode 100644
index 0000000..33447e9
--- /dev/null
+++ b/src/libnvme-mi.map
@@ -0,0 +1,31 @@
+LIBNVME_MI_1_1 {
+ global:
+ nvme_mi_create_root;
+ nvme_mi_free_root;
+ nvme_mi_init_ctrl;
+ nvme_mi_close_ctrl;
+ nvme_mi_close;
+ nvme_mi_mi_config_get;
+ nvme_mi_mi_config_set;
+ nvme_mi_mi_read_mi_data_subsys;
+ nvme_mi_mi_read_mi_data_port;
+ nvme_mi_mi_read_mi_data_ctrl_list;
+ nvme_mi_mi_read_mi_data_ctrl;
+ nvme_mi_mi_subsystem_health_status_poll;
+ nvme_mi_admin_identify_partial;
+ nvme_mi_admin_get_log_page;
+ nvme_mi_admin_xfer;
+ nvme_mi_admin_security_send;
+ nvme_mi_admin_security_recv;
+ nvme_mi_endpoint_desc;
+ nvme_mi_root_close;
+ nvme_mi_first_endpoint;
+ nvme_mi_next_endpoint;
+ nvme_mi_first_ctrl;
+ nvme_mi_next_ctrl;
+ nvme_mi_open_mctp;
+ nvme_mi_scan_mctp;
+ nvme_mi_scan_ep;
+ local:
+ *;
+};
diff --git a/src/libnvme.map b/src/libnvme.map
index 087dc66..50a688d 100644
--- a/src/libnvme.map
+++ b/src/libnvme.map
@@ -1,3 +1,11 @@
+# SPDX-License-Identifier: LGPL-2.1-or-later
+
+LIBNVME_1_1 {
+ global:
+ nvme_get_version;
+ nvme_init_copy_range_f1;
+};
+
LIBNVME_1_0 {
global:
nvme_admin_passthru64;
@@ -12,6 +20,7 @@ LIBNVME_1_0 {
nvme_ctrl_first_ns;
nvme_ctrl_first_path;
nvme_ctrl_get_address;
+ nvme_ctrl_get_config;
nvme_ctrl_get_dhchap_key;
nvme_ctrl_get_discovery_ctrl;
nvme_ctrl_get_fd;
@@ -244,6 +253,7 @@ LIBNVME_1_0 {
nvme_sanitize_nvm;
nvme_scan;
nvme_scan_ctrl;
+ nvme_scan_ctrls;
nvme_scan_ctrl_namespace_paths;
nvme_scan_ctrl_namespaces;
nvme_scan_topology;
diff --git a/src/licenses/BSD-MIT b/src/licenses/BSD-MIT
deleted file mode 100644
index 89de354..0000000
--- a/src/licenses/BSD-MIT
+++ /dev/null
@@ -1,17 +0,0 @@
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
diff --git a/src/licenses/CC0 b/src/licenses/CC0
deleted file mode 100644
index feb9b11..0000000
--- a/src/licenses/CC0
+++ /dev/null
@@ -1,28 +0,0 @@
-Statement of Purpose
-
-The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
-
-Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
-
-For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
-
-1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
-
- the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
- moral rights retained by the original author(s) and/or performer(s);
- publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
- rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
- rights protecting the extraction, dissemination, use and reuse of data in a Work;
- database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
- other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
-
-2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
-
-3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
-
-4. Limitations and Disclaimers.
-
- No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
- Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
- Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
- Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
diff --git a/src/meson.build b/src/meson.build
index b573b19..3076be6 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -16,6 +16,13 @@ sources = [
'nvme/util.c',
]
+mi_sources = [
+ 'nvme/cleanup.c',
+ 'nvme/log.c',
+ 'nvme/mi.c',
+ 'nvme/mi-mctp.c',
+]
+
if conf.get('CONFIG_JSONC')
sources += 'nvme/json.c'
endif
@@ -26,9 +33,16 @@ deps = [
openssl_dep,
]
+mi_deps = [
+ libuuid_dep,
+ libsystemd_dep,
+]
+
source_dir = meson.current_source_dir()
mapfile = 'libnvme.map'
version_script_arg = join_paths(source_dir, mapfile)
+mi_mapfile = 'libnvme-mi.map'
+mi_version_script_arg = join_paths(source_dir, mi_mapfile)
libnvme = library(
'nvme', # produces libnvme.so
@@ -53,13 +67,65 @@ pkg.generate(libnvme,
libnvme_dep = declare_dependency(
include_directories: ['.'],
- dependencies: deps,
+ dependencies: [
+ libuuid_dep.partial_dependency(compile_args: true, includes: true),
+ json_c_dep.partial_dependency(compile_args: true, includes: true),
+ ],
link_with: libnvme,
)
+libnvme_mi = library(
+ 'nvme-mi', # produces libnvme-mi.so
+ mi_sources,
+ version: library_version,
+ link_args: ['-Wl,--version-script=' + mi_version_script_arg],
+ dependencies: mi_deps,
+ link_depends: mi_mapfile,
+ include_directories: [incdir, internal_incdir],
+ install: true,
+ link_with: libccan,
+)
+
+libnvme_mi_dep = declare_dependency(
+ include_directories: ['.'],
+ dependencies: [
+ libuuid_dep.partial_dependency(compile_args: true, includes: true),
+ ],
+ link_with: libnvme_mi,
+)
+
+# test library with all symbols visible, to use for MI unit tests. Should
+# match libnvme_mi above, but with no version script, and install: false.
+libnvme_mi_test = library(
+ 'nvme-mi-test', # produces libnvme-mi-test.so
+ mi_sources,
+ dependencies: mi_deps,
+ include_directories: [incdir, internal_incdir],
+ install: false,
+ link_with: libccan,
+)
+
+libnvme_mi_test_dep = declare_dependency(
+ include_directories: ['.'],
+ dependencies: [
+ libuuid_dep.partial_dependency(compile_args: true, includes: true),
+ ],
+ link_with: libnvme_mi_test,
+)
+
+pkg.generate(libnvme_mi,
+ filebase: 'libnvme-mi',
+ name: 'libnvme-mi',
+ version: meson.project_version(),
+ description: 'Manage "libnvme" subsystem devices (Non-volatile Memory Express) over Management Interface',
+ url: 'http://github.com/linux-nvme/libnvme/',
+)
+
mode = ['rw-r--r--', 0, 0]
install_headers('libnvme.h', install_mode: mode)
+install_headers('libnvme-mi.h', install_mode: mode)
install_headers([
+ 'nvme/api-types.h',
'nvme/fabrics.h',
'nvme/filters.h',
'nvme/ioctl.h',
@@ -68,6 +134,7 @@ install_headers([
'nvme/tree.h',
'nvme/types.h',
'nvme/util.h',
+ 'nvme/mi.h',
],
subdir: 'nvme',
install_mode: mode,
diff --git a/src/nvme/api-types.h b/src/nvme/api-types.h
new file mode 100644
index 0000000..0de41a6
--- /dev/null
+++ b/src/nvme/api-types.h
@@ -0,0 +1,913 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * Types used as part of the libnvme/libnvme-mi API, rather than specified
+ * by the NVM Express specification.
+ *
+ * These are shared across both libnvme and libnvme-mi interfaces.
+ *
+ * This file is part of libnvme.
+ * Copyright (c) 2022 Code Construct
+ *
+ * Authors: Jeremy Kerr <jk@codeconstruct.com.au>
+ */
+#ifndef _LIBNVME_API_TYPES_H
+#define _LIBNVME_API_TYPES_H
+
+#include <stdbool.h>
+#include "types.h"
+
+/*
+ * _args struct definitions. These are used by both the ioctl-based and
+ * MI-based interfaces, as the call interface for (admin/io/etc) NVMe commands,
+ * passed to the nvme_*() and nvme_mi_*() functions.
+ *
+ * On MI-based interfaces, the fd and timeout members are unused, and should
+ * be set to zero.
+ */
+
+/**
+ * struct nvme_identify_args - Arguments for the NVMe Identify command
+ * @result: The command completion result from CQE dword0
+ * @data: User space destination address to transfer the data
+ * @args_size: Size of &struct nvme_identify_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms (0 for default timeout)
+ * @cns: The Controller or Namespace structure, see @enum nvme_identify_cns
+ * @csi: Command Set Identifier
+ * @nsid: Namespace identifier, if applicable
+ * @cntid: The Controller Identifier, if applicable
+ * @cns_specific_id: Identifier that is required for a particular CNS value
+ * @uuidx: UUID Index if controller supports this id selection method
+ */
+struct nvme_identify_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ enum nvme_identify_cns cns;
+ enum nvme_csi csi;
+ __u32 nsid;
+ __u16 cntid;
+ __u16 cns_specific_id;
+ __u8 uuidx;
+};
+
+/**
+ * struct nvme_get_log_args - Arguments for the NVMe Admin Get Log command
+ * @lpo: Log page offset for partial log transfers
+ * @result: The command completion result from CQE dword0
+ * @log: User space destination address to transfer the data
+ * @args_size: Length of the structure
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @lid: Log page identifier, see &enum nvme_cmd_get_log_lid for known
+ * values
+ * @len: Length of provided user buffer to hold the log data in bytes
+ * @nsid: Namespace identifier, if applicable
+ * @csi: Command set identifier, see &enum nvme_csi for known values
+ * @lsi: Log Specific Identifier
+ * @lsp: Log specific field
+ * @uuidx: UUID selection, if supported
+ * @rae: Retain asynchronous events
+ * @ot: Offset Type; if set @lpo specifies the index into the list
+ * of data structures, otherwise @lpo specifies the byte offset
+ * into the log page.
+ */
+struct nvme_get_log_args {
+ __u64 lpo;
+ __u32 *result;
+ void *log;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ enum nvme_cmd_get_log_lid lid;
+ __u32 len;
+ __u32 nsid;
+ enum nvme_csi csi;
+ __u16 lsi;
+ __u8 lsp;
+ __u8 uuidx;
+ bool rae;
+ bool ot;
+};
+
+/**
+ * struct nvme_set_features_args - Arguments for the NVMe Admin Set Feature command
+ * @result: The command completion result from CQE dword0
+ * @data: User address of feature data, if applicable
+ * @args_size: Size of &struct nvme_set_features_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID, if applicable
+ * @cdw11: Value to set the feature to
+ * @cdw12: Feature specific command dword12 field
+ * @cdw13: Feature specific command dword13 field
+ * @cdw15: Feature specific command dword15 field
+ * @data_len: Length of feature data, if applicable, in bytes
+ * @save: Save value across power states
+ * @uuidx: UUID Index for differentiating vendor specific encoding
+ * @fid: Feature identifier
+ */
+struct nvme_set_features_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw15;
+ __u32 data_len;
+ bool save;
+ __u8 uuidx;
+ __u8 fid;
+};
+
+/**
+ * struct nvme_get_features_args - Arguments for the NVMe Admin Get Feature command
+ * @args_size: Size of &struct nvme_get_features_args
+ * @fd: File descriptor of nvme device
+ * @result: The command completion result from CQE dword0
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID, if applicable
+ * @sel: Select which type of attribute to return,
+ * see &enum nvme_get_features_sel
+ * @cdw11: Feature specific command dword11 field
+ * @data_len: Length of feature data, if applicable, in bytes
+ * @data: User address of feature data, if applicable
+ * @fid: Feature identifier, see &enum nvme_features_id
+ * @uuidx: UUID Index for differentiating vendor specific encoding
+ */
+struct nvme_get_features_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_get_features_sel sel;
+ __u32 cdw11;
+ __u32 data_len;
+ __u8 fid;
+ __u8 uuidx;
+};
+
+/**
+ * struct nvme_format_nvm_args - Arguments for the Format Nvme Namespace command
+ * @result: The command completion result from CQE dword0
+ * @args_size: Size of &struct nvme_format_nvm_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Set to override default timeout to this value in milliseconds;
+ * useful for long running formats. 0 will use system default.
+ * @nsid: Namespace ID to format
+ * @mset: Metadata settings (extended or separated), true if extended
+ * @pi: Protection information type
+ * @pil: Protection information location (beginning or end), true if end
+ * @ses: Secure erase settings
+ * @lbaf: Logical block address format least significant 4 bits
+ * @rsvd1: Reserved
+ * @lbafu: Logical block address format most significant 2 bits
+ */
+struct nvme_format_nvm_args {
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_cmd_format_mset mset;
+ enum nvme_cmd_format_pi pi;
+ enum nvme_cmd_format_pil pil;
+ enum nvme_cmd_format_ses ses;
+ __u8 lbaf;
+ __u8 rsvd1[7];
+ __u8 lbafu;
+};
+
+/**
+ * struct nvme_ns_mgmt_args - Arguments for NVMe Namespace Management command
+ * @result: NVMe command result
+ * @ns: Namespace identification descriptors
+ * @args_size: Size of &struct nvme_ns_mgmt_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace identifier
+ * @sel: Type of management operation to perform
+ * @csi: Command Set Identifier
+ */
+struct nvme_ns_mgmt_args {
+ __u32 *result;
+ struct nvme_id_ns *ns;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_ns_mgmt_sel sel;
+ __u8 csi;
+};
+
+/**
+ * struct nvme_ns_attach_args - Arguments for Nvme Namespace Management command
+ * @result: NVMe command result
+ * @ctrlist: Controller list to modify attachment state of nsid
+ * @args_size: Size of &struct nvme_ns_attach_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID to execute attach selection
+ * @sel: Attachment selection, see &enum nvme_ns_attach_sel
+ */
+struct nvme_ns_attach_args {
+ __u32 *result;
+ struct nvme_ctrl_list *ctrlist;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_ns_attach_sel sel;
+};
+
+/**
+ * struct nvme_fw_download_args - Arguments for the NVMe Firmware Download command
+ * @args_size: Size of &struct nvme_fw_download_args
+ * @fd: File descriptor of nvme device
+ * @result: The command completion result from CQE dword0
+ * @timeout: Timeout in ms
+ * @offset: Offset in the firmware data
+ * @data: Userspace address of the firmware data
+ * @data_len: Length of data in this command in bytes
+ */
+struct nvme_fw_download_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 offset;
+ __u32 data_len;
+};
+
+/**
+ * struct nvme_fw_commit_args - Arguments for the NVMe Firmware Commit command
+ * @args_size: Size of &struct nvme_fw_commit_args
+ * @fd: File descriptor of nvme device
+ * @action: Action to use for the firmware image, see &enum nvme_fw_commit_ca
+ * @timeout: Timeout in ms
+ * @result: The command completion result from CQE dword0
+ * @slot: Firmware slot to commit the downloaded image
+ * @bpid: Set to true to select the boot partition id
+ */
+struct nvme_fw_commit_args {
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ enum nvme_fw_commit_ca action;
+ __u8 slot;
+ bool bpid;
+};
+
+/**
+ * struct nvme_security_send_args - Arguments for the NVMe Security Send command
+ * @result: The command completion result from CQE dword0
+ * @data: Security data payload to send
+ * @args_size: Size of &struct nvme_security_send_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID to issue security command on
+ * @tl: Protocol specific transfer length
+ * @data_len: Data length of the payload in bytes
+ * @nssf: NVMe Security Specific field
+ * @spsp0: Security Protocol Specific field
+ * @spsp1: Security Protocol Specific field
+ * @secp: Security Protocol
+ */
+struct nvme_security_send_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 tl;
+ __u32 data_len;
+ __u8 nssf;
+ __u8 spsp0;
+ __u8 spsp1;
+ __u8 secp;
+};
+
+/**
+ * struct nvme_security_receive_args - Arguments for the NVMe Security Receive command
+ * @result: The command completion result from CQE dword0
+ * @data: Security data payload to send
+ * @args_size: Size of &struct nvme_security_receive_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID to issue security command on
+ * @al: Protocol specific allocation length
+ * @data_len: Data length of the payload in bytes
+ * @nssf: NVMe Security Specific field
+ * @spsp0: Security Protocol Specific field
+ * @spsp1: Security Protocol Specific field
+ * @secp: Security Protocol
+ */
+struct nvme_security_receive_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 al;
+ __u32 data_len;
+ __u8 nssf;
+ __u8 spsp0;
+ __u8 spsp1;
+ __u8 secp;
+};
+
+/**
+ * struct nvme_get_lba_status_args - Arguments for the NVMe Get LBA Status command
+ * @lbas: Data payload to return status descriptors
+ * @result: The command completion result from CQE dword0
+ * @slba: Starting logical block address to check statuses
+ * @args_size: Size of &struct nvme_get_lba_status_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID to retrieve LBA status
+ * @mndw: Maximum number of dwords to return
+ * @atype: Action type mechanism to determine LBA status descriptors to
+ * return, see &enum nvme_lba_status_atype
+ * @rl: Range length from slba to perform the action
+ */
+struct nvme_get_lba_status_args {
+ __u64 slba;
+ __u32 *result;
+ struct nvme_lba_status *lbas;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 mndw;
+ enum nvme_lba_status_atype atype;
+ __u16 rl;
+};
+
+/**
+ * struct nvme_directive_send_args - Arguments for the NVMe Directive Send command
+ * @result: If successful, the CQE dword0 value
+ * @data: Data payload to be send
+ * @args_size: Size of &struct nvme_directive_send_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID, if applicable
+ * @doper: Directive send operation, see &enum nvme_directive_send_doper
+ * @dtype: Directive type, see &enum nvme_directive_dtype
+ * @cdw12: Directive specific command dword12
+ * @data_len: Length of data payload in bytes
+ * @dspec: Directive specific field
+ */
+struct nvme_directive_send_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_directive_send_doper doper;
+ enum nvme_directive_dtype dtype;
+ __u32 cdw12;
+ __u32 data_len;
+ __u16 dspec;
+};
+
+/**
+ * struct nvme_directive_recv_args - Arguments for the NVMe Directive Receive command
+ * @result: If successful, the CQE dword0 value
+ * @data: Userspace address of data payload
+ * @args_size: Size of &struct nvme_directive_recv_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID, if applicable
+ * @doper: Directive send operation, see &enum nvme_directive_send_doper
+ * @dtype: Directive type, see &enum nvme_directive_dtype
+ * @cdw12: Directive specific command dword12
+ * @data_len: Length of data payload in bytes
+ * @dspec: Directive specific field
+ */
+struct nvme_directive_recv_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_directive_receive_doper doper;
+ enum nvme_directive_dtype dtype;
+ __u32 cdw12;
+ __u32 data_len;
+ __u16 dspec;
+};
+
+/**
+ * struct nvme_capacity_mgmt_args - Arguments for the NVMe Capacity Management command
+ * @result: If successful, the CQE dword0 value
+ * @args_size: Size of &struct nvme_capacity_mgmt_args
+ * @fd: File descriptor of nvme device
+ * @cdw11: Least significant 32 bits of the capacity in bytes of the
+ * Endurance Group or NVM Set to be created
+ * @cdw12: Most significant 32 bits of the capacity in bytes of the
+ * Endurance Group or NVM Set to be created
+ * @timeout: Timeout in ms
+ * @element_id: Value specific to the value of the Operation field
+ * @op: Operation to be performed by the controller
+ */
+struct nvme_capacity_mgmt_args {
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u16 element_id;
+ __u8 op;
+};
+
+/**
+ * struct nvme_lockdown_args - Arguments for the NVME Lockdown command
+ * @args_size: Size of &struct nvme_lockdown_args
+ * @fd: File descriptor of nvme device
+ * @result: The command completion result from CQE dword0
+ * @timeout: Timeout in ms (0 for default timeout)
+ * @scp: Scope of the command
+ * @prhbt: Prohibit or allow the command opcode or Set Features command
+ * @ifc: Affected interface
+ * @ofi: Opcode or Feature Identifier
+ * @uuidx: UUID Index if controller supports this id selection method
+ */
+struct nvme_lockdown_args {
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u8 scp;
+ __u8 prhbt;
+ __u8 ifc;
+ __u8 ofi;
+ __u8 uuidx;
+};
+
+/**
+ * struct nvme_set_property_args - Arguments for NVMe Set Property command
+ * @args_size: Size of &struct nvme_set_property_args
+ * @fd: File descriptor of nvme device
+ * @result: The command completion result from CQE dword0
+ * @timeout: Timeout in ms
+ * @offset: Property offset from the base to set
+ * @value: The value to set the property
+ */
+struct nvme_set_property_args {
+ __u64 value;
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ int offset;
+};
+
+/**
+ * struct nvme_get_property_args - Arguments for NVMe Get Property command
+ * @value: Where the property's value will be stored on success
+ * @args_size: Size of &struct nvme_get_property_args
+ * @fd: File descriptor of nvme device
+ * @offset: Property offset from the base to retrieve
+ * @timeout: Timeout in ms
+ */
+struct nvme_get_property_args {
+ __u64 *value;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ int offset;
+};
+
+/**
+ * struct nvme_sanitize_nvm_args - Arguments for the NVMe Sanitize NVM command
+ * @result: The command completion result from CQE dword0
+ * @args_size: Size of &struct nvme_sanitize_nvm_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @ovrpat: Overwrite pattern
+ * @sanact: Sanitize action, see &enum nvme_sanitize_sanact
+ * @ause: Set to allow unrestricted sanitize exit
+ * @owpass: Overwrite pass count
+ * @oipbp: Set to overwrite invert pattern between passes
+ * @nodas: Set to not deallocate blocks after sanitizing
+ */
+struct nvme_sanitize_nvm_args {
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ enum nvme_sanitize_sanact sanact;
+ __u32 ovrpat;
+ bool ause;
+ __u8 owpass;
+ bool oipbp;
+ bool nodas;
+};
+
+/**
+ * struct nvme_dev_self_test_args - Arguments for the NVMe Device Self Test command
+ * @result: The command completion result from CQE dword0
+ * @args_size: Size of &struct nvme_dev_self_test_args
+ * @fd: File descriptor of nvme device
+ * @nsid: Namespace ID to test
+ * @stc: Self test code, see &enum nvme_dst_stc
+ * @timeout: Timeout in ms
+ */
+struct nvme_dev_self_test_args {
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_dst_stc stc;
+};
+
+/**
+ * struct nvme_virtual_mgmt_args - Arguments for the NVMe Virtualization
+ * resource management command
+ * @args_size: Size of &struct nvme_virtual_mgmt_args
+ * @fd: File descriptor of nvme device
+ * @result: If successful, the CQE dword0
+ * @timeout: Timeout in ms
+ * @act: Virtual resource action, see &enum nvme_virt_mgmt_act
+ * @rt: Resource type to modify, see &enum nvme_virt_mgmt_rt
+ * @cntlid: Controller id for which resources are bing modified
+ * @nr: Number of resources being allocated or assigned
+ */
+struct nvme_virtual_mgmt_args {
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ enum nvme_virt_mgmt_act act;
+ enum nvme_virt_mgmt_rt rt;
+ __u16 cntlid;
+ __u16 nr;
+};
+
+/**
+ * struct nvme_io_args - Arguments for NVMe I/O commands
+ * @slba: Starting logical block
+ * @storage_tag: This filed specifies Variable Sized Expected Logical Block
+ * Storage Tag (ELBST) or Logical Block Storage Tag (LBST)
+ * @result: The command completion result from CQE dword0
+ * @data: Pointer to user address of the data buffer
+ * @metadata: Pointer to user address of the metadata buffer
+ * @args_size: Size of &struct nvme_io_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID
+ * @data_len: Length of user buffer, @data, in bytes
+ * @metadata_len:Length of user buffer, @metadata, in bytes
+ * @nlb: Number of logical blocks to send (0's based value)
+ * @control: Command control flags, see &enum nvme_io_control_flags.
+ * @apptag: This field specifies the Application Tag Mask expected value.
+ * Used only if the namespace is formatted to use end-to-end
+ * protection information.
+ * @appmask: This field specifies the Application Tag expected value. Used
+ * only if the namespace is formatted to use end-to-end protection
+ * information.
+ * @reftag: This field specifies the variable sized Expected Initial
+ * Logical Block Reference Tag (EILBRT) or Initial Logical Block
+ * Reference Tag (ILBRT). Used only if the namespace is formatted
+ * to use end-to-end protection information.
+ * @dspec: Directive specific value
+ * @dsm: Data set management attributes, see &enum nvme_io_dsm_flags
+ * @rsvd1: Reserved
+ * @reftag_u64: This field specifies the variable sized Expected Initial
+ * Logical Block Reference Tag (EILBRT) or Initial Logical Block
+ * Reference Tag (ILBRT). It is the 8 byte version required for
+ * enhanced protection information. Used only if the namespace is
+ * formatted to use end-to-end protection information.
+ * @sts: Storage tag size in bits, set by namespace Extended LBA Format
+ * @pif: Protection information format, determines how variable sized
+ * storage_tag and reftag are put into dwords 2, 3, and 14. Set by
+ * namespace Extended LBA Format.
+ */
+struct nvme_io_args {
+ __u64 slba;
+ __u64 storage_tag;
+ __u32 *result;
+ void *data;
+ void *metadata;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 reftag;
+ __u32 data_len;
+ __u32 metadata_len;
+ __u16 nlb;
+ __u16 control;
+ __u16 apptag;
+ __u16 appmask;
+ __u16 dspec;
+ __u8 dsm;
+ __u8 rsvd1[1];
+ __u64 reftag_u64;
+ __u8 sts;
+ __u8 pif;
+};
+
+/**
+ * struct nvme_dsm_args - Arguments for the NVMe Dataset Management command
+ * @result: The command completion result from CQE dword0
+ * @dsm: The data set management attributes
+ * @args_size: Size of &struct nvme_dsm_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace identifier
+ * @attrs: DSM attributes, see &enum nvme_dsm_attributes
+ * @nr_ranges: Number of block ranges in the data set management attributes
+ */
+struct nvme_dsm_args {
+ __u32 *result;
+ struct nvme_dsm_range *dsm;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 attrs;
+ __u16 nr_ranges;
+};
+
+/**
+ * struct nvme_copy_args - Arguments for the NVMe Copy command
+ * @sdlba: Start destination LBA
+ * @result: The command completion result from CQE dword0
+ * @copy: Range description
+ * @args_size: Size of &struct nvme_copy_args
+ * @fd: File descriptor of the nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace identifier
+ * @ilbrt: Initial logical block reference tag
+ * @lr: Limited retry
+ * @fua: Force unit access
+ * @nr: Number of ranges
+ * @dspec: Directive specific value
+ * @lbatm: Logical block application tag mask
+ * @lbat: Logical block application tag
+ * @prinfor: Protection information field for read
+ * @prinfow: Protection information field for write
+ * @dtype: Directive type
+ * @format: Descriptor format
+ * @ilbrt_u64: Initial logical block reference tag - 8 byte
+ * version required for enhanced protection info
+ */
+struct nvme_copy_args {
+ __u64 sdlba;
+ __u32 *result;
+ struct nvme_copy_range *copy;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 ilbrt;
+ int lr;
+ int fua;
+ __u16 nr;
+ __u16 dspec;
+ __u16 lbatm;
+ __u16 lbat;
+ __u8 prinfor;
+ __u8 prinfow;
+ __u8 dtype;
+ __u8 format;
+ __u64 ilbrt_u64;
+};
+
+/**
+ * struct nvme_resv_acquire_args - Arguments for the NVMe Reservation Acquire Command
+ * @nrkey: The reservation key to be unregistered from the namespace if
+ * the action is preempt
+ * @iekey: Set to ignore the existing key
+ * @result: The command completion result from CQE dword0
+ * @args_size: Size of &struct nvme_resv_acquire_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace identifier
+ * @rtype: The type of reservation to be create, see &enum nvme_resv_rtype
+ * @racqa: The action that is performed by the command, see &enum nvme_resv_racqa
+ * @crkey: The current reservation key associated with the host
+ */
+struct nvme_resv_acquire_args {
+ __u64 crkey;
+ __u64 nrkey;
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_resv_rtype rtype;
+ enum nvme_resv_racqa racqa;
+ bool iekey;
+};
+
+/**
+ * struct nvme_resv_register_args - Arguments for the NVMe Reservation Register command
+ * @crkey: The current reservation key associated with the host
+ * @nrkey: The new reservation key to be register if action is register or
+ * replace
+ * @result: The command completion result from CQE dword0
+ * @args_size: Size of &struct nvme_resv_register_args
+ * @fd: File descriptor of nvme device
+ * @nsid: Namespace identifier
+ * @rrega: The registration action, see &enum nvme_resv_rrega
+ * @cptpl: Change persist through power loss, see &enum nvme_resv_cptpl
+ * @iekey: Set to ignore the existing key
+ * @timeout: Timeout in ms
+ */
+struct nvme_resv_register_args {
+ __u64 crkey;
+ __u64 nrkey;
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_resv_rrega rrega;
+ enum nvme_resv_cptpl cptpl;
+ bool iekey;
+};
+
+/**
+ * struct nvme_resv_release_args - Arguments for the NVMe Reservation Release Command
+ * @crkey: The current reservation key to release
+ * @result: The command completion result from CQE dword0
+ * @args_size: Size of &struct nvme_resv_release_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace identifier
+ * @rtype: The type of reservation to be create, see &enum nvme_resv_rtype
+ * @rrela: Reservation release action, see &enum nvme_resv_rrela
+ * @iekey: Set to ignore the existing key
+ */
+struct nvme_resv_release_args {
+ __u64 crkey;
+ __u32 *result;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_resv_rtype rtype;
+ enum nvme_resv_rrela rrela;
+ bool iekey;
+};
+
+/**
+ * struct nvme_resv_report_args - Arguments for the NVMe Reservation Report command
+ * @result: The command completion result from CQE dword0
+ * @report: The user space destination address to store the reservation
+ * report
+ * @args_size: Size of &struct nvme_resv_report_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace identifier
+ * @len: Number of bytes to request transferred with this command
+ * @eds: Request extended Data Structure
+ */
+struct nvme_resv_report_args {
+ __u32 *result;
+ struct nvme_resv_status *report;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 len;
+ bool eds;
+};
+
+/**
+ * struct nvme_zns_mgmt_send_args - Arguments for the NVMe ZNS Management Send command
+ * @slba: Starting logical block address
+ * @result: The command completion result from CQE dword0
+ * @data: Userspace address of the data
+ * @args_size: Size of &struct nvme_zns_mgmt_send_args
+ * @fd: File descriptor of nvme device
+ * @timeout: timeout in ms
+ * @nsid: Namespace ID
+ * @zsa: Zone send action
+ * @data_len: Length of @data
+ * @select_all: Select all flag
+ * @zsaso: Zone Send Action Specific Option
+ */
+struct nvme_zns_mgmt_send_args {
+ __u64 slba;
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_zns_send_action zsa;
+ __u32 data_len;
+ bool select_all;
+ __u8 zsaso;
+};
+
+/**
+ * struct nvme_zns_mgmt_recv_args - Arguments for the NVMe ZNS Management Receive command
+ * @slba: Starting logical block address
+ * @result: The command completion result from CQE dword0
+ * @data: Userspace address of the data
+ * @args_size: Size of &struct nvme_zns_mgmt_recv_args
+ * @fd: File descriptor of nvme device
+ * @timeout: timeout in ms
+ * @nsid: Namespace ID
+ * @zra: zone receive action
+ * @data_len: Length of @data
+ * @zrasf: Zone receive action specific field
+ * @zras_feat: Zone receive action specific features
+ */
+struct nvme_zns_mgmt_recv_args {
+ __u64 slba;
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ enum nvme_zns_recv_action zra;
+ __u32 data_len;
+ __u16 zrasf;
+ bool zras_feat;
+};
+
+/**
+ * struct nvme_zns_append_args - Arguments for the NVMe ZNS Append command
+ * @zslba: Zone start logical block address
+ * @result: The command completion result from CQE dword0
+ * @data: Userspace address of the data
+ * @metadata: Userspace address of the metadata
+ * @args_size: Size of &struct nvme_zns_append_args
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @nsid: Namespace ID
+ * @ilbrt: Initial logical block reference tag
+ * @data_len: Length of @data
+ * @metadata_len: Length of @metadata
+ * @nlb: Number of logical blocks
+ * @control:
+ * @lbat: Logical block application tag
+ * @lbatm: Logical block application tag mask
+ * @rsvd1: Reserved
+ * @ilbrt_u64: Initial logical block reference tag - 8 byte
+ * version required for enhanced protection info
+ *
+ */
+struct nvme_zns_append_args {
+ __u64 zslba;
+ __u64 *result;
+ void *data;
+ void *metadata;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 nsid;
+ __u32 ilbrt;
+ __u32 data_len;
+ __u32 metadata_len;
+ __u16 nlb;
+ __u16 control;
+ __u16 lbat;
+ __u16 lbatm;
+ __u8 rsvd1[4];
+ __u64 ilbrt_u64;
+};
+
+/**
+ * struct nvme_dim_args - Arguments for the Discovery Information Management (DIM) command
+ * @result: Set on completion to the command's CQE DWORD 0 controller response.
+ * @data: Pointer to the DIM data
+ * @args_size: Length of the structure
+ * @fd: File descriptor of nvme device
+ * @timeout: Timeout in ms
+ * @data_len: Length of @data
+ * @tas: Task field of the Command Dword 10 (cdw10)
+ */
+struct nvme_dim_args {
+ __u32 *result;
+ void *data;
+ int args_size;
+ int fd;
+ __u32 timeout;
+ __u32 data_len;
+ __u8 tas;
+};
+
+#endif /* _LIBNVME_API_TYPES_H */
diff --git a/src/nvme/cleanup.c b/src/nvme/cleanup.c
index 0d5d910..e652e33 100644
--- a/src/nvme/cleanup.c
+++ b/src/nvme/cleanup.c
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
#include <stdlib.h>
#include "cleanup.h"
diff --git a/src/nvme/cleanup.h b/src/nvme/cleanup.h
index 89a4984..b7e1533 100644
--- a/src/nvme/cleanup.h
+++ b/src/nvme/cleanup.h
@@ -1,3 +1,4 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
#ifndef __CLEANUP_H
#define __CLEANUP_H
diff --git a/src/nvme/fabrics.c b/src/nvme/fabrics.c
index 2a26843..ee20da2 100644
--- a/src/nvme/fabrics.c
+++ b/src/nvme/fabrics.c
@@ -118,8 +118,21 @@ static const char * const eflags_strings[] = {
[NVMF_DISC_EFLAGS_NONE] = "not specified",
[NVMF_DISC_EFLAGS_EPCSD] = "explicit discovery connections",
[NVMF_DISC_EFLAGS_DUPRETINFO] = "duplicate discovery information",
- [NVMF_DISC_EFLAGS_BOTH] = "explicit discovery connections, "
+ [NVMF_DISC_EFLAGS_EPCSD |
+ NVMF_DISC_EFLAGS_DUPRETINFO] = "explicit discovery connections, "
"duplicate discovery information",
+ [NVMF_DISC_EFLAGS_NCC] = "no cdc connectivity",
+ [NVMF_DISC_EFLAGS_EPCSD |
+ NVMF_DISC_EFLAGS_NCC] = "explicit discovery connections, "
+ "no cdc connectivity",
+ [NVMF_DISC_EFLAGS_DUPRETINFO |
+ NVMF_DISC_EFLAGS_NCC] = "duplicate discovery information, "
+ "no cdc connectivity",
+ [NVMF_DISC_EFLAGS_EPCSD |
+ NVMF_DISC_EFLAGS_DUPRETINFO |
+ NVMF_DISC_EFLAGS_NCC] = "explicit discovery connections, "
+ "duplicate discovery information, "
+ "no cdc connectivity",
};
const char *nvmf_eflags_str(__u16 eflags)
@@ -316,16 +329,19 @@ static int inet6_pton(nvme_root_t r, const char *src, uint16_t port,
{
int ret = -EINVAL;
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
+ const char *scope = NULL;
+ char *p;
if (strlen(src) > INET6_ADDRSTRLEN)
return -EINVAL;
char *tmp = strdup(src);
- if (!tmp)
+ if (!tmp) {
nvme_msg(r, LOG_ERR, "cannot copy: %s\n", src);
+ return -ENOMEM;
+ }
- const char *scope = NULL;
- char *p = strchr(tmp, SCOPE_DELIMITER);
+ p = strchr(tmp, '%');
if (p) {
*p = '\0';
scope = src + (p - tmp) + 1;
@@ -521,13 +537,33 @@ static int __nvmf_add_ctrl(nvme_root_t r, const char *argstr)
(int)strcspn(argstr,"\n"), argstr);
ret = write(fd, argstr, len);
if (ret != len) {
- nvme_msg(r, LOG_ERR, "Failed to write to %s: %s\n",
+ nvme_msg(r, LOG_NOTICE, "Failed to write to %s: %s\n",
nvmf_dev, strerror(errno));
- ret = -ENVME_CONNECT_WRITE;
+ switch (errno) {
+ case EALREADY:
+ ret = -ENVME_CONNECT_ALREADY;
+ break;
+ case EINVAL:
+ ret = -ENVME_CONNECT_INVAL;
+ break;
+ case EADDRINUSE:
+ ret = -ENVME_CONNECT_ADDRINUSE;
+ break;
+ case ENODEV:
+ ret = -ENVME_CONNECT_NODEV;
+ break;
+ case EOPNOTSUPP:
+ ret = -ENVME_CONNECT_OPNOTSUPP;
+ break;
+ default:
+ ret = -ENVME_CONNECT_WRITE;
+ break;
+ }
goto out_close;
}
- len = read(fd, buf, sizeof(buf));
+ memset(buf, 0x0, sizeof(buf));
+ len = read(fd, buf, sizeof(buf) - 1);
if (len < 0) {
nvme_msg(r, LOG_ERR, "Failed to read from %s: %s\n",
nvmf_dev, strerror(errno));
@@ -555,10 +591,37 @@ out_close:
int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
const struct nvme_fabrics_config *cfg)
{
+ nvme_subsystem_t s;
char *argstr;
int ret;
+ /* highest prio have configs from command line */
cfg = merge_config(c, cfg);
+
+ /* apply configuration from config file (JSON) */
+ s = nvme_lookup_subsystem(h, NULL, nvme_ctrl_get_subsysnqn(c));
+ if (s) {
+ nvme_ctrl_t fc;
+
+ fc = __nvme_lookup_ctrl(s, nvme_ctrl_get_transport(c),
+ nvme_ctrl_get_traddr(c),
+ nvme_ctrl_get_host_traddr(c),
+ nvme_ctrl_get_host_iface(c),
+ nvme_ctrl_get_trsvcid(c),
+ NULL);
+ if (fc) {
+ cfg = merge_config(c, nvme_ctrl_get_config(fc));
+ /*
+ * An authentication key might already been set
+ * in @cfg, so ensure to update @c with the correct
+ * controller key.
+ */
+ if (fc->dhchap_key)
+ nvme_ctrl_set_dhchap_key(c, fc->dhchap_key);
+ }
+
+ }
+
nvme_ctrl_set_discovered(c, true);
if (traddr_is_hostname(h->r, c)) {
char *traddr = c->traddr;
@@ -702,8 +765,6 @@ nvme_ctrl_t nvmf_connect_disc_entry(nvme_host_t h,
if (!ret)
return c;
}
- nvme_msg(h->r, LOG_ERR, "failed to connect controller, error %d\n",
- errno);
nvme_free_ctrl(c);
return NULL;
}
@@ -734,54 +795,27 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
int max_retries)
{
nvme_root_t r = c->s && c->s->h ? c->s->h->r : NULL;
- struct nvmf_discovery_log *log;
- int hdr, ret, retries = 0;
+ struct nvmf_discovery_log *log = NULL;
+ int ret, retries = 0;
const char *name = nvme_ctrl_get_name(c);
uint64_t genctr, numrec;
unsigned int size;
- hdr = sizeof(struct nvmf_discovery_log);
- log = malloc(hdr);
- if (!log) {
- nvme_msg(r, LOG_ERR,
- "could not allocate memory for discovery log header\n");
- errno = ENOMEM;
- return -1;
- }
- memset(log, 0, hdr);
-
- nvme_msg(r, LOG_DEBUG, "%s: discover length %d\n", name, 0x100);
- ret = nvme_discovery_log(nvme_ctrl_get_fd(c), 0x100, log, true);
- if (ret) {
- nvme_msg(r, LOG_INFO, "%s: discover failed, error %d\n",
- name, errno);
- goto out_free_log;
- }
-
do {
- numrec = le64_to_cpu(log->numrec);
- genctr = le64_to_cpu(log->genctr);
-
- if (numrec == 0) {
- *logp = log;
- return 0;
- }
-
- size = sizeof(struct nvmf_discovery_log) +
- sizeof(struct nvmf_disc_log_entry) * (numrec);
+ size = sizeof(struct nvmf_discovery_log);
free(log);
- log = malloc(size);
+ log = calloc(1, size);
if (!log) {
nvme_msg(r, LOG_ERR,
- "could not alloc memory for discovery log page\n");
+ "could not allocate memory for discovery log header\n");
errno = ENOMEM;
return -1;
}
- memset(log, 0, size);
- nvme_msg(r, LOG_DEBUG, "%s: discover length %d\n", name, size);
- ret = nvme_discovery_log(nvme_ctrl_get_fd(c), size, log, false);
+ nvme_msg(r, LOG_DEBUG, "%s: get header (try %d/%d)\n",
+ name, retries, max_retries);
+ ret = nvme_discovery_log(nvme_ctrl_get_fd(c), size, log, true);
if (ret) {
nvme_msg(r, LOG_INFO,
"%s: discover try %d/%d failed, error %d\n",
@@ -789,11 +823,29 @@ int nvmf_get_discovery_log(nvme_ctrl_t c, struct nvmf_discovery_log **logp,
goto out_free_log;
}
+ numrec = le64_to_cpu(log->numrec);
genctr = le64_to_cpu(log->genctr);
+
+ if (numrec == 0)
+ break;
+
+ size = sizeof(struct nvmf_discovery_log) +
+ sizeof(struct nvmf_disc_log_entry) * numrec;
+
+ free(log);
+ log = calloc(1, size);
+ if (!log) {
+ nvme_msg(r, LOG_ERR,
+ "could not alloc memory for discovery log page\n");
+ errno = ENOMEM;
+ return -1;
+ }
+
nvme_msg(r, LOG_DEBUG,
- "%s: discover genctr %" PRIu64 ", retry\n",
- name, genctr);
- ret = nvme_discovery_log(nvme_ctrl_get_fd(c), hdr, log, true);
+ "%s: get header and %" PRIu64
+ " records (length %d genctr %" PRIu64 ")\n",
+ name, numrec, size, genctr);
+ ret = nvme_discovery_log(nvme_ctrl_get_fd(c), size, log, false);
if (ret) {
nvme_msg(r, LOG_INFO,
"%s: discover try %d/%d failed, error %d\n",
@@ -1264,12 +1316,14 @@ static const char *dctype_str[] = {
* sysfs. We must get them directly from the controller by performing an
* identify command.
*/
-static void nvme_fetch_cntrltype_dctype_from_id(nvme_ctrl_t c)
+static int nvme_fetch_cntrltype_dctype_from_id(nvme_ctrl_t c)
{
struct nvme_id_ctrl id = { 0 };
+ int ret;
- if (nvme_ctrl_identify(c, &id))
- return;
+ ret = nvme_ctrl_identify(c, &id);
+ if (ret)
+ return ret;
if (!c->cntrltype) {
if (id.cntrltype > NVME_CTRL_CNTRLTYPE_ADMIN || !cntrltype_str[id.cntrltype])
@@ -1284,12 +1338,14 @@ static void nvme_fetch_cntrltype_dctype_from_id(nvme_ctrl_t c)
else
c->dctype = strdup(dctype_str[id.dctype]);
}
+ return 0;
}
bool nvmf_is_registration_supported(nvme_ctrl_t c)
{
if (!c->cntrltype || !c->dctype)
- nvme_fetch_cntrltype_dctype_from_id(c);
+ if (nvme_fetch_cntrltype_dctype_from_id(c))
+ return false;
return !strcmp(c->dctype, "ddc") || !strcmp(c->dctype, "cdc");
}
diff --git a/src/nvme/fabrics.h b/src/nvme/fabrics.h
index 7f8a373..9e099fe 100644
--- a/src/nvme/fabrics.h
+++ b/src/nvme/fabrics.h
@@ -4,7 +4,7 @@
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
*
* Authors: Keith Busch <keith.busch@wdc.com>
- * Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+ * Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
*/
#ifndef _LIBNVME_FABRICS_H
#define _LIBNVME_FABRICS_H
@@ -195,7 +195,7 @@ int nvmf_add_ctrl(nvme_host_t h, nvme_ctrl_t c,
/**
* nvmf_get_discovery_log() - Return the discovery log page
- * @c: Discover controller to use
+ * @c: Discover controller to use
* @logp: Pointer to the log page to be returned
* @max_retries: maximum number of log page entries to be returned
*
@@ -213,7 +213,7 @@ char *nvmf_hostnqn_generate();
/**
* nvmf_hostnqn_from_file() - Reads the host nvm qualified name from the config
- * default location in @SYSCONFDIR@/nvme/
+ * default location in @SYSCONFDIR@/nvme/
* Return: The host nqn, or NULL if unsuccessful. If found, the caller
* is responsible to free the string.
*/
@@ -221,9 +221,9 @@ char *nvmf_hostnqn_from_file();
/**
* nvmf_hostid_from_file() - Reads the host identifier from the config default
- * location in @SYSCONFDIR@/nvme/.
+ * location in @SYSCONFDIR@/nvme/.
* Return: The host identifier, or NULL if unsuccessful. If found, the caller
- * is responsible to free the string.
+ * is responsible to free the string.
*/
char *nvmf_hostid_from_file();
@@ -231,7 +231,7 @@ char *nvmf_hostid_from_file();
* nvmf_connect_disc_entry() - Connect controller based on the discovery log page entry
* @h: Host to which the controller should be connected
* @e: Discovery log page entry
- * @defcfg: Default configurationn to be used for the new controller
+ * @defcfg: Default configuration to be used for the new controller
* @discover: Set to 'true' if the new controller is a discovery controller
*
* Return: Pointer to the new controller
diff --git a/src/nvme/ioctl.c b/src/nvme/ioctl.c
index f48b465..3333993 100644
--- a/src/nvme/ioctl.c
+++ b/src/nvme/ioctl.c
@@ -195,7 +195,7 @@ int nvme_admin_passthru(int fd, __u8 opcode, __u8 flags, __u16 rsvd,
enum nvme_cmd_dword_fields {
NVME_DEVICE_SELF_TEST_CDW10_STC_SHIFT = 0,
- NVME_DEVICE_SELF_TEST_CDW10_STC_MASK = 0x7,
+ NVME_DEVICE_SELF_TEST_CDW10_STC_MASK = 0xf,
NVME_DIRECTIVE_CDW11_DOPER_SHIFT = 0,
NVME_DIRECTIVE_CDW11_DTYPE_SHIFT = 8,
NVME_DIRECTIVE_CDW11_DPSEC_SHIFT = 16,
@@ -230,11 +230,11 @@ enum nvme_cmd_dword_fields {
NVME_LOG_CDW14_CSI_SHIFT = 24,
NVME_LOG_CDW14_OT_SHIFT = 23,
NVME_LOG_CDW10_LID_MASK = 0xff,
- NVME_LOG_CDW10_LSP_MASK = 0xf,
+ NVME_LOG_CDW10_LSP_MASK = 0x7f,
NVME_LOG_CDW10_RAE_MASK = 0x1,
NVME_LOG_CDW10_NUMDL_MASK = 0xffff,
NVME_LOG_CDW11_NUMDU_MASK = 0xffff,
- NVME_LOG_CDW11_LSI_MASK = 0xff,
+ NVME_LOG_CDW11_LSI_MASK = 0xffff,
NVME_LOG_CDW14_UUID_MASK = 0x7f,
NVME_LOG_CDW14_CSI_MASK = 0xff,
NVME_LOG_CDW14_OT_MASK = 0x1,
@@ -267,11 +267,13 @@ enum nvme_cmd_dword_fields {
NVME_FORMAT_CDW10_PI_SHIFT = 5,
NVME_FORMAT_CDW10_PIL_SHIFT = 8,
NVME_FORMAT_CDW10_SES_SHIFT = 9,
+ NVME_FORMAT_CDW10_LBAFU_SHIFT = 12,
NVME_FORMAT_CDW10_LBAF_MASK = 0xf,
NVME_FORMAT_CDW10_MSET_MASK = 0x1,
NVME_FORMAT_CDW10_PI_MASK = 0x7,
NVME_FORMAT_CDW10_PIL_MASK = 0x1,
NVME_FORMAT_CDW10_SES_MASK = 0x7,
+ NVME_FORMAT_CDW10_LBAFU_MASK = 0x3,
NVME_SANITIZE_CDW10_SANACT_SHIFT = 0,
NVME_SANITIZE_CDW10_AUSE_SHIFT = 3,
NVME_SANITIZE_CDW10_OWPASS_SHIFT = 4,
@@ -1159,11 +1161,25 @@ int nvme_get_features_iocs_profile(int fd, enum nvme_get_features_sel sel,
int nvme_format_nvm(struct nvme_format_nvm_args *args)
{
- __u32 cdw10 = NVME_SET(args->lbaf, FORMAT_CDW10_LBAF) |
- NVME_SET(args->mset, FORMAT_CDW10_MSET) |
- NVME_SET(args->pi, FORMAT_CDW10_PI) |
- NVME_SET(args->pil, FORMAT_CDW10_PIL) |
- NVME_SET(args->ses, FORMAT_CDW10_SES);
+ const size_t size_v1 = sizeof_args(struct nvme_format_nvm_args, lbaf, __u64);
+ const size_t size_v2 = sizeof_args(struct nvme_format_nvm_args, lbafu, __u64);
+ __u32 cdw10;
+
+ if (args->args_size < size_v1 || args->args_size > size_v2) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ cdw10 = NVME_SET(args->lbaf, FORMAT_CDW10_LBAF) |
+ NVME_SET(args->mset, FORMAT_CDW10_MSET) |
+ NVME_SET(args->pi, FORMAT_CDW10_PI) |
+ NVME_SET(args->pil, FORMAT_CDW10_PIL) |
+ NVME_SET(args->ses, FORMAT_CDW10_SES);
+
+ if (args->args_size == size_v2) {
+ /* set lbafu extension */
+ cdw10 |= NVME_SET(args->lbafu, FORMAT_CDW10_LBAFU);
+ }
struct nvme_passthru_cmd cmd = {
.opcode = nvme_admin_format_nvm,
@@ -1172,10 +1188,6 @@ int nvme_format_nvm(struct nvme_format_nvm_args *args)
.timeout_ms = args->timeout,
};
- if (args->args_size < sizeof(*args)) {
- errno = EINVAL;
- return -1;
- }
return nvme_submit_admin_passthru(args->fd, &cmd, args->result);
}
@@ -1588,16 +1600,81 @@ int nvme_io_passthru(int fd, __u8 opcode, __u8 flags, __u16 rsvd,
timeout_ms, result);
}
+static int nvme_set_var_size_tags(__u32 *cmd_dw2, __u32 *cmd_dw3, __u32 *cmd_dw14,
+ __u8 pif, __u8 sts, __u64 reftag, __u64 storage_tag)
+{
+ __u32 cdw2 = 0, cdw3 = 0, cdw14;
+
+ switch (pif) {
+ /* 16b Protection Information */
+ case 0:
+ cdw14 = reftag & 0xffffffff;
+ cdw14 |= ((storage_tag << (32 - sts)) & 0xffffffff);
+ break;
+ /* 32b Protection Information */
+ case 1:
+ cdw14 = reftag & 0xffffffff;
+ cdw3 = reftag >> 32;
+ cdw14 |= ((storage_tag << (80 - sts)) & 0xffff0000);
+ if (sts >= 48)
+ cdw3 |= ((storage_tag >> (sts - 48)) & 0xffffffff);
+ else
+ cdw3 |= ((storage_tag << (48 - sts)) & 0xffffffff);
+ cdw2 = (storage_tag >> (sts - 16)) & 0xffff;
+ break;
+ /* 64b Protection Information */
+ case 2:
+ cdw14 = reftag & 0xffffffff;
+ cdw3 = (reftag >> 32) & 0xffff;
+ cdw14 |= ((storage_tag << (48 - sts)) & 0xffffffff);
+ if (sts >= 16)
+ cdw3 |= ((storage_tag >> (sts - 16)) & 0xffff);
+ else
+ cdw3 |= ((storage_tag << (16 - sts)) & 0xffff);
+ break;
+ default:
+ perror("Unsupported Protection Information Format");
+ errno = EINVAL;
+ return -1;
+ }
+
+ *cmd_dw2 = cdw2;
+ *cmd_dw3 = cdw3;
+ *cmd_dw14 = cdw14;
+ return 0;
+}
+
int nvme_io(struct nvme_io_args *args, __u8 opcode)
{
- __u32 cdw2 = args->storage_tag & 0xffffffff;
- __u32 cdw3 = (args->storage_tag >> 32) & 0xffff;
- __u32 cdw10 = args->slba & 0xffffffff;
- __u32 cdw11 = args->slba >> 32;
- __u32 cdw12 = args->nlb | (args->control << 16);
- __u32 cdw13 = args->dsm | (args->dspec << 16);
- __u32 cdw14 = args->reftag;
- __u32 cdw15 = args->apptag | (args->appmask << 16);
+ const size_t size_v1 = sizeof_args(struct nvme_io_args, dsm, __u64);
+ const size_t size_v2 = sizeof_args(struct nvme_io_args, pif, __u64);
+ __u32 cdw2, cdw3, cdw10, cdw11, cdw12, cdw13, cdw14, cdw15;
+
+ if (args->args_size < size_v1 || args->args_size > size_v2) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ cdw10 = args->slba & 0xffffffff;
+ cdw11 = args->slba >> 32;
+ cdw12 = args->nlb | (args->control << 16);
+ cdw13 = args->dsm | (args->dspec << 16);
+ cdw15 = args->apptag | (args->appmask << 16);
+
+ if (args->args_size == size_v1) {
+ cdw2 = (args->storage_tag >> 32) & 0xffff;
+ cdw3 = args->storage_tag & 0xffffffff;
+ cdw14 = args->reftag;
+ } else {
+ if (nvme_set_var_size_tags(&cdw2, &cdw3, &cdw14,
+ args->pif,
+ args->sts,
+ args->reftag_u64,
+ args->storage_tag)) {
+ errno = EINVAL;
+ return -1;
+ }
+ }
struct nvme_passthru_cmd cmd = {
.opcode = opcode,
@@ -1617,10 +1694,6 @@ int nvme_io(struct nvme_io_args *args, __u8 opcode)
.timeout_ms = args->timeout,
};
- if (args->args_size < sizeof(*args)) {
- errno = EINVAL;
- return -1;
- }
return nvme_submit_io_passthru(args->fd, &cmd, args->result);
}
@@ -1645,29 +1718,48 @@ int nvme_dsm(struct nvme_dsm_args *args)
int nvme_copy(struct nvme_copy_args *args)
{
- __u32 cdw12 = ((args->nr - 1) & 0xff) | ((args->format & 0xf) << 8) |
+ const size_t size_v1 = sizeof_args(struct nvme_copy_args, format, __u64);
+ const size_t size_v2 = sizeof_args(struct nvme_copy_args, ilbrt_u64, __u64);
+ __u32 cdw3, cdw12, cdw14, data_len;
+
+ if (args->args_size < size_v1 || args->args_size > size_v2) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ cdw12 = ((args->nr - 1) & 0xff) | ((args->format & 0xf) << 8) |
((args->prinfor & 0xf) << 12) | ((args->dtype & 0xf) << 20) |
((args->prinfow & 0xf) << 26) | ((args->fua & 0x1) << 30) |
((args->lr & 0x1) << 31);
+ if (args->args_size == size_v1) {
+ cdw3 = 0;
+ cdw14 = args->ilbrt;
+ } else {
+ cdw3 = (args->ilbrt_u64 >> 32) & 0xffffffff;
+ cdw14 = args->ilbrt_u64 & 0xffffffff;
+ }
+
+ if (args->format == 1)
+ data_len = args->nr * sizeof(struct nvme_copy_range_f1);
+ else
+ data_len = args->nr * sizeof(struct nvme_copy_range);
+
struct nvme_passthru_cmd cmd = {
.opcode = nvme_cmd_copy,
.nsid = args->nsid,
.addr = (__u64)(uintptr_t)args->copy,
- .data_len = args->nr * sizeof(*args->copy),
+ .data_len = data_len,
+ .cdw3 = cdw3,
.cdw10 = args->sdlba & 0xffffffff,
.cdw11 = args->sdlba >> 32,
.cdw12 = cdw12,
.cdw13 = (args->dspec & 0xffff) << 16,
- .cdw14 = args->ilbrt,
+ .cdw14 = cdw14,
.cdw15 = (args->lbatm << 16) | args->lbat,
.timeout_ms = args->timeout,
};
- if (args->args_size < sizeof(*args)) {
- errno = EINVAL;
- return -1;
- }
return nvme_submit_io_passthru(args->fd, &cmd, args->result);
}
@@ -1821,15 +1913,32 @@ int nvme_zns_mgmt_recv(struct nvme_zns_mgmt_recv_args *args)
int nvme_zns_append(struct nvme_zns_append_args *args)
{
- __u32 cdw10 = args->zslba & 0xffffffff;
- __u32 cdw11 = args->zslba >> 32;
- __u32 cdw12 = args->nlb | (args->control << 16);
- __u32 cdw14 = args->ilbrt;
- __u32 cdw15 = args->lbat | (args->lbatm << 16);
+ const size_t size_v1 = sizeof_args(struct nvme_zns_append_args, lbatm, __u64);
+ const size_t size_v2 = sizeof_args(struct nvme_zns_append_args, ilbrt_u64, __u64);
+ __u32 cdw3, cdw10, cdw11, cdw12, cdw14, cdw15;
+
+ if (args->args_size < size_v1 || args->args_size > size_v2) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ cdw10 = args->zslba & 0xffffffff;
+ cdw11 = args->zslba >> 32;
+ cdw12 = args->nlb | (args->control << 16);
+ cdw15 = args->lbat | (args->lbatm << 16);
+
+ if (args->args_size == size_v1) {
+ cdw3 = 0;
+ cdw14 = args->ilbrt;
+ } else {
+ cdw3 = (args->ilbrt_u64 >> 32) & 0xffffffff;
+ cdw14 = args->ilbrt_u64 & 0xffffffff;
+ }
struct nvme_passthru_cmd64 cmd = {
.opcode = nvme_zns_cmd_append,
.nsid = args->nsid,
+ .cdw3 = cdw3,
.cdw10 = cdw10,
.cdw11 = cdw11,
.cdw12 = cdw12,
@@ -1842,10 +1951,6 @@ int nvme_zns_append(struct nvme_zns_append_args *args)
.timeout_ms = args->timeout,
};
- if (args->args_size < sizeof(*args)) {
- errno = EINVAL;
- return -1;
- }
return nvme_submit_io_passthru64(args->fd, &cmd, args->result);
}
diff --git a/src/nvme/ioctl.h b/src/nvme/ioctl.h
index ab3797d..379c43a 100644
--- a/src/nvme/ioctl.h
+++ b/src/nvme/ioctl.h
@@ -4,7 +4,7 @@
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
*
* Authors: Keith Busch <keith.busch@wdc.com>
- * Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+ * Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
*/
#ifndef _LIBNVME_IOCTL_H
@@ -13,6 +13,7 @@
#include <stddef.h>
#include <sys/ioctl.h>
#include "types.h"
+#include "api-types.h"
/*
* We can not always count on the kernel UAPI being installed. Use the same
@@ -94,29 +95,71 @@ struct nvme_passthru_cmd {
* @cdw14: Command Dword 14 (command specific)
* @cdw15: Command Dword 15 (command specific)
* @timeout_ms: If non-zero, overrides system default timeout in milliseconds
- * @rsvd2: Reserved for future use (and fills an impicit struct pad
+ * @rsvd2: Reserved for future use (and fills an implicit struct pad
* @result: Set on completion to the command's CQE DWORD 0-1 controller response
*/
struct nvme_passthru_cmd64 {
- __u8 opcode;
- __u8 flags;
- __u16 rsvd1;
- __u32 nsid;
- __u32 cdw2;
- __u32 cdw3;
- __u64 metadata;
- __u64 addr;
- __u32 metadata_len;
- __u32 data_len;
- __u32 cdw10;
- __u32 cdw11;
- __u32 cdw12;
- __u32 cdw13;
- __u32 cdw14;
- __u32 cdw15;
- __u32 timeout_ms;
- __u32 rsvd2;
- __u64 result;
+ __u8 opcode;
+ __u8 flags;
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 rsvd2;
+ __u64 result;
+};
+
+/**
+ * struct nvme_uring_cmd - nvme uring command structure
+ * @opcode: Operation code, see &enum nvme_io_opcodes and &enum nvme_admin_opcodes
+ * @flags: Not supported: intended for command flags (eg: SGL, FUSE)
+ * @rsvd1: Reserved for future use
+ * @nsid: Namespace Identifier, or Fabrics type
+ * @cdw2: Command Dword 2 (no spec defined use)
+ * @cdw3: Command Dword 3 (no spec defined use)
+ * @metadata: User space address to metadata buffer (NULL if not used)
+ * @addr: User space address to data buffer (NULL if not used)
+ * @metadata_len: Metadata buffer transfer length
+ * @data_len: Data buffer transfer length
+ * @cdw10: Command Dword 10 (command specific)
+ * @cdw11: Command Dword 11 (command specific)
+ * @cdw12: Command Dword 12 (command specific)
+ * @cdw13: Command Dword 13 (command specific)
+ * @cdw14: Command Dword 14 (command specific)
+ * @cdw15: Command Dword 15 (command specific)
+ * @timeout_ms: If non-zero, overrides system default timeout in milliseconds
+ * @rsvd2: Reserved for future use (and fills an implicit struct pad
+ */
+struct nvme_uring_cmd {
+ __u8 opcode;
+ __u8 flags;
+ __u16 rsvd1;
+ __u32 nsid;
+ __u32 cdw2;
+ __u32 cdw3;
+ __u64 metadata;
+ __u64 addr;
+ __u32 metadata_len;
+ __u32 data_len;
+ __u32 cdw10;
+ __u32 cdw11;
+ __u32 cdw12;
+ __u32 cdw13;
+ __u32 cdw14;
+ __u32 cdw15;
+ __u32 timeout_ms;
+ __u32 rsvd2;
};
#define NVME_IOCTL_ID _IO('N', 0x40)
@@ -128,13 +171,31 @@ struct nvme_passthru_cmd64 {
#define NVME_IOCTL_ADMIN64_CMD _IOWR('N', 0x47, struct nvme_passthru_cmd64)
#define NVME_IOCTL_IO64_CMD _IOWR('N', 0x48, struct nvme_passthru_cmd64)
+/* io_uring async commands: */
+#define NVME_URING_CMD_IO _IOWR('N', 0x80, struct nvme_uring_cmd)
+#define NVME_URING_CMD_IO_VEC _IOWR('N', 0x81, struct nvme_uring_cmd)
+
#endif /* _UAPI_LINUX_NVME_IOCTL_H */
#endif /* _LINUX_NVME_IOCTL_H */
/**
+ * sizeof_args - Helper function used to determine structure sizes
+ * @type: Argument structure type
+ * @member: Member inside the type
+ * @align: Alignment information
+ */
+#define sizeof_args(type, member, align) \
+({ \
+ type s; \
+ size_t t = offsetof(type, member) + sizeof(s.member); \
+ size_t p = (sizeof(align) - (t % sizeof(align))) % sizeof(align); \
+ t + p; \
+})
+
+/**
* nvme_submit_admin_passthru64() - Submit a 64-bit nvme passthrough admin
- * command
+ * command
* @fd: File descriptor of nvme device
* @cmd: The nvme admin command to send
* @result: Optional field to return the result from the CQE DW0-1
@@ -152,7 +213,7 @@ int nvme_submit_admin_passthru64(int fd, struct nvme_passthru_cmd64 *cmd,
* @fd: File descriptor of nvme device
* @opcode: The nvme io command to send
* @flags: NVMe command flags (not used)
- * @rsvd: Reserevd for future use
+ * @rsvd: Reserved for future use
* @nsid: Namespace identifier
* @cdw2: Command dword 2
* @cdw3: Command dword 3
@@ -162,9 +223,9 @@ int nvme_submit_admin_passthru64(int fd, struct nvme_passthru_cmd64 *cmd,
* @cdw13: Command dword 13
* @cdw14: Command dword 14
* @cdw15: Command dword 15
- * @data_len: Length of the data transfered in this command in bytes
+ * @data_len: Length of the data transferred in this command in bytes
* @data: Pointer to user address of the data buffer
- * @metadata_len:Length of metadata transfered in this command
+ * @metadata_len:Length of metadata transferred in this command
* @metadata: Pointer to user address of the metadata buffer
* @timeout_ms: How long the kernel waits for the command to complete
* @result: Optional field to return the result from the CQE dword 0
@@ -202,7 +263,7 @@ int nvme_submit_admin_passthru(int fd, struct nvme_passthru_cmd *cmd,
* @fd: File descriptor of nvme device
* @opcode: The nvme io command to send
* @flags: NVMe command flags (not used)
- * @rsvd: Reserevd for future use
+ * @rsvd: Reserved for future use
* @nsid: Namespace identifier
* @cdw2: Command dword 2
* @cdw3: Command dword 3
@@ -212,9 +273,9 @@ int nvme_submit_admin_passthru(int fd, struct nvme_passthru_cmd *cmd,
* @cdw13: Command dword 13
* @cdw14: Command dword 14
* @cdw15: Command dword 15
- * @data_len: Length of the data transfered in this command in bytes
+ * @data_len: Length of the data transferred in this command in bytes
* @data: Pointer to user address of the data buffer
- * @metadata_len:Length of metadata transfered in this command
+ * @metadata_len:Length of metadata transferred in this command
* @metadata: Pointer to user address of the metadata buffer
* @timeout_ms: How long the kernel waits for the command to complete
* @result: Optional field to return the result from the CQE dword 0
@@ -252,7 +313,7 @@ int nvme_submit_io_passthru64(int fd, struct nvme_passthru_cmd64 *cmd,
* @fd: File descriptor of nvme device
* @opcode: The nvme io command to send
* @flags: NVMe command flags (not used)
- * @rsvd: Reserevd for future use
+ * @rsvd: Reserved for future use
* @nsid: Namespace identifier
* @cdw2: Command dword 2
* @cdw3: Command dword 3
@@ -262,9 +323,9 @@ int nvme_submit_io_passthru64(int fd, struct nvme_passthru_cmd64 *cmd,
* @cdw13: Command dword 13
* @cdw14: Command dword 14
* @cdw15: Command dword 15
- * @data_len: Length of the data transfered in this command in bytes
+ * @data_len: Length of the data transferred in this command in bytes
* @data: Pointer to user address of the data buffer
- * @metadata_len:Length of metadata transfered in this command
+ * @metadata_len:Length of metadata transferred in this command
* @metadata: Pointer to user address of the metadata buffer
* @timeout_ms: How long the kernel waits for the command to complete
* @result: Optional field to return the result from the CQE dword 0
@@ -303,7 +364,7 @@ int nvme_submit_io_passthru(int fd, struct nvme_passthru_cmd *cmd,
* @fd: File descriptor of nvme device
* @opcode: The nvme io command to send
* @flags: NVMe command flags (not used)
- * @rsvd: Reserevd for future use
+ * @rsvd: Reserved for future use
* @nsid: Namespace identifier
* @cdw2: Command dword 2
* @cdw3: Command dword 3
@@ -313,9 +374,9 @@ int nvme_submit_io_passthru(int fd, struct nvme_passthru_cmd *cmd,
* @cdw13: Command dword 13
* @cdw14: Command dword 14
* @cdw15: Command dword 15
- * @data_len: Length of the data transfered in this command in bytes
+ * @data_len: Length of the data transferred in this command in bytes
* @data: Pointer to user address of the data buffer
- * @metadata_len:Length of metadata transfered in this command
+ * @metadata_len:Length of metadata transferred in this command
* @metadata: Pointer to user address of the metadata buffer
* @timeout_ms: How long the kernel waits for the command to complete
* @result: Optional field to return the result from the CQE dword 0
@@ -380,34 +441,6 @@ int nvme_ns_rescan(int fd);
int nvme_get_nsid(int fd, __u32 *nsid);
/**
- * struct nvme_identify_args - Arguments for the NVMe Identify command
- * @result: The command completion result from CQE dword0
- * @data: User space destination address to transfer the data
- * @args_size: Size of &struct nvme_identify_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms (0 for default timeout)
- * @cns: The Controller or Namespace structure, see @enum nvme_identify_cns
- * @csi: Command Set Identifier
- * @nsid: Namespace identifier, if applicable
- * @cntid: The Controller Identifier, if applicable
- * @cns_specific_id: Identifier that is required for a particular CNS value
- * @uuidx: UUID Index if controller supports this id selection method
- */
-struct nvme_identify_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- enum nvme_identify_cns cns;
- enum nvme_csi csi;
- __u32 nsid;
- __u16 cntid;
- __u16 cns_specific_id;
- __u8 uuidx;
-};
-
-/**
* nvme_identify() - Send the NVMe Identify command
* @args: &struct nvme_identify_args argument structure
*
@@ -419,8 +452,8 @@ struct nvme_identify_args {
*/
int nvme_identify(struct nvme_identify_args *args);
-static int nvme_identify_cns_nsid(int fd, enum nvme_identify_cns cns,
- __u32 nsid, void *data)
+static inline int nvme_identify_cns_nsid(int fd, enum nvme_identify_cns cns,
+ __u32 nsid, void *data)
{
struct nvme_identify_args args = {
.result = NULL,
@@ -484,7 +517,7 @@ static inline int nvme_identify_ns(int fd, __u32 nsid, struct nvme_id_ns *ns)
/**
* nvme_identify_allocated_ns() - Same as nvme_identify_ns, but only for
- * allocated namespaces
+ * allocated namespaces
* @fd: File descriptor of nvme device
* @nsid: Namespace to identify
* @ns: User space destination address to transfer the data
@@ -502,7 +535,7 @@ static inline int nvme_identify_allocated_ns(int fd, __u32 nsid,
/**
* nvme_identify_active_ns_list() - Retrieves active namespaces id list
* @fd: File descriptor of nvme device
- * @nsid: Return namespaces greater than this identifer
+ * @nsid: Return namespaces greater than this identifier
* @list: User space destination address to transfer the data
*
* A list of 1024 namespace IDs is returned to the host containing NSIDs in
@@ -524,7 +557,7 @@ static inline int nvme_identify_active_ns_list(int fd, __u32 nsid,
/**
* nvme_identify_allocated_ns_list() - Retrieves allocated namespace id list
* @fd: File descriptor of nvme device
- * @nsid: Return namespaces greater than this identifer
+ * @nsid: Return namespaces greater than this identifier
* @list: User space destination address to transfer the data
*
* A list of 1024 namespace IDs is returned to the host containing NSIDs in
@@ -617,14 +650,14 @@ static inline int nvme_identify_nsid_ctrl_list(int fd, __u32 nsid, __u16 cntid,
/**
* nvme_identify_ns_descs() - Retrieves namespace descriptor list
* @fd: File descriptor of nvme device
- * @nsid: The namespace id to retrieve destriptors
+ * @nsid: The namespace id to retrieve descriptors
* @descs: User space destination address to transfer the data
*
* A list of Namespace Identification Descriptor structures is returned to the
* host for the namespace specified in the Namespace Identifier (NSID) field if
* it is an active NSID.
*
- * The data returned is in the form of an arrray of 'struct nvme_ns_id_desc'.
+ * The data returned is in the form of an array of 'struct nvme_ns_id_desc'.
*
* See &struct nvme_ns_id_desc for the definition of the returned structure.
*
@@ -649,7 +682,7 @@ static inline int nvme_identify_ns_descs(int fd, __u32 nsid,
* Identifier supported by the NVM subsystem that is equal to or greater than
* the NVM Set Identifier.
*
- * See &struct nvme_id_nvmset_list for the defintion of the returned structure.
+ * See &struct nvme_id_nvmset_list for the definition of the returned structure.
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
@@ -676,12 +709,12 @@ static inline int nvme_identify_nvmset_list(int fd, __u16 nvmsetid,
/**
* nvme_identify_primary_ctrl() - Retrieve NVMe Primary Controller
- * identification
+ * identification
* @fd: File descriptor of nvme device
* @cntid: Return controllers starting at this identifier
* @cap: User space destination buffer address to transfer the data
*
- * See &struct nvme_primary_ctrl_cap for the defintion of the returned structure, @cap.
+ * See &struct nvme_primary_ctrl_cap for the definition of the returned structure, @cap.
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
@@ -718,7 +751,7 @@ static inline int nvme_identify_primary_ctrl(int fd, __u16 cntid,
* The list contains entries for controller identifiers greater than or equal
* to the value specified in the Controller Identifier (cntid).
*
- * See &struct nvme_secondary_ctrls_list for a defintion of the returned
+ * See &struct nvme_secondary_ctrls_list for a definition of the returned
* structure.
*
* Return: The nvme command status if a response was received (see
@@ -746,7 +779,7 @@ static inline int nvme_identify_secondary_ctrl_list(int fd, __u32 nsid,
/**
* nvme_identify_ns_granularity() - Retrieves namespace granularity
- * identification
+ * identification
* @fd: File descriptor of nvme device
* @gr_list: User space destination address to transfer the data
*
@@ -794,7 +827,7 @@ static inline int nvme_identify_uuid(int fd, struct nvme_id_uuid_list *uuid_list
* @csi: Command Set Identifier
* @data: User space destination address to transfer the data
*
- * An I/O Command Set specific Identify Namespace data structre is returned
+ * An I/O Command Set specific Identify Namespace data structure is returned
* for the namespace specified in @nsid.
*
* Return: The nvme command status if a response was received (see
@@ -853,7 +886,7 @@ static inline int nvme_identify_ctrl_csi(int fd, enum nvme_csi csi, void *data)
}
/**
- * nvme_identify_active_ns_list_csi() - Active namespace ID list associated with a specified I/O command set
+ * nvme_identify_active_ns_list_csi() - Active namespace ID list associated with a specified I/O command set
* @fd: File descriptor of nvme device
* @nsid: Return namespaces greater than this identifier
* @csi: Command Set Identifier
@@ -960,11 +993,12 @@ static inline int nvme_identify_independent_identify_ns(int fd, __u32 nsid,
}
/**
- * nvme_identify_ns_csi_user_data_format() -
+ * nvme_identify_ns_csi_user_data_format() - Identify namespace user data format
* @fd: File descriptor of nvme device
* @user_data_format: Return namespaces capability of identifier
* @uuidx: UUID selection, if supported
* @csi: Command Set Identifier
+ * @data: User space destination address to transfer the data
*
* Identify Namespace data structure for the specified User Data Format
* index containing the namespace capabilities for the NVM Command Set.
@@ -994,11 +1028,12 @@ static inline int nvme_identify_ns_csi_user_data_format(int fd,
}
/**
- * nvme_identify_iocs_ns_csi_user_data_format() -
+ * nvme_identify_iocs_ns_csi_user_data_format() - Identify I/O command set namespace data structure
* @fd: File descriptor of nvme device
* @user_data_format: Return namespaces capability of identifier
* @uuidx: UUID selection, if supported
* @csi: Command Set Identifier
+ * @data: User space destination address to transfer the data
*
* I/O Command Set specific Identify Namespace data structure for
* the specified User Data Format index containing the namespace
@@ -1048,7 +1083,7 @@ static inline int nvme_nvm_identify_ctrl(int fd, struct nvme_id_ctrl_nvm *id)
* nvme_identify_domain_list() - Domain list data
* @fd: File descriptor of nvme device
* @domid: Domain ID
- * @list: User space destiantion address to transfer data
+ * @list: User space destination address to transfer data
*
* A list of 31 domain IDs is returned to the host containing domain
* attributes in increasing order that are greater than the value
@@ -1183,45 +1218,6 @@ static inline int nvme_zns_identify_ctrl(int fd, struct nvme_zns_id_ctrl *id)
}
/**
- * struct nvme_get_log_args - Arguments for the NVMe Admin Get Log command
- * @lpo: Log page offset for partial log transfers
- * @result: The command completion result from CQE dword0
- * @log: User space destination address to transfer the data
- * @args_size: Length of the structure
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @lid: Log page identifier, see &enum nvme_cmd_get_log_lid for known
- * values
- * @len: Length of provided user buffer to hold the log data in bytes
- * @nsid: Namespace identifier, if applicable
- * @csi: Command set identifier, see &enum nvme_csi for known values
- * @lsi: Log Specific Identifier
- * @lsp: Log specific field
- * @uuidx: UUID selection, if supported
- * @rae: Retain asynchronous events
- * @ot: Offset Type; if set @lpo specifies the index into the list
- * of data structures, otherwise @lpo specifies the byte offset
- * into the log page.
- */
-struct nvme_get_log_args {
- __u64 lpo;
- __u32 *result;
- void *log;
- int args_size;
- int fd;
- __u32 timeout;
- enum nvme_cmd_get_log_lid lid;
- __u32 len;
- __u32 nsid;
- enum nvme_csi csi;
- __u16 lsi;
- __u8 lsp;
- __u8 uuidx;
- bool rae;
- bool ot;
-};
-
-/**
* nvme_get_log() - NVMe Admin Get Log command
* @args: &struct nvme_get_log_args argument structure
*
@@ -1291,8 +1287,8 @@ static inline int nvme_get_log_supported_log_pages(int fd, bool rae,
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
*/
-static inline int nvme_get_log_error(int fd, unsigned nr_entries, bool rae,
- struct nvme_error_log_page *err_log)
+static inline int nvme_get_log_error(int fd, unsigned int nr_entries, bool rae,
+ struct nvme_error_log_page *err_log)
{
return nvme_get_nsid_log(fd, rae, NVME_LOG_LID_ERROR,
NVME_NSID_ALL, sizeof(*err_log) * nr_entries,
@@ -1421,6 +1417,9 @@ static inline int nvme_get_log_device_self_test(int fd,
* nvme_get_log_create_telemetry_host() - Create host telemetry log
* @fd: File descriptor of nvme device
* @log: Userspace address of the log payload
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_log_create_telemetry_host(int fd,
struct nvme_telemetry_log *log)
@@ -1446,13 +1445,13 @@ static inline int nvme_get_log_create_telemetry_host(int fd,
}
/**
- * nvme_get_log_telemetry_host() -
+ * nvme_get_log_telemetry_host() - Get Telemetry Host-Initiated log page
* @fd: File descriptor of nvme device
* @offset: Offset into the telemetry data
* @len: Length of provided user buffer to hold the log data in bytes
* @log: User address for log page data
*
- * Retreives the Telemetry Host-Initiated log page at the requested offset
+ * Retrieves the Telemetry Host-Initiated log page at the requested offset
* using the previously existing capture.
*
* Return: The nvme command status if a response was received (see
@@ -1482,12 +1481,18 @@ static inline int nvme_get_log_telemetry_host(int fd, __u64 offset,
}
/**
- * nvme_get_log_telemetry_ctrl() -
+ * nvme_get_log_telemetry_ctrl() - Get Telemetry Controller-Initiated log page
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @offset: Offset into the telemetry data
* @len: Length of provided user buffer to hold the log data in bytes
* @log: User address for log page data
+ *
+ * Retrieves the Telemetry Controller-Initiated log page at the requested offset
+ * using the previously existing capture.
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_log_telemetry_ctrl(int fd, bool rae,
__u64 offset, __u32 len, void *log)
@@ -1513,7 +1518,7 @@ static inline int nvme_get_log_telemetry_ctrl(int fd, bool rae,
}
/**
- * nvme_get_log_endurance_group() -
+ * nvme_get_log_endurance_group() - Get Endurance Group log
* @fd: File descriptor of nvme device
* @endgid: Starting group identifier to return in the list
* @log: User address to store the endurance log
@@ -1552,7 +1557,7 @@ static inline int nvme_get_log_endurance_group(int fd, __u16 endgid,
}
/**
- * nvme_get_log_predictable_lat_nvmset() -
+ * nvme_get_log_predictable_lat_nvmset() - Predictable Latency Per NVM Set
* @fd: File descriptor of nvme device
* @nvmsetid: NVM set id
* @log: User address to store the predictable latency log
@@ -1584,12 +1589,15 @@ static inline int nvme_get_log_predictable_lat_nvmset(int fd, __u16 nvmsetid,
}
/**
- * nvme_get_log_predictable_lat_event() -
+ * nvme_get_log_predictable_lat_event() - Retrieve Predictable Latency Event Aggregate Log Page
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @offset: Offset into the predictable latency event
* @len: Length of provided user buffer to hold the log data in bytes
* @log: User address for log page data
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_log_predictable_lat_event(int fd, bool rae,
__u32 offset, __u32 len, void *log)
@@ -1615,25 +1623,25 @@ static inline int nvme_get_log_predictable_lat_event(int fd, bool rae,
}
/**
- * nvme_get_log_ana() -
+ * nvme_get_log_ana() - Retrieve Asymmetric Namespace Access log page
* @fd: File descriptor of nvme device
* @lsp: Log specific, see &enum nvme_get_log_ana_lsp
* @rae: Retain asynchronous events
* @offset: Offset to the start of the log page
* @len: The allocated length of the log page
- * @log: User address to store the ana log
+ * @log: User address to store the ana log
*
* This log consists of a header describing the log and descriptors containing
* the asymmetric namespace access information for ANA Groups that contain
* namespaces that are attached to the controller processing the command.
*
- * See &struct nvme_ana_rsp_hdr for the defintion of the returned structure.
+ * See &struct nvme_ana_rsp_hdr for the definition of the returned structure.
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
*/
-static int nvme_get_log_ana(int fd, enum nvme_log_ana_lsp lsp, bool rae,
- __u64 offset, __u32 len, void *log)
+static inline int nvme_get_log_ana(int fd, enum nvme_log_ana_lsp lsp, bool rae,
+ __u64 offset, __u32 len, void *log)
{
struct nvme_get_log_args args = {
.lpo = offset,
@@ -1647,7 +1655,7 @@ static int nvme_get_log_ana(int fd, enum nvme_log_ana_lsp lsp, bool rae,
.nsid = NVME_NSID_NONE,
.csi = NVME_CSI_NVM,
.lsi = NVME_LOG_LSI_NONE,
- .lsp = lsp,
+ .lsp = (__u8)lsp,
.uuidx = NVME_UUID_NONE,
.rae = false,
.ot = false,
@@ -1656,13 +1664,16 @@ static int nvme_get_log_ana(int fd, enum nvme_log_ana_lsp lsp, bool rae,
}
/**
- * nvme_get_log_ana_groups() -
+ * nvme_get_log_ana_groups() - Retrieve Asymmetric Namespace Access groups only log page
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @len: The allocated length of the log page
- * @log: User address to store the ana group log
+ * @log: User address to store the ana group log
+ *
+ * See &struct nvme_ana_group_desc for the definition of the returned structure.
*
- * See &struct nvme_ana_group_desc for the defintion of the returned structure.
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_log_ana_groups(int fd, bool rae, __u32 len,
struct nvme_ana_group_desc *log)
@@ -1672,12 +1683,15 @@ static inline int nvme_get_log_ana_groups(int fd, bool rae, __u32 len,
}
/**
- * nvme_get_log_lba_status() -
+ * nvme_get_log_lba_status() - Retrieve LBA Status
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @offset: Offset to the start of the log page
* @len: The allocated length of the log page
- * @log: User address to store the log page
+ * @log: User address to store the log page
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_log_lba_status(int fd, bool rae,
__u64 offset, __u32 len, void *log)
@@ -1703,12 +1717,15 @@ static inline int nvme_get_log_lba_status(int fd, bool rae,
}
/**
- * nvme_get_log_endurance_grp_evt() -
+ * nvme_get_log_endurance_grp_evt() - Retrieve Rotational Media Information
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @offset: Offset to the start of the log page
* @len: The allocated length of the log page
- * @log: User address to store the log page
+ * @log: User address to store the log page
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_log_endurance_grp_evt(int fd, bool rae,
__u32 offset, __u32 len, void *log)
@@ -1734,7 +1751,7 @@ static inline int nvme_get_log_endurance_grp_evt(int fd, bool rae,
}
/**
- * nvme_get_log_fid_supported_effects() -
+ * nvme_get_log_fid_supported_effects() - Retrieve Feature Identifiers Supported and Effects
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @log: FID Supported and Effects data structure
@@ -1750,7 +1767,7 @@ static inline int nvme_get_log_fid_supported_effects(int fd, bool rae,
}
/**
- * nvme_get_log_mi_cmd_supported_effects() - displays the MI Commands Supported byt the controller
+ * nvme_get_log_mi_cmd_supported_effects() - displays the MI Commands Supported by the controller
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @log: MI Command Supported and Effects data structure
@@ -1766,13 +1783,13 @@ static inline int nvme_get_log_mi_cmd_supported_effects(int fd, bool rae,
}
/**
- * nvme_get_log_boot_partition() -
+ * nvme_get_log_boot_partition() - Retrieve Boot Partition
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @lsp: The log specified field of LID
* @len: The allocated size, minimum
* struct nvme_boot_partition
- * @part: User address to store the log page
+ * @part: User address to store the log page
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise
@@ -1801,7 +1818,7 @@ static inline int nvme_get_log_boot_partition(int fd, bool rae,
}
/**
- * nvme_get_log_discovery() -
+ * nvme_get_log_discovery() - Retrieve Discovery log page
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @offset: Offset of this log to retrieve
@@ -1838,7 +1855,7 @@ static inline int nvme_get_log_discovery(int fd, bool rae,
}
/**
- * nvme_get_log_media_unit_stat() -
+ * nvme_get_log_media_unit_stat() - Retrieve Media Unit Status
* @fd: File descriptor of nvme device
* @domid: Domain Identifier selection, if supported
* @mus: User address to store the Media Unit statistics log
@@ -1870,9 +1887,10 @@ static inline int nvme_get_log_media_unit_stat(int fd, __u16 domid,
}
/**
- * nvme_get_log_support_cap_config_list() -
+ * nvme_get_log_support_cap_config_list() - Retrieve Supported Capacity Configuration List
* @fd: File descriptor of nvme device
* @domid: Domain Identifier selection, if supported
+ * @cap: User address to store supported capabilities config list
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise
@@ -1901,10 +1919,13 @@ static inline int nvme_get_log_support_cap_config_list(int fd, __u16 domid,
}
/**
- * nvme_get_log_reservation() -
+ * nvme_get_log_reservation() - Retrieve Reservation Notification
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @log: User address to store the reservation log
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise
*/
static inline int nvme_get_log_reservation(int fd, bool rae,
struct nvme_resv_notification_log *log)
@@ -1914,7 +1935,7 @@ static inline int nvme_get_log_reservation(int fd, bool rae,
}
/**
- * nvme_get_log_sanitize() -
+ * nvme_get_log_sanitize() - Retrieve Sanitize Status
* @fd: File descriptor of nvme device
* @rae: Retain asynchronous events
* @log: User address to store the sanitize log
@@ -1933,7 +1954,7 @@ static inline int nvme_get_log_sanitize(int fd, bool rae,
}
/**
- * nvme_get_log_zns_changed_zones() -
+ * nvme_get_log_zns_changed_zones() - Retrieve list of zones that have changed
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @rae: Retain asynchronous events
@@ -1968,11 +1989,14 @@ static inline int nvme_get_log_zns_changed_zones(int fd, __u32 nsid, bool rae,
}
/**
- * nvme_get_log_persistent_event() -
+ * nvme_get_log_persistent_event() - Retrieve Persistent Event Log
* @fd: File descriptor of nvme device
* @action: Action the controller should take during processing this command
* @size: Size of @pevent_log
* @pevent_log: User address to store the persistent event log
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_log_persistent_event(int fd,
enum nvme_pevent_log_action action,
@@ -1990,7 +2014,7 @@ static inline int nvme_get_log_persistent_event(int fd,
.nsid = NVME_NSID_ALL,
.csi = NVME_CSI_NVM,
.lsi = NVME_LOG_LSI_NONE,
- .lsp = action,
+ .lsp = (__u8)action,
.uuidx = NVME_UUID_NONE,
.rae = false,
.ot = false,
@@ -1999,39 +2023,6 @@ static inline int nvme_get_log_persistent_event(int fd,
}
/**
- * struct nvme_set_features_args - Arguments for the NVMe Admin Set Feature command
- * @result: The command completion result from CQE dword0
- * @data: User address of feature data, if applicable
- * @args_size: Size of &struct nvme_set_features_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID, if applicable
- * @cdw11: Value to set the feature to
- * @cdw12: Feature specific command dword12 field
- * @cdw15: Feature specific command dword15 field
- * @data_len: Length of feature data, if applicable, in bytes
- * @save: Save value across power states
- * @uuidx: UUID Index for differentiating vendor specific encoding
- * @fid: Feature identifier
- */
-struct nvme_set_features_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 cdw11;
- __u32 cdw12;
- __u32 cdw13;
- __u32 cdw15;
- __u32 data_len;
- bool save;
- __u8 uuidx;
- __u8 fid;
-};
-
-/**
* nvme_set_features() - Set a feature attribute
* @args: &struct nvme_set_features_args argument structure
*
@@ -2050,6 +2041,9 @@ int nvme_set_features(struct nvme_set_features_args *args);
* @data_len: Length of feature data, if applicable, in bytes
* @data: User address of feature data, if applicable
* @result: The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_set_features_data(int fd, __u8 fid, __u32 nsid,
__u32 cdw11, bool save, __u32 data_len, void *data,
@@ -2075,13 +2069,16 @@ static inline int nvme_set_features_data(int fd, __u8 fid, __u32 nsid,
}
/**
- * nvme_set_features_simple() - Helper functionn for @nvme_set_features()
+ * nvme_set_features_simple() - Helper function for @nvme_set_features()
* @fd: File descriptor of nvme device
* @fid: Feature identifier
* @nsid: Namespace ID, if applicable
* @cdw11: Value to set the feature to
* @save: Save value across power states
* @result: The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_set_features_simple(int fd, __u8 fid, __u32 nsid,
__u32 cdw11, bool save, __u32 *result)
@@ -2091,7 +2088,7 @@ static inline int nvme_set_features_simple(int fd, __u8 fid, __u32 nsid,
}
/**
- * nvme_set_features_arbitration() -
+ * nvme_set_features_arbitration() - Set arbitration features
* @fd: File descriptor of nvme device
* @ab: Arbitration Burst
* @lpw: Low Priority Weight
@@ -2107,7 +2104,7 @@ int nvme_set_features_arbitration(int fd, __u8 ab, __u8 lpw, __u8 mpw,
__u8 hpw, bool save, __u32 *result);
/**
- * nvme_set_features_power_mgmt() -
+ * nvme_set_features_power_mgmt() - Set power management feature
* @fd: File descriptor of nvme device
* @ps: Power State
* @wh: Workload Hint
@@ -2121,7 +2118,7 @@ int nvme_set_features_power_mgmt(int fd, __u8 ps, __u8 wh, bool save,
__u32 *result);
/**
- * nvme_set_features_lba_range() -
+ * nvme_set_features_lba_range() - Set LBA range feature
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @nr_ranges: Number of ranges in @data
@@ -2136,7 +2133,7 @@ int nvme_set_features_lba_range(int fd, __u32 nsid, __u32 nr_ranges, bool save,
struct nvme_lba_range_type *data, __u32 *result);
/**
- * nvme_set_features_temp_thresh() -
+ * nvme_set_features_temp_thresh() - Set temperature threshold feature
* @fd: File descriptor of nvme device
* @tmpth: Temperature Threshold
* @tmpsel: Threshold Temperature Select
@@ -2152,7 +2149,7 @@ int nvme_set_features_temp_thresh(int fd, __u16 tmpth, __u8 tmpsel,
bool save, __u32 *result);
/**
- * nvme_set_features_err_recovery() -
+ * nvme_set_features_err_recovery() - Set error recovery feature
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @tler: Time-limited error recovery value
@@ -2167,7 +2164,7 @@ int nvme_set_features_err_recovery(int fd, __u32 nsid, __u16 tler,
bool dulbe, bool save, __u32 *result);
/**
- * nvme_set_features_volatile_wc() -
+ * nvme_set_features_volatile_wc() - Set volatile write cache feature
* @fd: File descriptor of nvme device
* @wce: Write cache enable
* @save: Save value across power states
@@ -2180,7 +2177,7 @@ int nvme_set_features_volatile_wc(int fd, bool wce, bool save,
__u32 *result);
/**
- * nvme_set_features_irq_coalesce() -
+ * nvme_set_features_irq_coalesce() - Set IRQ coalesce feature
* @fd: File descriptor of nvme device
* @thr: Aggregation Threshold
* @time: Aggregation Time
@@ -2194,7 +2191,7 @@ int nvme_set_features_irq_coalesce(int fd, __u8 thr, __u8 time,
bool save, __u32 *result);
/**
- * nvme_set_features_irq_config() -
+ * nvme_set_features_irq_config() - Set IRQ config feature
* @fd: File descriptor of nvme device
* @iv: Interrupt Vector
* @cd: Coalescing Disable
@@ -2208,7 +2205,7 @@ int nvme_set_features_irq_config(int fd, __u16 iv, bool cd, bool save,
__u32 *result);
/**
- * nvme_set_features_write_atomic() -
+ * nvme_set_features_write_atomic() - Set write atomic feature
* @fd: File descriptor of nvme device
* @dn: Disable Normal
* @save: Save value across power states
@@ -2221,7 +2218,7 @@ int nvme_set_features_write_atomic(int fd, bool dn, bool save,
__u32 *result);
/**
- * nvme_set_features_async_event() -
+ * nvme_set_features_async_event() - Set asynchronous event feature
* @fd: File descriptor of nvme device
* @events: Events to enable
* @save: Save value across power states
@@ -2234,7 +2231,7 @@ int nvme_set_features_async_event(int fd, __u32 events, bool save,
__u32 *result);
/**
- * nvme_set_features_auto_pst() -
+ * nvme_set_features_auto_pst() - Set autonomous power state feature
* @fd: File descriptor of nvme device
* @apste: Autonomous Power State Transition Enable
* @apst: Autonomous Power State Transition
@@ -2249,10 +2246,10 @@ int nvme_set_features_auto_pst(int fd, bool apste, bool save,
__u32 *result);
/**
- * nvme_set_features_timestamp() -
+ * nvme_set_features_timestamp() - Set timestamp feature
* @fd: File descriptor of nvme device
* @save: Save value across power states
- * @timestamp: The current timestamp value to assign to this this feature
+ * @timestamp: The current timestamp value to assign to this feature
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
@@ -2260,7 +2257,7 @@ int nvme_set_features_auto_pst(int fd, bool apste, bool save,
int nvme_set_features_timestamp(int fd, bool save, __u64 timestamp);
/**
- * nvme_set_features_hctm() -
+ * nvme_set_features_hctm() - Set thermal management feature
* @fd: File descriptor of nvme device
* @tmt2: Thermal Management Temperature 2
* @tmt1: Thermal Management Temperature 1
@@ -2274,7 +2271,7 @@ int nvme_set_features_hctm(int fd, __u16 tmt2, __u16 tmt1, bool save,
__u32 *result);
/**
- * nvme_set_features_nopsc() -
+ * nvme_set_features_nopsc() - Set non-operational power state feature
* @fd: File descriptor of nvme device
* @noppme: Non-Operational Power State Permissive Mode Enable
* @save: Save value across power states
@@ -2286,7 +2283,7 @@ int nvme_set_features_hctm(int fd, __u16 tmt2, __u16 tmt1, bool save,
int nvme_set_features_nopsc(int fd, bool noppme, bool save, __u32 *result);
/**
- * nvme_set_features_rrl() -
+ * nvme_set_features_rrl() - Set read recovery level feature
* @fd: File descriptor of nvme device
* @rrl: Read recovery level setting
* @nvmsetid: NVM set id
@@ -2300,7 +2297,7 @@ int nvme_set_features_rrl(int fd, __u8 rrl, __u16 nvmsetid, bool save,
__u32 *result);
/**
- * nvme_set_features_plm_config() -
+ * nvme_set_features_plm_config() - Set predictable latency feature
* @fd: File descriptor of nvme device
* @enable: Predictable Latency Enable
* @nvmsetid: NVM Set Identifier
@@ -2313,10 +2310,10 @@ int nvme_set_features_rrl(int fd, __u8 rrl, __u16 nvmsetid, bool save,
*/
int nvme_set_features_plm_config(int fd, bool enable, __u16 nvmsetid,
bool save, struct nvme_plm_config *data,
- __u32*result);
+ __u32 *result);
/**
- * nvme_set_features_plm_window() -
+ * nvme_set_features_plm_window() - Set window select feature
* @fd: File descriptor of nvme device
* @sel: Window Select
* @nvmsetid: NVM Set Identifier
@@ -2330,7 +2327,7 @@ int nvme_set_features_plm_window(int fd, enum nvme_feat_plm_window_select sel,
__u16 nvmsetid, bool save, __u32 *result);
/**
- * nvme_set_features_lba_sts_interval() -
+ * nvme_set_features_lba_sts_interval() - Set LBA status information feature
* @fd: File descriptor of nvme device
* @save: Save value across power states
* @lsiri: LBA Status Information Report Interval
@@ -2344,7 +2341,7 @@ int nvme_set_features_lba_sts_interval(int fd, __u16 lsiri, __u16 lsipi,
bool save, __u32 *result);
/**
- * nvme_set_features_host_behavior() -
+ * nvme_set_features_host_behavior() - Set host behavior feature
* @fd: File descriptor of nvme device
* @save: Save value across power states
* @data: Pointer to structure nvme_feat_host_behavior
@@ -2356,7 +2353,7 @@ int nvme_set_features_host_behavior(int fd, bool save,
struct nvme_feat_host_behavior *data);
/**
- * nvme_set_features_sanitize() -
+ * nvme_set_features_sanitize() - Set sanitize feature
* @fd: File descriptor of nvme device
* @nodrm: No-Deallocate Response Mode
* @save: Save value across power states
@@ -2368,7 +2365,7 @@ int nvme_set_features_host_behavior(int fd, bool save,
int nvme_set_features_sanitize(int fd, bool nodrm, bool save, __u32 *result);
/**
- * nvme_set_features_endurance_evt_cfg() -
+ * nvme_set_features_endurance_evt_cfg() - Set endurance event config feature
* @fd: File descriptor of nvme device
* @endgid: Endurance Group Identifier
* @egwarn: Flags to enable warning, see &enum nvme_eg_critical_warning_flags
@@ -2382,7 +2379,7 @@ int nvme_set_features_endurance_evt_cfg(int fd, __u16 endgid, __u8 egwarn,
bool save, __u32 *result);
/**
- * nvme_set_features_sw_progress() -
+ * nvme_set_features_sw_progress() - Set pre-boot software load count feature
* @fd: File descriptor of nvme device
* @pbslc: Pre-boot Software Load Count
* @save: Save value across power states
@@ -2395,7 +2392,7 @@ int nvme_set_features_sw_progress(int fd, __u8 pbslc, bool save,
__u32 *result);
/**
- * nvme_set_features_host_id() -
+ * nvme_set_features_host_id() - Set enable extended host identifers feature
* @fd: File descriptor of nvme device
* @exhid: Enable Extended Host Identifier
* @save: Save value across power states
@@ -2407,7 +2404,7 @@ int nvme_set_features_sw_progress(int fd, __u8 pbslc, bool save,
int nvme_set_features_host_id(int fd, bool exhid, bool save, __u8 *hostid);
/**
- * nvme_set_features_resv_mask() -
+ * nvme_set_features_resv_mask() - Set reservation notification mask feature
* @fd: File descriptor of nvme device
* @mask: Reservation Notification Mask Field
* @save: Save value across power states
@@ -2419,7 +2416,7 @@ int nvme_set_features_host_id(int fd, bool exhid, bool save, __u8 *hostid);
int nvme_set_features_resv_mask(int fd, __u32 mask, bool save, __u32 *result);
/**
- * nvme_set_features_resv_persist() -
+ * nvme_set_features_resv_persist() - Set persist through power loss feature
* @fd: File descriptor of nvme device
* @ptpl: Persist Through Power Loss
* @save: Save value across power states
@@ -2431,7 +2428,7 @@ int nvme_set_features_resv_mask(int fd, __u32 mask, bool save, __u32 *result);
int nvme_set_features_resv_persist(int fd, bool ptpl, bool save, __u32 *result);
/**
- * nvme_set_features_write_protect() -
+ * nvme_set_features_write_protect() - Set write protect feature
* @fd: File descriptor of nvme device
* @state: Write Protection State
* @save: Save value across power states
@@ -2442,34 +2439,6 @@ int nvme_set_features_resv_persist(int fd, bool ptpl, bool save, __u32 *result);
*/
int nvme_set_features_write_protect(int fd, enum nvme_feat_nswpcfg_state state,
bool save, __u32 *result);
-/**
- * struct nvme_get_features_args - Arguments for the NVMe Admin Get Feature command
- * @args_size: Size of &struct nvme_get_features_args
- * @fd: File descriptor of nvme device
- * @result: The command completion result from CQE dword0
- * @timeout: Timeout in ms
- * @nsid: Namespace ID, if applicable
- * @sel: Select which type of attribute to return,
- * see &enum nvme_get_features_sel
- * @cdw11: Feature specific command dword11 field
- * @data_len: Length of feature data, if applicable, in bytes
- * @data: User address of feature data, if applicable
- * @fid: Feature identifier, see &enum nvme_features_id
- * @uuidx: UUID Index for differentiating vendor specific encoding
- */
-struct nvme_get_features_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_get_features_sel sel;
- __u32 cdw11;
- __u32 data_len;
- __u8 fid;
- __u8 uuidx;
-};
/**
* nvme_get_features() - Retrieve a feature attribute
@@ -2488,6 +2457,9 @@ int nvme_get_features(struct nvme_get_features_args *args);
* @data_len: Length of feature data, if applicable, in bytes
* @data: User address of feature data, if applicable
* @result: The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_features_data(int fd, enum nvme_features_id fid,
__u32 nsid, __u32 data_len, void *data, __u32 *result)
@@ -2502,7 +2474,7 @@ static inline int nvme_get_features_data(int fd, enum nvme_features_id fid,
.sel = NVME_GET_FEATURES_SEL_CURRENT,
.cdw11 = 0,
.data_len = data_len,
- .fid = fid,
+ .fid = (__u8)fid,
.uuidx = NVME_UUID_NONE,
};
@@ -2515,6 +2487,9 @@ static inline int nvme_get_features_data(int fd, enum nvme_features_id fid,
* @fid: Feature identifier
* @nsid: Namespace ID, if applicable
* @result: The command completion result from CQE dword0
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_get_features_simple(int fd, enum nvme_features_id fid,
__u32 nsid, __u32 *result)
@@ -2523,7 +2498,7 @@ static inline int nvme_get_features_simple(int fd, enum nvme_features_id fid,
}
/**
- * nvme_get_features_arbitration() -
+ * nvme_get_features_arbitration() - Get arbitration feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2535,7 +2510,7 @@ int nvme_get_features_arbitration(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_power_mgmt() -
+ * nvme_get_features_power_mgmt() - Get power management feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2547,7 +2522,7 @@ int nvme_get_features_power_mgmt(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_lba_range() -
+ * nvme_get_features_lba_range() - Get LBA range feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @data: User address of feature data, if applicable
@@ -2561,7 +2536,7 @@ int nvme_get_features_lba_range(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_temp_thresh() -
+ * nvme_get_features_temp_thresh() - Get temperature threshold feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2573,7 +2548,7 @@ int nvme_get_features_temp_thresh(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_err_recovery() -
+ * nvme_get_features_err_recovery() - Get error recovery feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2585,7 +2560,7 @@ int nvme_get_features_err_recovery(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_volatile_wc() -
+ * nvme_get_features_volatile_wc() - Get volatile write cache feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2597,7 +2572,7 @@ int nvme_get_features_volatile_wc(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_num_queues() -
+ * nvme_get_features_num_queues() - Get number of queues feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2609,7 +2584,7 @@ int nvme_get_features_num_queues(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_irq_coalesce() -
+ * nvme_get_features_irq_coalesce() - Get IRQ coalesce feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2621,7 +2596,7 @@ int nvme_get_features_irq_coalesce(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_irq_config() -
+ * nvme_get_features_irq_config() - Get IRQ config feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @iv:
@@ -2634,7 +2609,7 @@ int nvme_get_features_irq_config(int fd, enum nvme_get_features_sel sel,
__u16 iv, __u32 *result);
/**
- * nvme_get_features_write_atomic() -
+ * nvme_get_features_write_atomic() - Get write atomic feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2646,7 +2621,7 @@ int nvme_get_features_write_atomic(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_async_event() -
+ * nvme_get_features_async_event() - Get asynchronous event feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2658,7 +2633,7 @@ int nvme_get_features_async_event(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_auto_pst() -
+ * nvme_get_features_auto_pst() - Get autonomous power state feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @apst:
@@ -2671,7 +2646,7 @@ int nvme_get_features_auto_pst(int fd, enum nvme_get_features_sel sel,
struct nvme_feat_auto_pst *apst, __u32 *result);
/**
- * nvme_get_features_host_mem_buf() -
+ * nvme_get_features_host_mem_buf() - Get host memory buffer feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2683,7 +2658,7 @@ int nvme_get_features_host_mem_buf(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_timestamp() -
+ * nvme_get_features_timestamp() - Get timestamp feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @ts: Current timestamp
@@ -2695,7 +2670,7 @@ int nvme_get_features_timestamp(int fd, enum nvme_get_features_sel sel,
struct nvme_timestamp *ts);
/**
- * nvme_get_features_kato() -
+ * nvme_get_features_kato() - Get keep alive timeout feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2706,7 +2681,7 @@ int nvme_get_features_timestamp(int fd, enum nvme_get_features_sel sel,
int nvme_get_features_kato(int fd, enum nvme_get_features_sel sel, __u32 *result);
/**
- * nvme_get_features_hctm() -
+ * nvme_get_features_hctm() - Get thermal management feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2717,7 +2692,7 @@ int nvme_get_features_kato(int fd, enum nvme_get_features_sel sel, __u32 *result
int nvme_get_features_hctm(int fd, enum nvme_get_features_sel sel, __u32 *result);
/**
- * nvme_get_features_nopsc() -
+ * nvme_get_features_nopsc() - Get non-operational power state feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2728,7 +2703,7 @@ int nvme_get_features_hctm(int fd, enum nvme_get_features_sel sel, __u32 *result
int nvme_get_features_nopsc(int fd, enum nvme_get_features_sel sel, __u32 *result);
/**
- * nvme_get_features_rrl() -
+ * nvme_get_features_rrl() - Get read recovery level feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2739,7 +2714,7 @@ int nvme_get_features_nopsc(int fd, enum nvme_get_features_sel sel, __u32 *resul
int nvme_get_features_rrl(int fd, enum nvme_get_features_sel sel, __u32 *result);
/**
- * nvme_get_features_plm_config() -
+ * nvme_get_features_plm_config() - Get predictable latency feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @nvmsetid: NVM set id
@@ -2754,7 +2729,7 @@ int nvme_get_features_plm_config(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_plm_window() -
+ * nvme_get_features_plm_window() - Get window select feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @nvmsetid: NVM set id
@@ -2767,7 +2742,7 @@ int nvme_get_features_plm_window(int fd, enum nvme_get_features_sel sel,
__u16 nvmsetid, __u32 *result);
/**
- * nvme_get_features_lba_sts_interval() -
+ * nvme_get_features_lba_sts_interval() - Get LBA status information feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2779,10 +2754,10 @@ int nvme_get_features_lba_sts_interval(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_host_behavior() -
+ * nvme_get_features_host_behavior() - Get host behavior feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
- * @data: Poniter to structure nvme_feat_host_behavior
+ * @data: Pointer to structure nvme_feat_host_behavior
* @result: The command completion result from CQE dword0
*
* Return: The nvme command status if a response was received (see
@@ -2793,7 +2768,7 @@ int nvme_get_features_host_behavior(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_sanitize() -
+ * nvme_get_features_sanitize() - Get sanitize feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2805,7 +2780,7 @@ int nvme_get_features_sanitize(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_endurance_event_cfg() -
+ * nvme_get_features_endurance_event_cfg() - Get endurance event config feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @endgid: Endurance Group Identifier
@@ -2818,7 +2793,7 @@ int nvme_get_features_endurance_event_cfg(int fd, enum nvme_get_features_sel sel
__u16 endgid, __u32 *result);
/**
- * nvme_get_features_sw_progress() -
+ * nvme_get_features_sw_progress() - Get software progress feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2830,7 +2805,7 @@ int nvme_get_features_sw_progress(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_host_id() -
+ * nvme_get_features_host_id() - Get host id feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @exhid: Enable Extended Host Identifier
@@ -2844,7 +2819,7 @@ int nvme_get_features_host_id(int fd, enum nvme_get_features_sel sel,
bool exhid, __u32 len, __u8 *hostid);
/**
- * nvme_get_features_resv_mask() -
+ * nvme_get_features_resv_mask() - Get reservation mask feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2856,7 +2831,7 @@ int nvme_get_features_resv_mask(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_resv_persist() -
+ * nvme_get_features_resv_persist() - Get reservation persist feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2868,7 +2843,7 @@ int nvme_get_features_resv_persist(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * nvme_get_features_write_protect() -
+ * nvme_get_features_write_protect() - Get write protect feature
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
@@ -2882,7 +2857,7 @@ int nvme_get_features_write_protect(int fd, __u32 nsid,
__u32 *result);
/**
- * nvme_get_features_iocs_profile() -
+ * nvme_get_features_iocs_profile() - Get IOCS profile feature
* @fd: File descriptor of nvme device
* @sel: Select which type of attribute to return, see &enum nvme_get_features_sel
* @result: The command completion result from CQE dword0
@@ -2894,33 +2869,6 @@ int nvme_get_features_iocs_profile(int fd, enum nvme_get_features_sel sel,
__u32 *result);
/**
- * struct nvme_format_nvm_args - Arguments for the Format Nvme Namespace command
- * @result: The command completion result from CQE dword0
- * @args_size: Size of &struct nvme_format_nvm_args
- * @fd: File descriptor of nvme device
- * @timeout: Set to override default timeout to this value in milliseconds;
- * useful for long running formats. 0 will use system default.
- * @nsid: Namespace ID to format
- * @mset: Metadata settings (extended or separated), true if extended
- * @pi: Protection information type
- * @pil: Protection information location (beginning or end), true if end
- * @ses: Secure erase settings
- * @lbaf: Logical block address format
- */
-struct nvme_format_nvm_args {
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_cmd_format_mset mset;
- enum nvme_cmd_format_pi pi;
- enum nvme_cmd_format_pil pil;
- enum nvme_cmd_format_ses ses;
- __u8 lbaf;
-};
-
-/**
* nvme_format_nvm() - Format nvme namespace(s)
* @args: &struct nvme_format_nvme_args argument structure
*
@@ -2935,40 +2883,21 @@ struct nvme_format_nvm_args {
int nvme_format_nvm(struct nvme_format_nvm_args *args);
/**
- * struct nvme_ns_mgmt_args - Arguments for NVMe Namespace Management command
- * @result: NVMe command result
- * @ns: Namespace identication descriptors
- * @args_size: Size of &struct nvme_ns_mgmt_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace identifier
- * @sel: Type of management operation to perform
- * @csi: Command Set Identifier
- */
-struct nvme_ns_mgmt_args {
- __u32 *result;
- struct nvme_id_ns *ns;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_ns_mgmt_sel sel;
- __u8 csi;
-};
-
-/**
* nvme_ns_mgmt() - Issue a Namespace management command
* @args: &struct nvme_ns_mgmt_args Argument structure
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
int nvme_ns_mgmt(struct nvme_ns_mgmt_args *args);
/**
- * nvme_ns_mgmt_create() -
+ * nvme_ns_mgmt_create() - Create a non attached namespace
* @fd: File descriptor of nvme device
* @ns: Namespace identification that defines ns creation parameters
* @nsid: On success, set to the namespace id that was created
- * @timeout: Overide the default timeout to this value in milliseconds;
- * set to 0 to use the system default.
+ * @timeout: Override the default timeout to this value in milliseconds;
+ * set to 0 to use the system default.
* @csi: Command Set Identifier
*
* On successful creation, the namespace exists in the subsystem, but is not
@@ -2996,7 +2925,7 @@ static inline int nvme_ns_mgmt_create(int fd, struct nvme_id_ns *ns,
}
/**
- * nvme_ns_mgmt_delete() -
+ * nvme_ns_mgmt_delete() - Delete a non attached namespace
* @fd: File descriptor of nvme device
* @nsid: Namespace identifier to delete
*
@@ -3024,36 +2953,22 @@ static inline int nvme_ns_mgmt_delete(int fd, __u32 nsid)
}
/**
- * struct nvme_ns_attach_args - Arguments for Nvme Namespace Management command
- * @result: NVMe command result
- * @ctrlist: Controller list to modify attachment state of nsid
- * @args_size: Size of &struct nvme_ns_attach_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID to execute attach selection
- * @sel: Attachment selection, see &enum nvme_ns_attach_sel
- */
-struct nvme_ns_attach_args {
- __u32 *result;
- struct nvme_ctrl_list *ctrlist;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_ns_attach_sel sel;
-};
-
-/**
* nvme_ns_attach() - Attach or detach namespace to controller(s)
* @args: &struct nvme_ns_attach_args Argument structure
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
int nvme_ns_attach(struct nvme_ns_attach_args *args);
/**
- * nvme_ns_attach_ctrls() -
+ * nvme_ns_attach_ctrls() - Attach namespace to controllers
* @fd: File descriptor of nvme device
* @nsid: Namespace ID to attach
* @ctrlist: Controller list to modify attachment state of nsid
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_ns_attach_ctrls(int fd, __u32 nsid,
struct nvme_ctrl_list *ctrlist)
@@ -3072,10 +2987,13 @@ static inline int nvme_ns_attach_ctrls(int fd, __u32 nsid,
}
/**
- * nvme_ns_detach_ctrls() -
+ * nvme_ns_detach_ctrls() - Detach namespace from controllers
* @fd: File descriptor of nvme device
* @nsid: Namespace ID to detach
* @ctrlist: Controller list to modify attachment state of nsid
+ *
+ * Return: The nvme command status if a response was received (see
+ * &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_ns_detach_ctrls(int fd, __u32 nsid,
struct nvme_ctrl_list *ctrlist)
@@ -3094,28 +3012,8 @@ static inline int nvme_ns_detach_ctrls(int fd, __u32 nsid,
}
/**
- * struct nvme_fw_download_args - Arguments for the NVMe Firmware Download command
- * @args_size: Size of &struct nvme_fw_download_args
- * @fd: File descriptor of nvme device
- * @result: The command completion result from CQE dword0
- * @timeout: Timeout in ms
- * @offset: Offset in the firmware data
- * @data: Userspace address of the firmware data
- * @data_len: Length of data in this command in bytes
- */
-struct nvme_fw_download_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 offset;
- __u32 data_len;
-};
-
-/**
* nvme_fw_download() - Download part or all of a firmware image to the
- * controller
+ * controller
* @args: &struct nvme_fw_download_args argument structure
*
* The Firmware Image Download command downloads all or a portion of an image
@@ -3137,26 +3035,6 @@ struct nvme_fw_download_args {
int nvme_fw_download(struct nvme_fw_download_args *args);
/**
- * struct nvme_fw_commit_args - Arguments for the NVMe Firmware Commit command
- * @args_size: Size of &struct nvme_fw_commit_args
- * @fd: File descriptor of nvme device
- * @action: Action to use for the firmware image, see &enum nvme_fw_commit_ca
- * @timeout: Timeout in ms
- * @result: The command completion result from CQE dword0
- * @slot: Firmware slot to commit the downloaded image
- * @bpid: Set to true to select the boot partition id
- */
-struct nvme_fw_commit_args {
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- enum nvme_fw_commit_ca action;
- __u8 slot;
- bool bpid;
-};
-
-/**
* nvme_fw_commit() - Commit firmware using the specified action
* @args: &struct nvme_fw_commit_args argument structure
*
@@ -3170,37 +3048,7 @@ struct nvme_fw_commit_args {
int nvme_fw_commit(struct nvme_fw_commit_args *args);
/**
- * struct nvme_security_send_args - Arguments for the NVMe Security Send command
- * @result: The command completion result from CQE dword0
- * @data: Security data payload to send
- * @args_size: Size of &struct nvme_security_send_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID to issue security command on
- * @tl: Protocol specific transfer length
- * @data_len: Data length of the payload in bytes
- * @nssf: NVMe Security Specific field
- * @spsp0: Security Protocol Specific field
- * @spsp1: Security Protocol Specific field
- * @secp: Security Protocol
- */
-struct nvme_security_send_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 tl;
- __u32 data_len;
- __u8 nssf;
- __u8 spsp0;
- __u8 spsp1;
- __u8 secp;
-};
-
-/**
- * nvme_security_send() -
+ * nvme_security_send() - Security Send command
* @args: &struct nvme_security_send argument structure
*
* The Security Send command transfers security protocol data to the
@@ -3218,38 +3066,8 @@ struct nvme_security_send_args {
int nvme_security_send(struct nvme_security_send_args *args);
/**
- * struct nvme_security_receive_args - Arguments for the NVMe Security Receive command
- * @result: The command completion result from CQE dword0
- * @data: Security data payload to send
- * @args_size: Size of &struct nvme_security_receive_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID to issue security command on
- * @al: Protocol specific allocation length
- * @data_len: Data length of the payload in bytes
- * @nssf: NVMe Security Specific field
- * @spsp0: Security Protocol Specific field
- * @spsp1: Security Protocol Specific field
- * @secp: Security Protocol
- */
-struct nvme_security_receive_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 al;
- __u32 data_len;
- __u8 nssf;
- __u8 spsp0;
- __u8 spsp1;
- __u8 secp;
-};
-
-/**
- * nvme_security_receive() -
- * @args: &struct nvme_security_recevice argument structure
+ * nvme_security_receive() - Security Receive command
+ * @args: &struct nvme_security_receive argument structure
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
@@ -3257,33 +3075,6 @@ struct nvme_security_receive_args {
int nvme_security_receive(struct nvme_security_receive_args *args);
/**
- * struct nvme_get_lba_status_args - Arguments for the NVMe Get LBA Status command
- * @lbas: Data payload to return status descriptors
- * @result: The command completion result from CQE dword0
- * @slba: Starting logical block address to check statuses
- * @args_size: Size of &struct nvme_get_lba_status_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID to retrieve LBA status
- * @mndw: Maximum number of dwords to return
- * @atype: Action type mechanism to determine LBA status desctriptors to
- * return, see &enum nvme_lba_status_atype
- * @rl: Range length from slba to perform the action
- */
-struct nvme_get_lba_status_args {
- __u64 slba;
- __u32 *result;
- struct nvme_lba_status *lbas;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 mndw;
- enum nvme_lba_status_atype atype;
- __u16 rl;
-};
-
-/**
* nvme_get_lba_status() - Retrieve information on possibly unrecoverable LBAs
* @args: &struct nvme_get_lba_status_args argument structure
*
@@ -3296,34 +3087,6 @@ struct nvme_get_lba_status_args {
int nvme_get_lba_status(struct nvme_get_lba_status_args *args);
/**
- * struct nvme_directive_send_args - Arguments for the NVMe Directive Send command
- * @result: If successful, the CQE dword0 value
- * @data: Data payload to to be send
- * @args_size: Size of &struct nvme_directive_send_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID, if applicable
- * @doper: Directive send operation, see &enum nvme_directive_send_doper
- * @dtype: Directive type, see &enum nvme_directive_dtype
- * @cdw12: Directive specific command dword12
- * @data_len: Length of data payload in bytes
- * @dspec: Directive specific field
- */
-struct nvme_directive_send_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_directive_send_doper doper;
- enum nvme_directive_dtype dtype;
- __u32 cdw12;
- __u32 data_len;
- __u16 dspec;
-};
-
-/**
* nvme_directive_send() - Send directive command
* @args: &struct nvme_directive_send_args argument structure
*
@@ -3339,7 +3102,7 @@ struct nvme_directive_send_args {
int nvme_directive_send(struct nvme_directive_send_args *args);
/**
- * nvme_directive_send_id_endir() -
+ * nvme_directive_send_id_endir() - Directive Send Enable Directive
* @fd: File descriptor of nvme device
* @nsid: Namespace Identifier
* @endir: Enable Directive
@@ -3354,7 +3117,7 @@ int nvme_directive_send_id_endir(int fd, __u32 nsid, bool endir,
struct nvme_id_directives *id);
/**
- * nvme_directive_send_stream_release_identifier() -
+ * nvme_directive_send_stream_release_identifier() - Directive Send Stream release
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @stream_id: Stream identifier
@@ -3383,7 +3146,7 @@ static inline int nvme_directive_send_stream_release_identifier(int fd,
}
/**
- * nvme_directive_send_stream_release_resource() -
+ * nvme_directive_send_stream_release_resource() - Directive Send Stream release resources
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
*
@@ -3410,34 +3173,6 @@ static inline int nvme_directive_send_stream_release_resource(int fd, __u32 nsid
}
/**
- * struct nvme_directive_recv_args - Arguments for the NVMe Directive Receive command
- * @result: If successful, the CQE dword0 value
- * @data: Usespace address of data payload
- * @args_size: Size of &struct nvme_directive_recv_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID, if applicable
- * @doper: Directive send operation, see &enum nvme_directive_send_doper
- * @dtype: Directive type, see &enum nvme_directive_dtype
- * @cdw12: Directive specific command dword12
- * @data_len: Length of data payload in bytes
- * @dspec: Directive specific field
- */
-struct nvme_directive_recv_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_directive_receive_doper doper;
- enum nvme_directive_dtype dtype;
- __u32 cdw12;
- __u32 data_len;
- __u16 dspec;
-};
-
-/**
* nvme_directive_recv() - Receive directive specific data
* @args: &struct nvme_directive_recv_args argument structure
*
@@ -3447,7 +3182,7 @@ struct nvme_directive_recv_args {
int nvme_directive_recv(struct nvme_directive_recv_args *args);
/**
- * nvme_directive_recv_identify_parameters() -
+ * nvme_directive_recv_identify_parameters() - Directive receive identifier parameters
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @id: Identify parameters buffer
@@ -3476,7 +3211,7 @@ static inline int nvme_directive_recv_identify_parameters(int fd, __u32 nsid,
}
/**
- * nvme_directive_recv_stream_parameters() -
+ * nvme_directive_recv_stream_parameters() - Directive receive stream parameters
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @parms: Streams directive parameters buffer
@@ -3505,7 +3240,7 @@ static inline int nvme_directive_recv_stream_parameters(int fd, __u32 nsid,
}
/**
- * nvme_directive_recv_stream_status() -
+ * nvme_directive_recv_stream_status() - Directive receive stream status
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @nr_entries: Number of streams to receive
@@ -3515,7 +3250,7 @@ static inline int nvme_directive_recv_stream_parameters(int fd, __u32 nsid,
* &enum nvme_status_field) or -1 with errno set otherwise.
*/
static inline int nvme_directive_recv_stream_status(int fd, __u32 nsid,
- unsigned nr_entries,
+ unsigned int nr_entries,
struct nvme_streams_directive_status *id)
{
struct nvme_directive_recv_args args = {
@@ -3536,7 +3271,7 @@ static inline int nvme_directive_recv_stream_status(int fd, __u32 nsid,
}
/**
- * nvme_directive_recv_stream_allocate() -
+ * nvme_directive_recv_stream_allocate() - Directive receive stream allocate
* @fd: File descriptor of nvme device
* @nsid: Namespace ID
* @nsr: Namespace Streams Requested
@@ -3566,31 +3301,7 @@ static inline int nvme_directive_recv_stream_allocate(int fd, __u32 nsid,
}
/**
- * struct nvme_capacity_mgmt_args - Arguments for the NVMe Capacity Management command
- * @result: If successful, the CQE dword0 value
- * @args_size: Size of &struct nvme_capacity_mgmt_args
- * @fd: File descriptor of nvme device
- * @cdw11: Least significant 32 bits of the capacity in bytes of the
- * Endurance Group or NVM Set to be created
- * @cdw12: Most significant 32 bits of the capacity in bytes of the
- * Endurance Group or NVM Set to be created
- * @timeout: Timeout in ms
- * @element_id: Value specific to the value of the Operation field
- * @op: Operation to be performed by the controller
- */
-struct nvme_capacity_mgmt_args {
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 cdw11;
- __u32 cdw12;
- __u16 element_id;
- __u8 op;
-};
-
-/**
- * nvme_capacity_mgmt() -
+ * nvme_capacity_mgmt() - Capacity management command
* @args: &struct nvme_capacity_mgmt_args argument structure
*
* Return: The nvme command status if a response was received (see
@@ -3599,30 +3310,6 @@ struct nvme_capacity_mgmt_args {
int nvme_capacity_mgmt(struct nvme_capacity_mgmt_args *args);
/**
- * struct nvme_lockdown_args - Arguments for the NVME Lockdown command
- * @args_size: Size of &struct nvme_lockdown_args
- * @fd: File descriptor of nvme device
- * @result: The command completion result from CQE dword0
- * @timeout: Timeout in ms (0 for default timeout)
- * @scp: Scope of the command
- * @prhbt: Prohibit or allow the command opcode or Set Features command
- * @ifc: Affected interface
- * @ofi: Opcode or Feature Identifier
- * @uuidx: UUID Index if controller supports this id selection method
- */
-struct nvme_lockdown_args {
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- __u8 scp;
- __u8 prhbt;
- __u8 ifc;
- __u8 ofi;
- __u8 uuidx;
-};
-
-/**
* nvme_lockdown() - Issue lockdown command
* @args: &struct nvme_lockdown_args argument structure
*
@@ -3632,24 +3319,6 @@ struct nvme_lockdown_args {
int nvme_lockdown(struct nvme_lockdown_args *args);
/**
- * struct nvme_set_property_args - Arguments for NVMe Set Property command
- * @args_size: Size of &struct nvme_set_property_args
- * @fd: File descriptor of nvme device
- * @result: The command completion result from CQE dword0
- * @timeout: Timeout in ms
- * @offset: Property offset from the base to set
- * @value: The value to set the property
- */
-struct nvme_set_property_args {
- __u64 value;
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- int offset;
-};
-
-/**
* nvme_set_property() - Set controller property
* @args: &struct nvme_set_property_args argument structure
*
@@ -3662,22 +3331,6 @@ struct nvme_set_property_args {
int nvme_set_property(struct nvme_set_property_args *args);
/**
- * struct nvme_get_property_args - Arguments for NVMe Get Property command
- * @value: Where the property's value will be stored on success
- * @args_size: Size of &struct nvme_get_property_args
- * @fd: File descriptor of nvme device
- * @offset: Property offset from the base to retrieve
- * @timeout: Timeout in ms
- */
-struct nvme_get_property_args {
- __u64 *value;
- int args_size;
- int fd;
- __u32 timeout;
- int offset;
-};
-
-/**
* nvme_get_property() - Get a controller property
* @args: &struct nvme_get_propert_args argument structure
*
@@ -3690,32 +3343,6 @@ struct nvme_get_property_args {
int nvme_get_property(struct nvme_get_property_args *args);
/**
- * struct nvme_sanitize_nvm_args - Arguments for the NVMe Sanitize NVM command
- * @result: The command completion result from CQE dword0
- * @args_size: Size of &struct nvme_sanitize_nvm_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @ovrpat: Overwrite pattern
- * @sanact: Sanitize action, see &enum nvme_sanitize_sanact
- * @ause: Set to allow unrestriced sanitize exit
- * @owpass: Overwrite pass count
- * @oipbp: Set to overwrite invert pattern between passes
- * @nodas: Set to not deallocate blocks after sanitizing
- */
-struct nvme_sanitize_nvm_args {
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- enum nvme_sanitize_sanact sanact;
- __u32 ovrpat;
- bool ause;
- __u8 owpass;
- bool oipbp;
- bool nodas;
-};
-
-/**
* nvme_sanitize_nvm() - Start a sanitize operation
* @args: &struct nvme_sanitize_nvm_args argument structure
*
@@ -3735,24 +3362,6 @@ struct nvme_sanitize_nvm_args {
int nvme_sanitize_nvm(struct nvme_sanitize_nvm_args *args);
/**
- * struct nvme_dev_self_test_args - Arguments for the NVMe Device Self Test command
- * @result: The command completion result from CQE dword0
- * @args_size: Size of &struct nvme_dev_self_test_args
- * @fd: File descriptor of nvme device
- * @nsid: Namespace ID to test
- * @stc: Self test code, see &enum nvme_dst_stc
- * @timeout: Timeout in ms
- */
-struct nvme_dev_self_test_args {
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_dst_stc stc;
-};
-
-/**
* nvme_dev_self_test() - Start or abort a self test
* @args: &struct nvme_dev_self_test argument structure
*
@@ -3773,29 +3382,6 @@ struct nvme_dev_self_test_args {
int nvme_dev_self_test(struct nvme_dev_self_test_args *args);
/**
- * struct nvme_virtual_mgmt_args - Arguments for the NVMe Virtualization
- * resource management command
- * @args_size: Size of &struct nvme_virtual_mgmt_args
- * @fd: File descriptor of nvme device
- * @result: If successful, the CQE dword0
- * @timeout: Timeout in ms
- * @act: Virtual resource action, see &enum nvme_virt_mgmt_act
- * @rt: Resource type to modify, see &enum nvme_virt_mgmt_rt
- * @cntlid: Controller id for which resources are bing modified
- * @nr: Number of resources being allocated or assigned
- */
-struct nvme_virtual_mgmt_args {
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- enum nvme_virt_mgmt_act act;
- enum nvme_virt_mgmt_rt rt;
- __u16 cntlid;
- __u16 nr;
-};
-
-/**
* nvme_virtual_mgmt() - Virtualization resource management
* @args: &struct nvme_virtual_mgmt_args argument structure
*
@@ -3823,7 +3409,8 @@ int nvme_virtual_mgmt(struct nvme_virtual_mgmt_args *args);
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
*/
-static inline int nvme_flush(int fd, __u32 nsid) {
+static inline int nvme_flush(int fd, __u32 nsid)
+{
struct nvme_passthru_cmd cmd = {};
cmd.opcode = nvme_cmd_flush;
@@ -3833,56 +3420,6 @@ static inline int nvme_flush(int fd, __u32 nsid) {
}
/**
- * struct nvme_io_args - Arguments for NVMe I/O commands
- * @slba: Starting logical block
- * @storage_tag: This filed specifies Variable Sized Expected Logical Block
- * Storage Tag (ELBST) and Expected Logical Block Reference
- * Tag (ELBRT)
- * @result: The command completion result from CQE dword0
- * @data: Pointer to user address of the data buffer
- * @metadata: Pointer to user address of the metadata buffer
- * @args_size: Size of &struct nvme_io_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID
- * @data_len: Length of user buffer, @data, in bytes
- * @metadata_len:Length of user buffer, @metadata, in bytes
- * @nlb: Number of logical blocks to send (0's based value)
- * @control: Command control flags, see &enum nvme_io_control_flags.
- * @apptag: This field specifies the Application Tag Mask expected value.
- * Used only if the namespace is formatted to use end-to-end
- * protection information.
- * @appmask: This field specifies the Application Tag expected value. Used
- * only if the namespace is formatted to use end-to-end protection
- * information.
- * @reftag: This field specifies the Initial Logical Block Reference Tag
- * expected value. Used only if the namespace is formatted to use
- * end-to-end protection information.
- * @dspec: Directive specific value
- * @dsm: Data set management attributes, see &enum nvme_io_dsm_flags
- */
-struct nvme_io_args {
- __u64 slba;
- __u64 storage_tag;
- __u32 *result;
- void *data;
- void *metadata;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 reftag;
- __u32 data_len;
- __u32 metadata_len;
- __u16 nlb;
- __u16 control;
- __u16 apptag;
- __u16 appmask;
- __u16 dspec;
- __u8 dsm;
-};
-
-/**
* nvme_io() - Submit an nvme user I/O command
* @args: &struct nvme_io_args argument structure
* @opcode: Opcode to execute
@@ -3979,28 +3516,6 @@ static inline int nvme_verify(struct nvme_io_args *args)
}
/**
- * struct nvme_dsm_args - Arguments for the NVMe Dataset Management command
- * @result: The command completion result from CQE dword0
- * @dsm: The data set management attributes
- * @args_size: Size of &struct nvme_dsm_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace identifier
- * @attrs: DSM attributes, see &enum nvme_dsm_attributes
- * @nr_ranges: Number of block ranges in the data set management attributes
- */
-struct nvme_dsm_args {
- __u32 *result;
- struct nvme_dsm_range *dsm;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 attrs;
- __u16 nr_ranges;
-};
-
-/**
* nvme_dsm() - Send an nvme data set management command
* @args: &struct nvme_dsm_args argument structure
*
@@ -4016,49 +3531,7 @@ struct nvme_dsm_args {
int nvme_dsm(struct nvme_dsm_args *args);
/**
- * struct nvme_copy_args - Arguments for the NVMe Copy command
- * @sdlba: Start destination LBA
- * @result: The command completion result from CQE dword0
- * @copy: Range descriptior
- * @args_size: Size of &struct nvme_copy_args
- * @fd: File descriptor of the nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace identifier
- * @ilbrt: Initial logical block reference tag
- * @lr: Limited retry
- * @fua: Force unit access
- * @nr: Number of ranges
- * @dspec: Directive specific value
- * @lbatm: Logical block application tag mask
- * @lbat: Logical block application tag
- * @prinfor: Protection information field for read
- * @prinfow: Protection information field for write
- * @dtype: Directive type
- * @format: Descriptor format
- */
-struct nvme_copy_args {
- __u64 sdlba;
- __u32 *result;
- struct nvme_copy_range *copy;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 ilbrt;
- int lr;
- int fua;
- __u16 nr;
- __u16 dspec;
- __u16 lbatm;
- __u16 lbat;
- __u8 prinfor;
- __u8 prinfow;
- __u8 dtype;
- __u8 format;
-};
-
-/**
- * nvme_copy() -
+ * nvme_copy() - Copy command
*
* @args: &struct nvme_copy_args argument structure
*
@@ -4068,33 +3541,6 @@ struct nvme_copy_args {
int nvme_copy(struct nvme_copy_args *args);
/**
- * struct nvme_resv_acquire_args - Arguments for the NVMe Reservation Acquire Comand
- * @nrkey: The reservation key to be unregistered from the namespace if
- * the action is preempt
- * @iekey: Set to ignore the existing key
- * @result: The command completion result from CQE dword0
- * @args_size: Size of &struct nvme_resv_acquire_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace identifier
- * @rtype: The type of reservation to be create, see &enum nvme_resv_rtype
- * @racqa: The action that is performed by the command, see &enum nvme_resv_racqa
- * @crkey: The current reservation key associated with the host
- */
-struct nvme_resv_acquire_args {
- __u64 crkey;
- __u64 nrkey;
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_resv_rtype rtype;
- enum nvme_resv_racqa racqa;
- bool iekey;
-};
-
-/**
* nvme_resv_acquire() - Send an nvme reservation acquire
* @args: &struct nvme_resv_acquire argument structure
*
@@ -4108,33 +3554,6 @@ struct nvme_resv_acquire_args {
int nvme_resv_acquire(struct nvme_resv_acquire_args *args);
/**
- * struct nvme_resv_register_args - Arguments for the NVMe Reservation Register command
- * @crkey: The current reservation key associated with the host
- * @nrkey: The new reservation key to be register if action is register or
- * replace
- * @result: The command completion result from CQE dword0
- * @args_size: Size of &struct nvme_resv_register_args
- * @fd: File descriptor of nvme device
- * @nsid: Namespace identifier
- * @rrega: The registration action, see &enum nvme_resv_rrega
- * @cptpl: Change persist through power loss, see &enum nvme_resv_cptpl
- * @iekey: Set to ignore the existing key
- * @timeout: Timeout in ms
- */
-struct nvme_resv_register_args {
- __u64 crkey;
- __u64 nrkey;
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_resv_rrega rrega;
- enum nvme_resv_cptpl cptpl;
- bool iekey;
-};
-
-/**
* nvme_resv_register() - Send an nvme reservation register
* @args: &struct nvme_resv_register_args argument structure
*
@@ -4147,30 +3566,6 @@ struct nvme_resv_register_args {
int nvme_resv_register(struct nvme_resv_register_args *args);
/**
- * struct nvme_resv_release_args - Arguments for the NVMe Reservation Release Command
- * @crkey: The current reservation key to release
- * @result: The command completion result from CQE dword0
- * @args_size: Size of &struct nvme_resv_release_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace identifier
- * @rtype: The type of reservation to be create, see &enum nvme_resv_rtype
- * @rrela: Reservation releast action, see &enum nvme_resv_rrela
- * @iekey: Set to ignore the existing key
- */
-struct nvme_resv_release_args {
- __u64 crkey;
- __u32 *result;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_resv_rtype rtype;
- enum nvme_resv_rrela rrela;
- bool iekey;
-};
-
-/**
* nvme_resv_release() - Send an nvme reservation release
* @args: &struct nvme_resv_release_args argument structure
*
@@ -4180,34 +3575,11 @@ struct nvme_resv_release_args {
int nvme_resv_release(struct nvme_resv_release_args *args);
/**
- * struct nvme_resv_report_args - Arguments for the NVMe Reservation Report command
- * @result: The command completion result from CQE dword0
- * @report: The user space destination address to store the reservation
- * report
- * @args_size: Size of &struct nvme_resv_report_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace identifier
- * @len: Number of bytes to request transfered with this command
- * @eds: Request extended Data Structure
- */
-struct nvme_resv_report_args {
- __u32 *result;
- struct nvme_resv_status *report;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 len;
- bool eds;
-};
-
-/**
* nvme_resv_report() - Send an nvme reservation report
* @args: struct nvme_resv_report_args argument structure
*
* Returns a Reservation Status data structure to memory that describes the
- * registration and reservation status of a namespace. See the defintion for
+ * registration and reservation status of a namespace. See the definition for
* the returned structure, &struct nvme_reservation_status, for more details.
*
* Return: The nvme command status if a response was received (see
@@ -4216,35 +3588,7 @@ struct nvme_resv_report_args {
int nvme_resv_report(struct nvme_resv_report_args *args);
/**
- * struct nvme_zns_mgmt_send_args - Arguments for the NVMe ZNS Management Send command
- * @slba: Starting logical block address
- * @result: The command completion result from CQE dword0
- * @data: Userspace address of the data
- * @args_size: Size of &struct nvme_zns_mgmt_send_args
- * @fd: File descriptor of nvme device
- * @timeout: timeout in ms
- * @nsid: Namespace ID
- * @zsa: Zone send action
- * @data_len: Length of @data
- * @select_all: Select all flag
- * @zsaso: Zone Send Action Specific Option
- */
-struct nvme_zns_mgmt_send_args {
- __u64 slba;
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_zns_send_action zsa;
- __u32 data_len;
- bool select_all;
- __u8 zsaso;
-};
-
-/**
- * nvme_zns_mgmt_send() -
+ * nvme_zns_mgmt_send() - ZNS management send command
* @args: &struct nvme_zns_mgmt_send_args argument structure
*
* Return: The nvme command status if a response was received (see
@@ -4254,35 +3598,7 @@ int nvme_zns_mgmt_send(struct nvme_zns_mgmt_send_args *args);
/**
- * struct nvme_zns_mgmt_recv_args - Arguments for the NVMe ZNS Management Receive command
- * @slba: Starting logical block address
- * @result: The command completion result from CQE dword0
- * @data: Userspace address of the data
- * @args_size: Size of &struct nvme_zns_mgmt_recv_args
- * @fd: File descriptor of nvme device
- * @timeout: timeout in ms
- * @nsid: Namespace ID
- * @zra: zone receive action
- * @data_len: Length of @data
- * @zrasf: Zone receive action specific field
- * @zras_feat: Zone receive action specific features
- */
-struct nvme_zns_mgmt_recv_args {
- __u64 slba;
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- enum nvme_zns_recv_action zra;
- __u32 data_len;
- __u16 zrasf;
- bool zras_feat;
-};
-
-/**
- * nvme_zns_mgmt_recv() -
+ * nvme_zns_mgmt_recv() - ZNS management receive command
* @args: &struct nvme_zns_mgmt_recv_args argument structure
*
* Return: The nvme command status if a response was received (see
@@ -4323,7 +3639,7 @@ static inline int nvme_zns_report_zones(int fd, __u32 nsid, __u64 slba,
.zra = extended ? NVME_ZNS_ZRA_EXTENDED_REPORT_ZONES :
NVME_ZNS_ZRA_REPORT_ZONES,
.data_len = data_len,
- .zrasf = opts,
+ .zrasf = (__u16)opts,
.zras_feat = partial,
};
@@ -4331,42 +3647,6 @@ static inline int nvme_zns_report_zones(int fd, __u32 nsid, __u64 slba,
}
/**
- * struct nvme_zns_append_args - Arguments for the NVMe ZNS Append command
- * @zslba: Zone start logical block address
- * @result: The command completion result from CQE dword0
- * @data: Userspace address of the data
- * @metadata: Userspace address of the metadata
- * @args_size: Size of &struct nvme_zns_append_args
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @nsid: Namespace ID
- * @ilbrt: Initial logical block reference tag
- * @data_len: Length of @data
- * @metadata_len: Length of @metadata
- * @nlb: Number of logical blocks
- * @control:
- * @lbat: Logical block application tag
- * @lbatm: Logical block application tag mask
- */
-struct nvme_zns_append_args {
- __u64 zslba;
- __u64 *result;
- void *data;
- void *metadata;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 nsid;
- __u32 ilbrt;
- __u32 data_len;
- __u32 metadata_len;
- __u16 nlb;
- __u16 control;
- __u16 lbat;
- __u16 lbatm;
-};
-
-/**
* nvme_zns_append() - Append data to a zone
* @args: &struct nvme_zns_append_args argument structure
*
@@ -4376,26 +3656,6 @@ struct nvme_zns_append_args {
int nvme_zns_append(struct nvme_zns_append_args *args);
/**
- * struct nvme_dim_args - Arguments for the Discovery Information Management (DIM) command
- * @result: Set on completion to the command's CQE DWORD 0 controller response.
- * @data: Pointer to the DIM data
- * @args_size: Length of the structure
- * @fd: File descriptor of nvme device
- * @timeout: Timeout in ms
- * @data_len: Length of @data
- * @tas: Task field of the Command Dword 10 (cdw10)
- */
-struct nvme_dim_args {
- __u32 *result;
- void *data;
- int args_size;
- int fd;
- __u32 timeout;
- __u32 data_len;
- __u8 tas;
-};
-
-/**
* nvme_dim_send - Send a Discovery Information Management (DIM) command
* @args: &struct nvme_dim_args argument structure
*
diff --git a/src/nvme/linux.h b/src/nvme/linux.h
index 6223c0a..8a6d426 100644
--- a/src/nvme/linux.h
+++ b/src/nvme/linux.h
@@ -25,7 +25,7 @@
* @fd: File descriptor of nvme device
* @size: Total size of the firmware image to transfer
* @xfer: Maximum size to send with each partial transfer
- * @offset: Starting offset to send with this firmware downlaod
+ * @offset: Starting offset to send with this firmware download
* @buf: Address of buffer containing all or part of the firmware image.
*
* Return: The nvme command status if a response was received (see
@@ -109,7 +109,7 @@ int nvme_get_new_host_telemetry(int fd, struct nvme_telemetry_log **log,
int nvme_get_log_page(int fd, __u32 xfer_len, struct nvme_get_log_args *args);
/**
- * nvme_get_ana_log_len() - Retreive size of the current ANA log
+ * nvme_get_ana_log_len() - Retrieve size of the current ANA log
* @fd: File descriptor of nvme device
* @analen: Pointer to where the length will be set on success
*
@@ -130,11 +130,11 @@ int nvme_get_ana_log_len(int fd, size_t *analen);
int nvme_get_logical_block_size(int fd, __u32 nsid, int *blksize);
/**
- * nvme_get_lba_status_log() - Retreive the LBA Status log page
+ * nvme_get_lba_status_log() - Retrieve the LBA Status log page
* @fd: File descriptor of the nvme device
* @rae: Retain asynchronous events
- * @log: On success, set to the value of the allocated and retreived log.
- *
+ * @log: On success, set to the value of the allocated and retrieved log.
+ *
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
*/
diff --git a/src/nvme/log.c b/src/nvme/log.c
index 1bc44f2..e4697df 100644
--- a/src/nvme/log.c
+++ b/src/nvme/log.c
@@ -1,16 +1,9 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
/*
+ * This file is part of libnvme.
* Copyright (C) 2021 SUSE LLC
*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License version
- * 2 as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ * Authors: Hannes Reinecke <hare@suse.de>
*
* This file implements basic logging functionality.
*/
diff --git a/src/nvme/mi-mctp.c b/src/nvme/mi-mctp.c
new file mode 100644
index 0000000..81704aa
--- /dev/null
+++ b/src/nvme/mi-mctp.c
@@ -0,0 +1,751 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * This file is part of libnvme.
+ * Copyright (c) 2021 Code Construct Pty Ltd
+ *
+ * Authors: Jeremy Kerr <jk@codeconstruct.com.au>
+ */
+
+#include <errno.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <sys/socket.h>
+#include <sys/types.h>
+#include <sys/uio.h>
+
+#if HAVE_LINUX_MCTP_H
+#include <linux/mctp.h>
+#endif
+
+#include <ccan/endian/endian.h>
+
+#ifdef CONFIG_LIBSYSTEMD
+#include <systemd/sd-event.h>
+#include <systemd/sd-bus.h>
+#include <systemd/sd-id128.h>
+
+#define MCTP_DBUS_PATH "/xyz/openbmc_project/mctp"
+#define MCTP_DBUS_IFACE "xyz.openbmc_project.MCTP"
+#define MCTP_DBUS_IFACE_ENDPOINT "xyz.openbmc_project.MCTP.Endpoint"
+#endif
+
+#include "private.h"
+#include "log.h"
+#include "mi.h"
+
+
+#if !defined(AF_MCTP)
+#define AF_MCTP 45
+#endif
+
+#if !HAVE_LINUX_MCTP_H
+/* As of kernel v5.15, these AF_MCTP-related definitions are provided by
+ * linux/mctp.h. However, we provide a set here while that header percolates
+ * through to standard includes.
+ *
+ * These were all introduced in the same version as AF_MCTP was defined,
+ * so we can key off the presence of that.
+ */
+
+typedef __u8 mctp_eid_t;
+
+struct mctp_addr {
+ mctp_eid_t s_addr;
+};
+
+struct sockaddr_mctp {
+ unsigned short int smctp_family;
+ __u16 __smctp_pad0;
+ unsigned int smctp_network;
+ struct mctp_addr smctp_addr;
+ __u8 smctp_type;
+ __u8 smctp_tag;
+ __u8 __smctp_pad1;
+};
+
+#define MCTP_NET_ANY 0x0
+
+#define MCTP_ADDR_NULL 0x00
+#define MCTP_ADDR_ANY 0xff
+
+#define MCTP_TAG_MASK 0x07
+#define MCTP_TAG_OWNER 0x08
+
+#endif /* !AF_MCTP */
+
+#define MCTP_TYPE_NVME 0x04
+#define MCTP_TYPE_MIC 0x80
+
+struct nvme_mi_transport_mctp {
+ int net;
+ __u8 eid;
+ int sd;
+};
+
+static int ioctl_tag(int sd, unsigned long req, struct mctp_ioc_tag_ctl *ctl)
+{
+ return ioctl(sd, req, ctl);
+}
+
+static struct __mi_mctp_socket_ops ops = {
+ socket,
+ sendmsg,
+ recvmsg,
+ ioctl_tag,
+};
+
+void __nvme_mi_mctp_set_ops(const struct __mi_mctp_socket_ops *newops)
+{
+ ops = *newops;
+}
+static const struct nvme_mi_transport nvme_mi_transport_mctp;
+
+#ifdef SIOCMCTPALLOCTAG
+static __u8 nvme_mi_mctp_tag_alloc(struct nvme_mi_ep *ep)
+{
+ struct nvme_mi_transport_mctp *mctp;
+ struct mctp_ioc_tag_ctl ctl = { 0 };
+ static bool logged;
+ int rc;
+
+ mctp = ep->transport_data;
+
+ ctl.peer_addr = mctp->eid;
+
+ errno = 0;
+ rc = ops.ioctl_tag(mctp->sd, SIOCMCTPALLOCTAG, &ctl);
+ if (rc) {
+ if (!logged) {
+ /* not necessarily fatal, just means we can't handle
+ * "more processing required" messages */
+ nvme_msg(ep->root, LOG_INFO,
+ "System does not support explicit tag allocation\n");
+ logged = true;
+ }
+ return MCTP_TAG_OWNER;
+ }
+
+ return ctl.tag;
+}
+
+static void nvme_mi_mctp_tag_drop(struct nvme_mi_ep *ep, __u8 tag)
+{
+ struct nvme_mi_transport_mctp *mctp;
+ struct mctp_ioc_tag_ctl ctl = { 0 };
+
+ mctp = ep->transport_data;
+
+ if (!(tag & MCTP_TAG_PREALLOC))
+ return;
+
+ ctl.peer_addr = mctp->eid;
+ ctl.tag = tag;
+
+ ops.ioctl_tag(mctp->sd, SIOCMCTPDROPTAG, &ctl);
+}
+
+#else /* !defined SIOMCTPTAGALLOC */
+
+static __u8 nvme_mi_mctp_tag_alloc(struct nvme_mi_ep *ep)
+{
+ static bool logged;
+ if (!logged) {
+ nvme_msg(ep->root, LOG_INFO,
+ "Build does not support explicit tag allocation\n");
+ logged = true;
+ }
+ return MCTP_TAG_OWNER;
+}
+
+static void nvme_mi_mctp_tag_drop(struct nvme_mi_ep *ep, __u8 tag)
+{
+}
+
+#endif /* !defined SIOMCTPTAGALLOC */
+
+static bool nvme_mi_mctp_resp_is_mpr(struct nvme_mi_resp *resp, size_t len)
+{
+ struct nvme_mi_msg_resp *msg;
+ __le32 mic;
+ __u32 crc;
+
+ if (len != sizeof(*msg) + sizeof(mic))
+ return false;
+
+ msg = (struct nvme_mi_msg_resp *)resp->hdr;
+
+ if (msg->status != NVME_MI_RESP_MPR)
+ return false;
+
+ /* We can't use verify_resp_mic here, as the response structure has
+ * not been laid-out properly in resp yet (this is deferred until
+ * we have the actual response).
+ *
+ * We know the data is a fixed size, and linear in the hdr buf, so
+ * calculation is fairly simple. We do need to find the MIC data
+ * though, which could either be in the header buf (if the original
+ * header was larger than the minimal header message), or the start of
+ * the data buf (otherwise).
+ */
+ if (resp->hdr_len > sizeof(*msg))
+ mic = *(__le32 *)(msg + 1);
+ else
+ mic = *(__le32 *)(resp->data);
+
+ crc = ~nvme_mi_crc32_update(0xffffffff, msg, sizeof(*msg));
+ if (le32_to_cpu(mic) != crc)
+ return false;
+
+ return true;
+}
+
+static int nvme_mi_mctp_submit(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp)
+{
+ struct nvme_mi_transport_mctp *mctp;
+ struct iovec req_iov[3], resp_iov[3];
+ struct msghdr req_msg, resp_msg;
+ struct sockaddr_mctp addr;
+ int i, rc, errno_save;
+ ssize_t len;
+ __le32 mic;
+ __u8 tag;
+
+ if (ep->transport != &nvme_mi_transport_mctp) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* we need enough space for at least a generic (/error) response */
+ if (resp->hdr_len < sizeof(struct nvme_mi_msg_resp)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ mctp = ep->transport_data;
+ tag = nvme_mi_mctp_tag_alloc(ep);
+
+ memset(&addr, 0, sizeof(addr));
+ addr.smctp_family = AF_MCTP;
+ addr.smctp_network = mctp->net;
+ addr.smctp_addr.s_addr = mctp->eid;
+ addr.smctp_type = MCTP_TYPE_NVME | MCTP_TYPE_MIC;
+ addr.smctp_tag = tag;
+
+ i = 0;
+ req_iov[i].iov_base = ((__u8 *)req->hdr) + 1;
+ req_iov[i].iov_len = req->hdr_len - 1;
+ i++;
+
+ if (req->data_len) {
+ req_iov[i].iov_base = req->data;
+ req_iov[i].iov_len = req->data_len;
+ i++;
+ }
+
+ mic = cpu_to_le32(req->mic);
+ req_iov[i].iov_base = &mic;
+ req_iov[i].iov_len = sizeof(mic);
+ i++;
+
+ memset(&req_msg, 0, sizeof(req_msg));
+ req_msg.msg_name = &addr;
+ req_msg.msg_namelen = sizeof(addr);
+ req_msg.msg_iov = req_iov;
+ req_msg.msg_iovlen = i;
+
+ len = ops.sendmsg(mctp->sd, &req_msg, 0);
+ if (len < 0) {
+ errno_save = errno;
+ nvme_msg(ep->root, LOG_ERR,
+ "Failure sending MCTP message: %m\n");
+ errno = errno_save;
+ rc = -1;
+ goto out;
+ }
+
+ resp_iov[0].iov_base = ((__u8 *)resp->hdr) + 1;
+ resp_iov[0].iov_len = resp->hdr_len - 1;
+
+ resp_iov[1].iov_base = ((__u8 *)resp->data);
+ resp_iov[1].iov_len = resp->data_len;
+
+ resp_iov[2].iov_base = &mic;
+ resp_iov[2].iov_len = sizeof(mic);
+
+ memset(&resp_msg, 0, sizeof(resp_msg));
+ resp_msg.msg_name = &addr;
+ resp_msg.msg_namelen = sizeof(addr);
+ resp_msg.msg_iov = resp_iov;
+ resp_msg.msg_iovlen = 3;
+
+retry:
+ rc = -1;
+ len = ops.recvmsg(mctp->sd, &resp_msg, 0);
+
+ if (len < 0) {
+ errno_save = errno;
+ nvme_msg(ep->root, LOG_ERR,
+ "Failure receiving MCTP message: %m\n");
+ errno = errno_save;
+ goto out;
+ }
+
+
+ if (len == 0) {
+ nvme_msg(ep->root, LOG_WARNING, "No data from MCTP endpoint\n");
+ errno = EIO;
+ goto out;
+ }
+
+ /* Re-add the type byte, so we can work on aligned lengths from here */
+ resp->hdr->type = MCTP_TYPE_NVME | MCTP_TYPE_MIC;
+ len += 1;
+
+ /* The smallest response data is 8 bytes: generic 4-byte message header
+ * plus four bytes of error data (excluding MIC). Ensure we have enough.
+ */
+ if (len < 8 + sizeof(mic)) {
+ nvme_msg(ep->root, LOG_ERR,
+ "Invalid MCTP response: too short (%zd bytes, needed %zd)\n",
+ len, 8 + sizeof(mic));
+ errno = EPROTO;
+ goto out;
+ }
+
+ /* We can't have header/payload data that isn't a multiple of 4 bytes */
+ if (len & 0x3) {
+ nvme_msg(ep->root, LOG_WARNING,
+ "Response message has unaligned length (%zd)!\n",
+ len);
+ errno = EPROTO;
+ goto out;
+ }
+
+ /* Check for a More Processing Required response. This is a slight
+ * layering violation, as we're pre-checking the MIC and inspecting
+ * header fields. However, we need to do this in the transport in order
+ * to keep the tag allocated and retry the recvmsg
+ */
+ if (nvme_mi_mctp_resp_is_mpr(resp, len)) {
+ nvme_msg(ep->root, LOG_DEBUG,
+ "Received More Processing Required, waiting for response\n");
+ /* TODO: when we implement timeouts, inspect the MPR response
+ * for the estimated completion time. */
+ goto retry;
+ }
+
+ /* If we have a shorter than expected response, we need to find the
+ * MIC and the correct split between header & data. We know that the
+ * split is 4-byte aligned, so the MIC will be entirely within one
+ * of the iovecs.
+ */
+ if (len == resp->hdr_len + resp->data_len + sizeof(mic)) {
+ /* Common case: expected data length. Header, data and MIC
+ * are already laid-out correctly. Nothing to do. */
+
+ } else if (len < resp->hdr_len + sizeof(mic)) {
+ /* Response is smaller than the expected header. MIC is
+ * somewhere in the header buf */
+ resp->hdr_len = len - sizeof(mic);
+ resp->data_len = 0;
+ memcpy(&mic, ((uint8_t *)resp->hdr) + resp->hdr_len,
+ sizeof(mic));
+
+ } else {
+ /* We have a full header, but data is truncated - possibly
+ * zero bytes. MIC is somewhere in the data buf */
+ resp->data_len = len - resp->hdr_len - sizeof(mic);
+ memcpy(&mic, ((uint8_t *)resp->data) + resp->data_len,
+ sizeof(mic));
+ }
+
+ resp->mic = le32_to_cpu(mic);
+
+ rc = 0;
+
+out:
+ nvme_mi_mctp_tag_drop(ep, tag);
+
+ return rc;
+}
+
+static void nvme_mi_mctp_close(struct nvme_mi_ep *ep)
+{
+ struct nvme_mi_transport_mctp *mctp;
+
+ if (ep->transport != &nvme_mi_transport_mctp)
+ return;
+
+ mctp = ep->transport_data;
+ close(mctp->sd);
+ free(ep->transport_data);
+}
+
+static int nvme_mi_mctp_desc_ep(struct nvme_mi_ep *ep, char *buf, size_t len)
+{
+ struct nvme_mi_transport_mctp *mctp;
+
+ if (ep->transport != &nvme_mi_transport_mctp) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ mctp = ep->transport_data;
+
+ snprintf(buf, len, "net %d eid %d", mctp->net, mctp->eid);
+
+ return 0;
+}
+
+static const struct nvme_mi_transport nvme_mi_transport_mctp = {
+ .name = "mctp",
+ .mic_enabled = true,
+ .submit = nvme_mi_mctp_submit,
+ .close = nvme_mi_mctp_close,
+ .desc_ep = nvme_mi_mctp_desc_ep,
+};
+
+nvme_mi_ep_t nvme_mi_open_mctp(nvme_root_t root, unsigned int netid, __u8 eid)
+{
+ struct nvme_mi_transport_mctp *mctp;
+ struct nvme_mi_ep *ep;
+ int errno_save;
+
+ ep = nvme_mi_init_ep(root);
+ if (!ep)
+ return NULL;
+
+ mctp = malloc(sizeof(*mctp));
+ if (!mctp)
+ goto err_free_ep;
+
+ mctp->net = netid;
+ mctp->eid = eid;
+
+ mctp->sd = ops.socket(AF_MCTP, SOCK_DGRAM, 0);
+ if (mctp->sd < 0)
+ goto err_free_ep;
+
+ ep->transport = &nvme_mi_transport_mctp;
+ ep->transport_data = mctp;
+
+ return ep;
+
+err_free_ep:
+ errno_save = errno;
+ free(ep);
+ errno = errno_save;
+ return NULL;
+}
+
+#ifdef CONFIG_LIBSYSTEMD
+
+/* helper for handling dbus errors: D-Bus API returns a negtive errno on
+ * failure; set errno and log.
+ */
+static void _dbus_err(nvme_root_t root, int rc, int line)
+{
+ nvme_msg(root, LOG_ERR, "MCTP D-Bus failed line %d: %s %d\n",
+ line, strerror(-rc), rc);
+ errno = -rc;
+}
+
+#define dbus_err(r, rc) _dbus_err(r, rc, __LINE__)
+
+static int nvme_mi_mctp_add(nvme_root_t root, unsigned int netid, __u8 eid)
+{
+ nvme_mi_ep_t ep = NULL;
+
+ /* ensure we don't already have an endpoint with the same net/eid. if
+ * we do, just skip, no need to re-add. */
+ list_for_each(&root->endpoints, ep, root_entry) {
+ if (ep->transport != &nvme_mi_transport_mctp) {
+ continue;
+ }
+ const struct nvme_mi_transport_mctp *t = ep->transport_data;
+ if (t->eid == eid && t->net == netid)
+ return 0;
+ }
+
+ ep = nvme_mi_open_mctp(root, netid, eid);
+ if (!ep)
+ return -1;
+
+ return 0;
+}
+
+/* We can't rely on sd_bus_message_enter_container() == 0 at the end of
+ a dictionary (it returns -ENXIO) so we test separately */
+static bool container_end(sd_bus_message *m)
+{
+ return sd_bus_message_peek_type(m, NULL, NULL) == 0;
+}
+
+static int handle_mctp_endpoint(nvme_root_t root, const char* objpath,
+ sd_bus_message *m)
+{
+ bool have_eid = false, have_net = false, have_nvmemi = false;
+ mctp_eid_t eid;
+ int net;
+ int rc;
+
+ /* Iterate properties on this interface */
+ while (!container_end(m)) {
+ /* Enter property dict */
+ rc = sd_bus_message_enter_container(m, 'a', "{sv}");
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+ while (!container_end(m)) {
+ char *propname = NULL;
+ size_t sz;
+ const uint8_t *types = NULL;
+ /* Enter property item */
+ rc = sd_bus_message_enter_container(m, 'e', "sv");
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+ rc = sd_bus_message_read(m, "s", &propname);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+ if (strcmp(propname, "EID") == 0) {
+ rc = sd_bus_message_read(m, "v", "y", &eid);
+ have_eid = true;
+ } else if (strcmp(propname, "NetworkId") == 0) {
+ rc = sd_bus_message_read(m, "v", "i", &net);
+ have_net = true;
+ } else if (strcmp(propname, "SupportedMessageTypes") == 0) {
+ sd_bus_message_enter_container(m, 'v', "ay");
+ rc = sd_bus_message_read_array(m, 'y', (const void**)&types, &sz);
+ if (rc >= 0)
+ for (size_t s = 0; s < sz; s++)
+ if (types[s] == MCTP_TYPE_NVME)
+ have_nvmemi = true;
+ sd_bus_message_exit_container(m);
+ } else {
+ rc = sd_bus_message_skip(m, "v");
+ }
+
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+ /* Exit prop item */
+ rc = sd_bus_message_exit_container(m);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+ }
+
+ /* Exit property dict */
+ rc = sd_bus_message_exit_container(m);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+ }
+
+ if (have_nvmemi) {
+ if (!(have_eid && have_net)) {
+ nvme_msg(root, LOG_ERR,
+ "Missing property for %s\n", objpath);
+ errno = ENOENT;
+ return -1;
+ }
+ rc = nvme_mi_mctp_add(root, net, eid);
+ if (rc < 0) {
+ int errno_save = errno;
+ nvme_msg(root, LOG_ERR,
+ "Error adding net %d eid %d: %m\n", net, eid);
+ errno = errno_save;
+ }
+ } else {
+ /* Ignore other endpoints */
+ rc = 0;
+ }
+ return rc;
+}
+
+static int handle_mctp_obj(nvme_root_t root, sd_bus_message *m)
+{
+ char *objpath = NULL;
+ char *ifname = NULL;
+ int rc;
+
+ rc = sd_bus_message_read(m, "o", &objpath);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+ /* Enter response object: our array of (string, property dict)
+ * values */
+ rc = sd_bus_message_enter_container(m, 'a', "{sa{sv}}");
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+
+ /* for each interface */
+ while (!container_end(m)) {
+ /* Enter interface item */
+ rc = sd_bus_message_enter_container(m, 'e', "sa{sv}");
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+ rc = sd_bus_message_read(m, "s", &ifname);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+ if (!strcmp(ifname, MCTP_DBUS_IFACE_ENDPOINT)) {
+
+ rc = handle_mctp_endpoint(root, objpath, m);
+ if (rc < 0) {
+ /* continue to next object */
+ }
+ } else {
+ /* skip the interfaces we don't care about */
+ rc = sd_bus_message_skip(m, "a{sv}");
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+ }
+
+ /* Exit interface item */
+ rc = sd_bus_message_exit_container(m);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+ }
+
+ /* Exit response object */
+ rc = sd_bus_message_exit_container(m);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ return -1;
+ }
+
+ return 0;
+}
+
+nvme_root_t nvme_mi_scan_mctp(void)
+{
+ sd_bus *bus = NULL;
+ sd_bus_message *resp = NULL;
+ sd_bus_error berr = SD_BUS_ERROR_NULL;
+ int rc, errno_save;
+ nvme_root_t root;
+
+ root = nvme_mi_create_root(NULL, DEFAULT_LOGLEVEL);
+ if (!root) {
+ errno = ENOMEM;
+ rc = -1;
+ goto out;
+ }
+
+ rc = sd_bus_default_system(&bus);
+ if (rc < 0) {
+ nvme_msg(root, LOG_ERR, "Failed opening D-Bus: %s\n",
+ strerror(-rc));
+ errno = -rc;
+ rc = -1;
+ goto out;
+ }
+
+ rc = sd_bus_call_method(bus,
+ MCTP_DBUS_IFACE,
+ MCTP_DBUS_PATH,
+ "org.freedesktop.DBus.ObjectManager",
+ "GetManagedObjects",
+ &berr,
+ &resp,
+ "");
+ if (rc < 0) {
+ nvme_msg(root, LOG_ERR, "Failed querying MCTP D-Bus: %s (%s)\n",
+ berr.message, berr.name);
+ errno = -rc;
+ rc = -1;
+ goto out;
+ }
+
+ rc = sd_bus_message_enter_container(resp, 'a', "{oa{sa{sv}}}");
+ if (rc != 1) {
+ dbus_err(root, rc);
+ if (rc == 0)
+ errno = EPROTO;
+ rc = -1;
+ goto out;
+ }
+
+ /* Iterate over all managed objects */
+ while (!container_end(resp)) {
+ rc = sd_bus_message_enter_container(resp, 'e', "oa{sa{sv}}");
+ if (rc < 0) {
+ dbus_err(root, rc);
+ rc = -1;
+ goto out;
+ }
+
+ handle_mctp_obj(root, resp);
+
+ rc = sd_bus_message_exit_container(resp);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ rc = -1;
+ goto out;
+ }
+ }
+
+ rc = sd_bus_message_exit_container(resp);
+ if (rc < 0) {
+ dbus_err(root, rc);
+ rc = -1;
+ goto out;
+ }
+ rc = 0;
+
+out:
+ errno_save = errno;
+ sd_bus_error_free(&berr);
+ sd_bus_message_unref(resp);
+ sd_bus_unref(bus);
+
+ if (rc < 0) {
+ if (root) {
+ nvme_mi_free_root(root);
+ }
+ errno = errno_save;
+ root = NULL;
+ }
+ return root;
+}
+
+#else /* CONFIG_LIBSYSTEMD */
+
+nvme_root_t nvme_mi_scan_mctp(void)
+{
+ return NULL;
+}
+
+#endif /* CONFIG_LIBSYSTEMD */
diff --git a/src/nvme/mi.c b/src/nvme/mi.c
new file mode 100644
index 0000000..8e868d1
--- /dev/null
+++ b/src/nvme/mi.c
@@ -0,0 +1,930 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * This file is part of libnvme.
+ * Copyright (c) 2021 Code Construct Pty Ltd
+ *
+ * Authors: Jeremy Kerr <jk@codeconstruct.com.au>
+ */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include <ccan/endian/endian.h>
+
+#include "log.h"
+#include "mi.h"
+#include "private.h"
+
+/* MI-equivalent of nvme_create_root, but avoids clashing symbol names
+ * when linking against both libnvme and libnvme-mi.
+ */
+nvme_root_t nvme_mi_create_root(FILE *fp, int log_level)
+{
+ struct nvme_root *r = calloc(1, sizeof(*r));
+
+ if (!r) {
+ return NULL;
+ }
+ r->log_level = log_level;
+ r->fp = stderr;
+ if (fp)
+ r->fp = fp;
+ list_head_init(&r->hosts);
+ list_head_init(&r->endpoints);
+ return r;
+}
+
+void nvme_mi_free_root(nvme_root_t root)
+{
+ nvme_mi_ep_t ep, tmp;
+
+ nvme_mi_for_each_endpoint_safe(root, ep, tmp)
+ nvme_mi_close(ep);
+
+ free(root);
+}
+
+struct nvme_mi_ep *nvme_mi_init_ep(nvme_root_t root)
+{
+ struct nvme_mi_ep *ep;
+
+ ep = calloc(1, sizeof(*ep));
+ if (!ep)
+ return NULL;
+
+ list_node_init(&ep->root_entry);
+ ep->root = root;
+ ep->controllers_scanned = false;
+ list_head_init(&ep->controllers);
+
+ list_add(&root->endpoints, &ep->root_entry);
+
+ return ep;
+}
+
+struct nvme_mi_ctrl *nvme_mi_init_ctrl(nvme_mi_ep_t ep, __u16 ctrl_id)
+{
+ struct nvme_mi_ctrl *ctrl;
+
+ ctrl = malloc(sizeof(*ctrl));
+ if (!ctrl)
+ return NULL;
+
+ ctrl->ep = ep;
+ ctrl->id = ctrl_id;
+
+ list_add_tail(&ep->controllers, &ctrl->ep_entry);
+
+ return ctrl;
+}
+
+int nvme_mi_scan_ep(nvme_mi_ep_t ep, bool force_rescan)
+{
+ struct nvme_ctrl_list list;
+ unsigned int i, n_ctrl;
+ int rc;
+
+ if (ep->controllers_scanned) {
+ if (force_rescan) {
+ struct nvme_mi_ctrl *ctrl, *tmp;
+ nvme_mi_for_each_ctrl_safe(ep, ctrl, tmp)
+ nvme_mi_close_ctrl(ctrl);
+ } else {
+ return 0;
+ }
+ }
+
+ rc = nvme_mi_mi_read_mi_data_ctrl_list(ep, 0, &list);
+ if (rc)
+ return -1;
+
+ n_ctrl = le16_to_cpu(list.num);
+ if (n_ctrl > NVME_ID_CTRL_LIST_MAX) {
+ errno = EPROTO;
+ return -1;
+ }
+
+ for (i = 0; i < n_ctrl; i++) {
+ struct nvme_mi_ctrl *ctrl;
+ __u16 id;
+
+ id = le32_to_cpu(list.identifier[i]);
+ if (!id)
+ continue;
+
+ ctrl = nvme_mi_init_ctrl(ep, id);
+ if (!ctrl)
+ break;
+ }
+
+ ep->controllers_scanned = true;
+ return 0;
+}
+
+__u32 nvme_mi_crc32_update(__u32 crc, void *data, size_t len)
+{
+ int i;
+
+ while (len--) {
+ crc ^= *(unsigned char *)(data++);
+ for (i = 0; i < 8; i++)
+ crc = (crc >> 1) ^ ((crc & 1) ? 0x82F63B78 : 0);
+ }
+ return crc;
+}
+
+static void nvme_mi_calc_req_mic(struct nvme_mi_req *req)
+{
+ __u32 crc = 0xffffffff;
+
+ crc = nvme_mi_crc32_update(crc, req->hdr, req->hdr_len);
+ crc = nvme_mi_crc32_update(crc, req->data, req->data_len);
+
+ req->mic = ~crc;
+}
+
+/* returns zero on correct MIC */
+static int nvme_mi_verify_resp_mic(struct nvme_mi_resp *resp)
+{
+ __u32 crc = 0xffffffff;
+
+ crc = nvme_mi_crc32_update(crc, resp->hdr, resp->hdr_len);
+ crc = nvme_mi_crc32_update(crc, resp->data, resp->data_len);
+
+ return resp->mic != ~crc;
+}
+
+int nvme_mi_submit(nvme_mi_ep_t ep, struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp)
+{
+ int rc;
+
+ if (req->hdr_len < sizeof(struct nvme_mi_msg_hdr)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (req->hdr_len & 0x3) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (req->data_len & 0x3) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (resp->hdr_len < sizeof(struct nvme_mi_msg_hdr)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (resp->hdr_len & 0x3) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (resp->data_len & 0x3) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (ep->transport->mic_enabled)
+ nvme_mi_calc_req_mic(req);
+
+ rc = ep->transport->submit(ep, req, resp);
+ if (rc) {
+ nvme_msg(ep->root, LOG_INFO, "transport failure\n");
+ return rc;
+ }
+
+ if (ep->transport->mic_enabled) {
+ rc = nvme_mi_verify_resp_mic(resp);
+ if (rc) {
+ nvme_msg(ep->root, LOG_WARNING, "crc mismatch\n");
+ return rc;
+ }
+ }
+
+ /* basic response checks */
+ if (resp->hdr_len < sizeof(struct nvme_mi_msg_hdr)) {
+ nvme_msg(ep->root, LOG_DEBUG,
+ "Bad response header len: %zd\n", resp->hdr_len);
+ errno = EPROTO;
+ return -1;
+ }
+
+ if (resp->hdr->type != NVME_MI_MSGTYPE_NVME) {
+ nvme_msg(ep->root, LOG_DEBUG,
+ "Invalid message type 0x%02x\n", resp->hdr->type);
+ errno = EPROTO;
+ return -1;
+ }
+
+ if (!(resp->hdr->nmp & (NVME_MI_ROR_RSP << 7))) {
+ nvme_msg(ep->root, LOG_DEBUG,
+ "ROR value in response indicates a request\n");
+ errno = EIO;
+ return -1;
+ }
+
+ if ((resp->hdr->nmp & 0x1) != (req->hdr->nmp & 0x1)) {
+ nvme_msg(ep->root, LOG_WARNING,
+ "Command slot mismatch: req %d, resp %d\n",
+ req->hdr->nmp & 0x1,
+ resp->hdr->nmp & 0x1);
+ errno = EIO;
+ return -1;
+ }
+
+ return 0;
+}
+
+static void nvme_mi_admin_init_req(struct nvme_mi_req *req,
+ struct nvme_mi_admin_req_hdr *hdr,
+ __u16 ctrl_id, __u8 opcode)
+{
+ memset(req, 0, sizeof(*req));
+ memset(hdr, 0, sizeof(*hdr));
+
+ hdr->hdr.type = NVME_MI_MSGTYPE_NVME;
+ hdr->hdr.nmp = (NVME_MI_ROR_REQ << 7) |
+ (NVME_MI_MT_ADMIN << 3); /* we always use command slot 0 */
+ hdr->opcode = opcode;
+ hdr->ctrl_id = cpu_to_le16(ctrl_id);
+
+ req->hdr = &hdr->hdr;
+ req->hdr_len = sizeof(*hdr);
+}
+
+static void nvme_mi_admin_init_resp(struct nvme_mi_resp *resp,
+ struct nvme_mi_admin_resp_hdr *hdr)
+{
+ memset(resp, 0, sizeof(*resp));
+ resp->hdr = &hdr->hdr;
+ resp->hdr_len = sizeof(*hdr);
+}
+
+int nvme_mi_admin_xfer(nvme_mi_ctrl_t ctrl,
+ struct nvme_mi_admin_req_hdr *admin_req,
+ size_t req_data_size,
+ struct nvme_mi_admin_resp_hdr *admin_resp,
+ off_t resp_data_offset,
+ size_t *resp_data_size)
+{
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ int rc;
+
+ /* length/offset checks. The common _submit() API will do further
+ * checking on the message lengths too, so these are kept specific
+ * to the requirements of the Admin command set
+ */
+
+ /* NVMe-MI v1.2 imposes a limit of 4096 bytes on the dlen field */
+ if (*resp_data_size > 4096) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* we only have 32 bits of offset */
+ if (resp_data_offset > 0xffffffff) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* must be aligned */
+ if (resp_data_offset & 0x3) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* bidirectional not permitted (see DLEN definition) */
+ if (req_data_size && *resp_data_size) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (!*resp_data_size && resp_data_offset) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ admin_req->hdr.type = NVME_MI_MSGTYPE_NVME;
+ admin_req->hdr.nmp = (NVME_MI_ROR_REQ << 7) |
+ (NVME_MI_MT_ADMIN << 3);
+ memset(&req, 0, sizeof(req));
+ req.hdr = &admin_req->hdr;
+ req.hdr_len = sizeof(*admin_req);
+ req.data = admin_req + 1;
+ req.data_len = req_data_size;
+
+ nvme_mi_calc_req_mic(&req);
+
+ memset(&resp, 0, sizeof(resp));
+ resp.hdr = &admin_resp->hdr;
+ resp.hdr_len = sizeof(*admin_resp);
+ resp.data = admin_resp + 1;
+ resp.data_len = *resp_data_size;
+
+ /* limit the response size, specify offset */
+ admin_req->flags = 0x3;
+ admin_req->dlen = cpu_to_le32(resp.data_len & 0xffffffff);
+ admin_req->doff = cpu_to_le32(resp_data_offset & 0xffffffff);
+
+ rc = nvme_mi_submit(ctrl->ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ *resp_data_size = resp.data_len;
+
+ return 0;
+}
+
+int nvme_mi_admin_identify_partial(nvme_mi_ctrl_t ctrl,
+ struct nvme_identify_args *args,
+ off_t offset, size_t size)
+{
+ struct nvme_mi_admin_resp_hdr resp_hdr;
+ struct nvme_mi_admin_req_hdr req_hdr;
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ int rc;
+
+ if (args->args_size < sizeof(*args)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (!size || size > 0xffffffff) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ nvme_mi_admin_init_req(&req, &req_hdr, ctrl->id, nvme_admin_identify);
+ req_hdr.cdw1 = cpu_to_le32(args->nsid);
+ req_hdr.cdw10 = cpu_to_le32(args->cntid << 16 | args->cns);
+ req_hdr.cdw11 = cpu_to_le32((args->csi & 0xff) << 24 |
+ args->cns_specific_id);
+ req_hdr.cdw14 = cpu_to_le32(args->uuidx);
+ req_hdr.dlen = cpu_to_le32(size & 0xffffffff);
+ req_hdr.flags = 0x1;
+ if (offset) {
+ req_hdr.flags |= 0x2;
+ req_hdr.doff = cpu_to_le32(offset);
+ }
+
+ nvme_mi_calc_req_mic(&req);
+
+ nvme_mi_admin_init_resp(&resp, &resp_hdr);
+ resp.data = args->data;
+ resp.data_len = size;
+
+ rc = nvme_mi_submit(ctrl->ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ if (resp_hdr.status)
+ return resp_hdr.status;
+
+ if (args->result)
+ *args->result = le32_to_cpu(resp_hdr.cdw0);
+
+ /* callers will expect a full response; if the data buffer isn't
+ * fully valid, return an error */
+ if (resp.data_len != size) {
+ errno = EPROTO;
+ return -1;
+ }
+
+ return 0;
+}
+
+/* retrieves a MCTP-messsage-sized chunk of log page data. offset and len are
+ * specified within the args->data area */
+static int __nvme_mi_admin_get_log_page(nvme_mi_ctrl_t ctrl,
+ const struct nvme_get_log_args *args,
+ off_t offset, size_t *lenp, bool final)
+{
+ struct nvme_mi_admin_resp_hdr resp_hdr;
+ struct nvme_mi_admin_req_hdr req_hdr;
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ size_t len;
+ __u32 ndw;
+ int rc;
+
+ /* MI spec requires that the data length field is less than or equal
+ * to 4096 */
+ len = *lenp;
+ if (!len || len > 4096 || len < 4) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (offset < 0 || offset >= len) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ ndw = (len >> 2) - 1;
+
+ nvme_mi_admin_init_req(&req, &req_hdr, ctrl->id, nvme_admin_get_log_page);
+ req_hdr.cdw1 = cpu_to_le32(args->nsid);
+ req_hdr.cdw10 = cpu_to_le32((ndw & 0xffff) << 16 |
+ ((!final || args->rae) ? 1 : 0) << 15 |
+ args->lsp << 8 |
+ (args->lid & 0xff));
+ req_hdr.cdw11 = cpu_to_le32(args->lsi << 16 |
+ ndw >> 16);
+ req_hdr.cdw12 = cpu_to_le32(args->lpo & 0xffffffff);
+ req_hdr.cdw13 = cpu_to_le32(args->lpo >> 32);
+ req_hdr.cdw14 = cpu_to_le32(args->csi << 24 |
+ (args->ot ? 1 : 0) << 23 |
+ args->uuidx);
+ req_hdr.flags = 0x1;
+ req_hdr.dlen = cpu_to_le32(len & 0xffffffff);
+ if (offset) {
+ req_hdr.flags |= 0x2;
+ req_hdr.doff = cpu_to_le32(offset);
+ }
+
+ nvme_mi_calc_req_mic(&req);
+
+ nvme_mi_admin_init_resp(&resp, &resp_hdr);
+ resp.data = args->log + offset;
+ resp.data_len = len;
+
+ rc = nvme_mi_submit(ctrl->ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ if (resp_hdr.status)
+ return resp_hdr.status;
+
+ *lenp = resp.data_len;
+
+ return 0;
+}
+
+int nvme_mi_admin_get_log_page(nvme_mi_ctrl_t ctrl,
+ struct nvme_get_log_args *args)
+{
+ const size_t xfer_size = 4096;
+ off_t xfer_offset;
+ int rc = 0;
+
+ if (args->args_size < sizeof(*args)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ for (xfer_offset = 0; xfer_offset < args->len;) {
+ size_t tmp, cur_xfer_size = xfer_size;
+ bool final;
+
+ if (xfer_offset + cur_xfer_size > args->len)
+ cur_xfer_size = args->len - xfer_offset;
+
+ tmp = cur_xfer_size;
+
+ final = xfer_offset + cur_xfer_size >= args->len;
+
+ rc = __nvme_mi_admin_get_log_page(ctrl, args, xfer_offset,
+ &tmp, final);
+ if (rc)
+ break;
+
+ xfer_offset += tmp;
+ /* if we returned less data than expected, consider that
+ * the end of the log page */
+ if (tmp != cur_xfer_size)
+ break;
+ }
+
+ if (!rc)
+ args->len = xfer_offset;
+
+ return rc;
+}
+
+int nvme_mi_admin_security_send(nvme_mi_ctrl_t ctrl,
+ struct nvme_security_send_args *args)
+{
+
+ struct nvme_mi_admin_resp_hdr resp_hdr;
+ struct nvme_mi_admin_req_hdr req_hdr;
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ int rc;
+
+ if (args->args_size < sizeof(*args)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (args->data_len > 4096) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ nvme_mi_admin_init_req(&req, &req_hdr, ctrl->id,
+ nvme_admin_security_send);
+
+ req_hdr.cdw10 = cpu_to_le32(args->secp << 24 |
+ args->spsp0 << 16 |
+ args->spsp1 << 8 |
+ args->nssf);
+
+ req_hdr.cdw11 = cpu_to_le32(args->data_len & 0xffffffff);
+
+ req_hdr.flags = 0x1;
+ req_hdr.dlen = cpu_to_le32(args->data_len & 0xffffffff);
+ req.data = args->data;
+ req.data_len = args->data_len;
+
+ nvme_mi_calc_req_mic(&req);
+
+ nvme_mi_admin_init_resp(&resp, &resp_hdr);
+
+ rc = nvme_mi_submit(ctrl->ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ if (resp_hdr.status)
+ return resp_hdr.status;
+
+ if (args->result)
+ *args->result = le32_to_cpu(resp_hdr.cdw0);
+
+ return 0;
+}
+
+int nvme_mi_admin_security_recv(nvme_mi_ctrl_t ctrl,
+ struct nvme_security_receive_args *args)
+{
+
+ struct nvme_mi_admin_resp_hdr resp_hdr;
+ struct nvme_mi_admin_req_hdr req_hdr;
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ int rc;
+
+ if (args->args_size < sizeof(*args)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ if (args->data_len > 4096) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ nvme_mi_admin_init_req(&req, &req_hdr, ctrl->id,
+ nvme_admin_security_recv);
+
+ req_hdr.cdw10 = cpu_to_le32(args->secp << 24 |
+ args->spsp0 << 16 |
+ args->spsp1 << 8 |
+ args->nssf);
+
+ req_hdr.cdw11 = cpu_to_le32(args->data_len & 0xffffffff);
+
+ req_hdr.flags = 0x1;
+ req_hdr.dlen = cpu_to_le32(args->data_len & 0xffffffff);
+
+ nvme_mi_calc_req_mic(&req);
+
+ nvme_mi_admin_init_resp(&resp, &resp_hdr);
+ resp.data = args->data;
+ resp.data_len = args->data_len;
+
+ rc = nvme_mi_submit(ctrl->ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ if (resp_hdr.status)
+ return resp_hdr.status;
+
+ if (args->result)
+ *args->result = resp_hdr.cdw0;
+
+ args->data_len = resp.data_len;
+
+ return 0;
+}
+
+static int nvme_mi_read_data(nvme_mi_ep_t ep, __u32 cdw0,
+ void *data, size_t *data_len)
+{
+ struct nvme_mi_mi_resp_hdr resp_hdr;
+ struct nvme_mi_mi_req_hdr req_hdr;
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ int rc;
+
+ memset(&req_hdr, 0, sizeof(req_hdr));
+ req_hdr.hdr.type = NVME_MI_MSGTYPE_NVME;
+ req_hdr.hdr.nmp = (NVME_MI_ROR_REQ << 7) |
+ (NVME_MI_MT_MI << 3); /* we always use command slot 0 */
+ req_hdr.opcode = nvme_mi_mi_opcode_mi_data_read;
+ req_hdr.cdw0 = cdw0;
+
+ memset(&req, 0, sizeof(req));
+ req.hdr = &req_hdr.hdr;
+ req.hdr_len = sizeof(req_hdr);
+
+ memset(&resp, 0, sizeof(resp));
+ resp.hdr = &resp_hdr.hdr;
+ resp.hdr_len = sizeof(resp_hdr);
+ resp.data = data;
+ resp.data_len = *data_len;
+
+ rc = nvme_mi_submit(ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ if (resp_hdr.status)
+ return resp_hdr.status;
+
+ *data_len = resp.data_len;
+
+ return 0;
+}
+
+int nvme_mi_mi_read_mi_data_subsys(nvme_mi_ep_t ep,
+ struct nvme_mi_read_nvm_ss_info *s)
+{
+ size_t len;
+ __u32 cdw0;
+ int rc;
+
+ cdw0 = (__u8)nvme_mi_dtyp_subsys_info << 24;
+ len = sizeof(*s);
+
+ rc = nvme_mi_read_data(ep, cdw0, s, &len);
+ if (rc)
+ return rc;
+
+ if (len != sizeof(*s)) {
+ nvme_msg(ep->root, LOG_WARNING,
+ "MI read data length mismatch: "
+ "got %zd bytes, expected %zd\n",
+ len, sizeof(*s));
+ errno = EPROTO;
+ return -1;
+ }
+
+ return 0;
+}
+
+int nvme_mi_mi_read_mi_data_port(nvme_mi_ep_t ep, __u8 portid,
+ struct nvme_mi_read_port_info *p)
+{
+ size_t len;
+ __u32 cdw0;
+ int rc;
+
+ cdw0 = ((__u8)nvme_mi_dtyp_port_info << 24) | (portid << 16);
+ len = sizeof(*p);
+
+ rc = nvme_mi_read_data(ep, cdw0, p, &len);
+ if (rc)
+ return rc;
+
+ if (len != sizeof(*p)) {
+ errno = EPROTO;
+ return -1;
+ }
+
+ return 0;
+}
+
+int nvme_mi_mi_read_mi_data_ctrl_list(nvme_mi_ep_t ep, __u8 start_ctrlid,
+ struct nvme_ctrl_list *list)
+{
+ size_t len;
+ __u32 cdw0;
+ int rc;
+
+ cdw0 = ((__u8)nvme_mi_dtyp_ctrl_list << 24) | (start_ctrlid << 16);
+ len = sizeof(*list);
+
+ rc = nvme_mi_read_data(ep, cdw0, list, &len);
+ if (rc)
+ return rc;
+
+ return 0;
+}
+
+int nvme_mi_mi_read_mi_data_ctrl(nvme_mi_ep_t ep, __u16 ctrl_id,
+ struct nvme_mi_read_ctrl_info *ctrl)
+{
+ size_t len;
+ __u32 cdw0;
+ int rc;
+
+ cdw0 = ((__u8)nvme_mi_dtyp_ctrl_info << 24) | cpu_to_le16(ctrl_id);
+ len = sizeof(*ctrl);
+
+ rc = nvme_mi_read_data(ep, cdw0, ctrl, &len);
+ if (rc)
+ return rc;
+
+ if (len != sizeof(*ctrl)) {
+ errno = EPROTO;
+ return -1;
+ }
+
+ return 0;
+}
+
+int nvme_mi_mi_subsystem_health_status_poll(nvme_mi_ep_t ep, bool clear,
+ struct nvme_mi_nvm_ss_health_status *sshs)
+{
+ struct nvme_mi_mi_resp_hdr resp_hdr;
+ struct nvme_mi_mi_req_hdr req_hdr;
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ int rc;
+
+ memset(&req_hdr, 0, sizeof(req_hdr));
+ req_hdr.hdr.type = NVME_MI_MSGTYPE_NVME;;
+ req_hdr.hdr.nmp = (NVME_MI_ROR_REQ << 7) |
+ (NVME_MI_MT_MI << 3);
+ req_hdr.opcode = nvme_mi_mi_opcode_subsys_health_status_poll;
+ req_hdr.cdw1 = (clear ? 1 : 0) << 31;
+
+ memset(&req, 0, sizeof(req));
+ req.hdr = &req_hdr.hdr;
+ req.hdr_len = sizeof(req_hdr);
+
+ memset(&resp, 0, sizeof(resp));
+ resp.hdr = &resp_hdr.hdr;
+ resp.hdr_len = sizeof(resp_hdr);
+ resp.data = sshs;
+ resp.data_len = sizeof(*sshs);
+
+ rc = nvme_mi_submit(ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ if (resp_hdr.status)
+ return resp_hdr.status;
+
+ if (resp.data_len != sizeof(*sshs)) {
+ nvme_msg(ep->root, LOG_WARNING,
+ "MI Subsystem Health Status length mismatch: "
+ "got %zd bytes, expected %zd\n",
+ resp.data_len, sizeof(*sshs));
+ errno = EPROTO;
+ return -1;
+ }
+
+ return 0;
+}
+
+int nvme_mi_mi_config_get(nvme_mi_ep_t ep, __u32 dw0, __u32 dw1,
+ __u32 *nmresp)
+{
+ struct nvme_mi_mi_resp_hdr resp_hdr;
+ struct nvme_mi_mi_req_hdr req_hdr;
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ int rc;
+
+ memset(&req_hdr, 0, sizeof(req_hdr));
+ req_hdr.hdr.type = NVME_MI_MSGTYPE_NVME;
+ req_hdr.hdr.nmp = (NVME_MI_ROR_REQ << 7) | (NVME_MI_MT_MI << 3);
+ req_hdr.opcode = nvme_mi_mi_opcode_configuration_get;
+ req_hdr.cdw0 = cpu_to_le32(dw0);
+ req_hdr.cdw1 = cpu_to_le32(dw1);
+
+ memset(&req, 0, sizeof(req));
+ req.hdr = &req_hdr.hdr;
+ req.hdr_len = sizeof(req_hdr);
+
+ memset(&resp, 0, sizeof(resp));
+ resp.hdr = &resp_hdr.hdr;
+ resp.hdr_len = sizeof(resp_hdr);
+
+ rc = nvme_mi_submit(ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ if (resp_hdr.status)
+ return resp_hdr.status;
+
+ *nmresp = resp_hdr.nmresp[0] |
+ resp_hdr.nmresp[1] << 8 |
+ resp_hdr.nmresp[2] << 16;
+
+ return 0;
+}
+
+int nvme_mi_mi_config_set(nvme_mi_ep_t ep, __u32 dw0, __u32 dw1)
+{
+ struct nvme_mi_mi_resp_hdr resp_hdr;
+ struct nvme_mi_mi_req_hdr req_hdr;
+ struct nvme_mi_resp resp;
+ struct nvme_mi_req req;
+ int rc;
+
+ memset(&req_hdr, 0, sizeof(req_hdr));
+ req_hdr.hdr.type = NVME_MI_MSGTYPE_NVME;
+ req_hdr.hdr.nmp = (NVME_MI_ROR_REQ << 7) | (NVME_MI_MT_MI << 3);
+ req_hdr.opcode = nvme_mi_mi_opcode_configuration_set;
+ req_hdr.cdw0 = cpu_to_le32(dw0);
+ req_hdr.cdw1 = cpu_to_le32(dw1);
+
+ memset(&req, 0, sizeof(req));
+ req.hdr = &req_hdr.hdr;
+ req.hdr_len = sizeof(req_hdr);
+
+ memset(&resp, 0, sizeof(resp));
+ resp.hdr = &resp_hdr.hdr;
+ resp.hdr_len = sizeof(resp_hdr);
+
+ rc = nvme_mi_submit(ep, &req, &resp);
+ if (rc)
+ return rc;
+
+ if (resp_hdr.status)
+ return resp_hdr.status;
+
+ return 0;
+}
+
+void nvme_mi_close(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_ctrl *ctrl, *tmp;
+
+ /* don't look for controllers during destruction */
+ ep->controllers_scanned = true;
+
+ nvme_mi_for_each_ctrl_safe(ep, ctrl, tmp)
+ nvme_mi_close_ctrl(ctrl);
+
+ if (ep->transport->close)
+ ep->transport->close(ep);
+ list_del(&ep->root_entry);
+ free(ep);
+}
+
+void nvme_mi_close_ctrl(nvme_mi_ctrl_t ctrl)
+{
+ list_del(&ctrl->ep_entry);
+ free(ctrl);
+}
+
+char *nvme_mi_endpoint_desc(nvme_mi_ep_t ep)
+{
+ char tsbuf[101], *s = NULL;
+ size_t tslen;
+ int rc;
+
+ rc = -1;
+ memset(tsbuf, 0, sizeof(tsbuf));
+ if (ep->transport->desc_ep)
+ rc = ep->transport->desc_ep(ep, tsbuf, sizeof(tsbuf) - 1);
+
+ if (!rc) {
+ /* don't overflow if the transport gives us an invalid string */
+ tsbuf[sizeof(tsbuf)-1] = '\0';
+ tslen = strlen(tsbuf);
+ } else {
+ tslen = 0;
+ }
+
+ if (tslen)
+ rc = asprintf(&s, "%s: %s", ep->transport->name, tsbuf);
+ else
+ rc = asprintf(&s, "%s endpoint", ep->transport->name);
+
+ if (rc < 0)
+ return NULL;
+
+ return s;
+}
+
+nvme_mi_ep_t nvme_mi_first_endpoint(nvme_root_t m)
+{
+ return list_top(&m->endpoints, struct nvme_mi_ep, root_entry);
+}
+
+nvme_mi_ep_t nvme_mi_next_endpoint(nvme_root_t m, nvme_mi_ep_t ep)
+{
+ return ep ? list_next(&m->endpoints, ep, root_entry) : NULL;
+}
+
+nvme_mi_ctrl_t nvme_mi_first_ctrl(nvme_mi_ep_t ep)
+{
+ return list_top(&ep->controllers, struct nvme_mi_ctrl, ep_entry);
+}
+
+nvme_mi_ctrl_t nvme_mi_next_ctrl(nvme_mi_ep_t ep, nvme_mi_ctrl_t c)
+{
+ return c ? list_next(&ep->controllers, c, ep_entry) : NULL;
+}
diff --git a/src/nvme/mi.h b/src/nvme/mi.h
new file mode 100644
index 0000000..81cb00f
--- /dev/null
+++ b/src/nvme/mi.h
@@ -0,0 +1,1111 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * This file is part of libnvme.
+ * Copyright (c) 2021 Code Construct Pty Ltd
+ *
+ * Authors: Jeremy Kerr <jk@codeconstruct.com.au>
+ */
+
+/**
+ * DOC: mi.h - NVMe Management Interface library (libnvme-mi) definitions.
+ *
+ * These provide an abstraction for the MI messaging between controllers
+ * and a host, typically over an MCTP-over-i2c link to a NVMe device, used
+ * as part of the out-of-band management of a system.
+ *
+ * We have a few data structures define here to reflect the topology
+ * of a MI connection with an NVMe subsystem:
+ *
+ * - &nvme_mi_ep_t: an MI endpoint - our mechanism of communication with a
+ * NVMe subsystem. For MCTP, an endpoint will be the component that
+ * holds the MCTP address (EID), and receives our request message.
+ *
+ * endpoints are defined in the NVMe-MI spec, and are specific to the MI
+ * interface.
+ *
+ * Each endpoint will provide access to one or more of:
+ *
+ * - &nvme_mi_ctrl_t: a NVMe controller, as defined by the NVMe base spec.
+ * The controllers are responsible for processing any NVMe standard
+ * commands (eg, the Admin command set). An endpoint (&nvme_mi_ep_t)
+ * may provide access to multiple controllers - so each of the controller-
+ * type commands will require a &nvme_mi_ctrl_t to be specified, rather than
+ * an endpoint
+ *
+ * A couple of conventions with the libnvme-mi API:
+ *
+ * - All types and functions have the nvme_mi prefix, to distinguish from
+ * the libnvme core.
+ *
+ * - We currently support either MI commands and Admin commands. The
+ * former adds a _mi prefix, the latter an _admin prefix. [This does
+ * result in the MI functions having a double _mi, like
+ * &nvme_mi_mi_subsystem_health_status_poll, which is apparently amusing
+ * for our German-speaking readers]
+ *
+ * For return values: unless specified in the per-function documentation,
+ * all functions:
+ *
+ * - return 0 on success
+ *
+ * - return -1, with errno set, for errors communicating with the MI device,
+ * either in request or response data
+ *
+ * - return >1 on MI status errors. This value is the 8-bit MI status
+ * value, represented by &enum nvme_mi_resp_status. Note that the
+ * status values may be vendor-defined above 0xe0.
+ *
+ * For the second case, we have a few conventions for errno values:
+ *
+ * - EPROTO: response data violated the MI protocol, and libnvme cannot
+ * validly interpret the response
+ *
+ * - EIO: Other I/O error communicating with device (eg., valid but
+ * unexpected response data)
+ *
+ * - EINVAL: invalid input arguments for a command
+ *
+ * In line with the core NVMe API, the Admin command functions take an
+ * `_args` structure to provide the command-specific parameters. However,
+ * for the MI interface, the fd and timeout members of these _args structs
+ * are ignored.
+ *
+ * References to the specifications here will either to be the NVM Express
+ * Management Interface ("NVMe-MI") or the NVM Express Base specification
+ * ("NVMe"). At the time of writing, the versions we're referencing here
+ * are:
+ * - NVMe-MI 1.2b
+ * - NVMe 2.0b
+ * with a couple of accommodations for older spec types, particularly NVMe-MI
+ * 1.1, where possible.
+ *
+ */
+
+#ifndef _LIBNVME_MI_MI_H
+#define _LIBNVME_MI_MI_H
+
+#include <endian.h>
+#include <stdint.h>
+
+#include "types.h"
+#include "tree.h"
+
+/**
+ * NVME_MI_MSGTYPE_NVME - MCTP message type for NVMe-MI messages.
+ *
+ * This is defined by MCTP, but is referenced as part of the NVMe-MI message
+ * spec. This is the MCTP NVMe message type (0x4), with the message-integrity
+ * bit (0x80) set.
+ */
+#define NVME_MI_MSGTYPE_NVME 0x84
+
+/* Basic MI message definitions */
+
+/**
+ * enum nvme_mi_message_type - NVMe-MI message type field.
+ * @NVME_MI_MT_CONTROL: NVME-MI Control Primitive
+ * @NVME_MI_MT_MI: NVMe-MI command
+ * @NVME_MI_MT_ADMIN: NVMe Admin command
+ * @NVME_MI_MT_PCIE: PCIe command
+ *
+ * Used as byte 1 of both request and response messages (NMIMT bits of NMP
+ * byte). Not to be confused with the MCTP message type in byte 0.
+ */
+enum nvme_mi_message_type {
+ NVME_MI_MT_CONTROL = 0,
+ NVME_MI_MT_MI = 1,
+ NVME_MI_MT_ADMIN = 2,
+ NVME_MI_MT_PCIE = 4,
+};
+
+/**
+ * enum nvme_mi_ror: Request or response field.
+ * @NVME_MI_ROR_REQ: request message
+ * @NVME_MI_ROR_RSP: response message
+ */
+enum nvme_mi_ror {
+ NVME_MI_ROR_REQ = 0,
+ NVME_MI_ROR_RSP = 1,
+};
+
+/**
+ * enum nvme_mi_resp_status - values for the response status field
+ * @NVME_MI_RESP_SUCCESS: success
+ * @NVME_MI_RESP_MPR: More Processing Required
+ * @NVME_MI_RESP_INTERNAL_ERR: Internal Error
+ * @NVME_MI_RESP_INVALID_OPCODE: Invalid command opcode
+ * @NVME_MI_RESP_INVALID_PARAM: Invalid command parameter
+ * @NVME_MI_RESP_INVALID_CMD_SIZE: Invalid command size
+ * @NVME_MI_RESP_INVALID_INPUT_SIZE: Invalid command input data size
+ * @NVME_MI_RESP_ACCESS_DENIED: Access Denied
+ * @NVME_MI_RESP_VPD_UPDATES_EXCEEDED: More VPD updates than allowed
+ * @NVME_MI_RESP_PCIE_INACCESSIBLE: PCIe functionality currently unavailable
+ * @NVME_MI_RESP_MEB_SANITIZED: MEB has been cleared due to sanitize
+ * @NVME_MI_RESP_ENC_SERV_FAILURE: Enclosure services process failed
+ * @NVME_MI_RESP_ENC_SERV_XFER_FAILURE: Transfer with enclosure services failed
+ * @NVME_MI_RESP_ENC_FAILURE: Unreoverable enclosure failure
+ * @NVME_MI_RESP_ENC_XFER_REFUSED: Enclosure services transfer refused
+ * @NVME_MI_RESP_ENC_FUNC_UNSUP: Unsupported enclosure services function
+ * @NVME_MI_RESP_ENC_SERV_UNAVAIL: Enclosure services unavailable
+ * @NVME_MI_RESP_ENC_DEGRADED: Noncritical failure detected by enc. services
+ * @NVME_MI_RESP_SANITIZE_IN_PROGRESS: Command prohibited during sanitize
+ */
+enum nvme_mi_resp_status {
+ NVME_MI_RESP_SUCCESS = 0x00,
+ NVME_MI_RESP_MPR = 0x01,
+ NVME_MI_RESP_INTERNAL_ERR = 0x02,
+ NVME_MI_RESP_INVALID_OPCODE = 0x03,
+ NVME_MI_RESP_INVALID_PARAM = 0x04,
+ NVME_MI_RESP_INVALID_CMD_SIZE = 0x05,
+ NVME_MI_RESP_INVALID_INPUT_SIZE = 0x06,
+ NVME_MI_RESP_ACCESS_DENIED = 0x07,
+ /* 0x08 - 0x1f: reserved */
+ NVME_MI_RESP_VPD_UPDATES_EXCEEDED = 0x20,
+ NVME_MI_RESP_PCIE_INACCESSIBLE = 0x21,
+ NVME_MI_RESP_MEB_SANITIZED = 0x22,
+ NVME_MI_RESP_ENC_SERV_FAILURE = 0x23,
+ NVME_MI_RESP_ENC_SERV_XFER_FAILURE = 0x24,
+ NVME_MI_RESP_ENC_FAILURE = 0x25,
+ NVME_MI_RESP_ENC_XFER_REFUSED = 0x26,
+ NVME_MI_RESP_ENC_FUNC_UNSUP = 0x27,
+ NVME_MI_RESP_ENC_SERV_UNAVAIL = 0x28,
+ NVME_MI_RESP_ENC_DEGRADED = 0x29,
+ NVME_MI_RESP_SANITIZE_IN_PROGRESS = 0x2a,
+ /* 0x2b - 0xdf: reserved */
+ /* 0xe0 - 0xff: vendor specific */
+};
+
+/**
+ * struct nvme_mi_msg_hdr - General MI message header.
+ * @type: MCTP message type, will always be NVME_MI_MSGTYPE_NVME
+ * @nmp: NVMe-MI message parameters (including MI message type)
+ * @meb: Management Endpoint Buffer flag; unused for libnvme-mi implementation
+ * @rsvd0: currently reserved
+ *
+ * Wire format shared by both request and response messages, per NVMe-MI
+ * section 3.1. This is used for all message types, MI and Admin.
+ */
+struct nvme_mi_msg_hdr {
+ __u8 type;
+ __u8 nmp;
+ __u8 meb;
+ __u8 rsvd0;
+} __attribute__((packed));
+
+/**
+ * struct nvme_mi_msg_resp - Generic response type.
+ * @hdr: the general request/response message header
+ * @status: response status value (see &enum nvme_mi_resp_status)
+ * @rsvd0: reserved data, may be defined by specific response
+ *
+ * Every response will start with one of these; command-specific responses
+ * will define parts of the reserved data, and may add further fields.
+ */
+struct nvme_mi_msg_resp {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 rsvd0[3];
+};
+
+/**
+ * enum nvme_mi_mi_opcode - Operation code for supported NVMe-MI commands.
+ * @nvme_mi_mi_opcode_mi_data_read: Read NVMe-MI Data Structure
+ * @nvme_mi_mi_opcode_subsys_health_status_poll: Subsystem Health Status Poll
+ * @nvme_mi_mi_opcode_configuration_set: MI Configuration Set
+ * @nvme_mi_mi_opcode_configuration_get: MI Configuration Get
+ */
+enum nvme_mi_mi_opcode {
+ nvme_mi_mi_opcode_mi_data_read = 0x00,
+ nvme_mi_mi_opcode_subsys_health_status_poll = 0x01,
+ nvme_mi_mi_opcode_configuration_set = 0x03,
+ nvme_mi_mi_opcode_configuration_get = 0x04,
+};
+
+/**
+ * struct nvme_mi_mi_req_hdr - MI request message header.
+ * @hdr: generic MI message header
+ * @opcode: opcode (OPC) for the specific MI command
+ * @rsvd0: reserved bytes
+ * @cdw0: Management Request Doubleword 0 - command specific usage
+ * @cdw1: Management Request Doubleword 1 - command specific usage
+ *
+ * Wire format for MI request message headers, defined in section 5 of NVMe-MI.
+ */
+struct nvme_mi_mi_req_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 opcode;
+ __u8 rsvd0[3];
+ __le32 cdw0, cdw1;
+};
+
+/**
+ * struct nvme_mi_mi_resp_hdr - MI response message header.
+ * @hdr: generic MI message header
+ * @status: generic response status from command; non-zero on failure.
+ * @nmresp: NVMe Management Response: command-type-specific response data
+ *
+ * Wire format for MI response message header, defined in section 5 of NVMe-MI.
+ */
+struct nvme_mi_mi_resp_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 nmresp[3];
+};
+
+/**
+ * enum nvme_mi_dtyp - Data Structure Type field.
+ * @nvme_mi_dtyp_subsys_info: NVM Subsystem Information
+ * @nvme_mi_dtyp_port_info: Port information
+ * @nvme_mi_dtyp_ctrl_list: Controller List
+ * @nvme_mi_dtyp_ctrl_info: Controller Information
+ * @nvme_mi_dtyp_opt_cmd_support: Optionally Supported Command List
+ * @nvme_mi_dtyp_meb_support: Management Endpoint Buffer Command Support List
+ *
+ * Data Structure Type field for Read NVMe-MI Data Structure command, used to
+ * indicate the particular structure to query from the endpoint.
+ */
+enum nvme_mi_dtyp {
+ nvme_mi_dtyp_subsys_info = 0x00,
+ nvme_mi_dtyp_port_info = 0x01,
+ nvme_mi_dtyp_ctrl_list = 0x02,
+ nvme_mi_dtyp_ctrl_info = 0x03,
+ nvme_mi_dtyp_opt_cmd_support = 0x04,
+ nvme_mi_dtyp_meb_support = 0x05,
+};
+
+/**
+ * enum nvme_mi_config_id - NVMe-MI Configuration identifier.
+ * @NVME_MI_CONFIG_SMBUS_FREQ: Current SMBus/I2C frequency
+ * @NVME_MI_CONFIG_HEALTH_STATUS_CHANGE: Health Status change - used to clear
+ * health status bits in CCS bits of
+ * status poll. Only for Set ops.
+ * @NVME_MI_CONFIG_MCTP_MTU: MCTP maximum transmission unit size of port
+ * specified in dw 0
+ *
+ * Configuration parameters for the MI Get/Set Configuration commands.
+ *
+ * See &nvme_mi_mi_config_get() and &nvme_mi_config_set().
+ */
+enum nvme_mi_config_id {
+ NVME_MI_CONFIG_SMBUS_FREQ = 0x1,
+ NVME_MI_CONFIG_HEALTH_STATUS_CHANGE = 0x2,
+ NVME_MI_CONFIG_MCTP_MTU = 0x3,
+};
+
+/**
+ * enum nvme_mi_config_smbus_freq - SMBus/I2C frequency values
+ * @NVME_MI_CONFIG_SMBUS_FREQ_100kHz: 100kHz
+ * @NVME_MI_CONFIG_SMBUS_FREQ_400kHz: 400kHz
+ * @NVME_MI_CONFIG_SMBUS_FREQ_1MHz: 1MHz
+ *
+ * Values used in the SMBus Frequency device configuration. See
+ * &nvme_mi_mi_config_get_smbus_freq() and &nvme_mi_mi_config_set_smbus_freq().
+ */
+enum nvme_mi_config_smbus_freq {
+ NVME_MI_CONFIG_SMBUS_FREQ_100kHz = 0x1,
+ NVME_MI_CONFIG_SMBUS_FREQ_400kHz = 0x2,
+ NVME_MI_CONFIG_SMBUS_FREQ_1MHz = 0x3,
+};
+
+/* Admin command definitions */
+
+/**
+ * struct nvme_mi_admin_req_hdr - Admin command request header.
+ * @hdr: Generic MI message header
+ * @opcode: Admin command opcode (using enum nvme_admin_opcode)
+ * @flags: Command Flags, indicating dlen and doff validity; Only defined in
+ * NVMe-MI version 1.1, no fields defined in 1.2 (where the dlen/doff
+ * are always considered valid).
+ * @ctrl_id: Controller ID target of command
+ * @cdw1: Submission Queue Entry doubleword 1
+ * @cdw2: Submission Queue Entry doubleword 2
+ * @cdw3: Submission Queue Entry doubleword 3
+ * @cdw4: Submission Queue Entry doubleword 4
+ * @cdw5: Submission Queue Entry doubleword 5
+ * @doff: Offset of data to return from command
+ * @dlen: Length of sent/returned data
+ * @rsvd0: Reserved
+ * @rsvd1: Reserved
+ * @cdw10: Submission Queue Entry doubleword 10
+ * @cdw11: Submission Queue Entry doubleword 11
+ * @cdw12: Submission Queue Entry doubleword 12
+ * @cdw13: Submission Queue Entry doubleword 13
+ * @cdw14: Submission Queue Entry doubleword 14
+ * @cdw15: Submission Queue Entry doubleword 15
+ *
+ * Wire format for Admin command message headers, defined in section 6 of
+ * NVMe-MI.
+ */
+struct nvme_mi_admin_req_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 opcode;
+ __u8 flags;
+ __le16 ctrl_id;
+ __le32 cdw1, cdw2, cdw3, cdw4, cdw5;
+ __le32 doff;
+ __le32 dlen;
+ __le32 rsvd0, rsvd1;
+ __le32 cdw10, cdw11, cdw12, cdw13, cdw14, cdw15;
+} __attribute((packed));
+
+/**
+ * struct nvme_mi_admin_resp_hdr - Admin command response header.
+ * @hdr: Generic MI message header
+ * @status: Generic response code, non-zero on failure
+ * @rsvd0: Reserved
+ * @cdw0: Completion Queue Entry doubleword 0
+ * @cdw1: Completion Queue Entry doubleword 1
+ * @cdw3: Completion Queue Entry doubleword 3
+ *
+ * This is the generic response format with the three doublewords of completion
+ * queue data, plus optional response data.
+ */
+struct nvme_mi_admin_resp_hdr {
+ struct nvme_mi_msg_hdr hdr;
+ __u8 status;
+ __u8 rsvd0[3];
+ __le32 cdw0, cdw1, cdw3;
+} __attribute__((packed));
+
+
+/**
+ * nvme_mi_create_root() - Create top-level MI (root) handle.
+ * @fp: File descriptor for logging messages
+ * @log_level: Logging level to use
+ *
+ * Create the top-level (library) handle for creating subsequent endpoint
+ * objects. Similar to nvme_create_root(), but we provide this to allow linking
+ * without the core libnvme.
+ *
+ * Return: new root object, or NULL on failure.
+ *
+ * See &nvme_create_root.
+ */
+nvme_root_t nvme_mi_create_root(FILE *fp, int log_level);
+
+/**
+ * nvme_mi_free_root() - Free root object.
+ * @root: root to free
+ */
+void nvme_mi_free_root(nvme_root_t root);
+
+/* Top level management object: NVMe-MI Management Endpoint */
+struct nvme_mi_ep;
+
+/**
+ * typedef nvme_mi_ep_t - MI Endpoint object.
+ *
+ * Represents our communication endpoint on the remote MI-capable device.
+ * To be used for direct MI commands for the endpoint (through the
+ * nvme_mi_mi_* functions(), or to communicate with individual controllers
+ * (see &nvme_mi_init_ctrl).
+ *
+ * Endpoints are created through a transport-specific constructor; currently
+ * only MCTP-connected endpoints are supported, through &nvme_mi_open_mctp.
+ * Subsequent operations on the endpoint (and related controllers) are
+ * transport-independent.
+ */
+typedef struct nvme_mi_ep * nvme_mi_ep_t;
+
+/**
+ * nvme_mi_first_endpoint - Start endpoint iterator
+ * @m: &nvme_root_t object
+ *
+ * Return: first MI endpoint object under this root, or NULL if no endpoints
+ * are present.
+ *
+ * See: &nvme_mi_next_endpoint, &nvme_mi_for_each_endpoint
+ */
+nvme_mi_ep_t nvme_mi_first_endpoint(nvme_root_t m);
+
+/**
+ * nvme_mi_next_endpoint - Continue endpoint iterator
+ * @m: &nvme_root_t object
+ * @e: &nvme_mi_ep_t current position of iterator
+ *
+ * Return: next endpoint MI endpoint object after @e under this root, or NULL
+ * if no further endpoints are present.
+ *
+ * See: &nvme_mi_first_endpoint, &nvme_mi_for_each_endpoint
+ */
+nvme_mi_ep_t nvme_mi_next_endpoint(nvme_root_t m, nvme_mi_ep_t e);
+
+/**
+ * nvme_mi_for_each_endpoint - Iterator for NVMe-MI endpoints.
+ * @m: &nvme_root_t containing endpoints
+ * @e: &nvme_mi_ep_t object, set on each iteration
+ */
+#define nvme_mi_for_each_endpoint(m, e) \
+ for (e = nvme_mi_first_endpoint(m); e != NULL; \
+ e = nvme_mi_next_endpoint(m, e))
+
+/**
+ * nvme_mi_for_each_endpoint_safe - Iterator for NVMe-MI endpoints, allowing
+ * deletion during traversal
+ * @m: &nvme_root_t containing endpoints
+ * @e: &nvme_mi_ep_t object, set on each iteration
+ * @_e: &nvme_mi_ep_t object used as temporary storage
+ */
+#define nvme_mi_for_each_endpoint_safe(m, e, _e) \
+ for (e = nvme_mi_first_endpoint(m), _e = nvme_mi_next_endpoint(m, e); \
+ e != NULL; \
+ e = _e, _e = nvme_mi_next_endpoint(m, e))
+
+struct nvme_mi_ctrl;
+
+/**
+ * typedef nvme_mi_ctrl_t - NVMe-MI Controller object.
+ *
+ * Provides NVMe command functionality, through the MI interface.
+ */
+typedef struct nvme_mi_ctrl * nvme_mi_ctrl_t;
+
+/**
+ * nvme_mi_first_ctrl - Start controller iterator
+ * @ep: &nvme_mi_ep_t object
+ *
+ * Return: first MI controller object under this root, or NULL if no controllers
+ * are present.
+ *
+ * See: &nvme_mi_next_ctrl, &nvme_mi_for_each_ctrl
+ */
+nvme_mi_ctrl_t nvme_mi_first_ctrl(nvme_mi_ep_t ep);
+
+/**
+ * nvme_mi_next_ctrl - Continue ctrl iterator
+ * @ep: &nvme_mi_ep_t object
+ * @c: &nvme_mi_ctrl_t current position of iterator
+ *
+ * Return: next MI controller object after @c under this endpoint, or NULL
+ * if no further controllers are present.
+ *
+ * See: &nvme_mi_first_ctrl, &nvme_mi_for_each_ctrl
+ */
+nvme_mi_ctrl_t nvme_mi_next_ctrl(nvme_mi_ep_t ep, nvme_mi_ctrl_t c);
+
+/**
+ * nvme_mi_for_each_ctrl - Iterator for NVMe-MI controllers.
+ * @ep: &nvme_mi_ep_t containing endpoints
+ * @c: &nvme_mi_ctrl_t object, set on each iteration
+ *
+ * Allows iteration of the list of controllers behind an endpoint. Unless the
+ * controllers have already been created explicitly, you'll probably want to
+ * call &nvme_mi_scan_ep() to scan for the controllers first.
+ *
+ * See: &nvme_mi_scan_ep()
+ */
+#define nvme_mi_for_each_ctrl(ep, c) \
+ for (c = nvme_mi_first_ctrl(ep); c != NULL; \
+ c = nvme_mi_next_ctrl(ep, c))
+
+/**
+ * nvme_mi_for_each_ctrl_safe - Iterator for NVMe-MI controllers, allowing
+ * deletion during traversal
+ * @ep: &nvme_mi_ep_t containing controllers
+ * @c: &nvme_mi_ctrl_t object, set on each iteration
+ * @_c: &nvme_mi_ctrl_t object used as temporary storage
+ *
+ * Allows iteration of the list of controllers behind an endpoint, safe against
+ * deletion during iteration. Unless the controllers have already been created
+ * explicitly (or you're just iterating to destroy controllers) you'll probably
+ * want to call &nvme_mi_scan_ep() to scan for the controllers first.
+ *
+ * See: &nvme_mi_scan_ep()
+ */
+#define nvme_mi_for_each_ctrl_safe(ep, c, _c) \
+ for (c = nvme_mi_first_ctrl(ep), _c = nvme_mi_next_ctrl(ep, c); \
+ c != NULL; \
+ c = _c, _c = nvme_mi_next_ctrl(ep, c))
+
+/**
+ * nvme_mi_open_mctp() - Create an endpoint using a MCTP connection.
+ * @root: root object to create under
+ * @netid: MCTP network ID on this system
+ * @eid: MCTP endpoint ID
+ *
+ * Transport-specific endpoint initialization for MI-connected endpoints. Once
+ * an endpoint is created, the rest of the API is transport-independent.
+ *
+ * Return: New endpoint object for @netid & @eid, or NULL on failure.
+ *
+ * See &nvme_mi_close
+ */
+nvme_mi_ep_t nvme_mi_open_mctp(nvme_root_t root, unsigned int netid, uint8_t eid);
+
+/**
+ * nvme_mi_close() - Close an endpoint connection and release resources,
+ * including controller objects.
+ *
+ * @ep: Endpoint object to close
+ */
+void nvme_mi_close(nvme_mi_ep_t ep);
+
+/**
+ * nvme_mi_scan_mctp - look for MCTP-connected NVMe-MI endpoints.
+ *
+ * Description: This function queries the system MCTP daemon ("mctpd") over
+ * D-Bus, to find MCTP endpoints that report support for NVMe-MI over MCTP.
+ *
+ * This requires libvnme-mi to be compiled with D-Bus support; if not, this
+ * will return NULL.
+ *
+ * Return: A @nvme_root_t populated with a set of MCTP-connected endpoints,
+ * or NULL on failure
+ */
+nvme_root_t nvme_mi_scan_mctp(void);
+
+/**
+ * nvme_mi_scan_ep - query an endpoint for its NVMe controllers.
+ * @ep: Endpoint to scan
+ * @force_rescan: close existing controllers and rescan
+ *
+ * This function queries an MI endpoint for the controllers available, by
+ * performing an MI Read MI Data Structure command (requesting the
+ * controller list). The controllers are stored in the endpoint's internal
+ * list, and can be iterated with nvme_mi_for_each_ctrl.
+ *
+ * This will only scan the endpoint once, unless @force_rescan is set. If
+ * so, all existing controller objects will be freed - the caller must not
+ * hold a reference to those across this call.
+ *
+ * Return: 0 on success, non-zero on failure
+ *
+ * See: &nvme_mi_for_each_ctrl
+ */
+int nvme_mi_scan_ep(nvme_mi_ep_t ep, bool force_rescan);
+
+/**
+ * nvme_mi_init_ctrl() - initialise a NVMe controller.
+ * @ep: Endpoint to create under
+ * @ctrl_id: ID of controller to initialize.
+ *
+ * Create a connection to a controller behind the endpoint specified in @ep.
+ * Controller IDs may be queried from the endpoint through
+ * &nvme_mi_mi_read_mi_data_ctrl_list.
+ *
+ * Return: New controller object, or NULL on failure.
+ *
+ * See &nvme_mi_close_ctrl
+ */
+nvme_mi_ctrl_t nvme_mi_init_ctrl(nvme_mi_ep_t ep, __u16 ctrl_id);
+
+/**
+ * nvme_mi_close_ctrl() - free a controller
+ * @ctrl: controller to free
+ */
+void nvme_mi_close_ctrl(nvme_mi_ctrl_t ctrl);
+
+/**
+ * nvme_mi_endpoint_desc - Get a string describing a MI endpoint.
+ * @ep: endpoint to describe
+ *
+ * Generates a human-readable string describing the endpoint, with possibly
+ * transport-specific data. The string is allocated during the call, and the
+ * caller is responsible for free()-ing the string.
+ *
+ * Return: a newly-allocated string containing the endpoint description, or
+ * NULL on failure.
+ */
+char *nvme_mi_endpoint_desc(nvme_mi_ep_t ep);
+
+/* MI Command API: nvme_mi_mi_ prefix */
+
+/**
+ * nvme_mi_mi_read_mi_data_subsys() - Perform a Read MI Data Structure command,
+ * retrieving subsystem data.
+ * @ep: endpoint for MI communication
+ * @s: subsystem information to populate
+ *
+ * Retrieves the Subsystem information - number of external ports and
+ * NVMe version information. See &struct nvme_mi_read_nvm_ss_info.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+int nvme_mi_mi_read_mi_data_subsys(nvme_mi_ep_t ep,
+ struct nvme_mi_read_nvm_ss_info *s);
+
+/**
+ * nvme_mi_mi_read_mi_data_port() - Perform a Read MI Data Structure command,
+ * retrieving port data.
+ * @ep: endpoint for MI communication
+ * @portid: id of port data to retrieve
+ * @p: port information to populate
+ *
+ * Retrieves the Port information, for the specified port ID. The subsystem
+ * data (from &nvme_mi_mi_read_mi_data_subsys) nmp field contains the allowed
+ * range of port IDs.
+ *
+ * See &struct nvme_mi_read_port_info.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+int nvme_mi_mi_read_mi_data_port(nvme_mi_ep_t ep, __u8 portid,
+ struct nvme_mi_read_port_info *p);
+
+/**
+ * nvme_mi_mi_read_mi_data_ctrl_list() - Perform a Read MI Data Structure
+ * command, retrieving the list of attached controllers.
+ * @ep: endpoint for MI communication
+ * @start_ctrlid: starting controller ID
+ * @list: controller list to populate
+ *
+ * Retrieves the list of attached controllers, with IDs greater than or
+ * equal to @start_ctrlid.
+ *
+ * See &struct nvme_ctrl_list.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+int nvme_mi_mi_read_mi_data_ctrl_list(nvme_mi_ep_t ep, __u8 start_ctrlid,
+ struct nvme_ctrl_list *list);
+
+/**
+ * nvme_mi_mi_read_mi_data_ctrl() - Perform a Read MI Data Structure command,
+ * retrieving controller information
+ * @ep: endpoint for MI communication
+ * @ctrl_id: ID of controller to query
+ * @ctrl: controller data to populate
+ *
+ * Retrieves the Controller Information Data Structure for the attached
+ * controller with ID @ctrlid.
+ *
+ * See &struct nvme_mi_read_ctrl_info.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+int nvme_mi_mi_read_mi_data_ctrl(nvme_mi_ep_t ep, __u16 ctrl_id,
+ struct nvme_mi_read_ctrl_info *ctrl);
+
+/**
+ * nvme_mi_mi_subsystem_health_status_poll() - Read the Subsystem Health
+ * Data Structure from the NVM subsystem
+ * @ep: endpoint for MI communication
+ * @clear: flag to clear the Composite Controller Status state
+ * @nshds: subsystem health status data to populate
+ *
+ * Retrieves the Subsystem Health Data Structure into @nshds. If @clear is
+ * set, requests that the Composite Controller Status bits are cleared after
+ * the read. See NVMe-MI section 5.6 for details on the CCS bits.
+ *
+ * See &struct nvme_mi_nvm_ss_health_status.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+int nvme_mi_mi_subsystem_health_status_poll(nvme_mi_ep_t ep, bool clear,
+ struct nvme_mi_nvm_ss_health_status *nshds);
+
+/**
+ * nvme_mi_mi_config_get - query a configuration parameter
+ * @ep: endpoint for MI communication
+ * @dw0: management doubleword 0, containing configuration identifier, plus
+ * config-specific fields
+ * @dw1: management doubleword 0, config-specific.
+ * @nmresp: set to queried configuration data in NMRESP field of response.
+ *
+ * Performs a MI Configuration Get command, with the configuration identifier
+ * as the LSB of @dw0. Other @dw0 and @dw1 data is configuration-identifier
+ * specific.
+ *
+ * On a successful Configuration Get, the @nmresp pointer will be populated with
+ * the bytes from the 3-byte NMRESP field, converted to native endian.
+ *
+ * See &enum nvme_mi_config_id for identifiers.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+int nvme_mi_mi_config_get(nvme_mi_ep_t ep, __u32 dw0, __u32 dw1,
+ __u32 *nmresp);
+
+/**
+ * nvme_mi_mi_config_set - set a configuration parameter
+ * @ep: endpoint for MI communication
+ * @dw0: management doubleword 0, containing configuration identifier, plus
+ * config-specific fields
+ * @dw1: management doubleword 0, config-specific.
+ *
+ * Performs a MI Configuration Set command, with the command as the LSB of
+ * @dw0. Other @dw0 and @dw1 data is configuration-identifier specific.
+ *
+ * See &enum nvme_mi_config_id for identifiers.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+int nvme_mi_mi_config_set(nvme_mi_ep_t ep, __u32 dw0, __u32 dw1);
+
+/**
+ * nvme_mi_mi_config_get_smbus_freq - get configuration: SMBus port frequency
+ * @ep: endpoint for MI communication
+ * @port: port ID to query
+ * @freq: output value for current frequency configuration
+ *
+ * Performs a MI Configuration Get, to query the current SMBus frequency of
+ * the port specified in @port. On success, populates @freq with the port
+ * frequency
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+static inline int nvme_mi_mi_config_get_smbus_freq(nvme_mi_ep_t ep, __u8 port,
+ enum nvme_mi_config_smbus_freq *freq)
+{
+ __u32 tmp, dw0;
+ int rc;
+
+ dw0 = port << 24 | NVME_MI_CONFIG_SMBUS_FREQ;
+
+ rc = nvme_mi_mi_config_get(ep, dw0, 0, &tmp);
+ if (!rc)
+ *freq = tmp & 0x3;
+ return rc;
+}
+
+/**
+ * nvme_mi_mi_config_set_smbus_freq - set configuration: SMBus port frequency
+ * @ep: endpoint for MI communication
+ * @port: port ID to set
+ * @freq: new frequency configuration
+ *
+ * Performs a MI Configuration Set, to update the current SMBus frequency of
+ * the port specified in @port.
+ *
+ * See &struct nvme_mi_read_port_info for the maximum supported SMBus frequency
+ * for the port.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+static inline int nvme_mi_mi_config_set_smbus_freq(nvme_mi_ep_t ep, __u8 port,
+ enum nvme_mi_config_smbus_freq freq)
+{
+ __u32 dw0 = port << 24 |
+ (freq & 0x3) << 8 |
+ NVME_MI_CONFIG_SMBUS_FREQ;
+
+ return nvme_mi_mi_config_set(ep, dw0, 0);
+}
+
+/**
+ * nvme_mi_mi_config_set_health_status_change - clear CCS bits in health status
+ * @ep: endpoint for MI communication
+ * @mask: bitmask to clear
+ *
+ * Performs a MI Configuration Set, to update the current health status poll
+ * values of the Composite Controller Status bits. Bits set in @mask will
+ * be cleared from future health status poll data, and may be re-triggered by
+ * a future health change event.
+ *
+ * See &nvme_mi_mi_subsystem_health_status_poll(), &enum nvme_mi_ccs for
+ * values in @mask.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+static inline int nvme_mi_mi_config_set_health_status_change(nvme_mi_ep_t ep,
+ __u32 mask)
+{
+ return nvme_mi_mi_config_set(ep, NVME_MI_CONFIG_HEALTH_STATUS_CHANGE,
+ mask);
+}
+
+/**
+ * nvme_mi_mi_config_get_mctp_mtu - get configuration: MCTP MTU
+ * @ep: endpoint for MI communication
+ * @port: port ID to query
+ * @mtu: output value for current MCTP MTU configuration
+ *
+ * Performs a MI Configuration Get, to query the current MCTP Maximum
+ * Transmission Unit size (MTU) of the port specified in @port. On success,
+ * populates @mtu with the MTU.
+ *
+ * The default reset value is 64, corresponding to the MCTP baseline MTU.
+ *
+ * Some controllers may also use this as the maximum receive unit size, and
+ * may not accept MCTP messages larger than the configured MTU.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+static inline int nvme_mi_mi_config_get_mctp_mtu(nvme_mi_ep_t ep, __u8 port,
+ __u16 *mtu)
+{
+ __u32 tmp, dw0;
+ int rc;
+
+ dw0 = port << 24 | NVME_MI_CONFIG_MCTP_MTU;
+
+ rc = nvme_mi_mi_config_get(ep, dw0, 0, &tmp);
+ if (!rc)
+ *mtu = tmp & 0xffff;
+ return rc;
+}
+
+/**
+ * nvme_mi_mi_config_set_mctp_mtu - set configuration: MCTP MTU
+ * @ep: endpoint for MI communication
+ * @port: port ID to set
+ * @mtu: new MTU configuration
+ *
+ * Performs a MI Configuration Set, to update the current MCTP MTU value for
+ * the port specified in @port.
+ *
+ * Some controllers may also use this as the maximum receive unit size, and
+ * may not accept MCTP messages larger than the configured MTU. When setting
+ * this value, you will likely need to change the MTU of the local MCTP
+ * interface(s) to match.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+static inline int nvme_mi_mi_config_set_mctp_mtu(nvme_mi_ep_t ep, __u8 port,
+ __u16 mtu)
+{
+ __u32 dw0 = port << 24 | NVME_MI_CONFIG_MCTP_MTU;
+
+ return nvme_mi_mi_config_set(ep, dw0, mtu);
+}
+
+/* Admin channel functions */
+
+/**
+ * nvme_mi_admin_xfer() - Raw admin transfer interface.
+ * @ctrl: controller to send the admin command to
+ * @admin_req: request data
+ * @req_data_size: size of request data payload
+ * @admin_resp: buffer for response data
+ * @resp_data_offset: offset into request data to retrieve from controller
+ * @resp_data_size: size of response data buffer, updated to received size
+ *
+ * Performs an arbitrary NVMe Admin command, using the provided request data,
+ * in @admin_req. The size of the request data *payload* is specified in
+ * @req_data_size - this does not include the standard header length (so a
+ * header-only request would have a size of 0).
+ *
+ * On success, response data is stored in @admin_resp, which has an optional
+ * appended payload buffer of @resp_data_size bytes. The actual payload
+ * transferred will be stored in @resp_data_size. These sizes do not include
+ * the Admin request header, so 0 represents no payload.
+ *
+ * As with all Admin commands, we can request partial data from the Admin
+ * Response payload, offset by @resp_data_offset.
+ *
+ * See: &struct nvme_mi_admin_req_hdr and &struct nvme_mi_admin_resp_hdr.
+ *
+ * Return: 0 on success, non-zero on failure.
+ */
+int nvme_mi_admin_xfer(nvme_mi_ctrl_t ctrl,
+ struct nvme_mi_admin_req_hdr *admin_req,
+ size_t req_data_size,
+ struct nvme_mi_admin_resp_hdr *admin_resp,
+ off_t resp_data_offset,
+ size_t *resp_data_size);
+
+/**
+ * nvme_mi_admin_identify_partial() - Perform an Admin identify command,
+ * and retrieve partial response data.
+ * @ctrl: Controller to process identify command
+ * @args: Identify command arguments
+ * @offset: offset of identify data to retrieve from response
+ * @size: size of identify data to return
+ *
+ * Perform an Identify command, using the Identify command parameters in @args.
+ * The @offset and @size arguments allow the caller to retrieve part of
+ * the identify response. See NVMe-MI section 6.2 for the semantics (and some
+ * handy diagrams) of the offset & size parameters.
+ *
+ * Will return an error if the length of the response data (from the controller)
+ * did not match @size.
+ *
+ * Unless you're performing a vendor-unique identify command, You'll probably
+ * want to use one of the identify helpers (nvme_mi_admin_identify,
+ * nvme_mi_admin_identify_cns_nsid, or nvme_mi_admin_identify_<type>) instead
+ * of this. If the type of your identify command is standardized but not
+ * yet supported by libnvme-mi, please contact the maintainers.
+ *
+ * Return: 0 on success, non-zero on failure
+ *
+ * See: &struct nvme_identify_args
+ */
+int nvme_mi_admin_identify_partial(nvme_mi_ctrl_t ctrl,
+ struct nvme_identify_args *args,
+ off_t offset, size_t size);
+
+/**
+ * nvme_mi_admin_identify() - Perform an Admin identify command.
+ * @ctrl: Controller to process identify command
+ * @args: Identify command arguments
+ *
+ * Perform an Identify command, using the Identify command parameters in @args.
+ * Stores the identify data in ->data, and (if set) the result from cdw0
+ * into args->result.
+ *
+ * Will return an error if the length of the response data (from the
+ * controller) is not a full &NVME_IDENTIFY_DATA_SIZE.
+ *
+ * Return: 0 on success, non-zero on failure
+ *
+ * See: &struct nvme_identify_args
+ */
+static inline int nvme_mi_admin_identify(nvme_mi_ctrl_t ctrl,
+ struct nvme_identify_args *args)
+{
+ return nvme_mi_admin_identify_partial(ctrl, args,
+ 0, NVME_IDENTIFY_DATA_SIZE);
+}
+
+/**
+ * nvme_mi_admin_identify_cns_nsid() - Perform an Admin identify command using
+ * specific CNS/NSID parameters.
+ * @ctrl: Controller to process identify command
+ * @cns: Controller or Namespace Structure, specifying identified object
+ * @nsid: namespace ID
+ * @data: buffer for identify data response
+ *
+ * Perform an Identify command, using the CNS specifier @cns, and the
+ * namespace ID @nsid if required by the CNS type.
+ *
+ * Stores the identify data in @data, which is expected to be a buffer of
+ * &NVME_IDENTIFY_DATA_SIZE bytes.
+ *
+ * Will return an error if the length of the response data (from the
+ * controller) is not a full &NVME_IDENTIFY_DATA_SIZE.
+ *
+ * Return: 0 on success, non-zero on failure
+ */
+static inline int nvme_mi_admin_identify_cns_nsid(nvme_mi_ctrl_t ctrl,
+ enum nvme_identify_cns cns,
+ __u32 nsid, void *data)
+{
+ struct nvme_identify_args args = {
+ .result = NULL,
+ .data = data,
+ .args_size = sizeof(args),
+ .cns = cns,
+ .csi = NVME_CSI_NVM,
+ .nsid = nsid,
+ .cntid = NVME_CNTLID_NONE,
+ .cns_specific_id = NVME_CNSSPECID_NONE,
+ .uuidx = NVME_UUID_NONE,
+ };
+
+ return nvme_mi_admin_identify(ctrl, &args);
+}
+
+/**
+ * nvme_mi_admin_identify_ctrl() - Perform an Admin identify for a controller
+ * @ctrl: Controller to process identify command
+ * @id: Controller identify data to populate
+ *
+ * Perform an Identify command, for the controller specified by @ctrl,
+ * writing identify data to @id.
+ *
+ * Will return an error if the length of the response data (from the
+ * controller) is not a full &NVME_IDENTIFY_DATA_SIZE, so @id will be
+ * fully populated on success.
+ *
+ * Return: 0 on success, non-zero on failure
+ *
+ * See: &struct nvme_id_ctrl
+ */
+static inline int nvme_mi_admin_identify_ctrl(nvme_mi_ctrl_t ctrl,
+ struct nvme_id_ctrl *id)
+{
+ return nvme_mi_admin_identify_cns_nsid(ctrl, NVME_IDENTIFY_CNS_CTRL,
+ NVME_NSID_NONE, id);
+}
+
+/**
+ * nvme_mi_admin_identify_ctrl_list() - Perform an Admin identify for a
+ * controller list.
+ * @ctrl: Controller to process identify command
+ * @cntid: Controller ID to specify list start
+ * @list: List data to populate
+ *
+ * Perform an Identify command, for the controller list starting with
+ * IDs greater than or equal to @cntid.
+ *
+ * Will return an error if the length of the response data (from the
+ * controller) is not a full &NVME_IDENTIFY_DATA_SIZE, so @id will be
+ * fully populated on success.
+ *
+ * Return: 0 on success, non-zero on failure
+ *
+ * See: &struct nvme_ctrl_list
+ */
+static inline int nvme_mi_admin_identify_ctrl_list(nvme_mi_ctrl_t ctrl,
+ __u16 cntid,
+ struct nvme_ctrl_list *list)
+{
+ struct nvme_identify_args args = {
+ .result = NULL,
+ .data = list,
+ .args_size = sizeof(args),
+ .cns = NVME_IDENTIFY_CNS_CTRL_LIST,
+ .csi = NVME_CSI_NVM,
+ .nsid = NVME_NSID_NONE,
+ .cntid = cntid,
+ .cns_specific_id = NVME_CNSSPECID_NONE,
+ .uuidx = NVME_UUID_NONE,
+ };
+
+ return nvme_mi_admin_identify(ctrl, &args);
+}
+
+/**
+ * nvme_mi_admin_get_log_page() - Retrieve log page data from controller
+ * @ctrl: Controller to query
+ * @args: Get Log Page command arguments
+ *
+ * Performs a Get Log Page Admin command as specified by @args. Response data
+ * is stored in @args->data, which should be a buffer of @args->data_len bytes.
+ * Resulting data length is stored in @args->data_len on successful
+ * command completion.
+ *
+ * This request may be implemented as multiple log page commands, in order
+ * to fit within MI message-size limits.
+ *
+ * Return: 0 on success, non-zero on failure
+ *
+ * See: &struct nvme_get_log_args
+ */
+int nvme_mi_admin_get_log_page(nvme_mi_ctrl_t ctrl,
+ struct nvme_get_log_args *args);
+
+/**
+ * nvme_mi_admin_security_send() - Perform a Security Send command on a
+ * controller.
+ * @ctrl: Controller to send command to
+ * @args: Security Send command arguments
+ *
+ * Performs a Security Send Admin command as specified by @args. Response data
+ * is stored in @args->data, which should be a buffer of @args->data_len bytes.
+ * Resulting data length is stored in @args->data_len on successful
+ * command completion.
+ *
+ * Security Send data length should not be greater than 4096 bytes to
+ * comply with specification limits.
+ *
+ * Return: 0 on success, non-zero on failure
+ *
+ * See: &struct nvme_get_log_args
+ */
+int nvme_mi_admin_security_send(nvme_mi_ctrl_t ctrl,
+ struct nvme_security_send_args *args);
+
+/**
+ * nvme_mi_admin_security_recv() - Perform a Security Receive command on a
+ * controller.
+ * @ctrl: Controller to send command to
+ * @args: Security Receive command arguments
+ *
+ * Performs a Security Receive Admin command as specified by @args. Response
+ * data is stored in @args->data, which should be a buffer of @args->data_len
+ * bytes. Resulting data length is stored in @args->data_len on successful
+ * command completion.
+ *
+ * Security Receive data length should not be greater than 4096 bytes to
+ * comply with specification limits.
+ *
+ * Return: 0 on success, non-zero on failure
+ *
+ * See: &struct nvme_get_log_args
+ */
+int nvme_mi_admin_security_recv(nvme_mi_ctrl_t ctrl,
+ struct nvme_security_receive_args *args);
+
+
+#endif /* _LIBNVME_MI_MI_H */
diff --git a/src/nvme/private.h b/src/nvme/private.h
index bea1ae9..da699ba 100644
--- a/src/nvme/private.h
+++ b/src/nvme/private.h
@@ -10,10 +10,12 @@
#define _LIBNVME_PRIVATE_H
#include <ccan/list/list.h>
+#include <sys/socket.h>
#include "fabrics.h"
+#include "mi.h"
-#include <uuid/uuid.h>
+#include <uuid.h>
extern const char *nvme_ctrl_sysfs_dir;
@@ -117,6 +119,7 @@ struct nvme_host {
struct nvme_root {
char *config_file;
struct list_head hosts;
+ struct list_head endpoints; /* MI endpoints */
FILE *fp;
int log_level;
bool log_pid;
@@ -132,6 +135,11 @@ int json_update_config(nvme_root_t r, const char *config_file);
int json_dump_tree(nvme_root_t r);
+nvme_ctrl_t __nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport,
+ const char *traddr, const char *host_traddr,
+ const char *host_iface, const char *trsvcid,
+ nvme_ctrl_t p);
+
#if (LOG_FUNCNAME == 1)
#define __nvme_log_func __func__
#else
@@ -148,4 +156,65 @@ __nvme_msg(nvme_root_t r, int lvl, const char *func, const char *format, ...);
format, ##__VA_ARGS__); \
} while (0)
+/* mi internal headers */
+
+/* internal transport API */
+struct nvme_mi_req {
+ struct nvme_mi_msg_hdr *hdr;
+ size_t hdr_len;
+ void *data;
+ size_t data_len;
+ __u32 mic;
+};
+
+struct nvme_mi_resp {
+ struct nvme_mi_msg_hdr *hdr;
+ size_t hdr_len;
+ void *data;
+ size_t data_len;
+ __u32 mic;
+};
+
+struct nvme_mi_transport {
+ const char *name;
+ bool mic_enabled;
+ int (*submit)(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp);
+ void (*close)(struct nvme_mi_ep *ep);
+ int (*desc_ep)(struct nvme_mi_ep *ep, char *buf, size_t len);
+};
+
+struct nvme_mi_ep {
+ struct nvme_root *root;
+ const struct nvme_mi_transport *transport;
+ void *transport_data;
+ struct list_node root_entry;
+ struct list_head controllers;
+ bool controllers_scanned;
+};
+
+struct nvme_mi_ctrl {
+ struct nvme_mi_ep *ep;
+ __u16 id;
+ struct list_node ep_entry;
+};
+
+struct nvme_mi_ep *nvme_mi_init_ep(struct nvme_root *root);
+
+/* for tests, we need to calculate the correct MICs */
+__u32 nvme_mi_crc32_update(__u32 crc, void *data, size_t len);
+
+/* we have a facility to mock MCTP socket operations in the mi-mctp transport,
+ * using this ops type. This should only be used for test, and isn't exposed
+ * in the shared lib */;
+struct mctp_ioc_tag_ctl;
+struct __mi_mctp_socket_ops {
+ int (*socket)(int, int, int);
+ ssize_t (*sendmsg)(int, const struct msghdr *, int);
+ ssize_t (*recvmsg)(int, struct msghdr *, int);
+ int (*ioctl_tag)(int, unsigned long, struct mctp_ioc_tag_ctl *);
+};
+void __nvme_mi_mctp_set_ops(const struct __mi_mctp_socket_ops *newops);
+
#endif /* _LIBNVME_PRIVATE_H */
diff --git a/src/nvme/tree.c b/src/nvme/tree.c
index a2cfa6a..9161791 100644
--- a/src/nvme/tree.c
+++ b/src/nvme/tree.c
@@ -141,6 +141,7 @@ nvme_root_t nvme_create_root(FILE *fp, int log_level)
if (fp)
r->fp = fp;
list_head_init(&r->hosts);
+ list_head_init(&r->endpoints);
return r;
}
@@ -414,7 +415,8 @@ struct nvme_subsystem *nvme_lookup_subsystem(struct nvme_host *h,
struct nvme_subsystem *s;
nvme_for_each_subsystem(h, s) {
- if (strcmp(s->subsysnqn, subsysnqn))
+ if (subsysnqn && s->subsysnqn &&
+ strcmp(s->subsysnqn, subsysnqn))
continue;
if (name && s->name &&
strcmp(s->name, name))
@@ -578,6 +580,7 @@ static int nvme_scan_subsystem(struct nvme_root *r, const char *name,
nvme_msg(r, LOG_WARNING, "NQN mismatch for subsystem '%s'\n",
name);
s = NULL;
+ free(subsysnqn);
errno = EINVAL;
return -1;
}
@@ -957,6 +960,8 @@ static bool traddr_is_hostname(const char *transport, const char *traddr)
if (!traddr || !transport)
return false;
+ if (!strcmp(traddr, "none"))
+ return false;
if (strcmp(transport, "tcp") &&
strcmp(transport, "rdma"))
return false;
@@ -1018,17 +1023,14 @@ struct nvme_ctrl *nvme_create_ctrl(nvme_root_t r,
return c;
}
-nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport,
- const char *traddr, const char *host_traddr,
- const char *host_iface, const char *trsvcid,
- nvme_ctrl_t p)
+nvme_ctrl_t __nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport,
+ const char *traddr, const char *host_traddr,
+ const char *host_iface, const char *trsvcid,
+ nvme_ctrl_t p)
+
{
- nvme_root_t r;
struct nvme_ctrl *c;
- if (!s || !transport)
- return NULL;
- r = s->h ? s->h->r : NULL;
c = p ? nvme_subsystem_next_ctrl(s, p) : nvme_subsystem_first_ctrl(s);
for (; c != NULL; c = nvme_subsystem_next_ctrl(s, c)) {
if (strcmp(c->transport, transport))
@@ -1047,6 +1049,27 @@ nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport,
continue;
return c;
}
+
+ return NULL;
+}
+
+nvme_ctrl_t nvme_lookup_ctrl(nvme_subsystem_t s, const char *transport,
+ const char *traddr, const char *host_traddr,
+ const char *host_iface, const char *trsvcid,
+ nvme_ctrl_t p)
+{
+ nvme_root_t r;
+ struct nvme_ctrl *c;
+
+ if (!s || !transport)
+ return NULL;
+
+ c = __nvme_lookup_ctrl(s, transport, traddr, host_traddr,
+ host_iface, trsvcid, p);
+ if (c)
+ return c;
+
+ r = s->h ? s->h->r : NULL;
c = nvme_create_ctrl(r, s->subsysnqn, transport, traddr,
host_traddr, host_iface, trsvcid);
if (c) {
@@ -1092,20 +1115,26 @@ static char *nvme_ctrl_lookup_subsystem_name(nvme_root_t r,
struct dirent **subsys;
char *subsys_name = NULL;
int ret, i;
- char path[PATH_MAX];
ret = nvme_scan_subsystems(&subsys);
if (ret < 0)
return NULL;
for (i = 0; i < ret; i++) {
struct stat st;
+ char *path;
- sprintf(path, "%s/%s/%s", nvme_subsys_sysfs_dir,
- subsys[i]->d_name, ctrl_name);
+ if (asprintf(&path, "%s/%s/%s", nvme_subsys_sysfs_dir,
+ subsys[i]->d_name, ctrl_name) < 0) {
+ errno = ENOMEM;
+ return NULL;
+ }
nvme_msg(r, LOG_DEBUG, "lookup subsystem %s\n", path);
- if (stat(path, &st) < 0)
+ if (stat(path, &st) < 0) {
+ free(path);
continue;
+ }
subsys_name = strdup(subsys[i]->d_name);
+ free(path);
break;
}
nvme_free_dirents(subsys, ret);
@@ -1293,12 +1322,10 @@ skip_address:
free(transport);
if (address)
free(address);
- if (!c) {
- if (!p) {
- nvme_msg(r, LOG_ERR, "failed to lookup ctrl\n");
- errno = ENODEV;
- } else
- errno = ENOMEM;
+ if (!c && !p) {
+ nvme_msg(r, LOG_ERR, "failed to lookup ctrl\n");
+ errno = ENODEV;
+ free(addr);
return NULL;
}
c->address = addr;
@@ -1360,6 +1387,7 @@ nvme_ctrl_t nvme_scan_ctrl(nvme_root_t r, const char *name)
nvme_msg(r, LOG_ERR,
"failed to lookup subsystem for controller %s\n",
name);
+ free(subsysnqn);
free(path);
errno = ENXIO;
return NULL;
@@ -1815,7 +1843,7 @@ nvme_ns_t nvme_scan_namespace(const char *name)
static int nvme_ctrl_scan_namespace(nvme_root_t r, struct nvme_ctrl *c,
char *name)
{
- struct nvme_ns *n;
+ struct nvme_ns *n, *_n, *__n;
nvme_msg(r, LOG_DEBUG, "scan controller %s namespace %s\n",
c->name, name);
@@ -1829,7 +1857,11 @@ static int nvme_ctrl_scan_namespace(nvme_root_t r, struct nvme_ctrl *c,
nvme_msg(r, LOG_DEBUG, "failed to scan namespace %s\n", name);
return -1;
}
-
+ nvme_ctrl_for_each_ns_safe(c, _n, __n) {
+ if (strcmp(n->name, _n->name))
+ continue;
+ __nvme_free_ns(_n);
+ }
n->s = c->s;
n->c = c;
list_add(&c->namespaces, &n->entry);
@@ -1865,7 +1897,7 @@ static void nvme_subsystem_set_ns_path(nvme_subsystem_t s, nvme_ns_t n)
static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
char *name, nvme_scan_filter_t f, void *f_args)
{
- struct nvme_ns *n;
+ struct nvme_ns *n, *_n, *__n;
nvme_msg(r, LOG_DEBUG, "scan subsystem %s namespace %s\n",
s->name, name);
@@ -1879,6 +1911,19 @@ static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
__nvme_free_ns(n);
return 0;
}
+ nvme_subsystem_for_each_ns_safe(s, _n, __n) {
+ struct nvme_path *p, *_p;
+
+ if (strcmp(n->name, _n->name))
+ continue;
+ /* Detach paths */
+ nvme_namespace_for_each_path_safe(_n, p, _p) {
+ list_del_init(&p->nentry);
+ p->n = NULL;
+ }
+ list_head_init(&_n->paths);
+ __nvme_free_ns(_n);
+ }
n->s = s;
list_add(&s->namespaces, &n->entry);
nvme_subsystem_set_ns_path(s, n);
@@ -1888,22 +1933,11 @@ static int nvme_subsystem_scan_namespace(nvme_root_t r, nvme_subsystem_t s,
struct nvme_ns *nvme_subsystem_lookup_namespace(struct nvme_subsystem *s,
__u32 nsid)
{
- nvme_root_t r = s->h ? s->h->r : NULL;
struct nvme_ns *n;
- char *name;
- int ret;
- ret = asprintf(&name, "%sn%u", s->name, nsid);
- if (ret < 0)
- return NULL;
- n = __nvme_scan_namespace(s->sysfs_dir, name);
- free(name);
- if (!n) {
- nvme_msg(r, LOG_DEBUG, "failed to scan namespace %d\n", nsid);
- return NULL;
+ nvme_subsystem_for_each_ns(s, n) {
+ if (nvme_ns_get_nsid(n) == nsid)
+ return n;
}
-
- n->s = s;
- list_add(&s->namespaces, &n->entry);
- return n;
+ return NULL;
}
diff --git a/src/nvme/tree.h b/src/nvme/tree.h
index 9f7a621..3a103c0 100644
--- a/src/nvme/tree.h
+++ b/src/nvme/tree.h
@@ -15,7 +15,7 @@
#include <stddef.h>
#include <sys/types.h>
-#include <uuid/uuid.h>
+#include <uuid.h>
#include "ioctl.h"
#include "util.h"
@@ -142,9 +142,9 @@ nvme_subsystem_t nvme_next_subsystem(nvme_host_t h, nvme_subsystem_t s);
* @subsysnqn: Subsystem NQN
*
* Lookup a &nvme_subsystem_t object in @h base on @name (if present)
- * and @subsystemnqn or create one if not found.
+ * and @subsysnqn or create one if not found.
*
- * Return: nvme_subsystme_t object
+ * Return: nvme_subsystem_t object
*/
nvme_subsystem_t nvme_lookup_subsystem(struct nvme_host *h,
const char *name,
@@ -232,7 +232,7 @@ nvme_path_t nvme_namespace_first_path(nvme_ns_t ns);
*
* Return: Next &nvme_path_t object of an @ns iterator
*/
-nvme_path_t nvme_namespace_next_path(nvme_ns_t c, nvme_path_t p);
+nvme_path_t nvme_namespace_next_path(nvme_ns_t ns, nvme_path_t p);
/**
* nvme_lookup_ctrl() - Lookup nvme_ctrl_t object
@@ -304,7 +304,7 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n);
#define nvme_for_each_host_safe(r, h, _h) \
for (h = nvme_first_host(r), \
_h = nvme_next_host(r, h); \
- h != NULL; \
+ h != NULL; \
h = _h, _h = nvme_next_host(r, h))
/**
@@ -324,8 +324,8 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n);
*/
#define nvme_for_each_subsystem_safe(h, s, _s) \
for (s = nvme_first_subsystem(h), \
- _s = nvme_next_subsystem(h, s); \
- s != NULL; \
+ _s = nvme_next_subsystem(h, s); \
+ s != NULL; \
s = _s, _s = nvme_next_subsystem(h, s))
/**
@@ -345,8 +345,8 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n);
*/
#define nvme_subsystem_for_each_ctrl_safe(s, c, _c) \
for (c = nvme_subsystem_first_ctrl(s), \
- _c = nvme_subsystem_next_ctrl(s, c); \
- c != NULL; \
+ _c = nvme_subsystem_next_ctrl(s, c); \
+ c != NULL; \
c = _c, _c = nvme_subsystem_next_ctrl(s, c))
/**
@@ -366,8 +366,8 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n);
*/
#define nvme_ctrl_for_each_ns_safe(c, n, _n) \
for (n = nvme_ctrl_first_ns(c), \
- _n = nvme_ctrl_next_ns(c, n); \
- n != NULL; \
+ _n = nvme_ctrl_next_ns(c, n); \
+ n != NULL; \
n = _n, _n = nvme_ctrl_next_ns(c, n))
/**
@@ -387,8 +387,8 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n);
*/
#define nvme_ctrl_for_each_path_safe(c, p, _p) \
for (p = nvme_ctrl_first_path(c), \
- _p = nvme_ctrl_next_path(c, p); \
- p != NULL; \
+ _p = nvme_ctrl_next_path(c, p); \
+ p != NULL; \
p = _p, _p = nvme_ctrl_next_path(c, p))
/**
@@ -408,8 +408,8 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n);
*/
#define nvme_subsystem_for_each_ns_safe(s, n, _n) \
for (n = nvme_subsystem_first_ns(s), \
- _n = nvme_subsystem_next_ns(s, n); \
- n != NULL; \
+ _n = nvme_subsystem_next_ns(s, n); \
+ n != NULL; \
n = _n, _n = nvme_subsystem_next_ns(s, n))
/**
@@ -423,27 +423,27 @@ nvme_ns_t nvme_subsystem_next_ns(nvme_subsystem_t s, nvme_ns_t n);
/**
* nvme_namespace_for_each_path_safe() - Traverse paths
- * @ns: Namespace instance
+ * @n: Namespace instance
* @p: &nvme_path_t object
* @_p: A &nvme_path_t_node to use as temporary storage
*/
#define nvme_namespace_for_each_path_safe(n, p, _p) \
for (p = nvme_namespace_first_path(n), \
_p = nvme_namespace_next_path(n, p); \
- p != NULL; \
+ p != NULL; \
p = _p, _p = nvme_namespace_next_path(n, p))
/**
* nvme_namespace_for_each_path() - Traverse paths
- * @ns: Namespace instance
+ * @n: Namespace instance
* @p: &nvme_path_t object
*/
-#define nvme_namespace_for_each_path(c, p) \
- for (p = nvme_namespace_first_path(c); p != NULL; \
- p = nvme_namespace_next_path(c, p))
+#define nvme_namespace_for_each_path(n, p) \
+ for (p = nvme_namespace_first_path(n); p != NULL; \
+ p = nvme_namespace_next_path(n, p))
/**
- * nvme_ns_get_fd() - Get associated filedescriptor
+ * nvme_ns_get_fd() - Get associated file descriptor
* @n: Namespace instance
*
* Return: File descriptor associated with @n or -1
@@ -483,10 +483,10 @@ int nvme_ns_get_meta_size(nvme_ns_t n);
uint64_t nvme_ns_get_lba_count(nvme_ns_t n);
/**
- * nvme_ns_get_lba_util() - LBA utilisation of a namespace
+ * nvme_ns_get_lba_util() - LBA utilization of a namespace
* @n: Namespace instance
*
- * Return: LBA utilisation of @n
+ * Return: LBA utilization of @n
*/
uint64_t nvme_ns_get_lba_util(nvme_ns_t n);
@@ -805,7 +805,7 @@ const char *nvme_ctrl_get_queue_count(nvme_ctrl_t c);
/**
* nvme_ctrl_get_serial() - Serial number of a controller
- * @c: Conroller instance
+ * @c: Controller instance
*
* Return: Serial number string of @c
*/
@@ -1019,7 +1019,7 @@ void nvme_unlink_ctrl(struct nvme_ctrl *c);
* nvme_subsystem_get_nqn() - Retrieve NQN from subsystem
* @s: nvme_subsystem_t object
*
- * Return: NQN of systemstem
+ * Return: NQN of subsystem
*/
const char *nvme_subsystem_get_nqn(nvme_subsystem_t s);
@@ -1150,7 +1150,7 @@ int nvme_dump_tree(nvme_root_t r);
* @attr: sysfs attribute name
*
* Return: String with the contents of @attr or %NULL in case of an empty value
- * or in case of an error (indicated by non-zero errno code).
+ * or in case of an error (indicated by non-zero errno code).
*/
char *nvme_get_attr(const char *d, const char *attr);
@@ -1160,7 +1160,7 @@ char *nvme_get_attr(const char *d, const char *attr);
* @attr: sysfs attribute name
*
* Return: String with the contents of @attr or %NULL in case of an empty value
- * or in case of an error (indicated by non-zero errno code).
+ * or in case of an error (indicated by non-zero errno code).
*/
char *nvme_get_subsys_attr(nvme_subsystem_t s, const char *attr);
@@ -1170,7 +1170,7 @@ char *nvme_get_subsys_attr(nvme_subsystem_t s, const char *attr);
* @attr: sysfs attribute name
*
* Return: String with the contents of @attr or %NULL in case of an empty value
- * or in case of an error (indicated by non-zero errno code).
+ * or in case of an error (indicated by non-zero errno code).
*/
char *nvme_get_ctrl_attr(nvme_ctrl_t c, const char *attr);
@@ -1180,7 +1180,7 @@ char *nvme_get_ctrl_attr(nvme_ctrl_t c, const char *attr);
* @attr: sysfs attribute name
*
* Return: String with the contents of @attr or %NULL in case of an empty value
- * or in case of an error (indicated by non-zero errno code).
+ * or in case of an error (indicated by non-zero errno code).
*/
char *nvme_get_ns_attr(nvme_ns_t n, const char *attr);
@@ -1200,7 +1200,7 @@ nvme_ns_t nvme_subsystem_lookup_namespace(struct nvme_subsystem *s,
* @attr: sysfs attribute name
*
* Return: String with the contents of @attr or %NULL in case of an empty value
- * or in case of an error (indicated by non-zero errno code).
+ * or in case of an error (indicated by non-zero errno code).
*/
char *nvme_get_path_attr(nvme_path_t p, const char *attr);
diff --git a/src/nvme/types.h b/src/nvme/types.h
index 84acb01..3d67bc8 100644
--- a/src/nvme/types.h
+++ b/src/nvme/types.h
@@ -4,7 +4,7 @@
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
*
* Authors: Keith Busch <keith.busch@wdc.com>
- * Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+ * Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
*/
#ifndef _LIBNVME_TYPES_H
@@ -48,28 +48,28 @@
/**
* enum nvme_constants - A place to stash various constant nvme values
* @NVME_NSID_ALL: A broadcast value that is used to specify all
- * namespaces
+ * namespaces
* @NVME_NSID_NONE: The invalid namespace id, for when the nsid
- * parameter is not used in a command
+ * parameter is not used in a command
* @NVME_UUID_NONE: Use to omit a uuid command parameter
* @NVME_CNTLID_NONE: Use to omit a cntlid command parameter
- * @NVME_CNSSPECID_NONE: Use to omit a cns_specific_id command parameter
+ * @NVME_CNSSPECID_NONE: Use to omit a cns_specific_id command parameter
* @NVME_LOG_LSP_NONE: Use to omit a log lsp command parameter
* @NVME_LOG_LSI_NONE: Use to omit a log lsi command parameter
* @NVME_LOG_LPO_NONE: Use to omit a log lpo command parameter
* @NVME_IDENTIFY_DATA_SIZE: The transfer size for nvme identify commands
- * @NVME_LOG_SUPPORTED_LOG_PAGES_MAX: The lagest possible index in the supported
+ * @NVME_LOG_SUPPORTED_LOG_PAGES_MAX: The largest possible index in the supported
* log pages log.
* @NVME_ID_NVMSET_LIST_MAX: The largest possible nvmset index in identify
- * nvmeset
+ * nvmeset
* @NVME_ID_UUID_LIST_MAX: The largest possible uuid index in identify
- * uuid list
+ * uuid list
* @NVME_ID_CTRL_LIST_MAX: The largest possible controller index in
- * identify controller list
+ * identify controller list
* @NVME_ID_NS_LIST_MAX: The largest possible namespace index in
- * identify namespace list
+ * identify namespace list
* @NVME_ID_SECONDARY_CTRL_MAX: The largest possible secondary controller index
- * in identify secondary controller
+ * in identify secondary controller
* @NVME_ID_DOMAIN_LIST_MAX: The largest possible domain index in the
* in domain list
* @NVME_ID_ENDURANCE_GROUP_LIST_MAX: The largest possible endurance group
@@ -78,10 +78,10 @@
* index in the namespace granularity descriptor
* list
* @NVME_FEAT_LBA_RANGE_MAX: The largest possible LBA range index in feature
- * lba range type
+ * lba range type
* @NVME_LOG_ST_MAX_RESULTS: The largest possible self test result index in the
- * device self test log
- * @NVME_LOG_FID_SUPPORTED_EFFECTS_MAX: The largest possible FID index in the
+ * device self test log
+ * @NVME_LOG_FID_SUPPORTED_EFFECTS_MAX: The largest possible FID index in the
* feature identifiers effects log.
* @NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX: The largest possible MI Command index
* in the MI Command effects log.
@@ -89,7 +89,7 @@
* effects log.
* @NVME_LOG_TELEM_BLOCK_SIZE: Specification defined size of Telemetry Data Blocks
* @NVME_DSM_MAX_RANGES: The largest possible range index in a data-set
- * management command
+ * management command
* @NVME_NQN_LENGTH: Max length for NVMe Qualified Name
* @NVMF_TRADDR_SIZE: Max Transport Address size
* @NVMF_TSAS_SIZE: Max Transport Specific Address Subtype size
@@ -142,8 +142,8 @@ enum nvme_csi {
/**
* enum nvme_register_offsets - controller registers for all transports. This
- * is the layout of BAR0/1 for PCIe, and
- * properties for fabrics.
+ * is the layout of BAR0/1 for PCIe, and
+ * properties for fabrics.
* @NVME_REG_CAP: Controller Capabilities
* @NVME_REG_VS: Version
* @NVME_REG_INTMS: Interrupt Mask Set
@@ -161,6 +161,7 @@ enum nvme_csi {
* @NVME_REG_BPMBL: Boot Partition Memory Buffer Location
* @NVME_REG_CMBMSC: Controller Memory Buffer Memory Space Control
* @NVME_REG_CMBSTS: Controller Memory Buffer Status
+ * @NVME_REG_CRTO: Controller Ready Timeouts
* @NVME_REG_PMRCAP: Persistent Memory Capabilities
* @NVME_REG_PMRCTL: Persistent Memory Region Control
* @NVME_REG_PMRSTS: Persistent Memory Region Status
@@ -180,25 +181,26 @@ enum nvme_register_offsets {
NVME_REG_AQA = 0x0024,
NVME_REG_ASQ = 0x0028,
NVME_REG_ACQ = 0x0030,
- NVME_REG_CMBLOC = 0x0038,
+ NVME_REG_CMBLOC = 0x0038,
NVME_REG_CMBSZ = 0x003c,
NVME_REG_BPINFO = 0x0040,
NVME_REG_BPRSEL = 0x0044,
NVME_REG_BPMBL = 0x0048,
NVME_REG_CMBMSC = 0x0050,
NVME_REG_CMBSTS = 0x0058,
- NVME_REG_PMRCAP = 0x0e00,
- NVME_REG_PMRCTL = 0x0e04,
- NVME_REG_PMRSTS = 0x0e08,
- NVME_REG_PMREBS = 0x0e0c,
+ NVME_REG_CRTO = 0x0068,
+ NVME_REG_PMRCAP = 0x0e00,
+ NVME_REG_PMRCTL = 0x0e04,
+ NVME_REG_PMRSTS = 0x0e08,
+ NVME_REG_PMREBS = 0x0e0c,
NVME_REG_PMRSWTP = 0x0e10,
- NVME_REG_PMRMSCL = 0x0e14,
- NVME_REG_PMRMSCU = 0x0e18,
+ NVME_REG_PMRMSCL = 0x0e14,
+ NVME_REG_PMRMSCU = 0x0e18,
};
/**
* nvme_is_64bit_reg() - Checks if offset of the controller register is a know
- * 64bit value.
+ * 64bit value.
* @offset: Offset of controller register field in bytes
*
* This function does not care about transport so that the offset is not going
@@ -206,7 +208,7 @@ enum nvme_register_offsets {
* specific transport. For example, BPMBL(Boot Partition Memory Buffer
* Location) register is not supported by fabrics, but it can be checked here.
*
- * Returns true if given offset is 64bit register, otherwise it returns false.
+ * Returns: true if given offset is 64bit register, otherwise it returns false.
*/
static inline bool nvme_is_64bit_reg(__u32 offset)
{
@@ -235,6 +237,7 @@ enum nvme_cap {
NVME_CAP_MPSMAX_SHIFT = 52,
NVME_CAP_PMRS_SHIFT = 56,
NVME_CAP_CMBS_SHIFT = 57,
+ NVME_CAP_CRMS_SHIFT = 59,
NVME_CAP_MQES_MASK = 0xffff,
NVME_CAP_CQR_MASK = 0x1,
NVME_CAP_AMS_MASK = 0x3,
@@ -247,11 +250,14 @@ enum nvme_cap {
NVME_CAP_MPSMAX_MASK = 0xf,
NVME_CAP_PMRS_MASK = 0x1,
NVME_CAP_CMBS_MASK = 0x1,
+ NVME_CAP_CRMS_MASK = 0x3,
NVME_CAP_AMS_WRR = 1 << 0,
NVME_CAP_AMS_VS = 1 << 1,
NVME_CAP_CSS_NVM = 1 << 0,
NVME_CAP_CSS_CSI = 1 << 6,
NVME_CAP_CSS_ADMIN = 1 << 7,
+ NVME_CAP_CRWMS = 1 << 0,
+ NVME_CAP_CRIMS = 1 << 1,
};
#define NVME_CAP_MQES(cap) NVME_GET(cap, CAP_MQES)
@@ -264,8 +270,9 @@ enum nvme_cap {
#define NVME_CAP_BPS(cap) NVME_GET(cap, CAP_BPS)
#define NVME_CAP_MPSMIN(cap) NVME_GET(cap, CAP_MPSMIN)
#define NVME_CAP_MPSMAX(cap) NVME_GET(cap, CAP_MPSMAX)
-#define NVME_CAP_CMBS(cap) NVME_GET(cap, CAP_CMBS)
#define NVME_CAP_PMRS(cap) NVME_GET(cap, CAP_PMRS)
+#define NVME_CAP_CMBS(cap) NVME_GET(cap, CAP_CMBS)
+#define NVME_CAP_CRMS(cap) NVME_GET(cap, CAP_CRMS)
enum nvme_vs {
NVME_VS_TER_SHIFT = 0,
@@ -292,15 +299,17 @@ enum nvme_cc {
NVME_CC_SHN_SHIFT = 14,
NVME_CC_IOSQES_SHIFT = 16,
NVME_CC_IOCQES_SHIFT = 20,
+ NVME_CC_CRIME_SHIFT = 24,
NVME_CC_EN_MASK = 0x1,
NVME_CC_CSS_MASK = 0x7,
NVME_CC_MPS_MASK = 0xf,
NVME_CC_AMS_MASK = 0x7,
NVME_CC_SHN_MASK = 0x3,
+ NVME_CC_CRIME_MASK = 0x1,
NVME_CC_IOSQES_MASK = 0xf,
NVME_CC_IOCQES_MASK = 0xf,
NVME_CC_CSS_NVM = 0,
- NVME_CC_CSS_CSI = 6,
+ NVME_CC_CSS_CSI = 6,
NVME_CC_CSS_ADMIN = 7,
NVME_CC_AMS_RR = 0,
NVME_CC_AMS_WRRU = 1,
@@ -308,6 +317,8 @@ enum nvme_cc {
NVME_CC_SHN_NONE = 0,
NVME_CC_SHN_NORMAL = 1,
NVME_CC_SHN_ABRUPT = 2,
+ NVME_CC_CRWME = 0,
+ NVME_CC_CRIME = 1,
};
#define NVME_CC_EN(cc) NVME_GET(cc, CC_EN)
@@ -317,6 +328,7 @@ enum nvme_cc {
#define NVME_CC_SHN(cc) NVME_GET(cc, CC_SHN)
#define NVME_CC_IOSQES(cc) NVME_GET(cc, CC_IOSQES)
#define NVME_CC_IOCQES(cc) NVME_GET(cc, CC_IOCQES)
+#define NVME_CC_CRIME(cc) NVME_GET(cc, CC_CRIME)
enum nvme_csts {
NVME_CSTS_RDY_SHIFT = 0,
@@ -415,7 +427,7 @@ enum nvme_cmbsz {
* nvme_cmb_size() - Calculate size of the controller memory buffer
* @cmbsz: Value from controller register %NVME_REG_CMBSZ
*
- * Returns size of controller memory buffer in bytes
+ * Returns: size of controller memory buffer in bytes
*/
static inline __u64 nvme_cmb_size(__u32 cmbsz)
{
@@ -473,6 +485,16 @@ enum nvme_cmbsts {
#define NVME_CMBSTS_CBAI(cmbsts) NVME_GET(cmbsts, CMBSTS_CBAI)
+enum nvme_crto {
+ NVME_CRTO_CRIMT_SHIFT = 16,
+ NVME_CRTO_CRIMT_MASK = 0xffff0000,
+ NVME_CRTO_CRWMT_SHIFT = 0,
+ NVME_CRTO_CRWMT_MASK = 0x0000ffff,
+};
+
+#define NVME_CRTO_CRIMT(crto) NVME_GET(crto, CRTO_CRIMT)
+#define NVME_CRTO_CRWMT(crto) NVME_GET(crto, CRTO_CRWMT)
+
enum nvme_pmrcap {
NVME_PMRCAP_RDS_SHIFT = 3,
NVME_PMRCAP_WDS_SHIFT = 4,
@@ -542,10 +564,10 @@ enum nvme_pmrebs {
/**
* nvme_pmr_size() - Calculate size of persistent memory region elasticity
- * buffer
+ * buffer
* @pmrebs: Value from controller register %NVME_REG_PMREBS
*
- * Returns size of controller persistent memory buffer in bytes
+ * Returns: size of controller persistent memory buffer in bytes
*/
static inline __u64 nvme_pmr_size(__u32 pmrebs)
{
@@ -571,7 +593,7 @@ enum nvme_pmrswtp {
* nvme_pmr_throughput() - Calculate throughput of persistent memory buffer
* @pmrswtp: Value from controller register %NVME_REG_PMRSWTP
*
- * Returns throughput of controller persistent memory buffer in bytes/second
+ * Returns: throughput of controller persistent memory buffer in bytes/second
*/
static inline __u64 nvme_pmr_throughput(__u32 pmrswtp)
{
@@ -592,15 +614,15 @@ static const __u64 NVME_PMRMSC_CBA_MASK = 0xfffffffffffffull;
/**
* enum nvme_psd_flags - Possible flag values in nvme power state descriptor
* @NVME_PSD_FLAGS_MXPS: Indicates the scale for the Maximum Power
- * field. If this bit is cleared, then the scale of the
- * Maximum Power field is in 0.01 Watts. If this bit is
- * set, then the scale of the Maximum Power field is in
- * 0.0001 Watts.
+ * field. If this bit is cleared, then the scale of the
+ * Maximum Power field is in 0.01 Watts. If this bit is
+ * set, then the scale of the Maximum Power field is in
+ * 0.0001 Watts.
* @NVME_PSD_FLAGS_NOPS: Indicates whether the controller processes I/O
- * commands in this power state. If this bit is cleared,
- * then the controller processes I/O commands in this
- * power state. If this bit is set, then the controller
- * does not process I/O commands in this power state.
+ * commands in this power state. If this bit is cleared,
+ * then the controller processes I/O commands in this
+ * power state. If this bit is set, then the controller
+ * does not process I/O commands in this power state.
*/
enum nvme_psd_flags {
NVME_PSD_FLAGS_MXPS = 1 << 0,
@@ -609,12 +631,14 @@ enum nvme_psd_flags {
/**
* enum nvme_psd_ps - Known values for &struct nvme_psd %ips and %aps. Use with
- * nvme_psd_power_scale() to extract the power scale field
- * to match this enum.
+ * nvme_psd_power_scale() to extract the power scale field
+ * to match this enum.
+ * @NVME_PSD_PS_NOT_REPORTED: Not reported
* @NVME_PSD_PS_100_MICRO_WATT: 0.0001 watt scale
* @NVME_PSD_PS_10_MILLI_WATT: 0.01 watt scale
*/
enum nvme_psd_ps {
+ NVME_PSD_PS_NOT_REPORTED = 0,
NVME_PSD_PS_100_MICRO_WATT = 1,
NVME_PSD_PS_10_MILLI_WATT = 2,
};
@@ -622,6 +646,8 @@ enum nvme_psd_ps {
/**
* nvme_psd_power_scale() - power scale occupies the upper 3 bits
* @ps: power scale value
+ *
+ * Returns: power scale value
*/
static inline unsigned int nvme_psd_power_scale(__u8 ps)
{
@@ -630,15 +656,16 @@ static inline unsigned int nvme_psd_power_scale(__u8 ps)
/**
* enum nvme_psd_workload - Specifies a workload hint in the Power Management
- * Feature (see &struct nvme_psd.apw) to inform the
- * NVM subsystem or indicate the conditions for the
- * active power level.
+ * Feature (see &struct nvme_psd.apw) to inform the
+ * NVM subsystem or indicate the conditions for the
+ * active power level.
+ * @NVME_PSD_WORKLOAD_NP: The workload is unknown or not provided.
* @NVME_PSD_WORKLOAD_1: Extended Idle Period with a Burst of Random Write
- * consists of five minutes of idle followed by
- * thirty-two random write commands of size 1 MiB
- * submitted to a single controller while all other
- * controllers in the NVM subsystem are idle, and then
- * thirty (30) seconds of idle.
+ * consists of five minutes of idle followed by
+ * thirty-two random write commands of size 1 MiB
+ * submitted to a single controller while all other
+ * controllers in the NVM subsystem are idle, and then
+ * thirty (30) seconds of idle.
* @NVME_PSD_WORKLOAD_2: Heavy Sequential Writes consists of 80,000
* sequential write commands of size 128 KiB submitted to
* a single controller while all other controllers in the
@@ -648,50 +675,51 @@ static inline unsigned int nvme_psd_power_scale(__u8 ps)
* times during the workload.
*/
enum nvme_psd_workload {
+ NVME_PSD_WORKLOAD_NP = 0,
NVME_PSD_WORKLOAD_1 = 1,
NVME_PSD_WORKLOAD_2 = 2,
};
/**
- * struct nvme_id_psd -
+ * struct nvme_id_psd - Power Management data structure
* @mp: Maximum Power indicates the sustained maximum power consumed by the
- * NVM subsystem in this power state. The power in Watts is equal to
- * the value in this field multiplied by the scale specified in the Max
- * Power Scale bit (see &enum nvme_psd_flags). A value of 0 indicates
- * Maximum Power is not reported.
+ * NVM subsystem in this power state. The power in Watts is equal to
+ * the value in this field multiplied by the scale specified in the Max
+ * Power Scale bit (see &enum nvme_psd_flags). A value of 0 indicates
+ * Maximum Power is not reported.
* @rsvd2: Reserved
* @flags: Additional decoding flags, see &enum nvme_psd_flags.
* @enlat: Entry Latency indicates the maximum latency in microseconds
- * associated with entering this power state. A value of 0 indicates
- * Entry Latency is not reported.
+ * associated with entering this power state. A value of 0 indicates
+ * Entry Latency is not reported.
* @exlat: Exit Latency indicates the maximum latency in microseconds
- * associated with exiting this power state. A value of 0 indicates
- * Exit Latency is not reported.
+ * associated with exiting this power state. A value of 0 indicates
+ * Exit Latency is not reported.
* @rrt: Relative Read Throughput indicates the read throughput rank
- * associated with this power state relative to others. The value in
- * this is less than the number of supported power states.
- * @rrl: Relative Reade Latency indicates the read latency rank associated
- * with this power state relative to others. The value in this field is
- * less than the number of supported power states.
+ * associated with this power state relative to others. The value in
+ * this is less than the number of supported power states.
+ * @rrl: Relative Read Latency indicates the read latency rank associated
+ * with this power state relative to others. The value in this field is
+ * less than the number of supported power states.
* @rwt: Relative Write Throughput indicates write throughput rank associated
- * with this power state relative to others. The value in this field is
- * less than the number of supported power states
+ * with this power state relative to others. The value in this field is
+ * less than the number of supported power states
* @rwl: Relative Write Latency indicates the write latency rank associated
- * with this power state relative to others. The value in this field is
- * less than the number of supported power states
+ * with this power state relative to others. The value in this field is
+ * less than the number of supported power states
* @idlp: Idle Power indicates the typical power consumed by the NVM
- * subsystem over 30 seconds in this power state when idle.
+ * subsystem over 30 seconds in this power state when idle.
* @ips: Idle Power Scale indicates the scale for &struct nvme_id_psd.idlp,
- * see &enum nvme_psd_ps for decoding this field.
+ * see &enum nvme_psd_ps for decoding this field.
* @rsvd19: Reserved
* @actp: Active Power indicates the largest average power consumed by the
- * NVM subsystem over a 10 second period in this power state with
- * the workload indicated in the Active Power Workload field.
+ * NVM subsystem over a 10 second period in this power state with
+ * the workload indicated in the Active Power Workload field.
* @apws: Bits 7-6: Active Power Scale(APS) indicates the scale for the &struct
- * nvme_id_psd.actp, see &enum nvme_psd_ps for decoding this value.
- * Bits 2-0: Active Power Workload(APW) indicates the workload
- * used to calculate maximum power for this power state.
- * See &enum nvme_psd_workload for decoding this field.
+ * nvme_id_psd.actp, see &enum nvme_psd_ps for decoding this value.
+ * Bits 2-0: Active Power Workload(APW) indicates the workload
+ * used to calculate maximum power for this power state.
+ * See &enum nvme_psd_workload for decoding this field.
* @rsvd23: Reserved
*/
struct nvme_id_psd {
@@ -715,155 +743,155 @@ struct nvme_id_psd {
/**
* struct nvme_id_ctrl - Identify Controller data structure
* @vid: PCI Vendor ID, the company vendor identifier that is assigned by
- * the PCI SIG.
+ * the PCI SIG.
* @ssvid: PCI Subsystem Vendor ID, the company vendor identifier that is
- * assigned by the PCI SIG for the subsystem.
- * @sn: Serial Number in ascii
- * @mn: Model Number in ascii
- * @fr: Firmware Revision in ascii, the currently active firmware
- * revision for the NVM subsystem
+ * assigned by the PCI SIG for the subsystem.
+ * @sn: Serial Number in ASCII
+ * @mn: Model Number in ASCII
+ * @fr: Firmware Revision in ASCII, the currently active firmware
+ * revision for the NVM subsystem
* @rab: Recommended Arbitration Burst, reported as a power of two
* @ieee: IEEE assigned Organization Unique Identifier
* @cmic: Controller Multipath IO and Namespace Sharing Capabilities of
- * the controller and NVM subsystem. See &enum nvme_id_ctrl_cmic.
+ * the controller and NVM subsystem. See &enum nvme_id_ctrl_cmic.
* @mdts: Max Data Transfer Size is the largest data transfer size. The
- * host should not submit a command that exceeds this maximum data
- * transfer size. The value is in units of the minimum memory page
- * size (CAP.MPSMIN) and is reported as a power of two
+ * host should not submit a command that exceeds this maximum data
+ * transfer size. The value is in units of the minimum memory page
+ * size (CAP.MPSMIN) and is reported as a power of two
* @cntlid: Controller ID, the NVM subsystem unique controller identifier
- * associated with the controller.
+ * associated with the controller.
* @ver: Version, this field contains the value reported in the Version
- * register, or property (see &enum nvme_registers %NVME_REG_VS).
+ * register, or property (see &enum nvme_registers %NVME_REG_VS).
* @rtd3r: RTD3 Resume Latency, the expected latency in microseconds to resume
- * from Runtime D3
+ * from Runtime D3
* @rtd3e: RTD3 Exit Latency, the typical latency in microseconds to enter
- * Runtime D3.
+ * Runtime D3.
* @oaes: Optional Async Events Supported, see @enum nvme_id_ctrl_oaes.
* @ctratt: Controller Attributes, see @enum nvme_id_ctrl_ctratt.
* @rrls: Read Recovery Levels. If a bit is set, then the corresponding
- * Read Recovery Level is supported. If a bit is cleared, then the
- * corresponding Read Recovery Level is not supported.
- * @rsvd102: Reserved
+ * Read Recovery Level is supported. If a bit is cleared, then the
+ * corresponding Read Recovery Level is not supported.
+ * @rsvd102: Reserved
* @cntrltype: Controller Type, see &enum nvme_id_ctrl_cntrltype
* @fguid: FRU GUID, a 128-bit value that is globally unique for a given
- * Field Replaceable Unit
- * @crdt1: Controller Retry Delay time in 100 millisecod units if CQE CRD
+ * Field Replaceable Unit
+ * @crdt1: Controller Retry Delay time in 100 millisecond units if CQE CRD
* field is 1
- * @crdt2: Controller Retry Delay time in 100 millisecod units if CQE CRD
- * field is 2
- * @crdt3: Controller Retry Delay time in 100 millisecod units if CQE CRD
- * field is 3
+ * @crdt2: Controller Retry Delay time in 100 millisecond units if CQE CRD
+ * field is 2
+ * @crdt3: Controller Retry Delay time in 100 millisecond units if CQE CRD
+ * field is 3
* @rsvd134: Reserved
* @nvmsr: NVM Subsystem Report, see &enum nvme_id_ctrl_nvmsr
* @vwci: VPD Write Cycle Information, see &enum nvme_id_ctrl_vwci
* @mec: Management Endpoint Capabilities, see &enum nvme_id_ctrl_mec
* @oacs: Optional Admin Command Support,the optional Admin commands and
- * features supported by the controller, see &enum nvme_id_ctrl_oacs.
+ * features supported by the controller, see &enum nvme_id_ctrl_oacs.
* @acl: Abort Command Limit, the maximum number of concurrently
- * executing Abort commands supported by the controller. This is a
- * 0's based value.
+ * executing Abort commands supported by the controller. This is a
+ * 0's based value.
* @aerl: Async Event Request Limit, the maximum number of concurrently
- * outstanding Asynchronous Event Request commands supported by the
- * controller This is a 0's based value.
+ * outstanding Asynchronous Event Request commands supported by the
+ * controller This is a 0's based value.
* @frmw: Firmware Updates indicates capabilities regarding firmware
- * updates. See &enum nvme_id_ctrl_frmw.
+ * updates. See &enum nvme_id_ctrl_frmw.
* @lpa: Log Page Attributes, see &enum nvme_id_ctrl_lpa.
* @elpe: Error Log Page Entries, the maximum number of Error Information
- * log entries that are stored by the controller. This field is a
- * 0's based value.
+ * log entries that are stored by the controller. This field is a
+ * 0's based value.
* @npss: Number of Power States Supported, the number of NVM Express
- * power states supported by the controller, indicating the number
- * of valid entries in &struct nvme_id_ctrl.psd. This is a 0's
- * based value.
+ * power states supported by the controller, indicating the number
+ * of valid entries in &struct nvme_id_ctrl.psd. This is a 0's
+ * based value.
* @avscc: Admin Vendor Specific Command Configuration, see
- * &enum nvme_id_ctrl_avscc.
+ * &enum nvme_id_ctrl_avscc.
* @apsta: Autonomous Power State Transition Attributes, see
- * &enum nvme_id_ctrl_apsta.
+ * &enum nvme_id_ctrl_apsta.
* @wctemp: Warning Composite Temperature Threshold indicates
- * the minimum Composite Temperature field value (see &struct
- * nvme_smart_log.critical_comp_time) that indicates an overheating
- * condition during which controller operation continues.
+ * the minimum Composite Temperature field value (see &struct
+ * nvme_smart_log.critical_comp_time) that indicates an overheating
+ * condition during which controller operation continues.
* @cctemp: Critical Composite Temperature Threshold, field indicates the
- * minimum Composite Temperature field value (see &struct
- * nvme_smart_log.critical_comp_time) that indicates a critical
- * overheating condition.
+ * minimum Composite Temperature field value (see &struct
+ * nvme_smart_log.critical_comp_time) that indicates a critical
+ * overheating condition.
* @mtfa: Maximum Time for Firmware Activation indicates the maximum time
- * the controller temporarily stops processing commands to activate
- * the firmware image, specified in 100 millisecond units. This
- * field is always valid if the controller supports firmware
- * activation without a reset.
+ * the controller temporarily stops processing commands to activate
+ * the firmware image, specified in 100 millisecond units. This
+ * field is always valid if the controller supports firmware
+ * activation without a reset.
* @hmpre: Host Memory Buffer Preferred Size indicates the preferred size
- * that the host is requested to allocate for the Host Memory
- * Buffer feature in 4 KiB units.
+ * that the host is requested to allocate for the Host Memory
+ * Buffer feature in 4 KiB units.
* @hmmin: Host Memory Buffer Minimum Size indicates the minimum size that
- * the host is requested to allocate for the Host Memory Buffer
- * feature in 4 KiB units.
+ * the host is requested to allocate for the Host Memory Buffer
+ * feature in 4 KiB units.
* @tnvmcap: Total NVM Capacity, the total NVM capacity in the NVM subsystem.
- * The value is in bytes.
+ * The value is in bytes.
* @unvmcap: Unallocated NVM Capacity, the unallocated NVM capacity in the
- * NVM subsystem. The value is in bytes.
- * @rpmbs: Replay Protected Memory Block Support, see
- * &enum nvme_id_ctrl_rpmbs.
- * @edstt: Extended Device Self-test Time, if Device Self-test command is
- * supported (see &struct nvme_id_ctrl.oacs, %NVME_CTRL_OACS_SELF_TEST),
- * then this field indicates the nominal amount of time in one
- * minute units that the controller takes to complete an extended
- * device self-test operation when in power state 0.
+ * NVM subsystem. The value is in bytes.
+ * @rpmbs: Replay Protected Memory Block Support, see
+ * &enum nvme_id_ctrl_rpmbs.
+ * @edstt: Extended Device Self-test Time, if Device Self-test command is
+ * supported (see &struct nvme_id_ctrl.oacs, %NVME_CTRL_OACS_SELF_TEST),
+ * then this field indicates the nominal amount of time in one
+ * minute units that the controller takes to complete an extended
+ * device self-test operation when in power state 0.
* @dsto: Device Self-test Options, see &enum nvme_id_ctrl_dsto.
* @fwug: Firmware Update Granularity indicates the granularity and
- * alignment requirement of the firmware image being updated by the
- * Firmware Image Download command. The value is reported in 4 KiB
- * units. A value of 0h indicates no information on granularity is
- * provided. A value of FFh indicates no restriction
+ * alignment requirement of the firmware image being updated by the
+ * Firmware Image Download command. The value is reported in 4 KiB
+ * units. A value of 0h indicates no information on granularity is
+ * provided. A value of FFh indicates no restriction
* @kas: Keep Alive Support indicates the granularity of the Keep Alive
- * Timer in 100 millisecond units.
+ * Timer in 100 millisecond units.
* @hctma: Host Controlled Thermal Management Attributes, see
- * &enum nvme_id_ctrl_hctm.
+ * &enum nvme_id_ctrl_hctm.
* @mntmt: Minimum Thermal Management Temperature indicates the minimum
- * temperature, in degrees Kelvin, that the host may request in the
- * Thermal Management Temperature 1 field and Thermal Management
- * Temperature 2 field of a Set Features command with the Feature
- * Identifier field set to %NVME_FEAT_FID_HCTM.
+ * temperature, in degrees Kelvin, that the host may request in the
+ * Thermal Management Temperature 1 field and Thermal Management
+ * Temperature 2 field of a Set Features command with the Feature
+ * Identifier field set to %NVME_FEAT_FID_HCTM.
* @mxtmt: Maximum Thermal Management Temperature indicates the maximum
- * temperature, in degrees Kelvin, that the host may request in the
- * Thermal Management Temperature 1 field and Thermal Management
- * Temperature 2 field of the Set Features command with the Feature
- * Identifier set to %NVME_FEAT_FID_HCTM.
+ * temperature, in degrees Kelvin, that the host may request in the
+ * Thermal Management Temperature 1 field and Thermal Management
+ * Temperature 2 field of the Set Features command with the Feature
+ * Identifier set to %NVME_FEAT_FID_HCTM.
* @sanicap: Sanitize Capabilities, see &enum nvme_id_ctrl_sanicap
* @hmminds: Host Memory Buffer Minimum Descriptor Entry Size indicates the
- * minimum usable size of a Host Memory Buffer Descriptor Entry in
- * 4 KiB units.
+ * minimum usable size of a Host Memory Buffer Descriptor Entry in
+ * 4 KiB units.
* @hmmaxd: Host Memory Maximum Descriptors Entries indicates the number of
- * usable Host Memory Buffer Descriptor Entries.
+ * usable Host Memory Buffer Descriptor Entries.
* @nsetidmax: NVM Set Identifier Maximum, defines the maximum value of a valid
- * NVM Set Identifier for any controller in the NVM subsystem.
+ * NVM Set Identifier for any controller in the NVM subsystem.
* @endgidmax: Endurance Group Identifier Maximum, defines the maximum value of
- * a valid Endurance Group Identifier for any controller in the NVM
- * subsystem.
+ * a valid Endurance Group Identifier for any controller in the NVM
+ * subsystem.
* @anatt: ANA Transition Time indicates the maximum amount of time, in
- * seconds, for a transition between ANA states or the maximum
- * amount of time, in seconds, that the controller reports the ANA
- * change state.
+ * seconds, for a transition between ANA states or the maximum
+ * amount of time, in seconds, that the controller reports the ANA
+ * change state.
* @anacap: Asymmetric Namespace Access Capabilities, see
- * &enum nvme_id_ctrl_anacap.
+ * &enum nvme_id_ctrl_anacap.
* @anagrpmax: ANA Group Identifier Maximum indicates the maximum value of a
- * valid ANA Group Identifier for any controller in the NVM
- * subsystem.
+ * valid ANA Group Identifier for any controller in the NVM
+ * subsystem.
* @nanagrpid: Number of ANA Group Identifiers indicates the number of ANA
- * groups supported by this controller.
+ * groups supported by this controller.
* @pels: Persistent Event Log Size indicates the maximum reportable size
- * for the Persistent Event Log.
+ * for the Persistent Event Log.
* @domainid: Domain Identifier indicates the identifier of the domain
- * that contains this controller.
+ * that contains this controller.
* @rsvd358: Reserved
* @megcap: Max Endurance Group Capacity indicates the maximum capacity
- * of a single Endurance Group.
+ * of a single Endurance Group.
* @rsvd384: Reserved
* @sqes: Submission Queue Entry Size, see &enum nvme_id_ctrl_sqes.
* @cqes: Completion Queue Entry Size, see &enum nvme_id_ctrl_cqes.
* @maxcmd: Maximum Outstanding Commands indicates the maximum number of
- * commands that the controller processes at one time for a
- * particular queue.
+ * commands that the controller processes at one time for a
+ * particular queue.
* @nn: Number of Namespaces indicates the maximum value of a valid
* nsid for the NVM subsystem. If the MNAN (&struct nvme_id_ctrl.mnan
* field is cleared to 0h, then this field also indicates the
@@ -873,53 +901,53 @@ struct nvme_id_psd {
* @fna: Format NVM Attributes, see &enum nvme_id_ctrl_fna.
* @vwc: Volatile Write Cache, see &enum nvme_id_ctrl_vwc.
* @awun: Atomic Write Unit Normal indicates the size of the write
- * operation guaranteed to be written atomically to the NVM across
- * all namespaces with any supported namespace format during normal
- * operation. This field is specified in logical blocks and is a
- * 0's based value.
+ * operation guaranteed to be written atomically to the NVM across
+ * all namespaces with any supported namespace format during normal
+ * operation. This field is specified in logical blocks and is a
+ * 0's based value.
* @awupf: Atomic Write Unit Power Fail indicates the size of the write
- * operation guaranteed to be written atomically to the NVM across
- * all namespaces with any supported namespace format during a
- * power fail or error condition. This field is specified in
- * logical blocks and is a 0’s based value.
+ * operation guaranteed to be written atomically to the NVM across
+ * all namespaces with any supported namespace format during a
+ * power fail or error condition. This field is specified in
+ * logical blocks and is a 0’s based value.
* @icsvscc: NVM Vendor Specific Command Configuration, see
- * &enum nvme_id_ctrl_nvscc.
+ * &enum nvme_id_ctrl_nvscc.
* @nwpc: Namespace Write Protection Capabilities, see
- * &enum nvme_id_ctrl_nwpc.
+ * &enum nvme_id_ctrl_nwpc.
* @acwu: Atomic Compare & Write Unit indicates the size of the write
- * operation guaranteed to be written atomically to the NVM across
- * all namespaces with any supported namespace format for a Compare
- * and Write fused operation. This field is specified in logical
- * blocks and is a 0’s based value.
+ * operation guaranteed to be written atomically to the NVM across
+ * all namespaces with any supported namespace format for a Compare
+ * and Write fused operation. This field is specified in logical
+ * blocks and is a 0’s based value.
* @ocfs: Optional Copy Formats Supported, each bit n means controller
- * supports Copy Format n.
+ * supports Copy Format n.
* @sgls: SGL Support, see &enum nvme_id_ctrl_sgls
* @mnan: Maximum Number of Allowed Namespaces indicates the maximum
- * number of namespaces supported by the NVM subsystem.
+ * number of namespaces supported by the NVM subsystem.
* @maxdna: Maximum Domain Namespace Attachments indicates the maximum
- * of the sum of the numver of namespaces attached to each I/O
- * controller in the Domain.
+ * of the sum of the number of namespaces attached to each I/O
+ * controller in the Domain.
* @maxcna: Maximum I/O Controller Namespace Attachments indicates the
- * maximum number of namespaces that are allowed to be attached to
- * this I/O controller.
+ * maximum number of namespaces that are allowed to be attached to
+ * this I/O controller.
* @rsvd564: Reserved
* @subnqn: NVM Subsystem NVMe Qualified Name, UTF-8 null terminated string
* @rsvd1024: Reserved
* @ioccsz: I/O Queue Command Capsule Supported Size, defines the maximum
- * I/O command capsule size in 16 byte units.
+ * I/O command capsule size in 16 byte units.
* @iorcsz: I/O Queue Response Capsule Supported Size, defines the maximum
- * I/O response capsule size in 16 byte units.
+ * I/O response capsule size in 16 byte units.
* @icdoff: In Capsule Data Offset, defines the offset where data starts
- * within a capsule. This value is applicable to I/O Queues only.
+ * within a capsule. This value is applicable to I/O Queues only.
* @fcatt: Fabrics Controller Attributes, see &enum nvme_id_ctrl_fcatt.
* @msdbd: Maximum SGL Data Block Descriptors indicates the maximum
- * number of SGL Data Block or Keyed SGL Data Block descriptors
- * that a host is allowed to place in a capsule. A value of 0h
- * indicates no limit.
+ * number of SGL Data Block or Keyed SGL Data Block descriptors
+ * that a host is allowed to place in a capsule. A value of 0h
+ * indicates no limit.
* @ofcs: Optional Fabric Commands Support, see &enum nvme_id_ctrl_ofcs.
* @dctype: Discovery Controller Type (DCTYPE). This field indicates what
- * type of Discovery controller the controller is (see enum
- * nvme_id_ctrl_dctype)
+ * type of Discovery controller the controller is (see enum
+ * nvme_id_ctrl_dctype)
* @rsvd1807: Reserved
* @psd: Power State Descriptors, see &struct nvme_id_psd.
* @vs: Vendor Specific
@@ -1027,24 +1055,24 @@ struct nvme_id_ctrl {
/**
* enum nvme_id_ctrl_cmic - Controller Multipath IO and Namespace Sharing
- * Capabilities of the controller and NVM subsystem.
- * @NVME_CTRL_CMIC_MULTI_PORT: If set, then the NVM subsystem may contain
- * more than one NVM subsystem port, otherwise
- * the NVM subsystem contains only a single
- * NVM subsystem port.
- * @NVME_CTRL_CMIC_MULTI_CTRL: If set, then the NVM subsystem may contain
- * two or more controllers, otherwise the
- * NVM subsystem contains only a single
- * controller. An NVM subsystem that contains
- * multiple controllers may be used by
- * multiple hosts, or may provide multiple
- * paths for a single host.
- * @NVME_CTRL_CMIC_MULTI_SRIOV: If set, then the controller is associated
- * with an SR-IOV Virtual Function, otherwise
- * it is associated with a PCI Function
- * or a Fabrics connection.
+ * Capabilities of the controller and NVM subsystem.
+ * @NVME_CTRL_CMIC_MULTI_PORT: If set, then the NVM subsystem may contain
+ * more than one NVM subsystem port, otherwise
+ * the NVM subsystem contains only a single
+ * NVM subsystem port.
+ * @NVME_CTRL_CMIC_MULTI_CTRL: If set, then the NVM subsystem may contain
+ * two or more controllers, otherwise the
+ * NVM subsystem contains only a single
+ * controller. An NVM subsystem that contains
+ * multiple controllers may be used by
+ * multiple hosts, or may provide multiple
+ * paths for a single host.
+ * @NVME_CTRL_CMIC_MULTI_SRIOV: If set, then the controller is associated
+ * with an SR-IOV Virtual Function, otherwise
+ * it is associated with a PCI Function
+ * or a Fabrics connection.
* @NVME_CTRL_CMIC_MULTI_ANA_REPORTING: If set, then the NVM subsystem supports
- * Asymmetric Namespace Access Reporting.
+ * Asymmetric Namespace Access Reporting.
*/
enum nvme_id_ctrl_cmic {
NVME_CTRL_CMIC_MULTI_PORT = 1 << 0,
@@ -1059,10 +1087,10 @@ enum nvme_id_ctrl_cmic {
* @NVME_CTRL_OAES_FA: Firmware Activation Notices event supported
* @NVME_CTRL_OAES_ANA: ANA Change Notices supported
* @NVME_CTRL_OAES_PLEA: Predictable Latency Event Aggregate Log
- * Change Notices event supported
+ * Change Notices event supported
* @NVME_CTRL_OAES_LBAS: LBA Status Information Notices event supported
* @NVME_CTRL_OAES_EGE: Endurance Group Events Aggregate Log Change
- * Notices event supported
+ * Notices event supported
* @NVME_CTRL_OAES_NS: Normal NVM Subsystem Shutdown event supported
* @NVME_CTRL_OAES_ZD: Zone Descriptor Change Notifications supported
* @NVME_CTRL_OAES_DL: Discover Log Page Change Notifications supported
@@ -1083,19 +1111,19 @@ enum nvme_id_ctrl_oaes {
* enum nvme_id_ctrl_ctratt - Controller attributes
* @NVME_CTRL_CTRATT_128_ID: 128-bit Host Identifier supported
* @NVME_CTRL_CTRATT_NON_OP_PSP: Non-Operational Poser State Permissive Mode
- * supported
+ * supported
* @NVME_CTRL_CTRATT_NVM_SETS: NVM Sets supported
* @NVME_CTRL_CTRATT_READ_RECV_LVLS: Read Recovery Levels supported
* @NVME_CTRL_CTRATT_ENDURANCE_GROUPS: Endurance Groups supported
* @NVME_CTRL_CTRATT_PREDICTABLE_LAT: Predictable Latency Mode supported
* @NVME_CTRL_CTRATT_TBKAS: Traffic Based Keep Alive Support
* @NVME_CTRL_CTRATT_NAMESPACE_GRANULARITY: Namespace Granularity reporting
- * supported
+ * supported
* @NVME_CTRL_CTRATT_SQ_ASSOCIATIONS: SQ Associations supported
* @NVME_CTRL_CTRATT_UUID_LIST: UUID List reporting supported
* @NVME_CTRL_CTRATT_MDS: Multi-Domain Subsystem supported
* @NVME_CTRL_CTRATT_FIXED_CAP: Fixed Capacity Management supported
- * @NVME_CTRL_CTRATT_VARIABLE_CAP: Variable Capacity Managment supported
+ * @NVME_CTRL_CTRATT_VARIABLE_CAP: Variable Capacity Management supported
* @NVME_CTRL_CTRATT_DEL_ENDURANCE_GROUPS: Delete Endurance Groups supported
* @NVME_CTRL_CTRATT_DEL_NVM_SETS: Delete NVM Sets supported
* @NVME_CTRL_CTRATT_ELBAS: Extended LBA Formats supported
@@ -1134,8 +1162,8 @@ enum nvme_id_ctrl_cntrltype {
/**
* enum nvme_id_ctrl_dctype - Discovery Controller types
* @NVME_CTRL_DCTYPE_NOT_REPORTED: Not reported (I/O, Admin, and pre-TP8010)
- * @NVME_CTRL_DCTYPE_DDC: Direct Discovery controller
- * @NVME_CTRL_DCTYPE_CDC: Central Discovery controller
+ * @NVME_CTRL_DCTYPE_DDC: Direct Discovery controller
+ * @NVME_CTRL_DCTYPE_CDC: Central Discovery controller
*/
enum nvme_id_ctrl_dctype {
NVME_CTRL_DCTYPE_NOT_REPORTED = 0,
@@ -1145,10 +1173,10 @@ enum nvme_id_ctrl_dctype {
/**
* enum nvme_id_ctrl_nvmsr - This field reports information associated with the
- * NVM Subsystem, see &struct nvme_id_ctrl.nvmsr.
+ * NVM Subsystem, see &struct nvme_id_ctrl.nvmsr.
* @NVME_CTRL_NVMSR_NVMESD: If set, then the NVM Subsystem is part of an NVMe
- * Storage Device; if cleared, then the NVM Subsystem
- * is not part of an NVMe Storage Device.
+ * Storage Device; if cleared, then the NVM Subsystem
+ * is not part of an NVMe Storage Device.
* @NVME_CTRL_NVMSR_NVMEE: If set’, then the NVM Subsystem is part of an NVMe
* Enclosure; if cleared, then the NVM Subsystem is
* not part of an NVMe Enclosure.
@@ -1160,21 +1188,21 @@ enum nvme_id_ctrl_nvmsr {
/**
* enum nvme_id_ctrl_vwci - This field indicates information about remaining
- * number of times that VPD contents are able to be
- * updated using the VPD Write command, see &struct
- * nvme_id_ctrl.vwci.
+ * number of times that VPD contents are able to be
+ * updated using the VPD Write command, see &struct
+ * nvme_id_ctrl.vwci.
* @NVME_CTRL_VWCI_VWCR: Mask to get value of VPD Write Cycles Remaining. If
- * the VPD Write Cycle Remaining Valid bit is set, then
- * this field contains a value indicating the remaining
- * number of times that VPD contents are able to be
- * updated using the VPD Write command. If this field is
- * set to 7Fh, then the remaining number of times that
- * VPD contents are able to be updated using the VPD
- * Write command is greater than or equal to 7Fh.
+ * the VPD Write Cycle Remaining Valid bit is set, then
+ * this field contains a value indicating the remaining
+ * number of times that VPD contents are able to be
+ * updated using the VPD Write command. If this field is
+ * set to 7Fh, then the remaining number of times that
+ * VPD contents are able to be updated using the VPD
+ * Write command is greater than or equal to 7Fh.
* @NVME_CTRL_VWCI_VWCRV: VPD Write Cycle Remaining Valid. If this bit is set,
- * then the VPD Write Cycle Remaining field is valid. If
- * this bit is cleared, then the VPD Write Cycles
- * Remaining field is invalid and cleared to 0h.
+ * then the VPD Write Cycle Remaining field is valid. If
+ * this bit is cleared, then the VPD Write Cycles
+ * Remaining field is invalid and cleared to 0h.
*/
enum nvme_id_ctrl_vwci {
NVME_CTRL_VWCI_VWCR = 0x7f << 0,
@@ -1182,12 +1210,12 @@ enum nvme_id_ctrl_vwci {
};
/**
- * enum nvme_id_ctrl_mec - Flags indicatings the capabilities of the Management
- * Endpoint in the Controller, &struct nvme_id_ctrl.mec.
+ * enum nvme_id_ctrl_mec - Flags indicating the capabilities of the Management
+ * Endpoint in the Controller, &struct nvme_id_ctrl.mec.
* @NVME_CTRL_MEC_SMBUSME: If set, then the NVM Subsystem contains a Management
- * Endpoint on an SMBus/I2C port.
+ * Endpoint on an SMBus/I2C port.
* @NVME_CTRL_MEC_PCIEME: If set, then the NVM Subsystem contains a Management
- * Endpoint on a PCIe port.
+ * Endpoint on a PCIe port.
*/
enum nvme_id_ctrl_mec {
NVME_CTRL_MEC_SMBUSME = 1 << 0,
@@ -1196,29 +1224,31 @@ enum nvme_id_ctrl_mec {
/**
* enum nvme_id_ctrl_oacs - Flags indicating the optional Admin commands and
- * features supported by the controller, see
- * &struct nvme_id_ctrl.oacs.
+ * features supported by the controller, see
+ * &struct nvme_id_ctrl.oacs.
* @NVME_CTRL_OACS_SECURITY: If set, then the controller supports the
- * Security Send and Security Receive commands.
+ * Security Send and Security Receive commands.
* @NVME_CTRL_OACS_FORMAT: If set then the controller supports the Format
- * NVM command.
+ * NVM command.
* @NVME_CTRL_OACS_FW: If set, then the controller supports the
- * Firmware Commit and Firmware Image Download commands.
+ * Firmware Commit and Firmware Image Download commands.
* @NVME_CTRL_OACS_NS_MGMT: If set, then the controller supports the
- * Namespace Management capability
+ * Namespace Management capability
* @NVME_CTRL_OACS_SELF_TEST: If set, then the controller supports the Device
- * Self-test command.
+ * Self-test command.
* @NVME_CTRL_OACS_DIRECTIVES: If set, then the controller supports Directives
* and the Directive Send and Directive Receive
* commands.
* @NVME_CTRL_OACS_NVME_MI: If set, then the controller supports the NVMe-MI
- * Send and NVMe-MI Receive commands.
+ * Send and NVMe-MI Receive commands.
* @NVME_CTRL_OACS_VIRT_MGMT: If set, then the controller supports the
- * Virtualization Management command.
+ * Virtualization Management command.
* @NVME_CTRL_OACS_DBBUF_CFG: If set, then the controller supports the
- * Doorbell Buffer Config command.
+ * Doorbell Buffer Config command.
* @NVME_CTRL_OACS_LBA_STATUS: If set, then the controller supports the Get LBA
- * Status capability.
+ * Status capability.
+ * @NVME_CTRL_OACS_CMD_FEAT_LD: If set, then the controller supports the command
+ * and feature lockdown capability.
*/
enum nvme_id_ctrl_oacs {
NVME_CTRL_OACS_SECURITY = 1 << 0,
@@ -1231,31 +1261,55 @@ enum nvme_id_ctrl_oacs {
NVME_CTRL_OACS_VIRT_MGMT = 1 << 7,
NVME_CTRL_OACS_DBBUF_CFG = 1 << 8,
NVME_CTRL_OACS_LBA_STATUS = 1 << 9,
+ NVME_CTRL_OACS_CMD_FEAT_LD = 1 << 10,
};
/**
* enum nvme_id_ctrl_frmw - Flags and values indicates capabilities regarding
- * firmware updates from &struct nvme_id_ctrl.frmw.
+ * firmware updates from &struct nvme_id_ctrl.frmw.
* @NVME_CTRL_FRMW_1ST_RO: If set, the first firmware slot is readonly
* @NVME_CTRL_FRMW_NR_SLOTS: Mask to get the value of the number of
- * firmware slots that the controller supports.
+ * firmware slots that the controller supports.
* @NVME_CTRL_FRMW_FW_ACT_NO_RESET: If set, the controller supports firmware
- * activation without a reset.
+ * activation without a reset.
+ * @NVME_CTRL_FRMW_MP_UP_DETECTION: If set, the controller is able to detect
+ * overlapping firmware/boot partition
+ * image update.
*/
enum nvme_id_ctrl_frmw {
NVME_CTRL_FRMW_1ST_RO = 1 << 0,
NVME_CTRL_FRMW_NR_SLOTS = 3 << 1,
NVME_CTRL_FRMW_FW_ACT_NO_RESET = 1 << 4,
+ NVME_CTRL_FRMW_MP_UP_DETECTION = 1 << 5,
};
/**
* enum nvme_id_ctrl_lpa - Flags indicating optional attributes for log pages
- * that are accessed via the Get Log Page command.
- * @NVME_CTRL_LPA_SMART_PER_NS:
- * @NVME_CTRL_LPA_CMD_EFFECTS:
- * @NVME_CTRL_LPA_EXTENDED:
- * @NVME_CTRL_LPA_TELEMETRY:
- * @NVME_CTRL_LPA_PERSETENT_EVENT:
+ * that are accessed via the Get Log Page command.
+ * @NVME_CTRL_LPA_SMART_PER_NS: If set, controller supports SMART/Health log
+ * page on a per namespace basis.
+ * @NVME_CTRL_LPA_CMD_EFFECTS: If Set, the controller supports the commands
+ * supported and effects log page.
+ * @NVME_CTRL_LPA_EXTENDED: If set, the controller supports extended data
+ * for log page command including extended number
+ * of dwords and log page offset fields.
+ * @NVME_CTRL_LPA_TELEMETRY: If set, the controller supports the telemetry
+ * host-initiated and telemetry controller-initiated
+ * log pages and sending telemetry log notices.
+ * @NVME_CTRL_LPA_PERSETENT_EVENT: If set, the controller supports
+ * persistent event log.
+ * @NVME_CTRL_LPA_LI0_LI5_LI12_LI13: If set, the controller supports
+ * - log pages log page.
+ * - returning scope of each command in
+ * commands supported and effects log
+ * page.
+ * - feature identifiers supported and
+ * effects log page.
+ * - NVMe-MI commands supported and
+ * effects log page.
+ * @NVME_CTRL_LPA_DA4_TELEMETRY: If set, the controller supports data
+ * area 4 for telemetry host-initiated and
+ * telemetry.
*/
enum nvme_id_ctrl_lpa {
NVME_CTRL_LPA_SMART_PER_NS = 1 << 0,
@@ -1263,14 +1317,16 @@ enum nvme_id_ctrl_lpa {
NVME_CTRL_LPA_EXTENDED = 1 << 2,
NVME_CTRL_LPA_TELEMETRY = 1 << 3,
NVME_CTRL_LPA_PERSETENT_EVENT = 1 << 4,
+ NVME_CTRL_LPA_LI0_LI5_LI12_LI13 = 1 << 5,
+ NVME_CTRL_LPA_DA4_TELEMETRY = 1 << 6,
};
/**
* enum nvme_id_ctrl_avscc - Flags indicating the configuration settings for
- * Admin Vendor Specific command handling.
+ * Admin Vendor Specific command handling.
* @NVME_CTRL_AVSCC_AVS: If set, all Admin Vendor Specific Commands use the
- * optional vendor specific command format with NDT and
- * NDM fields.
+ * optional vendor specific command format with NDT and
+ * NDM fields.
*/
enum nvme_id_ctrl_avscc {
NVME_CTRL_AVSCC_AVS = 1 << 0,
@@ -1278,9 +1334,9 @@ enum nvme_id_ctrl_avscc {
/**
* enum nvme_id_ctrl_apsta - Flags indicating the attributes of the autonomous
- * power state transition feature.
+ * power state transition feature.
* @NVME_CTRL_APSTA_APST: If set, then the controller supports autonomous power
- * state transitions.
+ * state transitions.
*/
enum nvme_id_ctrl_apsta {
NVME_CTRL_APSTA_APST = 1 << 0,
@@ -1288,11 +1344,11 @@ enum nvme_id_ctrl_apsta {
/**
* enum nvme_id_ctrl_rpmbs - This field indicates if the controller supports
- * one or more Replay Protected Memory Blocks, from
- * &struct nvme_id_ctrl.rpmbs.
+ * one or more Replay Protected Memory Blocks, from
+ * &struct nvme_id_ctrl.rpmbs.
* @NVME_CTRL_RPMBS_NR_UNITS: Mask to get the value of the Number of RPMB Units
* @NVME_CTRL_RPMBS_AUTH_METHOD: Mask to get the value of the Authentication Method
- * @NVME_CTRL_RPMBS_TOTAL_SIZE: Mask to get the value of Total Size
+ * @NVME_CTRL_RPMBS_TOTAL_SIZE: Mask to get the value of Total Size
* @NVME_CTRL_RPMBS_ACCESS_SIZE: Mask to get the value of Access Size
*/
enum nvme_id_ctrl_rpmbs {
@@ -1304,10 +1360,10 @@ enum nvme_id_ctrl_rpmbs {
/**
* enum nvme_id_ctrl_dsto - Flags indicating the optional Device Self-test
- * command or operation behaviors supported by the
- * controller or NVM subsystem.
+ * command or operation behaviors supported by the
+ * controller or NVM subsystem.
* @NVME_CTRL_DSTO_ONE_DST: If set, then the NVM subsystem supports only one
- * device self-test operation in progress at a time.
+ * device self-test operation in progress at a time.
*/
enum nvme_id_ctrl_dsto {
NVME_CTRL_DSTO_ONE_DST = 1 << 0,
@@ -1315,11 +1371,11 @@ enum nvme_id_ctrl_dsto {
/**
* enum nvme_id_ctrl_hctm - Flags indicate the attributes of the host
- * controlled thermal management feature
+ * controlled thermal management feature
* @NVME_CTRL_HCTMA_HCTM: then the controller supports host controlled thermal
- * management, and the Set Features command and Get
- * Features command with the Feature Identifier field
- * set to %NVME_FEAT_FID_HCTM.
+ * management, and the Set Features command and Get
+ * Features command with the Feature Identifier field
+ * set to %NVME_FEAT_FID_HCTM.
*/
enum nvme_id_ctrl_hctm {
NVME_CTRL_HCTMA_HCTM = 1 << 0,
@@ -1328,18 +1384,18 @@ enum nvme_id_ctrl_hctm {
/**
* enum nvme_id_ctrl_sanicap - Indicates attributes for sanitize operations.
* @NVME_CTRL_SANICAP_CES: Crypto Erase Support. If set, then the
- * controller supports the Crypto Erase sanitize operation.
+ * controller supports the Crypto Erase sanitize operation.
* @NVME_CTRL_SANICAP_BES: Block Erase Support. If set, then the controller
- * supports the Block Erase sanitize operation.
+ * supports the Block Erase sanitize operation.
* @NVME_CTRL_SANICAP_OWS: Overwrite Support. If set, then the controller
- * supports the Overwrite sanitize operation.
+ * supports the Overwrite sanitize operation.
* @NVME_CTRL_SANICAP_NDI: No-Deallocate Inhibited. If set and the No-
- * Deallocate Response Mode bit is set, then the
- * controller deallocates after the sanitize
- * operation even if the No-Deallocate After
- * Sanitize bit is set in a Sanitize command.
+ * Deallocate Response Mode bit is set, then the
+ * controller deallocates after the sanitize
+ * operation even if the No-Deallocate After
+ * Sanitize bit is set in a Sanitize command.
* @NVME_CTRL_SANICAP_NODMMAS: No-Deallocate Modifies Media After Sanitize,
- * mask to extract value.
+ * mask to extract value.
*/
enum nvme_id_ctrl_sanicap {
NVME_CTRL_SANICAP_CES = 1 << 0,
@@ -1351,25 +1407,25 @@ enum nvme_id_ctrl_sanicap {
/**
* enum nvme_id_ctrl_anacap - This field indicates the capabilities associated
- * with Asymmetric Namespace Access Reporting.
- * @NVME_CTRL_ANACAP_OPT: If set, then the controller is able to
- * report ANA Optimized state.
- * @NVME_CTRL_ANACAP_NON_OPT: If set, then the controller is able to
- * report ANA Non-Optimized state.
+ * with Asymmetric Namespace Access Reporting.
+ * @NVME_CTRL_ANACAP_OPT: If set, then the controller is able to
+ * report ANA Optimized state.
+ * @NVME_CTRL_ANACAP_NON_OPT: If set, then the controller is able to
+ * report ANA Non-Optimized state.
* @NVME_CTRL_ANACAP_INACCESSIBLE: If set, then the controller is able to
- * report ANA Inaccessible state.
+ * report ANA Inaccessible state.
* @NVME_CTRL_ANACAP_PERSISTENT_LOSS: If set, then the controller is able to
- * report ANA Persistent Loss state.
- * @NVME_CTRL_ANACAP_CHANGE: If set, then the controller is able to
- * report ANA Change state.
+ * report ANA Persistent Loss state.
+ * @NVME_CTRL_ANACAP_CHANGE: If set, then the controller is able to
+ * report ANA Change state.
* @NVME_CTRL_ANACAP_GRPID_NO_CHG: If set, then the ANAGRPID field in the
- * Identify Namespace data structure
- * (&struct nvme_id_ns.anagrpid), does not
- * change while the namespace is attached to
- * any controller.
+ * Identify Namespace data structure
+ * (&struct nvme_id_ns.anagrpid), does not
+ * change while the namespace is attached to
+ * any controller.
* @NVME_CTRL_ANACAP_GRPID_MGMT: If set, then the controller supports a
- * non-zero value in the ANAGRPID field of
- * the Namespace Management command.
+ * non-zero value in the ANAGRPID field of
+ * the Namespace Management command.
*/
enum nvme_id_ctrl_anacap {
NVME_CTRL_ANACAP_OPT = 1 << 0,
@@ -1383,11 +1439,11 @@ enum nvme_id_ctrl_anacap {
/**
* enum nvme_id_ctrl_sqes - Defines the required and maximum Submission Queue
- * entry size when using the NVM Command Set.
+ * entry size when using the NVM Command Set.
* @NVME_CTRL_SQES_MIN: Mask to get the value of the required Submission Queue
- * Entry size when using the NVM Command Set.
+ * Entry size when using the NVM Command Set.
* @NVME_CTRL_SQES_MAX: Mask to get the value of the maximum Submission Queue
- * entry size when using the NVM Command Set.
+ * entry size when using the NVM Command Set.
*/
enum nvme_id_ctrl_sqes {
NVME_CTRL_SQES_MIN = 0xf << 0,
@@ -1396,11 +1452,11 @@ enum nvme_id_ctrl_sqes {
/**
* enum nvme_id_ctrl_cqes - Defines the required and maximum Completion Queue
- * entry size when using the NVM Command Set.
+ * entry size when using the NVM Command Set.
* @NVME_CTRL_CQES_MIN: Mask to get the value of the required Completion Queue
- * Entry size when using the NVM Command Set.
+ * Entry size when using the NVM Command Set.
* @NVME_CTRL_CQES_MAX: Mask to get the value of the maximum Completion Queue
- * entry size when using the NVM Command Set.
+ * entry size when using the NVM Command Set.
*/
enum nvme_id_ctrl_cqes {
NVME_CTRL_CQES_MIN = 0xf << 0,
@@ -1409,26 +1465,28 @@ enum nvme_id_ctrl_cqes {
/**
* enum nvme_id_ctrl_oncs - This field indicates the optional NVM commands and
- * features supported by the controller.
+ * features supported by the controller.
* @NVME_CTRL_ONCS_COMPARE: If set, then the controller supports
- * the Compare command.
+ * the Compare command.
* @NVME_CTRL_ONCS_WRITE_UNCORRECTABLE: If set, then the controller supports
- * the Write Uncorrectable command.
+ * the Write Uncorrectable command.
* @NVME_CTRL_ONCS_DSM: If set, then the controller supports
- * the Dataset Management command.
+ * the Dataset Management command.
* @NVME_CTRL_ONCS_WRITE_ZEROES: If set, then the controller supports
- * the Write Zeroes command.
+ * the Write Zeroes command.
* @NVME_CTRL_ONCS_SAVE_FEATURES: If set, then the controller supports
- * the Save field set to a non-zero value
- * in the Set Features command and the
- * Select field set to a non-zero value in
- * the Get Features command.
+ * the Save field set to a non-zero value
+ * in the Set Features command and the
+ * Select field set to a non-zero value in
+ * the Get Features command.
* @NVME_CTRL_ONCS_RESERVATIONS: If set, then the controller supports
- * reservations.
+ * reservations.
* @NVME_CTRL_ONCS_TIMESTAMP: If set, then the controller supports
- * the Timestamp feature.
+ * the Timestamp feature.
* @NVME_CTRL_ONCS_VERIFY: If set, then the controller supports
- * the Verify command.
+ * the Verify command.
+ * @NVME_CTRL_ONCS_COPY: If set, then the controller supports
+ * the copy command.
*/
enum nvme_id_ctrl_oncs {
NVME_CTRL_ONCS_COMPARE = 1 << 0,
@@ -1439,13 +1497,14 @@ enum nvme_id_ctrl_oncs {
NVME_CTRL_ONCS_RESERVATIONS = 1 << 5,
NVME_CTRL_ONCS_TIMESTAMP = 1 << 6,
NVME_CTRL_ONCS_VERIFY = 1 << 7,
+ NVME_CTRL_ONCS_COPY = 1 << 8,
};
/**
* enum nvme_id_ctrl_fuses - This field indicates the fused operations that the
- * controller supports.
+ * controller supports.
* @NVME_CTRL_FUSES_COMPARE_AND_WRITE: If set, then the controller supports the
- * Compare and Write fused operation.
+ * Compare and Write fused operation.
*/
enum nvme_id_ctrl_fuses {
NVME_CTRL_FUSES_COMPARE_AND_WRITE = 1 << 0,
@@ -1453,39 +1512,44 @@ enum nvme_id_ctrl_fuses {
/**
* enum nvme_id_ctrl_fna - This field indicates attributes for the Format NVM
- * command.
+ * command.
* @NVME_CTRL_FNA_FMT_ALL_NAMESPACES: If set, then all namespaces in an NVM
- * subsystem shall be configured with the
- * same attributes and a format (excluding
- * secure erase) of any namespace results in
- * a format of all namespaces in an NVM
- * subsystem. If cleared, then the
- * controller supports format on a per
- * namespace basis.
+ * subsystem shall be configured with the
+ * same attributes and a format (excluding
+ * secure erase) of any namespace results in
+ * a format of all namespaces in an NVM
+ * subsystem. If cleared, then the
+ * controller supports format on a per
+ * namespace basis.
* @NVME_CTRL_FNA_SEC_ALL_NAMESPACES: If set, then any secure erase performed
- * as part of a format operation results in
- * a secure erase of all namespaces in the
- * NVM subsystem. If cleared, then any
- * secure erase performed as part of a
- * format results in a secure erase of the
- * particular namespace specified.
- * @NVME_CTRL_FNA_CRYPTO_ERASE: If set, then cryptographic erase is
- * supported. If cleared, then cryptographic
- * erase is not supported.
+ * as part of a format operation results in
+ * a secure erase of all namespaces in the
+ * NVM subsystem. If cleared, then any
+ * secure erase performed as part of a
+ * format results in a secure erase of the
+ * particular namespace specified.
+ * @NVME_CTRL_FNA_CRYPTO_ERASE: If set, then cryptographic erase is
+ * supported. If cleared, then cryptographic
+ * erase is not supported.
+ * @NVME_CTRL_FNA_NSID_FFFFFFFF: If set, then format does not support
+ * nsid value set to FFFFFFFFh. If cleared,
+ * format supports nsid value set to
+ * FFFFFFFFh.
*/
enum nvme_id_ctrl_fna {
NVME_CTRL_FNA_FMT_ALL_NAMESPACES = 1 << 0,
NVME_CTRL_FNA_SEC_ALL_NAMESPACES = 1 << 1,
NVME_CTRL_FNA_CRYPTO_ERASE = 1 << 2,
+ NVME_CTRL_FNA_NSID_FFFFFFFF = 1 << 3,
};
/**
- * enum nvme_id_ctrl_vwc -
+ * enum nvme_id_ctrl_vwc - Volatile write cache
* @NVME_CTRL_VWC_PRESENT: If set, indicates a volatile write cache is present.
- * If a volatile write cache is present, then the host
- * controls whether the volatile write cache is enabled
- * with a Set Features command specifying the value
- * %NVME_FEAT_FID_VOLATILE_WC.
+ * If a volatile write cache is present, then the host
+ * controls whether the volatile write cache is enabled
+ * with a Set Features command specifying the value
+ * %NVME_FEAT_FID_VOLATILE_WC.
* @NVME_CTRL_VWC_FLUSH: Mask to get the value of the flush command behavior.
*/
enum nvme_id_ctrl_vwc {
@@ -1495,9 +1559,9 @@ enum nvme_id_ctrl_vwc {
/**
* enum nvme_id_ctrl_nvscc - This field indicates the configuration settings
- * for NVM Vendor Specific command handling.
+ * for NVM Vendor Specific command handling.
* @NVME_CTRL_NVSCC_FMT: If set, all NVM Vendor Specific Commands use the
- * format format with NDT and NDM fields.
+ * format with NDT and NDM fields.
*/
enum nvme_id_ctrl_nvscc {
NVME_CTRL_NVSCC_FMT = 1 << 0,
@@ -1505,22 +1569,22 @@ enum nvme_id_ctrl_nvscc {
/**
* enum nvme_id_ctrl_nwpc - This field indicates the optional namespace write
- * protection capabilities supported by the
- * controller.
+ * protection capabilities supported by the
+ * controller.
* @NVME_CTRL_NWPC_WRITE_PROTECT: If set, then the controller shall
- * support the No Write Protect and
- * Write Protect namespace write
- * protection states and may support
- * the Write Protect Until Power
- * Cycle state and Permanent Write
- * Protect namespace write
- * protection states.
+ * support the No Write Protect and
+ * Write Protect namespace write
+ * protection states and may support
+ * the Write Protect Until Power
+ * Cycle state and Permanent Write
+ * Protect namespace write
+ * protection states.
* @NVME_CTRL_NWPC_WRITE_PROTECT_POWER_CYCLE: If set, then the controller
- * supports the Write Protect Until
- * Power Cycle state.
+ * supports the Write Protect Until
+ * Power Cycle state.
* @NVME_CTRL_NWPC_WRITE_PROTECT_PERMANENT: If set, then the controller
- * supports the Permanent Write
- * Protect state.
+ * supports the Permanent Write
+ * Protect state.
*/
enum nvme_id_ctrl_nwpc {
NVME_CTRL_NWPC_WRITE_PROTECT = 1 << 0,
@@ -1530,7 +1594,7 @@ enum nvme_id_ctrl_nwpc {
/**
* enum nvme_id_ctrl_sgls - This field indicates if SGLs are supported for the
- * NVM Command Set and the particular SGL types supported.
+ * NVM Command Set and the particular SGL types supported.
* @NVME_CTRL_SGLS_SUPPORTED:
* @NVME_CTRL_SGLS_KEYED:
* @NVME_CTRL_SGLS_BIT_BUCKET:
@@ -1553,10 +1617,10 @@ enum nvme_id_ctrl_sgls {
/**
* enum nvme_id_ctrl_fcatt - This field indicates attributes of the controller
- * that are specific to NVMe over Fabrics.
+ * that are specific to NVMe over Fabrics.
* @NVME_CTRL_FCATT_DYNAMIC: If cleared, then the NVM subsystem uses a dynamic
- * controller model. If set, then the NVM subsystem
- * uses a static controller model.
+ * controller model. If set, then the NVM subsystem
+ * uses a static controller model.
*/
enum nvme_id_ctrl_fcatt {
NVME_CTRL_FCATT_DYNAMIC = 1 << 0,
@@ -1564,10 +1628,10 @@ enum nvme_id_ctrl_fcatt {
/**
* enum nvme_id_ctrl_ofcs - Indicate whether the controller supports optional
- * fabric commands.
+ * fabric commands.
* @NVME_CTRL_OFCS_DISCONNECT: If set, then the controller supports the
- * Disconnect command and deletion of individual
- * I/O Queues.
+ * Disconnect command and deletion of individual
+ * I/O Queues.
*/
enum nvme_id_ctrl_ofcs {
NVME_CTRL_OFCS_DISCONNECT = 1 << 0,
@@ -1576,9 +1640,9 @@ enum nvme_id_ctrl_ofcs {
/**
* struct nvme_lbaf - LBA Format Data Structure
* @ms: Metadata Size indicates the number of metadata bytes provided per LBA
- * based on the LBA Data Size indicated.
+ * based on the LBA Data Size indicated.
* @ds: LBA Data Size indicates the LBA data size supported, reported as a
- * power of two.
+ * power of two.
* @rp: Relative Performance, see &enum nvme_lbaf_rp.
*/
struct nvme_lbaf {
@@ -1589,14 +1653,14 @@ struct nvme_lbaf {
/**
* enum nvme_lbaf_rp - This field indicates the relative performance of the LBA
- * format indicated relative to other LBA formats supported
- * by the controller.
+ * format indicated relative to other LBA formats supported
+ * by the controller.
* @NVME_LBAF_RP_BEST: Best performance
* @NVME_LBAF_RP_BETTER: Better performance
* @NVME_LBAF_RP_GOOD: Good performance
* @NVME_LBAF_RP_DEGRADED: Degraded performance
* @NVME_LBAF_RP_MASK: Mask to get the relative performance value from the
- * field
+ * field
*/
enum nvme_lbaf_rp {
NVME_LBAF_RP_BEST = 0,
@@ -1609,97 +1673,97 @@ enum nvme_lbaf_rp {
/**
* struct nvme_id_ns - Identify Namespace data structure
* @nsze: Namespace Size indicates the total size of the namespace in
- * logical blocks. The number of logical blocks is based on the
- * formatted LBA size.
+ * logical blocks. The number of logical blocks is based on the
+ * formatted LBA size.
* @ncap: Namespace Capacity indicates the maximum number of logical blocks
- * that may be allocated in the namespace at any point in time. The
- * number of logical blocks is based on the formatted LBA size.
+ * that may be allocated in the namespace at any point in time. The
+ * number of logical blocks is based on the formatted LBA size.
* @nuse: Namespace Utilization indicates the current number of logical
- * blocks allocated in the namespace. This field is smaller than or
- * equal to the Namespace Capacity. The number of logical blocks is
- * based on the formatted LBA size.
+ * blocks allocated in the namespace. This field is smaller than or
+ * equal to the Namespace Capacity. The number of logical blocks is
+ * based on the formatted LBA size.
* @nsfeat: Namespace Features, see &enum nvme_id_nsfeat.
* @nlbaf: Number of LBA Formats defines the number of supported LBA data
- * size and metadata size combinations supported by the namespace
- * and the highest possible index to &struct nvme_id_ns.lbaf.
+ * size and metadata size combinations supported by the namespace
+ * and the highest possible index to &struct nvme_id_ns.lbaf.
* @flbas: Formatted LBA Size, see &enum nvme_id_ns_flbas.
- * @mc: Metadata Capabilities, see &enum nvme_id_ns_mc.
+ * @mc: Metadata Capabilities, see &enum nvme_id_ns_mc.
* @dpc: End-to-end Data Protection Capabilities, see
- * &enum nvme_id_ns_dpc.
+ * &enum nvme_id_ns_dpc.
* @dps: End-to-end Data Protection Type Settings, see
- * &enum nvme_id_ns_dps.
+ * &enum nvme_id_ns_dps.
* @nmic: Namespace Multi-path I/O and Namespace Sharing Capabilities, see
- * &enum nvme_id_ns_nmic.
+ * &enum nvme_id_ns_nmic.
* @rescap: Reservation Capabilities, see &enum nvme_id_ns_rescap.
* @fpi: Format Progress Indicator, see &enum nvme_nd_ns_fpi.
* @dlfeat: Deallocate Logical Block Features, see &enum nvme_id_ns_dlfeat.
* @nawun: Namespace Atomic Write Unit Normal indicates the
- * namespace specific size of the write operation guaranteed to be
- * written atomically to the NVM during normal operation.
+ * namespace specific size of the write operation guaranteed to be
+ * written atomically to the NVM during normal operation.
* @nawupf: Namespace Atomic Write Unit Power Fail indicates the
- * namespace specific size of the write operation guaranteed to be
- * written atomically to the NVM during a power fail or error
- * condition.
+ * namespace specific size of the write operation guaranteed to be
+ * written atomically to the NVM during a power fail or error
+ * condition.
* @nacwu: Namespace Atomic Compare & Write Unit indicates the namespace
- * specific size of the write operation guaranteed to be written
- * atomically to the NVM for a Compare and Write fused command.
+ * specific size of the write operation guaranteed to be written
+ * atomically to the NVM for a Compare and Write fused command.
* @nabsn: Namespace Atomic Boundary Size Normal indicates the atomic
- * boundary size for this namespace for the NAWUN value. This field
- * is specified in logical blocks.
+ * boundary size for this namespace for the NAWUN value. This field
+ * is specified in logical blocks.
* @nabo: Namespace Atomic Boundary Offset indicates the LBA on this
- * namespace where the first atomic boundary starts.
+ * namespace where the first atomic boundary starts.
* @nabspf: Namespace Atomic Boundary Size Power Fail indicates the atomic
- * boundary size for this namespace specific to the Namespace Atomic
- * Write Unit Power Fail value. This field is specified in logical
- * blocks.
+ * boundary size for this namespace specific to the Namespace Atomic
+ * Write Unit Power Fail value. This field is specified in logical
+ * blocks.
* @noiob: Namespace Optimal I/O Boundary indicates the optimal I/O boundary
- * for this namespace. This field is specified in logical blocks.
- * The host should construct Read and Write commands that do not
- * cross the I/O boundary to achieve optimal performance.
+ * for this namespace. This field is specified in logical blocks.
+ * The host should construct Read and Write commands that do not
+ * cross the I/O boundary to achieve optimal performance.
* @nvmcap: NVM Capacity indicates the total size of the NVM allocated to
- * this namespace. The value is in bytes.
+ * this namespace. The value is in bytes.
* @npwg: Namespace Preferred Write Granularity indicates the smallest
- * recommended write granularity in logical blocks for this
- * namespace. This is a 0's based value.
+ * recommended write granularity in logical blocks for this
+ * namespace. This is a 0's based value.
* @npwa: Namespace Preferred Write Alignment indicates the recommended
- * write alignment in logical blocks for this namespace. This is a
- * 0's based value.
+ * write alignment in logical blocks for this namespace. This is a
+ * 0's based value.
* @npdg: Namespace Preferred Deallocate Granularity indicates the
- * recommended granularity in logical blocks for the Dataset
- * Management command with the Attribute - Deallocate bit.
+ * recommended granularity in logical blocks for the Dataset
+ * Management command with the Attribute - Deallocate bit.
* @npda: Namespace Preferred Deallocate Alignment indicates the
- * recommended alignment in logical blocks for the Dataset
- * Management command with the Attribute - Deallocate bit
+ * recommended alignment in logical blocks for the Dataset
+ * Management command with the Attribute - Deallocate bit
* @nows: Namespace Optimal Write Size indicates the size in logical blocks
- * for optimal write performance for this namespace. This is a 0's
- * based value.
+ * for optimal write performance for this namespace. This is a 0's
+ * based value.
* @mssrl: Maximum Single Source Range Length indicates the maximum number
- * of logical blocks that may be specified in each valid Source Range
- * field of a Copy command.
+ * of logical blocks that may be specified in each valid Source Range
+ * field of a Copy command.
* @mcl: Maximum Copy Length indicates the maximum number of logical
- * blocks that may be specified in a Copy command.
+ * blocks that may be specified in a Copy command.
* @msrc: Maximum Source Range Count indicates the maximum number of Source
- * Range entries that may be used to specify source data in a Copy
- * command. This is a 0’s based value.
+ * Range entries that may be used to specify source data in a Copy
+ * command. This is a 0’s based value.
* @rsvd81: Reserved
* @nulbaf: Number of Unique Capability LBA Formats defines the number of
- * supported user data size and metadata size combinations supported
- * by the namespace that may not share the same capabilities. LBA
- * formats shall be allocated in order and packed sequentially.
+ * supported user data size and metadata size combinations supported
+ * by the namespace that may not share the same capabilities. LBA
+ * formats shall be allocated in order and packed sequentially.
* @rsvd83: Reserved
* @anagrpid: ANA Group Identifier indicates the ANA Group Identifier of the
- * ANA group of which the namespace is a member.
+ * ANA group of which the namespace is a member.
* @rsvd96: Reserved
* @nsattr: Namespace Attributes, see &enum nvme_id_ns_attr.
* @nvmsetid: NVM Set Identifier indicates the NVM Set with which this
- * namespace is associated.
+ * namespace is associated.
* @endgid: Endurance Group Identifier indicates the Endurance Group with
- * which this namespace is associated.
+ * which this namespace is associated.
* @nguid: Namespace Globally Unique Identifier contains a 128-bit value
- * that is globally unique and assigned to the namespace when the
- * namespace is created. This field remains fixed throughout the
- * life of the namespace and is preserved across namespace and
- * controller operations
+ * that is globally unique and assigned to the namespace when the
+ * namespace is created. This field remains fixed throughout the
+ * life of the namespace and is preserved across namespace and
+ * controller operations
* @eui64: IEEE Extended Unique Identifier contains a 64-bit IEEE Extended
* Unique Identifier (EUI-64) that is globally unique and assigned
* to the namespace when the namespace is created. This field
@@ -1757,24 +1821,24 @@ struct nvme_id_ns {
/**
* enum nvme_id_nsfeat - This field defines features of the namespace.
* @NVME_NS_FEAT_THIN: If set, indicates that the namespace supports thin
- * provisioning. Specifically, the Namespace Capacity
- * reported may be less than the Namespace Size.
+ * provisioning. Specifically, the Namespace Capacity
+ * reported may be less than the Namespace Size.
* @NVME_NS_FEAT_NATOMIC: If set, indicates that the fields NAWUN, NAWUPF, and
- * NACWU are defined for this namespace and should be
- * used by the host for this namespace instead of the
- * AWUN, AWUPF, and ACWU fields in the Identify
- * Controller data structure.
+ * NACWU are defined for this namespace and should be
+ * used by the host for this namespace instead of the
+ * AWUN, AWUPF, and ACWU fields in the Identify
+ * Controller data structure.
* @NVME_NS_FEAT_DULBE: If set, indicates that the controller supports the
- * Deallocated or Unwritten Logical Block error for
- * this namespace.
+ * Deallocated or Unwritten Logical Block error for
+ * this namespace.
* @NVME_NS_FEAT_ID_REUSE: If set, indicates that the value in the NGUID field
- * for this namespace, if non- zero, is never reused by
- * the controller and that the value in the EUI64 field
- * for this namespace, if non-zero, is never reused by
- * the controller.
+ * for this namespace, if non- zero, is never reused by
+ * the controller and that the value in the EUI64 field
+ * for this namespace, if non-zero, is never reused by
+ * the controller.
* @NVME_NS_FEAT_IO_OPT: If set, indicates that the fields NPWG, NPWA, NPDG,
- * NPDA, and NOWS are defined for this namespace and
- * should be used by the host for I/O optimization
+ * NPDA, and NOWS are defined for this namespace and
+ * should be used by the host for I/O optimization
*/
enum nvme_id_nsfeat {
NVME_NS_FEAT_THIN = 1 << 0,
@@ -1786,8 +1850,8 @@ enum nvme_id_nsfeat {
/**
* enum nvme_id_ns_flbas - This field indicates the LBA data size & metadata
- * size combination that the namespace has been
- * formatted with
+ * size combination that the namespace has been
+ * formatted with
* @NVME_NS_FLBAS_LOWER_MASK: Mask to get the index of one of the supported
* LBA Formats's least significant
* 4bits indicated in
@@ -1798,7 +1862,7 @@ enum nvme_id_nsfeat {
* extended data LBA. If cleared, indicates that all
* of the metadata for a command is transferred as a
* separate contiguous buffer of data.
- * @NVME_NS_FLBAS_HIGHER_MASK: Mask to get the index of one of
+ * @NVME_NS_FLBAS_HIGHER_MASK: Mask to get the index of one of
* the supported LBA Formats's most significant
* 2bits indicated in
* :c:type:`struct nvme_id_ns <nvme_id_ns>`.lbaf.
@@ -1810,12 +1874,24 @@ enum nvme_id_ns_flbas {
};
/**
+ * enum nvme_nvm_id_ns_elbaf - This field indicates the extended LBA format
+ * @NVME_NVM_ELBAF_STS_MASK: Mask to get the storage tag size used to determine
+ * the variable-sized storage tag/reference tag fields
+ * @NVME_NVM_ELBAF_PIF_MASK: Mask to get the protection information format for
+ * the extended LBA format.
+ */
+enum nvme_nvm_id_ns_elbaf {
+ NVME_NVM_ELBAF_STS_MASK = 127 << 0,
+ NVME_NVM_ELBAF_PIF_MASK = 3 << 7,
+};
+
+/**
* enum nvme_id_ns_mc - This field indicates the capabilities for metadata.
* @NVME_NS_MC_EXTENDED: If set, indicates the namespace supports the metadata
- * being transferred as part of a separate buffer that is
- * specified in the Metadata Pointer.
+ * being transferred as part of a separate buffer that is
+ * specified in the Metadata Pointer.
* @NVME_NS_MC_SEPARATE: If set, indicates that the namespace supports the
- * metadata being transferred as part of an extended data LBA.
+ * metadata being transferred as part of an extended data LBA.
*/
enum nvme_id_ns_mc {
NVME_NS_MC_EXTENDED = 1 << 0,
@@ -1824,19 +1900,19 @@ enum nvme_id_ns_mc {
/**
* enum nvme_id_ns_dpc - This field indicates the capabilities for the
- * end-to-end data protection feature.
+ * end-to-end data protection feature.
* @NVME_NS_DPC_PI_TYPE1: If set, indicates that the namespace supports
- * Protection Information Type 1.
+ * Protection Information Type 1.
* @NVME_NS_DPC_PI_TYPE2: If set, indicates that the namespace supports
- * Protection Information Type 2.
+ * Protection Information Type 2.
* @NVME_NS_DPC_PI_TYPE3: If set, indicates that the namespace supports
- * Protection Information Type 3.
+ * Protection Information Type 3.
* @NVME_NS_DPC_PI_FIRST: If set, indicates that the namespace supports
- * protection information transferred as the first eight
- * bytes of metadata.
+ * protection information transferred as the first eight
+ * bytes of metadata.
* @NVME_NS_DPC_PI_LAST: If set, indicates that the namespace supports
- * protection information transferred as the last eight
- * bytes of metadata.
+ * protection information transferred as the last eight
+ * bytes of metadata.
*/
enum nvme_id_ns_dpc {
NVME_NS_DPC_PI_TYPE1 = 1 << 0,
@@ -1848,15 +1924,15 @@ enum nvme_id_ns_dpc {
/**
* enum nvme_id_ns_dps - This field indicates the Type settings for the
- * end-to-end data protection feature.
+ * end-to-end data protection feature.
* @NVME_NS_DPS_PI_NONE: Protection information is not enabled
* @NVME_NS_DPS_PI_TYPE1: Protection information is enabled, Type 1
* @NVME_NS_DPS_PI_TYPE2: Protection information is enabled, Type 2
* @NVME_NS_DPS_PI_TYPE3: Protection information is enabled, Type 3
* @NVME_NS_DPS_PI_MASK: Mask to get the value of the PI type
* @NVME_NS_DPS_PI_FIRST: If set, indicates that the protection information, if
- * enabled, is transferred as the first eight bytes of
- * metadata.
+ * enabled, is transferred as the first eight bytes of
+ * metadata.
*/
enum nvme_id_ns_dps {
NVME_NS_DPS_PI_NONE = 0,
@@ -1869,9 +1945,9 @@ enum nvme_id_ns_dps {
/**
* enum nvme_id_ns_nmic - This field specifies multi-path I/O and namespace
- * sharing capabilities of the namespace.
+ * sharing capabilities of the namespace.
* @NVME_NS_NMIC_SHARED: If set, then the namespace may be attached to two or
- * more controllers in the NVM subsystem concurrently
+ * more controllers in the NVM subsystem concurrently
*/
enum nvme_id_ns_nmic {
NVME_NS_NMIC_SHARED = 1 << 0,
@@ -1879,23 +1955,23 @@ enum nvme_id_ns_nmic {
/**
* enum nvme_id_ns_rescap - This field indicates the reservation capabilities
- * of the namespace.
+ * of the namespace.
* @NVME_NS_RESCAP_PTPL: If set, indicates that the namespace supports the
- * Persist Through Power Loss capability.
- * @NVME_NS_RESCAP_WE: If set, indicates that the namespace supports the
- * Write Exclusive reservation type.
- * @NVME_NS_RESCAP_EA: If set, indicates that the namespace supports the
- * Exclusive Access reservation type.
+ * Persist Through Power Loss capability.
+ * @NVME_NS_RESCAP_WE: If set, indicates that the namespace supports the
+ * Write Exclusive reservation type.
+ * @NVME_NS_RESCAP_EA: If set, indicates that the namespace supports the
+ * Exclusive Access reservation type.
* @NVME_NS_RESCAP_WERO: If set, indicates that the namespace supports the
- * Write Exclusive - Registrants Only reservation type.
+ * Write Exclusive - Registrants Only reservation type.
* @NVME_NS_RESCAP_EARO: If set, indicates that the namespace supports the
- * Exclusive Access - Registrants Only reservation type.
+ * Exclusive Access - Registrants Only reservation type.
* @NVME_NS_RESCAP_WEAR: If set, indicates that the namespace supports the
- * Write Exclusive - All Registrants reservation type.
+ * Write Exclusive - All Registrants reservation type.
* @NVME_NS_RESCAP_EAAR: If set, indicates that the namespace supports the
- * Exclusive Access - All Registrants reservation type.
+ * Exclusive Access - All Registrants reservation type.
* @NVME_NS_RESCAP_IEK_13: If set, indicates that Ignore Existing Key is used
- * as defined in revision 1.3 or later of this specification.
+ * as defined in revision 1.3 or later of this specification.
*/
enum nvme_id_ns_rescap {
NVME_NS_RESCAP_PTPL = 1 << 0,
@@ -1910,11 +1986,11 @@ enum nvme_id_ns_rescap {
/**
* enum nvme_nd_ns_fpi - If a format operation is in progress, this field
- * indicates the percentage of the namespace that remains
- * to be formatted.
+ * indicates the percentage of the namespace that remains
+ * to be formatted.
* @NVME_NS_FPI_REMAINING: Mask to get the format percent remaining value
* @NVME_NS_FPI_SUPPORTED: If set, indicates that the namespace supports the
- * Format Progress Indicator defined for the field.
+ * Format Progress Indicator defined for the field.
*/
enum nvme_nd_ns_fpi {
NVME_NS_FPI_REMAINING = 0x7f << 0,
@@ -1923,22 +1999,22 @@ enum nvme_nd_ns_fpi {
/**
* enum nvme_id_ns_dlfeat - This field indicates information about features
- * that affect deallocating logical blocks for this
- * namespace.
- * @NVME_NS_DLFEAT_RB: Mask to get the value of the read behavior
- * @NVME_NS_DLFEAT_RB_NR: Read behvaior is not reported
- * @NVME_NS_DLFEAT_RB_ALL_0S: A deallocated logical block returns all bytes
+ * that affect deallocating logical blocks for this
+ * namespace.
+ * @NVME_NS_DLFEAT_RB: Mask to get the value of the read behavior
+ * @NVME_NS_DLFEAT_RB_NR: Read behvaior is not reported
+ * @NVME_NS_DLFEAT_RB_ALL_0S: A deallocated logical block returns all bytes
* cleared to 0h.
- * @NVME_NS_DLFEAT_RB_ALL_FS: A deallocated logical block returns all bytes
- * set to FFh.
+ * @NVME_NS_DLFEAT_RB_ALL_FS: A deallocated logical block returns all bytes
+ * set to FFh.
* @NVME_NS_DLFEAT_WRITE_ZEROES: If set, indicates that the controller supports
- * the Deallocate bit in the Write Zeroes command
- * for this namespace.
- * @NVME_NS_DLFEAT_CRC_GUARD: If set, indicates that the Guard field for
- * deallocated logical blocks that contain
- * protection information is set to the CRC for
- * the value read from the deallocated logical
- * block and its metadata
+ * the Deallocate bit in the Write Zeroes command
+ * for this namespace.
+ * @NVME_NS_DLFEAT_CRC_GUARD: If set, indicates that the Guard field for
+ * deallocated logical blocks that contain
+ * protection information is set to the CRC for
+ * the value read from the deallocated logical
+ * block and its metadata
*/
enum nvme_id_ns_dlfeat {
NVME_NS_DLFEAT_RB = 7 << 0,
@@ -1952,22 +2028,22 @@ enum nvme_id_ns_dlfeat {
/**
* enum nvme_id_ns_attr - Specifies attributes of the namespace.
* @NVME_NS_NSATTR_WRITE_PROTECTED: If set, then the namespace is currently
- * write protected and all write access to the
- * namespace shall fail.
+ * write protected and all write access to the
+ * namespace shall fail.
*/
enum nvme_id_ns_attr {
NVME_NS_NSATTR_WRITE_PROTECTED = 1 << 0
};
/**
- * struct nvme_ns_id_desc -
+ * struct nvme_ns_id_desc - Namespace identifier type descriptor
* @nidt: Namespace Identifier Type, see &enum nvme_ns_id_desc_nidt
* @nidl: Namespace Identifier Length contains the length in bytes of the
- * &struct nvme_id_ns.nid.
+ * &struct nvme_id_ns.nid.
* @rsvd: Reserved
* @nid: Namespace Identifier contains a value that is globally unique and
- * assigned to the namespace when the namespace is created. The length
- * is defined in &struct nvme_id_ns.nidl.
+ * assigned to the namespace when the namespace is created. The length
+ * is defined in &struct nvme_id_ns.nidl.
*/
struct nvme_ns_id_desc {
__u8 nidt;
@@ -1979,12 +2055,12 @@ struct nvme_ns_id_desc {
/**
* enum nvme_ns_id_desc_nidt - Known namespace identifier types
* @NVME_NIDT_EUI64: IEEE Extended Unique Identifier, the NID field contains a
- * copy of the EUI64 field in the struct nvme_id_ns.eui64.
+ * copy of the EUI64 field in the struct nvme_id_ns.eui64.
* @NVME_NIDT_NGUID: Namespace Globally Unique Identifier, the NID field
- * contains a copy of the NGUID field in struct nvme_id_ns.nguid.
+ * contains a copy of the NGUID field in struct nvme_id_ns.nguid.
* @NVME_NIDT_UUID: The NID field contains a 128-bit Universally Unique
- * Identifier (UUID) as specified in RFC 4122.
- * @NVME_NIDT_CSI: The NID field contains the command set indentifier.
+ * Identifier (UUID) as specified in RFC 4122.
+ * @NVME_NIDT_CSI: The NID field contains the command set identifier.
*/
enum nvme_ns_id_desc_nidt {
NVME_NIDT_EUI64 = 1,
@@ -2026,7 +2102,7 @@ struct nvme_nvmset_attr {
};
/**
- * struct nvme_id_nvmset_list -
+ * struct nvme_id_nvmset_list - NVM set list
* @nid: Nvmset id
* @rsvd1: Reserved
* @ent: nvmset id list
@@ -2038,10 +2114,10 @@ struct nvme_id_nvmset_list {
};
/**
- * struct nvme_id_independent_id_ns -
+ * struct nvme_id_independent_id_ns - Identify - I/O Command Set Independent Identify Namespace Data Structure
* @nsfeat: common namespace features
* @nmic: Namespace Multi-path I/O and Namespace
- * Sharing Capabilities
+ * Sharing Capabilities
* @rescap: Reservation Capabilities
* @fpi: Format Progress Indicator
* @anagrpid: ANA Group Identifier
@@ -2067,7 +2143,7 @@ struct nvme_id_independent_id_ns {
};
/**
- * struct nvme_id_ns_granularity_desc -
+ * struct nvme_id_ns_granularity_desc - Namespace Granularity Descriptor
* @nszegran: Namespace Size Granularity
* @ncapgran: Namespace Capacity Granularity
*/
@@ -2077,7 +2153,7 @@ struct nvme_id_ns_granularity_desc {
};
/**
- * struct nvme_id_ns_granularity_list -
+ * struct nvme_id_ns_granularity_list - Namespace Granularity List
* @attributes: Namespace Granularity Attributes
* @num_descriptors: Number of Descriptors
* @rsvd5: reserved
@@ -2093,7 +2169,7 @@ struct nvme_id_ns_granularity_list {
};
/**
- * struct nvme_id_uuid_list_entry -
+ * struct nvme_id_uuid_list_entry - UUID List Entry
* @header: UUID Lists Entry Header
* @rsvd1: reserved
* @uuid: 128-bit Universally Unique Identifier
@@ -2105,7 +2181,7 @@ struct nvme_id_uuid_list_entry {
};
/**
- * enum nvme_id_uuid -
+ * enum nvme_id_uuid - Identifier Association
* @NVME_ID_UUID_HDR_ASSOCIATION_MASK:
* @NVME_ID_UUID_ASSOCIATION_NONE:
* @NVME_ID_UUID_ASSOCIATION_VENDOR:
@@ -2119,7 +2195,7 @@ enum nvme_id_uuid {
};
/**
- * struct nvme_id_uuid_list -
+ * struct nvme_id_uuid_list - UUID list
* @rsvd0: reserved
* @entry: UUID list entry
*/
@@ -2129,7 +2205,7 @@ struct nvme_id_uuid_list {
};
/**
- * struct nvme_ctrl_list -
+ * struct nvme_ctrl_list - Controller List
* @num: Number of Identifiers
* @identifier: NVM subsystem unique controller identifier
*/
@@ -2139,7 +2215,7 @@ struct nvme_ctrl_list {
};
/**
- * struct nvme_ns_list -
+ * struct nvme_ns_list - Namespace List
* @ns: Namespace Identifier
*/
struct nvme_ns_list {
@@ -2147,7 +2223,7 @@ struct nvme_ns_list {
};
/**
- * struct nvme_id_ctrl_nvm -
+ * struct nvme_id_ctrl_nvm - I/O Command Set Specific Identify Controller data structure
* @vsl: Verify Size Limit
* @wzsl: Write Zeroes Size Limit
* @wusl: Write Uncorrectable Size Limit
@@ -2157,17 +2233,17 @@ struct nvme_ns_list {
* @rsvd16: reserved
*/
struct nvme_id_ctrl_nvm {
- __u8 vsl;
- __u8 wzsl;
- __u8 wusl;
- __u8 dmrl;
- __u32 dmrsl;
- __u64 dmsl;
- __u8 rsvd16[4080];
+ __u8 vsl;
+ __u8 wzsl;
+ __u8 wusl;
+ __u8 dmrl;
+ __u32 dmrsl;
+ __u64 dmsl;
+ __u8 rsvd16[4080];
};
/**
- * struct nvme_nvm_id_ns -
+ * struct nvme_nvm_id_ns - NVME Command Set I/O Command Set Specific Identify Namespace Data Structure
* @lbstm: Logical Block Storage Tag Mask
* @pic: Protection Information Capabilities
* @rsvd9: Reserved
@@ -2183,7 +2259,7 @@ struct nvme_nvm_id_ns {
};
/**
- * struct nvme_zns_lbafe -
+ * struct nvme_zns_lbafe - LBA Format Extension Data Structure
* @zsze: Zone Size
* @zdes: Zone Descriptor Extension Size
* @rsvd9: reserved
@@ -2195,8 +2271,7 @@ struct nvme_zns_lbafe {
};
/**
- * struct nvme_zns_id_ns - Zoned Namespace Command Set Specific
- * Identify Namespace Data Structure
+ * struct nvme_zns_id_ns - Zoned Namespace Command Set Specific Identify Namespace Data Structure
* @zoc: Zone Operation Characteristics
* @ozcs: Optional Zoned Command Support
* @mar: Maximum Active Resources
@@ -2215,7 +2290,7 @@ struct nvme_zns_lbafe {
* @zrwacap: ZRWA Capability
* @rsvd53: Reserved
* @lbafe: LBA Format Extension
- * @vs: Vendor Specific
+ * @vs: Vendor Specific
*/
struct nvme_zns_id_ns {
__le16 zoc;
@@ -2240,9 +2315,9 @@ struct nvme_zns_id_ns {
};
/**
- * struct nvme_zns_id_ctrl -
- * @zasl:
- * @rsvd1: Reserved
+ * struct nvme_zns_id_ctrl - I/O Command Set Specific Identify Controller Data Structure for the Zoned Namespace Command Set
+ * @zasl: Zone Append Size Limit
+ * @rsvd1: Reserved
*/
struct nvme_zns_id_ctrl {
__u8 zasl;
@@ -2250,7 +2325,7 @@ struct nvme_zns_id_ctrl {
};
/**
- * struct nvme_primary_ctrl_cap -
+ * struct nvme_primary_ctrl_cap - Identify - Controller Capabilities Structure
* @cntlid: Controller Identifier
* @portid: Port Identifier
* @crt: Controller Resource Types
@@ -2292,7 +2367,7 @@ struct nvme_primary_ctrl_cap {
};
/**
- * struct nvme_secondary_ctrl -
+ * struct nvme_secondary_ctrl - Secondary Controller Entry
* @scid: Secondary Controller Identifier
* @pcid: Primary Controller Identifier
* @scs: Secondary Controller State
@@ -2314,7 +2389,7 @@ struct nvme_secondary_ctrl {
};
/**
- * struct nvme_secondary_ctrl_list -
+ * struct nvme_secondary_ctrl_list - Secondary Controller List
* @num: Number of Identifiers
* @rsvd: Reserved
* @sc_entry: Secondary Controller Entry
@@ -2352,7 +2427,7 @@ struct nvme_id_domain_attr {
};
/**
- * struct nvme_id_domain_list -
+ * struct nvme_id_domain_list - Domain List
* @num: Number of domain attributes
* @rsvd: Reserved
* @domain_attr: List of domain attributes
@@ -2364,7 +2439,7 @@ struct nvme_id_domain_list {
};
/**
- * struct nvme_id_endurance_group_list -
+ * struct nvme_id_endurance_group_list - Endurance Group List
* @num: Number of Identifiers
* @identifier: Endurance Group Identifier
*/
@@ -2374,7 +2449,7 @@ struct nvme_id_endurance_group_list {
};
/**
- * struct nvme_supported_log_pages -
+ * struct nvme_supported_log_pages - Supported Log Pages - Log
* @lid_support: Log Page Identifier Supported
*
* Supported Log Pages (Log Identifier 00h)
@@ -2386,62 +2461,62 @@ struct nvme_supported_log_pages {
/**
* struct nvme_error_log_page - Error Information Log Entry (Log Identifier 01h)
* @error_count: Error Count: a 64-bit incrementing error count,
- * indicating a unique identifier for this error. The error
- * count starts at %1h, is incremented for each unique error
- * log entry, and is retained across power off conditions.
- * A value of %0h indicates an invalid entry; this value
- * is used when there are lost entries or when there are
- * fewer errors than the maximum number of entries the
- * controller supports. If the value of this field is
- * %FFFFFFFFh, then the field shall be set to 1h when
- * incremented (i.e., rolls over to %1h). Prior to NVMe
- * 1.4, processing of incrementing beyond %FFFFFFFFh is
- * unspecified.
+ * indicating a unique identifier for this error. The error
+ * count starts at %1h, is incremented for each unique error
+ * log entry, and is retained across power off conditions.
+ * A value of %0h indicates an invalid entry; this value
+ * is used when there are lost entries or when there are
+ * fewer errors than the maximum number of entries the
+ * controller supports. If the value of this field is
+ * %FFFFFFFFh, then the field shall be set to 1h when
+ * incremented (i.e., rolls over to %1h). Prior to NVMe
+ * 1.4, processing of incrementing beyond %FFFFFFFFh is
+ * unspecified.
* @sqid: Submission Queue ID: indicates the Submission Queue
- * Identifier of the command that the error information is
- * associated with. If the error is not specific to
- * a particular command, then this field shall be set to
- * %FFFFh.
+ * Identifier of the command that the error information is
+ * associated with. If the error is not specific to
+ * a particular command, then this field shall be set to
+ * %FFFFh.
* @cmdid: Command ID: indicates the Command Identifier of the
- * command that the error is associated with. If the error
- * is not specific to a particular command, then this field
- * shall be set to %FFFFh.
+ * command that the error is associated with. If the error
+ * is not specific to a particular command, then this field
+ * shall be set to %FFFFh.
* @status_field: Bits 15-1: Status Field: indicates the Status Field for
- * the command that completed. If the error is not specific
- * to a particular command, then this field reports the most
- * applicable status value.
- * Bit 0: Phase Tag: may indicate the Phase Tag posted for
- * the command.
+ * the command that completed. If the error is not specific
+ * to a particular command, then this field reports the most
+ * applicable status value.
+ * Bit 0: Phase Tag: may indicate the Phase Tag posted for
+ * the command.
* @parm_error_location: Parameter Error Location: indicates the byte and bit of
- * the command parameter that the error is associated with,
- * if applicable. If the parameter spans multiple bytes or
- * bits, then the location indicates the first byte and bit
- * of the parameter.
- * Bits 10-8: Bit in command that contained the error.
- * Valid values are 0 to 7.
+ * the command parameter that the error is associated with,
+ * if applicable. If the parameter spans multiple bytes or
+ * bits, then the location indicates the first byte and bit
+ * of the parameter.
+ * Bits 10-8: Bit in command that contained the error.
+ * Valid values are 0 to 7.
* Bits 7-0: Byte in command that contained the error.
- * Valid values are 0 to 63.
+ * Valid values are 0 to 63.
* @lba: LBA: This field indicates the first LBA that experienced
- * the error condition, if applicable.
+ * the error condition, if applicable.
* @nsid: Namespace: This field indicates the NSID of the namespace
- * that the error is associated with, if applicable.
+ * that the error is associated with, if applicable.
* @vs: Vendor Specific Information Available: If there is
- * additional vendor specific error information available,
- * this field provides the log page identifier associated
- * with that page. A value of %0h indicates that no additional
- * information is available. Valid values are in the range
- * of %80h to %FFh.
+ * additional vendor specific error information available,
+ * this field provides the log page identifier associated
+ * with that page. A value of %0h indicates that no additional
+ * information is available. Valid values are in the range
+ * of %80h to %FFh.
* @trtype: Transport Type (TRTYPE): indicates the Transport Type of
- * the transport associated with the error. The values in
- * this field are the same as the TRTYPE values in the
- * Discovery Log Page Entry. If the error is not transport
- * related, this field shall be cleared to %0h. If the error
- * is transport related, this field shall be set to the type
- * of the transport - see &enum nvme_trtype.
+ * the transport associated with the error. The values in
+ * this field are the same as the TRTYPE values in the
+ * Discovery Log Page Entry. If the error is not transport
+ * related, this field shall be cleared to %0h. If the error
+ * is transport related, this field shall be set to the type
+ * of the transport - see &enum nvme_trtype.
* @rsvd: Reserved
* @cs: Command Specific Information: This field contains command
- * specific information. If used, the command definition
- * specifies the information returned.
+ * specific information. If used, the command definition
+ * specifies the information returned.
* @trtype_spec_info: Transport Type Specific Information
* @rsvd2: Reserved
*/
@@ -2461,11 +2536,6 @@ struct nvme_error_log_page {
__u8 rsvd2[22];
};
-/**
- * enum nvme_err_pel -
- * @NVME_ERR_PEL_BYTE_MASK:
- * @NVME_ERR_PEL_BIT_MASK:
- */
enum nvme_err_pel {
NVME_ERR_PEL_BYTE_MASK = 0xf,
NVME_ERR_PEL_BIT_MASK = 0x70,
@@ -2473,153 +2543,153 @@ enum nvme_err_pel {
/**
* struct nvme_smart_log - SMART / Health Information Log (Log Identifier 02h)
- * @critical_warning: This field indicates critical warnings for the state
- * of the controller. Critical warnings may result in an
- * asynchronous event notification to the host. Bits in
- * this field represent the current associated state and
- * are not persistent (see &enum nvme_smart_crit).
+ * @critical_warning: This field indicates critical warnings for the state
+ * of the controller. Critical warnings may result in an
+ * asynchronous event notification to the host. Bits in
+ * this field represent the current associated state and
+ * are not persistent (see &enum nvme_smart_crit).
* @temperature: Composite Temperature: Contains a value corresponding
- * to a temperature in Kelvins that represents the current
- * composite temperature of the controller and namespace(s)
- * associated with that controller. The manner in which
- * this value is computed is implementation specific and
- * may not represent the actual temperature of any physical
- * point in the NVM subsystem. Warning and critical
- * overheating composite temperature threshold values are
- * reported by the WCTEMP and CCTEMP fields in the Identify
- * Controller data structure.
+ * to a temperature in Kelvins that represents the current
+ * composite temperature of the controller and namespace(s)
+ * associated with that controller. The manner in which
+ * this value is computed is implementation specific and
+ * may not represent the actual temperature of any physical
+ * point in the NVM subsystem. Warning and critical
+ * overheating composite temperature threshold values are
+ * reported by the WCTEMP and CCTEMP fields in the Identify
+ * Controller data structure.
* @avail_spare: Available Spare: Contains a normalized percentage (0%
- * to 100%) of the remaining spare capacity available.
+ * to 100%) of the remaining spare capacity available.
* @spare_thresh: Available Spare Threshold: When the Available Spare
- * falls below the threshold indicated in this field, an
- * asynchronous event completion may occur. The value is
- * indicated as a normalized percentage (0% to 100%).
- * The values 101 to 255 are reserved.
+ * falls below the threshold indicated in this field, an
+ * asynchronous event completion may occur. The value is
+ * indicated as a normalized percentage (0% to 100%).
+ * The values 101 to 255 are reserved.
* @percent_used: Percentage Used: Contains a vendor specific estimate
- * of the percentage of NVM subsystem life used based on
- * the actual usage and the manufacturer's prediction of
- * NVM life. A value of 100 indicates that the estimated
- * endurance of the NVM in the NVM subsystem has been
- * consumed, but may not indicate an NVM subsystem failure.
- * The value is allowed to exceed 100. Percentages greater
- * than 254 shall be represented as 255. This value shall
- * be updated once per power-on hour (when the controller
- * is not in a sleep state).
+ * of the percentage of NVM subsystem life used based on
+ * the actual usage and the manufacturer's prediction of
+ * NVM life. A value of 100 indicates that the estimated
+ * endurance of the NVM in the NVM subsystem has been
+ * consumed, but may not indicate an NVM subsystem failure.
+ * The value is allowed to exceed 100. Percentages greater
+ * than 254 shall be represented as 255. This value shall
+ * be updated once per power-on hour (when the controller
+ * is not in a sleep state).
* @endu_grp_crit_warn_sumry: Endurance Group Critical Warning Summary: This field
- * indicates critical warnings for the state of Endurance
- * Groups. Bits in this field represent the current associated
- * state and are not persistent (see &enum nvme_smart_egcw).
+ * indicates critical warnings for the state of Endurance
+ * Groups. Bits in this field represent the current associated
+ * state and are not persistent (see &enum nvme_smart_egcw).
* @rsvd7: Reserved
* @data_units_read: Data Units Read: Contains the number of 512 byte data
- * units the host has read from the controller; this value
- * does not include metadata. This value is reported in
- * thousands (i.e., a value of 1 corresponds to 1000
- * units of 512 bytes read) and is rounded up (e.g., one
- * indicates the that number of 512 byte data units read
- * is from 1 to 1000, three indicates that the number of
- * 512 byte data units read is from 2001 to 3000). When
- * the LBA size is a value other than 512 bytes, the
- * controller shall convert the amount of data read to
- * 512 byte units. For the NVM command set, logical blocks
- * read as part of Compare, Read, and Verify operations
- * shall be included in this value. A value of %0h in
- * this field indicates that the number of Data Units Read
- * is not reported.
- * @data_units_written: Data Units Written: Contains the number of 512 byte
- * data units the host has written to the controller;
- * this value does not include metadata. This value is
- * reported in thousands (i.e., a value of 1 corresponds
- * to 1000 units of 512 bytes written) and is rounded up
- * (e.g., one indicates that the number of 512 byte data
- * units written is from 1 to 1,000, three indicates that
- * the number of 512 byte data units written is from 2001
- * to 3000). When the LBA size is a value other than 512
- * bytes, the controller shall convert the amount of data
- * written to 512 byte units. For the NVM command set,
- * logical blocks written as part of Write operations shall
- * be included in this value. Write Uncorrectable commands
- * and Write Zeroes commands shall not impact this value.
- * A value of %0h in this field indicates that the number
- * of Data Units Written is not reported.
+ * units the host has read from the controller; this value
+ * does not include metadata. This value is reported in
+ * thousands (i.e., a value of 1 corresponds to 1000
+ * units of 512 bytes read) and is rounded up (e.g., one
+ * indicates the that number of 512 byte data units read
+ * is from 1 to 1000, three indicates that the number of
+ * 512 byte data units read is from 2001 to 3000). When
+ * the LBA size is a value other than 512 bytes, the
+ * controller shall convert the amount of data read to
+ * 512 byte units. For the NVM command set, logical blocks
+ * read as part of Compare, Read, and Verify operations
+ * shall be included in this value. A value of %0h in
+ * this field indicates that the number of Data Units Read
+ * is not reported.
+ * @data_units_written: Data Units Written: Contains the number of 512 byte
+ * data units the host has written to the controller;
+ * this value does not include metadata. This value is
+ * reported in thousands (i.e., a value of 1 corresponds
+ * to 1000 units of 512 bytes written) and is rounded up
+ * (e.g., one indicates that the number of 512 byte data
+ * units written is from 1 to 1,000, three indicates that
+ * the number of 512 byte data units written is from 2001
+ * to 3000). When the LBA size is a value other than 512
+ * bytes, the controller shall convert the amount of data
+ * written to 512 byte units. For the NVM command set,
+ * logical blocks written as part of Write operations shall
+ * be included in this value. Write Uncorrectable commands
+ * and Write Zeroes commands shall not impact this value.
+ * A value of %0h in this field indicates that the number
+ * of Data Units Written is not reported.
* @host_reads: Host Read Commands: Contains the number of read commands
- * completed by the controller. For the NVM command set,
- * this value is the sum of the number of Compare commands
- * and the number of Read commands.
+ * completed by the controller. For the NVM command set,
+ * this value is the sum of the number of Compare commands
+ * and the number of Read commands.
* @host_writes: Host Write Commands: Contains the number of write
- * commands completed by the controller. For the NVM
- * command set, this is the number of Write commands.
+ * commands completed by the controller. For the NVM
+ * command set, this is the number of Write commands.
* @ctrl_busy_time: Controller Busy Time: Contains the amount of time the
- * controller is busy with I/O commands. The controller
- * is busy when there is a command outstanding to an I/O
- * Queue (specifically, a command was issued via an I/O
- * Submission Queue Tail doorbell write and the corresponding
- * completion queue entry has not been posted yet to the
- * associated I/O Completion Queue). This value is
- * reported in minutes.
+ * controller is busy with I/O commands. The controller
+ * is busy when there is a command outstanding to an I/O
+ * Queue (specifically, a command was issued via an I/O
+ * Submission Queue Tail doorbell write and the corresponding
+ * completion queue entry has not been posted yet to the
+ * associated I/O Completion Queue). This value is
+ * reported in minutes.
* @power_cycles: Power Cycles: Contains the number of power cycles.
* @power_on_hours: Power On Hours: Contains the number of power-on hours.
- * This may not include time that the controller was
- * powered and in a non-operational power state.
+ * This may not include time that the controller was
+ * powered and in a non-operational power state.
* @unsafe_shutdowns: Unsafe Shutdowns: Contains the number of unsafe
- * shutdowns. This count is incremented when a Shutdown
- * Notification (CC.SHN) is not received prior to loss of power.
+ * shutdowns. This count is incremented when a Shutdown
+ * Notification (CC.SHN) is not received prior to loss of power.
* @media_errors: Media and Data Integrity Errors: Contains the number
- * of occurrences where the controller detected an
- * unrecovered data integrity error. Errors such as
- * uncorrectable ECC, CRC checksum failure, or LBA tag
- * mismatch are included in this field. Errors introduced
- * as a result of a Write Uncorrectable command may or
- * may not be included in this field.
+ * of occurrences where the controller detected an
+ * unrecovered data integrity error. Errors such as
+ * uncorrectable ECC, CRC checksum failure, or LBA tag
+ * mismatch are included in this field. Errors introduced
+ * as a result of a Write Uncorrectable command may or
+ * may not be included in this field.
* @num_err_log_entries: Number of Error Information Log Entries: Contains the
- * number of Error Information log entries over the life
- * of the controller.
- * @warning_temp_time: Warning Composite Temperature Time: Contains the amount
- * of time in minutes that the controller is operational
- * and the Composite Temperature is greater than or equal
- * to the Warning Composite Temperature Threshold (WCTEMP)
- * field and less than the Critical Composite Temperature
- * Threshold (CCTEMP) field in the Identify Controller
- * data structure. If the value of the WCTEMP or CCTEMP
- * field is %0h, then this field is always cleared to %0h
- * regardless of the Composite Temperature value.
- * @critical_comp_time: Critical Composite Temperature Time: Contains the amount
- * of time in minutes that the controller is operational
- * and the Composite Temperature is greater than or equal
- * to the Critical Composite Temperature Threshold (CCTEMP)
- * field in the Identify Controller data structure. If
- * the value of the CCTEMP field is %0h, then this field
- * is always cleared to 0h regardless of the Composite
- * Temperature value.
+ * number of Error Information log entries over the life
+ * of the controller.
+ * @warning_temp_time: Warning Composite Temperature Time: Contains the amount
+ * of time in minutes that the controller is operational
+ * and the Composite Temperature is greater than or equal
+ * to the Warning Composite Temperature Threshold (WCTEMP)
+ * field and less than the Critical Composite Temperature
+ * Threshold (CCTEMP) field in the Identify Controller
+ * data structure. If the value of the WCTEMP or CCTEMP
+ * field is %0h, then this field is always cleared to %0h
+ * regardless of the Composite Temperature value.
+ * @critical_comp_time: Critical Composite Temperature Time: Contains the amount
+ * of time in minutes that the controller is operational
+ * and the Composite Temperature is greater than or equal
+ * to the Critical Composite Temperature Threshold (CCTEMP)
+ * field in the Identify Controller data structure. If
+ * the value of the CCTEMP field is %0h, then this field
+ * is always cleared to 0h regardless of the Composite
+ * Temperature value.
* @temp_sensor: Temperature Sensor 1-8: Contains the current temperature
- * in degrees Kelvin reported by temperature sensors 1-8.
- * The physical point in the NVM subsystem whose temperature
- * is reported by the temperature sensor and the temperature
- * accuracy is implementation specific. An implementation
- * that does not implement the temperature sensor reports
- * a value of %0h.
+ * in degrees Kelvin reported by temperature sensors 1-8.
+ * The physical point in the NVM subsystem whose temperature
+ * is reported by the temperature sensor and the temperature
+ * accuracy is implementation specific. An implementation
+ * that does not implement the temperature sensor reports
+ * a value of %0h.
* @thm_temp1_trans_count: Thermal Management Temperature 1 Transition Count:
- * Contains the number of times the controller transitioned
- * to lower power active power states or performed vendor
- * specific thermal management actions while minimizing
- * the impact on performance in order to attempt to reduce
- * the Composite Temperature because of the host controlled
- * thermal management feature (i.e., the Composite
- * Temperature rose above the Thermal Management
- * Temperature 1). This counter shall not wrap once the
- * value %FFFFFFFFh is reached. A value of %0h, indicates
- * that this transition has never occurred or this field
- * is not implemented.
+ * Contains the number of times the controller transitioned
+ * to lower power active power states or performed vendor
+ * specific thermal management actions while minimizing
+ * the impact on performance in order to attempt to reduce
+ * the Composite Temperature because of the host controlled
+ * thermal management feature (i.e., the Composite
+ * Temperature rose above the Thermal Management
+ * Temperature 1). This counter shall not wrap once the
+ * value %FFFFFFFFh is reached. A value of %0h, indicates
+ * that this transition has never occurred or this field
+ * is not implemented.
* @thm_temp2_trans_count: Thermal Management Temperature 2 Transition Count
* @thm_temp1_total_time: Total Time For Thermal Management Temperature 1:
- * Contains the number of seconds that the controller
- * had transitioned to lower power active power states or
- * performed vendor specific thermal management actions
- * while minimizing the impact on performance in order to
- * attempt to reduce the Composite Temperature because of
- * the host controlled thermal management feature. This
- * counter shall not wrap once the value %FFFFFFFFh is
- * reached. A value of %0h, indicates that this transition
- * has never occurred or this field is not implemented.
+ * Contains the number of seconds that the controller
+ * had transitioned to lower power active power states or
+ * performed vendor specific thermal management actions
+ * while minimizing the impact on performance in order to
+ * attempt to reduce the Composite Temperature because of
+ * the host controlled thermal management feature. This
+ * counter shall not wrap once the value %FFFFFFFFh is
+ * reached. A value of %0h, indicates that this transition
+ * has never occurred or this field is not implemented.
* @thm_temp2_total_time: Total Time For Thermal Management Temperature 2
* @rsvd232: Reserved
*/
@@ -2654,23 +2724,23 @@ struct nvme_smart_log {
/**
* enum nvme_smart_crit - Critical Warning
* @NVME_SMART_CRIT_SPARE: If set, then the available spare capacity has fallen
- * below the threshold.
+ * below the threshold.
* @NVME_SMART_CRIT_TEMPERATURE: If set, then a temperature is either greater
- * than or equal to an over temperature threshold; or
- * less than or equal to an under temperature threshold.
+ * than or equal to an over temperature threshold; or
+ * less than or equal to an under temperature threshold.
* @NVME_SMART_CRIT_DEGRADED: If set, then the NVM subsystem reliability has
- * been degraded due to significant media related errors
- * or any internal error that degrades NVM subsystem
- * reliability.
+ * been degraded due to significant media related errors
+ * or any internal error that degrades NVM subsystem
+ * reliability.
* @NVME_SMART_CRIT_MEDIA: If set, then all of the media has been placed in read
- * only mode. The controller shall not set this bit if
- * the read-only condition on the media is a result of
- * a change in the write protection state of a namespace.
+ * only mode. The controller shall not set this bit if
+ * the read-only condition on the media is a result of
+ * a change in the write protection state of a namespace.
* @NVME_SMART_CRIT_VOLATILE_MEMORY: If set, then the volatile memory backup
- * device has failed. This field is only valid if the
- * controller has a volatile memory backup solution.
+ * device has failed. This field is only valid if the
+ * controller has a volatile memory backup solution.
* @NVME_SMART_CRIT_PMR_RO: If set, then the Persistent Memory Region has become
- * read-only or unreliable.
+ * read-only or unreliable.
*/
enum nvme_smart_crit {
NVME_SMART_CRIT_SPARE = 1 << 0,
@@ -2684,15 +2754,15 @@ enum nvme_smart_crit {
/**
* enum nvme_smart_egcw - Endurance Group Critical Warning Summary
* @NVME_SMART_EGCW_SPARE: If set, then the available spare capacity of one or
- * more Endurance Groups has fallen below the threshold.
+ * more Endurance Groups has fallen below the threshold.
* @NVME_SMART_EGCW_DEGRADED: If set, then the reliability of one or more
- * Endurance Groups has been degraded due to significant
- * media related errors or any internal error that
- * degrades NVM subsystem reliability.
- * @NVME_SMART_EGCW_RO: If set, then the namespaces in one or more Endurance
- * Groups have been placed in read only mode not as
- * a result of a change in the write protection state
- * of a namespace.
+ * Endurance Groups has been degraded due to significant
+ * media related errors or any internal error that
+ * degrades NVM subsystem reliability.
+ * @NVME_SMART_EGCW_RO: If set, then the namespaces in one or more Endurance
+ * Groups have been placed in read only mode not as
+ * a result of a change in the write protection state
+ * of a namespace.
*/
enum nvme_smart_egcw {
NVME_SMART_EGCW_SPARE = 1 << 0,
@@ -2701,7 +2771,7 @@ enum nvme_smart_egcw {
};
/**
- * struct nvme_firmware_slot -
+ * struct nvme_firmware_slot - Firmware Slot Information Log
* @afi: Active Firmware Info
* @rsvd1: Reserved
* @frs: Firmware Revision for Slot
@@ -2715,7 +2785,7 @@ struct nvme_firmware_slot {
};
/**
- * struct nvme_cmd_effects_log -
+ * struct nvme_cmd_effects_log - Commands Supported and Effects Log
* @acs: Admin Command Supported
* @iocs: I/O Command Supported
* @rsvd: Reserved
@@ -2727,7 +2797,7 @@ struct nvme_cmd_effects_log {
};
/**
- * enum nvme_cmd_effects -
+ * enum nvme_cmd_effects - Commands Supported and Effects
* @NVME_CMD_EFFECTS_CSUPP: Command Supported
* @NVME_CMD_EFFECTS_LBCC: Logical Block Content Change
* @NVME_CMD_EFFECTS_NCC: Namespace Capability Change
@@ -2749,44 +2819,44 @@ enum nvme_cmd_effects {
/**
* struct nvme_st_result - Self-test Result
* @dsts: Device Self-test Status: Indicates the device self-test code and the
- * status of the operation (see &enum nvme_status_result and &enum nvme_st_code).
+ * status of the operation (see &enum nvme_status_result and &enum nvme_st_code).
* @seg: Segment Number: Iindicates the segment number where the first self-test
- * failure occurred. If Device Self-test Status (@dsts) is not set to
- * #NVME_ST_RESULT_KNOWN_SEG_FAIL, then this field should be ignored.
+ * failure occurred. If Device Self-test Status (@dsts) is not set to
+ * #NVME_ST_RESULT_KNOWN_SEG_FAIL, then this field should be ignored.
* @vdi: Valid Diagnostic Information: Indicates the diagnostic failure
- * information that is reported. See &enum nvme_st_valid_diag_info.
+ * information that is reported. See &enum nvme_st_valid_diag_info.
* @rsvd: Reserved
* @poh: Power On Hours (POH): Indicates the number of power-on hours at the
- * time the device self-test operation was completed or aborted. This
- * does not include time that the controller was powered and in a low
- * power state condition.
+ * time the device self-test operation was completed or aborted. This
+ * does not include time that the controller was powered and in a low
+ * power state condition.
* @nsid: Namespace Identifier (NSID): Indicates the namespace that the Failing
- * LBA occurred on. Valid only when the NSID Valid bit
- * (#NVME_ST_VALID_DIAG_INFO_NSID) is set in the Valid Diagnostic
- * Information (@vdi) field.
+ * LBA occurred on. Valid only when the NSID Valid bit
+ * (#NVME_ST_VALID_DIAG_INFO_NSID) is set in the Valid Diagnostic
+ * Information (@vdi) field.
* @flba: Failing LBA: indicates the LBA of the logical block that caused the
- * test to fail. If the device encountered more than one failed logical
- * block during the test, then this field only indicates one of those
- * failed logical blocks. Valid only when the NSID Valid bit
- * (#NVME_ST_VALID_DIAG_INFO_FLBA) is set in the Valid Diagnostic
- * Information (@vdi) field.
+ * test to fail. If the device encountered more than one failed logical
+ * block during the test, then this field only indicates one of those
+ * failed logical blocks. Valid only when the NSID Valid bit
+ * (#NVME_ST_VALID_DIAG_INFO_FLBA) is set in the Valid Diagnostic
+ * Information (@vdi) field.
* @sct: Status Code Type: This field may contain additional information related
- * to errors or conditions. Bits 2:0 may contain additional information
- * relating to errors or conditions that occurred during the device
- * self-test operation represented in the same format used in the Status
- * Code Type field of the completion queue entry (refer to &enum nvme_status_field).
- * Valid only when the NSID Valid bit (#NVME_ST_VALID_DIAG_INFO_SCT) is
- * set in the Valid Diagnostic Information (@vdi) field.
+ * to errors or conditions. Bits 2:0 may contain additional information
+ * relating to errors or conditions that occurred during the device
+ * self-test operation represented in the same format used in the Status
+ * Code Type field of the completion queue entry (refer to &enum nvme_status_field).
+ * Valid only when the NSID Valid bit (#NVME_ST_VALID_DIAG_INFO_SCT) is
+ * set in the Valid Diagnostic Information (@vdi) field.
* @sc: Status Code: This field may contain additional information relating
- * to errors or conditions that occurred during the device self-test
- * operation represented in the same format used in the Status Code field
- * of the completion queue entry. Valid only when the SCT Valid bit
- * (#NVME_ST_VALID_DIAG_INFO_SC) is set in the Valid Diagnostic
- * Information (@vdi) field.
+ * to errors or conditions that occurred during the device self-test
+ * operation represented in the same format used in the Status Code field
+ * of the completion queue entry. Valid only when the SCT Valid bit
+ * (#NVME_ST_VALID_DIAG_INFO_SC) is set in the Valid Diagnostic
+ * Information (@vdi) field.
* @vs: Vendor Specific.
*/
struct nvme_st_result {
- __u8 dsts;
+ __u8 dsts;
__u8 seg;
__u8 vdi;
__u8 rsvd;
@@ -2804,23 +2874,23 @@ struct nvme_st_result {
* @NVME_ST_RESULT_ABORTED: Operation was aborted by a Device Self-test command.
* @NVME_ST_RESULT_CLR: Operation was aborted by a Controller Level Reset.
* @NVME_ST_RESULT_NS_REMOVED: Operation was aborted due to a removal of
- * a namespace from the namespace inventory.
+ * a namespace from the namespace inventory.
* @NVME_ST_RESULT_ABORTED_FORMAT: Operation was aborted due to the processing
- * of a Format NVM command.
+ * of a Format NVM command.
* @NVME_ST_RESULT_FATAL_ERR: A fatal error or unknown test error occurred
- * while the controller was executing the device
- * self-test operation and the operation did
- * not complete.
+ * while the controller was executing the device
+ * self-test operation and the operation did
+ * not complete.
* @NVME_ST_RESULT_UNKNOWN_SEG_FAIL: Operation completed with a segment that failed
- * and the segment that failed is not known.
+ * and the segment that failed is not known.
* @NVME_ST_RESULT_KNOWN_SEG_FAIL: Operation completed with one or more failed
- * segments and the first segment that failed
- * is indicated in the Segment Number field.
+ * segments and the first segment that failed
+ * is indicated in the Segment Number field.
* @NVME_ST_RESULT_ABORTED_UNKNOWN: Operation was aborted for unknown reason.
* @NVME_ST_RESULT_ABORTED_SANITIZE: Operation was aborted due to a sanitize operation.
* @NVME_ST_RESULT_NOT_USED: Entry not used (does not contain a test result).
* @NVME_ST_RESULT_MASK: Mask to get the status result value from
- * the &struct nvme_st_result.dsts field.
+ * the &struct nvme_st_result.dsts field.
*/
enum nvme_status_result {
NVME_ST_RESULT_NO_ERR = 0x0,
@@ -2844,7 +2914,7 @@ enum nvme_status_result {
* @NVME_ST_CODE_EXTENDED: Extended device self-test operation.
* @NVME_ST_CODE_VS: Vendor specific.
* @NVME_ST_CODE_SHIFT: Shift amount to get the code value from the
- * &struct nvme_st_result.dsts field.
+ * &struct nvme_st_result.dsts field.
*/
enum nvme_st_code {
NVME_ST_CODE_RESERVED = 0x0,
@@ -2862,9 +2932,9 @@ enum nvme_st_code {
* @NVME_ST_CURR_OP_VS: Vendor specific.
* @NVME_ST_CURR_OP_RESERVED: Reserved.
* @NVME_ST_CURR_OP_MASK: Mask to get the current operation value from the
- * &struct nvme_self_test_log.current_operation field.
+ * &struct nvme_self_test_log.current_operation field.
* @NVME_ST_CURR_OP_CMPL_MASK: Mask to get the current operation completion value
- * from the &struct nvme_self_test_log.completion field.
+ * from the &struct nvme_self_test_log.completion field.
*/
enum nvme_st_curr_op {
NVME_ST_CURR_OP_NOT_RUNNING = 0x0,
@@ -2879,13 +2949,13 @@ enum nvme_st_curr_op {
/**
* enum nvme_st_valid_diag_info - Valid Diagnostic Information
* @NVME_ST_VALID_DIAG_INFO_NSID: NSID Valid: if set, then the contents of
- * the Namespace Identifier field are valid.
+ * the Namespace Identifier field are valid.
* @NVME_ST_VALID_DIAG_INFO_FLBA: FLBA Valid: if set, then the contents of
- * the Failing LBA field are valid.
+ * the Failing LBA field are valid.
* @NVME_ST_VALID_DIAG_INFO_SCT: SCT Valid: if set, then the contents of
- * the Status Code Type field are valid.
- * @NVME_ST_VALID_DIAG_INFO_SC: SC Valid: if set, then the contents of
- * the Status Code field are valid.
+ * the Status Code Type field are valid.
+ * @NVME_ST_VALID_DIAG_INFO_SC: SC Valid: if set, then the contents of
+ * the Status Code field are valid.
*/
enum nvme_st_valid_diag_info {
NVME_ST_VALID_DIAG_INFO_NSID = 1 << 0,
@@ -2897,23 +2967,23 @@ enum nvme_st_valid_diag_info {
/**
* struct nvme_self_test_log - Device Self-test (Log Identifier 06h)
* @current_operation: Current Device Self-Test Operation: indicates the status
- * of the current device self-test operation. If a device
- * self-test operation is in process (i.e., this field is set
- * to #NVME_ST_CURR_OP_SHORT or #NVME_ST_CURR_OP_EXTENDED),
- * then the controller shall not set this field to
- * #NVME_ST_CURR_OP_NOT_RUNNING until a new Self-test Result
- * Data Structure is created (i.e., if a device self-test
- * operation completes or is aborted, then the controller
- * shall create a Self-test Result Data Structure prior to
- * setting this field to #NVME_ST_CURR_OP_NOT_RUNNING).
- * See &enum nvme_st_curr_op.
+ * of the current device self-test operation. If a device
+ * self-test operation is in process (i.e., this field is set
+ * to #NVME_ST_CURR_OP_SHORT or #NVME_ST_CURR_OP_EXTENDED),
+ * then the controller shall not set this field to
+ * #NVME_ST_CURR_OP_NOT_RUNNING until a new Self-test Result
+ * Data Structure is created (i.e., if a device self-test
+ * operation completes or is aborted, then the controller
+ * shall create a Self-test Result Data Structure prior to
+ * setting this field to #NVME_ST_CURR_OP_NOT_RUNNING).
+ * See &enum nvme_st_curr_op.
* @completion: Current Device Self-Test Completion: indicates the percentage
- * of the device self-test operation that is complete (e.g.,
- * a value of 25 indicates that 25% of the device self-test
- * operation is complete and 75% remains to be tested).
- * If the @current_operation field is cleared to
- * #NVME_ST_CURR_OP_NOT_RUNNING (indicating there is no device
- * self-test operation in progress), then this field is ignored.
+ * of the device self-test operation that is complete (e.g.,
+ * a value of 25 indicates that 25% of the device self-test
+ * operation is complete and 75% remains to be tested).
+ * If the @current_operation field is cleared to
+ * #NVME_ST_CURR_OP_NOT_RUNNING (indicating there is no device
+ * self-test operation in progress), then this field is ignored.
* @rsvd: Reserved
* @result: Self-test Result Data Structures, see &struct nvme_st_result.
*/
@@ -2925,9 +2995,9 @@ struct nvme_self_test_log {
} __attribute__((packed));
/**
- * enum nvme_cmd_get_log_telemetry_host_lsp -
- * @NVME_LOG_TELEM_HOST_LSP_RETAIN:
- * @NVME_LOG_TELEM_HOST_LSP_CREATE:
+ * enum nvme_cmd_get_log_telemetry_host_lsp - Telemetry Host-Initiated log specific field
+ * @NVME_LOG_TELEM_HOST_LSP_RETAIN: Get Telemetry Data Blocks
+ * @NVME_LOG_TELEM_HOST_LSP_CREATE: Create Telemetry Data Blocks
*/
enum nvme_cmd_get_log_telemetry_host_lsp {
NVME_LOG_TELEM_HOST_LSP_RETAIN = 0,
@@ -2936,37 +3006,37 @@ enum nvme_cmd_get_log_telemetry_host_lsp {
/**
* struct nvme_telemetry_log - Retrieve internal data specific to the
- * manufacturer.
+ * manufacturer.
* @lpi: Log Identifier, either %NVME_LOG_LID_TELEMETRY_HOST or
- * %NVME_LOG_LID_TELEMETRY_CTRL
+ * %NVME_LOG_LID_TELEMETRY_CTRL
* @rsvd1: Reserved
* @ieee: IEEE OUI Identifier is the Organization Unique Identifier (OUI)
- * for the controller vendor that is able to interpret the data.
+ * for the controller vendor that is able to interpret the data.
* @dalb1: Telemetry Controller-Initiated Data Area 1 Last Block is
- * the value of the last block in this area.
+ * the value of the last block in this area.
* @dalb2: Telemetry Controller-Initiated Data Area 1 Last Block is
- * the value of the last block in this area.
+ * the value of the last block in this area.
* @dalb3: Telemetry Controller-Initiated Data Area 1 Last Block is
- * the value of the last block in this area.
+ * the value of the last block in this area.
* @rsvd14: Reserved
* @dalb4: Telemetry Controller-Initiated Data Area 4 Last Block is
- * the value of the last block in this area.
+ * the value of the last block in this area.
* @rsvd20: Reserved
* @hostdgn: Telemetry Host-Initiated Data Generation Number is a
- * value that is incremented each time the host initiates a
- * capture of its internal controller state in the controller .
+ * value that is incremented each time the host initiates a
+ * capture of its internal controller state in the controller .
* @ctrlavail: Telemetry Controller-Initiated Data Available, if cleared,
- * then the controller telemetry log does not contain saved
- * internal controller state. If this field is set to 1h, the
- * controller log contains saved internal controller state. If
- * this field is set to 1h, the data will be latched until the
- * host releases it by reading the log with RAE cleared.
+ * then the controller telemetry log does not contain saved
+ * internal controller state. If this field is set to 1h, the
+ * controller log contains saved internal controller state. If
+ * this field is set to 1h, the data will be latched until the
+ * host releases it by reading the log with RAE cleared.
* @ctrldgn: Telemetry Controller-Initiated Data Generation Number is
- * a value that is incremented each time the controller initiates a
- * capture of its internal controller state in the controller .
- * @rsnident: Reason Identifieris a vendor specific identifier that describes
- * the operating conditions of the controller at the time of
- * capture.
+ * a value that is incremented each time the controller initiates a
+ * capture of its internal controller state in the controller .
+ * @rsnident: Reason Identifiers a vendor specific identifier that describes
+ * the operating conditions of the controller at the time of
+ * capture.
* @data_area: Telemetry data blocks, vendor specific information data.
*
* This log consists of a header describing the log and zero or more Telemetry
@@ -2980,9 +3050,9 @@ struct nvme_telemetry_log {
__le16 dalb1;
__le16 dalb2;
__le16 dalb3;
- __u8 rsvd14[2];
- __le32 dalb4;
- __u8 rsvd20[361];
+ __u8 rsvd14[2];
+ __le32 dalb4;
+ __u8 rsvd20[361];
__u8 hostdgn;
__u8 ctrlavail;
__u8 ctrldgn;
@@ -2991,7 +3061,7 @@ struct nvme_telemetry_log {
};
/**
- * struct nvme_endurance_group_log -
+ * struct nvme_endurance_group_log - Endurance Group Information Log
* @critical_warning: Critical Warning
* @rsvd1: Reserved
* @avl_spare: Available Spare
@@ -3027,10 +3097,12 @@ struct nvme_endurance_group_log {
};
/**
- * enum nvme_eg_critical_warning_flags -
- * @NVME_EG_CRITICAL_WARNING_SPARE:
- * @NVME_EG_CRITICAL_WARNING_DEGRADED:
- * @NVME_EG_CRITICAL_WARNING_READ_ONLY:
+ * enum nvme_eg_critical_warning_flags - Endurance Group Information Log - Critical Warning
+ * @NVME_EG_CRITICAL_WARNING_SPARE: Available spare capacity of the Endurance Group
+ * has fallen below the threshold
+ * @NVME_EG_CRITICAL_WARNING_DEGRADED: Endurance Group reliability has been degraded
+ * @NVME_EG_CRITICAL_WARNING_READ_ONLY: Endurance Group have been placed in read only
+ * mode
*/
enum nvme_eg_critical_warning_flags {
NVME_EG_CRITICAL_WARNING_SPARE = 1 << 0,
@@ -3039,7 +3111,7 @@ enum nvme_eg_critical_warning_flags {
};
/**
- * struct nvme_aggregate_endurance_group_event -
+ * struct nvme_aggregate_endurance_group_event - Endurance Group Event Aggregate
* @num_entries: Number or entries
* @entries: List of entries
*/
@@ -3049,7 +3121,7 @@ struct nvme_aggregate_endurance_group_event {
};
/**
- * struct nvme_nvmset_predictable_lat_log -
+ * struct nvme_nvmset_predictable_lat_log - Predictable Latency Mode - Deterministic Threshold Configuration Data
* @status: Status
* @rsvd1: Reserved
* @event_type: Event Type
@@ -3083,10 +3155,10 @@ struct nvme_nvmset_predictable_lat_log {
};
/**
- * enum nvme_nvmeset_pl_status -
- * @NVME_NVMSET_PL_STATUS_DISABLED:
- * @NVME_NVMSET_PL_STATUS_DTWIN:
- * @NVME_NVMSET_PL_STATUS_NDWIN:
+ * enum nvme_nvmeset_pl_status - Predictable Latency Per NVM Set Log - Status
+ * @NVME_NVMSET_PL_STATUS_DISABLED: Not used (Predictable Latency Mode not enabled)
+ * @NVME_NVMSET_PL_STATUS_DTWIN: Deterministic Window (DTWIN)
+ * @NVME_NVMSET_PL_STATUS_NDWIN: Non-Deterministic Window (NDWIN)
*/
enum nvme_nvmeset_pl_status {
NVME_NVMSET_PL_STATUS_DISABLED = 0,
@@ -3095,12 +3167,16 @@ enum nvme_nvmeset_pl_status {
};
/**
- * enum nvme_nvmset_pl_events -
- * @NVME_NVMSET_PL_EVENT_DTWIN_READ_WARN:
- * @NVME_NVMSET_PL_EVENT_DTWIN_WRITE_WARN:
- * @NVME_NVMSET_PL_EVENT_DTWIN_TIME_WARN:
- * @NVME_NVMSET_PL_EVENT_DTWIN_EXCEEDED:
- * @NVME_NVMSET_PL_EVENT_DTWIN_EXCURSION:
+ * enum nvme_nvmset_pl_events - Predictable Latency Per NVM Set Log - Event Type
+ * @NVME_NVMSET_PL_EVENT_DTWIN_READ_WARN: DTWIN Reads Warning
+ * @NVME_NVMSET_PL_EVENT_DTWIN_WRITE_WARN: DTWIN Writes Warning
+ * @NVME_NVMSET_PL_EVENT_DTWIN_TIME_WARN: DTWIN Time Warning
+ * @NVME_NVMSET_PL_EVENT_DTWIN_EXCEEDED: Autonomous transition from DTWIN
+ * to NDWIN due to typical or
+ * maximum value exceeded
+ * @NVME_NVMSET_PL_EVENT_DTWIN_EXCURSION: Autonomous transition from DTWIN
+ * to NDWIN due to Deterministic
+ * Excursion
*/
enum nvme_nvmset_pl_events {
NVME_NVMSET_PL_EVENT_DTWIN_READ_WARN = 1 << 0,
@@ -3111,7 +3187,7 @@ enum nvme_nvmset_pl_events {
};
/**
- * struct nvme_aggregate_predictable_lat_event -
+ * struct nvme_aggregate_predictable_lat_event - Predictable Latency Event Aggregate Log Page
* @num_entries: Number of entries
* @entries: Entry list
*/
@@ -3121,7 +3197,7 @@ struct nvme_aggregate_predictable_lat_event {
};
/**
- * struct nvme_ana_group_desc -
+ * struct nvme_ana_group_desc - ANA Group Descriptor
* @grpid: ANA group id
* @nnsids: Number of namespaces in @nsids
* @chgcnt: Change counter
@@ -3130,21 +3206,21 @@ struct nvme_aggregate_predictable_lat_event {
* @nsids: List of namespaces
*/
struct nvme_ana_group_desc {
- __le32 grpid;
- __le32 nnsids;
- __le64 chgcnt;
- __u8 state;
- __u8 rsvd17[15];
- __le32 nsids[];
+ __le32 grpid;
+ __le32 nnsids;
+ __le64 chgcnt;
+ __u8 state;
+ __u8 rsvd17[15];
+ __le32 nsids[];
};
/**
- * enum nvme_ana_state -
- * @NVME_ANA_STATE_OPTIMIZED:
- * @NVME_ANA_STATE_NONOPTIMIZED:
- * @NVME_ANA_STATE_INACCESSIBLE:
- * @NVME_ANA_STATE_PERSISTENT_LOSS:
- * @NVME_ANA_STATE_CHANGE:
+ * enum nvme_ana_state - ANA Group Descriptor - Asymmetric Namespace Access State
+ * @NVME_ANA_STATE_OPTIMIZED: ANA Optimized state
+ * @NVME_ANA_STATE_NONOPTIMIZED: ANA Non-Optimized state
+ * @NVME_ANA_STATE_INACCESSIBLE: ANA Inaccessible state
+ * @NVME_ANA_STATE_PERSISTENT_LOSS: ANA Persistent Loss state
+ * @NVME_ANA_STATE_CHANGE: ANA Change state
*/
enum nvme_ana_state {
NVME_ANA_STATE_OPTIMIZED = 0x1,
@@ -3155,7 +3231,7 @@ enum nvme_ana_state {
};
/**
- * struct nvme_ana_log -
+ * struct nvme_ana_log - Asymmetric Namespace Access Log
* @chgcnt: Change Count
* @ngrps: Number of ANA Group Descriptors
* @rsvd10: Reserved
@@ -3169,7 +3245,7 @@ struct nvme_ana_log {
};
/**
- * struct nvme_persistent_event_log -
+ * struct nvme_persistent_event_log - Persistent Event Log
* @lid: Log Identifier
* @rsvd1: Reserved
* @tnev: Total Number of Events
@@ -3206,14 +3282,14 @@ struct nvme_persistent_event_log {
char sn[20];
char mn[40];
char subnqn[NVME_NQN_LENGTH];
- __le16 gen_number;
- __le32 rci;
- __u8 rsvd378[102];
+ __le16 gen_number;
+ __le32 rci;
+ __u8 rsvd378[102];
__u8 seb[32];
} __attribute__((packed));
/**
- * struct nvme_persistent_event_entry -
+ * struct nvme_persistent_event_entry - Persistent Event
* @etype: Event Type
* @etype_rev: Event Type Revision
* @ehl: Event Header Length
@@ -3239,39 +3315,39 @@ struct nvme_persistent_event_entry {
} __attribute__((packed));
/**
- * enum nvme_persistent_event_types -
- * @NVME_PEL_SMART_HEALTH_EVENT:
- * @NVME_PEL_FW_COMMIT_EVENT:
- * @NVME_PEL_TIMESTAMP_EVENT:
- * @NVME_PEL_POWER_ON_RESET_EVENT:
- * @NVME_PEL_NSS_HW_ERROR_EVENT:
- * @NVME_PEL_CHANGE_NS_EVENT:
- * @NVME_PEL_FORMAT_START_EVENT:
- * @NVME_PEL_FORMAT_COMPLETION_EVENT:
- * @NVME_PEL_SANITIZE_START_EVENT:
- * @NVME_PEL_SANITIZE_COMPLETION_EVENT:
- * @NVME_PEL_SET_FEATURE_EVENT:
- * @NVME_PEL_TELEMETRY_CRT:
- * @NVME_PEL_THERMAL_EXCURSION_EVENT:
+ * enum nvme_persistent_event_types - Persistent event log events
+ * @NVME_PEL_SMART_HEALTH_EVENT: SMART / Health Log Snapshot Event
+ * @NVME_PEL_FW_COMMIT_EVENT: Firmware Commit Event
+ * @NVME_PEL_TIMESTAMP_EVENT: Timestamp Change Event
+ * @NVME_PEL_POWER_ON_RESET_EVENT: Power-on or Reset Event
+ * @NVME_PEL_NSS_HW_ERROR_EVENT: NVM Subsystem Hardware Error Event
+ * @NVME_PEL_CHANGE_NS_EVENT: Change Namespace Event
+ * @NVME_PEL_FORMAT_START_EVENT: Format NVM Start Event
+ * @NVME_PEL_FORMAT_COMPLETION_EVENT: Format NVM Completion Event
+ * @NVME_PEL_SANITIZE_START_EVENT: Sanitize Start Event
+ * @NVME_PEL_SANITIZE_COMPLETION_EVENT: Sanitize Completion Event
+ * @NVME_PEL_SET_FEATURE_EVENT: Set Feature Event
+ * @NVME_PEL_TELEMETRY_CRT: Telemetry Log Create Event
+ * @NVME_PEL_THERMAL_EXCURSION_EVENT: Thermal Excursion Event
*/
enum nvme_persistent_event_types {
- NVME_PEL_SMART_HEALTH_EVENT = 0x01,
- NVME_PEL_FW_COMMIT_EVENT = 0x02,
- NVME_PEL_TIMESTAMP_EVENT = 0x03,
- NVME_PEL_POWER_ON_RESET_EVENT = 0x04,
- NVME_PEL_NSS_HW_ERROR_EVENT = 0x05,
- NVME_PEL_CHANGE_NS_EVENT = 0x06,
- NVME_PEL_FORMAT_START_EVENT = 0x07,
- NVME_PEL_FORMAT_COMPLETION_EVENT = 0x08,
- NVME_PEL_SANITIZE_START_EVENT = 0x09,
- NVME_PEL_SANITIZE_COMPLETION_EVENT = 0x0a,
- NVME_PEL_SET_FEATURE_EVENT = 0x0b,
- NVME_PEL_TELEMETRY_CRT = 0x0c,
- NVME_PEL_THERMAL_EXCURSION_EVENT = 0x0d,
-};
-
-/**
- * struct nvme_fw_commit_event -
+ NVME_PEL_SMART_HEALTH_EVENT = 0x01,
+ NVME_PEL_FW_COMMIT_EVENT = 0x02,
+ NVME_PEL_TIMESTAMP_EVENT = 0x03,
+ NVME_PEL_POWER_ON_RESET_EVENT = 0x04,
+ NVME_PEL_NSS_HW_ERROR_EVENT = 0x05,
+ NVME_PEL_CHANGE_NS_EVENT = 0x06,
+ NVME_PEL_FORMAT_START_EVENT = 0x07,
+ NVME_PEL_FORMAT_COMPLETION_EVENT = 0x08,
+ NVME_PEL_SANITIZE_START_EVENT = 0x09,
+ NVME_PEL_SANITIZE_COMPLETION_EVENT = 0x0a,
+ NVME_PEL_SET_FEATURE_EVENT = 0x0b,
+ NVME_PEL_TELEMETRY_CRT = 0x0c,
+ NVME_PEL_THERMAL_EXCURSION_EVENT = 0x0d,
+};
+
+/**
+ * struct nvme_fw_commit_event - Firmware Commit Event Data
* @old_fw_rev: Old Firmware Revision
* @new_fw_rev: New Firmware Revision
* @fw_commit_action: Firmware Commit Action
@@ -3282,26 +3358,26 @@ enum nvme_persistent_event_types {
*/
struct nvme_fw_commit_event {
__le64 old_fw_rev;
- __le64 new_fw_rev;
- __u8 fw_commit_action;
- __u8 fw_slot;
- __u8 sct_fw;
- __u8 sc_fw;
- __le16 vndr_assign_fw_commit_rc;
+ __le64 new_fw_rev;
+ __u8 fw_commit_action;
+ __u8 fw_slot;
+ __u8 sct_fw;
+ __u8 sc_fw;
+ __le16 vndr_assign_fw_commit_rc;
} __attribute__((packed));
/**
- * struct nvme_time_stamp_change_event -
+ * struct nvme_time_stamp_change_event - Timestamp Change Event
* @previous_timestamp: Previous Timestamp
* @ml_secs_since_reset: Milliseconds Since Reset
*/
struct nvme_time_stamp_change_event {
- __le64 previous_timestamp;
- __le64 ml_secs_since_reset;
+ __le64 previous_timestamp;
+ __le64 ml_secs_since_reset;
};
/**
- * struct nvme_power_on_reset_info_list -
+ * struct nvme_power_on_reset_info_list - Controller Reset Information
* @cid: Controller ID
* @fw_act: Firmware Activation
* @op_in_prog: Operation in Progress
@@ -3311,29 +3387,29 @@ struct nvme_time_stamp_change_event {
* @ctrl_time_stamp: Controller Timestamp
*/
struct nvme_power_on_reset_info_list {
- __le16 cid;
- __u8 fw_act;
- __u8 op_in_prog;
- __u8 rsvd4[12];
- __le32 ctrl_power_cycle;
- __le64 power_on_ml_seconds;
- __le64 ctrl_time_stamp;
+ __le16 cid;
+ __u8 fw_act;
+ __u8 op_in_prog;
+ __u8 rsvd4[12];
+ __le32 ctrl_power_cycle;
+ __le64 power_on_ml_seconds;
+ __le64 ctrl_time_stamp;
} __attribute__((packed));
/**
- * struct nvme_nss_hw_err_event -
+ * struct nvme_nss_hw_err_event - NVM Subsystem Hardware Error Event
* @nss_hw_err_event_code: NVM Subsystem Hardware Error Event Code
* @rsvd2: Reserved
* @add_hw_err_info: Additional Hardware Error Information
*/
struct nvme_nss_hw_err_event {
- __le16 nss_hw_err_event_code;
- __u8 rsvd2[2];
- __u8 *add_hw_err_info;
+ __le16 nss_hw_err_event_code;
+ __u8 rsvd2[2];
+ __u8 *add_hw_err_info;
};
/**
- * struct nvme_change_ns_event -
+ * struct nvme_change_ns_event - Change Namespace Event Data
* @nsmgt_cdw10: Namespace Management CDW10
* @rsvd4: Reserved
* @nsze: Namespace Size
@@ -3365,21 +3441,21 @@ struct nvme_change_ns_event {
};
/**
- * struct nvme_format_nvm_start_event -
+ * struct nvme_format_nvm_start_event - Format NVM Start Event Data
* @nsid: Namespace Identifier
* @fna: Format NVM Attributes
* @rsvd5: Reserved
* @format_nvm_cdw10: Format NVM CDW10
*/
struct nvme_format_nvm_start_event {
- __le32 nsid;
- __u8 fna;
- __u8 rsvd5[3];
- __le32 format_nvm_cdw10;
+ __le32 nsid;
+ __u8 fna;
+ __u8 rsvd5[3];
+ __le32 format_nvm_cdw10;
};
/**
- * struct nvme_format_nvm_compln_event -
+ * struct nvme_format_nvm_compln_event - Format NVM Completion Event Data
* @nsid: Namespace Identifier
* @smallest_fpi: Smallest Format Progress Indicator
* @format_nvm_status: Format NVM Status
@@ -3387,27 +3463,27 @@ struct nvme_format_nvm_start_event {
* @status_field: Status Field
*/
struct nvme_format_nvm_compln_event {
- __le32 nsid;
- __u8 smallest_fpi;
- __u8 format_nvm_status;
- __le16 compln_info;
- __le32 status_field;
+ __le32 nsid;
+ __u8 smallest_fpi;
+ __u8 format_nvm_status;
+ __le16 compln_info;
+ __le32 status_field;
};
/**
- * struct nvme_sanitize_start_event -
+ * struct nvme_sanitize_start_event - Sanitize Start Event Data
* @sani_cap: SANICAP
* @sani_cdw10: Sanitize CDW10
* @sani_cdw11: Sanitize CDW11
*/
struct nvme_sanitize_start_event {
- __le32 sani_cap;
- __le32 sani_cdw10;
- __le32 sani_cdw11;
+ __le32 sani_cap;
+ __le32 sani_cdw10;
+ __le32 sani_cdw11;
};
/**
- * struct nvme_sanitize_compln_event -
+ * struct nvme_sanitize_compln_event - Sanitize Completion Event Data
* @sani_prog: Sanitize Progress
* @sani_status: Sanitize Status
* @cmpln_info: Completion Information
@@ -3421,7 +3497,7 @@ struct nvme_sanitize_compln_event {
};
/**
- * struct nvme_set_feature_event -
+ * struct nvme_set_feature_event - Set Feature Event Data
* @layout: Set Feature Event Layout
* @cdw_mem: Command Dwords Memory buffer
*/
@@ -3431,17 +3507,17 @@ struct nvme_set_feature_event {
};
/**
- * struct nvme_thermal_exc_event -
+ * struct nvme_thermal_exc_event - Thermal Excursion Event Data
* @over_temp: Over Temperature
* @threshold: temperature threshold
*/
struct nvme_thermal_exc_event {
- __u8 over_temp;
- __u8 threshold;
+ __u8 over_temp;
+ __u8 threshold;
};
/**
- * struct nvme_lba_rd -
+ * struct nvme_lba_rd - LBA Range Descriptor
* @rslba: Range Starting LBA
* @rnlb: Range Number of Logical Blocks
* @rsvd12: Reserved
@@ -3453,10 +3529,10 @@ struct nvme_lba_rd {
};
/**
- * struct nvme_lbas_ns_element -
+ * struct nvme_lbas_ns_element - LBA Status Log Namespace Element
* @neid: Namespace Element Identifier
* @nlrd: Number of LBA Range Descriptors
- * @ratype: Recommended Action Type
+ * @ratype: Recommended Action Type. see @enum nvme_lba_status_atype
* @rsvd8: Reserved
* @lba_rd: LBA Range Descriptor
*/
@@ -3469,9 +3545,10 @@ struct nvme_lbas_ns_element {
};
/**
- * enum nvme_lba_status_atype -
- * @NVME_LBA_STATUS_ATYPE_SCAN_UNTRACKED:
- * @NVME_LBA_STATUS_ATYPE_SCAN_TRACKED:
+ * enum nvme_lba_status_atype - Potentially Unrecoverable LBAs
+ * @NVME_LBA_STATUS_ATYPE_SCAN_UNTRACKED: Potentially Unrecoverable LBAs
+ * @NVME_LBA_STATUS_ATYPE_SCAN_TRACKED: Potentially Unrecoverable LBAs
+ * associated with physical storage
*/
enum nvme_lba_status_atype {
NVME_LBA_STATUS_ATYPE_SCAN_UNTRACKED = 0x10,
@@ -3479,7 +3556,7 @@ enum nvme_lba_status_atype {
};
/**
- * struct nvme_lba_status_log -
+ * struct nvme_lba_status_log - LBA Status Information Log
* @lslplen: LBA Status Log Page Length
* @nlslne: Number of LBA Status Log Namespace Elements
* @estulb: Estimate of Unrecoverable Logical Blocks
@@ -3497,7 +3574,7 @@ struct nvme_lba_status_log {
};
/**
- * struct nvme_eg_event_aggregate_log -
+ * struct nvme_eg_event_aggregate_log - Endurance Group Event Aggregate
* @nr_entries: Number of Entries
* @egids: Endurance Group Identifier
*/
@@ -3507,23 +3584,21 @@ struct nvme_eg_event_aggregate_log {
};
/**
- * enum nvme_fid_supported_effects -
- * @NVME_FID_SUPPORTED_EFFECTS_FSUPP:
- * @NVME_FID_SUPPORTED_EFFECTS_UDCC:
- * @NVME_FID_SUPPORTED_EFFECTS_NCC:
- * @NVME_FID_SUPPORTED_EFFECTS_NIC:
- * @NVME_FID_SUPPORTED_EFFECTS_CCC:
- * @NVME_FID_SUPPORTED_EFFECTS_UUID_SEL:
- * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_SHIFT:
- * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_MASK:
- * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_NS:
- * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_CTRL:
- * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_NVM_SET:
- * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_ENDGRP:
- * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_DOMAIN:
- * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_NSS:
- *
- * FID Supported and Effects Data Structure definitions
+ * enum nvme_fid_supported_effects - FID Supported and Effects Data Structure definitions
+ * @NVME_FID_SUPPORTED_EFFECTS_FSUPP: FID Supported
+ * @NVME_FID_SUPPORTED_EFFECTS_UDCC: User Data Content Change
+ * @NVME_FID_SUPPORTED_EFFECTS_NCC: Namespace Capability Change
+ * @NVME_FID_SUPPORTED_EFFECTS_NIC: Namespace Inventory Change
+ * @NVME_FID_SUPPORTED_EFFECTS_CCC: Controller Capability Change
+ * @NVME_FID_SUPPORTED_EFFECTS_UUID_SEL: UUID Selection Supported
+ * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_SHIFT: FID Scope Shift
+ * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_MASK: FID Scope Mask
+ * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_NS: Namespace Scope
+ * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_CTRL: Controller Scope
+ * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_NVM_SET: NVM Set Scope
+ * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_ENDGRP: Endurance Group Scope
+ * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_DOMAIN: Domain Scope
+ * @NVME_FID_SUPPORTED_EFFECTS_SCOPE_NSS: NVM Subsystem Scope
*/
enum nvme_fid_supported_effects {
NVME_FID_SUPPORTED_EFFECTS_FSUPP = 1 << 0,
@@ -3543,19 +3618,18 @@ enum nvme_fid_supported_effects {
};
/**
- * struct nvme_fid_supported_effects_log -
+ * struct nvme_fid_supported_effects_log - Feature Identifiers Supported and Effects
* @fid_support: Feature Identifier Supported
*
- * Feature Identifiers Supported and Effects (Log Identifier 12h)
*/
struct nvme_fid_supported_effects_log {
__le32 fid_support[NVME_LOG_FID_SUPPORTED_EFFECTS_MAX];
};
/**
- * enum nvme_mi_cmd_supported_effects - bit field definitions
+ * enum nvme_mi_cmd_supported_effects - MI Command Supported and Effects Data Structure
* @NVME_MI_CMD_SUPPORTED_EFFECTS_CSUPP: Command Supported
- * @NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC: User Data Conttent Change
+ * @NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC: User Data Content Change
* @NVME_MI_CMD_SUPPORTED_EFFECTS_NCC: Namespace Capability Change
* @NVME_MI_CMD_SUPPORTED_EFFECTS_NIC: Namespace Inventory Change
* @NVME_MI_CMD_SUPPORTED_EFFECTS_CCC: Controller Capability Change
@@ -3567,30 +3641,27 @@ struct nvme_fid_supported_effects_log {
* @NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_ENDGRP: Endurance Group Scope
* @NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_DOMAIN: Domain Scope
* @NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NSS: NVM Subsystem Scope
- *
- * MI Command Supported and Effects Data Structure definitions
*/
enum nvme_mi_cmd_supported_effects {
- NVME_MI_CMD_SUPPORTED_EFFECTS_CSUPP = 1 << 0,
- NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC = 1 << 1,
- NVME_MI_CMD_SUPPORTED_EFFECTS_NCC = 1 << 2,
- NVME_MI_CMD_SUPPORTED_EFFECTS_NIC = 1 << 3,
- NVME_MI_CMD_SUPPORTED_EFFECTS_CCC = 1 << 4,
+ NVME_MI_CMD_SUPPORTED_EFFECTS_CSUPP = 1 << 0,
+ NVME_MI_CMD_SUPPORTED_EFFECTS_UDCC = 1 << 1,
+ NVME_MI_CMD_SUPPORTED_EFFECTS_NCC = 1 << 2,
+ NVME_MI_CMD_SUPPORTED_EFFECTS_NIC = 1 << 3,
+ NVME_MI_CMD_SUPPORTED_EFFECTS_CCC = 1 << 4,
NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_SHIFT = 20,
NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_MASK = 0xfff,
- NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NS = 1 << 0,
+ NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NS = 1 << 0,
NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_CTRL = 1 << 1,
NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NVM_SET = 1 << 2,
NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_ENDGRP = 1 << 3,
NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_DOMAIN = 1 << 4,
- NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NSS = 1 << 5,
+ NVME_MI_CMD_SUPPORTED_EFFECTS_SCOPE_NSS = 1 << 5,
};
/**
- * struct nvme_mi_cmd_supported_effects_log -
- * @mi_cmd_support: NVMe-MI Commands Supported
- *
- * NVMe-MI Commands Supported and Effects (Log Identifier 13h)
+ * struct nvme_mi_cmd_supported_effects_log - NVMe-MI Commands Supported and Effects Log
+ * @mi_cmd_support: NVMe-MI Commands Supported
+ * @reserved1: Reserved
*/
struct nvme_mi_cmd_supported_effects_log {
__le32 mi_cmd_support[NVME_LOG_MI_CMD_SUPPORTED_EFFECTS_MAX];
@@ -3598,13 +3669,13 @@ struct nvme_mi_cmd_supported_effects_log {
};
/**
- * struct nvme_boot_partition -
+ * struct nvme_boot_partition - Boot Partition Log
* @lid: Boot Partition Identifier
* @rsvd1: Reserved
* @bpinfo: Boot Partition Information
* @rsvd8: Reserved
* @boot_partition_data: Contains the contents of the
- * specified Boot Partition
+ * specified Boot Partition
*/
struct nvme_boot_partition {
__u8 lid;
@@ -3615,16 +3686,16 @@ struct nvme_boot_partition {
};
/**
- * struct nvme_media_unit_stat_desc -
- * @muid: Media Unit Identifier
- * @domainid: Domain Identifier
- * @endgid: Endurance Group Identifier
- * @nvmsetid: NVM Set Identifier
+ * struct nvme_media_unit_stat_desc - Media Unit Status Descriptor
+ * @muid: Media Unit Identifier
+ * @domainid: Domain Identifier
+ * @endgid: Endurance Group Identifier
+ * @nvmsetid: NVM Set Identifier
* @cap_adj_fctr: Capacity Adjustment Factor
- * @avl_spare: Available Spare
+ * @avl_spare: Available Spare
* @percent_used: Percentage Used
- * @mucs: Number of Channels attached to media units
- * @cio: Channel Identifiers Offset
+ * @mucs: Number of Channels attached to media units
+ * @cio: Channel Identifiers Offset
*/
struct nvme_media_unit_stat_desc {
__le16 muid;
@@ -3639,12 +3710,12 @@ struct nvme_media_unit_stat_desc {
};
/**
- * struct nvme_media_unit_stat_log -
- * @nmu: Number unit status descriptor
- * @cchans: Number of Channels
+ * struct nvme_media_unit_stat_log - Media Unit Status
+ * @nmu: Number unit status descriptor
+ * @cchans: Number of Channels
* @sel_config: Selected Configuration
- * @rsvd6: Reserved
- * @mus_desc: Media unit statistic descriptors
+ * @rsvd6: Reserved
+ * @mus_desc: Media unit statistic descriptors
*/
struct nvme_media_unit_stat_log {
__le16 nmu;
@@ -3655,12 +3726,10 @@ struct nvme_media_unit_stat_log {
};
/**
- * struct nvme_media_unit_config_desc -
- * @muid: Media Unit Identifier
- * @mudl: Media Unit Descriptor Length
- *
- * Media Unit Configuration Descriptor
- * Structure Definitions
+ * struct nvme_media_unit_config_desc - Media Unit Configuration Descriptor
+ * @muid: Media Unit Identifier
+ * @rsvd2: Reserved
+ * @mudl: Media Unit Descriptor Length
*/
struct nvme_media_unit_config_desc {
__le16 muid;
@@ -3669,12 +3738,11 @@ struct nvme_media_unit_config_desc {
};
/**
- * struct nvme_channel_config_desc -
- * @chanid: Channel Identifier
- * @chmus: Number Channel Media Units
- *
- * Channel Configuration Descriptor
- * Structure Definitions
+ * struct nvme_channel_config_desc - Channel Configuration Descriptor
+ * @chanid: Channel Identifier
+ * @chmus: Number Channel Media Units
+ * @mu_config_desc: Channel Unit config descriptors.
+ * See @struct nvme_media_unit_config_desc
*/
struct nvme_channel_config_desc {
__le16 chanid;
@@ -3683,11 +3751,10 @@ struct nvme_channel_config_desc {
};
/**
- * struct nvme_end_grp_chan_desc -
- * @egchans: Number of Channels
- *
- * Endurance group Channel Configuration Descriptor
- * Structure Definitions
+ * struct nvme_end_grp_chan_desc - Endurance Group Channel Configuration Descriptor
+ * @egchans: Number of Channels
+ * @chan_config_desc: Channel config descriptors.
+ * See @struct nvme_channel_config_desc
*/
struct nvme_end_grp_chan_desc {
__le16 egchans;
@@ -3695,17 +3762,16 @@ struct nvme_end_grp_chan_desc {
};
/**
- * struct nvme_end_grp_config_desc -
+ * struct nvme_end_grp_config_desc - Endurance Group Configuration Descriptor
* @endgid: Endurance Group Identifier
* @cap_adj_factor: Capacity Adjustment Factor
+ * @rsvd4: Reserved
* @tegcap: Total Endurance Group Capacity
* @segcap: Spare Endurance Group Capacity
* @end_est: Endurance Estimate
* @egsets: Number of NVM Sets
+ * @rsvd64: Reserved
* @nvmsetid: NVM Set Identifier
- *
- * Endurance Group Configuration Descriptor
- * Structure Definitions
*/
struct nvme_end_grp_config_desc {
__le16 endgid;
@@ -3720,13 +3786,14 @@ struct nvme_end_grp_config_desc {
};
/**
- * struct nvme_cap_config_desc -
+ * struct nvme_capacity_config_desc - Capacity Configuration structure definitions
* @cap_config_id: Capacity Configuration Identifier
* @domainid: Domain Identifier
* @egcn: Number Endurance Group Configuration
* Descriptors
- *
- * Capacity Configuration structure definitions
+ * @rsvd6: Reserved
+ * @egcd: Endurance Group Config descriptors.
+ * See @struct nvme_end_grp_config_desc
*/
struct nvme_capacity_config_desc {
__le16 cap_config_id;
@@ -3737,11 +3804,11 @@ struct nvme_capacity_config_desc {
};
/**
- * struct nvme_supported_cap_config_list_log -
- * @sccn: number of capacity configuration
- *
- * Supported Capacity Configuration list log page
- * structure definitions
+ * struct nvme_supported_cap_config_list_log - Supported Capacity Configuration list log page
+ * @sccn: Number of capacity configuration
+ * @rsvd1: Reserved
+ * @cap_config_desc: Capacity configuration descriptor.
+ * See @struct nvme_capacity_config_desc
*/
struct nvme_supported_cap_config_list_log {
__u8 sccn;
@@ -3750,7 +3817,7 @@ struct nvme_supported_cap_config_list_log {
};
/**
- * struct nvme_resv_notification_log -
+ * struct nvme_resv_notification_log - Reservation Notification Log
* @lpc: Log Page Count
* @rnlpt: See &enum nvme_resv_notify_rnlpt.
* @nalp: Number of Available Log Pages
@@ -3768,11 +3835,11 @@ struct nvme_resv_notification_log {
};
/**
- * enum nvme_resv_notify_rnlpt -
- * @NVME_RESV_NOTIFY_RNLPT_EMPTY:
- * @NVME_RESV_NOTIFY_RNLPT_REGISTRATION_PREEMPTED:
- * @NVME_RESV_NOTIFY_RNLPT_RESERVATION_RELEASED:
- * @NVME_RESV_NOTIFY_RNLPT_RESERVATION_PREEMPTED:
+ * enum nvme_resv_notify_rnlpt - Reservation Notification Log - Reservation Notification Log Page Type
+ * @NVME_RESV_NOTIFY_RNLPT_EMPTY: Empty Log Page
+ * @NVME_RESV_NOTIFY_RNLPT_REGISTRATION_PREEMPTED: Registration Preempted
+ * @NVME_RESV_NOTIFY_RNLPT_RESERVATION_RELEASED: Reservation Released
+ * @NVME_RESV_NOTIFY_RNLPT_RESERVATION_PREEMPTED: Reservation Preempted
*/
enum nvme_resv_notify_rnlpt {
NVME_RESV_NOTIFY_RNLPT_EMPTY = 0,
@@ -3784,70 +3851,70 @@ enum nvme_resv_notify_rnlpt {
/**
* struct nvme_sanitize_log_page - Sanitize Status (Log Identifier 81h)
* @sprog: Sanitize Progress (SPROG): indicates the fraction complete of the
- * sanitize operation. The value is a numerator of the fraction
- * complete that has 65,536 (10000h) as its denominator. This value
- * shall be set to FFFFh if the @sstat field is not set to
- * %NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS.
+ * sanitize operation. The value is a numerator of the fraction
+ * complete that has 65,536 (10000h) as its denominator. This value
+ * shall be set to FFFFh if the @sstat field is not set to
+ * %NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS.
* @sstat: Sanitize Status (SSTAT): indicates the status associated with
- * the most recent sanitize operation. See &enum nvme_sanitize_sstat.
+ * the most recent sanitize operation. See &enum nvme_sanitize_sstat.
* @scdw10: Sanitize Command Dword 10 Information (SCDW10): contains the value
- * of the Command Dword 10 field of the Sanitize command that started
- * the sanitize operation.
+ * of the Command Dword 10 field of the Sanitize command that started
+ * the sanitize operation.
* @eto: Estimated Time For Overwrite: indicates the number of seconds required
- * to complete an Overwrite sanitize operation with 16 passes in
- * the background when the No-Deallocate Modifies Media After Sanitize
- * field is not set to 10b. A value of 0h indicates that the sanitize
- * operation is expected to be completed in the background when the
- * Sanitize command that started that operation is completed. A value
- * of FFFFFFFFh indicates that no time period is reported.
+ * to complete an Overwrite sanitize operation with 16 passes in
+ * the background when the No-Deallocate Modifies Media After Sanitize
+ * field is not set to 10b. A value of 0h indicates that the sanitize
+ * operation is expected to be completed in the background when the
+ * Sanitize command that started that operation is completed. A value
+ * of FFFFFFFFh indicates that no time period is reported.
* @etbe: Estimated Time For Block Erase: indicates the number of seconds
- * required to complete a Block Erase sanitize operation in the
- * background when the No-Deallocate Modifies Media After Sanitize
- * field is not set to 10b. A value of 0h indicates that the sanitize
- * operation is expected to be completed in the background when the
- * Sanitize command that started that operation is completed.
- * A value of FFFFFFFFh indicates that no time period is reported.
+ * required to complete a Block Erase sanitize operation in the
+ * background when the No-Deallocate Modifies Media After Sanitize
+ * field is not set to 10b. A value of 0h indicates that the sanitize
+ * operation is expected to be completed in the background when the
+ * Sanitize command that started that operation is completed.
+ * A value of FFFFFFFFh indicates that no time period is reported.
* @etce: Estimated Time For Crypto Erase: indicates the number of seconds
- * required to complete a Crypto Erase sanitize operation in the
- * background when the No-Deallocate Modifies Media After Sanitize
- * field is not set to 10b. A value of 0h indicates that the sanitize
- * operation is expected to be completed in the background when the
- * Sanitize command that started that operation is completed.
- * A value of FFFFFFFFh indicates that no time period is reported.
+ * required to complete a Crypto Erase sanitize operation in the
+ * background when the No-Deallocate Modifies Media After Sanitize
+ * field is not set to 10b. A value of 0h indicates that the sanitize
+ * operation is expected to be completed in the background when the
+ * Sanitize command that started that operation is completed.
+ * A value of FFFFFFFFh indicates that no time period is reported.
* @etond: Estimated Time For Overwrite With No-Deallocate Media Modification:
- * indicates the number of seconds required to complete an Overwrite
- * sanitize operation and the associated additional media modification
- * after the Overwrite sanitize operation in the background when
- * the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
- * command that requested the Overwrite sanitize operation; and
- * the No-Deallocate Modifies Media After Sanitize field is set to 10b.
- * A value of 0h indicates that the sanitize operation is expected
- * to be completed in the background when the Sanitize command that
- * started that operation is completed. A value of FFFFFFFFh indicates
- * that no time period is reported.
+ * indicates the number of seconds required to complete an Overwrite
+ * sanitize operation and the associated additional media modification
+ * after the Overwrite sanitize operation in the background when
+ * the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ * command that requested the Overwrite sanitize operation; and
+ * the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ * A value of 0h indicates that the sanitize operation is expected
+ * to be completed in the background when the Sanitize command that
+ * started that operation is completed. A value of FFFFFFFFh indicates
+ * that no time period is reported.
* @etbend: Estimated Time For Block Erase With No-Deallocate Media Modification:
- * indicates the number of seconds required to complete a Block Erase
- * sanitize operation and the associated additional media modification
- * after the Block Erase sanitize operation in the background when
- * the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
- * command that requested the Overwrite sanitize operation; and
- * the No-Deallocate Modifies Media After Sanitize field is set to 10b.
- * A value of 0h indicates that the sanitize operation is expected
- * to be completed in the background when the Sanitize command that
- * started that operation is completed. A value of FFFFFFFFh indicates
- * that no time period is reported.
+ * indicates the number of seconds required to complete a Block Erase
+ * sanitize operation and the associated additional media modification
+ * after the Block Erase sanitize operation in the background when
+ * the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ * command that requested the Overwrite sanitize operation; and
+ * the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ * A value of 0h indicates that the sanitize operation is expected
+ * to be completed in the background when the Sanitize command that
+ * started that operation is completed. A value of FFFFFFFFh indicates
+ * that no time period is reported.
* @etcend: Estimated Time For Crypto Erase With No-Deallocate Media Modification:
- * indicates the number of seconds required to complete a Crypto Erase
- * sanitize operation and the associated additional media modification
- * after the Crypto Erase sanitize operation in the background when
- * the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
- * command that requested the Overwrite sanitize operation; and
- * the No-Deallocate Modifies Media After Sanitize field is set to 10b.
- * A value of 0h indicates that the sanitize operation is expected
- * to be completed in the background when the Sanitize command that
- * started that operation is completed. A value of FFFFFFFFh indicates
- * that no time period is reported.
- * @rsvd32: Reserved
+ * indicates the number of seconds required to complete a Crypto Erase
+ * sanitize operation and the associated additional media modification
+ * after the Crypto Erase sanitize operation in the background when
+ * the No-Deallocate After Sanitize bit was set to 1 in the Sanitize
+ * command that requested the Overwrite sanitize operation; and
+ * the No-Deallocate Modifies Media After Sanitize field is set to 10b.
+ * A value of 0h indicates that the sanitize operation is expected
+ * to be completed in the background when the Sanitize command that
+ * started that operation is completed. A value of FFFFFFFFh indicates
+ * that no time period is reported.
+ * @rsvd32: Reserved
*/
struct nvme_sanitize_log_page {
__le16 sprog;
@@ -3865,44 +3932,44 @@ struct nvme_sanitize_log_page {
/**
* enum nvme_sanitize_sstat - Sanitize Status (SSTAT)
* @NVME_SANITIZE_SSTAT_STATUS_SHIFT: Shift amount to get the status value of
- * the most recent sanitize operation from
- * the &struct nvme_sanitize_log_page.sstat
- * field.
+ * the most recent sanitize operation from
+ * the &struct nvme_sanitize_log_page.sstat
+ * field.
* @NVME_SANITIZE_SSTAT_STATUS_MASK: Mask to get the status value of the most
- * recent sanitize operation.
+ * recent sanitize operation.
* @NVME_SANITIZE_SSTAT_STATUS_NEVER_SANITIZED: The NVM subsystem has never been
- * sanitized.
+ * sanitized.
* @NVME_SANITIZE_SSTAT_STATUS_COMPLETE_SUCCESS: The most recent sanitize operation
- * completed successfully including any
- * additional media modification.
+ * completed successfully including any
+ * additional media modification.
* @NVME_SANITIZE_SSTAT_STATUS_IN_PROGESS: A sanitize operation is currently in progress.
* @NVME_SANITIZE_SSTAT_STATUS_COMPLETED_FAILED: The most recent sanitize operation
- * failed.
+ * failed.
* @NVME_SANITIZE_SSTAT_STATUS_ND_COMPLETE_SUCCESS: The most recent sanitize operation
- * for which No-Deallocate After Sanitize was
- * requested has completed successfully with
- * deallocation of all user data.
+ * for which No-Deallocate After Sanitize was
+ * requested has completed successfully with
+ * deallocation of all user data.
* @NVME_SANITIZE_SSTAT_COMPLETED_PASSES_SHIFT: Shift amount to get the number
- * of completed passes if the most recent
- * sanitize operation was an Overwrite. This
- * value shall be cleared to 0h if the most
- * recent sanitize operation was not
- * an Overwrite.
+ * of completed passes if the most recent
+ * sanitize operation was an Overwrite. This
+ * value shall be cleared to 0h if the most
+ * recent sanitize operation was not
+ * an Overwrite.
* @NVME_SANITIZE_SSTAT_COMPLETED_PASSES_MASK: Mask to get the number of completed
- * passes.
+ * passes.
* @NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_SHIFT: Shift amount to get the Global
- * Data Erased value from the
- * &struct nvme_sanitize_log_page.sstat field.
+ * Data Erased value from the
+ * &struct nvme_sanitize_log_page.sstat field.
* @NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED_MASK: Mask to get the Global Data Erased
- * value.
+ * value.
* @NVME_SANITIZE_SSTAT_GLOBAL_DATA_ERASED: Global Data Erased: if set, then no
- * namespace user data in the NVM subsystem
- * has been written to and no Persistent
- * Memory Region in the NVM subsystem has
- * been enabled since being manufactured and
- * the NVM subsystem has never been sanitized;
- * or since the most recent successful sanitize
- * operation.
+ * namespace user data in the NVM subsystem
+ * has been written to and no Persistent
+ * Memory Region in the NVM subsystem has
+ * been enabled since being manufactured and
+ * the NVM subsystem has never been sanitized;
+ * or since the most recent successful sanitize
+ * operation.
*/
enum nvme_sanitize_sstat {
NVME_SANITIZE_SSTAT_STATUS_SHIFT = 0,
@@ -3932,15 +3999,15 @@ struct nvme_zns_changed_zone_log {
};
/**
- * enum nvme_zns_zt -
- * @NVME_ZONE_TYPE_SEQWRITE_REQ:
+ * enum nvme_zns_zt - Zone Descriptor Data Structure - Zone Type
+ * @NVME_ZONE_TYPE_SEQWRITE_REQ: Sequential Write Required
*/
enum nvme_zns_zt {
NVME_ZONE_TYPE_SEQWRITE_REQ = 0x2,
};
/**
- * enum nvme_zns_za -
+ * enum nvme_zns_za - Zone Descriptor Data Structure
* @NVME_ZNS_ZA_ZFC: Zone Finished by Controller
* @NVME_ZNS_ZA_FZR: Finish Zone Recommended
* @NVME_ZNS_ZA_RZR: Reset Zone Recommended
@@ -3956,7 +4023,7 @@ enum nvme_zns_za {
};
/**
- * enum nvme_zns_zs -
+ * enum nvme_zns_zs - Zone Descriptor Data Structure - Zone State
* @NVME_ZNS_ZS_EMPTY: Empty state
* @NVME_ZNS_ZS_IMPL_OPEN: Implicitly open state
* @NVME_ZNS_ZS_EXPL_OPEN: Explicitly open state
@@ -3976,7 +4043,7 @@ enum nvme_zns_zs {
};
/**
- * struct nvme_zns_desc -
+ * struct nvme_zns_desc - Zone Descriptor Data Structure
* @zt: Zone Type
* @zs: Zone State
* @za: Zone Attributes
@@ -4000,7 +4067,7 @@ struct nvme_zns_desc {
};
/**
- * struct nvme_zone_report -
+ * struct nvme_zone_report - Report Zones Data Structure
* @nr_zones: Number of descriptors in @entries
* @rsvd8: Reserved
* @entries: Zoned namespace descriptors
@@ -4012,7 +4079,7 @@ struct nvme_zone_report {
};
/**
- * struct nvme_lba_status_desc -
+ * struct nvme_lba_status_desc - LBA Status Descriptor Entry
* @dslba: Descriptor Starting LBA
* @nlb: Number of Logical Blocks
* @rsvd12: Reserved
@@ -4028,7 +4095,7 @@ struct nvme_lba_status_desc {
};
/**
- * struct nvme_lba_status -
+ * struct nvme_lba_status - LBA Status Descriptor List
* @nlsd: Number of LBA Status Descriptors
* @cmpc: Completion Condition
* @rsvd5: Reserved
@@ -4042,7 +4109,7 @@ struct nvme_lba_status {
};
/**
- * struct nvme_feat_auto_pst -
+ * struct nvme_feat_auto_pst - Autonomous Power State Transition
* @apst_entry: See &enum nvme_apst_entry
*/
struct nvme_feat_auto_pst {
@@ -4050,11 +4117,11 @@ struct nvme_feat_auto_pst {
};
/**
- * enum nvme_apst_entry -
- * @NVME_APST_ENTRY_ITPS_SHIFT:
- * @NVME_APST_ENTRY_ITPT_SHIFT:
- * @NVME_APST_ENTRY_ITPS_MASK:
- * @NVME_APST_ENTRY_ITPT_MASK:
+ * enum nvme_apst_entry - Autonomous Power State Transition
+ * @NVME_APST_ENTRY_ITPS_SHIFT: Idle Transition Power State Shift
+ * @NVME_APST_ENTRY_ITPT_SHIFT: Idle Time Prior to Transition Shift
+ * @NVME_APST_ENTRY_ITPS_MASK: Idle Transition Power State Mask
+ * @NVME_APST_ENTRY_ITPT_MASK: Idle Time Prior to Transition Mask
*/
enum nvme_apst_entry {
NVME_APST_ENTRY_ITPS_SHIFT = 3,
@@ -4109,10 +4176,10 @@ struct nvme_host_metadata {
* pre-boot environment.
* @NVME_CTRL_METADATA_SYS_PROC_MODEL: Model of the processor.
* @NVME_CTRL_METADATA_CHIPSET_DRV_NAME: Chipset driver name.
- * @NVME_CTRL_METADATA_CHIPSET_DRV_VERSION: Chipsset driver version.
+ * @NVME_CTRL_METADATA_CHIPSET_DRV_VERSION: Chipset driver version.
* @NVME_CTRL_METADATA_OS_NAME_AND_BUILD: Operating system name and build.
* @NVME_CTRL_METADATA_SYS_PROD_NAME: System product name.
- * @NVME_CTRL_METADATA_FIRMWARE_VERSION: Host firmware (e.g UEFI) version.
+ * @NVME_CTRL_METADATA_FIRMWARE_VERSION: Host firmware (e.g UEFI) version.
* @NVME_CTRL_METADATA_OS_DRIVER_FILENAME: Operating system driver filename.
* @NVME_CTRL_METADATA_DISPLAY_DRV_NAME: Display driver name.
* @NVME_CTRL_METADATA_DISPLAY_DRV_VERSION: Display driver version.
@@ -4139,7 +4206,7 @@ enum nvme_ctrl_metadata_type {
/**
* enum nvme_ns_metadata_type - Namespace Metadata Element Types
- * @NVME_NS_METADATA_OS_NS_NAME: Name of the namespace in the the
+ * @NVME_NS_METADATA_OS_NS_NAME: Name of the namespace in the
* operating system
* @NVME_NS_METADATA_PRE_BOOT_NS_NAME: Name of the namespace in the pre-boot
* environment.
@@ -4156,7 +4223,7 @@ enum nvme_ns_metadata_type {
};
/**
- * struct nvme_timestamp -
+ * struct nvme_timestamp - Timestamp - Data Structure for Get Features
* @timestamp: Timestamp value based on origin and synch field
* @attr: Attribute
* @rsvd: Reserved
@@ -4168,7 +4235,7 @@ struct nvme_timestamp {
};
/**
- * struct nvme_lba_range_type_entry -
+ * struct nvme_lba_range_type_entry - LBA Range Type - Data Structure Entry
* @type: Specifies the Type of the LBA range
* @attributes: Specifies attributes of the LBA range
* @rsvd2: Reserved
@@ -4188,7 +4255,7 @@ struct nvme_lba_range_type_entry {
};
/**
- * enum nvme_lbart -
+ * enum nvme_lbart - LBA Range Type - Data Structure Entry
* @NVME_LBART_TYPE_GP: General Purpose
* @NVME_LBART_TYPE_FS: Filesystem
* @NVME_LBART_TYPE_RAID: RAID
@@ -4208,15 +4275,15 @@ enum nvme_lbart {
};
/**
- * struct nvme_lba_range_type -
- * @entry: LBA range type entry
+ * struct nvme_lba_range_type - LBA Range Type
+ * @entry: LBA range type entry. See @struct nvme_lba_range_type_entry
*/
struct nvme_lba_range_type {
struct nvme_lba_range_type_entry entry[NVME_FEAT_LBA_RANGE_MAX];
};
/**
- * struct nvme_plm_config -
+ * struct nvme_plm_config - Predictable Latency Mode - Deterministic Threshold Configuration Data Structure
* @ee: Enable Event
* @rsvd2: Reserved
* @dtwinrt: DTWIN Reads Threshold
@@ -4234,7 +4301,7 @@ struct nvme_plm_config {
};
/**
- * struct nvme_feat_host_behavior -
+ * struct nvme_feat_host_behavior - Host Behavior Support - Data Structure
* @acre: Advanced Command Retry Enable
* @rsvd1: Reserved
*/
@@ -4244,15 +4311,15 @@ struct nvme_feat_host_behavior {
};
/**
- * enum nvme_host_behavior_support -
+ * enum nvme_host_behavior_support - Enable Advanced Command
* @NVME_ENABLE_ACRE: Enable Advanced Command Retry Enable
*/
enum nvme_host_behavior_support {
- NVME_ENABLE_ACRE = 1 << 0,
+ NVME_ENABLE_ACRE = 1 << 0,
};
/**
- * struct nvme_dsm_range -
+ * struct nvme_dsm_range - Dataset Management - Range Definition
* @cattr: Context Attributes
* @nlb: Length in logical blocks
* @slba: Starting LBA
@@ -4264,12 +4331,13 @@ struct nvme_dsm_range {
};
/**
- * struct nvme_copy_range -
+ * struct nvme_copy_range - Copy - Source Range Entries Descriptor Format
* @rsvd0: Reserved
* @slba: Starting LBA
* @nlb: Number of Logical Blocks
* @rsvd18: Reserved
- * @eilbrt: Expected Initial Logical Block Reference Tag
+ * @eilbrt: Expected Initial Logical Block Reference Tag /
+ * Expected Logical Block Storage Tag
* @elbatm: Expected Logical Block Application Tag Mask
* @elbat: Expected Logical Block Application Tag
*/
@@ -4284,7 +4352,28 @@ struct nvme_copy_range {
};
/**
- * struct nvme_registered_ctrl -
+ * struct nvme_copy_range_f1 - Copy - Source Range Entries Descriptor Format 1h
+ * @rsvd0: Reserved
+ * @slba: Starting LBA
+ * @nlb: Number of Logical Blocks
+ * @rsvd18: Reserved
+ * @elbt: Expected Initial Logical Block Reference Tag /
+ * Expected Logical Block Storage Tag
+ * @elbatm: Expected Logical Block Application Tag Mask
+ * @elbat: Expected Logical Block Application Tag
+ */
+struct nvme_copy_range_f1 {
+ __u8 rsvd0[8];
+ __le64 slba;
+ __le16 nlb;
+ __u8 rsvd18[8];
+ __u8 elbt[10];
+ __le16 elbatm;
+ __le16 elbat;
+};
+
+/**
+ * struct nvme_registered_ctrl - Registered Controller Data Structure
* @cntlid: Controller ID
* @rcsts: Reservation Status
* @rsvd3: Reserved
@@ -4300,7 +4389,7 @@ struct nvme_registered_ctrl {
};
/**
- * struct nvme_registered_ctrl_ext -
+ * struct nvme_registered_ctrl_ext - Registered Controller Extended Data Structure
* @cntlid: Controller ID
* @rcsts: Reservation Status
* @rsvd3: Reserved
@@ -4318,7 +4407,7 @@ struct nvme_registered_ctrl_ext {
};
/**
- * struct nvme_resv_status -
+ * struct nvme_resv_status - Reservation Status Data Structure
* @gen: Generation
* @rtype: Reservation Type
* @regctl: Number of Registered Controllers
@@ -4346,7 +4435,7 @@ struct nvme_resv_status {
};
/**
- * struct nvme_streams_directive_params -
+ * struct nvme_streams_directive_params - Streams Directive - Return Parameters Data Structure
* @msl: Max Streams Limit
* @nssa: NVM Subsystem Streams Available
* @nsso: NVM Subsystem Streams Open
@@ -4372,7 +4461,7 @@ struct nvme_streams_directive_params {
};
/**
- * struct nvme_streams_directive_status -
+ * struct nvme_streams_directive_status - Streams Directive - Get Status Data Structure
* @osc: Open Stream Count
* @sid: Stream Identifier
*/
@@ -4382,7 +4471,7 @@ struct nvme_streams_directive_status {
};
/**
- * struct nvme_id_directives -
+ * struct nvme_id_directives - Identify Directive - Return Parameters Data Structure
* @supported: Identify directive is supported
* @enabled: Identify directive is Enabled
* @rsvd64: Reserved
@@ -4394,7 +4483,7 @@ struct nvme_id_directives {
};
/**
- * enum nvme_directive_types -
+ * enum nvme_directive_types - Directives Supported or Enabled
* @NVME_ID_DIR_ID_BIT: Identify directive is supported
* @NVME_ID_DIR_SD_BIT: Streams directive is supported
*/
@@ -4404,7 +4493,7 @@ enum nvme_directive_types {
};
/**
- * struct nvme_host_mem_buf_attrs -
+ * struct nvme_host_mem_buf_attrs - Host Memory Buffer - Attributes Data Structure
* @hsize: Host Memory Buffer Size
* @hmdlal: Host Memory Descriptor List Lower Address
* @hmdlau: Host Memory Descriptor List Upper Address
@@ -4421,7 +4510,7 @@ struct nvme_host_mem_buf_attrs {
};
/**
- * enum nvme_ae_type -
+ * enum nvme_ae_type - Asynchronous Event Type
* @NVME_AER_ERROR: Error event
* @NVME_AER_SMART: SMART / Health Status event
* @NVME_AER_NOTICE: Notice event
@@ -4429,15 +4518,15 @@ struct nvme_host_mem_buf_attrs {
* @NVME_AER_VS: Vendor Specific event
*/
enum nvme_ae_type {
- NVME_AER_ERROR = 0,
- NVME_AER_SMART = 1,
- NVME_AER_NOTICE = 2,
- NVME_AER_CSS = 6,
- NVME_AER_VS = 7,
+ NVME_AER_ERROR = 0,
+ NVME_AER_SMART = 1,
+ NVME_AER_NOTICE = 2,
+ NVME_AER_CSS = 6,
+ NVME_AER_VS = 7,
};
/**
- * enum nvme_ae_info_error -
+ * enum nvme_ae_info_error - Asynchronous Event Information - Error Status
* @NVME_AER_ERROR_INVALID_DB_REG: Write to Invalid Doorbell Register
* @NVME_AER_ERROR_INVALID_DB_VAL: Invalid Doorbell Write Value
* @NVME_AER_ERROR_DIAG_FAILURE: Diagnostic Failure
@@ -4455,7 +4544,7 @@ enum nvme_ae_info_error {
};
/**
- * enum nvme_ae_info_smart -
+ * enum nvme_ae_info_smart - Asynchronous Event Information - SMART / Health Status
* @NVME_AER_SMART_SUBSYSTEM_RELIABILITY: NVM subsystem Reliability
* @NVME_AER_SMART_TEMPERATURE_THRESHOLD: Temperature Threshold
* @NVME_AER_SMART_SPARE_THRESHOLD: Spare Below Threshold
@@ -4467,11 +4556,11 @@ enum nvme_ae_info_smart {
};
/**
- * enum nvme_ae_info_css_nvm -
+ * enum nvme_ae_info_css_nvm - Asynchronous Event Information - I/O Command Specific Status
* @NVME_AER_CSS_NVM_RESERVATION: Reservation Log Page Available
* @NVME_AER_CSS_NVM_SANITIZE_COMPLETED: Sanitize Operation Completed
* @NVME_AER_CSS_NVM_UNEXPECTED_SANITIZE_DEALLOC: Sanitize Operation Completed
- * With Unexpected Deallocation
+ * With Unexpected Deallocation
*/
enum nvme_ae_info_css_nvm {
NVME_AER_CSS_NVM_RESERVATION = 0x00,
@@ -4480,7 +4569,7 @@ enum nvme_ae_info_css_nvm {
};
/**
- * enum nvme_ae_info_notice -
+ * enum nvme_ae_info_notice - Asynchronous Event Information - Notice
* @NVME_AER_NOTICE_NS_CHANGED: Namespace Attribute Changed
* @NVME_AER_NOTICE_FW_ACT_STARTING: Firmware Activation Starting
* @NVME_AER_NOTICE_TELEMETRY: Telemetry Log Changed
@@ -4491,34 +4580,34 @@ enum nvme_ae_info_css_nvm {
* @NVME_AER_NOTICE_DISC_CHANGED: Discovery Log Page Change
*/
enum nvme_ae_info_notice {
- NVME_AER_NOTICE_NS_CHANGED = 0x00,
- NVME_AER_NOTICE_FW_ACT_STARTING = 0x01,
- NVME_AER_NOTICE_TELEMETRY = 0x02,
- NVME_AER_NOTICE_ANA = 0x03,
- NVME_AER_NOTICE_PL_EVENT = 0x04,
- NVME_AER_NOTICE_LBA_STATUS_ALERT = 0x05,
- NVME_AER_NOTICE_EG_EVENT = 0x06,
- NVME_AER_NOTICE_DISC_CHANGED = 0xf0,
+ NVME_AER_NOTICE_NS_CHANGED = 0x00,
+ NVME_AER_NOTICE_FW_ACT_STARTING = 0x01,
+ NVME_AER_NOTICE_TELEMETRY = 0x02,
+ NVME_AER_NOTICE_ANA = 0x03,
+ NVME_AER_NOTICE_PL_EVENT = 0x04,
+ NVME_AER_NOTICE_LBA_STATUS_ALERT = 0x05,
+ NVME_AER_NOTICE_EG_EVENT = 0x06,
+ NVME_AER_NOTICE_DISC_CHANGED = 0xf0,
};
/**
* enum nvme_subsys_type - Type of the NVM subsystem.
* @NVME_NQN_DISC: Discovery type target subsystem. Describes a referral to another
- * Discovery Service composed of Discovery controllers that provide
- * additional discovery records. Multiple Referral entries may
- * be reported for each Discovery Service (if that Discovery Service
- * has multiple NVM subsystem ports or supports multiple protocols).
+ * Discovery Service composed of Discovery controllers that provide
+ * additional discovery records. Multiple Referral entries may
+ * be reported for each Discovery Service (if that Discovery Service
+ * has multiple NVM subsystem ports or supports multiple protocols).
* @NVME_NQN_NVME: NVME type target subsystem. Describes an NVM subsystem whose
- * controllers may have attached namespaces (an NVM subsystem
- * that is not composed of Discovery controllers). Multiple NVM
- * Subsystem entries may be reported for each NVM subsystem if
- * that NVM subsystem has multiple NVM subsystem ports.
+ * controllers may have attached namespaces (an NVM subsystem
+ * that is not composed of Discovery controllers). Multiple NVM
+ * Subsystem entries may be reported for each NVM subsystem if
+ * that NVM subsystem has multiple NVM subsystem ports.
* @NVME_NQN_CURR: Current Discovery type target subsystem. Describes this Discovery
- * subsystem (the Discovery Service that contains the controller
- * processing the Get Log Page command). Multiple Current Discovery
- * Subsystem entries may be reported for this Discovery subsystem
- * if the current Discovery subsystem has multiple NVM subsystem
- * ports.
+ * subsystem (the Discovery Service that contains the controller
+ * processing the Get Log Page command). Multiple Current Discovery
+ * Subsystem entries may be reported for this Discovery subsystem
+ * if the current Discovery subsystem has multiple NVM subsystem
+ * ports.
*/
enum nvme_subsys_type {
NVME_NQN_DISC = 1,
@@ -4537,26 +4626,36 @@ enum nvme_subsys_type {
/**
* enum nvmf_disc_eflags - Discovery Log Page entry flags.
* @NVMF_DISC_EFLAGS_NONE: Indicates that none of the DUPRETINFO or EPCSD
- * features are supported.
+ * features are supported.
* @NVMF_DISC_EFLAGS_DUPRETINFO: Duplicate Returned Information (DUPRETINFO):
- * Indicates that using the content of this entry
- * to access this Discovery Service returns the same
- * information that is returned by using the content
- * of other entries in this log page that also have
- * this flag set.
+ * Indicates that using the content of this entry
+ * to access this Discovery Service returns the same
+ * information that is returned by using the content
+ * of other entries in this log page that also have
+ * this flag set.
* @NVMF_DISC_EFLAGS_EPCSD: Explicit Persistent Connection Support for Discovery (EPCSD):
- * Indicates that Explicit Persistent Connections are
- * supported for the Discovery controller.
- * @NVMF_DISC_EFLAGS_BOTH: Indicates that both the DUPRETINFO and EPCSD
- * features are supported.
+ * Indicates that Explicit Persistent Connections are
+ * supported for the Discovery controller.
+ * @NVMF_DISC_EFLAGS_NCC: No CDC Connectivity (NCC): If set to
+ * '1', then no DDC that describes this entry
+ * is currently connected to the CDC. If
+ * cleared to '0', then at least one DDC that
+ * describes this entry is currently
+ * connected to the CDC. If the Discovery
+ * controller returning this log page is not
+ * a CDC, then this bit shall be cleared to
+ * '0' and should be ignored by the host.
*/
enum nvmf_disc_eflags {
NVMF_DISC_EFLAGS_NONE = 0,
- NVMF_DISC_EFLAGS_DUPRETINFO = 1,
- NVMF_DISC_EFLAGS_EPCSD = 2,
- NVMF_DISC_EFLAGS_BOTH = 3,
+ NVMF_DISC_EFLAGS_DUPRETINFO = 1 << 0,
+ NVMF_DISC_EFLAGS_EPCSD = 1 << 1,
+ NVMF_DISC_EFLAGS_NCC = 1 << 2,
};
+/* Backwards compatibility. Will be removed with next major release */
+#define NVMF_DISC_EFLAGS_BOTH (NVMF_DISC_EFLAGS_DUPRETINFO | NVMF_DISC_EFLAGS_EPCSD)
+
/**
* union nvmf_tsas - Transport Specific Address Subtype
* @common: Common transport specific attributes
@@ -4592,47 +4691,47 @@ union nvmf_tsas {
/**
* struct nvmf_disc_log_entry - Discovery Log Page entry
* @trtype: Transport Type (TRTYPE): Specifies the NVMe Transport type.
- * See &enum nvmf_trtype.
+ * See &enum nvmf_trtype.
* @adrfam: Address Family (ADRFAM): Specifies the address family.
- * See &enum nvmf_addr_family.
+ * See &enum nvmf_addr_family.
* @subtype: Subsystem Type (SUBTYPE): Specifies the type of the NVM subsystem
- * that is indicated in this entry. See &enum nvme_subsys_type.
+ * that is indicated in this entry. See &enum nvme_subsys_type.
* @treq: Transport Requirements (TREQ): Indicates requirements for the NVMe
- * Transport. See &enum nvmf_treq.
+ * Transport. See &enum nvmf_treq.
* @portid: Port ID (PORTID): Specifies a particular NVM subsystem port.
- * Different NVMe Transports or address families may utilize the same
- * Port ID value (e.g. a Port ID may support both iWARP and RoCE).
+ * Different NVMe Transports or address families may utilize the same
+ * Port ID value (e.g. a Port ID may support both iWARP and RoCE).
* @cntlid: Controller ID (CNTLID): Specifies the controller ID. If the NVM
- * subsystem uses a dynamic controller model, then this field shall
- * be set to FFFFh. If the NVM subsystem uses a static controller model,
- * then this field may be set to a specific controller ID (values 0h
- * to FFEFh are valid). If the NVM subsystem uses a static controller
- * model and the value indicated is FFFEh, then the host should remember
- * the Controller ID returned as part of the Fabrics Connect command
- * in order to re-establish an association in the future with the same
- * controller.
+ * subsystem uses a dynamic controller model, then this field shall
+ * be set to FFFFh. If the NVM subsystem uses a static controller model,
+ * then this field may be set to a specific controller ID (values 0h
+ * to FFEFh are valid). If the NVM subsystem uses a static controller
+ * model and the value indicated is FFFEh, then the host should remember
+ * the Controller ID returned as part of the Fabrics Connect command
+ * in order to re-establish an association in the future with the same
+ * controller.
* @asqsz: Admin Max SQ Size (ASQSZ): Specifies the maximum size of an Admin
- * Submission Queue. This applies to all controllers in the NVM
- * subsystem. The value shall be a minimum of 32 entries.
+ * Submission Queue. This applies to all controllers in the NVM
+ * subsystem. The value shall be a minimum of 32 entries.
* @eflags: Entry Flags (EFLAGS): Indicates additional information related to
- * the current entry. See &enum nvmf_disc_eflags.
+ * the current entry. See &enum nvmf_disc_eflags.
* @rsvd12: Reserved
* @trsvcid: Transport Service Identifier (TRSVCID): Specifies the NVMe Transport
- * service identifier as an ASCII string. The NVMe Transport service
- * identifier is specified by the associated NVMe Transport binding
- * specification.
+ * service identifier as an ASCII string. The NVMe Transport service
+ * identifier is specified by the associated NVMe Transport binding
+ * specification.
* @rsvd64: Reserved
* @subnqn: NVM Subsystem Qualified Name (SUBNQN): NVMe Qualified Name (NQN)
- * that uniquely identifies the NVM subsystem. For a subsystem, if that
- * Discovery subsystem has a unique NQN (i.e., the NVM Subsystem NVMe
- * Qualified Name (SUBNQN) field in that Discovery subsystem's Identify
- * Controller data structure contains a unique NQN value), then the
- * value returned shall be that unique NQN. If the Discovery subsystem
- * does not have a unique NQN, then the value returned shall be the
- * well-known Discovery Service NQN (nqn.2014-08.org.nvmexpress.discovery).
+ * that uniquely identifies the NVM subsystem. For a subsystem, if that
+ * Discovery subsystem has a unique NQN (i.e., the NVM Subsystem NVMe
+ * Qualified Name (SUBNQN) field in that Discovery subsystem's Identify
+ * Controller data structure contains a unique NQN value), then the
+ * value returned shall be that unique NQN. If the Discovery subsystem
+ * does not have a unique NQN, then the value returned shall be the
+ * well-known Discovery Service NQN (nqn.2014-08.org.nvmexpress.discovery).
* @traddr: Transport Address (TRADDR): Specifies the address of the NVM subsystem
- * that may be used for a Connect command as an ASCII string. The
- * Address Family field describes the reference for parsing this field.
+ * that may be used for a Connect command as an ASCII string. The
+ * Address Family field describes the reference for parsing this field.
* @tsas: Transport specific attribute settings
*/
struct nvmf_disc_log_entry {
@@ -4659,7 +4758,7 @@ struct nvmf_disc_log_entry {
* @NVMF_TRTYPE_FC: Fibre Channel
* @NVMF_TRTYPE_TCP: TCP
* @NVMF_TRTYPE_LOOP: Intra-host Transport (i.e., loopback), reserved
- * for host usage.
+ * for host usage.
* @NVMF_TRTYPE_MAX: Maximum value for &enum nvmf_trtype
*/
enum nvmf_trtype {
@@ -4679,7 +4778,7 @@ enum nvmf_trtype {
* @NVMF_ADDR_FAMILY_IB: AF_IB: InfiniBand address family.
* @NVMF_ADDR_FAMILY_FC: Fibre Channel address family.
* @NVMF_ADDR_FAMILY_LOOP: Intra-host Transport (i.e., loopback), reserved
- * for host usage.
+ * for host usage.
*/
enum nvmf_addr_family {
NVMF_ADDR_FAMILY_PCI = 0,
@@ -4717,7 +4816,7 @@ enum nvmf_rdma_qptype {
/**
* enum nvmf_rdma_prtype - RDMA Provider Type codes for Discovery Log Page
- * entry TSAS RDMA_PRTYPE field
+ * entry TSAS RDMA_PRTYPE field
* @NVMF_RDMA_PRTYPE_NOT_SPECIFIED: No Provider Specified
* @NVMF_RDMA_PRTYPE_IB: InfiniBand
* @NVMF_RDMA_PRTYPE_ROCE: InfiniBand RoCE
@@ -4734,7 +4833,7 @@ enum nvmf_rdma_prtype {
/**
* enum nvmf_rdma_cms - RDMA Connection Management Service Type codes for
- * Discovery Log Page entry TSAS RDMA_CMS field
+ * Discovery Log Page entry TSAS RDMA_CMS field
* @NVMF_RDMA_CMS_RDMA_CM: Sockets based endpoint addressing
*
*/
@@ -4744,12 +4843,12 @@ enum nvmf_rdma_cms {
/**
* enum nvmf_tcp_sectype - Transport Specific Address Subtype Definition for
- * NVMe/TCP Transport
+ * NVMe/TCP Transport
* @NVMF_TCP_SECTYPE_NONE: No Security
* @NVMF_TCP_SECTYPE_TLS: Transport Layer Security version 1.2
* @NVMF_TCP_SECTYPE_TLS13: Transport Layer Security version 1.3 or a subsequent
- * version. The TLS protocol negotiates the version and
- * cipher suite for each TCP connection.
+ * version. The TLS protocol negotiates the version and
+ * cipher suite for each TCP connection.
*/
enum nvmf_tcp_sectype {
NVMF_TCP_SECTYPE_NONE = 0,
@@ -4760,15 +4859,15 @@ enum nvmf_tcp_sectype {
/**
* struct nvmf_discovery_log - Discovery Log Page (Log Identifier 70h)
* @genctr: Generation Counter (GENCTR): Indicates the version of the discovery
- * information, starting at a value of 0h. For each change in the
- * Discovery Log Page, this counter is incremented by one. If the value
- * of this field is FFFFFFFF_FFFFFFFFh, then the field shall be cleared
- * to 0h when incremented (i.e., rolls over to 0h).
+ * information, starting at a value of 0h. For each change in the
+ * Discovery Log Page, this counter is incremented by one. If the value
+ * of this field is FFFFFFFF_FFFFFFFFh, then the field shall be cleared
+ * to 0h when incremented (i.e., rolls over to 0h).
* @numrec: Number of Records (NUMREC): Indicates the number of records
- * contained in the log.
+ * contained in the log.
* @recfmt: Record Format (RECFMT): Specifies the format of the Discovery Log
- * Page. If a new format is defined, this value is incremented by one.
- * The format of the record specified in this definition shall be 0h.
+ * Page. If a new format is defined, this value is incremented by one.
+ * The format of the record specified in this definition shall be 0h.
* @rsvd14: Reserved
* @entries: Discovery Log Page Entries - see &struct nvmf_disc_log_entry.
*/
@@ -4804,8 +4903,7 @@ enum nvmf_dim_tas {
* @NVMF_DIM_ENTFMT_BASIC: Basic discovery information entry
* @NVMF_DIM_ENTFMT_EXTENDED: Extended discovery information entry
*/
-enum nvmf_dim_entfmt
-{
+enum nvmf_dim_entfmt {
NVMF_DIM_ENTFMT_BASIC = 0x01,
NVMF_DIM_ENTFMT_EXTENDED = 0x02,
};
@@ -4813,11 +4911,10 @@ enum nvmf_dim_entfmt
/**
* enum nvmf_dim_etype -Discovery Information Management Entity Type
* @NVMF_DIM_ETYPE_HOST: Host
- * @NVMF_DIM_ETYPE_DDC: Direct Discovery controller
- * @NVMF_DIM_ETYPE_CDC: Centralized Discovery controller
+ * @NVMF_DIM_ETYPE_DDC: Direct Discovery controller
+ * @NVMF_DIM_ETYPE_CDC: Centralized Discovery controller
*/
-enum nvmf_dim_etype
-{
+enum nvmf_dim_etype {
NVMF_DIM_ETYPE_HOST = 0x01,
NVMF_DIM_ETYPE_DDC = 0x02,
NVMF_DIM_ETYPE_CDC = 0x03,
@@ -4828,8 +4925,7 @@ enum nvmf_dim_etype
* @NVMF_EXATTYPE_HOSTID: Host Identifier
* @NVMF_EXATTYPE_SYMNAME: Symblic Name
*/
-enum nvmf_exattype
-{
+enum nvmf_exattype {
NVMF_EXATTYPE_HOSTID = 0x01,
NVMF_EXATTYPE_SYMNAME = 0x02,
};
@@ -4839,10 +4935,9 @@ enum nvmf_exattype
* @exattype: Extended Attribute Type (EXATTYPE) - see @enum nvmf_exattype
* @exatlen: Extended Attribute Length (EXATLEN)
* @exatval: Extended Attribute Value (EXATVAL) - size allocated for array
- * must be a multiple of 4 bytes
+ * must be a multiple of 4 bytes
*/
-struct nvmf_ext_attr
-{
+struct nvmf_ext_attr {
__le16 exattype;
__le16 exatlen;
__u8 exatval[];
@@ -4866,10 +4961,9 @@ struct nvmf_ext_attr
* @tel: Total Entry Length
* @numexat: Number of Extended Attributes
* @resv1030: Reserved
- * @exat: Extented Attributes 0 (&struct nvmf_ext_attr)
+ * @exat: Extended Attributes 0 (&struct nvmf_ext_attr)
*/
-struct nvmf_ext_die
-{
+struct nvmf_ext_die {
__u8 trtype;
__u8 adrfam;
__u8 subtype;
@@ -4903,12 +4997,11 @@ struct nvmf_ext_die
* "extended" field is akin to a linked-list, where one can "walk"
* through the list. To move to the next entry, one simply adds the
* current entry's length (TEL) to the "walk" pointer. The number of
- * entries in the list is specified by NUMENT. Although extended
- * entries are of a variable lengths (TEL), TEL is always a mutiple of
+ * entries in the list is specified by NUMENT. Although extended
+ * entries are of a variable lengths (TEL), TEL is always a multiple of
* 4 bytes.
*/
-union nvmf_die
-{
+union nvmf_die {
struct nvmf_disc_log_entry basic[0];
struct nvmf_ext_die extended;
};
@@ -4929,8 +5022,7 @@ union nvmf_die
* @rsvd600: Reserved
* @die: Discovery Information Entry (see @nument above)
*/
-struct nvmf_dim_data
-{
+struct nvmf_dim_data {
__le32 tdl;
__u8 rsvd4[4];
__le64 nument;
@@ -4965,7 +5057,7 @@ struct nvmf_connect_data {
};
/**
- * struct nvme_mi_read_nvm_ss_info -
+ * struct nvme_mi_read_nvm_ss_info - NVM Subsystem Information Data Structure
* @nump: Number of Ports
* @mjr: NVMe-MI Major Version Number
* @mnr: NVMe-MI Minor Version Number
@@ -4979,7 +5071,7 @@ struct nvme_mi_read_nvm_ss_info {
};
/**
- * struct nvme_mi_port_pcie -
+ * struct nvme_mi_port_pcie - PCIe Port Specific Data
* @mps: PCIe Maximum Payload Size
* @sls: PCIe Supported Link Speeds Vector
* @cls: PCIe Current Link Speed
@@ -4999,7 +5091,7 @@ struct nvme_mi_port_pcie {
};
/**
- * struct nvme_mi_port_smb -
+ * struct nvme_mi_port_smb - SMBus Port Specific Data
* @vpd_addr: Current VPD SMBus/I2C Address
* @mvpd_freq: Maximum VPD Access SMBus/I2C Frequency
* @mme_addr: Current Management Endpoint SMBus/I2C Address
@@ -5017,7 +5109,7 @@ struct nvme_mi_port_smb {
};
/**
- * struct nvme_mi_read_port_info -
+ * struct nvme_mi_read_port_info - Port Information Data Structure
* @portt: Port Type
* @rsvd1: Reserved
* @mmctptus: Maximum MCTP Transmission Unit Size
@@ -5037,7 +5129,7 @@ struct nvme_mi_read_port_info {
};
/**
- * struct nvme_mi_read_ctrl_info -
+ * struct nvme_mi_read_ctrl_info - Controller Information Data Structure
* @portid: Port Identifier
* @rsvd1: Reserved
* @prii: PCIe Routing ID Information
@@ -5061,7 +5153,7 @@ struct nvme_mi_read_ctrl_info {
};
/**
- * struct nvme_mi_osc -
+ * struct nvme_mi_osc - Optionally Supported Command Data Structure
* @type: Command Type
* @opc: Opcode
*/
@@ -5071,9 +5163,10 @@ struct nvme_mi_osc {
};
/**
- * struct nvme_mi_read_sc_list -
+ * struct nvme_mi_read_sc_list - Management Endpoint Buffer Supported Command List Data Structure
* @numcmd: Number of Commands
- * @cmds: MEB supported Command Data Structure
+ * @cmds: MEB supported Command Data Structure.
+ * See @struct nvme_mi_osc
*/
struct nvme_mi_read_sc_list {
__le16 numcmd;
@@ -5081,7 +5174,7 @@ struct nvme_mi_read_sc_list {
};
/**
- * struct nvme_mi_nvm_ss_health_status -
+ * struct nvme_mi_nvm_ss_health_status - Subsystem Management Data Structure
* @nss: NVM Subsystem Status
* @sw: Smart Warnings
* @ctemp: Composite Temperature
@@ -5099,37 +5192,51 @@ struct nvme_mi_nvm_ss_health_status {
};
/**
- * enum nvme_mi_css -
+ * enum nvme_mi_ccs - Get State Control Primitive Success Response Fields - Control Primitive Specific Response
* @NVME_MI_CCS_RDY: Ready
- * @NVME_MI_CSS_CFS: Controller Fatal Status
- * @NVME_MI_CSS_SHST: Shutdown Status
- * @NVME_MI_CSS_NSSRO: NVM Subsystem Reset Occurred
- * @NVME_MI_CSS_CECO: Controller Enable Change Occurred
- * @NVME_MI_CSS_NAC: Namespace Attribute Changed
- * @NVME_MI_CSS_FA: Firmware Activated
- * @NVME_MI_CSS_CSTS: Controller Status Change
- * @NVME_MI_CSS_CTEMP: Composite Temperature Change
- * @NVME_MI_CSS_PDLU: Percentage Used
- * @NVME_MI_CSS_SPARE: Available Spare
- * @NVME_MI_CSS_CCWARN: Critical Warning
- */
-enum nvme_mi_css {
+ * @NVME_MI_CCS_CFS: Controller Fatal Status
+ * @NVME_MI_CCS_SHST: Shutdown Status
+ * @NVME_MI_CCS_NSSRO: NVM Subsystem Reset Occurred
+ * @NVME_MI_CCS_CECO: Controller Enable Change Occurred
+ * @NVME_MI_CCS_NAC: Namespace Attribute Changed
+ * @NVME_MI_CCS_FA: Firmware Activated
+ * @NVME_MI_CCS_CSTS: Controller Status Change
+ * @NVME_MI_CCS_CTEMP: Composite Temperature Change
+ * @NVME_MI_CCS_PDLU: Percentage Used
+ * @NVME_MI_CCS_SPARE: Available Spare
+ * @NVME_MI_CCS_CCWARN: Critical Warning
+ */
+enum nvme_mi_ccs {
NVME_MI_CCS_RDY = 1 << 0,
- NVME_MI_CSS_CFS = 1 << 1,
- NVME_MI_CSS_SHST = 1 << 2,
- NVME_MI_CSS_NSSRO = 1 << 4,
- NVME_MI_CSS_CECO = 1 << 5,
- NVME_MI_CSS_NAC = 1 << 6,
- NVME_MI_CSS_FA = 1 << 7,
- NVME_MI_CSS_CSTS = 1 << 8,
- NVME_MI_CSS_CTEMP = 1 << 9,
- NVME_MI_CSS_PDLU = 1 << 10,
- NVME_MI_CSS_SPARE = 1 << 11,
- NVME_MI_CSS_CCWARN = 1 << 12,
-};
-
-/**
- * struct nvme_mi_ctrl_health_status -
+ NVME_MI_CCS_CFS = 1 << 1,
+ NVME_MI_CCS_SHST = 1 << 2,
+ NVME_MI_CCS_NSSRO = 1 << 4,
+ NVME_MI_CCS_CECO = 1 << 5,
+ NVME_MI_CCS_NAC = 1 << 6,
+ NVME_MI_CCS_FA = 1 << 7,
+ NVME_MI_CCS_CSTS = 1 << 8,
+ NVME_MI_CCS_CTEMP = 1 << 9,
+ NVME_MI_CCS_PDLU = 1 << 10,
+ NVME_MI_CCS_SPARE = 1 << 11,
+ NVME_MI_CCS_CCWARN = 1 << 12,
+};
+
+/* backwards compat for old "CCS" definitions */
+#define nvme_mi_css nvme_mi_ccs
+#define NVME_MI_CSS_CFS NVME_MI_CCS_CFS
+#define NVME_MI_CSS_SHST NVME_MI_CCS_SHST
+#define NVME_MI_CSS_NSSRO NVME_MI_CCS_NSSRO
+#define NVME_MI_CSS_CECO NVME_MI_CCS_CECO
+#define NVME_MI_CSS_NAC NVME_MI_CCS_NAC
+#define NVME_MI_CSS_FA NVME_MI_CCS_FA
+#define NVME_MI_CSS_CSTS NVME_MI_CCS_CSTS
+#define NVME_MI_CSS_CTEMP NVME_MI_CCS_CTEMP
+#define NVME_MI_CSS_PDLU NVME_MI_CCS_PDLU
+#define NVME_MI_CSS_SPARE NVME_MI_CCS_SPARE
+#define NVME_MI_CSS_CCWARN NVME_MI_CCS_CCWARN
+
+/**
+ * struct nvme_mi_ctrl_health_status - Controller Health Data Structure (CHDS)
* @ctlid: Controller Identifier
* @csts: Controller Status
* @ctemp: Composite Temperature
@@ -5149,7 +5256,7 @@ struct nvme_mi_ctrl_health_status {
};
/**
- * enum nvme_mi_csts -
+ * enum nvme_mi_csts - Controller Health Data Structure (CHDS) - Controller Status (CSTS)
* @NVME_MI_CSTS_RDY: Ready
* @NVME_MI_CSTS_CFS: Controller Fatal Status
* @NVME_MI_CSTS_SHST: Shutdown Status
@@ -5169,7 +5276,7 @@ enum nvme_mi_csts {
};
/**
- * enum nvme_mi_cwarn -
+ * enum nvme_mi_cwarn - Controller Health Data Structure (CHDS) - Critical Warning (CWARN)
* @NVME_MI_CWARN_ST: Spare Threshold
* @NVME_MI_CWARN_TAUT: Temperature Above or Under Threshold
* @NVME_MI_CWARN_RD: Reliability Degraded
@@ -5185,7 +5292,7 @@ enum nvme_mi_cwarn {
};
/**
- * struct nvme_mi_vpd_mra -
+ * struct nvme_mi_vpd_mra - NVMe MultiRecord Area
* @nmravn: NVMe MultiRecord Area Version Number
* @ff: Form Factor
* @rsvd7: Reserved
@@ -5194,7 +5301,7 @@ enum nvme_mi_cwarn {
* @i33vpwr: Initial 3.3 V Power Supply Requirements
* @m33vpwr: Maximum 3.3 V Power Supply Requirements
* @rsvd17: Reserved
- * @m33vapsr: Maximum 3.3 V aux Power Supply Requirements
+ * @m33vapsr: Maximum 3.3 Vi aux Power Supply Requirements
* @i5vapsr: Initial 5 V Power Supply Requirements
* @m5vapsr: Maximum 5 V Power Supply Requirements
* @i12vapsr: Initial 12 V Power Supply Requirements
@@ -5223,7 +5330,7 @@ struct nvme_mi_vpd_mra {
};
/**
- * struct nvme_mi_vpd_ppmra -
+ * struct nvme_mi_vpd_ppmra - NVMe PCIe Port MultiRecord Area
* @nppmravn: NVMe PCIe Port MultiRecord Area Version Number
* @pn: PCIe Port Number
* @ppi: Port Information
@@ -5247,12 +5354,12 @@ struct nvme_mi_vpd_ppmra {
};
/**
- * struct nvme_mi_vpd_telem -
+ * struct nvme_mi_vpd_telem - Vital Product Data Element Descriptor
* @type: Type of the Element Descriptor
* @rev: Revision of the Element Descriptor
* @len: Number of bytes in the Element Descriptor
* @data: Type-specific information associated with
- * the Element Descriptor
+ * the Element Descriptor
*/
struct nvme_mi_vpd_telem {
__u8 type;
@@ -5262,7 +5369,7 @@ struct nvme_mi_vpd_telem {
};
/**
- * enum nvme_mi_elem -
+ * enum nvme_mi_elem - Element Descriptor Types
* @NVME_MI_ELEM_EED: Extended Element Descriptor
* @NVME_MI_ELEM_USCE: Upstream Connector Element Descriptor
* @NVME_MI_ELEM_ECED: Expansion Connector Element Descriptor
@@ -5282,7 +5389,7 @@ enum nvme_mi_elem {
};
/**
- * struct nvme_mi_vpd_tra -
+ * struct nvme_mi_vpd_tra - Vital Product Data Topology MultiRecord
* @vn: Version Number
* @rsvd6: Reserved
* @ec: Element Count
@@ -5296,7 +5403,7 @@ struct nvme_mi_vpd_tra {
};
/**
- * struct nvme_mi_vpd_mr_common -
+ * struct nvme_mi_vpd_mr_common - NVMe MultiRecord Area
* @type: NVMe Record Type ID
* @rf: Record Format
* @rlen: Record Length
@@ -5321,7 +5428,7 @@ struct nvme_mi_vpd_mr_common {
};
/**
- * struct nvme_mi_vpd_hdr -
+ * struct nvme_mi_vpd_hdr - Vital Product Data Common Header
* @ipmiver: IPMI Format Version Number
* @iuaoff: Internal Use Area Starting Offset
* @ciaoff: Chassis Info Area Starting Offset
@@ -5346,178 +5453,182 @@ struct nvme_mi_vpd_hdr {
/**
* enum nvme_status_field - Defines all parts of the nvme status field: status
- * code, status code type, and additional flags.
+ * code, status code type, and additional flags.
* @NVME_SCT_GENERIC: Generic errors applicable to multiple opcodes
* @NVME_SCT_CMD_SPECIFIC: Errors associated to a specific opcode
* @NVME_SCT_MEDIA: Errors associated with media and data integrity
* @NVME_SCT_PATH: Errors associated with the paths connection
* @NVME_SCT_VS: Vendor specific errors
* @NVME_SCT_MASK: Mask to get the value of the Status Code Type
+ * @NVME_SCT_SHIFT: Shift value to get the value of the Status
+ * Code Type
* @NVME_SC_MASK: Mask to get the value of the status code.
+ * @NVME_SC_SHIFT: Shift value to get the value of the status
+ * code.
* @NVME_SC_SUCCESS: Successful Completion: The command
- * completed without error.
+ * completed without error.
* @NVME_SC_INVALID_OPCODE: Invalid Command Opcode: A reserved coded
- * value or an unsupported value in the
- * command opcode field.
+ * value or an unsupported value in the
+ * command opcode field.
* @NVME_SC_INVALID_FIELD: Invalid Field in Command: A reserved
- * coded value or an unsupported value in a
- * defined field.
+ * coded value or an unsupported value in a
+ * defined field.
* @NVME_SC_CMDID_CONFLICT: Command ID Conflict: The command
- * identifier is already in use.
+ * identifier is already in use.
* @NVME_SC_DATA_XFER_ERROR: Data Transfer Error: Transferring the
- * data or metadata associated with a
- * command experienced an error.
+ * data or metadata associated with a
+ * command experienced an error.
* @NVME_SC_POWER_LOSS: Commands Aborted due to Power Loss
- * Notification: Indicates that the command
- * was aborted due to a power loss
- * notification.
+ * Notification: Indicates that the command
+ * was aborted due to a power loss
+ * notification.
* @NVME_SC_INTERNAL: Internal Error: The command was not
- * completed successfully due to an internal error.
+ * completed successfully due to an internal error.
* @NVME_SC_ABORT_REQ: Command Abort Requested: The command was
- * aborted due to an Abort command being
- * received that specified the Submission
- * Queue Identifier and Command Identifier
- * of this command.
+ * aborted due to an Abort command being
+ * received that specified the Submission
+ * Queue Identifier and Command Identifier
+ * of this command.
* @NVME_SC_ABORT_QUEUE: Command Aborted due to SQ Deletion: The
- * command was aborted due to a Delete I/O
- * Submission Queue request received for the
- * Submission Queue to which the command was
- * submitted.
+ * command was aborted due to a Delete I/O
+ * Submission Queue request received for the
+ * Submission Queue to which the command was
+ * submitted.
* @NVME_SC_FUSED_FAIL: Command Aborted due to Failed Fused Command:
- * The command was aborted due to the other
- * command in a fused operation failing.
+ * The command was aborted due to the other
+ * command in a fused operation failing.
* @NVME_SC_FUSED_MISSING: Aborted due to Missing Fused Command: The
- * fused command was aborted due to the
- * adjacent submission queue entry not
- * containing a fused command that is the
- * other command.
+ * fused command was aborted due to the
+ * adjacent submission queue entry not
+ * containing a fused command that is the
+ * other command.
* @NVME_SC_INVALID_NS: Invalid Namespace or Format: The
- * namespace or the format of that namespace
- * is invalid.
+ * namespace or the format of that namespace
+ * is invalid.
* @NVME_SC_CMD_SEQ_ERROR: Command Sequence Error: The command was
- * aborted due to a protocol violation in a
- * multi-command sequence.
+ * aborted due to a protocol violation in a
+ * multi-command sequence.
* @NVME_SC_SGL_INVALID_LAST: Invalid SGL Segment Descriptor: The
- * command includes an invalid SGL Last
- * Segment or SGL Segment descriptor.
+ * command includes an invalid SGL Last
+ * Segment or SGL Segment descriptor.
* @NVME_SC_SGL_INVALID_COUNT: Invalid Number of SGL Descriptors: There
- * is an SGL Last Segment descriptor or an
- * SGL Segment descriptor in a location
- * other than the last descriptor of a
- * segment based on the length indicated.
+ * is an SGL Last Segment descriptor or an
+ * SGL Segment descriptor in a location
+ * other than the last descriptor of a
+ * segment based on the length indicated.
* @NVME_SC_SGL_INVALID_DATA: Data SGL Length Invalid: This may occur
- * if the length of a Data SGL is too short.
- * This may occur if the length of a Data
- * SGL is too long and the controller does
- * not support SGL transfers longer than the
- * amount of data to be transferred as
- * indicated in the SGL Support field of the
- * Identify Controller data structure.
+ * if the length of a Data SGL is too short.
+ * This may occur if the length of a Data
+ * SGL is too long and the controller does
+ * not support SGL transfers longer than the
+ * amount of data to be transferred as
+ * indicated in the SGL Support field of the
+ * Identify Controller data structure.
* @NVME_SC_SGL_INVALID_METADATA: Metadata SGL Length Invalid: This may
- * occur if the length of a Metadata SGL is
- * too short. This may occur if the length
- * of a Metadata SGL is too long and the
- * controller does not support SGL transfers
- * longer than the amount of data to be
- * transferred as indicated in the SGL
- * Support field of the Identify Controller
- * data structure.
+ * occur if the length of a Metadata SGL is
+ * too short. This may occur if the length
+ * of a Metadata SGL is too long and the
+ * controller does not support SGL transfers
+ * longer than the amount of data to be
+ * transferred as indicated in the SGL
+ * Support field of the Identify Controller
+ * data structure.
* @NVME_SC_SGL_INVALID_TYPE: SGL Descriptor Type Invalid: The type of
- * an SGL Descriptor is a type that is not
- * supported by the controller.
+ * an SGL Descriptor is a type that is not
+ * supported by the controller.
* @NVME_SC_CMB_INVALID_USE: Invalid Use of Controller Memory Buffer:
- * The attempted use of the Controller
- * Memory Buffer is not supported by the
- * controller.
- * @NVME_SC_PRP_INVALID_OFFSET: PRP Offset Invalid: The Offset field for
- * a PRP entry is invalid.
+ * The attempted use of the Controller
+ * Memory Buffer is not supported by the
+ * controller.
+ * @NVME_SC_PRP_INVALID_OFFSET: PRP Offset Invalid: The Offset field for
+ * a PRP entry is invalid.
* @NVME_SC_AWU_EXCEEDED: Atomic Write Unit Exceeded: The length
- * specified exceeds the atomic write unit size.
+ * specified exceeds the atomic write unit size.
* @NVME_SC_OP_DENIED: Operation Denied: The command was denied
- * due to lack of access rights. Refer to
- * the appropriate security specification.
+ * due to lack of access rights. Refer to
+ * the appropriate security specification.
* @NVME_SC_SGL_INVALID_OFFSET: SGL Offset Invalid: The offset specified
- * in a descriptor is invalid. This may
- * occur when using capsules for data
- * transfers in NVMe over Fabrics
- * implementations and an invalid offset in
- * the capsule is specified.
+ * in a descriptor is invalid. This may
+ * occur when using capsules for data
+ * transfers in NVMe over Fabrics
+ * implementations and an invalid offset in
+ * the capsule is specified.
* @NVME_SC_HOSTID_FORMAT: Host Identifier Inconsistent Format: The
- * NVM subsystem detected the simultaneous
- * use of 64- bit and 128-bit Host
- * Identifier values on different
- * controllers.
+ * NVM subsystem detected the simultaneous
+ * use of 64- bit and 128-bit Host
+ * Identifier values on different
+ * controllers.
* @NVME_SC_KAT_EXPIRED: Keep Alive Timer Expired: The Keep Alive
- * Timer expired.
+ * Timer expired.
* @NVME_SC_KAT_INVALID: Keep Alive Timeout Invalid: The Keep
- * Alive Timeout value specified is invalid.
+ * Alive Timeout value specified is invalid.
* @NVME_SC_CMD_ABORTED_PREMEPT: Command Aborted due to Preempt and Abort:
- * The command was aborted due to a
- * Reservation Acquire command.
+ * The command was aborted due to a
+ * Reservation Acquire command.
* @NVME_SC_SANITIZE_FAILED: Sanitize Failed: The most recent sanitize
- * operation failed and no recovery action
- * has been successfully completed.
+ * operation failed and no recovery action
+ * has been successfully completed.
* @NVME_SC_SANITIZE_IN_PROGRESS: Sanitize In Progress: The requested
- * function (e.g., command) is prohibited
- * while a sanitize operation is in
- * progress.
+ * function (e.g., command) is prohibited
+ * while a sanitize operation is in
+ * progress.
* @NVME_SC_SGL_INVALID_GRANULARITY: SGL Data Block Granularity Invalid: The
- * Address alignment or Length granularity
- * for an SGL Data Block descriptor is
- * invalid.
+ * Address alignment or Length granularity
+ * for an SGL Data Block descriptor is
+ * invalid.
* @NVME_SC_CMD_IN_CMBQ_NOT_SUPP: Command Not Supported for Queue in CMB:
- * The implementation does not support
- * submission of the command to a Submission
- * Queue in the Controller Memory Buffer or
- * command completion to a Completion Queue
- * in the Controller Memory Buffer.
+ * The implementation does not support
+ * submission of the command to a Submission
+ * Queue in the Controller Memory Buffer or
+ * command completion to a Completion Queue
+ * in the Controller Memory Buffer.
* @NVME_SC_NS_WRITE_PROTECTED: Namespace is Write Protected: The command
- * is prohibited while the namespace is
- * write protected as a result of a change
- * in the namespace write protection state
- * as defined by the Namespace Write
- * Protection State Machine.
+ * is prohibited while the namespace is
+ * write protected as a result of a change
+ * in the namespace write protection state
+ * as defined by the Namespace Write
+ * Protection State Machine.
* @NVME_SC_CMD_INTERRUPTED: Command Interrupted: Command processing
- * was interrupted and the controller is
- * unable to successfully complete the
- * command. The host should retry the
- * command.
+ * was interrupted and the controller is
+ * unable to successfully complete the
+ * command. The host should retry the
+ * command.
* @NVME_SC_TRAN_TPORT_ERROR: Transient Transport Error: A transient
- * transport error was detected. If the
- * command is retried on the same
- * controller, the command is likely to
- * succeed. A command that fails with a
- * transient transport error four or more
- * times should be treated as a persistent
- * transport error that is not likely to
- * succeed if retried on the same
- * controller.
+ * transport error was detected. If the
+ * command is retried on the same
+ * controller, the command is likely to
+ * succeed. A command that fails with a
+ * transient transport error four or more
+ * times should be treated as a persistent
+ * transport error that is not likely to
+ * succeed if retried on the same
+ * controller.
* @NVME_SC_PROHIBITED_BY_CMD_AND_FEAT: Command Prohibited by Command and Feature
- * Lockdown: The command was aborted due to
- * command execution being prohibited by
- * the Command and Feature Lockdown.
+ * Lockdown: The command was aborted due to
+ * command execution being prohibited by
+ * the Command and Feature Lockdown.
* @NVME_SC_ADMIN_CMD_MEDIA_NOT_READY: Admin Command Media Not Ready: The Admin
- * command requires access to media and
- * the media is not ready.
+ * command requires access to media and
+ * the media is not ready.
* @NVME_SC_LBA_RANGE: LBA Out of Range: The command references
- * an LBA that exceeds the size of the namespace.
+ * an LBA that exceeds the size of the namespace.
* @NVME_SC_CAP_EXCEEDED: Capacity Exceeded: Execution of the
- * command has caused the capacity of the
- * namespace to be exceeded.
+ * command has caused the capacity of the
+ * namespace to be exceeded.
* @NVME_SC_NS_NOT_READY: Namespace Not Ready: The namespace is not
- * ready to be accessed as a result of a
- * condition other than a condition that is
- * reported as an Asymmetric Namespace
- * Access condition.
+ * ready to be accessed as a result of a
+ * condition other than a condition that is
+ * reported as an Asymmetric Namespace
+ * Access condition.
* @NVME_SC_RESERVATION_CONFLICT: Reservation Conflict: The command was
- * aborted due to a conflict with a
- * reservation held on the accessed
- * namespace.
+ * aborted due to a conflict with a
+ * reservation held on the accessed
+ * namespace.
* @NVME_SC_FORMAT_IN_PROGRESS: Format In Progress: A Format NVM command
- * is in progress on the namespace.
+ * is in progress on the namespace.
* @NVME_SC_CQ_INVALID: Completion Queue Invalid: The Completion
- * Queue identifier specified in the command
- * does not exist.
+ * Queue identifier specified in the command
+ * does not exist.
* @NVME_SC_QID_INVALID: Invalid Queue Identifier: The creation of
* the I/O Completion Queue failed due to an
* invalid queue identifier specified as
@@ -5526,121 +5637,121 @@ struct nvme_mi_vpd_hdr {
* use or one that is outside the range
* supported by the controller.
* @NVME_SC_QUEUE_SIZE: Invalid Queue Size: The host attempted to
- * create an I/O Completion Queue with an
- * invalid number of entries.
+ * create an I/O Completion Queue with an
+ * invalid number of entries.
* @NVME_SC_ABORT_LIMIT: Abort Command Limit Exceeded: The number
- * of concurrently outstanding Abort commands
- * has exceeded the limit indicated in the
- * Identify Controller data structure.
+ * of concurrently outstanding Abort commands
+ * has exceeded the limit indicated in the
+ * Identify Controller data structure.
* @NVME_SC_ABORT_MISSING: Abort Command is missing: The abort
- * command is missing.
+ * command is missing.
* @NVME_SC_ASYNC_LIMIT: Asynchronous Event Request Limit
- * Exceeded: The number of concurrently
- * outstanding Asynchronous Event Request
- * commands has been exceeded.
+ * Exceeded: The number of concurrently
+ * outstanding Asynchronous Event Request
+ * commands has been exceeded.
* @NVME_SC_FIRMWARE_SLOT: Invalid Firmware Slot: The firmware slot
- * indicated is invalid or read only. This
- * error is indicated if the firmware slot
- * exceeds the number supported.
+ * indicated is invalid or read only. This
+ * error is indicated if the firmware slot
+ * exceeds the number supported.
* @NVME_SC_FIRMWARE_IMAGE: Invalid Firmware Image: The firmware
- * image specified for activation is invalid
- * and not loaded by the controller.
+ * image specified for activation is invalid
+ * and not loaded by the controller.
* @NVME_SC_INVALID_VECTOR: Invalid Interrupt Vector: The creation of
- * the I/O Completion Queue failed due to an
- * invalid interrupt vector specified as
- * part of the command.
+ * the I/O Completion Queue failed due to an
+ * invalid interrupt vector specified as
+ * part of the command.
* @NVME_SC_INVALID_LOG_PAGE: Invalid Log Page: The log page indicated
- * is invalid. This error condition is also
- * returned if a reserved log page is
- * requested.
+ * is invalid. This error condition is also
+ * returned if a reserved log page is
+ * requested.
* @NVME_SC_INVALID_FORMAT: Invalid Format: The LBA Format specified
- * is not supported.
+ * is not supported.
* @NVME_SC_FW_NEEDS_CONV_RESET: Firmware Activation Requires Conventional Reset:
- * The firmware commit was successful,
- * however, activation of the firmware image
- * requires a conventional reset.
+ * The firmware commit was successful,
+ * however, activation of the firmware image
+ * requires a conventional reset.
* @NVME_SC_INVALID_QUEUE: Invalid Queue Deletion: Invalid I/O
- * Completion Queue specified to delete.
+ * Completion Queue specified to delete.
* @NVME_SC_FEATURE_NOT_SAVEABLE: Feature Identifier Not Saveable: The
- * Feature Identifier specified does not
- * support a saveable value.
+ * Feature Identifier specified does not
+ * support a saveable value.
* @NVME_SC_FEATURE_NOT_CHANGEABLE: Feature Not Changeable: The Feature
- * Identifier is not able to be changed.
+ * Identifier is not able to be changed.
* @NVME_SC_FEATURE_NOT_PER_NS: Feature Not Namespace Specific: The
- * Feature Identifier specified is not
- * namespace specific. The Feature
- * Identifier settings apply across all
- * namespaces.
+ * Feature Identifier specified is not
+ * namespace specific. The Feature
+ * Identifier settings apply across all
+ * namespaces.
* @NVME_SC_FW_NEEDS_SUBSYS_RESET: Firmware Activation Requires NVM
- * Subsystem Reset: The firmware commit was
- * successful, however, activation of the
- * firmware image requires an NVM Subsystem.
+ * Subsystem Reset: The firmware commit was
+ * successful, however, activation of the
+ * firmware image requires an NVM Subsystem.
* @NVME_SC_FW_NEEDS_RESET: Firmware Activation Requires Controller
- * Level Reset: The firmware commit was
- * successful; however, the image specified
- * does not support being activated without
- * a reset.
+ * Level Reset: The firmware commit was
+ * successful; however, the image specified
+ * does not support being activated without
+ * a reset.
* @NVME_SC_FW_NEEDS_MAX_TIME: Firmware Activation Requires Maximum Time
- * Violation: The image specified if
- * activated immediately would exceed the
- * Maximum Time for Firmware Activation
- * (MTFA) value reported in Identify
- * Controller.
+ * Violation: The image specified if
+ * activated immediately would exceed the
+ * Maximum Time for Firmware Activation
+ * (MTFA) value reported in Identify
+ * Controller.
* @NVME_SC_FW_ACTIVATE_PROHIBITED: Firmware Activation Prohibited: The image
- * specified is being prohibited from
- * activation by the controller for vendor
- * specific reasons.
+ * specified is being prohibited from
+ * activation by the controller for vendor
+ * specific reasons.
* @NVME_SC_OVERLAPPING_RANGE: Overlapping Range: The downloaded
- * firmware image has overlapping ranges.
+ * firmware image has overlapping ranges.
* @NVME_SC_NS_INSUFFICIENT_CAP: Namespace Insufficient Capacity: Creating
- * the namespace requires more free space
- * than is currently available.
+ * the namespace requires more free space
+ * than is currently available.
* @NVME_SC_NS_ID_UNAVAILABLE: Namespace Identifier Unavailable: The
- * number of namespaces supported has been
- * exceeded.
+ * number of namespaces supported has been
+ * exceeded.
* @NVME_SC_NS_ALREADY_ATTACHED: Namespace Already Attached: The
- * controller is already attached to the
- * namespace specified.
+ * controller is already attached to the
+ * namespace specified.
* @NVME_SC_NS_IS_PRIVATE: Namespace Is Private: The namespace is
- * private and is already attached to one
- * controller.
+ * private and is already attached to one
+ * controller.
* @NVME_SC_NS_NOT_ATTACHED: Namespace Not Attached: The request to
- * detach the controller could not be
- * completed because the controller is not
- * attached to the namespace.
+ * detach the controller could not be
+ * completed because the controller is not
+ * attached to the namespace.
* @NVME_SC_THIN_PROV_NOT_SUPP: Thin Provisioning Not Supported: Thin
- * provisioning is not supported by the
- * controller.
+ * provisioning is not supported by the
+ * controller.
* @NVME_SC_CTRL_LIST_INVALID: Controller List Invalid: The controller
- * list provided contains invalid controller
- * ids.
+ * list provided contains invalid controller
+ * ids.
* @NVME_SC_SELF_TEST_IN_PROGRESS: Device Self-test In Progress: The controller
- * or NVM subsystem already has a device
- * self-test operation in process.
+ * or NVM subsystem already has a device
+ * self-test operation in process.
* @NVME_SC_BP_WRITE_PROHIBITED: Boot Partition Write Prohibited: The
- * command is trying to modify a locked Boot
- * Partition.
+ * command is trying to modify a locked Boot
+ * Partition.
* @NVME_SC_INVALID_CTRL_ID: Invalid Controller Identifier:
* @NVME_SC_INVALID_SEC_CTRL_STATE: Invalid Secondary Controller State
* @NVME_SC_INVALID_CTRL_RESOURCES: Invalid Number of Controller Resources
* @NVME_SC_INVALID_RESOURCE_ID: Invalid Resource Identifier
* @NVME_SC_PMR_SAN_PROHIBITED: Sanitize Prohibited While Persistent
- * Memory Region is Enabled
+ * Memory Region is Enabled
* @NVME_SC_ANA_GROUP_ID_INVALID: ANA Group Identifier Invalid: The specified
- * ANA Group Identifier (ANAGRPID) is not
- * supported in the submitted command.
+ * ANA Group Identifier (ANAGRPID) is not
+ * supported in the submitted command.
* @NVME_SC_ANA_ATTACH_FAILED: ANA Attach Failed: The controller is not
- * attached to the namespace as a result
- * of an ANA condition.
+ * attached to the namespace as a result
+ * of an ANA condition.
* @NVME_SC_INSUFFICIENT_CAP: Insufficient Capacity: Requested operation
- * requires more free space than is currently
- * available.
+ * requires more free space than is currently
+ * available.
* @NVME_SC_NS_ATTACHMENT_LIMIT_EXCEEDED: Namespace Attachment Limit Exceeded:
- * Attaching the ns to a controller causes
- * max number of ns attachments allowed
- * to be exceeded.
+ * Attaching the ns to a controller causes
+ * max number of ns attachments allowed
+ * to be exceeded.
* @NVME_SC_PROHIBIT_CMD_EXEC_NOT_SUPPORTED: Prohibition of Command Execution
- * Not Supported
+ * Not Supported
* @NVME_SC_IOCS_NOT_SUPPORTED: I/O Command Set Not Supported
* @NVME_SC_IOCS_NOT_ENABLED: I/O Command Set Not Enabled
* @NVME_SC_IOCS_COMBINATION_REJECTED: I/O Command Set Combination Rejected
@@ -5668,7 +5779,7 @@ struct nvme_mi_vpd_hdr {
* transient condition.
* @NVME_SC_REQSTD_FUNCTION_DISABLED: Fabric Zoning is not enabled on the
* CDC
- * @NVME_SC_ZONEGRP_ORIGINATOR_INVL: The NQN contained in the ZoneGroup
+ * @NVME_SC_ZONEGRP_ORIGINATOR_INVLD: The NQN contained in the ZoneGroup
* Originator field does not match the
* Host NQN used by the DDC to connect
* to the CDC.
@@ -5677,114 +5788,114 @@ struct nvme_mi_vpd_hdr {
* @NVME_SC_READ_ONLY: Attempted Write to Read Only Range
* @NVME_SC_CMD_SIZE_LIMIT_EXCEEDED: Command Size Limit Exceeded
* @NVME_SC_CONNECT_FORMAT: Incompatible Format: The NVM subsystem
- * does not support the record format
- * specified by the host.
+ * does not support the record format
+ * specified by the host.
* @NVME_SC_CONNECT_CTRL_BUSY: Controller Busy: The controller is
- * already associated with a host.
+ * already associated with a host.
* @NVME_SC_CONNECT_INVALID_PARAM: Connect Invalid Parameters: One or more
- * of the command parameters.
+ * of the command parameters.
* @NVME_SC_CONNECT_RESTART_DISC: Connect Restart Discovery: The NVM
- * subsystem requested is not available.
+ * subsystem requested is not available.
* @NVME_SC_CONNECT_INVALID_HOST: Connect Invalid Host: The host is either
- * not allowed to establish an association
- * to any controller in the NVM subsystem or
- * the host is not allowed to establish an
- * association to the specified controller
+ * not allowed to establish an association
+ * to any controller in the NVM subsystem or
+ * the host is not allowed to establish an
+ * association to the specified controller
* @NVME_SC_DISCONNECT_INVALID_QTYPE: Invalid Queue Type: The command was sent
- * on the wrong queue type.
+ * on the wrong queue type.
* @NVME_SC_DISCOVERY_RESTART: Discover Restart: The snapshot of the
- * records is now invalid or out of date.
+ * records is now invalid or out of date.
* @NVME_SC_AUTH_REQUIRED: Authentication Required: NVMe in-band
- * authentication is required and the queue
- * has not yet been authenticated.
+ * authentication is required and the queue
+ * has not yet been authenticated.
* @NVME_SC_WRITE_FAULT: Write Fault: The write data could not be
- * committed to the media.
+ * committed to the media.
* @NVME_SC_READ_ERROR: Unrecovered Read Error: The read data
- * could not be recovered from the media.
+ * could not be recovered from the media.
* @NVME_SC_GUARD_CHECK: End-to-end Guard Check Error: The command
- * was aborted due to an end-to-end guard
- * check failure.
+ * was aborted due to an end-to-end guard
+ * check failure.
* @NVME_SC_APPTAG_CHECK: End-to-end Application Tag Check Error:
- * The command was aborted due to an
- * end-to-end application tag check failure.
+ * The command was aborted due to an
+ * end-to-end application tag check failure.
* @NVME_SC_REFTAG_CHECK: End-to-end Reference Tag Check Error: The
- * command was aborted due to an end-to-end
- * reference tag check failure.
+ * command was aborted due to an end-to-end
+ * reference tag check failure.
* @NVME_SC_COMPARE_FAILED: Compare Failure: The command failed due
- * to a miscompare during a Compare command.
+ * to a miscompare during a Compare command.
* @NVME_SC_ACCESS_DENIED: Access Denied: Access to the namespace
- * and/or LBA range is denied due to lack of
- * access rights.
+ * and/or LBA range is denied due to lack of
+ * access rights.
* @NVME_SC_UNWRITTEN_BLOCK: Deallocated or Unwritten Logical Block:
- * The command failed due to an attempt to
- * read from or verify an LBA range
- * containing a deallocated or unwritten
- * logical block.
+ * The command failed due to an attempt to
+ * read from or verify an LBA range
+ * containing a deallocated or unwritten
+ * logical block.
* @NVME_SC_STORAGE_TAG_CHECK: End-to-End Storage Tag Check Error: The
- * command was aborted due to an end-to-end
- * storage tag check failure.
+ * command was aborted due to an end-to-end
+ * storage tag check failure.
* @NVME_SC_ANA_INTERNAL_PATH_ERROR: Internal Path Error: The command was not
- * completed as the result of a controller
- * internal error that is specific to the
- * controller processing the command.
+ * completed as the result of a controller
+ * internal error that is specific to the
+ * controller processing the command.
* @NVME_SC_ANA_PERSISTENT_LOSS: Asymmetric Access Persistent Loss: The
- * requested function (e.g., command) is not
- * able to be performed as a result of the
- * relationship between the controller and
- * the namespace being in the ANA Persistent
- * Loss state.
+ * requested function (e.g., command) is not
+ * able to be performed as a result of the
+ * relationship between the controller and
+ * the namespace being in the ANA Persistent
+ * Loss state.
* @NVME_SC_ANA_INACCESSIBLE: Asymmetric Access Inaccessible: The
- * requested function (e.g., command) is not
- * able to be performed as a result of the
- * relationship between the controller and
- * the namespace being in the ANA
- * Inaccessible state.
+ * requested function (e.g., command) is not
+ * able to be performed as a result of the
+ * relationship between the controller and
+ * the namespace being in the ANA
+ * Inaccessible state.
* @NVME_SC_ANA_TRANSITION: Asymmetric Access Transition: The
- * requested function (e.g., command) is not
- * able to be performed as a result of the
- * relationship between the controller and
- * the namespace transitioning between
- * Asymmetric Namespace Access states.
+ * requested function (e.g., command) is not
+ * able to be performed as a result of the
+ * relationship between the controller and
+ * the namespace transitioning between
+ * Asymmetric Namespace Access states.
* @NVME_SC_CTRL_PATH_ERROR: Controller Pathing Error: A pathing error
- * was detected by the controller.
+ * was detected by the controller.
* @NVME_SC_HOST_PATH_ERROR: Host Pathing Error: A pathing error was
- * detected by the host.
+ * detected by the host.
* @NVME_SC_CMD_ABORTED_BY_HOST: Command Aborted By Host: The command was
- * aborted as a result of host action.
+ * aborted as a result of host action.
* @NVME_SC_CRD: Mask to get value of Command Retry Delay
- * index
+ * index
* @NVME_SC_MORE: More bit. If set, more status information
- * for this command as part of the Error
- * Information log that may be retrieved with
- * the Get Log Page command.
+ * for this command as part of the Error
+ * Information log that may be retrieved with
+ * the Get Log Page command.
* @NVME_SC_DNR: Do Not Retry bit. If set, if the same
- * command is re-submitted to any controller
- * in the NVM subsystem, then that
- * re-submitted command is expected to fail.
+ * command is re-submitted to any controller
+ * in the NVM subsystem, then that
+ * re-submitted command is expected to fail.
* @NVME_SC_ZNS_INVALID_OP_REQUEST: Invalid Zone Operation Request:
- * The operation requested is invalid. This may be due to
- * various conditions, including: attempting to allocate a
- * ZRWA when a zone is not in the ZSE:Empty state; or
- * invalid Flush Explicit ZRWA Range Send Zone Action
- * operation.
+ * The operation requested is invalid. This may be due to
+ * various conditions, including: attempting to allocate a
+ * ZRWA when a zone is not in the ZSE:Empty state; or
+ * invalid Flush Explicit ZRWA Range Send Zone Action
+ * operation.
* @NVME_SC_ZNS_ZRWA_RESOURCES_UNAVAILABLE: ZRWA Resources Unavailable:
- * No ZRWAs are available.
+ * No ZRWAs are available.
* @NVME_SC_ZNS_BOUNDARY_ERROR: Zone Boundary Error: The command specifies
- * logical blocks in more than one zone.
+ * logical blocks in more than one zone.
* @NVME_SC_ZNS_FULL: Zone Is Full: The accessed zone is in the
- * ZSF:Full state.
+ * ZSF:Full state.
* @NVME_SC_ZNS_READ_ONLY: Zone Is Read Only: The accessed zone is
- * in the ZSRO:Read Only state.
+ * in the ZSRO:Read Only state.
* @NVME_SC_ZNS_OFFLINE: Zone Is Offline: The accessed zone is
- * in the ZSO:Offline state.
+ * in the ZSO:Offline state.
* @NVME_SC_ZNS_INVALID_WRITE: Zone Invalid Write: The write to a zone
- * was not at the write pointer.
+ * was not at the write pointer.
* @NVME_SC_ZNS_TOO_MANY_ACTIVE: Too Many Active Zones: The controller
- * does not allow additional active zones.
- * @NVME_SC_ZNS_TOO_MANY_OPENS: Too Many Open Zones: The controller does
- * not allow additional open zones.
+ * does not allow additional active zones.
+ * @NVME_SC_ZNS_TOO_MANY_OPENS: Too Many Open Zones: The controller does
+ * not allow additional open zones.
* @NVME_SC_ZNS_INVAL_TRANSITION: Invalid Zone State Transition: The request
- * is not a valid zone state transition.
+ * is not a valid zone state transition.
*/
enum nvme_status_field {
/*
@@ -5935,16 +6046,16 @@ enum nvme_status_field {
/*
* I/O Command Set Specific - ZNS commands:
*/
- NVME_SC_ZNS_INVALID_OP_REQUEST = 0xb6,
+ NVME_SC_ZNS_INVALID_OP_REQUEST = 0xb6,
NVME_SC_ZNS_ZRWA_RESOURCES_UNAVAILABLE = 0xb7,
- NVME_SC_ZNS_BOUNDARY_ERROR = 0xb8,
- NVME_SC_ZNS_FULL = 0xb9,
- NVME_SC_ZNS_READ_ONLY = 0xba,
- NVME_SC_ZNS_OFFLINE = 0xbb,
- NVME_SC_ZNS_INVALID_WRITE = 0xbc,
- NVME_SC_ZNS_TOO_MANY_ACTIVE = 0xbd,
- NVME_SC_ZNS_TOO_MANY_OPENS = 0xbe,
- NVME_SC_ZNS_INVAL_TRANSITION = 0xbf,
+ NVME_SC_ZNS_BOUNDARY_ERROR = 0xb8,
+ NVME_SC_ZNS_FULL = 0xb9,
+ NVME_SC_ZNS_READ_ONLY = 0xba,
+ NVME_SC_ZNS_OFFLINE = 0xbb,
+ NVME_SC_ZNS_INVALID_WRITE = 0xbc,
+ NVME_SC_ZNS_TOO_MANY_ACTIVE = 0xbd,
+ NVME_SC_ZNS_TOO_MANY_OPENS = 0xbe,
+ NVME_SC_ZNS_INVAL_TRANSITION = 0xbf,
/*
* Media and Data Integrity Errors:
@@ -5980,9 +6091,10 @@ enum nvme_status_field {
/**
* nvme_status_code_type() - Returns the NVMe Status Code Type
- * @status_field: The NVMe Completion Queue Entry's Status Field
+ * @status_field: The NVMe Completion Queue Entry's Status Field
+ * See &enum nvme_status_field
*
- * See &enum nvme_status_field
+ * Returns: status code type
*/
static inline __u16 nvme_status_code_type(__u16 status_field)
{
@@ -5991,9 +6103,10 @@ static inline __u16 nvme_status_code_type(__u16 status_field)
/**
* nvme_status_code() - Returns the NVMe Status Code
- * @status_field: The NVMe Completion Queue Entry's Status Field
+ * @status_field: The NVMe Completion Queue Entry's Status Field
+ * See &enum nvme_status_field
*
- * See &enum nvme_status_field
+ * Returns: status code
*/
static inline __u16 nvme_status_code(__u16 status_field)
{
@@ -6077,40 +6190,43 @@ enum nvme_admin_opcode {
};
/**
- * enum nvme_identify_cns -
+ * enum nvme_identify_cns - Identify - CNS Values
* @NVME_IDENTIFY_CNS_NS: Identify Namespace data structure
- * @NVME_IDENTIFY_CNS_CTRL: Identify Controller data structur
+ * @NVME_IDENTIFY_CNS_CTRL: Identify Controller data structure
* @NVME_IDENTIFY_CNS_NS_ACTIVE_LIST: Active Namespace ID list
* @NVME_IDENTIFY_CNS_NS_DESC_LIST: Namespace Identification Descriptor list
* @NVME_IDENTIFY_CNS_NVMSET_LIST: NVM Set List
* @NVME_IDENTIFY_CNS_CSI_NS: I/O Command Set specific Identify
- * Namespace data structure
+ * Namespace data structure
* @NVME_IDENTIFY_CNS_CSI_CTRL: I/O Command Set specific Identify
- * Controller data structure
+ * Controller data structure
* @NVME_IDENTIFY_CNS_CSI_NS_ACTIVE_LIST: Active Namespace ID list associated
- * with the specified I/O Command Set
+ * with the specified I/O Command Set
* @NVME_IDENTIFY_CNS_CSI_INDEPENDENT_ID_NS: I/O Command Set Independent Identify
- * Namespace data structure
+ * @NVME_IDENTIFY_CNS_NS_USER_DATA_FORMAT: Namespace user data format
+ * @NVME_IDENTIFY_CNS_CSI_NS_USER_DATA_FORMAT: I/O Command Set specific user data
+ * format
+ * Namespace data structure
* @NVME_IDENTIFY_CNS_ALLOCATED_NS_LIST: Allocated Namespace ID list
* @NVME_IDENTIFY_CNS_ALLOCATED_NS: Identify Namespace data structure for
- * the specified allocated NSID
+ * the specified allocated NSID
* @NVME_IDENTIFY_CNS_NS_CTRL_LIST: Controller List of controllers attached
- * to the specified NSID
+ * to the specified NSID
* @NVME_IDENTIFY_CNS_CTRL_LIST: Controller List of controllers that exist
- * in the NVM subsystem
+ * in the NVM subsystem
* @NVME_IDENTIFY_CNS_PRIMARY_CTRL_CAP: Primary Controller Capabilities data
- * structure for the specified primary controller
+ * structure for the specified primary controller
* @NVME_IDENTIFY_CNS_SECONDARY_CTRL_LIST: Secondary Controller list of controllers
- * associated with the primary controller
- * processing the command
- * @NVME_IDENTIFY_CNS_NS_GRANULARITY: A Namespace Granularity Lis
+ * associated with the primary controller
+ * processing the command
+ * @NVME_IDENTIFY_CNS_NS_GRANULARITY: A Namespace Granularity List
* @NVME_IDENTIFY_CNS_UUID_LIST: A UUID List
* @NVME_IDENTIFY_CNS_DOMAIN_LIST: Domain List
* @NVME_IDENTIFY_CNS_ENDURANCE_GROUP_ID: Endurance Group List
* @NVME_IDENTIFY_CNS_CSI_ALLOCATED_NS_LIST: I/O Command Set specific Allocated Namespace
- * ID list
+ * ID list
* @NVME_IDENTIFY_CNS_CSI_ID_NS_DATA_STRUCTURE: I/O Command Set specific ID Namespace
- * Data Structure for Allocated Namespace ID
+ * Data Structure for Allocated Namespace ID
* @NVME_IDENTIFY_CNS_COMMAND_SET_STRUCTURE: Base Specification 2.0a section 5.17.2.21
*/
enum nvme_identify_cns {
@@ -6141,7 +6257,7 @@ enum nvme_identify_cns {
};
/**
- * enum nvme_cmd_get_log_lid -
+ * enum nvme_cmd_get_log_lid - Get Log Page -Log Page Identifiers
* @NVME_LOG_LID_SUPPORTED_LOG_PAGES: Supported Log Pages
* @NVME_LOG_LID_ERROR: Error Information
* @NVME_LOG_LID_SMART: SMART / Health Information
@@ -6197,7 +6313,7 @@ enum nvme_cmd_get_log_lid {
};
/**
- * enum nvme_features_id -
+ * enum nvme_features_id - Features - Feature Identifiers
* @NVME_FEAT_FID_ARBITRATION: Arbitration
* @NVME_FEAT_FID_POWER_MGMT: Power Management
* @NVME_FEAT_FID_LBA_RANGE: LBA Range Type
@@ -6271,7 +6387,7 @@ enum nvme_features_id {
};
/**
- * enum nvme_feat -
+ * enum nvme_feat - Features Access Shifts/Masks values
* @NVME_FEAT_ARBITRATION_BURST_SHIFT:
* @NVME_FEAT_ARBITRATION_BURST_MASK:
* @NVME_FEAT_ARBITRATION_LPW_SHIFT:
@@ -6473,7 +6589,7 @@ enum nvme_feat {
};
/**
- * enum nvme_get_features_sel -
+ * enum nvme_get_features_sel - Get Features - Select
* @NVME_GET_FEATURES_SEL_CURRENT: Current value
* @NVME_GET_FEATURES_SEL_DEFAULT: Default value
* @NVME_GET_FEATURES_SEL_SAVED: Saved value
@@ -6489,9 +6605,9 @@ enum nvme_get_features_sel {
/**
* enum nvme_cmd_format_mset - Format NVM - Metadata Settings
* @NVME_FORMAT_MSET_SEPARATE: indicates that the metadata is transferred
- * as part of a separate buffer.
+ * as part of a separate buffer.
* @NVME_FORMAT_MSET_EXTENDED: indicates that the metadata is transferred
- * as part of an extended data LBA.
+ * as part of an extended data LBA.
*/
enum nvme_cmd_format_mset {
NVME_FORMAT_MSET_SEPARATE = 0,
@@ -6515,9 +6631,9 @@ enum nvme_cmd_format_pi {
/**
* enum nvme_cmd_format_pil - Format NVM - Protection Information Location
* @NVME_FORMAT_PIL_LAST: Protection information is transferred as the last
- * bytes of metadata.
+ * bytes of metadata.
* @NVME_FORMAT_PIL_FIRST: Protection information is transferred as the first
- * bytes of metadata.
+ * bytes of metadata.
*/
enum nvme_cmd_format_pil {
NVME_FORMAT_PIL_LAST = 0,
@@ -6528,16 +6644,16 @@ enum nvme_cmd_format_pil {
* enum nvme_cmd_format_ses - Format NVM - Secure Erase Settings
* @NVME_FORMAT_SES_NONE: No secure erase operation requested.
* @NVME_FORMAT_SES_USER_DATA_ERASE: User Data Erase: All user data shall be erased,
- * contents of the user data after the erase is
- * indeterminate (e.g. the user data may be zero
- * filled, one filled, etc.). If a User Data Erase
- * is requested and all affected user data is
- * encrypted, then the controller is allowed
- * to use a cryptographic erase to perform
- * the requested User Data Erase.
+ * contents of the user data after the erase is
+ * indeterminate (e.g. the user data may be zero
+ * filled, one filled, etc.). If a User Data Erase
+ * is requested and all affected user data is
+ * encrypted, then the controller is allowed
+ * to use a cryptographic erase to perform
+ * the requested User Data Erase.
* @NVME_FORMAT_SES_CRYPTO_ERASE: Cryptographic Erase: All user data shall
- * be erased cryptographically. This is
- * accomplished by deleting the encryption key.
+ * be erased cryptographically. This is
+ * accomplished by deleting the encryption key.
*/
enum nvme_cmd_format_ses {
NVME_FORMAT_SES_NONE = 0,
@@ -6546,7 +6662,7 @@ enum nvme_cmd_format_ses {
};
/**
- * enum nvme_ns_mgmt_sel -
+ * enum nvme_ns_mgmt_sel - Namespace Management - Select
* @NVME_NS_MGMT_SEL_CREATE: Namespace Create selection
* @NVME_NS_MGMT_SEL_DELETE: Namespace Delete selection
*/
@@ -6556,7 +6672,7 @@ enum nvme_ns_mgmt_sel {
};
/**
- * enum nvme_ns_attach_sel -
+ * enum nvme_ns_attach_sel - Namespace Attachment - Select
* @NVME_NS_ATTACH_SEL_CTRL_ATTACH: Namespace attach selection
* @NVME_NS_ATTACH_SEL_CTRL_DEATTACH: Namespace detach selection
*/
@@ -6566,30 +6682,30 @@ enum nvme_ns_attach_sel {
};
/**
- * enum nvme_fw_commit_ca -
+ * enum nvme_fw_commit_ca - Firmware Commit - Commit Action
* @NVME_FW_COMMIT_CA_REPLACE: Downloaded image replaces the existing
- * image, if any, in the specified Firmware
- * Slot. The newly placed image is not
- * activated.
+ * image, if any, in the specified Firmware
+ * Slot. The newly placed image is not
+ * activated.
* @NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE: Downloaded image replaces the existing
- * image, if any, in the specified Firmware
- * Slot. The newly placed image is activated
- * at the next Controller Level Reset.
+ * image, if any, in the specified Firmware
+ * Slot. The newly placed image is activated
+ * at the next Controller Level Reset.
* @NVME_FW_COMMIT_CA_SET_ACTIVE: The existing image in the specified
- * Firmware Slot is activated at the
- * next Controller Level Reset.
+ * Firmware Slot is activated at the
+ * next Controller Level Reset.
* @NVME_FW_COMMIT_CA_REPLACE_AND_ACTIVATE_IMMEDIATE: Downloaded image replaces the existing
- * image, if any, in the specified Firmware
- * Slot and is then activated immediately.
- * If there is not a newly downloaded image,
- * then the existing image in the specified
- * firmware slot is activated immediately.
+ * image, if any, in the specified Firmware
+ * Slot and is then activated immediately.
+ * If there is not a newly downloaded image,
+ * then the existing image in the specified
+ * firmware slot is activated immediately.
* @NVME_FW_COMMIT_CA_REPLACE_BOOT_PARTITION: Downloaded image replaces the Boot
- * Partition specified by the Boot
- * Partition ID field.
+ * Partition specified by the Boot
+ * Partition ID field.
* @NVME_FW_COMMIT_CA_ACTIVATE_BOOT_PARTITION: Mark the Boot Partition specified in
- * the BPID field as active and update
- * BPINFO.ABPID.
+ * the BPID field as active and update
+ * BPINFO.ABPID.
*/
enum nvme_fw_commit_ca {
NVME_FW_COMMIT_CA_REPLACE = 0,
@@ -6601,7 +6717,7 @@ enum nvme_fw_commit_ca {
};
/**
- * enum nvme_directive_dtype -
+ * enum nvme_directive_dtype - Directive Types
* @NVME_DIRECTIVE_DTYPE_IDENTIFY: Identify directive type
* @NVME_DIRECTIVE_DTYPE_STREAMS: Streams directive type
*/
@@ -6611,7 +6727,7 @@ enum nvme_directive_dtype {
};
/**
- * enum nvme_directive_receive_doper -
+ * enum nvme_directive_receive_doper - Directive Receive Directive Operation
* @NVME_DIRECTIVE_RECEIVE_IDENTIFY_DOPER_PARAM:
* @NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_PARAM:
* @NVME_DIRECTIVE_RECEIVE_STREAMS_DOPER_STATUS:
@@ -6625,7 +6741,7 @@ enum nvme_directive_receive_doper {
};
/**
- * enum nvme_directive_send_doper -
+ * enum nvme_directive_send_doper - Directive Send Directive Operation
* @NVME_DIRECTIVE_SEND_IDENTIFY_DOPER_ENDIR:
* @NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_IDENTIFIER:
* @NVME_DIRECTIVE_SEND_STREAMS_DOPER_RELEASE_RESOURCE:
@@ -6637,7 +6753,7 @@ enum nvme_directive_send_doper {
};
/**
- * enum nvme_directive_send_identify_endir -
+ * enum nvme_directive_send_identify_endir - Enable Directive
* @NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_DISABLE:
* @NVME_DIRECTIVE_SEND_IDENTIFY_ENDIR_ENABLE:
*/
@@ -6648,7 +6764,7 @@ enum nvme_directive_send_identify_endir {
/**
* enum nvme_sanitize_sanact - Sanitize Action
- * @NVME_SANITIZE_SANACT_EXIT_FAILURE: Exit Failure Mode.
+ * @NVME_SANITIZE_SANACT_EXIT_FAILURE: Exit Failure Mode.
* @NVME_SANITIZE_SANACT_START_BLOCK_ERASE: Start a Block Erase sanitize operation.
* @NVME_SANITIZE_SANACT_START_OVERWRITE: Start an Overwrite sanitize operation.
* @NVME_SANITIZE_SANACT_START_CRYPTO_ERASE: Start a Crypto Erase sanitize operation.
@@ -6675,9 +6791,9 @@ enum nvme_dst_stc {
};
/**
- * enum nvme_virt_mgmt_act -
+ * enum nvme_virt_mgmt_act - Virtualization Management - Action
* @NVME_VIRT_MGMT_ACT_PRIM_CTRL_FLEX_ALLOC: Primary Controller Flexible
- * Allocation
+ * Allocation
* @NVME_VIRT_MGMT_ACT_OFFLINE_SEC_CTRL: Secondary Controller Offline
* @NVME_VIRT_MGMT_ACT_ASSIGN_SEC_CTRL: Secondary Controller Assign
* @NVME_VIRT_MGMT_ACT_ONLINE_SEC_CTRL: Secondary Controller Online
@@ -6690,7 +6806,7 @@ enum nvme_virt_mgmt_act {
};
/**
- * enum nvme_virt_mgmt_rt -
+ * enum nvme_virt_mgmt_rt - Virtualization Management - Resource Type
* @NVME_VIRT_MGMT_RT_VQ_RESOURCE: VQ Resources
* @NVME_VIRT_MGMT_RT_VI_RESOURCE: VI Resources
*/
@@ -6700,7 +6816,7 @@ enum nvme_virt_mgmt_rt {
};
/**
- * enum nvme_ns_write_protect_cfg -
+ * enum nvme_ns_write_protect_cfg - Write Protection - Write Protection State
* @NVME_NS_WP_CFG_NONE: No Write Protect
* @NVME_NS_WP_CFG_PROTECT: Write Protect
* @NVME_NS_WP_CFG_PROTECT_POWER_CYCLE: Write Protect Until Power Cycle
@@ -6714,7 +6830,7 @@ enum nvme_ns_write_protect_cfg {
};
/**
- * enum nvme_log_ana_lsp -
+ * enum nvme_log_ana_lsp - Asymmetric Namespace Access - Return Groups Only
* @NVME_LOG_ANA_LSP_RGO_NAMESPACES:
* @NVME_LOG_ANA_LSP_RGO_GROUPS_ONLY:
*/
@@ -6724,7 +6840,7 @@ enum nvme_log_ana_lsp {
};
/**
- * enum nvme_pevent_log_action -
+ * enum nvme_pevent_log_action - Persistent Event Log - Action
* @NVME_PEVENT_LOG_READ: Read Log Data
* @NVME_PEVENT_LOG_EST_CTX_AND_READ: Establish Context and Read Log Data
* @NVME_PEVENT_LOG_RELEASE_CTX: Release Context
@@ -6736,7 +6852,7 @@ enum nvme_pevent_log_action {
};
/**
- * enum nvme_feat_tmpthresh_thsel -
+ * enum nvme_feat_tmpthresh_thsel - Temperature Threshold - Threshold Type Select
* @NVME_FEATURE_TEMPTHRESH_THSEL_OVER: Over temperature threshold select
* @NVME_FEATURE_TEMPTHRESH_THSEL_UNDER: Under temperature threshold select
*/
@@ -6746,7 +6862,7 @@ enum nvme_feat_tmpthresh_thsel {
};
/**
- * enum nvme_features_async_event_config_flags -
+ * enum nvme_features_async_event_config_flags - Asynchronous Event Configuration configuration flags
* @NVME_FEATURE_AENCFG_SMART_CRIT_SPARE:
* @NVME_FEATURE_AENCFG_SMART_CRIT_TEMPERATURE:
* @NVME_FEATURE_AENCFG_SMART_CRIT_DEGRADED:
@@ -6780,7 +6896,7 @@ enum nvme_features_async_event_config_flags {
};
/**
- * enum nvme_feat_plm_window_select -
+ * enum nvme_feat_plm_window_select - Predictable Latency Per NVM Set Log
* @NVME_FEATURE_PLM_DTWIN: Deterministic Window select
* @NVME_FEATURE_PLM_NDWIN: Non-Deterministic Window select
*/
@@ -6790,7 +6906,7 @@ enum nvme_feat_plm_window_select {
};
/**
- * enum nvme_feat_resv_notify_flags -
+ * enum nvme_feat_resv_notify_flags - Reservation Notification Configuration
* @NVME_FEAT_RESV_NOTIFY_REGPRE: Mask Registration Preempted Notification
* @NVME_FEAT_RESV_NOTIFY_RESREL: Mask Reservation Released Notification
* @NVME_FEAT_RESV_NOTIFY_RESPRE: Mask Reservation Preempted Notification
@@ -6802,21 +6918,21 @@ enum nvme_feat_resv_notify_flags {
};
/**
- * enum nvme_feat_nswpcfg_state -
+ * enum nvme_feat_nswpcfg_state - Write Protection - Write Protection State
* @NVME_FEAT_NS_NO_WRITE_PROTECT: No Write Protect
* @NVME_FEAT_NS_WRITE_PROTECT: Write Protect
* @NVME_FEAT_NS_WRITE_PROTECT_PWR_CYCLE: Write Protect Until Power Cycle
* @NVME_FEAT_NS_WRITE_PROTECT_PERMANENT: Permanent Write Protect
*/
enum nvme_feat_nswpcfg_state {
- NVME_FEAT_NS_NO_WRITE_PROTECT = 0,
+ NVME_FEAT_NS_NO_WRITE_PROTECT = 0,
NVME_FEAT_NS_WRITE_PROTECT = 1,
NVME_FEAT_NS_WRITE_PROTECT_PWR_CYCLE = 2,
NVME_FEAT_NS_WRITE_PROTECT_PERMANENT = 3,
};
/**
- * enum nvme_fctype -
+ * enum nvme_fctype - Fabrics Command Types
* @nvme_fabrics_type_property_set: Property set
* @nvme_fabrics_type_connect: Connect
* @nvme_fabrics_type_property_get: Property Get
@@ -6834,7 +6950,7 @@ enum nvme_fctype {
};
/**
- * enum nvme_io_opcode -
+ * enum nvme_io_opcode - Opcodes for I/O Commands
* @nvme_cmd_flush: Flush
* @nvme_cmd_write: Write
* @nvme_cmd_read: Read
@@ -6872,8 +6988,9 @@ enum nvme_io_opcode {
};
/**
- * enum nvme_io_control_flags -
+ * enum nvme_io_control_flags - I/O control flags
* @NVME_IO_DTYPE_STREAMS: Directive Type Streams
+ * @NVME_IO_STC: Storage Tag Check
* @NVME_IO_DEAC: Deallocate
* @NVME_IO_ZNS_APPEND_PIREMAP: Protection Information Remap
* @NVME_IO_PRINFO_PRCHK_REF: Protection Information Check Reference Tag
@@ -6885,6 +7002,7 @@ enum nvme_io_opcode {
*/
enum nvme_io_control_flags {
NVME_IO_DTYPE_STREAMS = 1 << 4,
+ NVME_IO_STC = 1 << 8,
NVME_IO_DEAC = 1 << 9,
NVME_IO_ZNS_APPEND_PIREMAP = 1 << 9,
NVME_IO_PRINFO_PRCHK_REF = 1 << 10,
@@ -6896,18 +7014,18 @@ enum nvme_io_control_flags {
};
/**
- * enum nvme_io_dsm_flags -
+ * enum nvme_io_dsm_flags - Dataset Management flags
* @NVME_IO_DSM_FREQ_UNSPEC: No frequency information provided
* @NVME_IO_DSM_FREQ_TYPICAL: Typical number of reads and writes
- * expected for this LBA range
+ * expected for this LBA range
* @NVME_IO_DSM_FREQ_RARE: Infrequent writes and infrequent
- * reads to the LBA range indicated
+ * reads to the LBA range indicated
* @NVME_IO_DSM_FREQ_READS: Infrequent writes and frequent
- * reads to the LBA range indicated
+ * reads to the LBA range indicated
* @NVME_IO_DSM_FREQ_WRITES: Frequent writes and infrequent
- * reads to the LBA range indicated
+ * reads to the LBA range indicated
* @NVME_IO_DSM_FREQ_RW: Frequent writes and frequent reads
- * to the LBA range indicated
+ * to the LBA range indicated
* @NVME_IO_DSM_FREQ_ONCE:
* @NVME_IO_DSM_FREQ_PREFETCH:
* @NVME_IO_DSM_FREQ_TEMP:
@@ -6937,10 +7055,10 @@ enum nvme_io_dsm_flags {
};
/**
- * enum nvme_dsm_attributes -
- * @NVME_DSMGMT_IDR: Attribute – Integral Dataset for Read
- * @NVME_DSMGMT_IDW: Attribute – Integral Dataset for Write
- * @NVME_DSMGMT_AD: Attribute – Deallocate
+ * enum nvme_dsm_attributes - Dataset Management attributes
+ * @NVME_DSMGMT_IDR: Attribute -Integral Dataset for Read
+ * @NVME_DSMGMT_IDW: Attribute - Integral Dataset for Write
+ * @NVME_DSMGMT_AD: Attribute - Deallocate
*/
enum nvme_dsm_attributes {
NVME_DSMGMT_IDR = 1 << 0,
@@ -6949,7 +7067,7 @@ enum nvme_dsm_attributes {
};
/**
- * enum nvme_resv_rtype -
+ * enum nvme_resv_rtype - Reservation Type Encoding
* @NVME_RESERVATION_RTYPE_WE: Write Exclusive Reservation
* @NVME_RESERVATION_RTYPE_EA: Exclusive Access Reservation
* @NVME_RESERVATION_RTYPE_WERO: Write Exclusive - Registrants Only Reservation
@@ -6967,7 +7085,7 @@ enum nvme_resv_rtype {
};
/**
- * enum nvme_resv_racqa -
+ * enum nvme_resv_racqa - Reservation Acquire - Reservation Acquire Action
* @NVME_RESERVATION_RACQA_ACQUIRE: Acquire
* @NVME_RESERVATION_RACQA_PREEMPT: Preempt
* @NVME_RESERVATION_RACQA_PREEMPT_AND_ABORT: Preempt and Abort
@@ -6979,7 +7097,7 @@ enum nvme_resv_racqa {
};
/**
- * enum nvme_resv_rrega -
+ * enum nvme_resv_rrega - Reservation Register - Reservation Register Action
* @NVME_RESERVATION_RREGA_REGISTER_KEY: Register Reservation Key
* @NVME_RESERVATION_RREGA_UNREGISTER_KEY: Unregister Reservation Key
* @NVME_RESERVATION_RREGA_REPLACE_KEY: Replace Reservation Key
@@ -6991,12 +7109,12 @@ enum nvme_resv_rrega {
};
/**
- * enum nvme_resv_cptpl -
+ * enum nvme_resv_cptpl - Reservation Register - Change Persist Through Power Loss State
* @NVME_RESERVATION_CPTPL_NO_CHANGE: No change to PTPL state
* @NVME_RESERVATION_CPTPL_CLEAR: Reservations are released and
- * registrants are cleared on a power on
+ * registrants are cleared on a power on
* @NVME_RESERVATION_CPTPL_PERSIST: Reservations and registrants persist
- * across a power loss
+ * across a power loss
*/
enum nvme_resv_cptpl {
NVME_RESERVATION_CPTPL_NO_CHANGE = 0,
@@ -7005,7 +7123,7 @@ enum nvme_resv_cptpl {
};
/**
- * enum nvme_resv_rrela -
+ * enum nvme_resv_rrela - Reservation Release - Reservation Release Action
* @NVME_RESERVATION_RRELA_RELEASE: Release
* @NVME_RESERVATION_RRELA_CLEAR: Clear
*/
@@ -7015,7 +7133,7 @@ enum nvme_resv_rrela {
};
/**
- * enum nvme_zns_send_action -
+ * enum nvme_zns_send_action - Zone Management Send - Zone Send Action
* @NVME_ZNS_ZSA_CLOSE: Close Zone
* @NVME_ZNS_ZSA_FINISH: Finish Zone
* @NVME_ZNS_ZSA_OPEN: Open Zone
@@ -7035,7 +7153,7 @@ enum nvme_zns_send_action {
};
/**
- * enum nvme_zns_recv_action -
+ * enum nvme_zns_recv_action - Zone Management Receive - Zone Receive Action Specific Features
* @NVME_ZNS_ZRA_REPORT_ZONES: Report Zones
* @NVME_ZNS_ZRA_EXTENDED_REPORT_ZONES: Extended Report Zones
*/
@@ -7045,7 +7163,7 @@ enum nvme_zns_recv_action {
};
/**
- * enum nvme_zns_report_options -
+ * enum nvme_zns_report_options - Zone Management Receive - Zone Receive Action Specific Field
* @NVME_ZNS_ZRAS_REPORT_ALL: List all zones
* @NVME_ZNS_ZRAS_REPORT_EMPTY: List the zones in the ZSE:Empty state
* @NVME_ZNS_ZRAS_REPORT_IMPL_OPENED: List the zones in the ZSIO:Implicitly Opened state
diff --git a/src/nvme/util.c b/src/nvme/util.c
index 799c0cf..ff5e0d8 100644
--- a/src/nvme/util.c
+++ b/src/nvme/util.c
@@ -23,6 +23,9 @@
#include "util.h"
#include "log.h"
+/* Source Code Control System, query version of binary with 'what' */
+const char sccsid[] = "@(#)libnvme " GIT_VERSION;
+
static inline __u8 nvme_generic_status_to_errno(__u16 status)
{
switch (status) {
@@ -389,6 +392,21 @@ void nvme_init_copy_range(struct nvme_copy_range *copy, __u16 *nlbs,
}
}
+void nvme_init_copy_range_f1(struct nvme_copy_range_f1 *copy, __u16 *nlbs,
+ __u64 *slbas, __u64 *eilbrts, __u32 *elbatms,
+ __u32 *elbats, __u16 nr)
+{
+ int i;
+
+ for (i = 0; i < nr; i++) {
+ copy[i].nlb = cpu_to_le16(nlbs[i]);
+ copy[i].slba = cpu_to_le64(slbas[i]);
+ copy[i].elbt[2] = cpu_to_le64(eilbrts[i]);
+ copy[i].elbatm = cpu_to_le16(elbatms[i]);
+ copy[i].elbat = cpu_to_le16(elbats[i]);
+ }
+}
+
void nvme_init_dsm_range(struct nvme_dsm_range *dsm, __u32 *ctx_attrs,
__u32 *llbas, __u64 *slbas, __u16 nr_ranges)
{
@@ -432,6 +450,9 @@ int nvme_get_feature_length(int fid, __u32 cdw11, __u32 *len)
case NVME_FEAT_FID_HOST_ID:
*len = (cdw11 & 0x1) ? 16 : 8;
break;
+ case NVME_FEAT_FID_HOST_MEM_BUF:
+ *len = sizeof(struct nvme_host_mem_buf_attrs);
+ break;
case NVME_FEAT_FID_ARBITRATION:
case NVME_FEAT_FID_POWER_MGMT:
case NVME_FEAT_FID_TEMP_THRESH:
@@ -442,7 +463,6 @@ int nvme_get_feature_length(int fid, __u32 cdw11, __u32 *len)
case NVME_FEAT_FID_IRQ_CONFIG:
case NVME_FEAT_FID_WRITE_ATOMIC:
case NVME_FEAT_FID_ASYNC_EVENT:
- case NVME_FEAT_FID_HOST_MEM_BUF:
case NVME_FEAT_FID_KATO:
case NVME_FEAT_FID_HCTM:
case NVME_FEAT_FID_NOPSC:
@@ -516,6 +536,11 @@ static const char * const libnvme_status[] = {
[ENVME_CONNECT_INVAL_TR] = "invalid transport type",
[ENVME_CONNECT_LOOKUP_SUBSYS_NAME] = "failed to lookup subsystem name",
[ENVME_CONNECT_LOOKUP_SUBSYS] = "failed to lookup subsystem",
+ [ENVME_CONNECT_ALREADY] = "already connnected",
+ [ENVME_CONNECT_INVAL] = "invalid arguments/configuration",
+ [ENVME_CONNECT_ADDRINUSE] = "hostnqn already in use",
+ [ENVME_CONNECT_NODEV] = "invalid interface",
+ [ENVME_CONNECT_OPNOTSUPP] ="not supported",
};
const char *nvme_errno_to_string(int status)
@@ -775,3 +800,15 @@ struct nvmf_ext_attr *nvmf_exat_ptr_next(struct nvmf_ext_attr *p)
return (struct nvmf_ext_attr *)
((uintptr_t)p + (ptrdiff_t)nvmf_exat_size(le16_to_cpu(p->exatlen)));
}
+
+const char *nvme_get_version(enum nvme_version type)
+{
+ switch(type) {
+ case NVME_VERSION_PROJECT:
+ return PROJECT_VERSION;
+ case NVME_VERSION_GIT:
+ return GIT_VERSION;
+ default:
+ return "n/a";
+ }
+}
diff --git a/src/nvme/util.h b/src/nvme/util.h
index 277b857..6f1d3e9 100644
--- a/src/nvme/util.h
+++ b/src/nvme/util.h
@@ -4,7 +4,7 @@
* Copyright (c) 2020 Western Digital Corporation or its affiliates.
*
* Authors: Keith Busch <keith.busch@wdc.com>
- * Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
+ * Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
*/
#ifndef _LIBNVME_UTIL_H
#define _LIBNVME_UTIL_H
@@ -31,6 +31,11 @@
* @ENVME_CONNECT_INVAL_TR: invalid transport type
* @ENVME_CONNECT_LOOKUP_SUBSYS_NAME: failed to lookup subsystem name
* @ENVME_CONNECT_LOOKUP_SUBSYS: failed to lookup subsystem
+ * @ENVME_CONNECT_ALREADY: the connect attempt failed, already connected
+ * @ENVME_CONNECT_INVAL: invalid arguments/configuration
+ * @ENVME_CONNECT_ADDRINUSE: hostnqn already in use
+ * @ENVME_CONNECT_NODEV: invalid interface
+ * @ENVME_CONNECT_OPNOTSUPP: not supported
*/
enum nvme_connect_err {
ENVME_CONNECT_RESOLVE = 1000,
@@ -45,11 +50,16 @@ enum nvme_connect_err {
ENVME_CONNECT_INVAL_TR,
ENVME_CONNECT_LOOKUP_SUBSYS_NAME,
ENVME_CONNECT_LOOKUP_SUBSYS,
+ ENVME_CONNECT_ALREADY,
+ ENVME_CONNECT_INVAL,
+ ENVME_CONNECT_ADDRINUSE,
+ ENVME_CONNECT_NODEV,
+ ENVME_CONNECT_OPNOTSUPP,
};
/**
* nvme_status_to_errno() - Converts nvme return status to errno
- * @status: Return status from an nvme passthrough commmand
+ * @status: Return status from an nvme passthrough command
* @fabrics: Set to true if &status is to a fabrics target.
*
* Return: An errno representing the nvme status if it is an nvme status field,
@@ -59,7 +69,7 @@ __u8 nvme_status_to_errno(int status, bool fabrics);
/**
* nvme_status_to_string() - Returns string describing nvme return status.
- * @status: Return status from an nvme passthrough commmand
+ * @status: Return status from an nvme passthrough command
* @fabrics: Set to true if &status is to a fabrics target.
*
* Return: String representation of the nvme status if it is an nvme status field,
@@ -119,11 +129,25 @@ void nvme_init_copy_range(struct nvme_copy_range *copy, __u16 *nlbs,
__u32 *elbats, __u16 nr);
/**
+ * nvme_init_copy_range_f1() - Constructs a copy range f1 structure
+ * @copy: Copy range array
+ * @nlbs: Number of logical blocks
+ * @slbas: Starting LBA
+ * @eilbrts: Expected initial logical block reference tag
+ * @elbatms: Expected logical block application tag mask
+ * @elbats: Expected logical block application tag
+ * @nr: Number of descriptors to construct
+ */
+void nvme_init_copy_range_f1(struct nvme_copy_range_f1 *copy, __u16 *nlbs,
+ __u64 *slbas, __u64 *eilbrts, __u32 *elbatms,
+ __u32 *elbats, __u16 nr);
+
+/**
* nvme_get_feature_length() - Retreive the command payload length for a
- * specific feature identifier
+ * specific feature identifier
* @fid: Feature identifier, see &enum nvme_features_id.
* @cdw11: The cdw11 value may affect the transfer (only known fid is
- * %NVME_FEAT_FID_HOST_ID)
+ * %NVME_FEAT_FID_HOST_ID)
* @len: On success, set to this features payload length in bytes.
*
* Return: 0 on success, -1 with errno set to EINVAL if the function did not
@@ -132,7 +156,7 @@ void nvme_init_copy_range(struct nvme_copy_range *copy, __u16 *nlbs,
int nvme_get_feature_length(int fid, __u32 cdw11, __u32 *len);
/**
- * nvme_get_directive_receive_length() -
+ * nvme_get_directive_receive_length() - Get directive receive length
* @dtype: Directive type, see &enum nvme_directive_dtype
* @doper: Directive receive operation, see &enum nvme_directive_receive_doper
* @len: On success, set to this directives payload length in bytes.
@@ -400,8 +424,8 @@ static inline void nvme_feature_decode_namespace_write_protect(__u32 value,
static inline void nvme_id_ns_flbas_to_lbaf_inuse(__u8 flbas, __u8 *lbaf_inuse)
{
- *lbaf_inuse = (((flbas & NVME_NS_FLBAS_HIGHER_MASK) >> 1) \
- | (flbas & NVME_NS_FLBAS_LOWER_MASK));
+ *lbaf_inuse = (((flbas & NVME_NS_FLBAS_HIGHER_MASK) >> 1) |
+ (flbas & NVME_NS_FLBAS_LOWER_MASK));
}
struct nvme_root;
@@ -473,7 +497,7 @@ char *kv_keymatch(const char *kv, const char *key);
* Return: If @s starts with @prefix, then return a pointer within @s at
* the first character after the matched @prefix. NULL otherwise.
*/
-char* startswith(const char *s, const char *prefix);
+char *startswith(const char *s, const char *prefix);
#define __round_mask(val, mult) ((__typeof__(val))((mult)-1))
@@ -502,7 +526,7 @@ static inline __u16 nvmf_exat_len(size_t val_len)
}
/**
- * nvmf_exat_size - Return min algined size to hold value
+ * nvmf_exat_size - Return min aligned size to hold value
* @val_len: This is the length of the data to be copied to the "exatval"
* field of a "struct nvmf_ext_attr".
*
@@ -532,4 +556,23 @@ static inline __u16 nvmf_exat_size(size_t val_len)
*/
struct nvmf_ext_attr *nvmf_exat_ptr_next(struct nvmf_ext_attr *p);
+/**
+ * enum nvme_version - Selector for version to be returned by @nvme_get_version
+ *
+ * @NVME_VERSION_PROJECT: Project release version
+ * @NVME_VERSION_GIT: Git reference
+ */
+enum nvme_version {
+ NVME_VERSION_PROJECT = 0,
+ NVME_VERSION_GIT = 1,
+};
+
+/**
+ * nvme_get_version - Return version libnvme string
+ * @type: Selects which version type (see @struct nvme_version)
+ *
+ * Return: Returns version string for known types or else "n/a"
+ */
+const char *nvme_get_version(enum nvme_version type);
+
#endif /* _LIBNVME_UTIL_H */
diff --git a/subprojects/uuid.wrap b/subprojects/uuid.wrap
new file mode 100644
index 0000000..0692c4e
--- /dev/null
+++ b/subprojects/uuid.wrap
@@ -0,0 +1,6 @@
+[wrap-git]
+url = https://github.com/util-linux/util-linux.git
+revision = eefff5aac7bce6979c950e3931a578efe03acbac
+
+[provide]
+dependency_names = uuid \ No newline at end of file
diff --git a/test/meson.build b/test/meson.build
index 193d558..00c9ceb 100644
--- a/test/meson.build
+++ b/test/meson.build
@@ -12,28 +12,47 @@
main = executable(
'main-test',
['test.c'],
- dependencies: libuuid_dep,
- link_with: libnvme,
+ dependencies: [libnvme_dep, libuuid_dep],
include_directories: [incdir, internal_incdir]
)
-cpp = executable(
- 'test-cpp',
- ['cpp.cc'],
- link_with: libnvme,
- include_directories: [incdir, internal_incdir]
-)
+if cxx_available
+ cpp = executable(
+ 'test-cpp',
+ ['cpp.cc'],
+ dependencies: libnvme_dep,
+ include_directories: [incdir, internal_incdir]
+ )
+endif
register = executable(
'test-register',
['register.c'],
- link_with: libnvme,
+ dependencies: libnvme_dep,
include_directories: [incdir, internal_incdir]
)
zns = executable(
'test-zns',
['zns.c'],
- link_with: libnvme,
+ dependencies: libnvme_dep,
+ include_directories: [incdir, internal_incdir]
+)
+
+mi = executable(
+ 'test-mi',
+ ['mi.c', 'utils.c'],
+ dependencies: libnvme_mi_test_dep,
include_directories: [incdir, internal_incdir]
)
+
+test('mi', mi)
+
+mi_mctp = executable(
+ 'test-mi-mctp',
+ ['mi-mctp.c', 'utils.c'],
+ dependencies: libnvme_mi_test_dep,
+ include_directories: [incdir, internal_incdir],
+)
+
+test('mi-mctp', mi_mctp)
diff --git a/test/mi-mctp.c b/test/mi-mctp.c
new file mode 100644
index 0000000..a831cf7
--- /dev/null
+++ b/test/mi-mctp.c
@@ -0,0 +1,462 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/**
+ * This file is part of libnvme.
+ * Copyright (c) 2022 Code Construct
+ */
+
+#undef NDEBUG
+#include <assert.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/socket.h>
+
+
+#include <ccan/array_size/array_size.h>
+#include <ccan/endian/endian.h>
+
+#include "libnvme-mi.h"
+#include "nvme/private.h"
+#include "utils.h"
+
+/* 4096 byte max MCTP message, plus space for header data */
+#define MAX_BUFSIZ 8192
+
+struct test_peer;
+
+typedef int (*rx_test_fn)(struct test_peer *peer, void *buf, size_t len);
+
+/* Our fake MCTP "peer".
+ *
+ * The terms TX (transmit) and RX (receive) are from the perspective of
+ * the NVMe device. TX is device-to-libnvme, RX is libnvme-to-device.
+ *
+ * The RX and TX buffers are linear versions of the data sent and received by
+ * libnvme-mi, and *include* the MCTP message type byte (even though it's
+ * omitted in the sendmsg/recvmsg interface), so that the buffer inspection
+ * in the tests can exactly match the NVMe-MI spec packet diagrams.
+ */
+static struct test_peer {
+ /* rx (sendmsg) data sent from libnvme, and return value */
+ unsigned char rx_buf[MAX_BUFSIZ];
+ size_t rx_buf_len;
+ ssize_t rx_rc; /* if zero, return the sendmsg len */
+ int rx_errno;
+
+ /* tx (recvmsg) data to be received by libnvme and return value */
+ unsigned char tx_buf[MAX_BUFSIZ];
+ size_t tx_buf_len;
+ ssize_t tx_rc; /* if zero, return the recvmsg len */
+ int tx_errno;
+
+ /* Optional, called before TX, may set tx_buf according to request.
+ * Return value stored in tx_res, may be used by test */
+ rx_test_fn tx_fn;
+ void *tx_data;
+ int tx_fn_res;
+
+ /* store sd from socket() setup */
+ int sd;
+} test_peer;
+
+/* ensure tests start from a standard state */
+void reset_test_peer(void)
+{
+ int tmp = test_peer.sd;
+ memset(&test_peer, 0, sizeof(test_peer));
+ test_peer.tx_buf[0] = NVME_MI_MSGTYPE_NVME;
+ test_peer.rx_buf[0] = NVME_MI_MSGTYPE_NVME;
+ test_peer.sd = tmp;
+}
+
+/* calculate MIC of peer-to-libnvme data, expand buf by 4 bytes and insert
+ * the new MIC */
+static void test_set_tx_mic(struct test_peer *peer)
+{
+ extern __u32 nvme_mi_crc32_update(__u32 crc, void *data, size_t len);
+ __u32 crc = 0xffffffff;
+
+ assert(peer->tx_buf_len + sizeof(crc) <= MAX_BUFSIZ);
+
+ crc = nvme_mi_crc32_update(crc, peer->tx_buf, peer->tx_buf_len);
+ *(uint32_t *)(peer->tx_buf + peer->tx_buf_len) = cpu_to_le32(~crc);
+ peer->tx_buf_len += sizeof(crc);
+}
+
+int __wrap_socket(int family, int type, int protocol)
+{
+ /* we do an open here to give the mi-mctp code something to close() */
+ test_peer.sd = open("/dev/null", 0);
+ return test_peer.sd;
+}
+
+ssize_t __wrap_sendmsg(int sd, const struct msghdr *hdr, int flags)
+{
+ size_t i, pos;
+
+ assert(sd == test_peer.sd);
+
+ test_peer.rx_buf[0] = NVME_MI_MSGTYPE_NVME;
+
+ /* gather iovec into buf */
+ for (i = 0, pos = 1; i < hdr->msg_iovlen; i++) {
+ struct iovec *iov = &hdr->msg_iov[i];
+
+ assert(pos + iov->iov_len < MAX_BUFSIZ - 1);
+ memcpy(test_peer.rx_buf + pos, iov->iov_base, iov->iov_len);
+ pos += iov->iov_len;
+ }
+
+ test_peer.rx_buf_len = pos;
+
+ errno = test_peer.rx_errno;
+
+ return test_peer.rx_rc ?: (pos - 1);
+}
+
+ssize_t __wrap_recvmsg(int sd, struct msghdr *hdr, int flags)
+{
+ size_t i, pos, len;
+
+ assert(sd == test_peer.sd);
+
+ if (test_peer.tx_fn) {
+ test_peer.tx_fn_res = test_peer.tx_fn(&test_peer,
+ test_peer.rx_buf,
+ test_peer.rx_buf_len);
+ } else {
+ /* set up a few default response fields; caller may have
+ * initialised the rest of the response */
+ test_peer.tx_buf[0] = NVME_MI_MSGTYPE_NVME;
+ test_peer.tx_buf[1] = test_peer.rx_buf[1] | (NVME_MI_ROR_RSP << 7);
+ test_set_tx_mic(&test_peer);
+ }
+
+ /* scatter buf into iovec */
+ for (i = 0, pos = 1; i < hdr->msg_iovlen && pos < test_peer.tx_buf_len;
+ i++) {
+ struct iovec *iov = &hdr->msg_iov[i];
+
+ len = iov->iov_len;
+ if (len > test_peer.tx_buf_len - pos)
+ len = test_peer.tx_buf_len - pos;
+
+ memcpy(iov->iov_base, test_peer.tx_buf + pos, len);
+ pos += len;
+ }
+
+ errno = test_peer.tx_errno;
+
+ return test_peer.tx_rc ?: (pos - 1);
+}
+
+struct mctp_ioc_tag_ctl;
+
+#ifdef SIOCMCTPALLOCTAG
+int test_ioctl_tag(int sd, unsigned long req, struct mctp_ioc_tag_ctl *ctl)
+{
+ assert(sd == test_peer.sd);
+
+ switch (req) {
+ case SIOCMCTPALLOCTAG:
+ ctl->tag = 1 | MCTP_TAG_PREALLOC | MCTP_TAG_OWNER;
+ break;
+ case SIOCMCTPDROPTAG:
+ assert(tag == 1 | MCTP_TAG_PREALLOC | MCTP_TAG_OWNER);
+ break;
+ };
+
+ return 0;
+}
+#else
+int test_ioctl_tag(int sd, unsigned long req, struct mctp_ioc_tag_ctl *ctl)
+{
+ assert(sd == test_peer.sd);
+ return 0;
+}
+#endif
+
+static struct __mi_mctp_socket_ops ops = {
+ __wrap_socket,
+ __wrap_sendmsg,
+ __wrap_recvmsg,
+ test_ioctl_tag,
+};
+
+/* tests */
+static void test_rx_err(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ peer->rx_rc = -1;
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+static int tx_none(struct test_peer *peer, void *buf, size_t len)
+{
+ return 0;
+}
+
+static void test_tx_none(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ peer->tx_buf_len = 0;
+ peer->tx_fn = tx_none;
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+static void test_tx_err(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ peer->tx_rc = -1;
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+static void test_tx_short(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ peer->tx_buf_len = 11;
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+static void test_read_mi_data(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ /* empty response data */
+ peer->tx_buf_len = 8 + 32;
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc == 0);
+}
+
+static void test_mi_resp_err(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ /* simple error response */
+ peer->tx_buf[4] = 0x02; /* internal error */
+ peer->tx_buf_len = 8;
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc == 0x2);
+}
+
+static void test_admin_resp_err(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_id_ctrl id;
+ nvme_mi_ctrl_t ctrl;
+ int rc;
+
+ ctrl = nvme_mi_init_ctrl(ep, 1);
+ assert(ctrl);
+
+ /* Simple error response, will be shorter than the expected Admin
+ * command response header. */
+ peer->tx_buf[4] = 0x02; /* internal error */
+ peer->tx_buf_len = 8;
+
+ rc = nvme_mi_admin_identify_ctrl(ctrl, &id);
+ assert(rc == 0x2);
+}
+
+/* test: all 4-byte aligned response sizes - should be decoded into the
+ * response status value. We use an admin command here as the header size will
+ * be larger than the minimum header size (it contains the completion
+ * doublewords), and we need to ensure that an error response is correctly
+ * interpreted, including having the MIC extracted from the message.
+ */
+static void test_admin_resp_sizes(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_id_ctrl id;
+ nvme_mi_ctrl_t ctrl;
+ unsigned int i;
+ int rc;
+
+ ctrl = nvme_mi_init_ctrl(ep, 1);
+ assert(ctrl);
+
+ peer->tx_buf[4] = 0x02; /* internal error */
+
+ for (i = 8; i <= 4096 + 8; i+=4) {
+ peer->tx_buf_len = i;
+ rc = nvme_mi_admin_identify_ctrl(ctrl, &id);
+ assert(rc == 2);
+ }
+
+ nvme_mi_close_ctrl(ctrl);
+}
+
+/* test: unaligned response sizes - should always report a transport error */
+static void test_admin_resp_sizes_unaligned(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_id_ctrl id;
+ nvme_mi_ctrl_t ctrl;
+ unsigned int i;
+ int rc;
+
+ ctrl = nvme_mi_init_ctrl(ep, 1);
+ assert(ctrl);
+
+ peer->tx_buf[4] = 0x02; /* internal error */
+
+ for (i = 8; i <= 4096 + 8; i++) {
+ peer->tx_buf_len = i;
+ if (!(i & 0x3))
+ continue;
+ rc = nvme_mi_admin_identify_ctrl(ctrl, &id);
+ assert(rc < 0);
+ }
+
+ nvme_mi_close_ctrl(ctrl);
+}
+
+/* test: send a More Processing Required response, then the actual response */
+struct mpr_tx_info {
+ int msg_no;
+ size_t final_len;
+};
+
+static int tx_mpr(struct test_peer *peer, void *buf, size_t len)
+{
+ struct mpr_tx_info *tx_info = peer->tx_data;
+
+ memset(peer->tx_buf, 0, sizeof(peer->tx_buf));
+ peer->tx_buf[0] = NVME_MI_MSGTYPE_NVME;
+ peer->tx_buf[1] = test_peer.rx_buf[1] | (NVME_MI_ROR_RSP << 7);
+
+ switch (tx_info->msg_no) {
+ case 1:
+ peer->tx_buf[4] = NVME_MI_RESP_MPR;
+ peer->tx_buf_len = 8;
+ break;
+ case 2:
+ peer->tx_buf[4] = NVME_MI_RESP_SUCCESS;
+ peer->tx_buf_len = tx_info->final_len;
+ break;
+ default:
+ assert(0);
+ }
+
+ test_set_tx_mic(peer);
+
+ tx_info->msg_no++;
+
+ return 0;
+}
+
+static void test_mpr_mi(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ struct mpr_tx_info tx_info;
+ int rc;
+
+ tx_info.msg_no = 1;
+ tx_info.final_len = sizeof(struct nvme_mi_mi_resp_hdr) + sizeof(ss_info);
+
+ peer->tx_fn = tx_mpr;
+ peer->tx_data = &tx_info;
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc == 0);
+}
+
+static void test_mpr_admin(nvme_mi_ep_t ep, struct test_peer *peer)
+{
+ struct mpr_tx_info tx_info;
+ struct nvme_id_ctrl id;
+ nvme_mi_ctrl_t ctrl;
+ int rc;
+
+ tx_info.msg_no = 1;
+ tx_info.final_len = sizeof(struct nvme_mi_admin_resp_hdr) + sizeof(id);
+
+ peer->tx_fn = tx_mpr;
+ peer->tx_data = &tx_info;
+
+ ctrl = nvme_mi_init_ctrl(ep, 1);
+
+ rc = nvme_mi_admin_identify_ctrl(ctrl, &id);
+ assert(rc == 0);
+
+ nvme_mi_close_ctrl(ctrl);
+}
+
+
+#define DEFINE_TEST(name) { #name, test_ ## name }
+struct test {
+ const char *name;
+ void (*fn)(nvme_mi_ep_t, struct test_peer *);
+} tests[] = {
+ DEFINE_TEST(rx_err),
+ DEFINE_TEST(tx_none),
+ DEFINE_TEST(tx_err),
+ DEFINE_TEST(tx_short),
+ DEFINE_TEST(read_mi_data),
+ DEFINE_TEST(mi_resp_err),
+ DEFINE_TEST(admin_resp_err),
+ DEFINE_TEST(admin_resp_sizes),
+ DEFINE_TEST(admin_resp_sizes_unaligned),
+ DEFINE_TEST(mpr_mi),
+ DEFINE_TEST(mpr_admin),
+};
+
+static void run_test(struct test *test, FILE *logfd, nvme_mi_ep_t ep,
+ struct test_peer *peer)
+{
+ printf("Running test %s...", test->name);
+ fflush(stdout);
+ test->fn(ep, peer);
+ printf(" OK\n");
+ test_print_log_buf(logfd);
+}
+
+int main(void)
+{
+ nvme_root_t root;
+ nvme_mi_ep_t ep;
+ unsigned int i;
+ FILE *fd;
+
+ fd = test_setup_log();
+
+ __nvme_mi_mctp_set_ops(&ops);
+
+ root = nvme_mi_create_root(fd, DEFAULT_LOGLEVEL);
+ assert(root);
+
+ ep = nvme_mi_open_mctp(root, 0, 0);
+ assert(ep);
+
+ for (i = 0; i < ARRAY_SIZE(tests); i++) {
+ reset_test_peer();
+ run_test(&tests[i], fd, ep, &test_peer);
+ }
+
+ nvme_mi_close(ep);
+ nvme_mi_free_root(root);
+
+ test_close_log(fd);
+
+ return EXIT_SUCCESS;
+}
diff --git a/test/mi.c b/test/mi.c
new file mode 100644
index 0000000..d269060
--- /dev/null
+++ b/test/mi.c
@@ -0,0 +1,809 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/**
+ * This file is part of libnvme.
+ * Copyright (c) 2022 Code Construct
+ */
+
+#undef NDEBUG
+#include <assert.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <unistd.h>
+
+#include <ccan/array_size/array_size.h>
+
+/* we define a custom transport, so need the internal headers */
+#include "nvme/private.h"
+
+#include "libnvme-mi.h"
+
+#include "utils.h"
+
+typedef int (*test_submit_cb)(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data);
+
+struct test_transport_data {
+ unsigned int magic;
+ bool named;
+ test_submit_cb submit_cb;
+ void *submit_cb_data;
+};
+
+static const int test_transport_magic = 0x74657374;
+
+static int test_transport_submit(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp)
+{
+ struct test_transport_data *tpd = ep->transport_data;
+
+ assert(tpd->magic == test_transport_magic);
+
+ /* start from a minimal response: zeroed data, nmp to match request */
+ memset(resp->hdr, 0, resp->hdr_len);
+ memset(resp->data, 0, resp->data_len);
+ resp->hdr->type = NVME_MI_MSGTYPE_NVME;
+ resp->hdr->nmp = req->hdr->nmp | (NVME_MI_ROR_RSP << 7);
+
+ if (tpd->submit_cb)
+ return tpd->submit_cb(ep, req, resp, tpd->submit_cb_data);
+
+ return 0;
+}
+
+static void test_transport_close(struct nvme_mi_ep *ep)
+{
+ struct test_transport_data *tpd = ep->transport_data;
+ assert(tpd->magic == test_transport_magic);
+ free(tpd);
+}
+
+static int test_transport_desc_ep(struct nvme_mi_ep *ep,
+ char *buf, size_t len)
+{
+ struct test_transport_data *tpd = ep->transport_data;
+
+ assert(tpd->magic == test_transport_magic);
+
+ if (!tpd->named)
+ return -1;
+
+ snprintf(buf, len, "test endpoint 0x%x", tpd->magic);
+
+ return 0;
+}
+
+/* internal test helper to generate correct response crc */
+static void test_transport_resp_calc_mic(struct nvme_mi_resp *resp)
+{
+ extern __u32 nvme_mi_crc32_update(__u32 crc, void *data, size_t len);
+ __u32 crc = 0xffffffff;
+
+ crc = nvme_mi_crc32_update(crc, resp->hdr, resp->hdr_len);
+ crc = nvme_mi_crc32_update(crc, resp->data, resp->data_len);
+
+ resp->mic = ~crc;
+}
+
+static const struct nvme_mi_transport test_transport = {
+ .name = "test-mi",
+ .mic_enabled = true,
+ .submit = test_transport_submit,
+ .close = test_transport_close,
+ .desc_ep = test_transport_desc_ep,
+};
+
+static void test_set_transport_callback(nvme_mi_ep_t ep, test_submit_cb cb,
+ void *data)
+{
+ struct test_transport_data *tpd = ep->transport_data;
+ assert(tpd->magic == test_transport_magic);
+
+ tpd->submit_cb = cb;
+ tpd->submit_cb_data = data;
+}
+
+nvme_mi_ep_t nvme_mi_open_test(nvme_root_t root)
+{
+ struct test_transport_data *tpd;
+ struct nvme_mi_ep *ep;
+
+ ep = nvme_mi_init_ep(root);
+ assert(ep);
+
+ tpd = malloc(sizeof(*tpd));
+ assert(tpd);
+
+ tpd->magic = test_transport_magic;
+ tpd->named = true;
+
+ ep->transport = &test_transport;
+ ep->transport_data = tpd;
+
+ return ep;
+}
+
+unsigned int count_root_eps(nvme_root_t root)
+{
+ unsigned int i = 0;
+ nvme_mi_ep_t ep;
+
+ nvme_mi_for_each_endpoint(root, ep)
+ i++;
+
+ return i;
+}
+
+/* test that the root->endpoints list is updated on endpoint
+ * creation/destruction */
+static void test_endpoint_lifetime(nvme_mi_ep_t ep)
+{
+ nvme_root_t root = ep->root;
+ unsigned int count;
+ nvme_mi_ep_t ep2;
+
+ count = count_root_eps(root);
+ assert(count == 1);
+
+ ep2 = nvme_mi_open_test(root);
+ count = count_root_eps(root);
+ assert(count == 2);
+
+ nvme_mi_close(ep2);
+ count = count_root_eps(root);
+ assert(count == 1);
+}
+
+unsigned int count_ep_controllers(nvme_mi_ep_t ep)
+{
+ unsigned int i = 0;
+ nvme_mi_ctrl_t ctrl;
+
+ nvme_mi_for_each_ctrl(ep, ctrl)
+ i++;
+
+ return i;
+}
+
+/* test that the ep->controllers list is updated on controller
+ * creation/destruction */
+static void test_ctrl_lifetime(nvme_mi_ep_t ep)
+{
+ nvme_mi_ctrl_t c1, c2;
+ int count;
+
+ ep->controllers_scanned = true;
+
+ count = count_ep_controllers(ep);
+ assert(count == 0);
+
+ c1 = nvme_mi_init_ctrl(ep, 1);
+ count = count_ep_controllers(ep);
+ assert(count == 1);
+
+ c2 = nvme_mi_init_ctrl(ep, 2);
+ count = count_ep_controllers(ep);
+ assert(count == 2);
+
+ nvme_mi_close_ctrl(c1);
+ count = count_ep_controllers(ep);
+ assert(count == 1);
+
+ nvme_mi_close_ctrl(c2);
+ count = count_ep_controllers(ep);
+ assert(count == 0);
+}
+
+
+/* test: basic read MI datastructure command */
+static int test_read_mi_data_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ __u8 ror, mt, *hdr, *buf;
+
+ assert(req->hdr->type == NVME_MI_MSGTYPE_NVME);
+
+ ror = req->hdr->nmp >> 7;
+ mt = req->hdr->nmp >> 3 & 0x7;
+ assert(ror == NVME_MI_ROR_REQ);
+ assert(mt == NVME_MI_MT_MI);
+
+ /* do we have enough for a mi header? */
+ assert(req->hdr_len == sizeof(struct nvme_mi_mi_req_hdr));
+
+ /* inspect response as raw bytes */
+ hdr = (__u8 *)req->hdr;
+ assert(hdr[4] == nvme_mi_mi_opcode_mi_data_read);
+
+ /* create basic response */
+ assert(resp->hdr_len >= sizeof(struct nvme_mi_mi_resp_hdr));
+ assert(resp->data_len >= 4);
+
+ hdr = (__u8 *)resp->hdr;
+ hdr[4] = 0; /* status */
+
+ buf = (__u8 *)resp->data;
+ memset(buf, 0, resp->data_len);
+ buf[0] = 1; /* NUMP */
+ buf[1] = 1; /* MJR */
+ buf[2] = 2; /* MNR */
+
+ test_transport_resp_calc_mic(resp);
+
+ return 0;
+}
+
+static void test_read_mi_data(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ test_set_transport_callback(ep, test_read_mi_data_cb, NULL);
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc == 0);
+}
+
+/* test: failed transport */
+static int test_transport_fail_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ return -1;
+}
+
+static void test_transport_fail(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ test_set_transport_callback(ep, test_transport_fail_cb, NULL);
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+static void test_transport_describe(nvme_mi_ep_t ep)
+{
+ struct test_transport_data *tpd;
+ char *str;
+
+ tpd = (struct test_transport_data *)ep->transport_data;
+
+ tpd->named = false;
+ str = nvme_mi_endpoint_desc(ep);
+ assert(str);
+ assert(!strcmp(str, "test-mi endpoint"));
+ free(str);
+
+ tpd->named = true;
+ str = nvme_mi_endpoint_desc(ep);
+ assert(str);
+ assert(!strcmp(str, "test-mi: test endpoint 0x74657374"));
+ free(str);
+}
+
+/* test: invalid crc */
+static int test_invalid_crc_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ resp->mic = 0;
+ return 0;
+}
+
+static void test_invalid_crc(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ test_set_transport_callback(ep, test_invalid_crc_cb, NULL);
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+/* test: test that the controller list populates the endpoint's list of
+ * controllers */
+static int test_scan_ctrl_list_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ __u8 ror, mt, *hdr, *buf;
+
+ assert(req->hdr->type == NVME_MI_MSGTYPE_NVME);
+
+ ror = req->hdr->nmp >> 7;
+ mt = req->hdr->nmp >> 3 & 0x7;
+ assert(ror == NVME_MI_ROR_REQ);
+ assert(mt == NVME_MI_MT_MI);
+
+ /* do we have enough for a mi header? */
+ assert(req->hdr_len == sizeof(struct nvme_mi_mi_req_hdr));
+
+ /* inspect response as raw bytes */
+ hdr = (__u8 *)req->hdr;
+ assert(hdr[4] == nvme_mi_mi_opcode_mi_data_read);
+ assert(hdr[11] == nvme_mi_dtyp_ctrl_list);
+
+ /* create basic response */
+ assert(resp->hdr_len >= sizeof(struct nvme_mi_mi_resp_hdr));
+ assert(resp->data_len >= 4);
+
+ hdr = (__u8 *)resp->hdr;
+ hdr[4] = 0; /* status */
+
+ buf = (__u8 *)resp->data;
+ memset(buf, 0, resp->data_len);
+ buf[0] = 3; buf[1] = 0; /* num controllers */
+ buf[2] = 1; buf[3] = 0; /* id 1 */
+ buf[4] = 4; buf[5] = 0; /* id 4 */
+ buf[6] = 5; buf[7] = 0; /* id 5 */
+
+ test_transport_resp_calc_mic(resp);
+
+ return 0;
+}
+
+static void test_scan_ctrl_list(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_ctrl *ctrl;
+
+ ep->controllers_scanned = false;
+
+ test_set_transport_callback(ep, test_scan_ctrl_list_cb, NULL);
+
+ nvme_mi_scan_ep(ep, false);
+
+ ctrl = nvme_mi_first_ctrl(ep);
+ assert(ctrl);
+ assert(ctrl->id == 1);
+
+ ctrl = nvme_mi_next_ctrl(ep, ctrl);
+ assert(ctrl);
+ assert(ctrl->id == 4);
+
+ ctrl = nvme_mi_next_ctrl(ep, ctrl);
+ assert(ctrl);
+ assert(ctrl->id == 5);
+
+ ctrl = nvme_mi_next_ctrl(ep, ctrl);
+ assert(ctrl == NULL);
+}
+
+/* test: simple NVMe admin request/response */
+static int test_admin_id_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ __u8 ror, mt, *hdr;
+ __u32 dlen, cdw10;
+ __u16 ctrl_id;
+ __u8 flags;
+
+ assert(req->hdr->type == NVME_MI_MSGTYPE_NVME);
+
+ ror = req->hdr->nmp >> 7;
+ mt = req->hdr->nmp >> 3 & 0x7;
+ assert(ror == NVME_MI_ROR_REQ);
+ assert(mt == NVME_MI_MT_ADMIN);
+
+ /* do we have enough for a mi header? */
+ assert(req->hdr_len == sizeof(struct nvme_mi_admin_req_hdr));
+
+ /* inspect response as raw bytes */
+ hdr = (__u8 *)req->hdr;
+ assert(hdr[4] == nvme_admin_identify);
+ flags = hdr[5];
+
+ ctrl_id = hdr[7] << 8 | hdr[6];
+ assert(ctrl_id == 0x5); /* controller id */
+
+ /* we requested a full id; if we've set the length flag,
+ * ensure the length matches */
+ dlen = hdr[35] << 24 | hdr[34] << 16 | hdr[33] << 8 | hdr[32];
+ if (flags & 0x1) {
+ assert(dlen == sizeof(struct nvme_id_ctrl));
+ }
+ assert(!(flags & 0x2));
+
+ /* CNS value of 1 in cdw10 field */
+ cdw10 = hdr[47] << 24 | hdr[46] << 16 | hdr[45] << 8 | hdr[44];
+ assert(cdw10 == 0x1);
+
+ /* create valid (but somewhat empty) response */
+ hdr = (__u8 *)resp->hdr;
+ hdr[4] = 0x00; /* status: success */
+
+ test_transport_resp_calc_mic(resp);
+
+ return 0;
+}
+
+static void test_admin_id(nvme_mi_ep_t ep)
+{
+ struct nvme_id_ctrl id;
+ nvme_mi_ctrl_t ctrl;
+ int rc;
+
+ test_set_transport_callback(ep, test_admin_id_cb, NULL);
+
+ ctrl = nvme_mi_init_ctrl(ep, 5);
+ assert(ctrl);
+
+ rc = nvme_mi_admin_identify_ctrl(ctrl, &id);
+ assert(rc == 0);
+}
+
+/* test: simple NVMe error response */
+static int test_admin_err_resp_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ __u8 ror, mt, *hdr;
+
+ assert(req->hdr->type == NVME_MI_MSGTYPE_NVME);
+
+ ror = req->hdr->nmp >> 7;
+ mt = req->hdr->nmp >> 3 & 0x7;
+ assert(ror == NVME_MI_ROR_REQ);
+ assert(mt == NVME_MI_MT_ADMIN);
+
+ /* do we have enough for a mi header? */
+ assert(req->hdr_len == sizeof(struct nvme_mi_admin_req_hdr));
+
+ /* inspect response as raw bytes */
+ hdr = (__u8 *)req->hdr;
+ assert(hdr[4] == nvme_admin_identify);
+
+ /* we need at least 8 bytes for error information */
+ assert(resp->hdr_len >= 8);
+
+ /* create error response */
+ hdr = (__u8 *)resp->hdr;
+ hdr[4] = 0x02; /* status: internal error */
+ hdr[5] = 0;
+ hdr[6] = 0;
+ hdr[7] = 0;
+ resp->hdr_len = 8;
+ resp->data_len = 0;
+
+ test_transport_resp_calc_mic(resp);
+
+ return 0;
+}
+
+static void test_admin_err_resp(nvme_mi_ep_t ep)
+{
+ struct nvme_id_ctrl id;
+ nvme_mi_ctrl_t ctrl;
+ int rc;
+
+ test_set_transport_callback(ep, test_admin_err_resp_cb, NULL);
+
+ ctrl = nvme_mi_init_ctrl(ep, 1);
+ assert(ctrl);
+
+ rc = nvme_mi_admin_identify_ctrl(ctrl, &id);
+ assert(rc != 0);
+}
+
+/* invalid Admin command transfers */
+static int test_admin_invalid_formats_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ /* none of the tests should result in message transfer */
+ assert(0);
+ return -1;
+}
+
+static void test_admin_invalid_formats(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_admin_resp_hdr resp = { 0 };
+ struct nvme_mi_admin_req_hdr req = { 0 };
+ nvme_mi_ctrl_t ctrl;
+ size_t len;
+ int rc;
+
+ test_set_transport_callback(ep, test_admin_invalid_formats_cb, NULL);
+
+ ctrl = nvme_mi_init_ctrl(ep, 1);
+ assert(ctrl);
+
+ /* unaligned req size */
+ len = 0;
+ rc = nvme_mi_admin_xfer(ctrl, &req, 1, &resp, 0, &len);
+ assert(rc != 0);
+
+ /* unaligned resp size */
+ len = 1;
+ rc = nvme_mi_admin_xfer(ctrl, &req, 0, &resp, 0, &len);
+ assert(rc != 0);
+
+ /* unaligned resp offset */
+ len = 4;
+ rc = nvme_mi_admin_xfer(ctrl, &req, 0, &resp, 1, &len);
+ assert(rc != 0);
+
+ /* resp too large */
+ len = 4096 + 4;
+ rc = nvme_mi_admin_xfer(ctrl, &req, 0, &resp, 0, &len);
+ assert(rc != 0);
+
+ /* resp offset too large */
+ len = 4;
+ rc = nvme_mi_admin_xfer(ctrl, &req, 0, &resp, (off_t)1 << 32, &len);
+ assert(rc != 0);
+
+ /* resp offset with no len */
+ len = 0;
+ rc = nvme_mi_admin_xfer(ctrl, &req, 0, &resp, 4, &len);
+ assert(rc != 0);
+
+ /* req and resp payloads */
+ len = 4;
+ rc = nvme_mi_admin_xfer(ctrl, &req, 4, &resp, 0, &len);
+ assert(rc != 0);
+}
+
+/* test: header length too small */
+static int test_resp_hdr_small_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ resp->hdr_len = 2;
+ test_transport_resp_calc_mic(resp);
+ return 0;
+}
+
+static void test_resp_hdr_small(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ test_set_transport_callback(ep, test_resp_hdr_small_cb, NULL);
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+/* test: respond with a request message */
+static int test_resp_req_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ resp->hdr->nmp &= ~(NVME_MI_ROR_RSP << 7);
+ test_transport_resp_calc_mic(resp);
+ return 0;
+}
+
+static void test_resp_req(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ test_set_transport_callback(ep, test_resp_req_cb, NULL);
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+/* test: invalid MCTP type in response */
+static int test_resp_invalid_type_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ resp->hdr->type = 0x3;
+ test_transport_resp_calc_mic(resp);
+ return 0;
+}
+
+static void test_resp_invalid_type(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ test_set_transport_callback(ep, test_resp_invalid_type_cb, NULL);
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+/* test: response with mis-matching command slot */
+static int test_resp_csi_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ resp->hdr->nmp ^= 0x1;
+ test_transport_resp_calc_mic(resp);
+ return 0;
+}
+
+static void test_resp_csi(nvme_mi_ep_t ep)
+{
+ struct nvme_mi_read_nvm_ss_info ss_info;
+ int rc;
+
+ test_set_transport_callback(ep, test_resp_csi_cb, NULL);
+
+ rc = nvme_mi_mi_read_mi_data_subsys(ep, &ss_info);
+ assert(rc != 0);
+}
+
+/* test: config get MTU request & response layout, ensure we're handling
+ * endianness in the 3-byte NMRESP field correctly */
+static int test_mi_config_get_mtu_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ struct nvme_mi_mi_resp_hdr *mi_resp;
+ uint8_t *buf;
+
+ assert(req->hdr_len == sizeof(struct nvme_mi_mi_req_hdr));
+ assert(req->data_len == 0);
+
+ /* validate req as raw bytes */
+ buf = (void *)req->hdr;
+ assert(buf[4] == nvme_mi_mi_opcode_configuration_get);
+ /* dword 0: port and config id */
+ assert(buf[11] == 0x5);
+ assert(buf[8] == NVME_MI_CONFIG_MCTP_MTU);
+
+ /* set MTU in response */
+ mi_resp = (void *)resp->hdr;
+ mi_resp->nmresp[1] = 0x12;
+ mi_resp->nmresp[0] = 0x34;
+ resp->hdr_len = sizeof(*mi_resp);
+ resp->data_len = 0;
+
+ test_transport_resp_calc_mic(resp);
+ return 0;
+}
+
+static void test_mi_config_get_mtu(nvme_mi_ep_t ep)
+{
+ uint16_t mtu;
+ int rc;
+
+ test_set_transport_callback(ep, test_mi_config_get_mtu_cb, NULL);
+
+ rc = nvme_mi_mi_config_get_mctp_mtu(ep, 5, &mtu);
+ assert(rc == 0);
+ assert(mtu == 0x1234);
+}
+
+/* test: config set SMBus freq, both valid and invalid */
+static int test_mi_config_set_freq_cb(struct nvme_mi_ep *ep,
+ struct nvme_mi_req *req,
+ struct nvme_mi_resp *resp,
+ void *data)
+{
+ struct nvme_mi_mi_resp_hdr *mi_resp;
+ uint8_t *buf;
+
+ assert(req->hdr_len == sizeof(struct nvme_mi_mi_req_hdr));
+ assert(req->data_len == 0);
+
+ /* validate req as raw bytes */
+ buf = (void *)req->hdr;
+ assert(buf[4] == nvme_mi_mi_opcode_configuration_set);
+ /* dword 0: port and config id */
+ assert(buf[11] == 0x5);
+ assert(buf[8] == NVME_MI_CONFIG_SMBUS_FREQ);
+
+ mi_resp = (void *)resp->hdr;
+ resp->hdr_len = sizeof(*mi_resp);
+ resp->data_len = 0;
+
+ /* accept 100 & 400, reject others */
+ switch (buf[9]) {
+ case NVME_MI_CONFIG_SMBUS_FREQ_100kHz:
+ case NVME_MI_CONFIG_SMBUS_FREQ_400kHz:
+ mi_resp->status = 0;
+ break;
+ case NVME_MI_CONFIG_SMBUS_FREQ_1MHz:
+ default:
+ mi_resp->status = 0x4;
+ break;
+ }
+
+ test_transport_resp_calc_mic(resp);
+ return 0;
+}
+
+static void test_mi_config_set_freq(nvme_mi_ep_t ep)
+{
+ int rc;
+
+ test_set_transport_callback(ep, test_mi_config_set_freq_cb, NULL);
+
+ rc = nvme_mi_mi_config_set_smbus_freq(ep, 5,
+ NVME_MI_CONFIG_SMBUS_FREQ_100kHz);
+ assert(rc == 0);
+}
+
+static void test_mi_config_set_freq_invalid(nvme_mi_ep_t ep)
+{
+ int rc;
+
+ test_set_transport_callback(ep, test_mi_config_set_freq_cb, NULL);
+
+ rc = nvme_mi_mi_config_set_smbus_freq(ep, 5,
+ NVME_MI_CONFIG_SMBUS_FREQ_1MHz);
+ assert(rc == 4);
+}
+
+#define DEFINE_TEST(name) { #name, test_ ## name }
+struct test {
+ const char *name;
+ void (*fn)(nvme_mi_ep_t);
+} tests[] = {
+ DEFINE_TEST(endpoint_lifetime),
+ DEFINE_TEST(ctrl_lifetime),
+ DEFINE_TEST(read_mi_data),
+ DEFINE_TEST(transport_fail),
+ DEFINE_TEST(transport_describe),
+ DEFINE_TEST(scan_ctrl_list),
+ DEFINE_TEST(invalid_crc),
+ DEFINE_TEST(admin_id),
+ DEFINE_TEST(admin_err_resp),
+ DEFINE_TEST(admin_invalid_formats),
+ DEFINE_TEST(resp_req),
+ DEFINE_TEST(resp_hdr_small),
+ DEFINE_TEST(resp_invalid_type),
+ DEFINE_TEST(resp_csi),
+ DEFINE_TEST(mi_config_get_mtu),
+ DEFINE_TEST(mi_config_set_freq),
+ DEFINE_TEST(mi_config_set_freq_invalid),
+};
+
+static void run_test(struct test *test, FILE *logfd, nvme_mi_ep_t ep)
+{
+ printf("Running test %s...", test->name);
+ fflush(stdout);
+ test->fn(ep);
+ /* tests will assert on failure; if we're here, we're OK */
+ printf(" OK\n");
+ test_print_log_buf(logfd);
+}
+
+int main(void)
+{
+ nvme_root_t root;
+ nvme_mi_ep_t ep;
+ unsigned int i;
+ FILE *fd;
+
+ fd = test_setup_log();
+
+ root = nvme_mi_create_root(fd, DEFAULT_LOGLEVEL);
+ assert(root);
+
+ ep = nvme_mi_open_test(root);
+ assert(ep);
+
+ for (i = 0; i < ARRAY_SIZE(tests); i++) {
+ run_test(&tests[i], fd, ep);
+ }
+
+ nvme_mi_close(ep);
+ nvme_mi_free_root(root);
+
+ test_close_log(fd);
+
+ return EXIT_SUCCESS;
+}
diff --git a/test/register.c b/test/register.c
index 8791083..8a41628 100644
--- a/test/register.c
+++ b/test/register.c
@@ -11,6 +11,8 @@
* for your pci device found in /sys/class/nvme/nvmeX/device/resource0
*/
+#define __SANE_USERSPACE_TYPES__
+
#include <fcntl.h>
#include <inttypes.h>
#include <libnvme.h>
diff --git a/test/test.c b/test/test.c
index bf13412..bc5393b 100644
--- a/test/test.c
+++ b/test/test.c
@@ -19,7 +19,7 @@
#include <string.h>
#include <stdbool.h>
#include <inttypes.h>
-#include <uuid/uuid.h>
+#include <uuid.h>
#include <libnvme.h>
#include <ccan/endian/endian.h>
diff --git a/test/utils.c b/test/utils.c
new file mode 100644
index 0000000..60665b8
--- /dev/null
+++ b/test/utils.c
@@ -0,0 +1,68 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * This file is part of libnvme.
+ *
+ * Common test utilities.
+ *
+ * Copyright (c) 2022 Code Construct
+ */
+
+#include <err.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+#include "utils.h"
+
+FILE *test_setup_log(void)
+{
+ FILE *fd;
+
+ fd = tmpfile();
+ if (!fd)
+ err(EXIT_FAILURE, "can't create temporary file for log buf");
+
+ return fd;
+}
+
+void test_close_log(FILE *fd)
+{
+ fclose(fd);
+}
+
+void test_print_log_buf(FILE *logfd)
+{
+ char buf[4096];
+ int rc;
+
+ if (!ftell(logfd))
+ return;
+
+ rewind(logfd);
+
+ printf("--- begin test output\n");
+
+ while (!feof(logfd) && !ferror(logfd)) {
+ size_t rlen, wlen, wpos;
+
+ rlen = fread(buf, 1, sizeof(buf), logfd);
+ if (rlen <= 0)
+ break;
+
+ for (wpos = 0; wpos < rlen;) {
+ wlen = fwrite(buf + wpos, 1, rlen - wpos, stdout);
+ if (wlen == 0)
+ break;
+ wpos += wlen;
+ }
+
+ if (feof(logfd) || ferror((logfd)))
+ break;
+ }
+
+ printf("--- end test output\n");
+ rewind(logfd);
+ rc = ftruncate(fileno(logfd), 0);
+ if (rc)
+ printf("failed to truncate log buf; further output may be invalid\n");
+}
+
diff --git a/test/utils.h b/test/utils.h
new file mode 100644
index 0000000..e86f6e6
--- /dev/null
+++ b/test/utils.h
@@ -0,0 +1,20 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ * This file is part of libnvme.
+ * Copyright (c) 2022 Code Construct
+ *
+ * Common test utilities for libnvme tests. These have quite strict error
+ * handling, so the general pattern is to abort/exit on error.
+ */
+
+#ifndef _TEST_UTILS_H
+#define _TEST_UTILS_H
+
+#include <stdio.h>
+
+FILE *test_setup_log(void);
+void test_print_log_buf(FILE *logfd);
+void test_close_log(FILE *fd);
+
+#endif /* _TEST_UTILS_H */
+
diff --git a/test/zns.c b/test/zns.c
index b654986..6d06d72 100644
--- a/test/zns.c
+++ b/test/zns.c
@@ -40,6 +40,7 @@ static void show_zns_properties(nvme_ns_t n)
if (nvme_zns_identify_ctrl(nvme_ns_get_fd(n), &zns_ctrl)) {
fprintf(stderr, "failed to identify zns ctrl\n");;
+ free(zr);
return;
}
@@ -51,6 +52,7 @@ static void show_zns_properties(nvme_ns_t n)
NVME_DEFAULT_IOCTL_TIMEOUT, &result)) {
fprintf(stderr, "failed to report zones, result %x\n",
le32_to_cpu(result));
+ free(zr);
return;
}