I have created some code in lm78.c to handle the W83792D watchdog portion of the chip. A diff is pasted at the end of this message. There is one problem with it though. Under OpenBSD 4.1, if sysctl.kern.period is set to anything other than 0 while sysctl.kern.auto is set to 1, after a few seconds a panic occurs with the following trace:
panic: process context required lockmgr ichiic_ic2_acquire_bus lm_i2c_writereg wb_w83792d_wdg_cb wdog_tickle softclock Bad Frame Pointer: ... The problem is that lockmgr requires the caller to have a process id, but the wdog tickler is not associated with a process. So either lockmgr needs to be changed to handle a caller with no process, or the tickler needs to be associated with a context. The problem is different on current. The trace I get for that is: kernel: page fault trap, code = 0 Stooped at sleep_setup + 0x1d: cmpb $0x7, 0x35(%ebx) ddb> trace sleep_setup(d0xd9cdc, d1901700, 10, d071e656, cba8d6aa) at sleep_setup+0x1d tsleep(d1901700, 10, d071e656, 64) at tsleep+0x5c ichiic_i2c_exec(d1901700, 1, 2f, d08d9dae, 1) at ichiic_i2c_exec+0x27d iic_exec(d1901740, 1, 2f, d08d9dae, 1, d08d9daf, 1, 9, d1901764, 10) at iic_exec+0x177 lm_i2c_writereg(d191b800, 4, d07555f0d0, d08d8000, 0) at lm_i2c_readreg+0x40 wb_w83792d_wdg_cb(d191b800) at wb_w83792_wdb_cb+0x17 wdog_tickle(0, 0, 0, 5305, 0) at wdog_tickle+0x25 sofclock(d0650058, 10, 380010, d080010, d08d9e6c) at softclock+0x23c Bad Frame Pointer: 0xd08d9e14 I only looked at the problem on current for a short period of time. I'm going to be using the watchdogd so I don't actually need the sysctl.watchdog.auto functionality. But if this is going to get committed, than I would be more than happy in testing any changes that may arise due to the issues above. On another note, about five months I submitted a driver for the W83627HF watchdog in a new file called wbwdg.c. I have been coordinating with an OpenBSD developer to get it committed, and last I heard it was going to get committed. But it has not been committed, and I seem to have lost contact with the developer. So I was wondering if this code could get committed? Thanks Jonathan Steel Diff for W83792D watchdog --- lm78.c Mon Jun 25 16:50:18 2007 +++ lm78.c_old Mon Jan 29 08:06:01 2007 @@ -69,6 +69,9 @@ void as_refresh_temp(struct lm_softc *, int); +void wb_w83792d_wdg_init(struct lm_softc *); +int wb_w83792d_wdg_cb(void *, int); + struct lm_chip { int (*chip_match)(struct lm_softc *); }; @@ -555,6 +558,7 @@ else printf(": W83792D rev 0x%x\n", devid); lm_setup_sensors(sc, w83792d_sensors); + wb_w83792d_wdg_init(sc); break; case WB_CHIPID_AS99127F: if (vendid == WB_VENDID_ASUS) { @@ -885,3 +889,36 @@ sensor->value = sdata * 500000 + 273150000; } } + +void +wb_w83792d_wdg_init(struct lm_softc *sc) +{ + int control = sc->lm_readreg(sc, 0x40); + + /* Enable watchdog in configuration register */ + control |= 0x10; + sc->lm_writereg(sc, 0x40, control); + + /* + * Enable hard watch dog timer with period 0 + * so that its initially disabled + */ + sc->lm_writereg(sc, 0x04, 0x00); + sc->lm_writereg(sc, 0x01, 0xAA); + sc->lm_writereg(sc, 0x01, 0x33); + + wdog_register(sc, wb_w83792d_wdg_cb); + + return; +} + +int +wb_w83792d_wdg_cb(void *arg, int period) +{ + struct lm_softc *sc = arg; + + sc->lm_writereg(sc, 0x04, period); + + return period; +} -- Using Opera's revolutionary e-mail client: http://www.opera.com/mail/