Watchdog drivers need to support rearming the watchdog in contexts which

are not permitted to sleep.  Only use the IPMI watchdog with backends
which poll driver-initiated requests to meet this requirement.

In practice this means that watchdogs will no longer be used on systems
that use the SSIF backend.

Differential Revision:	https://reviews.freebsd.org/D2062
MFC after:	2 weeks
This commit is contained in:
jhb 2015-04-24 16:56:23 +00:00
parent cbdd03ad96
commit f73942d525
4 changed files with 17 additions and 9 deletions

View File

@ -756,17 +756,22 @@ ipmi_startup(void *arg)
} }
device_printf(dev, "Number of channels %d\n", i); device_printf(dev, "Number of channels %d\n", i);
/* probe for watchdog */ /*
IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0), * Probe for watchdog, but only for backends which support
IPMI_GET_WDOG, 0, 0); * polled driver requests.
*/
if (sc->ipmi_driver_requests_polled) {
IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
IPMI_GET_WDOG, 0, 0);
ipmi_submit_driver_request(sc, req, 0); ipmi_submit_driver_request(sc, req, 0);
if (req->ir_compcode == 0x00) { if (req->ir_compcode == 0x00) {
device_printf(dev, "Attached watchdog\n"); device_printf(dev, "Attached watchdog\n");
/* register the watchdog event handler */ /* register the watchdog event handler */
sc->ipmi_watchdog_tag = EVENTHANDLER_REGISTER(watchdog_list, sc->ipmi_watchdog_tag = EVENTHANDLER_REGISTER(
ipmi_wd_event, sc, 0); watchdog_list, ipmi_wd_event, sc, 0);
}
} }
sc->ipmi_cdev = make_dev(&ipmi_cdevsw, device_get_unit(dev), sc->ipmi_cdev = make_dev(&ipmi_cdevsw, device_get_unit(dev),

View File

@ -520,6 +520,7 @@ ipmi_kcs_attach(struct ipmi_softc *sc)
sc->ipmi_startup = kcs_startup; sc->ipmi_startup = kcs_startup;
sc->ipmi_enqueue_request = ipmi_polled_enqueue_request; sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
sc->ipmi_driver_request = kcs_driver_request; sc->ipmi_driver_request = kcs_driver_request;
sc->ipmi_driver_requests_polled = 1;
/* See if we can talk to the controller. */ /* See if we can talk to the controller. */
status = INB(sc, KCS_CTL_STS); status = INB(sc, KCS_CTL_STS);

View File

@ -415,6 +415,7 @@ ipmi_smic_attach(struct ipmi_softc *sc)
sc->ipmi_startup = smic_startup; sc->ipmi_startup = smic_startup;
sc->ipmi_enqueue_request = ipmi_polled_enqueue_request; sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
sc->ipmi_driver_request = smic_driver_request; sc->ipmi_driver_request = smic_driver_request;
sc->ipmi_driver_requests_polled = 1;
/* See if we can talk to the controller. */ /* See if we can talk to the controller. */
flags = INB(sc, SMIC_FLAGS); flags = INB(sc, SMIC_FLAGS);

View File

@ -105,6 +105,7 @@ struct ipmi_softc {
int ipmi_opened; int ipmi_opened;
struct cdev *ipmi_cdev; struct cdev *ipmi_cdev;
TAILQ_HEAD(,ipmi_request) ipmi_pending_requests; TAILQ_HEAD(,ipmi_request) ipmi_pending_requests;
int ipmi_driver_requests_polled;
eventhandler_tag ipmi_watchdog_tag; eventhandler_tag ipmi_watchdog_tag;
int ipmi_watchdog_active; int ipmi_watchdog_active;
struct intr_config_hook ipmi_ich; struct intr_config_hook ipmi_ich;