summaryrefslogtreecommitdiffstats
path: root/external/opal-prd/opal-prd.c
diff options
context:
space:
mode:
authorNeelesh Gupta <neelegup@linux.vnet.ibm.com>2015-08-31 21:12:07 +0530
committerStewart Smith <stewart@linux.vnet.ibm.com>2015-09-01 17:13:03 +1000
commit87bceba1846dc00e687ed3370eb3fd71fb02c8ca (patch)
treede957d107feb34be8ef09d8a6cfb93e0304fc207 /external/opal-prd/opal-prd.c
parent2c50e850d01e8387c883decbadfa2a02e78772d6 (diff)
downloadblackbird-skiboot-87bceba1846dc00e687ed3370eb3fd71fb02c8ca.tar.gz
blackbird-skiboot-87bceba1846dc00e687ed3370eb3fd71fb02c8ca.zip
external/opal-prd: Refactor the handle_prd_control() function
Depending upon the control message type, the daemon parses the incoming messages, invoke the corresponding HBRT interface and sends the response back to the waiting client. Putting all this into one leads to cumbersome switch-case and a fat function. This patch creates the individual functions for different types of control messages keeping the common code into the handle_prd_control(). It also does clean up and minor fixes. Signed-off-by: Neelesh Gupta <neelegup@linux.vnet.ibm.com> Acked-by: Jeremy Kerr <jk@ozlabs.org> Reviewed-by: Patrick Williams <iawillia@us.ibm.com> Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'external/opal-prd/opal-prd.c')
-rw-r--r--external/opal-prd/opal-prd.c80
1 files changed, 47 insertions, 33 deletions
diff --git a/external/opal-prd/opal-prd.c b/external/opal-prd/opal-prd.c
index f96e1458..00ca96e9 100644
--- a/external/opal-prd/opal-prd.c
+++ b/external/opal-prd/opal-prd.c
@@ -1134,71 +1134,85 @@ static int handle_prd_msg(struct opal_prd_ctx *ctx)
return 0;
}
-static int handle_prd_control(struct opal_prd_ctx *ctx, int fd)
+static void handle_prd_control_occ_error(struct control_msg *msg)
+{
+ if (!hservice_runtime->process_occ_error) {
+ pr_log_nocall("process_occ_error");
+ return;
+ }
+
+ pr_debug("CTRL: calling process_occ_error(0)");
+ call_process_occ_error(0);
+ msg->response = 0;
+}
+
+static void handle_prd_control_occ_reset(struct control_msg *msg)
+{
+ if (!hservice_runtime->process_occ_reset) {
+ pr_log_nocall("process_occ_reset");
+ return;
+ }
+
+ pr_debug("CTRL: calling process_occ_reset(0)");
+ call_process_occ_reset(0);
+ msg->response = 0;
+}
+
+static void handle_prd_control_occ_actuation(struct control_msg *msg,
+ bool enable)
+{
+ if (!hservice_runtime->enable_occ_actuation) {
+ pr_log_nocall("enable_occ_actuation");
+ return;
+ }
+
+ pr_debug("CTRL: calling enable_occ_actuation(%s)",
+ enable ? "true" : "false");
+ msg->response = call_enable_occ_actuation(enable);
+}
+
+static void handle_prd_control(struct opal_prd_ctx *ctx, int fd)
{
struct control_msg msg;
- bool enabled;
+ bool enabled = false;
int rc;
rc = recv(fd, &msg, sizeof(msg), MSG_TRUNC);
if (rc != sizeof(msg)) {
- pr_log(LOG_WARNING, "CTRL: failed to receive "
- "control message: %m");
- rc = -1;
+ pr_log(LOG_WARNING, "CTRL: failed to receive control "
+ "message: %m");
+ msg.response = -1;
goto out_send;
}
- enabled = false;
- rc = -1;
-
+ msg.response = -1;
switch (msg.type) {
case CONTROL_MSG_ENABLE_OCCS:
enabled = true;
/* fall through */
case CONTROL_MSG_DISABLE_OCCS:
- if (!hservice_runtime->enable_occ_actuation) {
- pr_log_nocall("enable_occ_actuation");
- } else {
- pr_debug("CTRL: calling enable_occ_actuation(%s)",
- enabled ? "true" : "false");
- rc = call_enable_occ_actuation(enabled);
- pr_debug("CTRL: -> %d", rc);
- }
+ handle_prd_control_occ_actuation(&msg, enabled);
break;
case CONTROL_MSG_TEMP_OCC_RESET:
- if (hservice_runtime->process_occ_reset) {
- pr_debug("CTRL: calling process_occ_reset(0)");
- call_process_occ_reset(0);
- rc = 0;
- } else {
- pr_log_nocall("process_occ_reset");
- }
+ handle_prd_control_occ_reset(&msg);
break;
case CONTROL_MSG_TEMP_OCC_ERROR:
- if (hservice_runtime->process_occ_error) {
- pr_debug("CTRL: calling process_occ_error(0)");
- call_process_occ_error(0);
- rc = 0;
- } else {
- pr_log_nocall("process_occ_error");
- }
+ handle_prd_control_occ_error(&msg);
break;
default:
pr_log(LOG_WARNING, "CTRL: Unknown control message action %d",
msg.type);
+ break;
}
out_send:
/* send a response */
- msg.response = rc;
rc = send(fd, &msg, sizeof(msg), MSG_DONTWAIT | MSG_NOSIGNAL);
if (rc && (errno == EAGAIN || errno == EWOULDBLOCK || errno == EPIPE))
pr_debug("CTRL: control send() returned %d, ignoring failure",
rc);
else if (rc != sizeof(msg))
pr_log(LOG_NOTICE, "CTRL: Failed to send control response: %m");
-
- return 0;
}
static int run_attn_loop(struct opal_prd_ctx *ctx)
OpenPOWER on IntegriCloud