summaryrefslogtreecommitdiffstats
path: root/src/usr/ipmibase
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr/ipmibase')
-rw-r--r--src/usr/ipmibase/ipmirp.C16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/usr/ipmibase/ipmirp.C b/src/usr/ipmibase/ipmirp.C
index dabbea218..665b8eb18 100644
--- a/src/usr/ipmibase/ipmirp.C
+++ b/src/usr/ipmibase/ipmirp.C
@@ -598,7 +598,16 @@ void IpmiRP::execute(void)
// bottom of this loop will start the transmit process.
// Be sure to push_back to ensure ordering of transmission.
case IPMI::MSG_STATE_SEND:
- if (!l_shutdown_pending)
+ {
+ IPMI::Message* l_ipmi_msg =
+ static_cast<IPMI::Message*>(msg->extra_data);
+ const IPMI::command_t l_pnor = IPMI::pnor_hiomap_request();
+ bool l_is_pnor = (l_ipmi_msg->iv_netfun == l_pnor.first &&
+ l_ipmi_msg->iv_cmd == l_pnor.second);
+ IPMI_TRAC(WARN_MRK "Got message (0x%x:0x%x): l_is_pnor: %d",
+ l_ipmi_msg->iv_netfun, l_ipmi_msg->iv_cmd, l_is_pnor);
+ /* PNOR requests always allowed, else we hang shutdown */
+ if (!l_shutdown_pending || l_is_pnor)
{
iv_sendq.push_back(msg);
}
@@ -606,15 +615,14 @@ void IpmiRP::execute(void)
else
{
IPMI_TRAC(WARN_MRK "IPMI shutdown pending. Message dropped");
- IPMI::Message* ipmi_msg =
- static_cast<IPMI::Message*>(msg->extra_data);
- response(ipmi_msg, IPMI::CC_BADSTATE);
+ response(l_ipmi_msg, IPMI::CC_BADSTATE);
msg_free(msg);
}
break;
// State changes from the IPMI hardware. These are async
// messages so we get rid of them here.
+ }
case IPMI::MSG_STATE_IDLE:
msg_free(msg);
// No-op - we do it at the bottom of the loop.
OpenPOWER on IntegriCloud