From 9930b32e86bab9f6c95099aef122fdc2fcf4f472 Mon Sep 17 00:00:00 2001 From: Michael Adisumarta Date: Wed, 28 Aug 2019 03:16:55 -0700 Subject: [PATCH] msm: gsi: Set cookie correctly for GCI channel TREs Use the right index based on the cookie for GCI channel TREs that are using the extra allocated buffers. Change-Id: I19643223e4e496bf1b976b0bf73bbe3d8a1fe03a Signed-off-by: Michael Adisumarta --- drivers/platform/msm/gsi/gsi.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) 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; }