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 Reported-and-tested-by: rbugz@biobind.com Cc: stable@kernel.org # 2.6.34+ Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
3c4a8cc46e
commit
4e5518ca53
|
@ -518,22 +518,21 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
hw_priv->link = link;
|
hw_priv->link = link;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure the IRQ handler cannot proceed until at least
|
* We enable IRQ here, but IRQ handler will not proceed
|
||||||
* dev->base_addr is initialized.
|
* 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);
|
ret = pcmcia_request_irq(link, prism2_interrupt);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto failed_unlock;
|
goto failed;
|
||||||
|
|
||||||
ret = pcmcia_enable_device(link);
|
ret = pcmcia_enable_device(link);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto failed_unlock;
|
goto failed;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&local->irq_init_lock, flags);
|
||||||
dev->irq = link->irq;
|
dev->irq = link->irq;
|
||||||
dev->base_addr = link->resource[0]->start;
|
dev->base_addr = link->resource[0]->start;
|
||||||
|
|
||||||
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
||||||
|
|
||||||
local->shutdown = 0;
|
local->shutdown = 0;
|
||||||
|
@ -546,8 +545,6 @@ static int prism2_config(struct pcmcia_device *link)
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
failed_unlock:
|
|
||||||
spin_unlock_irqrestore(&local->irq_init_lock, flags);
|
|
||||||
failed:
|
failed:
|
||||||
kfree(hw_priv);
|
kfree(hw_priv);
|
||||||
prism2_release((u_long)link);
|
prism2_release((u_long)link);
|
||||||
|
|
Loading…
Reference in New Issue