svn commit: r345791 - head/sys/dev/ipmi
Justin Hibbits
jhibbits at FreeBSD.org
Tue Sep 3 14:06:09 UTC 2019
Author: jhibbits
Date: Tue Apr 2 04:12:06 2019
New Revision: 345791
URL: https://svnweb.freebsd.org/changeset/base/345791
Log:
ipmi: Fixes for ipmi_opal(powernv)
* Crank the OPAL state machine during the receive loop, to make sure the
pollers are executed
* Add a proper detach function, so the module can be unloaded and reloaded
at runtime.
It still doesn't reliably work 100% of the time on POWER9, and it appears
timing and/or cache related. It may work on POWER8 now.
MFC after: 2 weeks
Modified:
head/sys/dev/ipmi/ipmi_opal.c
Modified: head/sys/dev/ipmi/ipmi_opal.c
==============================================================================
--- head/sys/dev/ipmi/ipmi_opal.c Tue Apr 2 04:02:57 2019 (r345790)
+++ head/sys/dev/ipmi/ipmi_opal.c Tue Apr 2 04:12:06 2019 (r345791)
@@ -99,6 +99,8 @@ opal_ipmi_polled_request(struct opal_ipmi_softc *sc, s
timo *= 10; /* Timeout is in milliseconds, we delay in 100us */
do {
msg_len = sizeof(struct opal_ipmi_msg) + IPMI_MAX_RX;
+ /* Crank the OPAL state machine while we poll for a reply. */
+ opal_call(OPAL_POLL_EVENTS, NULL);
err = opal_call(OPAL_IPMI_RECV, sc->sc_interface,
vtophys(sc->sc_msg), vtophys(&msg_len));
if (err != OPAL_EMPTY)
@@ -113,6 +115,7 @@ opal_ipmi_polled_request(struct opal_ipmi_softc *sc, s
req->ir_replylen = min(req->ir_replylen, req->ir_replybuflen);
memcpy(req->ir_reply, &sc->sc_msg->data[1], req->ir_replylen);
req->ir_compcode = sc->sc_msg->data[0];
+ err = 0;
break;
case OPAL_RESOURCE:
err = ENOMEM;
@@ -223,7 +226,15 @@ opal_ipmi_attach(device_t dev)
static int
opal_ipmi_detach(device_t dev)
{
- return (EBUSY);
+ struct opal_ipmi_softc *sc;
+ int err;
+
+ sc = device_get_softc(dev);
+ err = ipmi_detach(dev);
+ if (err == 0)
+ free(sc->sc_msg, M_IPMI);
+
+ return (err);
}
static device_method_t opal_ipmi_methods[] = {
More information about the svn-src-head
mailing list