diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2017-01-18 11:45:14 +0100 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2017-02-06 15:13:35 +0100 |
commit | dd2f122a96ea041679f46c063a18145a7cf6ff5f (patch) | |
tree | 9a3d55e81b57fadd60eca11714ee199c356f1bce /drivers/net/can/flexcan.c | |
parent | a5c02f668c36c05fbbb29d157507be4868ecd176 (diff) | |
download | linux-dd2f122a96ea041679f46c063a18145a7cf6ff5f.tar.bz2 |
can: flexcan: flexcan_irq(): don't unconditionally return IRQ_HANDLED
This patch changes the flexcan_irq() function to only return
IRQ_HANDLED, if the interrupt really has been handled, otherwise
IRQ_NONE is returned.
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can/flexcan.c')
-rw-r--r-- | drivers/net/can/flexcan.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c index 649d636bc41e..725baba95952 100644 --- a/drivers/net/can/flexcan.c +++ b/drivers/net/can/flexcan.c @@ -717,15 +717,12 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) struct net_device_stats *stats = &dev->stats; struct flexcan_priv *priv = netdev_priv(dev); struct flexcan_regs __iomem *regs = priv->regs; + irqreturn_t handled = IRQ_NONE; u32 reg_iflag1, reg_esr; reg_iflag1 = flexcan_read(®s->iflag1); reg_esr = flexcan_read(®s->esr); - /* ACK all bus error and state change IRQ sources */ - if (reg_esr & FLEXCAN_ESR_ALL_INT) - flexcan_write(reg_esr & FLEXCAN_ESR_ALL_INT, ®s->esr); - /* schedule NAPI in case of: * - rx IRQ * - state change IRQ @@ -734,6 +731,7 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) if ((reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_AVAILABLE) || (reg_esr & FLEXCAN_ESR_ERR_STATE) || flexcan_has_and_handle_berr(priv, reg_esr)) { + handled = IRQ_HANDLED; /* The error bits are cleared on read, * save them for later use. */ @@ -747,6 +745,7 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) /* FIFO overflow */ if (reg_iflag1 & FLEXCAN_IFLAG_RX_FIFO_OVERFLOW) { + handled = IRQ_HANDLED; flexcan_write(FLEXCAN_IFLAG_RX_FIFO_OVERFLOW, ®s->iflag1); dev->stats.rx_over_errors++; dev->stats.rx_errors++; @@ -754,6 +753,7 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) /* transmission complete interrupt */ if (reg_iflag1 & (1 << FLEXCAN_TX_BUF_ID)) { + handled = IRQ_HANDLED; stats->tx_bytes += can_get_echo_skb(dev, 0); stats->tx_packets++; can_led_event(dev, CAN_LED_EVENT_TX); @@ -765,7 +765,13 @@ static irqreturn_t flexcan_irq(int irq, void *dev_id) netif_wake_queue(dev); } - return IRQ_HANDLED; + /* ACK all bus error and state change IRQ sources */ + if (reg_esr & FLEXCAN_ESR_ALL_INT) { + handled = IRQ_HANDLED; + flexcan_write(reg_esr & FLEXCAN_ESR_ALL_INT, ®s->esr); + } + + return handled; } static void flexcan_set_bittiming(struct net_device *dev) |