Skip to content

Commit

Permalink
mmc: jz4740: Fix race condition in IRQ mask update
Browse files Browse the repository at this point in the history
A spinlock is held while updating the internal copy of the IRQ mask,
but not while writing it to the actual IMASK register. After the lock
is released, an IRQ can occur before the IMASK register is written.
If handling this IRQ causes the mask to be changed, when the handler
returns back to the middle of the first mask update, a stale value
will be written to the mask register.

If this causes an IRQ to become unmasked that cannot have its status
cleared by writing a 1 to it in the IFLG register, e.g. the SDIO IRQ,
then we can end up stuck with the same IRQ repeatedly being fired but
not handled. Normally the MMC IRQ handler attempts to clear any
unexpected IRQs by writing IFLG, but for those that cannot be cleared
in this way then the IRQ will just repeatedly fire.

This was resulting in lockups after a while of using Wi-Fi on the
CI20 (GitHub issue MIPS#19).

Resolve by holding the spinlock until after the IMASK register has
been updated.

Signed-off-by: Alex Smith <alex.smith@imgtec.com>
  • Loading branch information
Alex Smith authored and pcercuei committed Sep 3, 2015
1 parent baa4740 commit 72d5b21
Showing 1 changed file with 3 additions and 1 deletion.
4 changes: 3 additions & 1 deletion drivers/mmc/host/jz4740_mmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -401,17 +401,19 @@ static void jz4740_mmc_set_irq_enabled(struct jz4740_mmc_host *host,
unsigned long flags;

spin_lock_irqsave(&host->lock, flags);

if (enabled)
host->irq_mask &= ~irq;
else
host->irq_mask |= irq;
spin_unlock_irqrestore(&host->lock, flags);

/* In the 4750 onwards, IMASK is expanded to 32 bits. */
if (host->version >= JZ_MMC_JZ4750)
writel(host->irq_mask, host->base + JZ_REG_MMC_IMASK);
else
writew(host->irq_mask, host->base + JZ_REG_MMC_IMASK);

spin_unlock_irqrestore(&host->lock, flags);
}

static void jz4740_mmc_clock_enable(struct jz4740_mmc_host *host,
Expand Down

0 comments on commit 72d5b21

Please sign in to comment.