OMAP: mailbox: change full flag per mailbox queue instead of global
authorFernando Guzman Lugo <x0095840@ti.com>
Mon, 29 Nov 2010 20:24:11 +0000 (20:24 +0000)
committerHari Kanigeri <h-kanigeri2@ti.com>
Thu, 2 Dec 2010 11:43:15 +0000 (05:43 -0600)
The variable rq_full flag is a global variable, so if there are multiple
mailbox users there will be conflicts. Now there is a full flag per
mailbox queue.

Reported-by: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Fernando Guzman Lugo <x0095840@ti.com>
Signed-off-by: Hari Kanigeri <h-kanigeri2@ti.com>
Acked-by: Hiroshi Doyu <hiroshi.doyu@nokia.com>
arch/arm/plat-omap/include/plat/mailbox.h
arch/arm/plat-omap/mailbox.c

index 997656552109fe462d70697232c5ca360807ee16..13f2ef3ea0ff7f1bd320ed9831fe9bb300d40ef8 100644 (file)
@@ -48,6 +48,7 @@ struct omap_mbox_queue {
        struct tasklet_struct   tasklet;
        int     (*callback)(void *);
        struct omap_mbox        *mbox;
+       bool full;
 };
 
 struct omap_mbox {
index d2fafb892f7fb9cc1ffe400de2f7fe5d948fd26b..48e161c642a56cab8b77429ad1a529f97047f090 100644 (file)
@@ -33,7 +33,6 @@
 
 static struct workqueue_struct *mboxd;
 static struct omap_mbox **mboxes;
-static bool rq_full;
 
 static int mbox_configured;
 static DEFINE_MUTEX(mbox_configured_lock);
@@ -148,6 +147,12 @@ static void mbox_rx_work(struct work_struct *work)
 
                if (mq->callback)
                        mq->callback((void *)msg);
+               spin_lock_irq(&mq->lock);
+               if (mq->full) {
+                       mq->full = false;
+                       omap_mbox_enable_irq(mq->mbox, IRQ_RX);
+               }
+               spin_unlock_irq(&mq->lock);
        }
 }
 
@@ -170,7 +175,7 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
        while (!mbox_fifo_empty(mbox)) {
                if (unlikely(kfifo_avail(&mq->fifo) < sizeof(msg))) {
                        omap_mbox_disable_irq(mbox, IRQ_RX);
-                       rq_full = true;
+                       mq->full = true;
                        goto nomem;
                }