Commit:     a041fe2e8d0bd749b2416ef79adc416e24af7c63
Parent:     64251621796d5d4c0c4b6a6b6d845e4a43c63aee
Author:     Ishizaki Kou <[EMAIL PROTECTED]>
AuthorDate: Mon Aug 20 22:13:27 2007 +0900
Committer:  Jeff Garzik <[EMAIL PROTECTED]>
CommitDate: Thu Sep 13 00:16:31 2007 -0400

    spidernet: fix interrupt reason recognition
    This patch solves a problem that the spidernet driver sometimes fails
    to handle IRQ.
    The problem happens because,
    - In Cell architecture, interrupts may arrive at an interrupt
      controller, even if they are masked by the setting on registers of
      devices. It happens when interrupt packets are sent just before
      the interrupts are masked.
    - spidernet interrupt handler compares interrupt reasons with
      interrupt masks, so when such interrupts occurs, spidernet interrupt
      handler returns IRQ_NONE.
    - When all of interrupt handler return IRQ_NONE, linux kernel disables
      the IRQ and it no longer delivers interrupts to the interrupt handlers.
    spidernet doesn't work after above sequence, because it can't receive
    This patch changes spidernet interrupt handler that it compares
    interrupt reason with SPIDER_NET_INTX_MASK_VALUE.
    Signed-off-by: Kou Ishizaki <[EMAIL PROTECTED]>
    Signed-off-by: Jeff Garzik <[EMAIL PROTECTED]>
 drivers/net/spider_net.c |   12 ++++--------
 1 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/drivers/net/spider_net.c b/drivers/net/spider_net.c
index 590b12c..82d837a 100644
--- a/drivers/net/spider_net.c
+++ b/drivers/net/spider_net.c
@@ -1441,17 +1441,14 @@ static void
 spider_net_handle_error_irq(struct spider_net_card *card, u32 status_reg)
        u32 error_reg1, error_reg2;
-       u32 mask_reg1, mask_reg2;
        u32 i;
        int show_error = 1;
        error_reg1 = spider_net_read_reg(card, SPIDER_NET_GHIINT1STS);
        error_reg2 = spider_net_read_reg(card, SPIDER_NET_GHIINT2STS);
-       mask_reg1 = spider_net_read_reg(card, SPIDER_NET_GHIINT1MSK);
-       mask_reg2 = spider_net_read_reg(card,SPIDER_NET_GHIINT2MSK);
-       error_reg1 &= mask_reg1;
-       error_reg2 &= mask_reg2;
+       error_reg1 &= SPIDER_NET_INT1_MASK_VALUE;
+       error_reg2 &= SPIDER_NET_INT2_MASK_VALUE;
        /* check GHIINT0STS ************************************/
        if (status_reg)
@@ -1679,11 +1676,10 @@ spider_net_interrupt(int irq, void *ptr)
        struct net_device *netdev = ptr;
        struct spider_net_card *card = netdev_priv(netdev);
-       u32 status_reg, mask_reg;
+       u32 status_reg;
        status_reg = spider_net_read_reg(card, SPIDER_NET_GHIINT0STS);
-       mask_reg = spider_net_read_reg(card, SPIDER_NET_GHIINT0MSK);
-       status_reg &= mask_reg;
+       status_reg &= SPIDER_NET_INT0_MASK_VALUE;
        if (!status_reg)
                return IRQ_NONE;
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to