diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index d196133dd899..b657e174722c 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -3438,8 +3438,18 @@ int __gsi_get_gci_cookie(struct gsi_chan_ctx *ctx, uint16_t idx) } } - /* TODO: Increase escape buffer size if we hit this */ - GSIERR("user_data is full\n"); + /* Go over original userdata when escape buffer is full (costly) */ + GSIDBG("escape buffer is full\n"); + for (i = 0; i < end; i++) { + if (!ctx->user_data[i].valid) { + ctx->user_data[i].valid = true; + return i; + } + } + + /* Everything is full (possibly a stall) */ + GSIERR("both userdata array and escape buffer is full\n"); + BUG(); return 0xFFFF; } @@ -3476,7 +3486,7 @@ int __gsi_populate_gci_tre(struct gsi_chan_ctx *ctx, /* write the TRE to ring */ *tre_gci_ptr = gci_tre; - ctx->user_data[idx].p = xfer->xfer_user_data; + ctx->user_data[gci_tre.cookie].p = xfer->xfer_user_data; return 0; }