diff options
Diffstat (limited to 'drivers/net/wireless/hostap/hostap_cs.c')
| -rw-r--r-- | drivers/net/wireless/hostap/hostap_cs.c | 15 | 
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index db72461c486..29b31a694b5 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c @@ -594,6 +594,7 @@ static int prism2_config(struct pcmcia_device *link)  	local_info_t *local;  	int ret = 1;  	struct hostap_cs_priv *hw_priv; +	unsigned long flags;  	PDEBUG(DEBUG_FLOW, "prism2_config()\n"); @@ -625,9 +626,15 @@ static int prism2_config(struct pcmcia_device *link)  	local->hw_priv = hw_priv;  	hw_priv->link = link; +	/* +	 * Make sure the IRQ handler cannot proceed until at least +	 * dev->base_addr is initialized. +	 */ +	spin_lock_irqsave(&local->irq_init_lock, flags); +  	ret = pcmcia_request_irq(link, prism2_interrupt);  	if (ret) -		goto failed; +		goto failed_unlock;  	/*  	 * This actually configures the PCMCIA socket -- setting up @@ -636,11 +643,13 @@ static int prism2_config(struct pcmcia_device *link)  	 */  	ret = pcmcia_request_configuration(link, &link->conf);  	if (ret) -		goto failed; +		goto failed_unlock;  	dev->irq = link->irq;  	dev->base_addr = link->io.BasePort1; +	spin_unlock_irqrestore(&local->irq_init_lock, flags); +  	/* Finally, report what we've done */  	printk(KERN_INFO "%s: index 0x%02x: ",  	       dev_info, link->conf.ConfigIndex); @@ -667,6 +676,8 @@ 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);  |