nvme: convert adminq to a qpair pointer
Rather than embedding adminq directly in the spdk_nvme_ctrlr structure, change it to a pointer to a spdk_nvme_qpair. This is necessary to allow the transport to extend the qpair structure. Change-Id: I041685d5037088cf56d046fe99bf204edcfc57b1 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
This commit is contained in:
parent
5ba51e5016
commit
a987bd16c2
@ -237,7 +237,7 @@ static int nvme_ctrlr_set_intel_support_log_pages(struct spdk_nvme_ctrlr *ctrlr)
|
||||
nvme_completion_poll_cb,
|
||||
&status);
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
spdk_free(log_page_directory);
|
||||
@ -310,7 +310,12 @@ nvme_ctrlr_set_supported_features(struct spdk_nvme_ctrlr *ctrlr)
|
||||
static int
|
||||
nvme_ctrlr_construct_admin_qpair(struct spdk_nvme_ctrlr *ctrlr)
|
||||
{
|
||||
return nvme_qpair_construct(&ctrlr->adminq,
|
||||
ctrlr->adminq = spdk_zmalloc(sizeof(struct spdk_nvme_qpair), 64, NULL);
|
||||
if (ctrlr->adminq == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
return nvme_qpair_construct(ctrlr->adminq,
|
||||
0, /* qpair ID */
|
||||
NVME_ADMIN_ENTRIES,
|
||||
ctrlr);
|
||||
@ -322,7 +327,7 @@ nvme_ctrlr_fail(struct spdk_nvme_ctrlr *ctrlr)
|
||||
struct spdk_nvme_qpair *qpair;
|
||||
|
||||
ctrlr->is_failed = true;
|
||||
nvme_qpair_fail(&ctrlr->adminq);
|
||||
nvme_qpair_fail(ctrlr->adminq);
|
||||
TAILQ_FOREACH(qpair, &ctrlr->active_io_qpairs, tailq) {
|
||||
nvme_qpair_fail(qpair);
|
||||
}
|
||||
@ -393,20 +398,20 @@ nvme_ctrlr_enable(struct spdk_nvme_ctrlr *ctrlr)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (nvme_ctrlr_set_asq(ctrlr, ctrlr->adminq.cmd_bus_addr)) {
|
||||
if (nvme_ctrlr_set_asq(ctrlr, ctrlr->adminq->cmd_bus_addr)) {
|
||||
SPDK_TRACELOG(SPDK_TRACE_NVME, "set_asq() failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (nvme_ctrlr_set_acq(ctrlr, ctrlr->adminq.cpl_bus_addr)) {
|
||||
if (nvme_ctrlr_set_acq(ctrlr, ctrlr->adminq->cpl_bus_addr)) {
|
||||
SPDK_TRACELOG(SPDK_TRACE_NVME, "set_acq() failed\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
aqa.raw = 0;
|
||||
/* acqs and asqs are 0-based. */
|
||||
aqa.bits.acqs = ctrlr->adminq.num_entries - 1;
|
||||
aqa.bits.asqs = ctrlr->adminq.num_entries - 1;
|
||||
aqa.bits.acqs = ctrlr->adminq->num_entries - 1;
|
||||
aqa.bits.asqs = ctrlr->adminq->num_entries - 1;
|
||||
|
||||
if (nvme_ctrlr_set_aqa(ctrlr, &aqa)) {
|
||||
SPDK_TRACELOG(SPDK_TRACE_NVME, "set_aqa() failed\n");
|
||||
@ -484,7 +489,7 @@ spdk_nvme_ctrlr_reset(struct spdk_nvme_ctrlr *ctrlr)
|
||||
SPDK_NOTICELOG("resetting controller\n");
|
||||
|
||||
/* Disable all queues before disabling the controller hardware. */
|
||||
nvme_qpair_disable(&ctrlr->adminq);
|
||||
nvme_qpair_disable(ctrlr->adminq);
|
||||
TAILQ_FOREACH(qpair, &ctrlr->active_io_qpairs, tailq) {
|
||||
nvme_qpair_disable(qpair);
|
||||
}
|
||||
@ -532,7 +537,7 @@ nvme_ctrlr_identify(struct spdk_nvme_ctrlr *ctrlr)
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
SPDK_ERRLOG("nvme_identify_controller failed!\n");
|
||||
@ -578,7 +583,7 @@ nvme_ctrlr_set_num_qpairs(struct spdk_nvme_ctrlr *ctrlr)
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
SPDK_ERRLOG("nvme_set_num_queues failed!\n");
|
||||
@ -747,7 +752,7 @@ nvme_ctrlr_configure_aer(struct spdk_nvme_ctrlr *ctrlr)
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
SPDK_ERRLOG("nvme_ctrlr_cmd_set_async_event_config failed!\n");
|
||||
@ -890,9 +895,9 @@ nvme_ctrlr_process_init(struct spdk_nvme_ctrlr *ctrlr)
|
||||
int
|
||||
nvme_ctrlr_start(struct spdk_nvme_ctrlr *ctrlr)
|
||||
{
|
||||
ctrlr->transport->qpair_reset(&ctrlr->adminq);
|
||||
ctrlr->transport->qpair_reset(ctrlr->adminq);
|
||||
|
||||
nvme_qpair_enable(&ctrlr->adminq);
|
||||
nvme_qpair_enable(ctrlr->adminq);
|
||||
|
||||
if (nvme_ctrlr_identify(ctrlr) != 0) {
|
||||
return -1;
|
||||
@ -985,7 +990,10 @@ nvme_ctrlr_destruct(struct spdk_nvme_ctrlr *ctrlr)
|
||||
|
||||
spdk_bit_array_free(&ctrlr->free_io_qids);
|
||||
|
||||
nvme_qpair_destroy(&ctrlr->adminq);
|
||||
if (ctrlr->adminq) {
|
||||
nvme_qpair_destroy(ctrlr->adminq);
|
||||
spdk_free(ctrlr->adminq);
|
||||
}
|
||||
|
||||
pthread_mutex_destroy(&ctrlr->ctrlr_lock);
|
||||
|
||||
@ -996,7 +1004,7 @@ int
|
||||
nvme_ctrlr_submit_admin_request(struct spdk_nvme_ctrlr *ctrlr,
|
||||
struct nvme_request *req)
|
||||
{
|
||||
return nvme_qpair_submit_request(&ctrlr->adminq, req);
|
||||
return nvme_qpair_submit_request(ctrlr->adminq, req);
|
||||
}
|
||||
|
||||
int32_t
|
||||
@ -1005,7 +1013,7 @@ spdk_nvme_ctrlr_process_admin_completions(struct spdk_nvme_ctrlr *ctrlr)
|
||||
int32_t num_completions;
|
||||
|
||||
pthread_mutex_lock(&ctrlr->ctrlr_lock);
|
||||
num_completions = spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
num_completions = spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ctrlr->ctrlr_lock);
|
||||
|
||||
return num_completions;
|
||||
@ -1092,7 +1100,7 @@ spdk_nvme_ctrlr_attach_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
|
||||
return res;
|
||||
while (status.done == false) {
|
||||
pthread_mutex_lock(&ctrlr->ctrlr_lock);
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ctrlr->ctrlr_lock);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
@ -1117,7 +1125,7 @@ spdk_nvme_ctrlr_detach_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
|
||||
return res;
|
||||
while (status.done == false) {
|
||||
pthread_mutex_lock(&ctrlr->ctrlr_lock);
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ctrlr->ctrlr_lock);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
@ -1140,7 +1148,7 @@ spdk_nvme_ctrlr_create_ns(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_ns_dat
|
||||
return 0;
|
||||
while (status.done == false) {
|
||||
pthread_mutex_lock(&ctrlr->ctrlr_lock);
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ctrlr->ctrlr_lock);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
@ -1169,7 +1177,7 @@ spdk_nvme_ctrlr_delete_ns(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid)
|
||||
return res;
|
||||
while (status.done == false) {
|
||||
pthread_mutex_lock(&ctrlr->ctrlr_lock);
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ctrlr->ctrlr_lock);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
@ -1194,7 +1202,7 @@ spdk_nvme_ctrlr_format(struct spdk_nvme_ctrlr *ctrlr, uint32_t nsid,
|
||||
return res;
|
||||
while (status.done == false) {
|
||||
pthread_mutex_lock(&ctrlr->ctrlr_lock);
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ctrlr->ctrlr_lock);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
@ -1239,7 +1247,7 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui
|
||||
|
||||
while (status.done == false) {
|
||||
pthread_mutex_lock(&ctrlr->ctrlr_lock);
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ctrlr->ctrlr_lock);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
@ -1265,7 +1273,7 @@ spdk_nvme_ctrlr_update_firmware(struct spdk_nvme_ctrlr *ctrlr, void *payload, ui
|
||||
|
||||
while (status.done == false) {
|
||||
pthread_mutex_lock(&ctrlr->ctrlr_lock);
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ctrlr->ctrlr_lock);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
|
@ -465,7 +465,7 @@ struct spdk_nvme_ctrlr {
|
||||
pthread_mutex_t ctrlr_lock;
|
||||
|
||||
|
||||
struct spdk_nvme_qpair adminq;
|
||||
struct spdk_nvme_qpair *adminq;
|
||||
|
||||
/**
|
||||
* Identify Controller data.
|
||||
|
@ -56,7 +56,7 @@ int nvme_ns_identify_update(struct spdk_nvme_ns *ns)
|
||||
|
||||
while (status.done == false) {
|
||||
pthread_mutex_lock(&ns->ctrlr->ctrlr_lock);
|
||||
spdk_nvme_qpair_process_completions(&ns->ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ns->ctrlr->adminq, 0);
|
||||
pthread_mutex_unlock(&ns->ctrlr->ctrlr_lock);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
|
@ -798,7 +798,7 @@ _nvme_pcie_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
SPDK_ERRLOG("nvme_create_io_cq failed!\n");
|
||||
@ -812,7 +812,7 @@ _nvme_pcie_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme
|
||||
}
|
||||
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
SPDK_ERRLOG("nvme_create_io_sq failed!\n");
|
||||
@ -823,7 +823,7 @@ _nvme_pcie_ctrlr_create_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme
|
||||
return -1;
|
||||
}
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
@ -904,7 +904,7 @@ nvme_pcie_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_
|
||||
return rc;
|
||||
}
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
return -1;
|
||||
@ -916,7 +916,7 @@ nvme_pcie_ctrlr_delete_io_qpair(struct spdk_nvme_ctrlr *ctrlr, struct spdk_nvme_
|
||||
return rc;
|
||||
}
|
||||
while (status.done == false) {
|
||||
spdk_nvme_qpair_process_completions(&ctrlr->adminq, 0);
|
||||
spdk_nvme_qpair_process_completions(ctrlr->adminq, 0);
|
||||
}
|
||||
if (spdk_nvme_cpl_is_error(&status.cpl)) {
|
||||
return -1;
|
||||
|
@ -490,6 +490,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_rr(void)
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_RR);
|
||||
CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_RR);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -508,6 +511,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_rr(void)
|
||||
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1);
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -526,6 +532,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_rr(void)
|
||||
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1);
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -544,6 +553,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_rr(void)
|
||||
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1);
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -609,6 +621,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_wrr(void)
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_RR);
|
||||
CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_RR);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -629,6 +644,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_wrr(void)
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_WRR);
|
||||
CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_WRR);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -647,6 +665,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_wrr(void)
|
||||
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1);
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -665,6 +686,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_wrr(void)
|
||||
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1);
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -729,6 +753,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_vs(void)
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_RR);
|
||||
CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_RR);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -747,6 +774,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_vs(void)
|
||||
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1);
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -767,6 +797,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_vs(void)
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.ams == SPDK_NVME_CC_AMS_VS);
|
||||
CU_ASSERT(ctrlr.opts.arb_mechanism == SPDK_NVME_CC_AMS_VS);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
@ -785,6 +818,9 @@ test_nvme_ctrlr_init_en_0_rdy_0_ams_vs(void)
|
||||
CU_ASSERT(ctrlr.state == NVME_CTRLR_STATE_ENABLE_WAIT_FOR_READY_1);
|
||||
CU_ASSERT(g_ut_nvme_regs.cc.bits.en == 0);
|
||||
|
||||
g_ut_nvme_regs.csts.bits.shst = SPDK_NVME_SHST_COMPLETE;
|
||||
nvme_ctrlr_destruct(&ctrlr);
|
||||
|
||||
/*
|
||||
* Reset to initial state
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user