From bd715ac5e9306996da69150a0e4eb356092515a7 Mon Sep 17 00:00:00 2001 From: Matheus Date: Mon, 7 Aug 2023 20:36:01 -0300 Subject: [PATCH] nvme: properly support versions older than 1.4 --- kernel-src/io/block/nvme.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/kernel-src/io/block/nvme.c b/kernel-src/io/block/nvme.c index 22733cd6..d91fc94d 100644 --- a/kernel-src/io/block/nvme.c +++ b/kernel-src/io/block/nvme.c @@ -678,13 +678,14 @@ static void initcontroller(pcienum_t *e) { if (STATUS_FATAL(bar0->status)) { printf("nvme: controller returned fatal while initializing\n"); + pmm_free(acq, 2); return; } nvmecontroller_t *controller = alloc(sizeof(nvmecontroller_t)); __assert(controller); - controller->id = ctlrid++; + controller->id = ctlrid; controller->bar0 = bar0; controller->dbstride = CAP_DOORBELLSTRIDE(bar0->cap); controller->maxentries = CAP_MAXENTRIES(bar0->cap); @@ -713,7 +714,17 @@ static void initcontroller(pcienum_t *e) { __assert(controllerid); __assert(IDENTIFY_CONTROLLER(controller, controllerid) == 0); - __assert(controllerid->type == CONTROLLER_TYPE_IO); + // <=1.3 controllers will report a 0 in this field. >=1.4 controllers have a proper type here + if (controllerid->type != 0 && controllerid->type != CONTROLLER_TYPE_IO) { + printf("nvme: controller type not supported\n"); + // FIXME free ISRs + pmm_free(acq, 2); + free(controllerid); + free(controller); + return; + } + + ++ctlrid; resetsoftwareprogress(controller);