| From 7bf1e5702c953531e1a1aaa22519216a12c6b4c4 Mon Sep 17 00:00:00 2001 |
| From: Hao Jiang <jianghao@google.com> |
| Date: Thu, 29 Sep 2022 18:47:09 +0000 |
| Subject: [PATCH 09/44] Add Identify method to NVMeAdmin interface |
| |
| This method is used to send NVMe admin command `Identify` to the target |
| controller. It will return a fd to read the raw data field of the |
| NVMe-MI admin response message. |
| |
| Signed-off-by: Hao Jiang <jianghao@google.com> |
| Change-Id: I5109af51d6e50e53bda2498bf34656fad4dbe557 |
| --- |
| src/NVMeController.cpp | 33 +++++++++++++++++++++++++++++++++ |
| 1 file changed, 33 insertions(+) |
| |
| diff --git a/src/NVMeController.cpp b/src/NVMeController.cpp |
| index 0479723..dc88cf6 100644 |
| --- a/src/NVMeController.cpp |
| +++ b/src/NVMeController.cpp |
| @@ -54,6 +54,39 @@ NVMeController::NVMeController( |
| }); |
| return sdbusplus::message::unix_fd{pipe[0]}; |
| }); |
| + |
| + adminIntf->register_method( |
| + "Identify", |
| + [nvmeIntf, nvmeCtrl{ctrl}](uint8_t cns, uint16_t cntid, uint32_t nsid) { |
| + std::array<int, 2> pipe; |
| + if (::pipe(pipe.data()) < 0) |
| + { |
| + std::cerr << "Identify fails to open pipe: " << std::strerror(errno) |
| + << std::endl; |
| + throw sdbusplus::xyz::openbmc_project::Common::File::Error::Open(); |
| + } |
| + |
| + nvmeIntf->adminIdentify( |
| + nvmeCtrl, static_cast<nvme_identify_cns>(cns), nsid, cntid, |
| + [pipe](const std::error_code& ec, std::span<uint8_t> data) { |
| + ::close(pipe[0]); |
| + int fd = pipe[1]; |
| + if (ec) |
| + { |
| + std::cerr << "fail to Identify: " << ec.message() << std::endl; |
| + close(fd); |
| + return; |
| + } |
| + if (write(fd, data.data(), data.size()) < 0) |
| + { |
| + std::cerr << "Identify fails to write fd: " |
| + << std::strerror(errno) << std::endl; |
| + }; |
| + close(fd); |
| + }); |
| + return sdbusplus::message::unix_fd{pipe[0]}; |
| + }); |
| + |
| adminIntf->initialize(); |
| } |
| |
| -- |
| 2.34.1 |
| |