PERFORCE change 231484 for review

Brooks Davis brooks at FreeBSD.org
Fri Jul 26 15:21:49 UTC 2013


http://p4web.freebsd.org/@@231484?ac=10

Change 231484 by brooks at brooks_zenith on 2013/07/26 15:21:04

	Simplify timeout code by switching from struct bintime to
	sbintime_t.  ~1/4ns resolution is more than sufficent for
	storage device timeouts.
	
	Add a missing timeout check when starting a multi-word write.

Affected files ...

.. //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_core.c#15 edit
.. //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_var.h#7 edit

Differences ...

==== //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_core.c#15 (text+ko) ====

@@ -260,9 +260,8 @@
 cfi_attach(device_t dev) 
 {
 	struct cfi_softc *sc;
-	struct timeval tv;
 	u_int blksz, blocks;
-	u_int r, u, usec;
+	u_int r, u;
 #ifdef CFI_SUPPORT_STRATAFLASH
 	uint64_t ppr;
 	char name[KENV_MNAMELEN], value[32];
@@ -281,38 +280,26 @@
 	sc->sc_handle = rman_get_bushandle(sc->sc_res);
 
 	/* Get time-out values for erase, write, and buffer write. */
-	bintime_clear(&sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE]);
-	usec = 1000 * (1 << cfi_read_qry(sc, CFI_QRY_TTO_ERASE));
-	tv.tv_sec = usec / 1000000;
-	tv.tv_usec = usec % 1000000;
-	timeval2bintime(&tv, &sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE]);
+	sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE] =
+		SBT_1MS * (1 << cfi_read_qry(sc, CFI_QRY_TTO_ERASE));
 	sc->sc_max_timeouts[CFI_TIMEOUT_ERASE] =
-	    sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE];
-	bintime_mul(&sc->sc_max_timeouts[CFI_TIMEOUT_ERASE],
-	    1 << cfi_read_qry(sc, CFI_QRY_MTO_ERASE));
+	    sc->sc_typical_timeouts[CFI_TIMEOUT_ERASE] *
+	    (1 << cfi_read_qry(sc, CFI_QRY_MTO_ERASE));
 
-	bintime_clear(&sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE]);
-	usec = 1 << cfi_read_qry(sc, CFI_QRY_TTO_WRITE);
-	tv.tv_sec = usec / 1000000;
-	tv.tv_usec = usec % 1000000;
-	timeval2bintime(&tv, &sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE]);
+	sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE] =
+	    SBT_1US * (1 << cfi_read_qry(sc, CFI_QRY_TTO_WRITE));
 	sc->sc_max_timeouts[CFI_TIMEOUT_WRITE] =
-	    sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE];
-	bintime_mul(&sc->sc_max_timeouts[CFI_TIMEOUT_WRITE],
-	    1 << cfi_read_qry(sc, CFI_QRY_MTO_WRITE));
+	    sc->sc_typical_timeouts[CFI_TIMEOUT_WRITE] *
+	    (1 << cfi_read_qry(sc, CFI_QRY_MTO_WRITE));
 
-	bintime_clear(&sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE]);
-	usec = 1 << cfi_read_qry(sc, CFI_QRY_TTO_BUFWRITE);
-	tv.tv_sec = usec / 1000000;
-	tv.tv_usec = usec % 1000000;
-	timeval2bintime(&tv, &sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE]);
+	sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] =
+	    SBT_1US * (1 << cfi_read_qry(sc, CFI_QRY_TTO_BUFWRITE));
 	sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE] =
-	    sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE];
-	bintime_mul(&sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE],
-	    1 << cfi_read_qry(sc, CFI_QRY_MTO_BUFWRITE));
+	    sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] *
+	    (1 << cfi_read_qry(sc, CFI_QRY_MTO_BUFWRITE));
 
 	/* Get the maximum size of a multibyte program */
-	if (bintime_isset(&sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE]))
+	if (sc->sc_typical_timeouts[CFI_TIMEOUT_BUFWRITE] != 0)
 		sc->sc_maxbuf = 1 << (cfi_read_qry(sc, CFI_QRY_MAXBUF) |
 		    cfi_read_qry(sc, CFI_QRY_MAXBUF) << 8);
 	else
@@ -384,16 +371,15 @@
 }
 
 static int
