aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/libertas/if_cs.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c
index 364da4cac214..e74ec5c309be 100644
--- a/drivers/net/wireless/libertas/if_cs.c
+++ b/drivers/net/wireless/libertas/if_cs.c
@@ -248,22 +248,26 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
248 lbs_deb_enter(LBS_DEB_CS); 248 lbs_deb_enter(LBS_DEB_CS);
249 249
250 int_cause = if_cs_read16(card, IF_CS_C_INT_CAUSE); 250 int_cause = if_cs_read16(card, IF_CS_C_INT_CAUSE);
251 switch (int_cause) { 251 if(int_cause == 0x0) {
252 case 0x0000: 252 /* Not for us */
253 /* not for us */
254 return IRQ_NONE; 253 return IRQ_NONE;
255 case 0xffff: 254
256 /* if one reads junk, then probably the card was removed */ 255 } else if(int_cause == 0xffff) {
256 /* Read in junk, the card has probably been removed */
257 card->priv->adapter->surpriseremoved = 1; 257 card->priv->adapter->surpriseremoved = 1;
258 break; 258
259 case IF_CS_H_IC_TX_OVER: 259 } else {
260 if (card->priv->adapter->connect_status == LIBERTAS_CONNECTED) 260 if(int_cause & IF_CS_H_IC_TX_OVER) {
261 netif_wake_queue(card->priv->dev); 261 card->priv->dnld_sent = DNLD_RES_RECEIVED;
262 /* fallthrought */ 262 if (!card->priv->adapter->cur_cmd)
263 default: 263 wake_up_interruptible(&card->priv->waitq);
264
265 if (card->priv->adapter->connect_status == LIBERTAS_CONNECTED)
266 netif_wake_queue(card->priv->dev);
267 }
268
264 /* clear interrupt */ 269 /* clear interrupt */
265 if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause & IF_CS_C_IC_MASK); 270 if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause & IF_CS_C_IC_MASK);
266 if_cs_disable_ints(card);
267 } 271 }
268 272
269 libertas_interrupt(card->priv->dev); 273 libertas_interrupt(card->priv->dev);
@@ -652,7 +656,6 @@ static int if_cs_get_int_status(wlan_private *priv, u8 *ireg)
652 if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause); 656 if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause);
653 657
654 *ireg = if_cs_read16(card, IF_CS_C_STATUS) & IF_CS_C_S_MASK; 658 *ireg = if_cs_read16(card, IF_CS_C_STATUS) & IF_CS_C_S_MASK;
655 if_cs_enable_ints(card);
656 659
657 if (!*ireg) 660 if (!*ireg)
658 goto sbi_get_int_status_exit; 661 goto sbi_get_int_status_exit;
@@ -841,7 +844,6 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
841 p_dev->irq.AssignedIRQ, p_dev->io.BasePort1, 844 p_dev->irq.AssignedIRQ, p_dev->io.BasePort1,
842 p_dev->io.BasePort1 + p_dev->io.NumPorts1 - 1); 845 p_dev->io.BasePort1 + p_dev->io.NumPorts1 - 1);
843 846
844 if_cs_enable_ints(card);
845 847
846 /* Load the firmware early, before calling into libertas.ko */ 848 /* Load the firmware early, before calling into libertas.ko */
847 ret = if_cs_prog_helper(card); 849 ret = if_cs_prog_helper(card);
@@ -874,6 +876,8 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
874 goto out3; 876 goto out3;
875 } 877 }
876 878
879 if_cs_enable_ints(card);
880
877 /* And finally bring the card up */ 881 /* And finally bring the card up */
878 if (libertas_start_card(priv) != 0) { 882 if (libertas_start_card(priv) != 0) {
879 lbs_pr_err("could not activate card\n"); 883 lbs_pr_err("could not activate card\n");
@@ -909,6 +913,7 @@ static void if_cs_detach(struct pcmcia_device *p_dev)
909 913
910 libertas_stop_card(card->priv); 914 libertas_stop_card(card->priv);
911 libertas_remove_card(card->priv); 915 libertas_remove_card(card->priv);
916 if_cs_disable_ints(card);
912 if_cs_release(p_dev); 917 if_cs_release(p_dev);
913 kfree(card); 918 kfree(card);
914 919