Skip to content
Snippets Groups Projects
Commit 1ea5d6d1 authored by Fernando Guzman Lugo's avatar Fernando Guzman Lugo Committed by Hiroshi DOYU
Browse files

Mailbox: disable mailbox interrupt when request queue


when blk_get_request fails to get the request it is returning
without read the message from the mailbox fifo, then when it
leaves the isr and interruption is trigger again and again and
the workqueue which get elements from the request queue is never
executed and the kernel is stuck and shows a softlockup message.
Now the mailbox interrupt is disabled when request queue is full
and enabled when it pop a elememt form the request queue.

Signed-off-by: default avatarFernando Guzman Lugo <x0095840@ti.com>
Signed-off-by: default avatarHiroshi DOYU <Hiroshi.DOYU@nokia.com>
parent 72b917ef
No related branches found
No related tags found
No related merge requests found
......@@ -32,6 +32,7 @@
static struct workqueue_struct *mboxd;
static struct omap_mbox *mboxes;
static DEFINE_RWLOCK(mboxes_lock);
static bool rq_full;
static int mbox_configured;
static DEFINE_MUTEX(mbox_configured_lock);
......@@ -141,6 +142,10 @@ static void mbox_rx_work(struct work_struct *work)
while (1) {
spin_lock_irqsave(q->queue_lock, flags);
rq = blk_fetch_request(q);
if (rq_full) {
omap_mbox_enable_irq(mbox, IRQ_RX);
rq_full = false;
}
spin_unlock_irqrestore(q->queue_lock, flags);
if (!rq)
break;
......@@ -178,8 +183,11 @@ static void __mbox_rx_interrupt(struct omap_mbox *mbox)
while (!mbox_fifo_empty(mbox)) {
rq = blk_get_request(q, WRITE, GFP_ATOMIC);
if (unlikely(!rq))
if (unlikely(!rq)) {
omap_mbox_disable_irq(mbox, IRQ_RX);
rq_full = true;
goto nomem;
}
msg = mbox_fifo_read(mbox);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment