Commit 28de0b36 authored by Ryan Mallon's avatar Ryan Mallon Committed by David S. Miller

[LIBERTAS]: fix interrupts in CF driver

The following patch fixes the tx transmit timeout problem, which is
caused by the interrupts being incorrectly check and masked. The patch
moves the interrupt masking code so that interrupts are enabled only
when the driver is registered and only disabled when the driver is
unregistered.
Signed-off-by: default avatarRyan Mallon <ryan@bluewatersys.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 6f05cbe5
...@@ -248,22 +248,26 @@ static irqreturn_t if_cs_interrupt(int irq, void *data) ...@@ -248,22 +248,26 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
lbs_deb_enter(LBS_DEB_CS); lbs_deb_enter(LBS_DEB_CS);
int_cause = if_cs_read16(card, IF_CS_C_INT_CAUSE); int_cause = if_cs_read16(card, IF_CS_C_INT_CAUSE);
switch (int_cause) { if(int_cause == 0x0) {
case 0x0000: /* Not for us */
/* not for us */
return IRQ_NONE; return IRQ_NONE;
case 0xffff:
/* if one reads junk, then probably the card was removed */ } else if(int_cause == 0xffff) {
/* Read in junk, the card has probably been removed */
card->priv->adapter->surpriseremoved = 1; card->priv->adapter->surpriseremoved = 1;
break;
case IF_CS_H_IC_TX_OVER: } else {
if (card->priv->adapter->connect_status == LIBERTAS_CONNECTED) if(int_cause & IF_CS_H_IC_TX_OVER) {
netif_wake_queue(card->priv->dev); card->priv->dnld_sent = DNLD_RES_RECEIVED;
/* fallthrought */ if (!card->priv->adapter->cur_cmd)
default: wake_up_interruptible(&card->priv->waitq);
if (card->priv->adapter->connect_status == LIBERTAS_CONNECTED)
netif_wake_queue(card->priv->dev);
}
/* clear interrupt */ /* clear interrupt */
if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause & IF_CS_C_IC_MASK); if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause & IF_CS_C_IC_MASK);
if_cs_disable_ints(card);
} }
libertas_interrupt(card->priv->dev); libertas_interrupt(card->priv->dev);
...@@ -652,7 +656,6 @@ static int if_cs_get_int_status(wlan_private *priv, u8 *ireg) ...@@ -652,7 +656,6 @@ static int if_cs_get_int_status(wlan_private *priv, u8 *ireg)
if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause); if_cs_write16(card, IF_CS_C_INT_CAUSE, int_cause);
*ireg = if_cs_read16(card, IF_CS_C_STATUS) & IF_CS_C_S_MASK; *ireg = if_cs_read16(card, IF_CS_C_STATUS) & IF_CS_C_S_MASK;
if_cs_enable_ints(card);
if (!*ireg) if (!*ireg)
goto sbi_get_int_status_exit; goto sbi_get_int_status_exit;
...@@ -841,7 +844,6 @@ static int if_cs_probe(struct pcmcia_device *p_dev) ...@@ -841,7 +844,6 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
p_dev->irq.AssignedIRQ, p_dev->io.BasePort1, p_dev->irq.AssignedIRQ, p_dev->io.BasePort1,
p_dev->io.BasePort1 + p_dev->io.NumPorts1 - 1); p_dev->io.BasePort1 + p_dev->io.NumPorts1 - 1);
if_cs_enable_ints(card);
/* Load the firmware early, before calling into libertas.ko */ /* Load the firmware early, before calling into libertas.ko */
ret = if_cs_prog_helper(card); ret = if_cs_prog_helper(card);
...@@ -874,6 +876,8 @@ static int if_cs_probe(struct pcmcia_device *p_dev) ...@@ -874,6 +876,8 @@ static int if_cs_probe(struct pcmcia_device *p_dev)
goto out3; goto out3;
} }
if_cs_enable_ints(card);
/* And finally bring the card up */ /* And finally bring the card up */
if (libertas_start_card(priv) != 0) { if (libertas_start_card(priv) != 0) {
lbs_pr_err("could not activate card\n"); lbs_pr_err("could not activate card\n");
...@@ -909,6 +913,7 @@ static void if_cs_detach(struct pcmcia_device *p_dev) ...@@ -909,6 +913,7 @@ static void if_cs_detach(struct pcmcia_device *p_dev)
libertas_stop_card(card->priv); libertas_stop_card(card->priv);
libertas_remove_card(card->priv); libertas_remove_card(card->priv);
if_cs_disable_ints(card);
if_cs_release(p_dev); if_cs_release(p_dev);
kfree(card); kfree(card);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment