Skip to content

Commit

Permalink
ipmi/power: Fix system reboot issue
Browse files Browse the repository at this point in the history
[ Upstream commit b1d4218 ]

Kernel makes reboot/shudown OPAL call for reboot/shutdown. Once kernel
gets response from OPAL it runs opal_poll_events() until firmware
handles the request.

On BMC based system, OPAL makes IPMI call (IPMI_CHASSIS_CONTROL) to
initiate system reboot/shutdown. At present OPAL queues IPMI messages
and return SUCESS to Host. If BMC is not ready to accept command (like
BMC reboot), then these message will fail. We have to manually
reboot/shutdown the system using BMC interface.

This patch adds logic to validate message return value. If message failed,
then it will resend the message. At some stage BMC will be ready to accept
message and handles IPMI message.

Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
Signed-off-by: Vasant Hegde <hegdevasant@linux.vnet.ibm.com>
  • Loading branch information
Vasant Hegde committed Mar 4, 2019
1 parent 4d761a3 commit ac9e1fd
Showing 1 changed file with 24 additions and 2 deletions.
26 changes: 24 additions & 2 deletions hw/ipmi/ipmi-power.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,25 @@
#include <stdlib.h>
#include <ipmi.h>
#include <opal.h>
#include <timebase.h>

static void ipmi_chassis_control_complete(struct ipmi_msg *msg)
{
uint8_t request = msg->data[0];
uint8_t cc = msg->cc;

ipmi_free_msg(msg);
if (cc == IPMI_CC_NO_ERROR)
return;

prlog(PR_INFO, "IPMI: Chassis control request failed. "
"request=0x%02x, rc=0x%02x\n", request, cc);

if (ipmi_chassis_control(request)) {
prlog(PR_INFO, "IPMI: Failed to resend chassis control "
"request [0x%02x]\n", request);
}
}

int ipmi_chassis_control(uint8_t request)
{
Expand All @@ -29,10 +48,13 @@ int ipmi_chassis_control(uint8_t request)
if (request > IPMI_CHASSIS_SOFT_SHUTDOWN)
return OPAL_PARAMETER;

msg = ipmi_mkmsg_simple(IPMI_CHASSIS_CONTROL, &request,
sizeof(request));
msg = ipmi_mkmsg(IPMI_DEFAULT_INTERFACE, IPMI_CHASSIS_CONTROL,
ipmi_chassis_control_complete, NULL,
&request, sizeof(request), 0);
if (!msg)
return OPAL_HARDWARE;
/* Set msg->error callback function */
msg->error = ipmi_chassis_control_complete;

prlog(PR_INFO, "IPMI: sending chassis control request 0x%02x\n",
request);
Expand Down

0 comments on commit ac9e1fd

Please sign in to comment.