Skip site navigation (1)Skip section navigation (2)
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>