libertas: fix interrupt issue
Holger Schurig [Thu, 5 Jun 2008 11:06:15 +0000 (13:06 +0200)]
This helps against lost interrupts and aids in debugging this.

Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Acked-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

drivers/net/wireless/libertas/if_cs.c

index 873ab10..b5d0cd4 100644 (file)
@@ -379,6 +379,8 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
 
        /* Ask card interrupt cause register if there is something for us */
        cause = if_cs_read16(card, IF_CS_CARD_INT_CAUSE);
+       lbs_deb_cs("cause 0x%04x\n", cause);
+
        if (cause == 0) {
                /* Not for us */
                return IRQ_NONE;
@@ -390,10 +392,6 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
                return IRQ_HANDLED;
        }
 
-       /* Clear interrupt cause */
-       if_cs_write16(card, IF_CS_CARD_INT_CAUSE, cause & IF_CS_BIT_MASK);
-       lbs_deb_cs("cause 0x%04x\n", cause);
-
        if (cause & IF_CS_BIT_RX) {
                struct sk_buff *skb;
                lbs_deb_cs("rx packet\n");
@@ -434,6 +432,9 @@ static irqreturn_t if_cs_interrupt(int irq, void *data)
                lbs_queue_event(priv, event >> 8 & 0xff);
        }
 
+       /* Clear interrupt cause */
+       if_cs_write16(card, IF_CS_CARD_INT_CAUSE, cause & IF_CS_BIT_MASK);
+
        lbs_deb_leave(LBS_DEB_CS);
        return IRQ_HANDLED;
 }