Re: [PATCH] mmc: clear all interrupt in suspend before free_irq

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I am confused.  Your patch modifiies

sdhci_suspend_host () to  
>>> +     sdhci_clear_set_irqs(host, SDHCI_INT_ALL_MASK, 0);
>> 



#define SDHCI_INT_ALL_MASK	((unsigned int)-1)

static void sdhci_clear_set_irqs(struct sdhci_host *host, u32 clear, u32 set)
{
	u32 ier;

	ier = sdhci_readl(host, SDHCI_INT_ENABLE);
	ier &= ~clear;
	ier |= set;
	sdhci_writel(host, ier, SDHCI_INT_ENABLE);
	sdhci_writel(host, ier, SDHCI_SIGNAL_ENABLE);
}


The code clears all the interrupts.    How is a card insert detected ?




On Jan 23, 2011, at 6:10 PM, zhangfei gao wrote:

> On Fri, Jan 21, 2011 at 2:33 PM, Nicolas Pitre <nico@xxxxxxxxxxx> wrote:
>> On Fri, 21 Jan 2011, zhangfei gao wrote:
>> 
>>>> From b7be39e0bbac3950057078ac66900ebc0871f77e Mon Sep 17 00:00:00 2001
>>> From: Zhangfei Gao <zhangfei.gao@xxxxxxxxxxx>
>>> Date: Fri, 21 Jan 2011 18:02:47 -0500
>>> Subject: [PATCH] mmc: clear all interrupt in suspend before free_irq
>>> 
>>>       When debugging wifi host sleep, race condition about
>>> SDHCI_INT_CARD_INT happens.
>>>       Host free_irq in suspend and request_irq when resume back.
>>>       However SDHCI_INT_CARD_INT is not cleared, so interrupt will
>>> immediately happen after request_irq.
>>>       mmc_signal_sdio_irq will be called and wakeup sdio_irq_thread.
>>>       As a result irq_handler in sdio driver is called even before host resume back.
>>> 
>>>       The correct case is mmc_sdio_resume calls mmc_signal_sdio_irq to
>>> wakeup sdio_irq_thread
>>> 
>>> Signed-off-by: Zhangfei Gao <zhangfei.gao@xxxxxxxxxxx>
>> 
>> That makes sense, as long as the masking of interrupts doesn't prevent
>> a SDIO card interrupt from waking up the host system.
> 
> Thanks Nicolas for comments
> 
> Masking interrupt does not impact wake up cpu.
> 1. irq is already freed in suspend, and request again when resume backed
> 2. cpu is wake up first, then irq service is handled, so irq does not
> impact cpu wake up or not.
> 3. mmc_signal_sdio_irq is serviced in mmc_sdio_resume.
> 
>> 
>> 
>>> ---
>>>  drivers/mmc/host/sdhci.c |    1 +
>>>  1 files changed, 1 insertions(+), 0 deletions(-)
>>> 
>>> diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
>>> index aacd78c..97074ae 100644
>>> --- a/drivers/mmc/host/sdhci.c
>>> +++ b/drivers/mmc/host/sdhci.c
>>> @@ -1707,6 +1707,7 @@ int sdhci_suspend_host(struct sdhci_host *host,
>>> pm_message_t state)
>>>       ret = mmc_suspend_host(host->mmc);
>>>       if (ret)
>>>               return ret;
>>> +     sdhci_clear_set_irqs(host, SDHCI_INT_ALL_MASK, 0);
>>> 
>>>       free_irq(host->irq, host);
>>> 
>>> --
>>> 1.7.0.4
>>> 
>> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux-mmc" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux USB Devel]     [Linux Media]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux