Module Name: src Committed By: macallan Date: Tue Nov 5 11:08:20 UTC 2013
Modified Files: src/sys/arch/macppc/dev: pmu.c Log Message: do what cuda does - if we read garbage from the RTC try a few more times To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/sys/arch/macppc/dev/pmu.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/macppc/dev/pmu.c diff -u src/sys/arch/macppc/dev/pmu.c:1.21 src/sys/arch/macppc/dev/pmu.c:1.22 --- src/sys/arch/macppc/dev/pmu.c:1.21 Fri Jul 1 18:41:52 2011 +++ src/sys/arch/macppc/dev/pmu.c Tue Nov 5 11:08:20 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: pmu.c,v 1.21 2011/07/01 18:41:52 dyoung Exp $ */ +/* $NetBSD: pmu.c,v 1.22 2013/11/05 11:08:20 macallan Exp $ */ /*- * Copyright (c) 2006 Michael Lorenz @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmu.c,v 1.21 2011/07/01 18:41:52 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmu.c,v 1.22 2013/11/05 11:08:20 macallan Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -702,13 +702,26 @@ pmu_todr_get(todr_chip_handle_t tch, str { struct pmu_softc *sc = tch->cookie; uint32_t sec; + int count = 10; + int ok = FALSE; uint8_t resp[16]; DPRINTF("pmu_todr_get\n"); - pmu_send(sc, PMU_READ_RTC, 0, NULL, 16, resp); + while ((count > 0) && (!ok)) { + pmu_send(sc, PMU_READ_RTC, 0, NULL, 16, resp); - memcpy(&sec, &resp[1], 4); - tvp->tv_sec = sec - DIFF19041970; + memcpy(&sec, &resp[1], 4); + tvp->tv_sec = sec - DIFF19041970; + ok = (sec > DIFF19041970) && (sec < 0xf0000000); + if (!ok) aprint_error_dev(sc->sc_dev, + "got garbage from rtc (%08x)\n", sec); + count--; + } + if (count == 0) { + aprint_error_dev(sc->sc_dev, + "unable to get a sane time value\n"); + tvp->tv_sec = 0; + } DPRINTF("tod: %" PRIo64 "\n", tvp->tv_sec); tvp->tv_usec = 0; return 0;