diff options
Diffstat (limited to 'transport_mbox.c')
-rw-r--r-- | transport_mbox.c | 86 |
1 files changed, 7 insertions, 79 deletions
diff --git a/transport_mbox.c b/transport_mbox.c index 92b3609..825fed7 100644 --- a/transport_mbox.c +++ b/transport_mbox.c @@ -461,89 +461,17 @@ int mbox_handle_erase_window(struct mbox_context *context, int mbox_handle_flush_window(struct mbox_context *context, union mbox_regs *req, struct mbox_msg *resp) { - int rc, i, offset, count; - uint8_t prev; - - if (!(context->current && context->current_is_write)) { - MSG_ERR("Tried to call flush without open write window\n"); - return context->version >= API_VERSION_2 ? -MBOX_R_WINDOW_ERROR - : -MBOX_R_PARAM_ERROR; - } - - /* - * For V1 the Flush command acts much the same as the dirty command - * except with a flush as well. Only do this on an actual flush - * command not when we call flush because we've implicitly closed a - * window because we might not have the required args in req. - */ - if (context->version == API_VERSION_1 && req && - req->msg.command == MBOX_C_WRITE_FLUSH) { - rc = mbox_handle_dirty_window(context, req, NULL); - if (rc < 0) { - return rc; - } - } - - offset = 0; - count = 0; - prev = WINDOW_CLEAN; - - MSG_INFO("Flush window @ %p for size 0x%.8x which maps flash @ 0x%.8x\n", - context->current->mem, context->current->size, - context->current->flash_offset); - - /* - * We look for streaks of the same type and keep a count, when the type - * (dirty/erased) changes we perform the required action on the backing - * store and update the current streak-type - */ - for (i = 0; i < (context->current->size >> context->block_size_shift); - i++) { - uint8_t cur = context->current->dirty_bmap[i]; - if (cur != WINDOW_CLEAN) { - if (cur == prev) { /* Same as previous block, incrmnt */ - count++; - } else if (prev == WINDOW_CLEAN) { /* Start of run */ - offset = i; - count++; - } else { /* Change in streak type */ - rc = window_flush(context, offset, count, - prev); - if (rc < 0) { - return rc; - } - offset = i; - count = 1; - } - } else { - if (prev != WINDOW_CLEAN) { /* End of a streak */ - rc = window_flush(context, offset, count, - prev); - if (rc < 0) { - return rc; - } - offset = 0; - count = 0; - } - } - prev = cur; - } + struct protocol_flush io = { 0 }; + int rc; - if (prev != WINDOW_CLEAN) { /* Still the last streak to write */ - rc = window_flush(context, offset, count, prev); - if (rc < 0) { - return 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]); } - /* Clear the dirty bytemap since we have written back all changes */ - rc = window_set_bytemap(context, context->current, 0, - context->current->size >> - context->block_size_shift, - WINDOW_CLEAN); + rc = context->protocol->flush(context, &io); if (rc < 0) { - return (rc == -EACCES) ? -MBOX_R_PARAM_ERROR - : -MBOX_R_SYSTEM_ERROR; + return mbox_xlate_errno(context, rc); } return rc; |