OSDN Git Service

msm: gsi: fix to client notify on poll mode
authorSkylar Chang <chiaweic@codeaurora.org>
Mon, 16 Jan 2017 18:29:49 +0000 (10:29 -0800)
committerGerrit - the friendly Code Review server <code-review@localhost>
Thu, 19 Jan 2017 18:09:28 +0000 (10:09 -0800)
When processing an IEOB interrupt, do not process the pending
events in case the channel is in polling mode.

Change-Id: I9b9fbc71ae33fe1bfef837580f9f8e9aa875160d
CRs-Fixed: 1112064
Acked-by: Ady Abraham <adya@qti.qualcomm.com>
Signed-off-by: Skylar Chang <chiaweic@codeaurora.org>
drivers/platform/msm/gsi/gsi.c

index a617c9e..f32d3d9 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -362,8 +362,13 @@ static void gsi_process_chan(struct gsi_xfer_compl_evt *evt,
        notify->chan_user_data = ch_ctx->props.chan_user_data;
        notify->evt_id = evt->code;
        notify->bytes_xfered = evt->len;
-       if (callback)
+       if (callback) {
+               if (atomic_read(&ch_ctx->poll_mode)) {
+                       GSIERR("Calling client callback in polling mode\n");
+                       WARN_ON(1);
+               }
                ch_ctx->props.xfer_cb(notify);
+       }
 }
 
 static void gsi_process_evt_re(struct gsi_evt_ctx *ctx,
@@ -459,12 +464,12 @@ check_again:
                        ctx->ring.rp = rp;
                        while (ctx->ring.rp_local != rp) {
                                ++cntr;
-                               gsi_process_evt_re(ctx, &notify, true);
                                if (ctx->props.exclusive &&
                                        atomic_read(&ctx->chan->poll_mode)) {
                                        cntr = 0;
                                        break;
                                }
+                               gsi_process_evt_re(ctx, &notify, true);
                        }
                        gsi_ring_evt_doorbell(ctx);
                        if (cntr != 0)