Page MenuHomeFreeBSD

D13389.id36279.diff
No OneTemporary

D13389.id36279.diff

Index: sys/dev/nvme/nvme_ctrlr.c
===================================================================
--- sys/dev/nvme/nvme_ctrlr.c
+++ sys/dev/nvme/nvme_ctrlr.c
@@ -247,43 +247,49 @@
cc.raw = nvme_mmio_read_4(ctrlr, cc);
csts.raw = nvme_mmio_read_4(ctrlr, csts);
- if (cc.bits.en != desired_val) {
- nvme_printf(ctrlr, "%s called with desired_val = %d "
- "but cc.en = %d\n", __func__, desired_val, cc.bits.en);
- return (ENXIO);
+ ms_waited = 0;
+ while (cc.bits.en != desired_val) {
+ if (ms_waited++ > ctrlr->enable_timeout_in_ms) {
+ nvme_printf(ctrlr, "controller enable did not become %d "
+ "within %d ms\n", desired_val, ctrlr->enable_timeout_in_ms);
+ return (ENXIO);
+ }
+ DELAY(1000);
+ cc.raw = nvme_mmio_read_4(ctrlr, cc);
}
ms_waited = 0;
-
while (csts.bits.rdy != desired_val) {
- DELAY(1000);
if (ms_waited++ > ctrlr->ready_timeout_in_ms) {
nvme_printf(ctrlr, "controller ready did not become %d "
"within %d ms\n", desired_val, ctrlr->ready_timeout_in_ms);
return (ENXIO);
}
+ DELAY(1000);
csts.raw = nvme_mmio_read_4(ctrlr, csts);
}
return (0);
}
-static void
+static int
nvme_ctrlr_disable(struct nvme_controller *ctrlr)
{
union cc_register cc;
union csts_register csts;
+ int err;
cc.raw = nvme_mmio_read_4(ctrlr, cc);
csts.raw = nvme_mmio_read_4(ctrlr, csts);
- if (cc.bits.en == 1 && csts.bits.rdy == 0)
- nvme_ctrlr_wait_for_ready(ctrlr, 1);
+ if (cc.bits.en == 1 && csts.bits.rdy == 0) {
+ err = nvme_ctrlr_wait_for_ready(ctrlr, 1);
+ if (err != 0)
+ return (err);
cc.bits.en = 0;
nvme_mmio_write_4(ctrlr, cc, cc.raw);
- DELAY(5000);
- nvme_ctrlr_wait_for_ready(ctrlr, 0);
+ return (nvme_ctrlr_wait_for_ready(ctrlr, 0));
}
static int
@@ -326,7 +332,6 @@
cc.bits.mps = (PAGE_SIZE >> 13);
nvme_mmio_write_4(ctrlr, cc, cc.raw);
- DELAY(5000);
return (nvme_ctrlr_wait_for_ready(ctrlr, 1));
}
@@ -349,7 +354,9 @@
DELAY(100*1000);
- nvme_ctrlr_disable(ctrlr);
+ err = nvme_ctrlr_disable(ctrlr);
+ if (err != 0)
+ return err;
return (nvme_ctrlr_enable(ctrlr));
}
@@ -1123,6 +1130,7 @@
/* Get ready timeout value from controller, in units of 500ms. */
cap_lo.raw = nvme_mmio_read_4(ctrlr, cap_lo);
ctrlr->ready_timeout_in_ms = cap_lo.bits.to * 500;
+ ctrlr->enable_timeout_in_ms = 2500; /* Wait up to 2.5s for EN bit delta */
timeout_period = NVME_DEFAULT_TIMEOUT_PERIOD;
TUNABLE_INT_FETCH("hw.nvme.timeout_period", &timeout_period);
Index: sys/dev/nvme/nvme_private.h
===================================================================
--- sys/dev/nvme/nvme_private.h
+++ sys/dev/nvme/nvme_private.h
@@ -246,6 +246,7 @@
struct mtx lock;
uint32_t ready_timeout_in_ms;
+ uint32_t enable_timeout_in_ms;
bus_space_tag_t bus_tag;
bus_space_handle_t bus_handle;

File Metadata

Mime Type
text/plain
Expires
Fri, May 1, 9:50 AM (14 h, 23 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32570658
Default Alt Text
D13389.id36279.diff (2 KB)

Event Timeline