hostap_cs: fix sleeping function called from invalid context
PATCH 1/1 hostap_cs: fix sleeping function called from invalid context
pcmcia_request_irq() and pcmcia_enable_device() are intended to be called from process context (first function allocate memory with GFP_KERNEL, second take a mutex). We can not take spin lock and call them.
It's safe to move spin lock after pcmcia_enable_device() as we still hold off IRQ until dev->base_addr is 0 and driver will not proceed with interrupts when is not ready.
Patch resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=643758
---
Stable note: patch does not apply on 2.6.34 and 2.6.35, I will post separate patches when this one gets mainline
drivers/net/wireless/hostap/hostap_cs.c | 15 ++++++--------- 1 files changed, 6 insertions(+), 9 deletions(-)
drivers/net/wireless/hostap/hostap_cs.c +6 -9
@@ -518,22 +518,21 @@ static int prism2_config(struct pcmcia_device *link) hw_priv->link = link;/* -* Make sure the IRQ handler cannot proceed until at least -* dev->base_addr is initialized. +* We enable IRQ here, but IRQ handler will not proceed +* until dev->base_addr is set below. This protect us from +* receive interrupts when driver is not initialized. */ -spin_lock_irqsave (&local->irq_init_lock, flags); - ret =pcmcia_request_irq (link, prism2_interrupt);if (ret) - goto failed_unlock; + goto failed; ret =pcmcia_enable_device (link);if (ret) - goto failed_unlock; + goto failed; +spin_lock_irqsave (&local->irq_init_lock, flags); dev->irq = link->irq; dev->base_addr = link->resource[0 ]->start; -spin_unlock_irqrestore (&local->irq_init_lock, flags); local->shutdown =0 ;
@@ -546,8 +545,6 @@ static int prism2_config(struct pcmcia_device *link)return ret; - failed_unlock: -spin_unlock_irqrestore (&local->irq_init_lock, flags); failed:kfree (hw_priv);prism2_release ((u_long )link);
Signature · 1 line
1.7.1
Quoted 9 lines · Stanislaw Gruszka
pcmcia_request_irq()andpcmcia_enable_device()are intended to be called from process context (first function allocate memory withGFP_KERNEL, second take a mutex). We can not take spin lock and call them.It's safe to move spin lock after
pcmcia_enable_device()as we still hold off IRQ untildev->base_addris 0 and driver will not proceed with interrupts when is not ready.
Quoted 5 lines
Patch resolves:
https://bugzilla.redhat.com/show_bug.cgi?id=643758Reported-and-tested-by [email protected]Cc [email protected] # 2.6.34+
Patch is also needed for 2.6.32, I will post that version too.
Stanislaw