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: Nobuhiro Iwamatsu <iwamatsu.nobuhiro@renesas.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
2bad35b7c9
commit
0e0fde3c8d
1 changed files with 17 additions and 3 deletions
|
@ -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)
|
||||||
/* Get interrpt stat */
|
/* Get interrpt stat */
|
||||||
intr_status = ctrl_inl(ioaddr + EESR);
|
intr_status = ctrl_inl(ioaddr + EESR);
|
||||||
/* Clear interrupt */
|
/* 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*/
|
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)
|
||||||
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)
|
||||||
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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue