Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 21 Oct 2020 00:46:54 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r366905 - stable/12/sys/dev/nvme
Message-ID:  <202010210046.09L0ks1W019760@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Wed Oct 21 00:46:53 2020
New Revision: 366905
URL: https://svnweb.freebsd.org/changeset/base/366905

Log:
  MFC r366707: Use RTD3 Entry Latency value as shutdown timeout.
  
  This field was not in specs when the driver was written, but now there
  are SSDs with the reported latency of 10s, where hardcoded value of 5s
  seems to be not enough sometimes, causing shutdown timeout messages.

Modified:
  stable/12/sys/dev/nvme/nvme_ctrlr.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/nvme/nvme_ctrlr.c
==============================================================================
--- stable/12/sys/dev/nvme/nvme_ctrlr.c	Wed Oct 21 00:15:12 2020	(r366904)
+++ stable/12/sys/dev/nvme/nvme_ctrlr.c	Wed Oct 21 00:46:53 2020	(r366905)
@@ -1474,22 +1474,24 @@ nvme_ctrlr_shutdown(struct nvme_controller *ctrlr)
 {
 	uint32_t	cc;
 	uint32_t	csts;
-	int		ticks = 0;
+	int		ticks = 0, timeout;
 
 	cc = nvme_mmio_read_4(ctrlr, cc);
 	cc &= ~(NVME_CC_REG_SHN_MASK << NVME_CC_REG_SHN_SHIFT);
 	cc |= NVME_SHN_NORMAL << NVME_CC_REG_SHN_SHIFT;
 	nvme_mmio_write_4(ctrlr, cc, cc);
 
+	timeout = ctrlr->cdata.rtd3e == 0 ? 5 * hz :
+	    ((uint64_t)ctrlr->cdata.rtd3e * hz + 999999) / 1000000;
 	while (1) {
 		csts = nvme_mmio_read_4(ctrlr, csts);
 		if (csts == 0xffffffff)		/* Hot unplug. */
 			break;
 		if (NVME_CSTS_GET_SHST(csts) == NVME_SHST_COMPLETE)
 			break;
-		if (ticks++ > 5*hz) {
+		if (ticks++ > timeout) {
 			nvme_printf(ctrlr, "did not complete shutdown within"
-			    " 5 seconds of notification\n");
+			    " %d ticks of notification\n", timeout);
 			break;
 		}
 		pause("nvme shn", 1);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202010210046.09L0ks1W019760>