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:
parent
cbdd03ad96
commit
f73942d525
@ -756,17 +756,22 @@ ipmi_startup(void *arg)
|
||||
}
|
||||
device_printf(dev, "Number of channels %d\n", i);
|
||||
|
||||
/* probe for watchdog */
|
||||
IPMI_INIT_DRIVER_REQUEST(req, IPMI_ADDR(IPMI_APP_REQUEST, 0),
|
||||
IPMI_GET_WDOG, 0, 0);
|
||||
/*
|
||||
* Probe for watchdog, but only for backends which support
|
||||
* 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) {
|
||||
device_printf(dev, "Attached watchdog\n");
|
||||
/* register the watchdog event handler */
|
||||
sc->ipmi_watchdog_tag = EVENTHANDLER_REGISTER(watchdog_list,
|
||||
ipmi_wd_event, sc, 0);
|
||||
if (req->ir_compcode == 0x00) {
|
||||
device_printf(dev, "Attached watchdog\n");
|
||||
/* register the watchdog event handler */
|
||||
sc->ipmi_watchdog_tag = EVENTHANDLER_REGISTER(
|
||||
watchdog_list, ipmi_wd_event, sc, 0);
|
||||
}
|
||||
}
|
||||
|
||||
sc->ipmi_cdev = make_dev(&ipmi_cdevsw, device_get_unit(dev),
|
||||
|
@ -520,6 +520,7 @@ ipmi_kcs_attach(struct ipmi_softc *sc)
|
||||
sc->ipmi_startup = kcs_startup;
|
||||
sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
|
||||
sc->ipmi_driver_request = kcs_driver_request;
|
||||
sc->ipmi_driver_requests_polled = 1;
|
||||
|
||||
/* See if we can talk to the controller. */
|
||||
status = INB(sc, KCS_CTL_STS);
|
||||
|
@ -415,6 +415,7 @@ ipmi_smic_attach(struct ipmi_softc *sc)
|
||||
sc->ipmi_startup = smic_startup;
|
||||
sc->ipmi_enqueue_request = ipmi_polled_enqueue_request;
|
||||
sc->ipmi_driver_request = smic_driver_request;
|
||||
sc->ipmi_driver_requests_polled = 1;
|
||||
|
||||
/* See if we can talk to the controller. */
|
||||
flags = INB(sc, SMIC_FLAGS);
|
||||
|
@ -105,6 +105,7 @@ struct ipmi_softc {
|
||||
int ipmi_opened;
|
||||
struct cdev *ipmi_cdev;
|
||||
TAILQ_HEAD(,ipmi_request) ipmi_pending_requests;
|
||||
int ipmi_driver_requests_polled;
|
||||
eventhandler_tag ipmi_watchdog_tag;
|
||||
int ipmi_watchdog_active;
|
||||
struct intr_config_hook ipmi_ich;
|
||||
|
Loading…
Reference in New Issue
Block a user