diff options
-rw-r--r-- | transport_mbox.c | 94 |
1 files changed, 27 insertions, 67 deletions
diff --git a/transport_mbox.c b/transport_mbox.c index 0d3d9b7..b0e0c04 100644 --- a/transport_mbox.c +++ b/transport_mbox.c @@ -38,9 +38,12 @@ struct errno_map { static const struct errno_map errno_map_v1[] = { { 0, MBOX_R_SUCCESS }, { EACCES, MBOX_R_PARAM_ERROR }, + { EBADMSG, MBOX_R_PARAM_ERROR }, { EBUSY, MBOX_R_SYSTEM_ERROR }, { EINVAL, MBOX_R_PARAM_ERROR }, + { ENOTSUP, MBOX_R_PARAM_ERROR }, { EPERM, MBOX_R_PARAM_ERROR }, + { EPROTO, MBOX_R_PARAM_ERROR }, { ETIMEDOUT, MBOX_R_TIMEOUT }, { -1, MBOX_R_SYSTEM_ERROR }, }; @@ -48,9 +51,12 @@ static const struct errno_map errno_map_v1[] = { static const struct errno_map errno_map_v2[] = { { 0, MBOX_R_SUCCESS }, { EACCES, MBOX_R_WINDOW_ERROR }, + { EBADMSG, MBOX_R_SEQ_ERROR }, { EBUSY, MBOX_R_BUSY }, { EINVAL, MBOX_R_PARAM_ERROR }, + { ENOTSUP, MBOX_R_PARAM_ERROR }, { EPERM, MBOX_R_WINDOW_ERROR }, + { EPROTO, MBOX_R_PARAM_ERROR }, { ETIMEDOUT, MBOX_R_TIMEOUT }, { -1, MBOX_R_SYSTEM_ERROR }, }; @@ -67,13 +73,14 @@ static inline int mbox_xlate_errno(struct mbox_context *context, const struct errno_map *entry; rc = -rc; + MSG_DBG("Translating errno %d: %s\n", rc, strerror(rc)); for(entry = errno_maps[context->version]; entry->rc != -1; entry++) { if (rc == entry->rc) { - return -entry->mbox_errno; + return entry->mbox_errno; } } - return -entry->mbox_errno; + return entry->mbox_errno; } /* @@ -168,12 +175,7 @@ int clr_bmc_events(struct mbox_context *context, uint8_t bmc_event, int mbox_handle_reset(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { - int rc = context->protocol->reset(context); - if (rc < 0) { - return mbox_xlate_errno(context, rc); - } - - return 0; + return context->protocol->reset(context); } /* @@ -209,7 +211,7 @@ int mbox_handle_mbox_info(struct mbox_context *context, rc = context->protocol->get_info(context, &io); if (rc < 0) { - return mbox_xlate_errno(context, rc); + return rc; } resp->args[0] = io.resp.api_version; @@ -243,7 +245,7 @@ int mbox_handle_flash_info(struct mbox_context *context, rc = context->protocol->get_flash_info(context, &io); if (rc < 0) { - return mbox_xlate_errno(context, rc); + return rc; } switch (context->version) { @@ -330,12 +332,7 @@ int mbox_handle_create_window(struct mbox_context *context, bool ro, int mbox_handle_read_window(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { - int rc = mbox_handle_create_window(context, true, req, resp); - if (rc < 0) { - return mbox_xlate_errno(context, rc); - } - - return 0; + return mbox_handle_create_window(context, true, req, resp); } /* @@ -360,12 +357,7 @@ int mbox_handle_read_window(struct mbox_context *context, int mbox_handle_write_window(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { - int rc = mbox_handle_create_window(context, false, req, resp); - if (rc < 0) { - return mbox_xlate_errno(context, rc); - } - - return 0; + return mbox_handle_create_window(context, false, req, resp); } /* @@ -388,7 +380,6 @@ int mbox_handle_dirty_window(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { struct protocol_mark_dirty io; - int rc; if (context->version == API_VERSION_1) { io.req.v1.offset = get_u16(&req->msg.args[0]); @@ -398,12 +389,7 @@ int mbox_handle_dirty_window(struct mbox_context *context, io.req.v2.size = get_u16(&req->msg.args[2]); } - rc = context->protocol->mark_dirty(context, &io); - if (rc < 0) { - return mbox_xlate_errno(context, rc); - } - - return rc; + return context->protocol->mark_dirty(context, &io); } /* @@ -423,22 +409,16 @@ int mbox_handle_erase_window(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { struct protocol_erase io; - int rc; io.req.offset = get_u16(&req->msg.args[0]); io.req.size = get_u16(&req->msg.args[2]); if (!context->protocol->erase) { MSG_ERR("Protocol Version invalid for Erase Command\n"); - return -MBOX_R_PARAM_ERROR; + return -ENOTSUP; } - rc = context->protocol->erase(context, &io); - if (rc < 0) { - return mbox_xlate_errno(context, rc); - } - - return rc; + return context->protocol->erase(context, &io); } /* @@ -462,19 +442,13 @@ int mbox_handle_flush_window(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { struct protocol_flush io = { 0 }; - int rc; if (context->version == API_VERSION_1) { io.req.offset = get_u16(&req->msg.args[0]); io.req.size = get_u32(&req->msg.args[2]); } - rc = context->protocol->flush(context, &io); - if (rc < 0) { - return mbox_xlate_errno(context, rc); - } - - return rc; + return context->protocol->flush(context, &io); } /* @@ -492,18 +466,12 @@ int mbox_handle_close_window(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { struct protocol_close io = { 0 }; - int rc; if (context->version >= API_VERSION_2) { io.req.flags = req->msg.args[0]; } - rc = context->protocol->close(context, &io); - if (rc < 0) { - return mbox_xlate_errno(context, rc); - } - - return rc; + return context->protocol->close(context, &io); } /* @@ -516,16 +484,10 @@ int mbox_handle_ack(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { struct protocol_ack io; - int rc; io.req.flags = req->msg.args[0]; - rc = context->protocol->ack(context, &io); - if (rc < 0) { - return mbox_xlate_errno(context, rc); - } - - return 0; + return context->protocol->ack(context, &io); } /* @@ -542,21 +504,20 @@ static int check_req_valid(struct mbox_context *context, union mbox_regs *req) if (cmd > NUM_MBOX_CMDS) { MSG_ERR("Unknown mbox command: %d\n", cmd); - return -MBOX_R_PARAM_ERROR; + return -ENOTSUP; } if (seq == context->prev_seq && cmd != MBOX_C_GET_MBOX_INFO) { MSG_ERR("Invalid sequence number: %d, previous: %d\n", seq, context->prev_seq); - return -MBOX_R_SEQ_ERROR; + return -EBADMSG; } if (context->state & STATE_SUSPENDED) { if (cmd != MBOX_C_GET_MBOX_INFO && cmd != MBOX_C_ACK) { MSG_ERR("Cannot use that cmd while suspended: %d\n", cmd); - return context->version >= API_VERSION_2 ? -MBOX_R_BUSY - : -MBOX_R_PARAM_ERROR; + return -EBUSY; } } @@ -564,7 +525,7 @@ static int check_req_valid(struct mbox_context *context, union mbox_regs *req) if (cmd != MBOX_C_RESET_STATE && cmd != MBOX_C_GET_MBOX_INFO && cmd != MBOX_C_ACK) { MSG_ERR("Must call GET_MBOX_INFO before %d\n", cmd); - return -MBOX_R_PARAM_ERROR; + return -EPROTO; } } @@ -603,19 +564,18 @@ static int handle_mbox_req(struct mbox_context *context, union mbox_regs *req) MSG_INFO("Received MBOX command: %u\n", req->msg.command); rc = check_req_valid(context, req); - if (rc < 0) { - resp.response = -rc; - } else { + if (!rc) { /* Commands start at 1 so we have to subtract 1 from the cmd */ mboxd_mbox_handler h = context->handlers[req->msg.command - 1]; rc = h(context, req, &resp); if (rc < 0) { MSG_ERR("Error handling mbox cmd: %d\n", req->msg.command); - resp.response = -rc; } } + rc = mbox_xlate_errno(context, rc); + resp.response = rc; context->prev_seq = req->msg.seq; MSG_DBG("Writing MBOX response:\n"); |