xfer_state
xfer_trans->xfer_state = xfer_state;
xfer_trans->transaction.conn = xfer_state->xfer->conn;
xfer_trans->transaction.direction = xfer_state->xfer->direction;
xfer_state->start_count++;
xfer_state->inflight_count++;
mlx5_fpga_dbg(xfer_state->xfer->conn->fdev, "Starting %zu bytes at %p done; %u started %u inflight %u done %u error\n",
xfer_state->start_count,
xfer_state->inflight_count,
xfer_state->done_count,
xfer_state->error_count);
xfer_state->start_count--;
xfer_state->inflight_count--;
mlx5_fpga_warn(xfer_state->xfer->conn->fdev, "Transfer failed to start transaction: %d. %u started %u done %u error\n",
ret, xfer_state->start_count,
xfer_state->done_count,
xfer_state->error_count);
xfer_state->status = IB_WC_GENERAL_ERR;
xfer_state->pos += cur_size;
if (xfer_state->inflight_count >= xfer_state->budget)
struct xfer_state *xfer_state;
xfer_state = xfer_trans->xfer_state;
xfer_state->start_count, xfer_state->inflight_count,
xfer_state->done_count, xfer_state->error_count);
spin_lock_irqsave(&xfer_state->lock, flags);
xfer_state->error_count++;
xfer_state->start_count,
xfer_state->inflight_count,
xfer_state->done_count, xfer_state->error_count);
if (xfer_state->status == IB_WC_SUCCESS)
xfer_state->status = status;
xfer_state->done_count++;
ret = exec_more(xfer_state);
xfer_state->inflight_count--;
if (!xfer_state->inflight_count)
spin_unlock_irqrestore(&xfer_state->lock, flags);
xfer_complete(xfer_state);
struct xfer_state *xfer_state;
xfer_state = kzalloc(sizeof(*xfer_state), GFP_KERNEL);
xfer_state->xfer = xfer;
xfer_state->status = IB_WC_SUCCESS;
xfer_state->budget = 7;
spin_lock_init(&xfer_state->lock);
spin_lock_irqsave(&xfer_state->lock, flags);
ret = exec_more(xfer_state);
if (ret && (xfer_state->start_count == 0))
spin_unlock_irqrestore(&xfer_state->lock, flags);
xfer_complete(xfer_state);
struct xfer_state *xfer_state;
static void xfer_complete(struct xfer_state *xfer_state)
const struct mlx5_fpga_transaction *xfer = xfer_state->xfer;
u8 status = xfer_state->status;
kfree(xfer_state);
static int exec_more(struct xfer_state *xfer_state)
ddr_base = mlx5_fpga_ddr_base_get(xfer_state->xfer->conn->fdev);
page_size = (xfer_state->xfer->addr + xfer_state->pos < ddr_base) ?
if (xfer_state->status != IB_WC_SUCCESS) {
left = xfer_state->xfer->size - xfer_state->pos;
pos_addr = xfer_state->xfer->addr + xfer_state->pos;
pos_data = xfer_state->xfer->data + xfer_state->pos;