sh_eth: Change handling of IRQ
authorNobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
Mon, 16 Mar 2009 19:50:57 +0000 (19:50 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Mar 2009 06:31:49 +0000 (23:31 -0700)
Handling of IRQ of the SH7763/SH7764 CPU which sh_eth supported was
changed.
This revises it for this change.

Signed-off-by: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/sh_eth.c

index 7f8e514eb5e9653613383bfe515afea8240e37f0..7b1882765a0cc4647e7fd3448c35d26b544525e6 100644 (file)
@@ -687,6 +687,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
 {
        struct net_device *ndev = netdev;
        struct sh_eth_private *mdp = netdev_priv(ndev);
+       irqreturn_t ret = IRQ_NONE;
        u32 ioaddr, boguscnt = RX_RING_SIZE;
        u32 intr_status = 0;
 
@@ -696,7 +697,13 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
        /* Get interrpt stat */
        intr_status = ctrl_inl(ioaddr + EESR);
        /* Clear interrupt */
-       ctrl_outl(intr_status, ioaddr + EESR);
+       if (intr_status & (EESR_FRC | EESR_RMAF | EESR_RRF |
+                       EESR_RTLF | EESR_RTSF | EESR_PRE | EESR_CERF |
+                       TX_CHECK | EESR_ERR_CHECK)) {
+               ctrl_outl(intr_status, ioaddr + EESR);
+               ret = IRQ_HANDLED;
+       } else
+               goto other_irq;
 
        if (intr_status & (EESR_FRC | /* Frame recv*/
                        EESR_RMAF | /* Multi cast address recv*/
@@ -723,9 +730,10 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
                       ndev->name, intr_status);
        }
 
+other_irq:
        spin_unlock(&mdp->lock);
 
-       return IRQ_HANDLED;
+       return ret;
 }
 
 static void sh_eth_timer(unsigned long data)
@@ -844,7 +852,13 @@ static int sh_eth_open(struct net_device *ndev)
        int ret = 0;
        struct sh_eth_private *mdp = netdev_priv(ndev);
 
-       ret = request_irq(ndev->irq, &sh_eth_interrupt, 0, ndev->name, ndev);
+       ret = request_irq(ndev->irq, &sh_eth_interrupt,
+#if defined(CONFIG_CPU_SUBTYPE_SH7763) || defined(CONFIG_CPU_SUBTYPE_SH7764)
+                               IRQF_SHARED,
+#else
+                               0,
+#endif
+                               ndev->name, ndev);
        if (ret) {
                printk(KERN_ERR "Can not assign IRQ number to %s\n", CARDNAME);
                return ret;