                     Berkshire Products PC Watchdog Card
                   Support for ISA Cards  Revision A and C
           Documentation and Driver by Ken Hollis <kenji@bitgate.com>

 The PC Watchdog is a card that offers the same type of functionality that
 the WDT card does, only it doesn't require an IRQ to run.  Furthermore,
 the Revision C card allows you to monitor any IO Port to automatically
 trigger the card into being reset.  This way you can make the card
 monitor hard drive status, or anything else you need.

 The Watchdog Driver has one basic role: to talk to the card and send
 signals to it so it doesn't reset your computer ... at least during
 normal operation.

 The Watchdog Driver will automatically find your watchdog card, and will
 attach a running driver for use with that card.  After the watchdog
 drivers have initialized, you can then talk to the card using the PC
 Watchdog program, available from http://ftp.bitgate.com/pcwd/.

 I suggest putting a "watchdog -d" before the beginning of an fsck, and
 a "watchdog -e -t 1" immediately after the end of an fsck.  (Remember
 to run the program with an "&" to run it in the background!)

 If you want to write a program to be compatible with the PC Watchdog
 driver, simply do the following:

-- Snippet of code --
/*
 * Watchdog Driver Test Program
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/pcwd.h>

int fd;

/*
 * This function simply sends an IOCTL to the driver, which in turn ticks
 * the PC Watchdog card to reset its internal timer so it doesn't trigger
 * a computer reset.
 */
void keep_alive(void)
{
    int dummy;

    ioctl(fd, WDIOC_KEEPALIVE, &dummy);
}

/*
 * The main program.  Run the program with "-d" to disable the card,
 * or "-e" to enable the card.
 */
int main(int argc, char *argv[])
{
    fd = open("/dev/watchdog", O_WRONLY);

    if (fd == -1) {
	fprintf(stderr, "Watchdog device not enabled.\n");
	fflush(stderr);
	exit(-1);
    }

    if (argc > 1) {
	if (!strncasecmp(argv[1], "-d", 2)) {
	    ioctl(fd, WDIOC_SETOPTIONS, WDIOS_DISABLECARD);
	    fprintf(stderr, "Watchdog card disabled.\n");
	    fflush(stderr);
	    exit(0);
	} else if (!strncasecmp(argv[1], "-e", 2)) {
	    ioctl(fd, WDIOC_SETOPTIONS, WDIOS_ENABLECARD);
	    fprintf(stderr, "Watchdog card enabled.\n");
	    fflush(stderr);
	    exit(0);
	} else {
	    fprintf(stderr, "-d to disable, -e to enable.\n");
	    fprintf(stderr, "run by itself to tick the card.\n");
	    fflush(stderr);
	    exit(0);
	}
    } else {
	fprintf(stderr, "Watchdog Ticking Away!\n");
	fflush(stderr);
    }

    while(1) {
	keep_alive();
	sleep(1);
    }
}
-- End snippet --

 Other IOCTL functions include:

	WDIOC_GETSUPPORT
		This returns the support of the card itself.  This
		returns in structure "PCWDS" which returns:
			options = WDIOS_TEMPPANIC
				  (This card supports temperature)
			firmware_version = xxxx
				  (Firmware version of the card)

	WDIOC_GETSTATUS
		This returns the status of the card, with the bits of
		WDIOF_* bitwise-anded into the value.  (The comments
		are in linux/pcwd.h)

	WDIOC_GETBOOTSTATUS
		This returns the status of the card that was reported
		at bootup.

	WDIOC_GETTEMP
		This returns the temperature of the card.  (You can also
		read /dev/watchdog, which gives a temperature update
		every second.)

	WDIOC_SETOPTIONS
		This lets you set the options of the card.  You can either
		enable or disable the card this way.

	WDIOC_KEEPALIVE
		This pings the card to tell it not to reset your computer.

 And that's all she wrote!

 -- Ken Hollis
    (kenji@bitgate.com)

(This documentation may be out of date.  Check
 http://ftp.bitgate.com/pcwd/ for the absolute latest additions.)
