Date: Mon, 29 Jul 2013 22:15:49 GMT From: Brooks Davis <brooks@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 231565 for review Message-ID: <201307292215.r6TMFn91022878@skunkworks.freebsd.org>
index | next in thread | raw e-mail
http://p4web.freebsd.org/@@231565?ac=10 Change 231565 by brooks@brooks_zenith on 2013/07/29 22:15:11 Add counters for each type of timeout and report them via sysctl. Tidy the timeout code a bit and ensure that the last status register check is performed after the last timeout expires. Based on feedback from: imp Affected files ... .. //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_core.c#18 edit .. //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_var.h#9 edit Differences ... ==== //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_core.c#18 (text+ko) ==== @@ -55,6 +55,8 @@ #include <dev/cfi/cfi_reg.h> #include <dev/cfi/cfi_var.h> +static void cfi_add_sysctls(struct cfi_softc *); + extern struct cdevsw cfi_cdevsw; char cfi_driver_name[] = "cfi"; @@ -343,6 +345,8 @@ "%s%u", cfi_driver_name, u); sc->sc_nod->si_drv1 = sc; + cfi_add_sysctls(sc); + #ifdef CFI_SUPPORT_STRATAFLASH /* * Store the Intel factory PPR in the environment. In some @@ -363,6 +367,45 @@ return (0); } +static void +cfi_add_sysctls(struct cfi_softc *sc) +{ + struct sysctl_ctx_list *ctx; + struct sysctl_oid_list *children; + + ctx = device_get_sysctl_ctx(sc->sc_dev); + children = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev)); + + SYSCTL_ADD_UINT(ctx, children, OID_AUTO, + "typical_erase_timout_count", + CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_ERASE], + 0, "Number of times the typical erase timeout was exceeded"); + SYSCTL_ADD_UINT(ctx, children, OID_AUTO, + "max_erase_timout_count", + CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_ERASE], 0, + "Number of times the maximum erase timeout was exceeded"); + SYSCTL_ADD_UINT(ctx, children, OID_AUTO, + "typical_write_timout_count", + CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_WRITE], 0, + "Number of times the typical write timeout was exceeded"); + SYSCTL_ADD_UINT(ctx, children, OID_AUTO, + "max_write_timout_count", + CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_WRITE], 0, + "Number of times the maximum write timeout was exceeded"); + if (sc->sc_maxbuf > 0) { + SYSCTL_ADD_UINT(ctx, children, OID_AUTO, + "typical_bufwrite_timout_count", + CTLFLAG_RD, &sc->sc_tto_counts[CFI_TIMEOUT_BUFWRITE], 0, + "Number of times the typical buffered write timeout was " + "exceeded"); + SYSCTL_ADD_UINT(ctx, children, OID_AUTO, + "max_bufwrite_timout_count", + CTLFLAG_RD, &sc->sc_mto_counts[CFI_TIMEOUT_BUFWRITE], 0, + "Number of times the maximum buffered write timeout was " + "exceeded"); + } +} + int cfi_detach(device_t dev) { @@ -382,15 +425,18 @@ { int done, error, tto_exceeded; uint32_t st0 = 0, st = 0; - sbintime_t mend, now, tend; - - tend = start + sc->sc_typical_timeouts[cmd]; - mend = start + sc->sc_max_timeouts[cmd]; + sbintime_t now; done = 0; error = 0; tto_exceeded = 0; while (!done && !error) { + /* + * Save time before we start so we always do one check + * after the timeout has expired. + */ + now = sbinuptime(); + switch (sc->sc_cmdset) { case CFI_VEND_INTEL_ECS: case CFI_VEND_INTEL_SCS: @@ -419,24 +465,25 @@ break; } - now = sbinuptime(); - if (tto_exceeded || now > tend) { - if (!tto_exceeded) + if (tto_exceeded || + now > start + sc->sc_typical_timeouts[cmd]) { + if (!tto_exceeded) { tto_exceeded = 1; - if (now > mend) { + sc->sc_tto_counts[cmd]++; +#ifdef CFI_DEBUG_TIMEOUT + device_printf(sc->sc_dev, + "typical timeout exceeded (cmd %d)", cmd); +#endif + } + if (now > start + sc->sc_max_timeouts[cmd]) { + sc->sc_mto_counts[cmd]++; #ifdef CFI_DEBUG_TIMEOUT device_printf(sc->sc_dev, "max timeout exceeded (cmd %d)", cmd); #endif - break; } } } -#ifdef CFI_DEBUG_TIMEOUT - if (tto_exceeded) - device_printf(sc->sc_dev, - "typical timeout exceeded (cmd %d)", cmd); -#endif if (!done && !error) error = ETIMEDOUT; if (error) ==== //depot/projects/ctsrd/beribsd/src/sys/dev/cfi/cfi_var.h#9 (text+ko) ==== @@ -65,6 +65,8 @@ u_int sc_cmdset; sbintime_t sc_typical_timeouts[3]; sbintime_t sc_max_timeouts[3]; + u_int sc_tto_counts[3]; + u_int sc_mto_counts[3]; u_int sc_maxbuf;help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307292215.r6TMFn91022878>
