Date: Tue, 2 Apr 2019 04:12:07 +0000 (UTC) From: Justin Hibbits <jhibbits@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r345791 - head/sys/dev/ipmi Message-ID: <201904020412.x324C7q8084524@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
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[] = {
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201904020412.x324C7q8084524>