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
This commit is contained in:
parent
fbf7737949
commit
95a1f0e81c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=345791
@ -99,6 +99,8 @@ opal_ipmi_polled_request(struct opal_ipmi_softc *sc, struct ipmi_request *req,
|
||||
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, struct ipmi_request *req,
|
||||
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[] = {
|
||||
|
Loading…
Reference in New Issue
Block a user