提交 0e0fde3c 编写于 作者: N Nobuhiro Iwamatsu 提交者: David S. Miller

sh_eth: Change handling of IRQ

Handling of IRQ of the SH7763/SH7764 CPU which sh_eth supported was
changed.
This revises it for this change.
Signed-off-by: NNobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 2bad35b7
...@@ -687,6 +687,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev) ...@@ -687,6 +687,7 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
{ {
struct net_device *ndev = netdev; struct net_device *ndev = netdev;
struct sh_eth_private *mdp = netdev_priv(ndev); struct sh_eth_private *mdp = netdev_priv(ndev);
irqreturn_t ret = IRQ_NONE;
u32 ioaddr, boguscnt = RX_RING_SIZE; u32 ioaddr, boguscnt = RX_RING_SIZE;
u32 intr_status = 0; u32 intr_status = 0;
...@@ -696,7 +697,13 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev) ...@@ -696,7 +697,13 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
/* Get interrpt stat */ /* Get interrpt stat */
intr_status = ctrl_inl(ioaddr + EESR); intr_status = ctrl_inl(ioaddr + EESR);
/* Clear interrupt */ /* Clear interrupt */
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); ctrl_outl(intr_status, ioaddr + EESR);
ret = IRQ_HANDLED;
} else
goto other_irq;
if (intr_status & (EESR_FRC | /* Frame recv*/ if (intr_status & (EESR_FRC | /* Frame recv*/
EESR_RMAF | /* Multi cast address recv*/ EESR_RMAF | /* Multi cast address recv*/
...@@ -723,9 +730,10 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev) ...@@ -723,9 +730,10 @@ static irqreturn_t sh_eth_interrupt(int irq, void *netdev)
ndev->name, intr_status); ndev->name, intr_status);
} }
other_irq:
spin_unlock(&mdp->lock); spin_unlock(&mdp->lock);
return IRQ_HANDLED; return ret;
} }
static void sh_eth_timer(unsigned long data) static void sh_eth_timer(unsigned long data)
...@@ -844,7 +852,13 @@ static int sh_eth_open(struct net_device *ndev) ...@@ -844,7 +852,13 @@ static int sh_eth_open(struct net_device *ndev)
int ret = 0; int ret = 0;
struct sh_eth_private *mdp = netdev_priv(ndev); 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) { if (ret) {
printk(KERN_ERR "Can not assign IRQ number to %s\n", CARDNAME); printk(KERN_ERR "Can not assign IRQ number to %s\n", CARDNAME);
return ret; return ret;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册