-cfi_wait_ready(struct cfi_softc *sc, u_int ofs, struct bintime *start,
+cfi_wait_ready(struct cfi_softc *sc, u_int ofs, sbintime_t start,
     enum cfi_wait_cmd cmd)
 {
 	int done, error, tto_exceeded;
 	uint32_t st0 = 0, st = 0;
-	struct bintime mend, now, tend;
+	sbintime_t mend, now, tend;
 
-	tend = mend = *start;
-	bintime_add(&tend, &sc->sc_typical_timeouts[cmd]);
-	bintime_add(&mend, &sc->sc_max_timeouts[cmd]);
+	tend = start + sc->sc_typical_timeouts[cmd];
+	mend = start + sc->sc_max_timeouts[cmd];
 
 	done = 0;
 	error = 0;
@@ -427,11 +413,11 @@
 			break;
 		}
 
-		binuptime(&now);
-		if (tto_exceeded || bintime_cmp(&now, &tend, >)) {
+		now = sbinuptime();
+		if (tto_exceeded || now > tend) {
 			if (!tto_exceeded)
 				tto_exceeded = 1;
-			if (bintime_cmp(&now, &mend, >)) {
+			if (now > mend) {
 #ifdef CFI_DEBUG_TIMEOUT
 				device_printf(sc->sc_dev,
 				    "max timeout exceeded (cmd %d)", cmd);
@@ -464,7 +450,7 @@
 	int error, i, neederase = 0;
 	uint32_t st;
 	u_int wlen;
-	struct bintime start;
+	sbintime_t start;
 
 	/* Intel flash must be unlocked before modification */
 	switch (sc->sc_cmdset) {
@@ -494,7 +480,7 @@
 
 	if (neederase) {
 		intr = intr_disable();
-		binuptime(&start);
+		start = sbinuptime();
 		/* Erase the block. */
 		switch (sc->sc_cmdset) {
 		case CFI_VEND_INTEL_ECS:
@@ -514,7 +500,7 @@
 			return (ENODEV);
 		}
 		intr_restore(intr);
-		error = cfi_wait_ready(sc, sc->sc_wrofs, &start, 
+		error = cfi_wait_ready(sc, sc->sc_wrofs, start, 
 		    CFI_TIMEOUT_ERASE);
 		if (error)
 			goto out;
@@ -533,11 +519,14 @@
 
 				intr = intr_disable();
 
-				binuptime(&start);
+				start = sbinuptime();
 				do {
 					cfi_write(sc, sc->sc_wrofs + i,
 					    CFI_BCS_BUF_PROG_SETUP);
-					/* XXX: do some timeout management */
+					if (sbinuptime() > start + sc->sc_max_timeouts[CFI_TIMEOUT_BUFWRITE]) {
+						error = ETIMEDOUT;
+						goto out;
+					}
 					st = cfi_read(sc, sc->sc_wrofs + i);
 				} while (! (st & CFI_INTEL_STATUS_WSMS));
 
@@ -567,7 +556,9 @@
 				intr_restore(intr);
 
 				error = cfi_wait_ready(sc, sc->sc_wrofs + i,
-				    &start, CFI_TIMEOUT_BUFWRITE);
+				    start, CFI_TIMEOUT_BUFWRITE);
+				if (error != 0)
+					goto out;
 			}
 			goto out;
 		default:
@@ -605,7 +596,7 @@
 		 */
 		intr = intr_disable();
 
-		binuptime(&start);
+		start = sbinuptime();
 		switch (sc->sc_cmdset) {
 		case CFI_VEND_INTEL_ECS:
 		case CFI_VEND_INTEL_SCS:
@@ -633,7 +624,7 @@
 		
 		intr_restore(intr);
 
-		error = cfi_wait_ready(sc, sc->sc_wrofs, &start,
+		error = cfi_wait_ready(sc, sc->sc_wrofs, start,
 		   CFI_TIMEOUT_WRITE);
 		if (error)
 			goto out;
@@ -732,7 +723,7 @@
 #ifdef CFI_ARMEDANDDANGEROUS
 	register_t intr;
 	int i, error;
-	struct bintime start;
+	sbintime_t start;
 #endif
 
 	if (sc->sc_cmdset != CFI_VEND_INTEL_ECS)
@@ -742,11 +733,11 @@
 #ifdef CFI_ARMEDANDDANGEROUS
 	for (i = 7; i >= 4; i--, id >>= 16) {
 		intr = intr_disable();
-		binuptime(&start);
+		start = sbinuptime();
 		cfi_write(sc, 0, CFI_INTEL_PP_SETUP);
 		cfi_put16(sc, CFI_INTEL_PR(i), id&0xffff);
 		intr_restore(intr);
-		error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, &start,
+		error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, start,
 		    CFI_TIMEOUT_WRITE);
 		if (error)
 			break;
@@ -787,7 +778,7 @@
 #ifdef CFI_ARMEDANDDANGEROUS
 	register_t intr;
 	int error;
-	struct bintime start;
+	sbintime_t start;
 #endif
 	if (sc->sc_cmdset != CFI_VEND_INTEL_ECS)
 		return EOPNOTSUPP;
@@ -801,7 +792,7 @@
 	cfi_write(sc, 0, CFI_INTEL_PP_SETUP);
 	cfi_put16(sc, CFI_INTEL_PLR, 0xFFFD);
 	intr_restore(intr);
-	error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, &start,
+	error = cfi_wait_ready(sc, CFI_BCS_READ_STATUS, start,
 	    CFI_TIMEOUT_WRITE);
 	cfi_write(sc, 0, CFI_BCS_READ_ARRAY);
 	return error;

==== //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_var.h#7 (text+ko) ====

@@ -57,8 +57,8 @@
 	struct cfi_region *sc_region;	/* Array of region info. */
 
 	u_int		sc_cmdset;
-	struct bintime	sc_typical_timeouts[3];
-	struct bintime	sc_max_timeouts[3];
+	sbintime_t	sc_typical_timeouts[3];
+	sbintime_t	sc_max_timeouts[3];
 
 	u_int		sc_maxbuf;
 


More information about the p4-projects mailing list