From: Per Forlin <hidden> Date: 2011-06-01 08:48:31
From: Per Forlin <redacted>
Daniel Drake reported an issue in the libertas sdio client that was
triggered by the sdio_single_irq functionality. His SDIO device seems to
raise an interrupt even though there are no bits set in the CCCR_INTx
register. This behaviour is not supported by the sdio_single_irq feature nor
the SDIO spec. The purpose of the sdio_single_irq feature is to avoid the
overhead of checking the CCCR_INTx registers, this result in no error
handling of the case if there is a pending IRQ with none CCCR_INTx bits set.
This patchset adds a quirk to support this spurious IRQ issue and also report
a warning if an SDIO interrupt is raised but none CCCR_INTx bits are set.
Changes since v1:
* Replace public sdio function to enable disable SDIO single IRQ function
with a quirk
Per Forlin (2):
sdio: add quirk to handle pending IRQ in case of none CCCR_INTx bits
sdio: report error if pending IRQ but none CCCR_INTx bits
drivers/mmc/core/sdio_irq.c | 9 +++++++--
include/linux/mmc/card.h | 1 +
2 files changed, 8 insertions(+), 2 deletions(-)
--
1.7.4.1
From: Per Forlin <hidden> Date: 2011-06-01 08:48:32
From: Per Forlin <redacted>
Add quirk MMC_QUIRK_SDIO_IRQ_CCCR_INTX_0 to handle SDIO device that may
have pending IRQ when none bits are set in CCCR_INTx.
This IRQ issue was identified in the libertas sdio driver where the
SDIO device seems to raise an interrupt even if there were none function
bits in CCCR_INTx set. SDIO single irq feature will call irq handler directly
in case of only one interrupt registered. It will not check the CCCR_INTx
register and miss if the register is 0 and call the irq handler anyway.
This IRQ issue is not defined by the SDIO spec.
Use this quirk to work around this SDIO IRQ issue for a specific device.
Signed-off-by: Per Forlin <redacted>
---
drivers/mmc/core/sdio_irq.c | 4 ++--
include/linux/mmc/card.h | 1 +
2 files changed, 3 insertions(+), 2 deletions(-)
From: Per Forlin <hidden> Date: 2011-06-01 08:48:33
From: Per Forlin <redacted>
Return error in case of pending IRQ but none functions bits
in CCCR_INTx are set.
Signed-off-by: Per Forlin <redacted>
---
drivers/mmc/core/sdio_irq.c | 5 +++++
1 files changed, 5 insertions(+), 0 deletions(-)
@@ -50,6 +50,11 @@ static int process_sdio_pending_irqs(struct mmc_card *card)returnret;}+if(!pending){+printk(KERN_WARNING"%s: pending IRQ but none function bits\n",+mmc_card_id(card));+ret=-EINVAL;+}count=0;for(i=1;i<=7;i++){if(pending&(1<<i)){
From: Nicolas Pitre <hidden> Date: 2011-06-01 15:59:25
On Wed, 1 Jun 2011, Per Forlin wrote:
From: Per Forlin <redacted>
Daniel Drake reported an issue in the libertas sdio client that was
triggered by the sdio_single_irq functionality. His SDIO device seems to
raise an interrupt even though there are no bits set in the CCCR_INTx
register. This behaviour is not supported by the sdio_single_irq feature nor
the SDIO spec. The purpose of the sdio_single_irq feature is to avoid the
overhead of checking the CCCR_INTx registers, this result in no error
handling of the case if there is a pending IRQ with none CCCR_INTx bits set.
This patchset adds a quirk to support this spurious IRQ issue and also report
a warning if an SDIO interrupt is raised but none CCCR_INTx bits are set.
Given that the issue can be fixed locally to the libertas driver, I'd
suggest not merging this series until truly unfixable issues come up, as
Daniel said.
Nicolas
From: Per Forlin <hidden> Date: 2011-06-07 06:41:20
On 1 June 2011 17:59, Nicolas Pitre [off-list ref] wrote:
On Wed, 1 Jun 2011, Per Forlin wrote:
quoted
From: Per Forlin <redacted>
Daniel Drake reported an issue in the libertas sdio client that was
triggered by the sdio_single_irq functionality. His SDIO device seems to
raise an interrupt even though there are no bits set in the CCCR_INTx
register. This behaviour is not supported by the sdio_single_irq feature nor
the SDIO spec. The purpose of the sdio_single_irq feature is to avoid the
overhead of checking the CCCR_INTx registers, this result in no error
handling of the case if there is a pending IRQ with none CCCR_INTx bits set.
This patchset adds a quirk to support this spurious IRQ issue and also report
a warning if an SDIO interrupt is raised but none CCCR_INTx bits are set.
Given that the issue can be fixed locally to the libertas driver, I'd
suggest not merging this series until truly unfixable issues come up, as
Daniel said.
Using the same value as MMC_QUIRK_BLK_NO_CMD23 looks odd...
Thanks for your observation.
Typo, it should be (1 << 8)
I'll update the patch but I don't plan post a new version yet. The
root cause issue in the libertas is resolved. If the fix turns out to
be needed later on I resend it.
Thanks,
Per