summaryrefslogtreecommitdiff
path: root/sys/dev/usb/udcf.c
diff options
context:
space:
mode:
authorMarc Balmer <mbalmer@cvs.openbsd.org>2006-10-27 11:28:41 +0000
committerMarc Balmer <mbalmer@cvs.openbsd.org>2006-10-27 11:28:41 +0000
commite04f10b1c4d5f400e36cd20970ffe49c0f99e4c7 (patch)
treee3e282f4c80c4e3ba6dbed98a89e6455e1bb13c4 /sys/dev/usb/udcf.c
parentec852c40ef3b496b075b991e59916d13c6095f3a (diff)
udcf(4) degraded the sensor status from OK to WARNING on the first receiption
error, which is to fast as this does not give ntpd the opportunity to use the sensor value. If we decode a valid time information, it has to be available to applications for some minimal time. I choose a value of 5 minutes. If we do not receive any new valid time information during this period, the sensor will be degraded to WARNING, and after another fifteen minutes it will be further degraded to CRITICAL. "makes sense to me" henning@, "sure" deraadt@
Diffstat (limited to 'sys/dev/usb/udcf.c')
-rw-r--r--sys/dev/usb/udcf.c46
1 files changed, 25 insertions, 21 deletions
diff --git a/sys/dev/usb/udcf.c b/sys/dev/usb/udcf.c
index d0da4050a05..502b2ad3ee8 100644
--- a/sys/dev/usb/udcf.c
+++ b/sys/dev/usb/udcf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: udcf.c,v 1.18 2006/10/14 22:41:21 mbalmer Exp $ */
+/* $OpenBSD: udcf.c,v 1.19 2006/10/27 11:28:40 mbalmer Exp $ */
/*
* Copyright (c) 2006 Marc Balmer <mbalmer@openbsd.org>
@@ -49,7 +49,8 @@ int udcfdebug = 0;
#define UDCF_CTRL_IDX 0x33
#define UDCF_CTRL_VAL 0x98
-#define DPERIOD ((long) 15 * 60) /* degrade period, 15 min */
+#define DPERIOD1 ((long) 5 * 60) /* degrade OK -> WARN */
+#define DPERIOD2 ((long) 15 * 60) /* degrade WARN -> CRIT */
#define CLOCK_DCF77 0
#define CLOCK_HBG 1
@@ -95,7 +96,7 @@ struct udcf_softc {
struct sensor sc_sensor;
};
-static int t1, t2, t3, t4, t5, t6, t7, t8, t9; /* timeouts in hz */
+static int t1, t2, t3, t4, t5, t6, t7, t8, t9, t10; /* timeouts in hz */
void udcf_intr(void *);
void udcf_probe(void *);
@@ -254,9 +255,12 @@ USB_ATTACH(udcf)
t.tv_sec = 8L;
t6 = tvtohz(&t);
- t.tv_sec = DPERIOD;
+ t.tv_sec = DPERIOD1;
t8 = tvtohz(&t);
+ t.tv_sec = DPERIOD2;
+ t10 = tvtohz(&t);
+
t.tv_sec = 0L;
t.tv_usec = 250000L;
t9 = tvtohz(&t);
@@ -345,7 +349,7 @@ udcf_it_intr(void *xsc)
usb_add_task(sc->sc_udev, &sc->sc_it_task);
}
-/* detect the cloc type (DCF77 or HBG) */
+/* detect the clock type (DCF77 or HBG) */
void
udcf_ct_intr(void *xsc)
{
@@ -403,7 +407,12 @@ udcf_probe(void *xsc)
}
sc->sc_sensor.status = SENSOR_S_OK;
- timeout_del(&sc->sc_it_to);
+ /*
+ * if no valid time information is received
+ * during the next 5 minutes, the sensor state
+ * will be degraded to SENSOR_S_WARN
+ */
+ timeout_add(&sc->sc_it_to, t8);
}
sc->sc_tbits = 0LL;
sc->sc_mask = 1LL;
@@ -474,10 +483,6 @@ udcf_mg_probe(void *xsc)
if (time_second - sc->sc_last_mg < 57) {
DPRINTF(("unexpected gap, resync\n"));
sc->sc_sync = 1;
- if (sc->sc_sensor.status == SENSOR_S_OK) {
- sc->sc_sensor.status = SENSOR_S_WARN;
- timeout_add(&sc->sc_it_to, t8);
- }
timeout_add(&sc->sc_to, t5);
timeout_add(&sc->sc_sl_to, t6);
sc->sc_last_mg = 0;
@@ -545,11 +550,6 @@ udcf_mg_probe(void *xsc)
DPRINTF(("\n"));
} else {
DPRINTF(("parity error, resync\n"));
-
- if (sc->sc_sensor.status == SENSOR_S_OK) {
- sc->sc_sensor.status = SENSOR_S_WARN;
- timeout_add(&sc->sc_it_to, t8);
- }
sc->sc_sync = 1;
}
timeout_add(&sc->sc_to, t4); /* re-sync in 450 ms */
@@ -570,10 +570,6 @@ udcf_sl_probe(void *xsc)
DPRINTF(("no signal\n"));
sc->sc_sync = 1;
- if (sc->sc_sensor.status == SENSOR_S_OK) {
- sc->sc_sensor.status = SENSOR_S_WARN;
- timeout_add(&sc->sc_it_to, t8);
- }
timeout_add(&sc->sc_to, t5);
timeout_add(&sc->sc_sl_to, t6);
}
@@ -587,9 +583,17 @@ udcf_it_probe(void *xsc)
if (sc->sc_dying)
return;
- DPRINTF(("\ndegrading sensor to state critical"));
+ DPRINTF(("\ndegrading sensor state"));
- sc->sc_sensor.status = SENSOR_S_CRIT;
+ if (sc->sc_sensor.status == SENSOR_S_OK) {
+ sc->sc_sensor.status = SENSOR_S_WARN;
+ /*
+ * further degrade in 15 minutes if we dont receive and new
+ * time information
+ */
+ timeout_add(&sc->sc_it_to, t10);
+ } else
+ sc->sc_sensor.status = SENSOR_S_CRIT;
}
/* detect clock type */