libnvme\_mi\_mi\_xfer(9) libnvme API manual libnvme\_mi\_mi\_xfer(9)

# [NAME](#NAME)

libnvme\_mi\_mi\_xfer - Raw mi transfer interface.

# [SYNOPSIS](#SYNOPSIS)

**int libnvme\_mi\_mi\_xfer** **(struct libnvme\_mi\_ep \*ep ,** **struct nvme\_mi\_mi\_req\_hdr \*mi\_req ,** **size\_t req\_data\_size ,** **struct nvme\_mi\_mi\_resp\_hdr \*mi\_resp ,** **size\_t \*resp\_data\_size );**

# [ARGUMENTS](#ARGUMENTS)

[ep](#ep)

endpoint to send the MI command to

[mi\_req](#mi_req)

request data

[req\_data\_size](#req_data_size)

size of request data payload

[mi\_resp](#mi_resp)

buffer for response data

[resp\_data\_size](#resp_data_size)

size of response data buffer, updated to received size

# [DESCRIPTION](#DESCRIPTION)

Performs an arbitrary NVMe MI command, using the provided request data, in *mi\_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). Note that the Management Request Doublewords are considered part of the header data.

On success, response data is stored in *mi\_resp*, which has an optional appended payload buffer of *resp\_data\_size* bytes. The actual payload size transferred will be stored in *resp\_data\_size*. This size does not include the MI response header, so 0 represents no payload.

See: *struct nvme\_mi\_mi\_req\_hdr* and *struct nvme\_mi\_mi\_resp\_hdr*.

# [RETURN](#RETURN)

The nvme command status if a response was received (see *enum nvme\_status\_field*) or negative error code otherwise.

libnvme\_mi\_mi\_xfer September 2026

---

Document: libnvme_mi_mi_xfer-libnvme3(2) from nvme-cli 3.1-r0 (Chainguard OS)
Source: https://github.com/linux-nvme/nvme-cli
