On Wed, Jan 06, 2021 at 04:50:19PM -0800, James Smart wrote: > +static int > +efct_hw_cmd_submit_pending(struct efct_hw *hw) > +{ > + struct efct_command_ctx *ctx = NULL; > + int rc = 0; > + > + /* Assumes lock held */ > + > + /* Only submit MQE if there's room */ > + while (hw->cmd_head_count < (EFCT_HW_MQ_DEPTH - 1) && > + !list_empty(&hw->cmd_pending)) { > + ctx = list_first_entry(&hw->cmd_pending, > + struct efct_command_ctx, list_entry); > + if (!ctx) > + break; > + > + list_del_init(&ctx->list_entry); > + > + list_add_tail(&ctx->list_entry, &hw->cmd_head); > + hw->cmd_head_count++; > + if (sli_mq_write(&hw->sli, hw->mq, ctx->buf) < 0) { > + efc_log_debug(hw->os, > + "sli_queue_write failed: %d\n", rc); > + rc = -1; EFC_FAIL? > + break; > + } > + } > + return rc; > +} > +int > +efct_issue_mbox_rqst(void *base, void *cmd, void *cb, void *arg) > +{ > + int rc = 0; > + struct efct_mbox_rqst_ctx *ctx; > + struct efct *efct = base; > + struct efct_hw *hw = &efct->hw; > + > + /* > + * Allocate a callback context (which includes the mbox cmd buffer), > + * we need this to be persistent as the mbox cmd submission may be > + * queued and executed later execution. > + */ > + ctx = mempool_alloc(hw->mbox_rqst_pool, GFP_ATOMIC); > + if (!ctx) > + return EFC_FAIL; > + > + ctx->callback = cb; > + ctx->arg = arg; > + > + if (efct_hw_command(hw, cmd, EFCT_CMD_NOWAIT, efct_mbox_rsp_cb, ctx)) { > + efc_log_err(efct, "issue mbox rqst failure\n"); > + mempool_free(ctx, hw->mbox_rqst_pool); > + rc = -1; EFC_FAIL? > + } > + return rc; > +}