Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/libnvme.map
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
LIBNVME_UNRELEASED {
global:
nvme_set_etdas;
nvme_clear_etdas;
};

LIBNVME_1_14 {
Expand Down
47 changes: 47 additions & 0 deletions src/nvme/linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,53 @@ int nvme_fw_download_seq(int fd, __u32 size, __u32 xfer, __u32 offset,
return err;
}

int nvme_set_etdas(int fd, bool *changed)
{
struct nvme_feat_host_behavior da4;
int err;

err = nvme_get_features_host_behavior(fd, 0, &da4, NULL);
if (err)
return err;

if (da4.etdas) {
*changed = false;
return 0;
}

da4.etdas = 1;

err = nvme_set_features_host_behavior(fd, 0, &da4);
if (err)
return err;

*changed = true;
return 0;
}

int nvme_clear_etdas(int fd, bool *changed)
{
struct nvme_feat_host_behavior da4;
int err;

err = nvme_get_features_host_behavior(fd, 0, &da4, NULL);
if (err)
return err;

if (!da4.etdas) {
*changed = false;
return 0;
}

da4.etdas = 0;
err = nvme_set_features_host_behavior(fd, 0, &da4);
if (err)
return err;

*changed = true;
return 0;
}

int nvme_get_telemetry_max(int fd, enum nvme_telemetry_da *da, size_t *data_tx)
{
_cleanup_free_ struct nvme_id_ctrl *id_ctrl = NULL;
Expand Down
22 changes: 22 additions & 0 deletions src/nvme/linux.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,28 @@
int nvme_fw_download_seq(int fd, __u32 size, __u32 xfer, __u32 offset,
void *buf);

/**
* nvme_set_etdas() - Set the Extended Telemetry Data Area 4 Supported bit
* @fd: File descriptor of nvme device
* @changed: boolean to indicate whether or not the host
* behavior support feature had been changed
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
*/
int nvme_set_etdas(int fd, bool *changed);

/**
* nvme_clear_etdas() - Clear the Extended Telemetry Data Area 4 Supported bit
* @fd: File descriptor of nvme device
* @changed: boolean to indicate whether or not the host
* behavior support feature had been changed
*
* Return: The nvme command status if a response was received (see
* &enum nvme_status_field) or -1 with errno set otherwise.
*/
int nvme_clear_etdas(int fd, bool *changed);

/**
* nvme_get_telemetry_max() - Get telemetry limits
* @fd: File descriptor of nvme device
Expand Down